Mercurial > hg > rlgwebd
comparison webtty.js @ 15:7466927c17a5
webtty.js: check message order.
Implement checking the numbers of the client's messages on the server.
Fixing out-of-ordering isn't implemented because the problem hasn't
been observed yet, though it likely will once actual network transit
is involved.
author | John "Elwin" Edwards <elwin@sdf.org> |
---|---|
date | Tue, 15 May 2012 16:26:28 -0700 |
parents | bf7c26d0b66d |
children | e4773ac5d4d5 |
comparison
equal
deleted
inserted
replaced
14:155f3c104759 | 15:7466927c17a5 |
---|---|
36 this.child = child_process.spawn(ptyhelp, ["bash"], spawnopts); | 36 this.child = child_process.spawn(ptyhelp, ["bash"], spawnopts); |
37 var ss = this; | 37 var ss = this; |
38 /* Eventually we'll need to make sure the sessid isn't in use yet. */ | 38 /* Eventually we'll need to make sure the sessid isn't in use yet. */ |
39 this.sessid = sessid; | 39 this.sessid = sessid; |
40 this.alive = true; | 40 this.alive = true; |
41 this.data = []; | 41 this.data = []; // Buffer for the process' output. |
42 this.nsend = 0; | 42 this.nsend = 0; // Number to use for the next message sent. |
43 this.nrecv = 0; // Number expected on the next message received. | |
44 this.msgQ = []; // Queue for messages that arrived out of order. | |
43 this.child.stdout.on("data", function (buf) { | 45 this.child.stdout.on("data", function (buf) { |
44 ss.data.push(buf); | 46 ss.data.push(buf); |
45 }); | 47 }); |
46 this.child.stderr.on("data", function (buf) { | 48 this.child.stderr.on("data", function (buf) { |
47 ss.data.push(buf); | 49 ss.data.push(buf); |
50 ss.exitcode = (code != null ? code : 255); | 52 ss.exitcode = (code != null ? code : 255); |
51 ss.alive = false; | 53 ss.alive = false; |
52 /* Wait for all the data to get collected */ | 54 /* Wait for all the data to get collected */ |
53 setTimeout(ss.cleanup, 1000); | 55 setTimeout(ss.cleanup, 1000); |
54 }); | 56 }); |
55 this.write = function (data) { | 57 this.write = function (data, n) { |
56 if (this.alive) | 58 if (!this.alive) { |
57 this.child.stdin.write(data); | 59 /* Throw some kind of exception? */ |
58 /* Otherwise, throw some kind of exception? */ | 60 return; |
61 } | |
62 if (n !== this.nrecv) { | |
63 console.log("Session " + this.sessid + ": Expected message " + this.nrecv + ", got " + n); | |
64 } | |
65 this.nrecv = n + 1; | |
66 this.child.stdin.write(data); | |
59 }; | 67 }; |
60 this.read = function () { | 68 this.read = function () { |
61 if (this.data.length == 0) | 69 if (this.data.length == 0) |
62 return null; | 70 return null; |
63 var pos = 0; | 71 var pos = 0; |
301 if (hexstr.length % 2 != 0) { | 309 if (hexstr.length % 2 != 0) { |
302 sendError(res, 2); | 310 sendError(res, 2); |
303 return; | 311 return; |
304 } | 312 } |
305 keybuf = new Buffer(hexstr, "hex"); | 313 keybuf = new Buffer(hexstr, "hex"); |
306 cterm.write(keybuf); | 314 cterm.write(keybuf, formdata["n"]); |
307 } | 315 } |
308 readFeed(res, cterm); | 316 readFeed(res, cterm); |
309 } | 317 } |
310 else if (target == "/login") { | 318 else if (target == "/login") { |
311 login(req, res, formdata); | 319 login(req, res, formdata); |