blessed-telnet.js 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. #!/usr/bin/env node
  2. /**
  3. * blessed-telnet.js
  4. * https://github.com/chjj/blessed
  5. * Copyright (c) 2013-2015, Christopher Jeffrey (MIT License)
  6. * A blessed telnet server.
  7. * See: https://github.com/TooTallNate/node-telnet
  8. */
  9. process.title = 'blessed-telnet';
  10. var fs = require('fs');
  11. var path = require('path');
  12. var blessed = require('blessed');
  13. var telnet = require('telnet');
  14. var server = telnet.createServer(function(client) {
  15. client.do.transmit_binary();
  16. client.do.terminal_type();
  17. client.do.window_size();
  18. client.do.environment_variables();
  19. client.on('debug', function(msg) {
  20. console.error(msg);
  21. });
  22. client.on('environment variables', function(data) {
  23. if (data.command === 'sb') {
  24. if (data.name === 'TERM') {
  25. screen.terminal = data.value;
  26. } else {
  27. // Clear the screen since they may have used `env send [var]`.
  28. screen.realloc();
  29. }
  30. screen.render();
  31. }
  32. });
  33. client.on('terminal type', function(data) {
  34. if (data.command === 'sb' && data.name) {
  35. screen.terminal = data.name;
  36. screen.render();
  37. }
  38. });
  39. client.on('window size', function(data) {
  40. if (data.command === 'sb') {
  41. client.columns = data.columns;
  42. client.rows = data.rows;
  43. client.emit('resize');
  44. }
  45. });
  46. // Make the client look like a tty:
  47. client.setRawMode = function(mode) {
  48. client.isRaw = mode;
  49. if (!client.writable) return;
  50. if (mode) {
  51. client.do.suppress_go_ahead();
  52. client.will.suppress_go_ahead();
  53. client.will.echo();
  54. } else {
  55. client.dont.suppress_go_ahead();
  56. client.wont.suppress_go_ahead();
  57. client.wont.echo();
  58. }
  59. };
  60. client.isTTY = true;
  61. client.isRaw = false;
  62. client.columns = 80;
  63. client.rows = 24;
  64. var screen = blessed.screen({
  65. smartCSR: true,
  66. input: client,
  67. output: client,
  68. terminal: 'xterm-256color',
  69. fullUnicode: true
  70. });
  71. client.on('close', function() {
  72. if (!screen.destroyed) {
  73. screen.destroy();
  74. }
  75. });
  76. screen.on('destroy', function() {
  77. if (client.writable) {
  78. client.destroy();
  79. }
  80. });
  81. if (test === 'widget-simple') {
  82. return simpleTest(screen);
  83. }
  84. loadTest(screen, test);
  85. });
  86. function simpleTest(screen) {
  87. screen.data.main = blessed.box({
  88. parent: screen,
  89. width: '80%',
  90. height: '90%',
  91. border: 'line',
  92. content: 'Welcome to my server. Here is your own private session.',
  93. style: {
  94. bg: 'red'
  95. }
  96. });
  97. screen.key('i', function() {
  98. screen.data.main.style.bg = 'blue';
  99. screen.render();
  100. });
  101. screen.key(['C-c', 'q'], function(ch, key) {
  102. screen.destroy();
  103. });
  104. screen.render();
  105. }
  106. var test = process.argv[2] || path.resolve(__dirname, '../test/widget-shadow.js');
  107. if (~test.indexOf('widget-png.js')) process.argv.length = 2;
  108. test = path.resolve(process.cwd(), test);
  109. function loadTest(screen, name) {
  110. var Screen = blessed.screen;
  111. blessed.screen = function() { return screen; };
  112. var path = require.resolve(name);
  113. delete require.cache[path];
  114. require(name);
  115. blessed.screen = Screen;
  116. }
  117. server.listen(2300);
  118. console.log('Listening on 2300...');