-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathclient.js
More file actions
66 lines (64 loc) · 1.65 KB
/
client.js
File metadata and controls
66 lines (64 loc) · 1.65 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
var Terminal = require('term.js');
var shoe = require('shoe');
var MuxDemux = require('mux-demux');
var emitStream = require('emit-stream');
var JSONStream = require('JSONStream');
var EventEmitter = require('events').EventEmitter;
var clientEvents = new EventEmitter();
var remoteResize;
connect();
function connect() {
var stream = shoe('/stream');
var muxDemux = new MuxDemux(onStream);
stream.pipe(muxDemux).pipe(stream);
stream.on('end', reconnect);
}
function reconnect() {
if (window.term) {
try {
document.body.removeChild(window.term.element);
}
catch (err) {}
}
setTimeout(connect, 5000);
}
function onStream(stream) {
if (stream.meta === 'terminal') {
onTerminal(stream);
}
if (stream.meta === 'clientEvents') {
onClientEventsStream(stream);
}
}
function onTerminal(stream) {
var term = window.term = new Terminal({
cols: 80,
rows: 24,
useStyle: true,
screenKeys: true
});
term.on('data', stream.write.bind(stream));
term.open();
stream.pipe(term);
term.end = term.destroy;
var resizeTerm = resize.bind(null, term);
resizeTerm();
setTimeout(resizeTerm, 1000);
window.onresize = resizeTerm;
}
function resize(term) {
var x = document.body.clientWidth / term.element.offsetWidth;
var y = document.body.clientHeight / term.element.offsetHeight;
x = x * term.cols | 0;
y = y * term.rows | 0;
term.resize(x, y);
if (typeof remoteResize === 'function') {
remoteResize(x, y);
}
}
function onClientEventsStream(stream) {
emitStream.toStream(clientEvents).pipe(JSONStream.stringify()).pipe(stream);
remoteResize = function (x, y) {
clientEvents.emit('resize', x, y);
};
}