JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
destroy old games, and max out at 50 concurrent
authorJason Woofenden <jason@jasonwoof.com>
Mon, 16 Jan 2012 23:49:50 +0000 (18:49 -0500)
committerJason Woofenden <jason@jasonwoof.com>
Mon, 16 Jan 2012 23:49:50 +0000 (18:49 -0500)
server.coffee

index 211ac7d..3c370e7 100644 (file)
@@ -25,10 +25,43 @@ coffee = require 'coffee-script'
 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
@@ -153,6 +186,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 +197,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'
@@ -263,5 +301,7 @@ http_server = http.createServer (req, res) ->
 
        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}/"