« get me outta code hell

use ESM module syntax & minor cleanups - 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:
author(quasar) nebula <qznebula@protonmail.com>2023-05-12 17:42:09 -0300
committer(quasar) nebula <qznebula@protonmail.com>2023-05-13 12:48:36 -0300
commit6ea74c268a12325296a1d2e7fc31b02030ddb8bc (patch)
tree5da94d93acb64e7ab650d240d6cb23c659ad02ca /examples/telnet-interface.js
parente783bcf8522fa68e6b221afd18469c3c265b1bb7 (diff)
use ESM module syntax & minor cleanups
The biggest change here is moving various element classes under
more scope-specific directories, which helps to avoid circular
dependencies and is just cleaner to navigate and expand in the
future.

Otherwise this is a largely uncritical port to ESM module syntax!
There are probably a number of changes and other cleanups that
remain much needed.

Whenever I make changes to tui-lib it's hard to believe it's
already been <INSERT COUNTING NUMBER HERE> years since the
previous time. First commits are from January 2017, and the
code originates a month earlier in KAaRMNoD!
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)