grenache-nodejs-http 0.7.13 → 1.0.1
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/examples/rpc_server.js +1 -3
- package/examples/rpc_server_stream.js +1 -3
- package/examples/ssl/rpc_client_map.js +4 -4
- package/examples/ssl/rpc_server.js +4 -5
- package/lib/TransportRPCClient.js +60 -33
- package/lib/TransportRPCServer.js +1 -1
- package/package.json +17 -11
- package/test/before-after.js +10 -12
- package/test/certs/ca-crt.pem +19 -0
- package/test/certs/ca-crt.srl +1 -0
- package/test/certs/ca-key.pem +28 -0
- package/test/certs/client1-crt.pem +17 -0
- package/test/certs/client1-csr.pem +15 -0
- package/test/certs/client1-key.pem +28 -0
- package/test/certs/server-crt.pem +17 -0
- package/test/certs/server-csr.pem +15 -0
- package/test/certs/server-key.pem +28 -0
- package/test/helper.js +26 -32
- package/test/peer-rpc-server-secure-buffered.js +262 -0
- package/test/peer-rpc-server-secure-streaming.js +224 -0
- package/test/peer-rpc-server-secure.js +96 -0
- package/test/peer-rpc-server.js +76 -0
- package/examples/ssl/ca-crt.pem +0 -32
- package/examples/ssl/ca-crt.srl +0 -1
- package/examples/ssl/ca-key.pem +0 -54
- package/examples/ssl/ca.cnf +0 -31
- package/examples/ssl/client1-crt.pem +0 -32
- package/examples/ssl/client1-csr.pem +0 -29
- package/examples/ssl/client1-key.pem +0 -51
- package/examples/ssl/client1.cnf +0 -26
- package/examples/ssl/client2-crt.pem +0 -32
- package/examples/ssl/client2-csr.pem +0 -29
- package/examples/ssl/client2-key.pem +0 -51
- package/examples/ssl/client2.cnf +0 -26
- package/examples/ssl/server-crt.pem +0 -32
- package/examples/ssl/server-csr.pem +0 -29
- package/examples/ssl/server-key.pem +0 -51
- package/examples/ssl/server.cnf +0 -26
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
/* eslint-env mocha */
|
|
2
|
+
|
|
3
|
+
const assert = require('assert')
|
|
4
|
+
const { PassThrough } = require('stream')
|
|
5
|
+
const fs = require('fs')
|
|
6
|
+
const path = require('path')
|
|
7
|
+
const { PeerRPCClient, PeerRPCServer } = require('../')
|
|
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
|
+
})
|
|
40
|
+
|
|
41
|
+
peerSrvBuf.init()
|
|
42
|
+
serviceBuf = peerSrvBuf.transport('buffered')
|
|
43
|
+
serviceBuf.listen(PORT)
|
|
44
|
+
|
|
45
|
+
link.announce('rpc_buf', serviceBuf.port, {}, (err, res) => {
|
|
46
|
+
if (err) throw Error('error in announce, setup')
|
|
47
|
+
})
|
|
48
|
+
|
|
49
|
+
stop = () => {
|
|
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)
|
|
63
|
+
|
|
64
|
+
handler.reply(null, { hello: 'helloworld' })
|
|
65
|
+
})
|
|
66
|
+
|
|
67
|
+
const opts = { timeout: 100000 }
|
|
68
|
+
peer.request('rpc_buf', { hello: 'world' }, opts, (err, result) => {
|
|
69
|
+
if (err) throw err
|
|
70
|
+
|
|
71
|
+
assert.deepStrictEqual(result, { hello: 'helloworld' })
|
|
72
|
+
|
|
73
|
+
stop()
|
|
74
|
+
done()
|
|
75
|
+
})
|
|
76
|
+
}).timeout(7000)
|
|
77
|
+
|
|
78
|
+
it('buffered parsing works, strings', (done) => {
|
|
79
|
+
serviceBuf.on('request', (rid, key, payload, handler, cert, meta) => {
|
|
80
|
+
assert.ok(typeof rid === 'string')
|
|
81
|
+
assert.strictEqual(key, 'rpc_buf')
|
|
82
|
+
assert.strictEqual(payload, 'hello')
|
|
83
|
+
|
|
84
|
+
assert.strictEqual(meta.isStream, false)
|
|
85
|
+
|
|
86
|
+
handler.reply(null, 'world')
|
|
87
|
+
})
|
|
88
|
+
|
|
89
|
+
const opts = { timeout: 100000 }
|
|
90
|
+
peer.request('rpc_buf', 'hello', opts, (err, result) => {
|
|
91
|
+
if (err) throw err
|
|
92
|
+
|
|
93
|
+
assert.strictEqual(result, 'world')
|
|
94
|
+
|
|
95
|
+
stop()
|
|
96
|
+
done()
|
|
97
|
+
})
|
|
98
|
+
}).timeout(7000)
|
|
99
|
+
|
|
100
|
+
it('buffered parsing works, compressed strings', (done) => {
|
|
101
|
+
serviceBuf.on('request', (rid, key, payload, handler, cert, meta) => {
|
|
102
|
+
assert.ok(typeof rid === 'string')
|
|
103
|
+
assert.strictEqual(key, 'rpc_buf')
|
|
104
|
+
assert.strictEqual(payload, 'hello')
|
|
105
|
+
|
|
106
|
+
assert.strictEqual(meta.isStream, false)
|
|
107
|
+
assert.strictEqual(meta.compress, true)
|
|
108
|
+
|
|
109
|
+
handler.reply(null, 'world')
|
|
110
|
+
})
|
|
111
|
+
|
|
112
|
+
const opts = { timeout: 100000, compress: true }
|
|
113
|
+
peer.request('rpc_buf', 'hello', opts, (err, result) => {
|
|
114
|
+
if (err) throw err
|
|
115
|
+
|
|
116
|
+
assert.strictEqual(result, 'world')
|
|
117
|
+
|
|
118
|
+
stop()
|
|
119
|
+
done()
|
|
120
|
+
})
|
|
121
|
+
}).timeout(7000)
|
|
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)
|
|
130
|
+
|
|
131
|
+
handler.reply(null, 'world')
|
|
132
|
+
})
|
|
133
|
+
|
|
134
|
+
const req = peer.stream('rpc_buf', {
|
|
135
|
+
timeout: 10000
|
|
136
|
+
})
|
|
137
|
+
|
|
138
|
+
req
|
|
139
|
+
.on('data', (data) => {
|
|
140
|
+
const d = JSON.parse(data.toString())
|
|
141
|
+
// ["65c5737f-bbce-40f9-b48a-af8bd8869d66",null,"world"]
|
|
142
|
+
assert.strictEqual(d[1], null)
|
|
143
|
+
assert.strictEqual(d[2], 'world')
|
|
144
|
+
stop()
|
|
145
|
+
done()
|
|
146
|
+
})
|
|
147
|
+
.on('end', () => {})
|
|
148
|
+
.on('error', (e) => { console.error(e) })
|
|
149
|
+
|
|
150
|
+
const writable = new PassThrough()
|
|
151
|
+
writable.write('["UUID", "rpc_buf", "hello"]')
|
|
152
|
+
writable.end()
|
|
153
|
+
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
|
+
|
|
162
|
+
assert.strictEqual(meta.isStream, true)
|
|
163
|
+
|
|
164
|
+
handler.reply(null, { hello: 'helloworld' })
|
|
165
|
+
})
|
|
166
|
+
|
|
167
|
+
const req = peer.stream('rpc_buf', {
|
|
168
|
+
timeout: 10000
|
|
169
|
+
})
|
|
170
|
+
|
|
171
|
+
req
|
|
172
|
+
.on('data', (data) => {
|
|
173
|
+
const d = JSON.parse(data.toString())
|
|
174
|
+
assert.strictEqual(d[1], null)
|
|
175
|
+
assert.deepStrictEqual(d[2], { hello: 'helloworld' })
|
|
176
|
+
stop()
|
|
177
|
+
done()
|
|
178
|
+
})
|
|
179
|
+
.on('end', () => {})
|
|
180
|
+
.on('error', (e) => { console.error(e) })
|
|
181
|
+
|
|
182
|
+
const writable = new PassThrough()
|
|
183
|
+
writable.write('["UUID", "rpc_buf", { "hello": "world" }]')
|
|
184
|
+
writable.end()
|
|
185
|
+
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
|
+
|
|
198
|
+
handler.reply(null, { hello: 'helloworld' })
|
|
199
|
+
})
|
|
200
|
+
|
|
201
|
+
const req = peer.stream('rpc_buf', {
|
|
202
|
+
timeout: 10000,
|
|
203
|
+
headers: { _a: 'uploadPublic', _ar: { foo: 'bar' } }
|
|
204
|
+
})
|
|
205
|
+
|
|
206
|
+
req
|
|
207
|
+
.on('data', (data) => {
|
|
208
|
+
const d = JSON.parse(data.toString())
|
|
209
|
+
assert.strictEqual(d[1], null)
|
|
210
|
+
assert.deepStrictEqual(d[2], { hello: 'helloworld' })
|
|
211
|
+
stop()
|
|
212
|
+
done()
|
|
213
|
+
})
|
|
214
|
+
.on('end', () => {})
|
|
215
|
+
.on('error', (e) => { console.error(e) })
|
|
216
|
+
|
|
217
|
+
const writable = new PassThrough()
|
|
218
|
+
writable.write('["UUID", "rpc_buf", { "hello": "world" }]')
|
|
219
|
+
writable.end()
|
|
220
|
+
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
|
+
|
|
234
|
+
handler.reply(null, 'ok')
|
|
235
|
+
})
|
|
236
|
+
|
|
237
|
+
const opts = { timeout: 100000 }
|
|
238
|
+
const buf = fs.readFileSync(
|
|
239
|
+
path.join(__dirname, './example-amazon-dynamo-sosp2007.pdf')
|
|
240
|
+
)
|
|
241
|
+
|
|
242
|
+
const optsPdf = {
|
|
243
|
+
key: 'example-amazon-dynamo-sosp2007-4.pdf',
|
|
244
|
+
acl: 'public-read',
|
|
245
|
+
bucket: 'bfx-dev-robert',
|
|
246
|
+
contentType: 'application/pdf'
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
const queryUploadPublicPdf = {
|
|
250
|
+
action: 'uploadPublic',
|
|
251
|
+
args: [buf.toString('hex'), optsPdf]
|
|
252
|
+
}
|
|
253
|
+
peer.request('rpc_buf', queryUploadPublicPdf, opts, (err, result) => {
|
|
254
|
+
if (err) throw err
|
|
255
|
+
|
|
256
|
+
assert.deepStrictEqual(result, 'ok')
|
|
257
|
+
|
|
258
|
+
stop()
|
|
259
|
+
done()
|
|
260
|
+
})
|
|
261
|
+
}).timeout(7000)
|
|
262
|
+
})
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
/* eslint-env mocha */
|
|
2
|
+
|
|
3
|
+
const assert = require('assert')
|
|
4
|
+
const fs = require('fs')
|
|
5
|
+
const path = require('path')
|
|
6
|
+
const { PassThrough } = require('stream')
|
|
7
|
+
const { PeerRPCClient, PeerRPCServer } = require('../')
|
|
8
|
+
const Link = require('grenache-nodejs-link')
|
|
9
|
+
const setupHooks = require('./before-after.js')
|
|
10
|
+
|
|
11
|
+
const PORT = 1337
|
|
12
|
+
let link, peer, peerSrvStr, serviceStr, 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
|
+
peerSrvStr = 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
|
+
disableBuffered: true
|
|
40
|
+
})
|
|
41
|
+
|
|
42
|
+
peerSrvStr.init()
|
|
43
|
+
serviceStr = peerSrvStr.transport('stream')
|
|
44
|
+
serviceStr.listen(PORT)
|
|
45
|
+
|
|
46
|
+
link.announce('rpc_stream', serviceStr.port, {}, (err, res) => {
|
|
47
|
+
if (err) throw Error('error in announce, setup')
|
|
48
|
+
})
|
|
49
|
+
|
|
50
|
+
stop = () => {
|
|
51
|
+
peer.stop()
|
|
52
|
+
link.stop()
|
|
53
|
+
serviceStr.stop()
|
|
54
|
+
}
|
|
55
|
+
})
|
|
56
|
+
|
|
57
|
+
it('streaming works, objects, buffered client, reply handler', (done) => {
|
|
58
|
+
serviceStr.on('stream', (req, res, meta, handler) => {
|
|
59
|
+
assert.strictEqual(meta.isStream, false)
|
|
60
|
+
|
|
61
|
+
req.on('data', (d) => {
|
|
62
|
+
const [rid, key, args] = JSON.parse(d.toString())
|
|
63
|
+
|
|
64
|
+
assert.deepStrictEqual(args, { hello: 'world' })
|
|
65
|
+
assert.ok(typeof rid === 'string')
|
|
66
|
+
assert.strictEqual(key, 'rpc_stream')
|
|
67
|
+
|
|
68
|
+
handler.reply(rid, null, { hello: 'helloworld' })
|
|
69
|
+
})
|
|
70
|
+
})
|
|
71
|
+
|
|
72
|
+
const opts = { timeout: 100000 }
|
|
73
|
+
peer.request('rpc_stream', { hello: 'world' }, opts, (err, result) => {
|
|
74
|
+
if (err) throw err
|
|
75
|
+
assert.deepStrictEqual(result, { hello: 'helloworld' })
|
|
76
|
+
|
|
77
|
+
stop()
|
|
78
|
+
done()
|
|
79
|
+
})
|
|
80
|
+
}).timeout(7000)
|
|
81
|
+
|
|
82
|
+
it('streaming works, string, buffered client, reply handler', (done) => {
|
|
83
|
+
serviceStr.on('stream', (req, res, meta, handler) => {
|
|
84
|
+
assert.strictEqual(meta.isStream, false)
|
|
85
|
+
|
|
86
|
+
req.on('data', (d) => {
|
|
87
|
+
const [rid, key, args] = JSON.parse(d.toString())
|
|
88
|
+
|
|
89
|
+
assert.strictEqual(args, 'hello')
|
|
90
|
+
assert.ok(typeof rid === 'string')
|
|
91
|
+
assert.strictEqual(key, 'rpc_stream')
|
|
92
|
+
|
|
93
|
+
handler.reply(rid, null, 'world')
|
|
94
|
+
})
|
|
95
|
+
})
|
|
96
|
+
|
|
97
|
+
const opts = { timeout: 100000 }
|
|
98
|
+
peer.request('rpc_stream', 'hello', opts, (err, result) => {
|
|
99
|
+
if (err) throw err
|
|
100
|
+
assert.strictEqual(result, 'world')
|
|
101
|
+
|
|
102
|
+
stop()
|
|
103
|
+
done()
|
|
104
|
+
})
|
|
105
|
+
}).timeout(7000)
|
|
106
|
+
|
|
107
|
+
it('streaming works, string, buffered client, stream sent back', (done) => {
|
|
108
|
+
serviceStr.on('stream', (req, res, meta, handler) => {
|
|
109
|
+
assert.strictEqual(meta.isStream, false)
|
|
110
|
+
|
|
111
|
+
req.on('data', (d) => {
|
|
112
|
+
const [rid, key, args] = JSON.parse(d.toString())
|
|
113
|
+
|
|
114
|
+
assert.strictEqual(args, 'hello')
|
|
115
|
+
assert.ok(typeof rid === 'string')
|
|
116
|
+
assert.strictEqual(key, 'rpc_stream')
|
|
117
|
+
|
|
118
|
+
const writable = new PassThrough()
|
|
119
|
+
const payload = JSON.stringify([rid, null, 'world2'])
|
|
120
|
+
writable.pipe(res)
|
|
121
|
+
writable.write(payload)
|
|
122
|
+
writable.end()
|
|
123
|
+
})
|
|
124
|
+
})
|
|
125
|
+
|
|
126
|
+
const opts = { timeout: 100000 }
|
|
127
|
+
peer.request('rpc_stream', 'hello', opts, (err, result) => {
|
|
128
|
+
if (err) throw err
|
|
129
|
+
assert.strictEqual(result, 'world2')
|
|
130
|
+
|
|
131
|
+
stop()
|
|
132
|
+
done()
|
|
133
|
+
})
|
|
134
|
+
}).timeout(7000)
|
|
135
|
+
|
|
136
|
+
it('streaming works, buffer, stream client, stream on server', (done) => {
|
|
137
|
+
const reqPayload = Buffer.from('megalargefile')
|
|
138
|
+
const resPayload = Buffer.from('superlargefile')
|
|
139
|
+
|
|
140
|
+
serviceStr.on('stream', (req, res, meta, handler) => {
|
|
141
|
+
assert.strictEqual(meta.isStream, true)
|
|
142
|
+
|
|
143
|
+
req.on('data', (d) => {
|
|
144
|
+
const [rid, key] = meta.infoHeaders
|
|
145
|
+
|
|
146
|
+
assert.ok(d.equals(reqPayload), 'received Buffer equals payload on server')
|
|
147
|
+
|
|
148
|
+
assert.ok(typeof rid === 'string')
|
|
149
|
+
assert.strictEqual(key, 'rpc_stream')
|
|
150
|
+
|
|
151
|
+
const writable = new PassThrough()
|
|
152
|
+
writable.pipe(res)
|
|
153
|
+
writable.write(resPayload)
|
|
154
|
+
writable.end()
|
|
155
|
+
})
|
|
156
|
+
})
|
|
157
|
+
|
|
158
|
+
const req = peer.stream('rpc_stream', {
|
|
159
|
+
timeout: 10000
|
|
160
|
+
})
|
|
161
|
+
|
|
162
|
+
req
|
|
163
|
+
.on('data', (data) => {
|
|
164
|
+
assert.ok(data.equals(resPayload), 'received Buffer equals payload on client')
|
|
165
|
+
|
|
166
|
+
stop()
|
|
167
|
+
done()
|
|
168
|
+
})
|
|
169
|
+
.on('end', () => {})
|
|
170
|
+
.on('error', (e) => { console.error(e) })
|
|
171
|
+
|
|
172
|
+
const writable = new PassThrough()
|
|
173
|
+
writable.write(reqPayload)
|
|
174
|
+
writable.pipe(req)
|
|
175
|
+
}).timeout(7000)
|
|
176
|
+
|
|
177
|
+
it('streaming works, buffer, stream client, stream on server, additional headers', (done) => {
|
|
178
|
+
const reqPayload = Buffer.from('megalargefile')
|
|
179
|
+
const resPayload = Buffer.from('superlargefile')
|
|
180
|
+
|
|
181
|
+
serviceStr.on('stream', (req, res, meta, handler) => {
|
|
182
|
+
assert.strictEqual(meta.isStream, true)
|
|
183
|
+
|
|
184
|
+
req.on('data', (d) => {
|
|
185
|
+
const [rid, key] = meta.infoHeaders
|
|
186
|
+
|
|
187
|
+
assert.ok(d.equals(reqPayload), 'received Buffer equals payload on server')
|
|
188
|
+
|
|
189
|
+
assert.ok(typeof rid === 'string')
|
|
190
|
+
assert.strictEqual(key, 'rpc_stream')
|
|
191
|
+
|
|
192
|
+
assert.strictEqual(meta.action, 'uploadPublic')
|
|
193
|
+
assert.strictEqual(meta.args.foo, 'bar')
|
|
194
|
+
|
|
195
|
+
const writable = new PassThrough()
|
|
196
|
+
writable.pipe(res)
|
|
197
|
+
writable.write(resPayload)
|
|
198
|
+
writable.end()
|
|
199
|
+
})
|
|
200
|
+
})
|
|
201
|
+
|
|
202
|
+
const req = peer.stream('rpc_stream', {
|
|
203
|
+
timeout: 10000,
|
|
204
|
+
headers: {
|
|
205
|
+
_a: 'uploadPublic',
|
|
206
|
+
_ar: { foo: 'bar' }
|
|
207
|
+
}
|
|
208
|
+
})
|
|
209
|
+
|
|
210
|
+
req
|
|
211
|
+
.on('data', (data) => {
|
|
212
|
+
assert.ok(data.equals(resPayload), 'received Buffer equals payload on client')
|
|
213
|
+
|
|
214
|
+
stop()
|
|
215
|
+
done()
|
|
216
|
+
})
|
|
217
|
+
.on('end', () => {})
|
|
218
|
+
.on('error', (e) => { console.error(e) })
|
|
219
|
+
|
|
220
|
+
const writable = new PassThrough()
|
|
221
|
+
writable.write(reqPayload)
|
|
222
|
+
writable.pipe(req)
|
|
223
|
+
}).timeout(7000)
|
|
224
|
+
})
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/* eslint-env mocha */
|
|
2
|
+
|
|
3
|
+
const assert = require('assert')
|
|
4
|
+
const fs = require('fs')
|
|
5
|
+
const path = require('path')
|
|
6
|
+
const { PeerRPCClient, PeerRPCServer } = require('../')
|
|
7
|
+
const Link = require('grenache-nodejs-link')
|
|
8
|
+
const setupHooks = require('./before-after.js')
|
|
9
|
+
|
|
10
|
+
const PORT = 1337
|
|
11
|
+
let link, peer, peerSrv, service, stop
|
|
12
|
+
describe('RPC integration', () => {
|
|
13
|
+
setupHooks((grapes) => {
|
|
14
|
+
link = new Link({
|
|
15
|
+
grape: 'http://127.0.0.1:30001'
|
|
16
|
+
})
|
|
17
|
+
link.start()
|
|
18
|
+
|
|
19
|
+
peer = new PeerRPCClient(link, {
|
|
20
|
+
secure: {
|
|
21
|
+
key: fs.readFileSync(path.join(__dirname, './certs/client1-key.pem')),
|
|
22
|
+
cert: fs.readFileSync(path.join(__dirname, './certs/client1-crt.pem')),
|
|
23
|
+
ca: fs.readFileSync(path.join(__dirname, './certs/ca-crt.pem')),
|
|
24
|
+
rejectUnauthorized: false // take care, can be dangerous in production!
|
|
25
|
+
}
|
|
26
|
+
})
|
|
27
|
+
peer.init()
|
|
28
|
+
|
|
29
|
+
peerSrv = new PeerRPCServer(link, {
|
|
30
|
+
secure: {
|
|
31
|
+
key: fs.readFileSync(path.join(__dirname, './certs/server-key.pem')),
|
|
32
|
+
cert: fs.readFileSync(path.join(__dirname, './certs/server-crt.pem')),
|
|
33
|
+
ca: fs.readFileSync(path.join(__dirname, './certs/ca-crt.pem')),
|
|
34
|
+
requestCert: true,
|
|
35
|
+
rejectUnauthorized: false // take care, can be dangerous in production!
|
|
36
|
+
},
|
|
37
|
+
timeout: 300000
|
|
38
|
+
})
|
|
39
|
+
|
|
40
|
+
peerSrv.init()
|
|
41
|
+
service = peerSrv.transport('server')
|
|
42
|
+
service.listen(PORT)
|
|
43
|
+
|
|
44
|
+
link.announce('rpc_test', service.port, {}, (err, res) => {
|
|
45
|
+
if (err) throw Error('error in announce, setup')
|
|
46
|
+
})
|
|
47
|
+
|
|
48
|
+
stop = () => {
|
|
49
|
+
peer.stop()
|
|
50
|
+
link.stop()
|
|
51
|
+
service.stop()
|
|
52
|
+
}
|
|
53
|
+
})
|
|
54
|
+
|
|
55
|
+
it('secure request, objects', (done) => {
|
|
56
|
+
service.on('request', (rid, key, payload, handler, cert) => {
|
|
57
|
+
assert.ok(typeof rid === 'string')
|
|
58
|
+
assert.strictEqual(key, 'rpc_test')
|
|
59
|
+
assert.deepStrictEqual(payload, { hello: 'world' })
|
|
60
|
+
assert.strictEqual(cert.fingerprint, 'E1:63:C1:46:B3:B6:46:3B:5E:92:98:34:40:A1:AB:FB:0E:92:D0:76')
|
|
61
|
+
|
|
62
|
+
handler.reply(null, { hello: 'helloworld' })
|
|
63
|
+
})
|
|
64
|
+
|
|
65
|
+
const opts = { timeout: 100000 }
|
|
66
|
+
peer.request('rpc_test', { hello: 'world' }, opts, (err, result) => {
|
|
67
|
+
if (err) throw err
|
|
68
|
+
|
|
69
|
+
assert.deepStrictEqual(result, { hello: 'helloworld' })
|
|
70
|
+
|
|
71
|
+
stop()
|
|
72
|
+
done()
|
|
73
|
+
})
|
|
74
|
+
}).timeout(7000)
|
|
75
|
+
|
|
76
|
+
it('secure map, strings', (done) => {
|
|
77
|
+
service.on('request', (rid, key, payload, handler, cert) => {
|
|
78
|
+
assert.ok(typeof rid === 'string')
|
|
79
|
+
assert.strictEqual(key, 'rpc_test')
|
|
80
|
+
assert.strictEqual(payload, 'hello')
|
|
81
|
+
assert.strictEqual(cert.fingerprint, 'E1:63:C1:46:B3:B6:46:3B:5E:92:98:34:40:A1:AB:FB:0E:92:D0:76')
|
|
82
|
+
|
|
83
|
+
handler.reply(null, 'world')
|
|
84
|
+
})
|
|
85
|
+
|
|
86
|
+
const opts = { timeout: 100000 }
|
|
87
|
+
peer.map('rpc_test', 'hello', opts, (err, result) => {
|
|
88
|
+
if (err) throw err
|
|
89
|
+
|
|
90
|
+
assert.deepStrictEqual(result, ['world'])
|
|
91
|
+
|
|
92
|
+
stop()
|
|
93
|
+
done()
|
|
94
|
+
})
|
|
95
|
+
}).timeout(7000)
|
|
96
|
+
})
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/* eslint-env mocha */
|
|
2
|
+
|
|
3
|
+
const assert = require('assert')
|
|
4
|
+
const { PeerRPCClient, PeerRPCServer } = require('../')
|
|
5
|
+
const Link = require('grenache-nodejs-link')
|
|
6
|
+
const setupHooks = require('./before-after.js')
|
|
7
|
+
|
|
8
|
+
const PORT = 1337
|
|
9
|
+
let link, peer, peerSrv, service, stop
|
|
10
|
+
describe('RPC integration', () => {
|
|
11
|
+
setupHooks((grapes) => {
|
|
12
|
+
link = new Link({
|
|
13
|
+
grape: 'http://127.0.0.1:30001'
|
|
14
|
+
})
|
|
15
|
+
link.start()
|
|
16
|
+
|
|
17
|
+
peer = new PeerRPCClient(link, {})
|
|
18
|
+
peer.init()
|
|
19
|
+
|
|
20
|
+
peerSrv = new PeerRPCServer(link, { timeout: 300000 })
|
|
21
|
+
|
|
22
|
+
peerSrv.init()
|
|
23
|
+
service = peerSrv.transport('server')
|
|
24
|
+
service.listen(PORT)
|
|
25
|
+
|
|
26
|
+
link.announce('rpc_test', service.port, {}, (err, res) => {
|
|
27
|
+
if (err) throw Error('error in announce, setup')
|
|
28
|
+
})
|
|
29
|
+
|
|
30
|
+
stop = () => {
|
|
31
|
+
peer.stop()
|
|
32
|
+
link.stop()
|
|
33
|
+
service.stop()
|
|
34
|
+
}
|
|
35
|
+
})
|
|
36
|
+
|
|
37
|
+
it('secure request, objects', (done) => {
|
|
38
|
+
service.on('request', (rid, key, payload, handler) => {
|
|
39
|
+
assert.ok(typeof rid === 'string')
|
|
40
|
+
assert.strictEqual(key, 'rpc_test')
|
|
41
|
+
assert.deepStrictEqual(payload, { hello: 'world' })
|
|
42
|
+
|
|
43
|
+
handler.reply(null, { hello: 'helloworld' })
|
|
44
|
+
})
|
|
45
|
+
|
|
46
|
+
const opts = { timeout: 100000 }
|
|
47
|
+
peer.request('rpc_test', { hello: 'world' }, opts, (err, result) => {
|
|
48
|
+
if (err) throw err
|
|
49
|
+
|
|
50
|
+
assert.deepStrictEqual(result, { hello: 'helloworld' })
|
|
51
|
+
|
|
52
|
+
stop()
|
|
53
|
+
done()
|
|
54
|
+
})
|
|
55
|
+
}).timeout(7000)
|
|
56
|
+
|
|
57
|
+
it('secure map, strings', (done) => {
|
|
58
|
+
service.on('request', (rid, key, payload, handler) => {
|
|
59
|
+
assert.ok(typeof rid === 'string')
|
|
60
|
+
assert.strictEqual(key, 'rpc_test')
|
|
61
|
+
assert.strictEqual(payload, 'hello')
|
|
62
|
+
|
|
63
|
+
handler.reply(null, 'world')
|
|
64
|
+
})
|
|
65
|
+
|
|
66
|
+
const opts = { timeout: 100000 }
|
|
67
|
+
peer.map('rpc_test', 'hello', opts, (err, result) => {
|
|
68
|
+
if (err) throw err
|
|
69
|
+
|
|
70
|
+
assert.deepStrictEqual(result, ['world'])
|
|
71
|
+
|
|
72
|
+
stop()
|
|
73
|
+
done()
|
|
74
|
+
})
|
|
75
|
+
}).timeout(7000)
|
|
76
|
+
})
|
package/examples/ssl/ca-crt.pem
DELETED
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
-----BEGIN CERTIFICATE-----
|
|
2
|
-
MIIFgDCCA2gCCQDvmZA10HvRHTANBgkqhkiG9w0BAQUFADCBgTELMAkGA1UEBhMC
|
|
3
|
-
VVMxCzAJBgNVBAgMAk1BMQ8wDQYDVQQHDAZCb3N0b24xEzARBgNVBAoMCkV4YW1w
|
|
4
|
-
bGUgQ28xEDAOBgNVBAsMB3RlY2hvcHMxCzAJBgNVBAMMAmNhMSAwHgYJKoZIhvcN
|
|
5
|
-
AQkBFhFjZXJ0c0BleGFtcGxlLmNvbTAeFw0xNzA1MjIxMzQ0NDNaFw00NDEwMDYx
|
|
6
|
-
MzQ0NDNaMIGBMQswCQYDVQQGEwJVUzELMAkGA1UECAwCTUExDzANBgNVBAcMBkJv
|
|
7
|
-
c3RvbjETMBEGA1UECgwKRXhhbXBsZSBDbzEQMA4GA1UECwwHdGVjaG9wczELMAkG
|
|
8
|
-
A1UEAwwCY2ExIDAeBgkqhkiG9w0BCQEWEWNlcnRzQGV4YW1wbGUuY29tMIICIjAN
|
|
9
|
-
BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0SrOAQlmrQTqnXqSiKpvhb/nd79r
|
|
10
|
-
59V8TY81yPiOaVXeIaCrIiDA66JzadzHHHHMt8sEsTI92BULNvQYsauRm8NmBPWJ
|
|
11
|
-
YKYpUj0FguG7NzDLruCsBUq1faZyLLOA2Dr33gTzJFaVtvD0Z9ig2UjTSbqEnCcY
|
|
12
|
-
fF6WkCcYWBE3xkyRZkuVZAaCu3PTKVvAkwxHkg4wS8feW/Z/VGLTmcd/lWvVgC1V
|
|
13
|
-
Kl7wwubE/8MXwjJlQBzkU5WotFHgXJMnepQTuqu5ZlDpOZehLPQ16LUjUIu0xnIt
|
|
14
|
-
8k+YJ3JXdvP5+ifx+0YK9NpoU717spKgsME4z1Q6foDiaGgwWJ5bZYXi2OVD64yj
|
|
15
|
-
FqKN4gdpe037OwgTxCJ2FS23Ijndzi/K+AULYXbjXUo/D+CXuJ/MfOXo8DHfI1ld
|
|
16
|
-
ZgiHw1co2f1KQmL+AJ/YAEoC3228JG31mvX2sXL2p65QU9DmTaOrAYCX/F5T1frs
|
|
17
|
-
jsO560Zpvs6C7Di8eQjrx3UhMz8zYSLT35/0HPPoLA9dkJOEDpg3NtLMuN1MigNZ
|
|
18
|
-
VxRyadXrka4q7s/mTS1+0NbJHv4JYwzYKa1pdFeX102I9GVS9VZXpmRqriki1Sh1
|
|
19
|
-
rb7YOuK+I92HIzIVpSeI/OB7xguH8rh+/vibB72SY18FJWyfGcr8ewwkPSVocZeu
|
|
20
|
-
9rCXIDLUY0Sojq8CAwEAATANBgkqhkiG9w0BAQUFAAOCAgEAbIPMMkzHlybXIr8z
|
|
21
|
-
4Dp/3czyPWLwjFfgeL4wM5Hm/JMxaFnsWgmkUdrvjlYofzaF+2U29FsDgcrkcCzD
|
|
22
|
-
gTCOOHG0Pw1i8R57Dt68ycP4/e0iPpMmuTpNSqB9DilGscKARhE85o0FivAUzvUY
|
|
23
|
-
RngIOtbf02OoaRbkAsmKdC4+PBNJbiS3U5V55r2HCv0zqXMFj4dXqfyWKkcZt3JR
|
|
24
|
-
8SkzUIhIVnwhTf8ZttXcsWmPMy3nqckcy6k3zLr7Gf63JJZAYecWwhydAtv4wRrm
|
|
25
|
-
f3FwIvRxPLKTc/2YXF77I9YvHgnLOvE2qlLNnajQgOcIYGvxizDVCqnMS+8oBHWb
|
|
26
|
-
uL6mZP4hOCL6ifynkAHltg59heM3WJ2MEwLjiSvMYY4otT4X9KxsRdsg0Gx96bVe
|
|
27
|
-
P4RBlW3ebxcOnFuoMC3WT22/1ETqpQbrWOD5mJkFa6Q8aE6yWLLcdJznxF2M0Mf8
|
|
28
|
-
PTh62cFJMC4E0gN9KRU+E/qBJsqTamHHAHjcaUYDBXsvtFDOlo1dbAzJylpwRUEg
|
|
29
|
-
F115KpRH6DLLexS5YB9bASIsXBK+Afwm0FOjqGiEd527qAk5UiamyomKXxQ+DIbc
|
|
30
|
-
6QdO7XGpM3molI7Zzf79O4QdlRNzNgqPeCRUJWe2L6G7KECNvNjWepN3+0xAq9BO
|
|
31
|
-
t53fDsW6Y1yw2xErpMGUHBQ05y4=
|
|
32
|
-
-----END CERTIFICATE-----
|
package/examples/ssl/ca-crt.srl
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
C02FC8087C0EC89A
|