xuxiaobo-bobo 842b34b5ca 0218
2024-02-18 15:40:48 +08:00

69 lines
1.5 KiB
JavaScript

'use strict';
const net = require('net');
const JSON = require('./json-buffer');
const INIT = 1;
const CALL = 0;
const modules = [];
const NULL_PROMISE = Promise.resolve(null);
const server = net.createServer({allowHalfOpen: true}, c => {
let responded = false;
function respond(data) {
if (responded) return;
responded = true;
c.end(JSON.stringify(data));
}
let buffer = '';
c.on('error', function(err) {
respond({s: false, v: {code: err.code, message: err.message}});
});
c.on('data', function(data) {
buffer += data.toString('utf8');
if (/\r\n/.test(buffer)) {
onMessage(buffer.trim());
}
});
function onMessage(str) {
if (str === 'ping') {
c.end('pong');
return;
}
NULL_PROMISE.then(function() {
const req = JSON.parse(str);
if (req.t === INIT) {
return init(req.f, req.a);
}
return modules[req.i](req.a);
}).then(
function(response) {
respond({s: true, v: response});
},
function(err) {
respond({s: false, v: {code: err.code, message: err.message}});
}
);
}
});
function init(filename, arg) {
let m = require(filename);
if (m && typeof m === 'object' && typeof m.default === 'function') {
m = m.default;
}
if (typeof m !== 'function') {
throw new Error(filename + ' did not export a function.');
}
return NULL_PROMISE.then(function() {
return m(arg);
}).then(function(fn) {
const i = modules.length;
modules[i] = fn;
return i;
});
}
server.listen(+process.argv[2]);