UNPKG

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