UNPKG

1.32 kBJavaScriptView Raw
1const net = require('net')
2const path = require('path')
3const StringDecoder = require('string_decoder').StringDecoder
4const log = require('./log')
5
6const OPT = {
7 allowHalfOpen: true
8}
9
10module.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}