X-Git-Url: https://jasonwoof.com/gitweb/?p=peach-cgt.git;a=blobdiff_plain;f=server.coffee;h=e20223d04123e113f9ec63d61d0c6ec2cd1055b5;hp=196a0b844f479b296b2edf6f5c3c15595ec41314;hb=HEAD;hpb=b9a8e790c3c7c29aac036cef282d61d502306ebd diff --git a/server.coffee b/server.coffee index 196a0b8..e20223d 100644 --- a/server.coffee +++ b/server.coffee @@ -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 slug, g of games + if g.p1_waiter? and g.p1_waiter isnt false + g.p1_waiter.write '\n' + if g.p2_waiter? and g.p2_waiter isnt false + g.p2_waiter.write '\n' + +interval 12000, long_poll_keepalive + http_server = http.createServer (req, res) -> url_parts = url.parse req.url, true if url_parts.query is undefined @@ -282,7 +290,7 @@ http_server = http.createServer (req, res) -> else if rel_path.substr(rel_path.length - 3) is '.js' res.writeHead 200, 'Content-Type': 'text/javascript' return js_handler url_parts.query, res, req, url_parts - else if rel_path.substr(rel_path.length - 4) is '/set' + else if rel_path is 'set' data = '' req.on 'data', (chunk) -> data += chunk @@ -293,7 +301,7 @@ http_server = http.createServer (req, res) -> query[key] = parg return set_handler query, res, req, url_parts return - else if rel_path.substr(rel_path.length - 4) is '/get' + else if rel_path is 'get' return get_handler url_parts.query, res, req, url_parts else if rel_path.substr(rel_path.length - 4) is '.ico' res.writeHead 404