wzp
2021-05-13 7d694a9113118daec5be7ac224dab46a3b20f106
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
'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]);