X-Git-Url: https://jasonwoof.com/gitweb/?a=blobdiff_plain;f=server.coffee;h=1f04280fd3cb65788536a0adff6f58e7677d2941;hb=4dfb3f0394729958fa7484cfe6e758627b73d091;hp=211ac7d4cb0c24a2347171bc690f13007c705411;hpb=8cb28c7d6dfb4667081726aa3cb200a1f8cb9ca8;p=peach-cgt.git diff --git a/server.coffee b/server.coffee index 211ac7d..1f04280 100644 --- a/server.coffee +++ b/server.coffee @@ -14,21 +14,58 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . -listen_port = 8333 +listen_port = process.env.app_port ? 9988 sys = require 'sys' fs = require 'fs' http = require 'http' querystring = require 'querystring' url = require 'url' +console.log "required builtins" less = require 'less' +console.log "required less" coffee = require 'coffee-script' +console.log "required coffee-script" model = require './common.coffee' +console.log "required common.coffee" games = {} +max_concurrent_games = 50 +max_game_idle = 3 * 60 * 60 * 1000 # three hours (in miliseconds) # timeout function with args in convenient order timeout = (ms, func) -> setTimeout func, ms +now_s = -> + d = new Date() + return d.getTime() + +expire_old_games = -> + count = 0 + for slug, g of games + count += 1 + oldest_slug = slug + oldest_seen = g.last_seen + + return unless count > 0 + + # check all the games + # track oldest + # delete old ones + too_old = now_s() - max_game_idle + kills = [] + for slug, g of games + if g.last_seen < oldest_seen + oldest_seen = g.last_seen + oldest_slug = slug + if g.last_seen < too_old + kills.push slug + if count > max_concurrent_games and kills.length is 0 + console.log "hit max_concurrent_games, destroying oldest" + kills.push oldest_slug + for slug in kills + console.log "killing game #{slug}" + delete games[slug] + css_handler = (args, out, request, url_parts) -> fs.readFile 'style.less', 'utf8', (err, data) -> if err @@ -71,7 +108,7 @@ js_handler = (args, out, request, url_parts) -> html_handler = (args, out, request, url_parts) -> fs.readFile 'index.html', 'utf8', (err, data) -> if err - return out.end 'Server failed to read index.html' + return out.end "Server failed to read index.html: #{err}" out.end data clean_pathname_regex = new RegExp('[^a-zA-Z/_.-]') @@ -82,9 +119,9 @@ clean_pathname = (str) -> str = str.replace clean_pathname_regex2, '/_' return str.replace clean_pathname_regex3, '_' -# serve javascript files from within /usr/share/javascript -javascript_handler = (args, out, request, url_parts) -> - filename = clean_pathname "/usr/share/#{url_parts.pathname}" +# serve javascript files from within external/ +external_javascript_handler = (args, out, request, url_parts) -> + filename = clean_pathname "external/#{url_parts.pathname.substr 10}" fs.readFile filename, 'utf8', (err, data) -> if err out.writeHead 404 @@ -153,6 +190,9 @@ set_handler = (args, out, request, url_parts) -> out.end '{"status":6,"text_status":"Game already exists"}' return game = games[slug] = new_game slug, 'server' + game.last_seen = now_s() + console.log "new game: #{slug}" + expire_old_games() unless games[args.game]? out.writeHead 404, "Content-Type": 'text/plain' @@ -161,6 +201,8 @@ set_handler = (args, out, request, url_parts) -> game = games[args.game] + game.last_seen = now_s() + game.process_messages messages out.writeHead 200, "Content-Type": 'text/plain' @@ -236,8 +278,8 @@ http_server = http.createServer (req, res) -> rel_path = url_parts.pathname.substr 1 - if rel_path.substr(0, 11) is 'javascript/' - return javascript_handler url_parts.query, res, req, url_parts + if rel_path.substr(0, 9) is 'external/' + return external_javascript_handler url_parts.query, res, req, url_parts else if rel_path.substr(rel_path.length - 4) is '.css' res.writeHead 200, 'Content-Type': 'text/css' return css_handler url_parts.query, res, req, url_parts @@ -263,5 +305,11 @@ http_server = http.createServer (req, res) -> return html_handler url_parts.query, res, req, url_parts +################## INIT #################### +# make sure the current working directory is correct +process.chdir __dirname + +setInterval expire_old_games, 2 * 60 * 1000 # check every 2 minutes for expired games + http_server.listen listen_port, "127.0.0.1" console.log "Server running at http://127.0.0.1:#{listen_port}/"