changeset 112:4f2b89e6fde2

RLG-Web: improvements to choices and status messaging. Server-side, have gamemux 'end' events include the name and game, so they can be sent to WebSockets connected to /status. This means a WebSocket client only needs to update its choice list when it gets a begin or end message with its own username. So it only needs to check /pstatus/<name> at those times and can stop polling.
author John "Elwin" Edwards <elwin@sdf.org>
date Mon, 16 Jul 2012 08:23:51 -0700
parents f56fdfeed01a
children 43340faa061c
files rlgterm.js rlgwebd.js
diffstat 2 files changed, 16 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/rlgterm.js	Sun Jul 15 22:33:44 2012 -0700
+++ b/rlgterm.js	Mon Jul 16 08:23:51 2012 -0700
@@ -533,6 +533,10 @@
     }
     return;
   }
+  if (session.lcred) {
+    /* When starting the socket, the choices list might not be initialized. */
+    getchoices();
+  }
   if (statsock)
     return; 
   statsock = new WebSocket("ws://" + window.location.host + "/status");
@@ -544,10 +548,12 @@
       if (e instanceof SyntaxError)
         return;
     }
-    if (msg.t != "t") {
-      return;
+    if (msg.t == "t") {
+      tableCurrent(msg.g);
     }
-    tableCurrent(msg.g);
+    else if ((msg.t == "b" || msg.t == "e") && msg.p == session.lname) {
+      getchoices();
+    }
   };
   statsock.onclose = function (ev) {
     statsock = null;
@@ -555,6 +561,9 @@
 }
 
 function getcurrent(clear) {
+  if (WebSocket) {
+    return;
+  }
   if (session.id || clear) {
     if (statInterval) {
       window.clearInterval(statInterval);
@@ -567,9 +576,6 @@
   }
   if (session.lcred)
     getchoices();
-  if (WebSocket) {
-    return;
-  }
   var req = new XMLHttpRequest();
   req.onerror = errHandler;
   req.onreadystatechange = function () {
--- a/rlgwebd.js	Sun Jul 15 22:33:44 2012 -0700
+++ b/rlgwebd.js	Mon Jul 16 08:23:51 2012 -0700
@@ -173,13 +173,13 @@
   };
   // Teardown.
   this.term.on("exit", function () {
+    var id = ss.sessid;
     fs.unlink(ss.lock);
     ss.record.end();
     ss.emit('exit');
-    var id = ss.sessid;
+    gamemux.emit('end', id, ss.pname, ss.game.uname);
     delete sessions[id];
     tslog("Game %s ended.", id);
-    gamemux.emit('end', id);
   });
   this.close = function () {
     if (this.sessid in sessions)
@@ -1229,8 +1229,8 @@
     var listH = function (list) {
       conn.sendUTF(JSON.stringify(list));
     };
-    var endH = function (n) {
-      conn.sendUTF(JSON.stringify({"t": "e", "n": n}));
+    var endH = function (n, pname, gname) {
+      conn.sendUTF(JSON.stringify({"t": "e", "n": n, "p": pname, "g": gname}));
     };
     gamemux.on('begin', beginH);
     gamemux.on('list', listH);