Mercurial > hg > rlgwebd
annotate webtty.js @ 98:75a016c49076 beta4
Designate as beta4.
author | John "Elwin" Edwards <elwin@sdf.org> |
---|---|
date | Thu, 12 Jul 2012 07:57:50 -0700 |
parents | ad4229cf8321 |
children | f14e92f6d955 |
rev | line source |
---|---|
0
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
1 #!/usr/bin/env node |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
2 var http = require('http'); |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
3 var url = require('url'); |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
4 var path = require('path'); |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
5 var fs = require('fs'); |
86
ad4229cf8321
WebTTY: use the pty.js module.
John "Elwin" Edwards <elwin@sdf.org>
parents:
81
diff
changeset
|
6 var pty = require("/usr/local/lib/node_modules/pty.js"); |
0
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
7 |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
8 var serveStaticRoot = "/home/elwin/hk/nodejs/rlg/s/"; |
7
d1b3c3af34d6
WebTTY: switch terminal size to 80x25.
John "Elwin" Edwards <elwin@sdf.org>
parents:
3
diff
changeset
|
9 var ptyhelp = "/home/elwin/hk/nodejs/rlg/ptyhelper"; |
0
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
10 var sessions = {}; |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
11 |
2
98bf7c94c954
webtty.js: set up the environment and working directory.
John "Elwin" Edwards <elwin@sdf.org>
parents:
0
diff
changeset
|
12 var env_dontuse = {"TMUX": true, "TMUX_PANE": true}; |
98bf7c94c954
webtty.js: set up the environment and working directory.
John "Elwin" Edwards <elwin@sdf.org>
parents:
0
diff
changeset
|
13 |
0
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
14 /* Constructor for TermSessions. Note that it opens the terminal and |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
15 * adds itself to the sessions dict. |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
16 */ |
9
826a7ced69f8
Make the emulator screen resizable.
John "Elwin" Edwards <elwin@sdf.org>
parents:
7
diff
changeset
|
17 function TermSession(sessid, h, w) { |
826a7ced69f8
Make the emulator screen resizable.
John "Elwin" Edwards <elwin@sdf.org>
parents:
7
diff
changeset
|
18 /* Set up the sizes. */ |
826a7ced69f8
Make the emulator screen resizable.
John "Elwin" Edwards <elwin@sdf.org>
parents:
7
diff
changeset
|
19 w = Math.floor(Number(w)); |
826a7ced69f8
Make the emulator screen resizable.
John "Elwin" Edwards <elwin@sdf.org>
parents:
7
diff
changeset
|
20 if (!(w > 0 && w < 256)) |
826a7ced69f8
Make the emulator screen resizable.
John "Elwin" Edwards <elwin@sdf.org>
parents:
7
diff
changeset
|
21 w = 80; |
826a7ced69f8
Make the emulator screen resizable.
John "Elwin" Edwards <elwin@sdf.org>
parents:
7
diff
changeset
|
22 this.w = w; |
826a7ced69f8
Make the emulator screen resizable.
John "Elwin" Edwards <elwin@sdf.org>
parents:
7
diff
changeset
|
23 h = Math.floor(Number(h)); |
826a7ced69f8
Make the emulator screen resizable.
John "Elwin" Edwards <elwin@sdf.org>
parents:
7
diff
changeset
|
24 if (!(h > 0 && h < 256)) |
826a7ced69f8
Make the emulator screen resizable.
John "Elwin" Edwards <elwin@sdf.org>
parents:
7
diff
changeset
|
25 h = 25; |
826a7ced69f8
Make the emulator screen resizable.
John "Elwin" Edwards <elwin@sdf.org>
parents:
7
diff
changeset
|
26 this.h = h; |
826a7ced69f8
Make the emulator screen resizable.
John "Elwin" Edwards <elwin@sdf.org>
parents:
7
diff
changeset
|
27 /* Customize the environment. */ |
2
98bf7c94c954
webtty.js: set up the environment and working directory.
John "Elwin" Edwards <elwin@sdf.org>
parents:
0
diff
changeset
|
28 var childenv = {}; |
98bf7c94c954
webtty.js: set up the environment and working directory.
John "Elwin" Edwards <elwin@sdf.org>
parents:
0
diff
changeset
|
29 for (var key in process.env) { |
98bf7c94c954
webtty.js: set up the environment and working directory.
John "Elwin" Edwards <elwin@sdf.org>
parents:
0
diff
changeset
|
30 if (!(key in env_dontuse)) |
98bf7c94c954
webtty.js: set up the environment and working directory.
John "Elwin" Edwards <elwin@sdf.org>
parents:
0
diff
changeset
|
31 childenv[key] = process.env[key]; |
98bf7c94c954
webtty.js: set up the environment and working directory.
John "Elwin" Edwards <elwin@sdf.org>
parents:
0
diff
changeset
|
32 } |
86
ad4229cf8321
WebTTY: use the pty.js module.
John "Elwin" Edwards <elwin@sdf.org>
parents:
81
diff
changeset
|
33 var spawnopts = {"env": childenv, "cwd": process.env["HOME"], |
ad4229cf8321
WebTTY: use the pty.js module.
John "Elwin" Edwards <elwin@sdf.org>
parents:
81
diff
changeset
|
34 "rows": this.h, "cols": this.w}; |
ad4229cf8321
WebTTY: use the pty.js module.
John "Elwin" Edwards <elwin@sdf.org>
parents:
81
diff
changeset
|
35 this.term = pty.spawn("bash", [], spawnopts); |
0
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
36 var ss = this; |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
37 /* Eventually we'll need to make sure the sessid isn't in use yet. */ |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
38 this.sessid = sessid; |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
39 this.alive = true; |
15
7466927c17a5
webtty.js: check message order.
John "Elwin" Edwards <elwin@sdf.org>
parents:
13
diff
changeset
|
40 this.data = []; // Buffer for the process' output. |
7466927c17a5
webtty.js: check message order.
John "Elwin" Edwards <elwin@sdf.org>
parents:
13
diff
changeset
|
41 this.nsend = 0; // Number to use for the next message sent. |
7466927c17a5
webtty.js: check message order.
John "Elwin" Edwards <elwin@sdf.org>
parents:
13
diff
changeset
|
42 this.nrecv = 0; // Number expected on the next message received. |
7466927c17a5
webtty.js: check message order.
John "Elwin" Edwards <elwin@sdf.org>
parents:
13
diff
changeset
|
43 this.msgQ = []; // Queue for messages that arrived out of order. |
86
ad4229cf8321
WebTTY: use the pty.js module.
John "Elwin" Edwards <elwin@sdf.org>
parents:
81
diff
changeset
|
44 this.term.on("data", function (buf) { |
0
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
45 ss.data.push(buf); |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
46 }); |
86
ad4229cf8321
WebTTY: use the pty.js module.
John "Elwin" Edwards <elwin@sdf.org>
parents:
81
diff
changeset
|
47 this.term.on("exit", function () { |
0
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
48 ss.alive = false; |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
49 /* Wait for all the data to get collected */ |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
50 setTimeout(ss.cleanup, 1000); |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
51 }); |
15
7466927c17a5
webtty.js: check message order.
John "Elwin" Edwards <elwin@sdf.org>
parents:
13
diff
changeset
|
52 this.write = function (data, n) { |
7466927c17a5
webtty.js: check message order.
John "Elwin" Edwards <elwin@sdf.org>
parents:
13
diff
changeset
|
53 if (!this.alive) { |
7466927c17a5
webtty.js: check message order.
John "Elwin" Edwards <elwin@sdf.org>
parents:
13
diff
changeset
|
54 /* Throw some kind of exception? */ |
7466927c17a5
webtty.js: check message order.
John "Elwin" Edwards <elwin@sdf.org>
parents:
13
diff
changeset
|
55 return; |
7466927c17a5
webtty.js: check message order.
John "Elwin" Edwards <elwin@sdf.org>
parents:
13
diff
changeset
|
56 } |
7466927c17a5
webtty.js: check message order.
John "Elwin" Edwards <elwin@sdf.org>
parents:
13
diff
changeset
|
57 if (n !== this.nrecv) { |
7466927c17a5
webtty.js: check message order.
John "Elwin" Edwards <elwin@sdf.org>
parents:
13
diff
changeset
|
58 console.log("Session " + this.sessid + ": Expected message " + this.nrecv + ", got " + n); |
7466927c17a5
webtty.js: check message order.
John "Elwin" Edwards <elwin@sdf.org>
parents:
13
diff
changeset
|
59 } |
7466927c17a5
webtty.js: check message order.
John "Elwin" Edwards <elwin@sdf.org>
parents:
13
diff
changeset
|
60 this.nrecv = n + 1; |
86
ad4229cf8321
WebTTY: use the pty.js module.
John "Elwin" Edwards <elwin@sdf.org>
parents:
81
diff
changeset
|
61 this.term.write(data); |
0
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
62 }; |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
63 this.read = function () { |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
64 if (this.data.length == 0) |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
65 return null; |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
66 var pos = 0; |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
67 var i = 0; |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
68 for (i = 0; i < this.data.length; i++) |
86
ad4229cf8321
WebTTY: use the pty.js module.
John "Elwin" Edwards <elwin@sdf.org>
parents:
81
diff
changeset
|
69 pos += Buffer.byteLength(this.data[i]); |
0
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
70 var nbuf = new Buffer(pos); |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
71 var tptr; |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
72 pos = 0; |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
73 while (this.data.length > 0) { |
86
ad4229cf8321
WebTTY: use the pty.js module.
John "Elwin" Edwards <elwin@sdf.org>
parents:
81
diff
changeset
|
74 tptr = new Buffer(this.data.shift()); |
0
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
75 tptr.copy(nbuf, pos); |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
76 pos += tptr.length; |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
77 } |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
78 return nbuf; |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
79 }; |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
80 this.close = function () { |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
81 if (this.alive) |
86
ad4229cf8321
WebTTY: use the pty.js module.
John "Elwin" Edwards <elwin@sdf.org>
parents:
81
diff
changeset
|
82 this.term.kill('SIGHUP'); |
0
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|