telnet-interface.js 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. // Telnet demo:
  2. // - Basic telnet socket handling using the TelnetInterface
  3. // - Handling client's screen size
  4. // - Handling socket being closed by client
  5. // - Handling cleanly closing the socket by hand
  6. import net from 'node:net'
  7. import {Root} from 'tui-lib/ui/primitives'
  8. import {TelnetInterface} from 'tui-lib/util/interfaces'
  9. import AppElement from './basic-app.js'
  10. const server = new net.Server(socket => {
  11. const telnetInterface = new TelnetInterface(socket)
  12. telnetInterface.getScreenSize().then(size => {
  13. const root = new Root(telnetInterface)
  14. root.w = size.width
  15. root.h = size.height
  16. telnetInterface.on('resize', newSize => {
  17. root.w = newSize.width
  18. root.h = newSize.height
  19. root.fixAllLayout()
  20. })
  21. const appElement = new AppElement()
  22. root.addChild(appElement)
  23. root.select(appElement)
  24. let closed = false
  25. appElement.on('quitRequested', () => {
  26. if (!closed) {
  27. telnetInterface.cleanTelnetOptions()
  28. socket.write('Goodbye!\n')
  29. socket.end()
  30. clearInterval(interval)
  31. closed = true
  32. }
  33. })
  34. socket.on('close', () => {
  35. if (!closed) {
  36. clearInterval(interval)
  37. closed = true
  38. }
  39. })
  40. const interval = setInterval(() => root.render(), 100)
  41. }).catch(error => {
  42. console.error(error)
  43. process.exit(1)
  44. })
  45. })
  46. server.listen(8008)