-
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.js
88 lines (73 loc) · 1.98 KB
/
index.js
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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
const { spawn } = require('child_process')
const { Client } = require('jayson')
const { inherits } = require('util')
const pull = require('pull-stream')
const Push = require('pull-pushable')
const ndjson = require('pull-ndjson')
const stream2pull = require('stream-to-pull-stream')
const path = require('path')
const os = require('os')
const arch = os.arch()
const platform = os.platform()
const system = `${platform}-${arch}`
const builds = [
'linux-x64',
'linux-arm64',
'android-arm64',
'android-arm',
'darwin-x64',
'win32-x64',
'win32-x32'
]
module.exports = function CreateClient (opts) {
if (!builds.includes(system)) {
console.error(`No sbot-patchql builds for your arch ${platform}-${arch}`)
process.exit()
}
const execName = `json_rpc_stdio${platform === 'win32' ? '.exe' : ''}`
const execPath = path.join(__dirname, 'bin', system, execName)
const patchql = spawn(execPath, opts)
const pendingRequest = {}
const pushable = Push()
pull(
stream2pull(patchql.stdout),
ndjson.parse(),
pull.drain((response) => {
pendingRequest[response.id](null, response)
delete pendingRequest[response.id]
})
)
pull(
pushable,
pull.map(JSON.stringify),
pull.map(s => s + '\n'),
stream2pull(patchql.stdin, () => {
})
)
const ClientStdio = function (options) {
if (!(this instanceof ClientStdio)) {
return new ClientStdio(options)
}
Client.call(this, options)
}
inherits(ClientStdio, Client)
ClientStdio.prototype._request = function (request, cb) {
pendingRequest[request.id] = cb
pushable.push(request, (err) => console.log('done writing to stdin.', err))
}
const client = new ClientStdio()
function query ({ query, variables }, cb) {
client.request('query', { query, variables }, (err, data) => {
if(err) return cb(err)
if(data.error) return cb(data.error)
cb(null, data.result)
})
}
function close () {
patchql.kill()
}
return {
query,
close
}
}