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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
|
'use strict'
const EventEmitter = require('events')
const net = require('net')
const setupClient = require('./client')
const {
util: {
TelnetInterfacer
}
} = require('./tui-lib')
class TelnetServer extends EventEmitter {
constructor(backend) {
super()
this.backend = backend
this.server = new net.Server(socket => this.handleConnection(socket))
this.sockets = []
}
listen(port) {
this.server.listen(port)
}
async handleConnection(socket) {
const interfacer = new TelnetInterfacer(socket)
const { appElement, cleanTerminal, flushable, renderInterval } = await setupClient({
backend: this.backend,
writable: socket,
interfacer,
frameRate: 100,
appConfig: {
canControlPlayback: false,
canControlQueue: true,
canProcessMetadata: false,
canSuspend: false,
showLeftPane: true,
stopPlayingUponQuit: false,
menubarColor: 2
}
})
appElement.attachAsServerClient(this)
let closed = false
const quit = (msg = 'See you!') => {
cleanTerminal()
interfacer.cleanTelnetOptions()
socket.write('\r' + msg + '\r\n')
socket.end()
flushable.end()
closed = true
this.sockets.splice(this.sockets.indexOf(socket), 1)
}
appElement.on('quitRequested', quit)
socket.on('close', () => {
clearInterval(renderInterval)
if (!closed) {
flushable.end()
closed = true
this.sockets.splice(this.sockets.indexOf(socket), 1)
}
this.emit('left', socket)
})
socket.quit = quit
this.sockets.push(socket)
this.emit('joined', socket)
}
disconnectAllSockets(msg) {
while (this.sockets.length) {
this.sockets[0].quit(msg)
}
}
}
module.exports = TelnetServer
|