<commit_before>require! {
	fs
	path
	'../../utils/create-server'
	'../../utils/publish-redis-streaming'
	'../../config'
	'body-parser'
	'cookie-parser'
	'connect-redis'
	'express-session': session
	'../../models/user': User
	'./routes/resources': resources-router
	'./routes/index': index-router
}

RedisStore = connect-redis session

session-expires = 1000ms * 60seconds * 60minutes * 24hours * 365days

server = create-server!
server.locals.compile-debug = off
#server.locals.pretty = '  '
server.set 'view engine' \jade
server.set 'views' "#__dirname/views/pages"
server.set 'X-Frame-Options' \SAMEORIGIN

server.use body-parser.urlencoded {+extended}
server.use cookie-parser config.cookie-pass

# Session settings
server.use session do
	key: config.session-key
	secret: config.session-secret
	resave: off
	save-uninitialized: on
	cookie:
		path: '/'
		domain: ".#{config.public-config.domain}"
		http-only: off
		secure: off
		expires: new Date Date.now! + session-expires
		max-age: session-expires
	store: new RedisStore do
		db: 1
		prefix: 'misskey-session:'

# セッションを準備し、ユーザーがログインしているかどうかやデフォルトレンダリングデータを用意する
# セッションの確立が必要ないリソースなどへのアクセスでもこの処理を行うのは無駄であるので、任意のタイミングで処理を呼び出せるようにする
server.init-session = (req, res, callback) ->
	ua = req.headers['user-agent'].to-lower-case!
    is-mobile = (/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od|ad)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i.test ua) || (/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test ua.substr 0 4)
	req.is-mobile = !!is-mobile
	req.login = req.session? && req.session.user-id?
	req.data = # Render datas
		page-path: req.path
		config: config.public-config
		url: config.public-config.url
		api-url: config.public-config.api-url
		web-streaming-url: config.public-config.web-streaming-url
		login: req.login
		is-mobile: 

	# Renderer function
	res.display = (req, res, name, render-data) -> res.render name, req.data <<< render-data

	# Check logged in, set user instance
	if req.login
		user-id = req.session.user-id
		User.find-by-id user-id, (, user) ->
			req
				..data.me = user
				..me = user
			callback!
	else
		req
			..data.me = null
			..me = null
		callback!

# Statics
server.get '/favicon.ico' (req, res) -> res.send-file path.resolve "#__dirname/resources/favicon.ico"
server.get '/manifest.json' (req, res) -> res.send-file path.resolve "#__dirname/resources/manifest.json"

# CORS middleware
#
# see: http://stackoverflow.com/questions/7067966/how-to-allow-cors-in-express-nodejs
allow-cross-domain = (req, res, next) ->
	res
		..header 'Access-Control-Allow-Credentials' yes
		..header 'Access-Control-Allow-Origin' config.public-config.url
		..header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE'
		..header 'Access-Control-Allow-Headers' 'Origin, X-Requested-With, Content-Type, Accept'

    # intercept OPTIONS method
	if req.method == \OPTIONS
		res.send 204
	else
		next!

# CORS
server.use allow-cross-domain

# Timeout timer
#server.all '*' (req, res, next) ->
#	if req.url != '/login'
#		set-timeout do
#			->
#				if !res.status-code?
#					try
#						res.status 500
#						if res.has-own-property \display
#							res.display req, res, \timeout {}
#						else
#							res.send 'Sorry, processing timed out ><'
#					catch
#			3000ms
#		next!
#	else
#		next!

# Log
server.all '*' (req, res, next) ->
	next!
	publish-redis-streaming \log to-json {
		type: \web-incoming
		value: {
			date: Date.now!
			remote-addr: req.ip
			protocol: req.protocol
			method: req.method
			path: "#{req.headers.host}#{req.path}"
		}
	}

# Resources rooting
resources-router server

# Init session
server.all '*' (req, res, next) -> server.init-session req, res, -> next!

# General rooting
index-router server

# Not found handling
server.use (req, res) ->
	res
		..status 404
		..display req, res, 'not-found' {}

# Error handling
server.use (err, req, res, next) ->
	console.error err
	display-err = "#{err.stack}\r\n#{repeat 32 '-'}\r\n#{req.method} #{req.url} [#{new Date!}]"
	if (req.has-own-property \login) && req.login
		display-err += "\r\n#{req.me?id ? ''}"
	res.status 500
	if res.has-own-property \display
		res.display req, res, \error {err: display-err}
	else
		res.send err

# Listen
server.listen config.port.web
<commit_msg>Fix bug<commit_after>require! {
	fs
	path
	'../../utils/create-server'
	'../../utils/publish-redis-streaming'
	'../../config'
	'body-parser'
	'cookie-parser'
	'connect-redis'
	'express-session': session
	'../../models/user': User
	'./routes/resources': resources-router
	'./routes/index': index-router
}

