runtime-telnet-server
Version:
Telnet server for runtime.js
68 lines (63 loc) • 1.98 kB
JavaScript
;
const runtime = require('runtimejs');
const net = require('net');
module.exports = (opts, cb) => {
if (typeof opts === 'function') {
cb = opts;
opts = null;
}
opts = opts || {};
const server = net.createServer((client) => {
let ondata;
let defaultOndata = (data) => {
if (data.substr(data.length-2) == '\r\n') data = data.substr(0, data.length-2);
if (data.substr(data.length-1) == '\n') data = data.substr(0, data.length-1);
if (data === 'exit') return client.end();
let arr = data.split(' ');
let cmd = arr.shift();
let io = new runtime.stdio.StdioInterface();
io.onwrite = io.onwriteerror = (text) => {
if (text.substr(text.length-1) == '\n') text = text.substr(0, text.length-1) + '\r\n';
client.write(text);
}
io.onread = (cb) => {
ondata = (data) => {
ondata = defaultOndata;
cb(data.substr(0, 1));
}
}
io.onreadline = (cb) => {
ondata = (data) => {
if (data.substr(data.length-2) == '\r\n') data = data.substr(0, data.length-2);
if (data.substr(data.length-1) == '\n') data = data.substr(0, data.length-1);
ondata = defaultOndata;
cb(data);
}
}
try {
const command = runtime.shell.runCommand(cmd, {
stdio: io,
args: arr
}, (rescode) => {
client.write('$ ');
});
} catch(e) {
let msg = e.stack;
if (e instanceof TypeError && e.message === 'commands.get(...) is not a function') msg = `${cmd}: Command not found`;
client.write(msg + '\r\n');
client.write('$ ');
}
}
ondata = defaultOndata;
client.on('data', (data) => {
data = String(data);
ondata(data);
});
client.write('$ ');
});
module.exports.exit = () => {
server.close();
connections = null;
}
server.listen(opts.port || 9000, () => cb && cb());
}