JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
send a space every 12 seconds for keepalive
authorJason Woofenden <jason@jasonwoof.com>
Wed, 25 Jul 2012 21:41:26 +0000 (17:41 -0400)
committerJason Woofenden <jason@jasonwoof.com>
Wed, 25 Jul 2012 21:44:02 +0000 (17:44 -0400)
server.coffee

index 8e35241..b16f29f 100644 (file)
@@ -30,6 +30,7 @@ max_game_idle = 3 * 60 * 60 * 1000 # three hours (in miliseconds)
 
 # timeout function with args in convenient order
 timeout = (ms, func) -> setTimeout func, ms
+interval = (ms, func) -> setInterval func, ms
 
 now_s = ->
        d = new Date()
@@ -143,10 +144,10 @@ get_handler = (args, out, request, url_parts) ->
                return
 
        game = games[args.game]
+       out.writeHead 200, 'Content-Type': 'text/javascript'
 
        waiter = games["#{args.agent}_waiter"]
        if waiter?
-               waiter.writeHead 200, 'Content-Type': 'text/javascript'
                waiter.end '[]'
 
        game["#{args.agent}_waiter"] = out
@@ -211,14 +212,12 @@ answer_now = (game) ->
                queue = game.p1_queue
                game.p1_waiter = false
                game.p1_queue = []
-               waiter.writeHead 200, 'Content-Type': 'text/javascript'
                waiter.end JSON.stringify queue
        if game.p2_waiter and game.p2_queue.length
                waiter = game.p2_waiter
                queue = game.p2_queue
                game.p2_waiter = false
                game.p2_queue = []
-               waiter.writeHead 200, 'Content-Type': 'text/javascript'
                waiter.end JSON.stringify queue
 
 # this marks a game as "dirty" and makes sure there's exactly one timeout
@@ -267,6 +266,15 @@ new_game = (slug) ->
 
        return game
 
+long_poll_keepalive = ->
+       for g of games
+               if g.p1_waiter
+                       g.p1_waiter.write ' '
+               if g.p2_waiter
+                       g.p2_waiter.write ' '
+
+interval 12000, long_poll_keepalive
+
 http_server = http.createServer (req, res) ->
        url_parts = url.parse req.url, true
        if url_parts.query is undefined