Mercurial > hg > rlgwebd
annotate shterm.js @ 60:31bb3cf4f25f
Make sure watchers start with completely drawn screens.
TermSessions now buffer all data since the last screen clear, so new
Watchers can start with complete screens.
| author | John "Elwin" Edwards <elwin@sdf.org> | 
|---|---|
| date | Tue, 19 Jun 2012 19:11:59 -0700 | 
| parents | 7a50b4412fea | 
| children | d7eb63cd7a16 | 
| rev | line source | 
|---|---|
| 1 | 1 /* shterm.js: browser-side JavaScript to handle I/O for termemu.js when it | 
| 2 * is running a shell via the webtty.js server. | |
| 3 */ | |
| 4 | |
| 58 
7a50b4412fea
Move credentials into the drivers.
 John "Elwin" Edwards <elwin@sdf.org> parents: 
14diff
changeset | 5 var isalive = false; // Whether the session is currently active. | 
| 14 
155f3c104759
shterm.js: Client-side message ordering
 John "Elwin" Edwards <elwin@sdf.org> parents: 
13diff
changeset | 6 var nsend = 0; // The number of the next packet to send. | 
| 
155f3c104759
shterm.js: Client-side message ordering
 John "Elwin" Edwards <elwin@sdf.org> parents: 
13diff
changeset | 7 var nrecv = 0; // The next packet expected. | 
| 
155f3c104759
shterm.js: Client-side message ordering
 John "Elwin" Edwards <elwin@sdf.org> parents: 
13diff
changeset | 8 var msgQ = []; // Queue for out-of-order messages. | 
| 13 
bf7c26d0b66d
webtty: switch upward protocol to JSON
 John "Elwin" Edwards <elwin@sdf.org> parents: 
12diff
changeset | 9 | 
| 0 
bd412f63ce0d
Put this project under version control, finally.
 John "Elwin" Edwards <elwin@sdf.org> parents: diff
changeset | 10 // A state machine that keeps track of polling the server. | 
| 
bd412f63ce0d
Put this project under version control, finally.
 John "Elwin" Edwards <elwin@sdf.org> parents: diff
