« get me outta code hell

tui-lib - Pure Node.js library for making visual command-line programs (ala vim, ncdu)
about summary refs log tree commit diff
path: root/examples/telnet-interface.js
diff options
context:
space:
mode:
Diffstat (limited to 'examples/telnet-interface.js')
-rw-r--r--examples/telnet-interface.js59
1 files changed, 59 insertions, 0 deletions
diff --git a/examples/telnet-interface.js b/examples/telnet-interface.js
new file mode 100644
index 0000000..319786f
--- /dev/null
+++ b/examples/telnet-interface.js
@@ -0,0 +1,59 @@
+// Telnet demo:
+// - Basic telnet socket handling using the TelnetInterface
+// - Handling client's screen size
+// - Handling socket being closed by client
+// - Handling cleanly closing the socket by hand
+
+import net from 'node:net'
+
+import {Root} from 'tui-lib/ui/primitives'
+
+import {TelnetInterface} from 'tui-lib/util/interfaces'
+
+import AppElement from './basic-app.js'
+
+const server = new net.Server(socket => {
+  const telnetInterface = new TelnetInterface(socket)
+
+  telnetInterface.getScreenSize().then(size => {
+    const root = new Root(telnetInterface)
+    root.w = size.width
+    root.h = size.height
+
+    telnetInterface.on('resize', newSize => {
+      root.w = newSize.width
+      root.h = newSize.height
+      root.fixAllLayout()
+    })
+
+    const appElement = new AppElement()
+    root.addChild(appElement)
+    root.select(appElement)
+
+    let closed = false
+
+    appElement.on('quitRequested', () => {
+      if (!closed) {
+        telnetInterface.cleanTelnetOptions()
+        socket.write('Goodbye!\n')
+        socket.end()
+        clearInterval(interval)
+        closed = true
+      }
+    })
+
+    socket.on('close', () => {
+      if (!closed) {
+        clearInterval(interval)
+        closed = true
+      }
+    })
+
+    const interval = setInterval(() => root.render(), 100)
+  }).catch(error => {
+    console.error(error)
+    process.exit(1)
+  })
+})
+
+server.listen(8008)