RedisStore = connect-redis session

session-expires = 1000ms * 60seconds * 60minutes * 24hours * 365days

server = create-server!
server.locals.compile-debug = off
#server.locals.pretty = '  '
server.set 'view engine' \jade
server.set 'views' "#__dirname/views/pages"
server.set 'X-Frame-Options' \SAMEORIGIN

server.use body-parser.urlencoded {+extended}
server.use cookie-parser config.cookie-pass

# Session settings
server.use session do
	key: config.session-key
	secret: config.session-secret
	resave: off
	save-uninitialized: on
	cookie:
		path: '/'
		domain: ".#{config.public-config.domain}"
		http-only: off
		secure: off
		expires: new Date Date.now! + session-expires
		max-age: session-expires
	store: new RedisStore do
		db: 1
		prefix: 'misskey-session:'

# セッションを準備し、ユーザーがログインしているかどうかやデフォルトレンダリングデータを用意する
# セッションの確立が必要ないリソースなどへのアクセスでもこの処理を行うのは無駄であるので、任意のタイミングで処理を呼び出せるようにする
server.init-session = (req, res, callback) ->
	ua = req.headers['user-agent'].to-lower-case!
	is-mobile = (/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od|ad)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i.test ua) || (/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test ua.substr 0 4)
	req.is-mobile = !!is-mobile
	req.login = req.session? && req.session.user-id?
	req.data = # Render datas
		page-path: req.path
		config: config.public-config
		url: config.public-config.url
		api-url: config.public-config.api-url
		web-streaming-url: config.public-config.web-streaming-url
		login: req.login
		is-mobile: 

	# Renderer function
	res.display = (req, res, name, render-data) -> res.render name, req.data <<< render-data

	# Check logged in, set user instance
	if req.login
		user-id = req.session.user-id
		User.find-by-id user-id, (, user) ->
			req
				..data.me = user
				..me = user
			callback!
	else
		req
			..data.me = null
			..me = null
		callback!

# Statics
server.get '/favicon.ico' (req, res) -> res.send-file path.resolve "#__dirname/resources/favicon.ico"
server.get '/manifest.json' (req, res) -> res.send-file path.resolve "#__dirname/resources/manifest.json"

# CORS middleware
#
# see: http://stackoverflow.com/questions/7067966/how-to-allow-cors-in-express-nodejs
allow-cross-domain = (req, res, next) ->
	res
		..header 'Access-Control-Allow-Credentials' yes
		..header 'Access-Control-Allow-Origin' config.public-config.url
		..header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE'
		..header 'Access-Control-Allow-Headers' 'Origin, X-Requested-With, Content-Type, Accept'

    # intercept OPTIONS method
	if req.method == \OPTIONS
		res.send 204
	else
		next!

# CORS
server.use allow-cross-domain

# Timeout timer
#server.all '*' (req, res, next) ->
#	if req.url != '/login'
#		set-timeout do
#			->
#				if !res.status-code?
#					try
#						res.status 500
#						if res.has-own-property \display
#							res.display req, res, \timeout {}
#						else
#							res.send 'Sorry, processing timed out ><'
#					catch
#			3000ms
#		next!
#	else
#		next!

# Log
server.all '*' (req, res, next) ->
	next!
	publish-redis-streaming \log to-json {
		type: \web-incoming
		value: {
			date: Date.now!
			remote-addr: req.ip
			protocol: req.protocol
			method: req.method
			path: "#{req.headers.host}#{req.path}"
		}
	}

# Resources rooting
resources-router server

# Init session
server.all '*' (req, res, next) -> server.init-session req, res, -> next!

# General rooting
index-router server

# Not found handling
server.use (req, res) ->
	res
		..status 404
		..display req, res, 'not-found' {}

# Error handling
server.use (err, req, res, next) ->
	console.error err
	display-err = "#{err.stack}\r\n#{repeat 32 '-'}\r\n#{req.method} #{req.url} [#{new Date!}]"
	if (req.has-own-property \login) && req.login
		display-err += "\r\n#{req.me?id ? ''}"
	res.status 500
	if res.has-own-property \display
		res.display req, res, \error {err: display-err}
	else
		res.send err

# Listen
server.listen config.port.web

{'fraction_non_alphanumeric': 0.22555767476573513, 'fraction_numerical': 0.03947259308400365, 'mean_word_length': 4.4993160054719565, 'pattern_counts': {'":': 0, '<': 11, '<?xml version=': 0, '>': 31, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '3791144', 'n_tokens_mistral': 6056, 'n_tokens_neox': 5579, 'n_words': 713}