model = require './common.coffee'
games = {}
+max_concurrent_games = 50
+max_game_idle = 2 * 60 * 60 * 1000 # two 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
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'
game = games[args.game]
+ game.last_seen = now_s()
+
game.process_messages messages
out.writeHead 200, "Content-Type": 'text/plain'
return html_handler url_parts.query, res, req, url_parts
+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}/"