« get me outta code hell

rename telnet-server.js to telnet.js - mtui - Music Text User Interface - user-friendly command line music player
about summary refs log tree commit diff
path: root/telnet.js
diff options
context:
space:
mode:
authorFlorrie <towerofnix@gmail.com>2020-07-10 11:24:23 -0300
committerFlorrie <towerofnix@gmail.com>2020-07-10 11:30:05 -0300
commit7ea3291db7dd2de13e9f07005e83524711f086af (patch)
treed937f9c2a9a2937a0ffe4bdd0611b943180eb9ee /telnet.js
parent20f8491545c3b598cc6bba893bc79db5cf6bcb1f (diff)
rename telnet-server.js to telnet.js
...for consistency with a socket.js (coming soon to a theater near you!)
Diffstat (limited to 'telnet.js')
-rw-r--r--telnet.js81
1 files changed, 81 insertions, 0 deletions
diff --git a/telnet.js b/telnet.js
new file mode 100644
index 0000000..33e3dcc
--- /dev/null
+++ b/telnet.js
@@ -0,0 +1,81 @@
+'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 } = await setupClient({
+      backend: this.backend,
+      writable: socket,
+      interfacer,
+      appConfig: {
+        canControlPlayback: false,
+        canControlQueue: true,
+        canControlQueuePlayers: false,
+        canProcessMetadata: false,
+        canSuspend: false,
+        showTabberPane: 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', () => {
+      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