changeset | 11 var ajaxstate = { | 
| 
bd412f63ce0d
Put this project under version control, finally.
 John "Elwin" Edwards <elwin@sdf.org> parents: diff
changeset | 12 state: 0, | 
| 
bd412f63ce0d
Put this project under version control, finally.
 John "Elwin" Edwards <elwin@sdf.org> parents: diff
changeset | 13 timerID: null, | 
| 
bd412f63ce0d
Put this project under version control, finally.
 John "Elwin" Edwards <elwin@sdf.org> parents: diff
changeset | 14 clear: function () { | 
| 
bd412f63ce0d
Put this project under version control, finally.
 John "Elwin" Edwards <elwin@sdf.org> parents: diff
changeset | 15 if (this.timerID != null) { | 
| 
bd412f63ce0d
Put this project under version control, finally.
 John "Elwin" Edwards <elwin@sdf.org> parents: diff
changeset | 16 window.clearTimeout(this.timerID); | 
| 
bd412f63ce0d
Put this project under version control, finally.
 John "Elwin" Edwards <elwin@sdf.org> parents: diff
changeset | 17 this.timerID = null; | 
| 
bd412f63ce0d
Put this project under version control, finally.
 John "Elwin" Edwards <elwin@sdf.org> parents: diff
changeset | 18 } | 
| 
bd412f63ce0d
Put this project under version control, finally.
 John "Elwin" Edwards <elwin@sdf.org> parents: diff
changeset | 19 }, | 
| 
bd412f63ce0d
Put this project under version control, finally.
 John "Elwin" Edwards <elwin@sdf.org> parents: diff
changeset | 20 set: function (ms) { | 
| 
bd412f63ce0d
Put this project under version control, finally.
 John "Elwin" Edwards <elwin@sdf.org> parents: diff
changeset | 21 this.clear(); | 
| 
bd412f63ce0d
Put this project under version control, finally.
 John "Elwin" Edwards <elwin@sdf.org> parents: diff
changeset | 22 this.timerID = window.setTimeout(getData, ms); | 
| 
bd412f63ce0d
Put this project under version control, finally.
 John "Elwin" Edwards <elwin@sdf.org> parents: diff
changeset | 23 }, | 
| 
bd412f63ce0d
Put this project under version control, finally.
 John "Elwin" Edwards <elwin@sdf.org> parents: diff
changeset | 24 gotdata: function () { | 
| 
bd412f63ce0d
Put this project under version control, finally.
 John "Elwin" Edwards <elwin@sdf.org> parents: diff
changeset | 25 this.set(100); | 
| 
bd412f63ce0d
Put this project under version control, finally.
 John "Elwin" Edwards <elwin@sdf.org> parents: diff
changeset | 26 this.state = 0; | 
| 
bd412f63ce0d
Put this project under version control, finally.
 John "Elwin" Edwards <elwin@sdf.org> parents: diff
changeset | 27 }, | 
| 
bd412f63ce0d
Put this project under version control, finally.
 John "Elwin" Edwards <elwin@sdf.org> parents: diff
changeset | 28 gotnothing: function () { | 
| 
bd412f63ce0d
Put this project under version control, finally.
 John "Elwin" Edwards <elwin@sdf.org> parents: diff
changeset | 29 if (this.state == 0) { | 
| 
bd412f63ce0d
Put this project under version control, finally.
 John "Elwin" Edwards <elwin@sdf.org> parents: diff
changeset | 30 this.set(100); | 
| 
bd412f63ce0d
Put this project under version control, finally.
 John "Elwin" Edwards <elwin@sdf.org> parents: diff
changeset | 31 this.state = 1; | 
| 
bd412f63ce0d
Put this project under version control, finally.
 John "Elwin" Edwards <elwin@sdf.org> parents: diff
changeset | 32 } | 
| 
bd412f63ce0d
Put this project under version control, finally.
 John "Elwin" Edwards <elwin@sdf.org> parents: diff
changeset | 33 else if (this.state == 1) { | 
| 
bd412f63ce0d
Put this project under version control, finally.
 John "Elwin" Edwards <elwin@sdf.org> parents: diff
changeset | 34 this.set(300); | 
| 
bd412f63ce0d
Put this project under version control, finally.
 John "Elwin" Edwards <elwin@sdf.org> parents: diff
changeset | 35 this.state = 2; | 
| 
bd412f63ce0d
Put this project under version control, finally.
 John "Elwin" Edwards <elwin@sdf.org> parents: diff
changeset | 36 } | 
| 
bd412f63ce0d
Put this project under version control, finally.
 John "Elwin" Edwards <elwin@sdf.org> parents: diff
changeset | 37 else if (this.state == 2) { | 
| 
bd412f63ce0d
Put this project under version control, finally.
 John "Elwin" Edwards <elwin@sdf.org> parents: diff
changeset | 38 this.set(1000); | 
| 
bd412f63ce0d
Put this project under version control, finally.
 John "Elwin" Edwards <elwin@sdf.org> parents: diff
changeset | 39 this.state = 3; | 
| 
bd412f63ce0d
Put this project under version control, finally.
 John "Elwin" Edwards <elwin@sdf.org> parents: diff
changeset | 40 } | 
| 
bd412f63ce0d
Put this project under version control, finally.
 John "Elwin" Edwards <elwin@sdf.org> parents: diff
changeset | 41 else { | 
| 
bd412f63ce0d
Put this project under version control, finally.
 John "Elwin" Edwards <elwin@sdf.org> parents: diff
changeset | 42 this.set(5000); | 
| 
bd412f63ce0d
Put this project under version control, finally.
 John "Elwin" Edwards <elwin@sdf.org> parents: diff
changeset | 43 this.state = 3; | 
| 
bd412f63ce0d
Put this project under version control, finally.
 John "Elwin" Edwards <elwin@sdf.org> parents: diff
changeset | 44 } | 
| 
bd412f63ce0d
Put this project under version control, finally.
 John "Elwin" Edwards <elwin@sdf.org> parents: diff
changeset | 45 }, | 
| 
bd412f63ce0d
Put this project under version control, finally.
 John "Elwin" Edwards <elwin@sdf.org> parents: diff
changeset | 46 posted: function () { | 
| 
bd412f63ce0d
Put this project under version control, finally.
 John "Elwin" Edwards <elwin@sdf.org> parents: diff
changeset | 47 this.set(100); | 
| 
bd412f63ce0d
Put this project under version control, finally.
 John "Elwin" Edwards <elwin@sdf.org> parents: diff
changeset | 48 this.state = 0; | 
| 
bd412f63ce0d
Put this project under version control, finally.
 John "Elwin" Edwards <elwin@sdf.org> parents: diff
changeset | 49 } | 
| 
bd412f63ce0d
Put this project under version control, finally.
 John "Elwin" Edwards <elwin@sdf.org> parents: diff
changeset | 50 }; | 
| 
bd412f63ce0d
Put this project under version control, finally.
 John "Elwin" Edwards <elwin@sdf.org> parents: diff
