1 | #!/usr/bin/env node
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 |
|
10 |
|
11 | process.title = 'blessed-telnet';
|
12 |
|
13 | var fs = require('fs');
|
14 | var path = require('path');
|
15 | var blessed = require('blessed');
|
16 | var telnet = require('telnet');
|
17 |
|
18 | var 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 |
|
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 |
|
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 |
|
101 | function 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 |
|
125 | var test = process.argv[2] || path.resolve(__dirname, '../test/widget-shadow.js');
|
126 | if (~test.indexOf('widget-png.js')) process.argv.length = 2;
|
127 | test = path.resolve(process.cwd(), test);
|
128 |
|
129 | function 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 |
|
138 | server.listen(2300);
|
139 | console.log('Listening on 2300...');
|