X-Git-Url: https://jasonwoof.com/gitweb/?p=peach-cgt.git;a=blobdiff_plain;f=server.coffee;h=e20223d04123e113f9ec63d61d0c6ec2cd1055b5;hp=1f04280fd3cb65788536a0adff6f58e7677d2941;hb=HEAD;hpb=4dfb3f0394729958fa7484cfe6e758627b73d091 diff --git a/server.coffee b/server.coffee index 1f04280..e20223d 100644 --- a/server.coffee +++ b/server.coffee @@ -14,19 +14,15 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . -listen_port = process.env.app_port ? 9988 +listen_port = process.env.PORT ? process.env.app_port ? 9988 sys = require 'sys' fs = require 'fs' http = require 'http' querystring = require 'querystring' url = require 'url' -console.log "required builtins" less = require 'less' -console.log "required less" coffee = require 'coffee-script' -console.log "required coffee-script" model = require './common.coffee' -console.log "required common.coffee" games = {} max_concurrent_games = 50 @@ -34,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() @@ -147,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 @@ -215,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 @@ -271,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 @@ -286,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 @@ -297,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 @@ -311,5 +315,5 @@ process.chdir __dirname setInterval expire_old_games, 2 * 60 * 1000 # check every 2 minutes for expired games -http_server.listen listen_port, "127.0.0.1" +http_server.listen listen_port console.log "Server running at http://127.0.0.1:#{listen_port}/"