mirror of
https://github.com/xuxiaobo-bobo/boda_jsEnv.git
synced 2025-04-22 23:44:23 +08:00
69 lines
1.5 KiB
JavaScript
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]);
|