# timeout function with args in convenient order
timeout = (ms, func) -> setTimeout func, ms
+interval = (ms, func) -> setInterval func, ms
now_s = ->
d = new Date()
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
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
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
url_parts.query = {}
rel_path = url_parts.pathname.substr 1
- console.log rel_path
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 - 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
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