comparison rlgwebd.js @ 32:c75fc4b1d13d

rlgwebd.js: add a status interface. The RLG-Web server now makes its status and the list of current games available to a GET on /status.
author John "Elwin" Edwards <elwin@sdf.org>
date Tue, 05 Jun 2012 14:51:42 -0700
parents 7dd6becf9ce9
children 57f4b36ef06b
comparison
equal deleted inserted replaced
31:7dd6becf9ce9 32:c75fc4b1d13d
52 * adds itself to the sessions dict. It currently assumes the user has 52 * adds itself to the sessions dict. It currently assumes the user has
53 * been authenticated. 53 * been authenticated.
54 */ 54 */
55 function TermSession(game, user, files, dims) { 55 function TermSession(game, user, files, dims) {
56 /* First make sure starting the game will work. */ 56 /* First make sure starting the game will work. */
57 if (!(game in games)) { 57 if (game in games) {
58 this.game = games[game];
59 }
60 else {
58 // TODO: throw an exception instead 61 // TODO: throw an exception instead
59 return null; 62 return null;
60 } 63 }
64 this.player = user;
61 /* This order seems to best avoid race conditions... */ 65 /* This order seems to best avoid race conditions... */
62 this.alive = false; 66 this.alive = false;
63 this.sessid = randkey(); 67 this.sessid = randkey();
64 while (this.sessid in sessions) { 68 while (this.sessid in sessions) {
65 this.sessid = randkey(); 69 this.sessid = randkey();
84 childenv[key] = process.env[key]; 88 childenv[key] = process.env[key];
85 } 89 }
86 childenv["PTYHELPER"] = String(this.h) + "x" + String(this.w); 90 childenv["PTYHELPER"] = String(this.h) + "x" + String(this.w);
87 /* TODO handle tty-opening errors */ 91 /* TODO handle tty-opening errors */
88 /* TODO make argument-finding into a method */ 92 /* TODO make argument-finding into a method */
89 args = [games[game].path, "-n", user.toString()]; 93 args = [this.game.path, "-n", user.toString()];
90 this.child = child_process.spawn("/bin/ptyhelper", args, {"env": childenv}); 94 this.child = child_process.spawn("/bin/ptyhelper", args, {"env": childenv});
91 var ss = this; 95 var ss = this;
92 this.alive = true; 96 this.alive = true;
93 this.data = []; 97 this.data = [];
94 this.lock = files[0]; 98 this.lock = files[0];
556 else { 560 else {
557 sendError(res, 1, null); 561 sendError(res, 1, null);
558 } 562 }
559 } 563 }
560 564
565 function statusmsg(req, res) {
566 var reply = {"s": allowlogin, "g": []};
567 for (var sessid in sessions) {
568 if (sessions[sessid].alive) {
569 var gamedesc = {};
570 gamedesc["p"] = sessions[sessid].player;
571 gamedesc["g"] = sessions[sessid].game.name;
572 reply["g"].push(gamedesc);
573 }
574 }
575 res.writeHead(200, { "Content-Type": "application/json" });
576 res.write(JSON.stringify(reply));
577 res.end();
578 }
579
561 var errorcodes = [ "Generic Error", "Not logged in", "Invalid data", 580 var errorcodes = [ "Generic Error", "Not logged in", "Invalid data",
562 "Login failed", "Already playing", "Game launch failed", 581 "Login failed", "Already playing", "Game launch failed",
563 "Server shutting down" ]; 582 "Server shutting down" ];
564 583
565 function sendError(res, ecode, msg) { 584 function sendError(res, ecode, msg) {
635 sendError(res, 1, null); 654 sendError(res, 1, null);
636 return; 655 return;
637 } 656 }
638 readFeed(res, cterm); 657 readFeed(res, cterm);
639 } 658 }
640 /* Default page, create a new term */ 659 else if (target == '/status') {
641 /* FIXME New term not created anymore, is a special case still needed? */ 660 statusmsg(req, res);
642 else if (target == '/') {
643 serveStatic(req, res, "/");
644 } 661 }
645 else /* Go look for it in the filesystem */ 662 else /* Go look for it in the filesystem */
646 serveStatic(req, res, target); 663 serveStatic(req, res, target);
647 } 664 }
648 else { /* Some other method */ 665 else { /* Some other method */