# HG changeset patch # User John "Elwin" Edwards # Date 1339002078 25200 # Node ID a0387f112bcfca289b9520f60947583d3d18facf # Parent f15efa4818b477f25bbe3f18ce0ddf906f930878 RLG-Web: autosave idle games. If a game has been idle for too long, close it. diff -r f15efa4818b4 -r a0387f112bcf rlgwebd.js --- a/rlgwebd.js Tue Jun 05 22:33:41 2012 -0700 +++ b/rlgwebd.js Wed Jun 06 10:01:18 2012 -0700 @@ -20,6 +20,7 @@ var dropToGID = 501; var serveStaticRoot = "/var/www/"; // inside the chroot var passwdfile = "/dgldir/dgl-login"; +var playtimeout = 3600000; // Idle time before games are autosaved, in ms /* Global state */ var sessions = {}; @@ -201,7 +202,7 @@ }; this.cleanup = function () { /* Call this when the child is dead. */ - if (this.alive) + if (ss.alive) return; ss.record.end(); /* Give the client a chance to read any leftover data. */ @@ -318,6 +319,23 @@ return true; } +function reaper() { + var now = new Date(); + function reapcheck(session) { + if (!session.alive) + return; + fs.fstat(session.record.fd, function (err, stats) { + if (!err && now - stats.mtime > playtimeout) { + tslog("Reaping %s", session.sessid); + session.close(); + } + }); + } + for (var sessid in sessions) { + reapcheck(sessions[sessid]); + } +} + function login(req, res, formdata) { if (!allowlogin) { sendError(res, 6, null); @@ -754,5 +772,6 @@ httpServer = http.createServer(webHandler); httpServer.listen(httpPort); tslog('rlgwebd running on port %d', httpPort); + setInterval(reaper, playtimeout / 4); });