grenache-nodejs-http 1.0.2 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +11 -11
- package/test/before-after.js +56 -15
- package/test/peer-rpc-server-buffered.js +129 -156
- package/test/peer-rpc-server-secure-buffered.js +128 -176
- package/test/peer-rpc-server-secure-streaming.js +84 -127
- package/test/peer-rpc-server-secure.js +30 -78
- package/test/peer-rpc-server-streaming.js +84 -111
- package/test/peer-rpc-server.js +27 -57
- package/test/rpc-server-manual-request-handling.js +22 -53
- package/test/rpc-server-readstream-size.js +20 -48
|
@@ -1,236 +1,189 @@
|
|
|
1
|
-
|
|
1
|
+
'use strict'
|
|
2
2
|
|
|
3
|
-
const
|
|
3
|
+
const test = require('brittle')
|
|
4
4
|
const { PassThrough } = require('stream')
|
|
5
5
|
const fs = require('fs')
|
|
6
6
|
const path = require('path')
|
|
7
|
-
const {
|
|
8
|
-
const Link = require('grenache-nodejs-link')
|
|
9
|
-
const setupHooks = require('./before-after.js')
|
|
10
|
-
|
|
11
|
-
const PORT = 1337
|
|
12
|
-
let link, peer, peerSrvBuf, serviceBuf, stop
|
|
13
|
-
describe('RPC integration', () => {
|
|
14
|
-
setupHooks((grapes) => {
|
|
15
|
-
link = new Link({
|
|
16
|
-
grape: 'http://127.0.0.1:30001'
|
|
17
|
-
})
|
|
18
|
-
link.start()
|
|
19
|
-
|
|
20
|
-
peer = new PeerRPCClient(link, {
|
|
21
|
-
secure: {
|
|
22
|
-
key: fs.readFileSync(path.join(__dirname, './certs/client1-key.pem')),
|
|
23
|
-
cert: fs.readFileSync(path.join(__dirname, './certs/client1-crt.pem')),
|
|
24
|
-
ca: fs.readFileSync(path.join(__dirname, './certs/ca-crt.pem')),
|
|
25
|
-
rejectUnauthorized: false // take care, can be dangerous in production!
|
|
26
|
-
}
|
|
27
|
-
})
|
|
28
|
-
peer.init()
|
|
29
|
-
|
|
30
|
-
peerSrvBuf = new PeerRPCServer(link, {
|
|
31
|
-
secure: {
|
|
32
|
-
key: fs.readFileSync(path.join(__dirname, './certs/server-key.pem')),
|
|
33
|
-
cert: fs.readFileSync(path.join(__dirname, './certs/server-crt.pem')),
|
|
34
|
-
ca: fs.readFileSync(path.join(__dirname, './certs/ca-crt.pem')),
|
|
35
|
-
requestCert: true,
|
|
36
|
-
rejectUnauthorized: false // take care, can be dangerous in production!
|
|
37
|
-
},
|
|
38
|
-
timeout: 300000
|
|
39
|
-
})
|
|
7
|
+
const { rpcTestCase } = require('./before-after')
|
|
40
8
|
|
|
41
|
-
|
|
42
|
-
serviceBuf = peerSrvBuf.transport('buffered')
|
|
43
|
-
serviceBuf.listen(PORT)
|
|
9
|
+
const rpcTest = rpcTestCase({ transport: 'buffered', isSecure: true })
|
|
44
10
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
11
|
+
test('RPC integration', async (t) => {
|
|
12
|
+
await t.test('buffered parsing works, objects', { timeout: 7000 }, rpcTest(async ({ t, service, peer }) => {
|
|
13
|
+
service.on('request', (rid, key, payload, handler, cert, meta) => {
|
|
14
|
+
t.ok(typeof rid === 'string')
|
|
15
|
+
t.is(key, 'rpc_test')
|
|
16
|
+
t.alike(payload, { hello: 'world' })
|
|
48
17
|
|
|
49
|
-
|
|
50
|
-
peer.stop()
|
|
51
|
-
link.stop()
|
|
52
|
-
serviceBuf.stop()
|
|
53
|
-
}
|
|
54
|
-
})
|
|
55
|
-
|
|
56
|
-
it('buffered parsing works, objects', (done) => {
|
|
57
|
-
serviceBuf.on('request', (rid, key, payload, handler, cert, meta) => {
|
|
58
|
-
assert.ok(typeof rid === 'string')
|
|
59
|
-
assert.strictEqual(key, 'rpc_buf')
|
|
60
|
-
assert.deepStrictEqual(payload, { hello: 'world' })
|
|
61
|
-
|
|
62
|
-
assert.strictEqual(meta.isStream, false)
|
|
18
|
+
t.is(meta.isStream, false)
|
|
63
19
|
|
|
64
20
|
handler.reply(null, { hello: 'helloworld' })
|
|
65
21
|
})
|
|
66
22
|
|
|
67
23
|
const opts = { timeout: 100000 }
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
done()
|
|
24
|
+
await new Promise(resolve => {
|
|
25
|
+
peer.request('rpc_test', { hello: 'world' }, opts, (err, result) => {
|
|
26
|
+
if (err) throw err
|
|
27
|
+
t.alike(result, { hello: 'helloworld' })
|
|
28
|
+
resolve()
|
|
29
|
+
})
|
|
75
30
|
})
|
|
76
|
-
})
|
|
31
|
+
}))
|
|
77
32
|
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
33
|
+
await t.test('buffered parsing works, strings', { timeout: 7000 }, rpcTest(async ({ t, service, peer }) => {
|
|
34
|
+
service.on('request', (rid, key, payload, handler, cert, meta) => {
|
|
35
|
+
t.ok(typeof rid === 'string')
|
|
36
|
+
t.is(key, 'rpc_test')
|
|
37
|
+
t.is(payload, 'hello')
|
|
83
38
|
|
|
84
|
-
|
|
39
|
+
t.is(meta.isStream, false)
|
|
85
40
|
|
|
86
41
|
handler.reply(null, 'world')
|
|
87
42
|
})
|
|
88
43
|
|
|
89
44
|
const opts = { timeout: 100000 }
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
done()
|
|
45
|
+
await new Promise(resolve => {
|
|
46
|
+
peer.request('rpc_test', 'hello', opts, (err, result) => {
|
|
47
|
+
if (err) throw err
|
|
48
|
+
t.is(result, 'world')
|
|
49
|
+
resolve()
|
|
50
|
+
})
|
|
97
51
|
})
|
|
98
|
-
})
|
|
52
|
+
}))
|
|
99
53
|
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
54
|
+
await t.test('buffered parsing works, compressed strings', { timeout: 7000 }, rpcTest(async ({ t, service, peer }) => {
|
|
55
|
+
service.on('request', (rid, key, payload, handler, cert, meta) => {
|
|
56
|
+
t.ok(typeof rid === 'string')
|
|
57
|
+
t.is(key, 'rpc_test')
|
|
58
|
+
t.is(payload, 'hello')
|
|
105
59
|
|
|
106
|
-
|
|
107
|
-
|
|
60
|
+
t.is(meta.isStream, false)
|
|
61
|
+
t.is(meta.compress, true)
|
|
108
62
|
|
|
109
63
|
handler.reply(null, 'world')
|
|
110
64
|
})
|
|
111
65
|
|
|
112
66
|
const opts = { timeout: 100000, compress: true }
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
done()
|
|
67
|
+
await new Promise(resolve => {
|
|
68
|
+
peer.request('rpc_test', 'hello', opts, (err, result) => {
|
|
69
|
+
if (err) throw err
|
|
70
|
+
t.is(result, 'world')
|
|
71
|
+
resolve()
|
|
72
|
+
})
|
|
120
73
|
})
|
|
121
|
-
})
|
|
122
|
-
|
|
123
|
-
it('buffered parsing works, strings from streaming client', (done) => {
|
|
124
|
-
serviceBuf.on('request', (rid, key, payload, handler, cert, meta) => {
|
|
125
|
-
assert.ok(typeof rid === 'string')
|
|
126
|
-
assert.strictEqual(key, 'rpc_buf')
|
|
127
|
-
assert.strictEqual(payload, 'hello')
|
|
128
|
-
|
|
129
|
-
assert.strictEqual(meta.isStream, true)
|
|
74
|
+
}))
|
|
130
75
|
|
|
76
|
+
await t.test('buffered parsing works, strings from streaming client', { timeout: 7000 }, rpcTest(async ({ t, service, peer }) => {
|
|
77
|
+
service.on('request', (rid, key, payload, handler, cert, meta) => {
|
|
78
|
+
t.ok(typeof rid === 'string')
|
|
79
|
+
t.is(key, 'rpc_test')
|
|
80
|
+
t.is(payload, 'hello')
|
|
81
|
+
t.is(meta.isStream, true)
|
|
131
82
|
handler.reply(null, 'world')
|
|
132
83
|
})
|
|
133
84
|
|
|
134
|
-
const req = peer.stream('
|
|
85
|
+
const req = peer.stream('rpc_test', {
|
|
135
86
|
timeout: 10000
|
|
136
87
|
})
|
|
137
88
|
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
89
|
+
const p = new Promise(resolve => {
|
|
90
|
+
req
|
|
91
|
+
.on('data', (data) => {
|
|
92
|
+
const d = JSON.parse(data.toString())
|
|
93
|
+
// ["65c5737f-bbce-40f9-b48a-af8bd8869d66",null,"world"]
|
|
94
|
+
t.is(d[1], null)
|
|
95
|
+
t.is(d[2], 'world')
|
|
96
|
+
resolve()
|
|
97
|
+
})
|
|
98
|
+
.on('end', () => {})
|
|
99
|
+
.on('error', (e) => { console.error(e) })
|
|
100
|
+
})
|
|
149
101
|
|
|
150
102
|
const writable = new PassThrough()
|
|
151
|
-
writable.write('["UUID", "
|
|
103
|
+
writable.write('["UUID", "rpc_test", "hello"]')
|
|
152
104
|
writable.end()
|
|
153
105
|
writable.pipe(req)
|
|
154
|
-
}).timeout(7000)
|
|
155
|
-
|
|
156
|
-
it('buffered parsing works, objects from streaming client', (done) => {
|
|
157
|
-
serviceBuf.on('request', (rid, key, payload, handler, cert, meta) => {
|
|
158
|
-
assert.ok(typeof rid === 'string')
|
|
159
|
-
assert.strictEqual(key, 'rpc_buf')
|
|
160
|
-
assert.deepStrictEqual(payload, { hello: 'world' })
|
|
161
106
|
|
|
162
|
-
|
|
107
|
+
await p
|
|
108
|
+
}))
|
|
163
109
|
|
|
110
|
+
await t.test('buffered parsing works, objects from streaming client', { timeout: 7000 }, rpcTest(async ({ t, service, peer }) => {
|
|
111
|
+
service.on('request', (rid, key, payload, handler, cert, meta) => {
|
|
112
|
+
t.ok(typeof rid === 'string')
|
|
113
|
+
t.is(key, 'rpc_test')
|
|
114
|
+
t.alike(payload, { hello: 'world' })
|
|
115
|
+
t.is(meta.isStream, true)
|
|
164
116
|
handler.reply(null, { hello: 'helloworld' })
|
|
165
117
|
})
|
|
166
118
|
|
|
167
|
-
const req = peer.stream('
|
|
119
|
+
const req = peer.stream('rpc_test', {
|
|
168
120
|
timeout: 10000
|
|
169
121
|
})
|
|
170
122
|
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
123
|
+
const p = new Promise(resolve => {
|
|
124
|
+
req
|
|
125
|
+
.on('data', (data) => {
|
|
126
|
+
const d = JSON.parse(data.toString())
|
|
127
|
+
t.is(d[1], null)
|
|
128
|
+
t.alike(d[2], { hello: 'helloworld' })
|
|
129
|
+
resolve()
|
|
130
|
+
})
|
|
131
|
+
.on('end', () => {})
|
|
132
|
+
.on('error', (e) => { console.error(e) })
|
|
133
|
+
})
|
|
181
134
|
|
|
182
135
|
const writable = new PassThrough()
|
|
183
|
-
writable.write('["UUID", "
|
|
136
|
+
writable.write('["UUID", "rpc_test", { "hello": "world" }]')
|
|
184
137
|
writable.end()
|
|
185
138
|
writable.pipe(req)
|
|
186
|
-
}).timeout(7000)
|
|
187
|
-
|
|
188
|
-
it('buffered parsing works, extra headers', (done) => {
|
|
189
|
-
serviceBuf.on('request', (rid, key, payload, handler, cert, meta) => {
|
|
190
|
-
assert.ok(typeof rid === 'string')
|
|
191
|
-
assert.strictEqual(key, 'rpc_buf')
|
|
192
|
-
assert.deepStrictEqual(payload, { hello: 'world' })
|
|
193
|
-
|
|
194
|
-
assert.strictEqual(meta.action, 'uploadPublic')
|
|
195
|
-
assert.deepStrictEqual(meta.args, { foo: 'bar' })
|
|
196
|
-
assert.strictEqual(meta.isStream, true)
|
|
197
139
|
|
|
140
|
+
await p
|
|
141
|
+
}))
|
|
142
|
+
|
|
143
|
+
await t.test('buffered parsing works, extra headers', { timeout: 7000 }, rpcTest(async ({ t, service, peer }) => {
|
|
144
|
+
service.on('request', (rid, key, payload, handler, cert, meta) => {
|
|
145
|
+
t.ok(typeof rid === 'string')
|
|
146
|
+
t.is(key, 'rpc_test')
|
|
147
|
+
t.alike(payload, { hello: 'world' })
|
|
148
|
+
t.is(meta.action, 'uploadPublic')
|
|
149
|
+
t.alike(meta.args, { foo: 'bar' })
|
|
150
|
+
t.is(meta.isStream, true)
|
|
198
151
|
handler.reply(null, { hello: 'helloworld' })
|
|
199
152
|
})
|
|
200
153
|
|
|
201
|
-
const req = peer.stream('
|
|
154
|
+
const req = peer.stream('rpc_test', {
|
|
202
155
|
timeout: 10000,
|
|
203
156
|
headers: { _a: 'uploadPublic', _ar: { foo: 'bar' } }
|
|
204
157
|
})
|
|
205
158
|
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
159
|
+
const p = new Promise(resolve => {
|
|
160
|
+
req
|
|
161
|
+
.on('data', (data) => {
|
|
162
|
+
const d = JSON.parse(data.toString())
|
|
163
|
+
t.is(d[1], null)
|
|
164
|
+
t.alike(d[2], { hello: 'helloworld' })
|
|
165
|
+
resolve()
|
|
166
|
+
})
|
|
167
|
+
.on('end', () => {})
|
|
168
|
+
.on('error', (e) => { console.error(e) })
|
|
169
|
+
})
|
|
216
170
|
|
|
217
171
|
const writable = new PassThrough()
|
|
218
|
-
writable.write('["UUID", "
|
|
172
|
+
writable.write('["UUID", "rpc_test", { "hello": "world" }]')
|
|
219
173
|
writable.end()
|
|
220
174
|
writable.pipe(req)
|
|
221
|
-
}).timeout(7000)
|
|
222
|
-
|
|
223
|
-
it('buf/buf: serialized files work', (done) => {
|
|
224
|
-
serviceBuf.on('request', (rid, key, payload, handler, cert, meta) => {
|
|
225
|
-
assert.ok(typeof rid === 'string')
|
|
226
|
-
assert.strictEqual(key, 'rpc_buf')
|
|
227
|
-
|
|
228
|
-
assert.strictEqual(payload.action, 'uploadPublic')
|
|
229
|
-
assert.strictEqual(payload.args[1].key, 'example-amazon-dynamo-sosp2007-4.pdf')
|
|
230
|
-
assert.strictEqual(typeof payload.args[0], 'string')
|
|
231
|
-
|
|
232
|
-
assert.strictEqual(meta.isStream, false)
|
|
233
175
|
|
|
176
|
+
await p
|
|
177
|
+
}))
|
|
178
|
+
|
|
179
|
+
await t.test('buf/buf: serialized files work', { timeout: 7000 }, rpcTest(async ({ t, service, peer }) => {
|
|
180
|
+
service.on('request', (rid, key, payload, handler, cert, meta) => {
|
|
181
|
+
t.ok(typeof rid === 'string')
|
|
182
|
+
t.is(key, 'rpc_test')
|
|
183
|
+
t.is(payload.action, 'uploadPublic')
|
|
184
|
+
t.is(payload.args[1].key, 'example-amazon-dynamo-sosp2007-4.pdf')
|
|
185
|
+
t.is(typeof payload.args[0], 'string')
|
|
186
|
+
t.is(meta.isStream, false)
|
|
234
187
|
handler.reply(null, 'ok')
|
|
235
188
|
})
|
|
236
189
|
|
|
@@ -250,13 +203,12 @@ describe('RPC integration', () => {
|
|
|
250
203
|
action: 'uploadPublic',
|
|
251
204
|
args: [buf.toString('hex'), optsPdf]
|
|
252
205
|
}
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
done()
|
|
206
|
+
await new Promise(resolve => {
|
|
207
|
+
peer.request('rpc_test', queryUploadPublicPdf, opts, (err, result) => {
|
|
208
|
+
if (err) throw err
|
|
209
|
+
t.alike(result, 'ok')
|
|
210
|
+
resolve()
|
|
211
|
+
})
|
|
260
212
|
})
|
|
261
|
-
})
|
|
213
|
+
}))
|
|
262
214
|
})
|