grenache-nodejs-http 1.0.1 → 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,119 +1,72 @@
|
|
|
1
|
-
|
|
1
|
+
'use strict'
|
|
2
2
|
|
|
3
|
-
const
|
|
4
|
-
const fs = require('fs')
|
|
5
|
-
const path = require('path')
|
|
3
|
+
const test = require('brittle')
|
|
6
4
|
const { PassThrough } = require('stream')
|
|
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, 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)
|
|
5
|
+
const { rpcTestCase } = require('./before-after')
|
|
45
6
|
|
|
46
|
-
|
|
47
|
-
if (err) throw Error('error in announce, setup')
|
|
48
|
-
})
|
|
7
|
+
const rpcTest = rpcTestCase({ transport: 'stream', isSecure: true, disableBuffered: true })
|
|
49
8
|
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
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)
|
|
9
|
+
test('RPC integration', async (t) => {
|
|
10
|
+
await t.test('streaming works, objects, buffered client, reply handler', { timeout: 7000 }, rpcTest(async ({ t, service, peer }) => {
|
|
11
|
+
service.on('stream', (req, res, meta, handler) => {
|
|
12
|
+
t.is(meta.isStream, false)
|
|
60
13
|
|
|
61
14
|
req.on('data', (d) => {
|
|
62
15
|
const [rid, key, args] = JSON.parse(d.toString())
|
|
63
16
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
17
|
+
t.alike(args, { hello: 'world' })
|
|
18
|
+
t.ok(typeof rid === 'string')
|
|
19
|
+
t.is(key, 'rpc_test')
|
|
67
20
|
|
|
68
21
|
handler.reply(rid, null, { hello: 'helloworld' })
|
|
69
22
|
})
|
|
70
23
|
})
|
|
71
24
|
|
|
72
25
|
const opts = { timeout: 100000 }
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
26
|
+
await new Promise(resolve => {
|
|
27
|
+
peer.request('rpc_test', { hello: 'world' }, opts, (err, result) => {
|
|
28
|
+
if (err) throw err
|
|
29
|
+
t.alike(result, { hello: 'helloworld' })
|
|
30
|
+
resolve()
|
|
31
|
+
})
|
|
79
32
|
})
|
|
80
|
-
})
|
|
33
|
+
}))
|
|
81
34
|
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
35
|
+
await t.test('streaming works, string, buffered client, reply handler', { timeout: 7000 }, rpcTest(async ({ t, service, peer }) => {
|
|
36
|
+
service.on('stream', (req, res, meta, handler) => {
|
|
37
|
+
t.is(meta.isStream, false)
|
|
85
38
|
|
|
86
39
|
req.on('data', (d) => {
|
|
87
40
|
const [rid, key, args] = JSON.parse(d.toString())
|
|
88
41
|
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
42
|
+
t.is(args, 'hello')
|
|
43
|
+
t.ok(typeof rid === 'string')
|
|
44
|
+
t.is(key, 'rpc_test')
|
|
92
45
|
|
|
93
46
|
handler.reply(rid, null, 'world')
|
|
94
47
|
})
|
|
95
48
|
})
|
|
96
49
|
|
|
97
50
|
const opts = { timeout: 100000 }
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
51
|
+
await new Promise(resolve => {
|
|
52
|
+
peer.request('rpc_test', 'hello', opts, (err, result) => {
|
|
53
|
+
if (err) throw err
|
|
54
|
+
t.is(result, 'world')
|
|
55
|
+
resolve()
|
|
56
|
+
})
|
|
104
57
|
})
|
|
105
|
-
})
|
|
58
|
+
}))
|
|
106
59
|
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
60
|
+
await t.test('streaming works, string, buffered client, stream sent back', { timeout: 7000 }, rpcTest(async ({ t, service, peer }) => {
|
|
61
|
+
service.on('stream', (req, res, meta) => {
|
|
62
|
+
t.is(meta.isStream, false)
|
|
110
63
|
|
|
111
64
|
req.on('data', (d) => {
|
|
112
65
|
const [rid, key, args] = JSON.parse(d.toString())
|
|
113
66
|
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
67
|
+
t.is(args, 'hello')
|
|
68
|
+
t.ok(typeof rid === 'string')
|
|
69
|
+
t.is(key, 'rpc_test')
|
|
117
70
|
|
|
118
71
|
const writable = new PassThrough()
|
|
119
72
|
const payload = JSON.stringify([rid, null, 'world2'])
|
|
@@ -124,29 +77,29 @@ describe('RPC integration', () => {
|
|
|
124
77
|
})
|
|
125
78
|
|
|
126
79
|
const opts = { timeout: 100000 }
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
80
|
+
await new Promise(resolve => {
|
|
81
|
+
peer.request('rpc_test', 'hello', opts, (err, result) => {
|
|
82
|
+
if (err) throw err
|
|
83
|
+
t.is(result, 'world2')
|
|
84
|
+
resolve()
|
|
85
|
+
})
|
|
133
86
|
})
|
|
134
|
-
})
|
|
87
|
+
}))
|
|
135
88
|
|
|
136
|
-
|
|
89
|
+
await t.test('streaming works, buffer, stream client, stream on server', { timeout: 7000 }, rpcTest(async ({ t, service, peer }) => {
|
|
137
90
|
const reqPayload = Buffer.from('megalargefile')
|
|
138
91
|
const resPayload = Buffer.from('superlargefile')
|
|
139
92
|
|
|
140
|
-
|
|
141
|
-
|
|
93
|
+
service.on('stream', (req, res, meta) => {
|
|
94
|
+
t.is(meta.isStream, true)
|
|
142
95
|
|
|
143
96
|
req.on('data', (d) => {
|
|
144
97
|
const [rid, key] = meta.infoHeaders
|
|
145
98
|
|
|
146
|
-
|
|
99
|
+
t.ok(d.equals(reqPayload), 'received Buffer equals payload on server')
|
|
147
100
|
|
|
148
|
-
|
|
149
|
-
|
|
101
|
+
t.ok(typeof rid === 'string')
|
|
102
|
+
t.is(key, 'rpc_test')
|
|
150
103
|
|
|
151
104
|
const writable = new PassThrough()
|
|
152
105
|
writable.pipe(res)
|
|
@@ -155,42 +108,44 @@ describe('RPC integration', () => {
|
|
|
155
108
|
})
|
|
156
109
|
})
|
|
157
110
|
|
|
158
|
-
const req = peer.stream('
|
|
111
|
+
const req = peer.stream('rpc_test', {
|
|
159
112
|
timeout: 10000
|
|
160
113
|
})
|
|
161
114
|
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
115
|
+
const p = new Promise(resolve => {
|
|
116
|
+
req
|
|
117
|
+
.on('data', (data) => {
|
|
118
|
+
t.ok(data.equals(resPayload), 'received Buffer equals payload on client')
|
|
119
|
+
resolve()
|
|
120
|
+
})
|
|
121
|
+
.on('end', () => {})
|
|
122
|
+
.on('error', (e) => { console.error(e) })
|
|
123
|
+
})
|
|
171
124
|
|
|
172
125
|
const writable = new PassThrough()
|
|
173
126
|
writable.write(reqPayload)
|
|
174
127
|
writable.pipe(req)
|
|
175
|
-
}).timeout(7000)
|
|
176
128
|
|
|
177
|
-
|
|
129
|
+
await p
|
|
130
|
+
}))
|
|
131
|
+
|
|
132
|
+
await t.test('streaming works, buffer, stream client, stream on server, additional headers', { timeout: 7000 }, rpcTest(async ({ t, service, peer }) => {
|
|
178
133
|
const reqPayload = Buffer.from('megalargefile')
|
|
179
134
|
const resPayload = Buffer.from('superlargefile')
|
|
180
135
|
|
|
181
|
-
|
|
182
|
-
|
|
136
|
+
service.on('stream', (req, res, meta) => {
|
|
137
|
+
t.is(meta.isStream, true)
|
|
183
138
|
|
|
184
139
|
req.on('data', (d) => {
|
|
185
140
|
const [rid, key] = meta.infoHeaders
|
|
186
141
|
|
|
187
|
-
|
|
142
|
+
t.ok(d.equals(reqPayload), 'received Buffer equals payload on server')
|
|
188
143
|
|
|
189
|
-
|
|
190
|
-
|
|
144
|
+
t.ok(typeof rid === 'string')
|
|
145
|
+
t.is(key, 'rpc_test')
|
|
191
146
|
|
|
192
|
-
|
|
193
|
-
|
|
147
|
+
t.is(meta.action, 'uploadPublic')
|
|
148
|
+
t.is(meta.args.foo, 'bar')
|
|
194
149
|
|
|
195
150
|
const writable = new PassThrough()
|
|
196
151
|
writable.pipe(res)
|
|
@@ -199,7 +154,7 @@ describe('RPC integration', () => {
|
|
|
199
154
|
})
|
|
200
155
|
})
|
|
201
156
|
|
|
202
|
-
const req = peer.stream('
|
|
157
|
+
const req = peer.stream('rpc_test', {
|
|
203
158
|
timeout: 10000,
|
|
204
159
|
headers: {
|
|
205
160
|
_a: 'uploadPublic',
|
|
@@ -207,18 +162,20 @@ describe('RPC integration', () => {
|
|
|
207
162
|
}
|
|
208
163
|
})
|
|
209
164
|
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
165
|
+
const p = new Promise(resolve => {
|
|
166
|
+
req
|
|
167
|
+
.on('data', (data) => {
|
|
168
|
+
t.ok(data.equals(resPayload), 'received Buffer equals payload on client')
|
|
169
|
+
resolve()
|
|
170
|
+
})
|
|
171
|
+
.on('end', () => {})
|
|
172
|
+
.on('error', (e) => { console.error(e) })
|
|
173
|
+
})
|
|
219
174
|
|
|
220
175
|
const writable = new PassThrough()
|
|
221
176
|
writable.write(reqPayload)
|
|
222
177
|
writable.pipe(req)
|
|
223
|
-
|
|
178
|
+
|
|
179
|
+
await p
|
|
180
|
+
}))
|
|
224
181
|
})
|
|
@@ -1,96 +1,48 @@
|
|
|
1
|
-
|
|
1
|
+
'use strict'
|
|
2
2
|
|
|
3
|
-
const
|
|
4
|
-
const
|
|
5
|
-
const path = require('path')
|
|
6
|
-
const { PeerRPCClient, PeerRPCServer } = require('../')
|
|
7
|
-
const Link = require('grenache-nodejs-link')
|
|
8
|
-
const setupHooks = require('./before-after.js')
|
|
3
|
+
const test = require('brittle')
|
|
4
|
+
const { rpcTestCase } = require('./before-after')
|
|
9
5
|
|
|
10
|
-
const
|
|
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
|
-
})
|
|
6
|
+
const rpcTest = rpcTestCase({ transport: 'server', isSecure: true })
|
|
54
7
|
|
|
55
|
-
|
|
8
|
+
test('RPC integration', async (t) => {
|
|
9
|
+
await t.test('secure request, objects', { timeout: 7000 }, rpcTest(async ({ t, service, peer }) => {
|
|
56
10
|
service.on('request', (rid, key, payload, handler, cert) => {
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
11
|
+
t.ok(typeof rid === 'string')
|
|
12
|
+
t.is(key, 'rpc_test')
|
|
13
|
+
t.alike(payload, { hello: 'world' })
|
|
14
|
+
t.is(cert.fingerprint, 'E1:63:C1:46:B3:B6:46:3B:5E:92:98:34:40:A1:AB:FB:0E:92:D0:76')
|
|
61
15
|
|
|
62
16
|
handler.reply(null, { hello: 'helloworld' })
|
|
63
17
|
})
|
|
64
18
|
|
|
65
19
|
const opts = { timeout: 100000 }
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
done()
|
|
20
|
+
await new Promise(resolve => {
|
|
21
|
+
peer.request('rpc_test', { hello: 'world' }, opts, (err, result) => {
|
|
22
|
+
if (err) throw err
|
|
23
|
+
t.alike(result, { hello: 'helloworld' })
|
|
24
|
+
resolve()
|
|
25
|
+
})
|
|
73
26
|
})
|
|
74
|
-
})
|
|
27
|
+
}))
|
|
75
28
|
|
|
76
|
-
|
|
29
|
+
await t.test('secure map, strings', { timeout: 7000 }, rpcTest(async ({ t, service, peer }) => {
|
|
77
30
|
service.on('request', (rid, key, payload, handler, cert) => {
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
31
|
+
t.ok(typeof rid === 'string')
|
|
32
|
+
t.is(key, 'rpc_test')
|
|
33
|
+
t.is(payload, 'hello')
|
|
34
|
+
t.is(cert.fingerprint, 'E1:63:C1:46:B3:B6:46:3B:5E:92:98:34:40:A1:AB:FB:0E:92:D0:76')
|
|
82
35
|
|
|
83
36
|
handler.reply(null, 'world')
|
|
84
37
|
})
|
|
85
38
|
|
|
86
39
|
const opts = { timeout: 100000 }
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
}).timeout(7000)
|
|
40
|
+
await new Promise(resolve => {
|
|
41
|
+
peer.map('rpc_test', 'hello', opts, (err, result) => {
|
|
42
|
+
if (err) throw err
|
|
43
|
+
t.alike(result, ['world'])
|
|
44
|
+
resolve()
|
|
45
|
+
})
|
|
46
|
+
})
|
|
47
|
+
}))
|
|
96
48
|
})
|