changeset | 51 | 
| 
bd412f63ce0d
Put this project under version control, finally.
 John "Elwin" Edwards <elwin@sdf.org> parents: diff
changeset | 52 function writeData(hexstr) { | 
| 
bd412f63ce0d
Put this project under version control, finally.
 John "Elwin" Edwards <elwin@sdf.org> parents: diff
changeset | 53 var codenum; | 
| 
bd412f63ce0d
Put this project under version control, finally.
 John "Elwin" Edwards <elwin@sdf.org> parents: diff
changeset | 54 var codes = []; | 
| 
bd412f63ce0d
Put this project under version control, finally.
 John "Elwin" Edwards <elwin@sdf.org> parents: diff
changeset | 55 var nc; | 
| 
bd412f63ce0d
Put this project under version control, finally.
 John "Elwin" Edwards <elwin@sdf.org> parents: diff
changeset | 56 var u8wait = 0; /* Stores bits from previous bytes of multibyte sequences. */ | 
| 
bd412f63ce0d
Put this project under version control, finally.
 John "Elwin" Edwards <elwin@sdf.org> parents: diff
changeset | 57 var expect = 0; /* The number of 10------ bytes expected. */ | 
| 
bd412f63ce0d
Put this project under version control, finally.
 John "Elwin" Edwards <elwin@sdf.org> parents: diff
changeset | 58 /* UTF-8 translation. */ | 
| 
bd412f63ce0d
Put this project under version control, finally.
 John "Elwin" Edwards <elwin@sdf.org> parents: diff
changeset | 59 for (var i = 0; i < hexstr.length; i += 2) { | 
| 
bd412f63ce0d
Put this project under version control, finally.
 John "Elwin" Edwards <elwin@sdf.org> parents: diff
changeset | 60 nc = Number("0x" + hexstr.substr(i, 2)); | 
| 
bd412f63ce0d
Put this project under version control, finally.
 John "Elwin" Edwards <elwin@sdf.org> parents: diff
changeset | 61 if (nc < 0x7F) { | 
| 
bd412f63ce0d
Put this project under version control, finally.
 John "Elwin" Edwards <elwin@sdf.org> parents: diff
changeset | 62 /* 0------- */ | 
| 
bd412f63ce0d
Put this project under version control, finally.
 John "Elwin" Edwards <elwin@sdf.org> parents: diff
changeset | 63 codes.push(nc); | 
| 
bd412f63ce0d
Put this project under version control, finally.
 John "Elwin" Edwards <elwin@sdf.org> parents: diff
changeset | 64 /* Any incomplete sequence will be discarded. */ | 
| 
bd412f63ce0d
Put this project under version control, finally.
 John "Elwin" Edwards <elwin@sdf.org> parents: diff
changeset | 65 u8wait = 0; | 
| 
bd412f63ce0d
Put this project under version control, finally.
 John "Elwin" Edwards <elwin@sdf.org> parents: diff
changeset | 66 expect = 0; | 
| 
bd412f63ce0d
Put this project under version control, finally.
 John "Elwin" Edwards <elwin@sdf.org> parents: diff
changeset | 67 } | 
| 
bd412f63ce0d
Put this project under version control, finally.
 John "Elwin" Edwards <elwin@sdf.org> parents: diff
changeset | 68 else if (nc < 0xC0) { | 
| 
bd412f63ce0d
Put this project under version control, finally.
 John "Elwin" Edwards <elwin@sdf.org> parents: diff
changeset | 69 /* 10------ : part of a multibyte sequence */ | 
| 
bd412f63ce0d
Put this project under version control, finally.
 John "Elwin" Edwards <elwin@sdf.org> parents: diff
changeset | 70 if (expect > 0) { | 
| 
bd412f63ce0d
Put this project under version control, finally.
 John "Elwin" Edwards <elwin@sdf.org> parents: diff
changeset | 71 u8wait <<= 6; | 
| 
bd412f63ce0d
Put this project under version control, finally.
 John "Elwin" Edwards <elwin@sdf.org> parents: diff
changeset | 72 u8wait += (nc & 0x3F); | 
| 
bd412f63ce0d
Put this project under version control, finally.
 John "Elwin" Edwards <elwin@sdf.org> parents: diff
changeset | 73 expect--; | 
| 
bd412f63ce0d
Put this project under version control, finally.
 John "Elwin" Edwards <elwin@sdf.org> parents: diff
changeset | 74 if (expect == 0) { | 
| 
bd412f63ce0d
Put this project under version control, finally.
 John "Elwin" Edwards <elwin@sdf.org> parents: diff
changeset | 75 codes.push(u8wait); | 
| 
bd412f63ce0d
Put this project under version control, finally.
 John "Elwin" Edwards <elwin@sdf.org> parents: diff
changeset | 76 u8wait = 0; | 
| 
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 } | 
| 
bd412f63ce0d
Put this project under version control, finally.
 John "Elwin" Edwards <elwin@sdf.org> parents: diff
changeset | 79 else { | 
| 
bd412f63ce0d
Put this project under version control, finally.
 John "Elwin" Edwards <elwin@sdf.org> parents: diff
changeset | 80 /* Assume an initial byte was missed. */ | 
| 
bd412f63ce0d
Put this project under version control, finally.
 John "Elwin" Edwards <elwin@sdf.org> parents: diff
changeset | 81 u8wait = 0; | 
| 
bd412f63ce0d
Put this project under version control, finally.
 John "Elwin" Edwards <elwin@sdf.org> parents: diff
changeset | 82 } | 
| 
bd412f63ce0d
Put this project under version control, finally.
 John "Elwin" Edwards <elwin@sdf.org> parents: diff
changeset | 83 } | 
| 
bd412f63ce0d
Put this project under version control, finally.
 John "Elwin" Edwards <elwin@sdf.org> parents: diff
changeset | 84 /* These will all discard any incomplete sequence. */ | 
| 
bd412f63ce0d
Put this project under version control, finally.
 John "Elwin" Edwards <elwin@sdf.org> parents: diff
changeset | 85 else if (nc < 0xE0) { | 
| 
bd412f63ce0d
Put this project under version control, finally.
 John "Elwin" Edwards <elwin@sdf.org> parents: diff
changeset | 86 /* 110----- : introduces 2-byte sequence */ | 
| 
bd412f63ce0d
Put this project under version control, finally.
 John "Elwin" Edwards <elwin@sdf.org> parents: diff
changeset | 87 u8wait = (nc & 0x1F); | 
| 
bd412f63ce0d
Put this project under version control, finally.
 John "Elwin" Edwards <elwin@sdf.org> | 
