1 | const net = require('net')
|
2 | const path = require('path')
|
3 | const StringDecoder = require('string_decoder').StringDecoder
|
4 | const log = require('./log')
|
5 |
|
6 | const OPT = {
|
7 | allowHalfOpen: true
|
8 | }
|
9 |
|
10 | module.exports = (filename, run) => {
|
11 | const file = path.resolve(filename)
|
12 |
|
13 | const server = net.createServer(OPT, socket => {
|
14 | const decoder = new StringDecoder()
|
15 | const message = []
|
16 |
|
17 | socket.json = (err, data) => {
|
18 | const res = {}
|
19 |
|
20 | if (err) {
|
21 | res.error = {
|
22 | message: err.message,
|
23 | stack: err.stack,
|
24 | code: err.code
|
25 | }
|
26 | } else {
|
27 | res.data = data
|
28 | }
|
29 |
|
30 | socket.end(JSON.stringify(res))
|
31 | }
|
32 |
|
33 | socket.on('error', handle)
|
34 |
|
35 | socket.once('data', chunk => {
|
36 | message.push(decoder.write(chunk))
|
37 | })
|
38 |
|
39 | socket.once('end', () => {
|
40 | message.push(decoder.end())
|
41 |
|
42 | try {
|
43 | let obj = JSON.parse(message.join(''))
|
44 |
|
45 | run(obj).then(data => {
|
46 | socket.json(null, data)
|
47 | }).catch(err => {
|
48 | socket.json(err)
|
49 | })
|
50 | } catch (err) {
|
51 | socket.json(err)
|
52 | }
|
53 | })
|
54 | })
|
55 |
|
56 | if (!global.test) {
|
57 | server.listen(file)
|
58 | }
|
59 |
|
60 | server.on('error', err => {
|
61 | handle(err)
|
62 | log.get('z1').err.once('close', () => {
|
63 | process.exit(1)
|
64 | })
|
65 | log.remove('z1')
|
66 | })
|
67 |
|
68 | return server
|
69 | }
|