Mercurial > hg > rlgwebd
comparison rlgwebd.js @ 155:245a2959f504
Begin support for watching dgamelaunch games.
watcher.c is a subprocess which uses inotify to watch the inprogress
directories. A C program is used because node's fs.watch() can't tell
the difference between creation and deletion.
| author | John "Elwin" Edwards |
|---|---|
| date | Tue, 01 Apr 2014 11:23:25 -0700 |
| parents | bac9c3b01692 |
| children | 127f9e256d02 |
comparison
equal
deleted
inserted
replaced
| 154:b5a1430d0f71 | 155:245a2959f504 |
|---|---|
| 942 } | 942 } |
| 943 } | 943 } |
| 944 return null; | 944 return null; |
| 945 } | 945 } |
| 946 | 946 |
| 947 function startProgressWatcher() { | |
| 948 var watchdirs = []; | |
| 949 for (var gname in games) { | |
| 950 watchdirs.push(path.join("/dgldir/inprogress", gname)); | |
| 951 } | |
| 952 var subproc = child_process.spawn("/bin/watcher", watchdirs); | |
| 953 subproc.stdout.setEncoding('utf8'); | |
| 954 subproc.stdout.on('data', function (chunk) { | |
| 955 var fname = chunk.slice(2, -1); | |
| 956 var filere = /.*\/([^\/]*)\/([^\/:]*):(node:)?(.*)/; | |
| 957 var matchresult = fname.match(filere); | |
| 958 if (!matchresult || matchresult[3]) | |
| 959 return; | |
| 960 gname = matchresult[1]; | |
| 961 pname = matchresult[2]; | |
| 962 if (chunk[0] == "E") { | |
| 963 tslog("DGL: %s is playing %s: %s", pname, gname, fname) | |
| 964 } | |
| 965 else if (chunk[0] == "C") { | |
| 966 tslog("DGL: %s started playing %s: %s", pname, gname, fname) | |
| 967 } | |
| 968 else if (chunk[0] == "D") { | |
| 969 tslog("DGL: %s finished playing %s: %s", pname, gname, fname) | |
| 970 } | |
| 971 else { | |
| 972 tslog("Watcher says: %s", chunk) | |
| 973 } | |
| 974 }); | |
| 975 subproc.stdout.resume(); | |
| 976 return subproc; | |
| 977 } | |
| 978 | |
| 947 function serveStatic(req, res, fname) { | 979 function serveStatic(req, res, fname) { |
| 948 var nname = path.normalize(fname); | 980 var nname = path.normalize(fname); |
| 949 if (nname == "" || nname == "/") | 981 if (nname == "" || nname == "/") |
| 950 nname = "index.html"; | 982 nname = "index.html"; |
| 951 if (nname.match(/\/$/)) | 983 if (nname.match(/\/$/)) |
| 1372 allowlogin = false; | 1404 allowlogin = false; |
| 1373 tslog("Disconnecting..."); | 1405 tslog("Disconnecting..."); |
| 1374 for (var sessid in sessions) { | 1406 for (var sessid in sessions) { |
| 1375 sessions[sessid].close(); | 1407 sessions[sessid].close(); |
| 1376 } | 1408 } |
| 1409 progressWatcher.stdin.end("\n"); | |
| 1377 setTimeout(shutdown, 2000); | 1410 setTimeout(shutdown, 2000); |
| 1378 } | 1411 } |
| 1379 } | 1412 } |
| 1380 | 1413 |
| 1381 process.on("exit", function () { | 1414 process.on("exit", function () { |
| 1394 process.exit(1); | 1427 process.exit(1); |
| 1395 } | 1428 } |
| 1396 | 1429 |
| 1397 var httpServer; // declare here so shutdown() can find it | 1430 var httpServer; // declare here so shutdown() can find it |
| 1398 var wsServer; | 1431 var wsServer; |
| 1432 var progressWatcher; | |
| 1399 | 1433 |
| 1400 /* This could be nonblocking, but nothing else can start yet anyway. */ | 1434 /* This could be nonblocking, but nothing else can start yet anyway. */ |
| 1401 if (fs.existsSync(ctlsocket)) { | 1435 if (fs.existsSync(ctlsocket)) { |
| 1402 fs.unlinkSync(ctlsocket); | 1436 fs.unlinkSync(ctlsocket); |
| 1403 } | 1437 } |
| 1431 tslog('rlgwebd running on port %d', httpPort); | 1465 tslog('rlgwebd running on port %d', httpPort); |
| 1432 setInterval(reaper, playtimeout / 4); | 1466 setInterval(reaper, playtimeout / 4); |
| 1433 wsServer = new WebSocketServer({"httpServer": httpServer}); | 1467 wsServer = new WebSocketServer({"httpServer": httpServer}); |
| 1434 wsServer.on("request", wsHandler); | 1468 wsServer.on("request", wsHandler); |
| 1435 tslog('WebSockets are online'); | 1469 tslog('WebSockets are online'); |
| 1470 progressWatcher = startProgressWatcher(); | |
| 1436 setInterval(pushStatus, 4000); | 1471 setInterval(pushStatus, 4000); |
| 1437 }); | 1472 }); |
| 1438 | 1473 |
