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
package/examples/rpc_server.js
CHANGED
|
@@ -4,8 +4,6 @@ const Grenache = require('./../')
|
|
|
4
4
|
const Link = require('grenache-nodejs-link')
|
|
5
5
|
const Peer = Grenache.PeerRPCServer
|
|
6
6
|
|
|
7
|
-
const _ = require('lodash')
|
|
8
|
-
|
|
9
7
|
const link = new Link({
|
|
10
8
|
grape: 'http://127.0.0.1:30001'
|
|
11
9
|
})
|
|
@@ -17,7 +15,7 @@ const peer = new Peer(link, {
|
|
|
17
15
|
peer.init()
|
|
18
16
|
|
|
19
17
|
const service = peer.transport('server')
|
|
20
|
-
service.listen(
|
|
18
|
+
service.listen(Math.floor(Math.random() * 1001) + 1024)
|
|
21
19
|
|
|
22
20
|
setInterval(function () {
|
|
23
21
|
link.announce('rpc_test', service.port, {})
|
|
@@ -4,8 +4,6 @@ const Grenache = require('./../')
|
|
|
4
4
|
const Link = require('grenache-nodejs-link')
|
|
5
5
|
const Peer = Grenache.PeerRPCServer
|
|
6
6
|
|
|
7
|
-
const _ = require('lodash')
|
|
8
|
-
|
|
9
7
|
const link = new Link({
|
|
10
8
|
grape: 'http://127.0.0.1:30001'
|
|
11
9
|
})
|
|
@@ -18,7 +16,7 @@ const peer = new Peer(link, {
|
|
|
18
16
|
peer.init()
|
|
19
17
|
|
|
20
18
|
const service = peer.transport('server')
|
|
21
|
-
service.listen(
|
|
19
|
+
service.listen(Math.floor(Math.random() * 1001) + 1024)
|
|
22
20
|
|
|
23
21
|
setInterval(function () {
|
|
24
22
|
link.announce('rpc_stream', service.port, {})
|
|
@@ -16,15 +16,15 @@ const link = new Link({
|
|
|
16
16
|
link.start()
|
|
17
17
|
|
|
18
18
|
const secure = {
|
|
19
|
-
key: fs.readFileSync(path.join(__dirname, 'client1-key.pem')),
|
|
20
|
-
cert: fs.readFileSync(path.join(__dirname, 'client1-crt.pem')),
|
|
21
|
-
ca: fs.readFileSync(path.join(__dirname, 'ca-crt.pem')),
|
|
19
|
+
key: fs.readFileSync(path.join(__dirname, '../../test/certs/client1-key.pem')),
|
|
20
|
+
cert: fs.readFileSync(path.join(__dirname, '../../test/certs/client1-crt.pem')),
|
|
21
|
+
ca: fs.readFileSync(path.join(__dirname, '../../test/certs/ca-crt.pem')),
|
|
22
22
|
rejectUnauthorized: false // take care, can be dangerous in production!
|
|
23
23
|
}
|
|
24
24
|
|
|
25
25
|
const peer = new Peer(
|
|
26
26
|
link,
|
|
27
|
-
{ secure
|
|
27
|
+
{ secure }
|
|
28
28
|
)
|
|
29
29
|
|
|
30
30
|
peer.init()
|
|
@@ -6,7 +6,6 @@
|
|
|
6
6
|
|
|
7
7
|
const Link = require('grenache-nodejs-link')
|
|
8
8
|
const Peer = require('../../').PeerRPCServer
|
|
9
|
-
const _ = require('lodash')
|
|
10
9
|
const fs = require('fs')
|
|
11
10
|
const path = require('path')
|
|
12
11
|
|
|
@@ -17,9 +16,9 @@ link.start()
|
|
|
17
16
|
|
|
18
17
|
const opts = {
|
|
19
18
|
secure: {
|
|
20
|
-
key: fs.readFileSync(path.join(__dirname, 'server-key.pem')),
|
|
21
|
-
cert: fs.readFileSync(path.join(__dirname, 'server-crt.pem')),
|
|
22
|
-
ca: fs.readFileSync(path.join(__dirname, 'ca-crt.pem')),
|
|
19
|
+
key: fs.readFileSync(path.join(__dirname, '../../test/certs/server-key.pem')),
|
|
20
|
+
cert: fs.readFileSync(path.join(__dirname, '../../test/certs/server-crt.pem')),
|
|
21
|
+
ca: fs.readFileSync(path.join(__dirname, '../../test/certs/ca-crt.pem')),
|
|
23
22
|
requestCert: true,
|
|
24
23
|
rejectUnauthorized: false // take care, can be dangerous in production!
|
|
25
24
|
}
|
|
@@ -32,7 +31,7 @@ const peer = new Peer(
|
|
|
32
31
|
peer.init()
|
|
33
32
|
|
|
34
33
|
const service = peer.transport('server')
|
|
35
|
-
service.listen(
|
|
34
|
+
service.listen(Math.floor(Math.random() * 1001) + 1024)
|
|
36
35
|
|
|
37
36
|
setInterval(function () {
|
|
38
37
|
link.announce('rpc_test', service.port, {})
|
|
@@ -1,10 +1,14 @@
|
|
|
1
1
|
'use strict'
|
|
2
2
|
|
|
3
|
-
const
|
|
3
|
+
const duplexify = require('duplexify')
|
|
4
|
+
const fetch = require('node-fetch')
|
|
4
5
|
const assert = require('assert')
|
|
6
|
+
const http = require('http')
|
|
7
|
+
const https = require('https')
|
|
8
|
+
const pump = require('pump')
|
|
5
9
|
const zlib = require('zlib')
|
|
10
|
+
const { PassThrough } = require('stream')
|
|
6
11
|
|
|
7
|
-
const _ = require('lodash')
|
|
8
12
|
const Base = require('grenache-nodejs-base')
|
|
9
13
|
|
|
10
14
|
class TransportRPCClient extends Base.TransportRPCClient {
|
|
@@ -18,24 +22,17 @@ class TransportRPCClient extends Base.TransportRPCClient {
|
|
|
18
22
|
init () {
|
|
19
23
|
super.init()
|
|
20
24
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
if (!secure) {
|
|
26
|
-
return request
|
|
25
|
+
if (this.conf.secure) {
|
|
26
|
+
assert(Buffer.isBuffer(this.conf.secure.key), 'conf.secure.key must be a Buffer')
|
|
27
|
+
assert(Buffer.isBuffer(this.conf.secure.cert), 'conf.secure.cert must be a Buffer')
|
|
28
|
+
assert(Buffer.isBuffer(this.conf.secure.ca), 'conf.secure.ca must be a Buffer')
|
|
27
29
|
}
|
|
28
|
-
|
|
29
|
-
assert(Buffer.isBuffer(secure.key), 'conf.secure.key must be a Buffer')
|
|
30
|
-
assert(Buffer.isBuffer(secure.cert), 'conf.secure.cert must be a Buffer')
|
|
31
|
-
assert(Buffer.isBuffer(secure.ca), 'conf.secure.ca must be a Buffer')
|
|
32
|
-
|
|
33
|
-
return request
|
|
34
30
|
}
|
|
35
31
|
|
|
36
|
-
getOpts (
|
|
32
|
+
getOpts (_opts, secure) {
|
|
37
33
|
const u = secure
|
|
38
|
-
? ('https://' + this.conf.dest)
|
|
34
|
+
? ('https://' + this.conf.dest)
|
|
35
|
+
: ('http://' + this.conf.dest)
|
|
39
36
|
|
|
40
37
|
const def = {
|
|
41
38
|
url: u,
|
|
@@ -43,11 +40,12 @@ class TransportRPCClient extends Base.TransportRPCClient {
|
|
|
43
40
|
method: 'POST'
|
|
44
41
|
}
|
|
45
42
|
|
|
46
|
-
|
|
47
|
-
|
|
43
|
+
const opts = { ...def, ..._opts }
|
|
44
|
+
if (secure) {
|
|
45
|
+
opts.agent = new https.Agent(secure)
|
|
48
46
|
}
|
|
49
47
|
|
|
50
|
-
return
|
|
48
|
+
return opts
|
|
51
49
|
}
|
|
52
50
|
|
|
53
51
|
request (key, payload, opts, cb) {
|
|
@@ -122,8 +120,7 @@ class TransportRPCClient extends Base.TransportRPCClient {
|
|
|
122
120
|
})
|
|
123
121
|
}
|
|
124
122
|
|
|
125
|
-
post (_opts, _cb) {
|
|
126
|
-
const socket = this.socket
|
|
123
|
+
async post (_opts, _cb) {
|
|
127
124
|
const opts = this.getOpts(_opts, this.conf.secure)
|
|
128
125
|
|
|
129
126
|
let isExecuted = false
|
|
@@ -134,24 +131,31 @@ class TransportRPCClient extends Base.TransportRPCClient {
|
|
|
134
131
|
_cb(err, body)
|
|
135
132
|
}
|
|
136
133
|
|
|
137
|
-
|
|
138
|
-
|
|
134
|
+
try {
|
|
135
|
+
const resp = await fetch(opts.url, {
|
|
136
|
+
...opts,
|
|
137
|
+
method: 'POST'
|
|
138
|
+
})
|
|
139
|
+
|
|
140
|
+
const body = await resp.buffer()
|
|
141
|
+
|
|
142
|
+
if (!resp.ok) {
|
|
143
|
+
const err = new Error(body.toString())
|
|
144
|
+
err.code = resp.status
|
|
139
145
|
return cb(err)
|
|
140
146
|
}
|
|
141
147
|
|
|
142
|
-
cb(null, body)
|
|
143
|
-
})
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
cb(err)
|
|
147
|
-
})
|
|
148
|
+
return cb(null, body)
|
|
149
|
+
} catch (err) {
|
|
150
|
+
return cb(err)
|
|
151
|
+
}
|
|
148
152
|
}
|
|
149
153
|
|
|
150
|
-
requestStream (key, opts) {
|
|
154
|
+
async requestStream (key, opts) {
|
|
151
155
|
return this._requestStream(key, opts)
|
|
152
156
|
}
|
|
153
157
|
|
|
154
|
-
sendRequestStream (req) {
|
|
158
|
+
async sendRequestStream (req) {
|
|
155
159
|
const addHeaders = {}
|
|
156
160
|
const _h = req.opts.headers || {}
|
|
157
161
|
Object.keys(_h).forEach((k) => {
|
|
@@ -165,14 +169,37 @@ class TransportRPCClient extends Base.TransportRPCClient {
|
|
|
165
169
|
const _opts = {
|
|
166
170
|
headers: {
|
|
167
171
|
_gr: this.format([req.rid, req.key]),
|
|
172
|
+
connection: 'close',
|
|
173
|
+
'transfer-encoding': 'chunked',
|
|
168
174
|
...addHeaders
|
|
169
175
|
},
|
|
170
176
|
timeout: req.opts.timeout
|
|
171
177
|
}
|
|
172
178
|
|
|
173
179
|
const opts = this.getOpts(_opts, this.conf.secure)
|
|
174
|
-
|
|
175
|
-
|
|
180
|
+
|
|
181
|
+
// node-fetch does not support multiplex communication, no response is received until body is fully streamed
|
|
182
|
+
const reqStream = new PassThrough()
|
|
183
|
+
const resStream = new PassThrough()
|
|
184
|
+
|
|
185
|
+
const url = new URL(opts.url)
|
|
186
|
+
const httpReq = (this.conf.secure ? https : http).request({
|
|
187
|
+
...opts,
|
|
188
|
+
hostname: url.hostname,
|
|
189
|
+
port: url.port,
|
|
190
|
+
protocol: url.protocol,
|
|
191
|
+
path: url.pathname,
|
|
192
|
+
method: 'POST'
|
|
193
|
+
}, (res) => {
|
|
194
|
+
pump(res, resStream)
|
|
195
|
+
})
|
|
196
|
+
|
|
197
|
+
httpReq.on('error', (err) => {
|
|
198
|
+
reqStream.destroy(err)
|
|
199
|
+
resStream.destroy(err)
|
|
200
|
+
})
|
|
201
|
+
pump(reqStream, httpReq)
|
|
202
|
+
return duplexify(reqStream, resStream)
|
|
176
203
|
}
|
|
177
204
|
}
|
|
178
205
|
|
|
@@ -43,7 +43,7 @@ class TransportRPCServer extends Base.TransportRPCServer {
|
|
|
43
43
|
const isCompress = enc.includes('gzip')
|
|
44
44
|
|
|
45
45
|
const cert = secure ? req.socket.getPeerCertificate() : undefined
|
|
46
|
-
const meta = { cert, isStream
|
|
46
|
+
const meta = { cert, isStream, compress: isCompress }
|
|
47
47
|
|
|
48
48
|
try {
|
|
49
49
|
if (req.headers._gr) {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "grenache-nodejs-http",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "1.0.1",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "Granache Node.js HTTP implementation",
|
|
6
6
|
"author": "prdn <paolo@bitfinex.com> (https://bitfinex.com/)",
|
|
@@ -10,22 +10,28 @@
|
|
|
10
10
|
"nodejs",
|
|
11
11
|
"micro-services"
|
|
12
12
|
],
|
|
13
|
+
"engines": {
|
|
14
|
+
"node": ">=16.0"
|
|
15
|
+
},
|
|
13
16
|
"dependencies": {
|
|
14
|
-
"async": "
|
|
15
|
-
"
|
|
16
|
-
"grenache-nodejs-
|
|
17
|
-
"
|
|
18
|
-
"
|
|
17
|
+
"async": "3.2.6",
|
|
18
|
+
"duplexify": "4.1.3",
|
|
19
|
+
"grenache-nodejs-base": "1.0.0",
|
|
20
|
+
"grenache-nodejs-link": "1.0.2",
|
|
21
|
+
"node-fetch": "2.7.0",
|
|
22
|
+
"pump": "3.0.2"
|
|
19
23
|
},
|
|
20
24
|
"main": "index.js",
|
|
21
25
|
"devDependencies": {
|
|
22
|
-
"grenache-grape": "
|
|
23
|
-
"mocha": "
|
|
24
|
-
"standard": "
|
|
26
|
+
"grenache-grape": "1.0.0",
|
|
27
|
+
"mocha": "11.1.0",
|
|
28
|
+
"standard": "17.1.2"
|
|
25
29
|
},
|
|
26
30
|
"scripts": {
|
|
27
|
-
"test": "npm run lint",
|
|
28
|
-
"
|
|
31
|
+
"test": "npm run lint && npm run unit",
|
|
32
|
+
"unit": "mocha",
|
|
33
|
+
"lint": "standard",
|
|
34
|
+
"lint:fix": "standard --fix"
|
|
29
35
|
},
|
|
30
36
|
"license": "Apache-2.0",
|
|
31
37
|
"repository": {
|
package/test/before-after.js
CHANGED
|
@@ -2,26 +2,24 @@
|
|
|
2
2
|
|
|
3
3
|
'use strict'
|
|
4
4
|
|
|
5
|
-
const {
|
|
5
|
+
const { startGrapes, stopGrapes } = require('./helper')
|
|
6
6
|
|
|
7
7
|
let grapes
|
|
8
8
|
function setupHooks (cb) {
|
|
9
|
-
beforeEach(function (
|
|
9
|
+
beforeEach(async function () {
|
|
10
10
|
this.timeout(20000)
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
cb()
|
|
11
|
+
|
|
12
|
+
grapes = await startGrapes()
|
|
13
|
+
cb()
|
|
14
|
+
|
|
15
|
+
await new Promise((resolve) => {
|
|
16
|
+
grapes[0].once('announce', () => resolve())
|
|
19
17
|
})
|
|
20
18
|
})
|
|
21
19
|
|
|
22
|
-
afterEach(function (
|
|
20
|
+
afterEach(async function () {
|
|
23
21
|
this.timeout(5000)
|
|
24
|
-
|
|
22
|
+
await stopGrapes(grapes)
|
|
25
23
|
})
|
|
26
24
|
|
|
27
25
|
return grapes
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
-----BEGIN CERTIFICATE-----
|
|
2
|
+
MIIDBzCCAe+gAwIBAgIUGtaHkIywQCUpLJYn4KZRZUkZcYMwDQYJKoZIhvcNAQEL
|
|
3
|
+
BQAwEzERMA8GA1UEAwwITXlUZXN0Q0EwHhcNMjUwMzI4MTYzNjQwWhcNMzUwMzI2
|
|
4
|
+
MTYzNjQwWjATMREwDwYDVQQDDAhNeVRlc3RDQTCCASIwDQYJKoZIhvcNAQEBBQAD
|
|
5
|
+
ggEPADCCAQoCggEBALiTm+dXfL5/TfO3cLRqcY6p5hItEWDYuCaFEEsvq74ko6B1
|
|
6
|
+
5cNCSxYzM34mGFHRItq/UZUb2WLgbsJGBWhPgH+pXHfLlS+s3xYBbQMaz5BEgaZO
|
|
7
|
+
Wq/RHQHvWTv/nL/CJMjUYwUfcW1smwXg+WPsLD+LSJTCbgPnLQBp6JMrlCSo6pGd
|
|
8
|
+
77qqmcPQRut7Q2/5ogZ+/b1darZa1cZcHVluq67TYgw7844V1T9Ei0+ygSzZBsrG
|
|
9
|
+
4/nYMWlbVHxbn8bxcCPmIrT9YgwuFaq8JZ0OvR1KROJ6WV1A7EXK5XT3ojQkGoFD
|
|
10
|
+
oHxD/H2XmOLkk3V8WqLsmh/JFrhv/tbcjyAyFG0CAwEAAaNTMFEwHQYDVR0OBBYE
|
|
11
|
+
FEdhwkpjY0OljDiQyULJ/rqVKlwrMB8GA1UdIwQYMBaAFEdhwkpjY0OljDiQyULJ
|
|
12
|
+
/rqVKlwrMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAAIdYQQ1
|
|
13
|
+
9ZwBgtrAoGjuk0VS52cmKU2k4Ok1/FngjD4FCCt83WbOya+QOkjH7KyO89UYERio
|
|
14
|
+
rA8AXkPycnSRakoPsznUzU7a0neaAfDvrEdeHd9RSc06Rijvp3EjyWe7+H0pqZUi
|
|
15
|
+
v1jP5N8cEWmX+camz9Wz34TNCw/JspA6jIrXB5zLXxd5QDmHm1bRsWfbKI83g3jx
|
|
16
|
+
EWlNLqDhnbNzbOXV/oxnexS2xNna4XgHQTujZIrYpEdodpyhDhnQT3XTevgWB2XW
|
|
17
|
+
7TwZThq0vHFJx6VkVFdf7WrsWOTHzXSIhYKl2SNifyyNyv7rv/Vg9cpbXad0Jom7
|
|
18
|
+
opXbblgZgnTHIuc=
|
|
19
|
+
-----END CERTIFICATE-----
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
3E6906002D94EF8DB3C52989D25AFF8896A12DDA
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
-----BEGIN PRIVATE KEY-----
|
|
2
|
+
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC4k5vnV3y+f03z
|
|
3
|
+
t3C0anGOqeYSLRFg2LgmhRBLL6u+JKOgdeXDQksWMzN+JhhR0SLav1GVG9li4G7C
|
|
4
|
+
RgVoT4B/qVx3y5UvrN8WAW0DGs+QRIGmTlqv0R0B71k7/5y/wiTI1GMFH3FtbJsF
|
|
5
|
+
4Plj7Cw/i0iUwm4D5y0AaeiTK5QkqOqRne+6qpnD0Ebre0Nv+aIGfv29XWq2WtXG
|
|
6
|
+
XB1Zbquu02IMO/OOFdU/RItPsoEs2QbKxuP52DFpW1R8W5/G8XAj5iK0/WIMLhWq
|
|
7
|
+
vCWdDr0dSkTielldQOxFyuV096I0JBqBQ6B8Q/x9l5ji5JN1fFqi7JofyRa4b/7W
|
|
8
|
+
3I8gMhRtAgMBAAECggEARy8OUmMoReOc8aBOhBYFI4scoufkquAJ7TkmNoj1CEjj
|
|
9
|
+
HhA6A1r+0FoAwub4PB2W/pwIX6Q063A45w3QKhF3MkTj14OZTqCyDK+SFj9xy2bQ
|
|
10
|
+
RY40ZVgVgtiHJp+HGWFLhHR8l84vlY7sHpFMPSApVHxoCo8NlM3ESkOOIawN3zDp
|
|
11
|
+
ic3vVN/b0fI9lEvcqjLLtVNDWFkhqb8OODsXgIa+29P+F+p4zIxvT0FsGN/TwYks
|
|
12
|
+
74djp949oJz2TEi4mkrqm8eZHsRpTgTdPOiYqRfIQ943gKouUSjm/g8newVEe51p
|
|
13
|
+
PBMth1gn/K+PgHAcfWaGZBQEcwBreFhztOH1NPfE1QKBgQDvem2AJOCqOGCNcvx7
|
|
14
|
+
tMqaylMNPlw1cPSanIq6oPrY+1YFejVVN66LYNcHrsUpWxdB9I9DuoNvRlNjDqzJ
|
|
15
|
+
fWUkId2XsRm2YiEX3hBlKTmgywy1KPna7g1y12fkP7qKQQeuJ6qYuDCyWYuYzl9K
|
|
16
|
+
Z++kQQk6t1kT/kQqlHjOudNi1wKBgQDFT4ecehhnq/LVbiZEUoKe1A9pGeLfc+w7
|
|
17
|
+
jjL8xSGDpt74uUdNc07etijElIpmkBqnD84dV8rsbNeZqWk5dMWGQBloe69TRyId
|
|
18
|
+
9cY+DNH8xjU4ysts42JEUTmdJVl1aET6yIrIjunhbt8O0ThZb5BXMBTvx9cLQgQ/
|
|
19
|
+
AEilhPVeWwKBgQDRVPw4woOcZ9GGc5febseXjPoSHoutr0IxkFr4DlWXrAOioBPU
|
|
20
|
+
nOq3LPxp28y+fMCUx7kfo/7WGuwzL5W8Px9U+UFhIs7uDVMOMO+17dZRBoziIqJd
|
|
21
|
+
TC93TnGjJE3kIjobctL90ivHCt0qwmKrgLUKqErwB2sXPfDKI6SCWA8+WwKBgDQH
|
|
22
|
+
CYpAQ6kqlQikV+DSJPE+l6WuFr23MoZts5IlZPXzDX5mVJ/elOBzBgL37BqpSu3c
|
|
23
|
+
ZAwmtzJqbNtu6XkmCmOhCVIcsxlxe1SNFy4LcV+G4EfOaZ+XwbSj+l4umA02ZmH+
|
|
24
|
+
eWHzFUbFVnnwvzwOB/CFlC+58UFdsgLuzzkd+xlbAoGADMTT/asr09ZKFP9lyB2e
|
|
25
|
+
AS2K3FCA9eio/vkBr0/PnzIv/bsjLaZ8GvmnlbLKf/gagPaKKGU8dbqyzQr8m2Tv
|
|
26
|
+
ZcHMKN0GgxsV7B9c+HwoMR55hy8rj6zkeUenMyp4U5CuDtH3JEkrM7++ykvS9cyZ
|
|
27
|
+
+Zr4qWiMGxHN9vDpI2AMePk=
|
|
28
|
+
-----END PRIVATE KEY-----
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
-----BEGIN CERTIFICATE-----
|
|
2
|
+
MIICrDCCAZQCFD5pBgAtlO+Ns8UpidJa/4iWoS3aMA0GCSqGSIb3DQEBCwUAMBMx
|
|
3
|
+
ETAPBgNVBAMMCE15VGVzdENBMB4XDTI1MDMyODE2MzgwN1oXDTM1MDMyNjE2Mzgw
|
|
4
|
+
N1owEjEQMA4GA1UEAwwHY2xpZW50MTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
|
|
5
|
+
AQoCggEBAKiXZsaFLcb4eubwGXELePbFL//uR8W7OD0NSaKUbe6G1leLCqWt3ljS
|
|
6
|
+
p8BFTr8B8R/2l3i+VuedIIuzX2wJbBsTrdSEIcOfQauRnkF6RqoWbvToo7fYWphe
|
|
7
|
+
ZGiHfyVmJlr6XQbVNyzOnutEGPdpe6bJMwFdG/UCAaZeAsvAcAGxVGhAp8cjSnwh
|
|
8
|
+
t/8QZJ8/FLcHBVwc0Zd5ELmtPeaMS7GDBiUvdDYRQBRTY8ls9wPvbAuBzo0f/ude
|
|
9
|
+
72iHwkJuDOnTVtffXuFXhloBAVnjaXK0b7PtJ8ByGZ/mZEp1a7Pysehy4w6cL3qg
|
|
10
|
+
9cq306m/jxXrmwlVM/QJd2yhVOQnSPkCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEA
|
|
11
|
+
HM7J+3coTFZYGwYmfG8aObCjN/3gW56VG+5SOHT9NmdfIuzvWrPBIsYE+CYj1nrK
|
|
12
|
+
IFm7TP89R2Ka0U20V09+26C0L3SyE6DUTipOc0zhGQgdLTU1bneIZGg26LtYbKJc
|
|
13
|
+
PV0+Bt1JPT4PulIcuq4XDRFBKaoXC0lmIo1NbfWZbunz1AaBjiJWKS2YksgJJ2Ad
|
|
14
|
+
GhL8/PJO7Ro+8xxunVikcl1MWyeYiKyKFk1J6j8bQPJ940poqSwMObXFKlUMKsm4
|
|
15
|
+
/e6JwqiCFv+MMPL80puUv/Fue6wmjY3rpygwAU60dBPmjLpWNBbuSb/+wjPWYtgy
|
|
16
|
+
f9m+nQEyfflc7t6anZjPMg==
|
|
17
|
+
-----END CERTIFICATE-----
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
-----BEGIN CERTIFICATE REQUEST-----
|
|
2
|
+
MIICVzCCAT8CAQAwEjEQMA4GA1UEAwwHY2xpZW50MTCCASIwDQYJKoZIhvcNAQEB
|
|
3
|
+
BQADggEPADCCAQoCggEBAKiXZsaFLcb4eubwGXELePbFL//uR8W7OD0NSaKUbe6G
|
|
4
|
+
1leLCqWt3ljSp8BFTr8B8R/2l3i+VuedIIuzX2wJbBsTrdSEIcOfQauRnkF6RqoW
|
|
5
|
+
bvToo7fYWpheZGiHfyVmJlr6XQbVNyzOnutEGPdpe6bJMwFdG/UCAaZeAsvAcAGx
|
|
6
|
+
VGhAp8cjSnwht/8QZJ8/FLcHBVwc0Zd5ELmtPeaMS7GDBiUvdDYRQBRTY8ls9wPv
|
|
7
|
+
bAuBzo0f/ude72iHwkJuDOnTVtffXuFXhloBAVnjaXK0b7PtJ8ByGZ/mZEp1a7Py
|
|
8
|
+
sehy4w6cL3qg9cq306m/jxXrmwlVM/QJd2yhVOQnSPkCAwEAAaAAMA0GCSqGSIb3
|
|
9
|
+
DQEBCwUAA4IBAQA6W0JeJs4HHoNzmympMhVn131SQE0wDVMUHrAPQvf5xPjnW/sh
|
|
10
|
+
V5h+gs0yHNUX0ywEn8+eDVmHsskhcYchp/UW4XjBxTFwIx0r7jqFsVYSNjSjteCi
|
|
11
|
+
vhlEuLOWdv4k8pLavr0SnClgDQVV/uCdhxLY0rQJeg1Bfq1CX5YIrrv08SMfYJOz
|
|
12
|
+
xopiohYOt9EqoGuVkVm6wTxso2B4WmT9NuU5PkxulN5do+s/aVC9dZD7dpBgAUFv
|
|
13
|
+
iXOPYmk22cwLArOnpy0FpNEnYga9EHGwb8CUFfa17kPxTMEGyFVHfeuyXF56ubo9
|
|
14
|
+
ln+J+KGh3oWrpUSrPYax7qA/1qnKv3+6y4j2
|
|
15
|
+
-----END CERTIFICATE REQUEST-----
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
-----BEGIN PRIVATE KEY-----
|
|
2
|
+
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCol2bGhS3G+Hrm
|
|
3
|
+
8BlxC3j2xS//7kfFuzg9DUmilG3uhtZXiwqlrd5Y0qfARU6/AfEf9pd4vlbnnSCL
|
|
4
|
+
s19sCWwbE63UhCHDn0GrkZ5BekaqFm706KO32FqYXmRoh38lZiZa+l0G1Tcszp7r
|
|
5
|
+
RBj3aXumyTMBXRv1AgGmXgLLwHABsVRoQKfHI0p8Ibf/EGSfPxS3BwVcHNGXeRC5
|
|
6
|
+
rT3mjEuxgwYlL3Q2EUAUU2PJbPcD72wLgc6NH/7nXu9oh8JCbgzp01bX317hV4Za
|
|
7
|
+
AQFZ42lytG+z7SfAchmf5mRKdWuz8rHocuMOnC96oPXKt9Opv48V65sJVTP0CXds
|
|
8
|
+
oVTkJ0j5AgMBAAECggEAUF0bWLZTQ+1eaIc7GW/mkXsdjln/THoaLMAQwbcPUAxm
|
|
9
|
+
UASvZpqiyqRf4n8nMlWyoxHg0mWo928m/HDco5s6NQ4EZrE1hxJ7M1WOopeu55UZ
|
|
10
|
+
/xSGNjSjus4D/u/X4/P1hJijj4ZDbtBvYKZtYEKf9rkh3xyLHxd9wdg+bPGmcqdW
|
|
11
|
+
TYb0NsWGJu1uPgveUZTc/GSqzblNvOBommoDh0PNWOGcqbKUkTLcqEEJZ2Ki1Z52
|
|
12
|
+
e1H6ZSx4sqIO0ztcjTlzFK5sf+2tjrlfKDUt2bCvZLlsWebJgYxr7B0nnpLHAuvb
|
|
13
|
+
NLj2SdFR4Ox4S1NwEB/y8/dAm3tBcelpjajbqUiPoQKBgQDin9owiH81biVElwYt
|
|
14
|
+
xlRuUagR05KCZJBp12AtNcTo9HVoL+/xufnR9KQ1a7UEleZQYhRrZ73QaMydo9FZ
|
|
15
|
+
fytH2Gm5eeGWBjIVvhdFvmE7Ff740K7tKUUCNLbsHhIviZAi1bbTefPPp35vY9z5
|
|
16
|
+
4fNIW/z/m3cdGUczJgvvbBAOZwKBgQC+cdJsgxF03Mn+wIZHIFj+fof/HgrFzmzV
|
|
17
|
+
3X5yS14hAxOaU0NTg9T5FDsQ7XOvGcjDV4r44pcagcLimyGphzodIFjjVHe9vaeF
|
|
18
|
+
tJer4g9Q/1lZGPldufA1s533yEMyjCwpdILvobTuU8VskvGzyzTyD2Z5L59PlaNt
|
|
19
|
+
MN1NMgqRnwKBgQDRDfUQ4Fm4yCrI4yhoAZTRT7Ji/3Efp/UwLeYizn8fBqNnwRDv
|
|
20
|
+
REgYTj1MqlcKK92SOWfszH5lSse2g/ATRyR92j1tQ+m9o2mAdSKyy7SV9OyISrmT
|
|
21
|
+
PYbTSh2UIwlToOq9t7g3zUAERtZzmwO136G1FmaExL1UsoTjwi0wZ9dH8QKBgHJ8
|
|
22
|
+
rok5Sfc8+9nAF3kOwzFLE6qUftlnPRpcazV+hXnHBbPStjiwmgma1d9ZQCBVmdGF
|
|
23
|
+
ATCZ10jCFUxxAg2OE6uK1KTlFI7mQp0ocb2MyrRgrW/YiaCEtRkzf5WDuJHcnnfV
|
|
24
|
+
aRlx1vknNxoMRG1Xjd6uz2Wu8VDAnlx38bIEkUH1AoGBAI5hPvpDYX/KbCiXRWIv
|
|
25
|
+
bjJ1oz2tBMg+dsGr+IM2VBcsyOyioDDPGp4s6jeYdsq5MUq3fhZnJUXcVDwOvD/i
|
|
26
|
+
F3ulQhsCBJa7Y1scc015Vm6MpbkDgKCIzWmFPb5tVDtQLdtZqevcChHrUPHAo1tT
|
|
27
|
+
nZ+d7Eok1Kz1TUI5gg6nbteD
|
|
28
|
+
-----END PRIVATE KEY-----
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
-----BEGIN CERTIFICATE-----
|
|
2
|
+
MIICrjCCAZYCFD5pBgAtlO+Ns8UpidJa/4iWoS3ZMA0GCSqGSIb3DQEBCwUAMBMx
|
|
3
|
+
ETAPBgNVBAMMCE15VGVzdENBMB4XDTI1MDMyODE2MzczMloXDTM1MDMyNjE2Mzcz
|
|
4
|
+
MlowFDESMBAGA1UEAwwJbG9jYWxob3N0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
|
|
5
|
+
MIIBCgKCAQEAwAHQjt8BD+n31SVmP7X+aNHu96KAAvzPM1kiFVHplVXrEJYau+8y
|
|
6
|
+
Ov0eMfKnQ/Yt28jaYGFlVyRS81zpQ2P+IsdlqqOPyiwwDPPNL8Ia7X8kPgIaXRhE
|
|
7
|
+
OKtSjajpkvIjHqRX2vH3wj2T1XPRsQ9HExx2Hw3NFrOdTSMs61AwGH66fcWSvNAx
|
|
8
|
+
CtG8Ij1MEWdK5tS36q59fPHkRMpgOx0cbr5QY2U+giKi/25y+A02S0CeLE4mP5mg
|
|
9
|
+
xQ7Rf2oaBiiaz22xCwcmARTkOuOsg5tk8/yGWoNHlAW130n7qp/to2UT9/7269H4
|
|
10
|
+
LdCtQYPLqjXcFKF3dD+VyxVdc2mJzleUKQIDAQABMA0GCSqGSIb3DQEBCwUAA4IB
|
|
11
|
+
AQCi/mDFU0OgxI8q1aSGR/yfS6hBhsMVl8CJ4fvSFgNU8p6hHDaBbfc0D6DR8bym
|
|
12
|
+
mcpZ08QXEEhJbMlxACmpVE5EqR6usbSJF7ItvlM71YzxK5CAS66yAkdrhIyEStRe
|
|
13
|
+
1L8uRicdsIoEvjDbe80p4p76Aoe+Iz0I8V+v8aXzHII9om7zRp8OBBOIP5cGMmpt
|
|
14
|
+
GIifsdqPZwAKnr83l/ZgyXtUAFdaTS4raf0yh+lU86I5kTJeur7MGyKFvvwCNI2B
|
|
15
|
+
V3Cp2H8dxgXXL0R4yCUMmxTyqMktLsXQjfMC8OnVa3oetrFS+dilS7JI+WCRZ5YH
|
|
16
|
+
iOS8YRpx9xu4Yzy/apunvaK0
|
|
17
|
+
-----END CERTIFICATE-----
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
-----BEGIN CERTIFICATE REQUEST-----
|
|
2
|
+
MIICWTCCAUECAQAwFDESMBAGA1UEAwwJbG9jYWxob3N0MIIBIjANBgkqhkiG9w0B
|
|
3
|
+
AQEFAAOCAQ8AMIIBCgKCAQEAwAHQjt8BD+n31SVmP7X+aNHu96KAAvzPM1kiFVHp
|
|
4
|
+
lVXrEJYau+8yOv0eMfKnQ/Yt28jaYGFlVyRS81zpQ2P+IsdlqqOPyiwwDPPNL8Ia
|
|
5
|
+
7X8kPgIaXRhEOKtSjajpkvIjHqRX2vH3wj2T1XPRsQ9HExx2Hw3NFrOdTSMs61Aw
|
|
6
|
+
GH66fcWSvNAxCtG8Ij1MEWdK5tS36q59fPHkRMpgOx0cbr5QY2U+giKi/25y+A02
|
|
7
|
+
S0CeLE4mP5mgxQ7Rf2oaBiiaz22xCwcmARTkOuOsg5tk8/yGWoNHlAW130n7qp/t
|
|
8
|
+
o2UT9/7269H4LdCtQYPLqjXcFKF3dD+VyxVdc2mJzleUKQIDAQABoAAwDQYJKoZI
|
|
9
|
+
hvcNAQELBQADggEBAFfKmC+7cPTYPzA9NU5eOLJ/grmzLiqJkbrFxcWk3YVdX5wX
|
|
10
|
+
uL3gQ6JCflhZCxMo593bOy+CzqbehI95Ogk7uQlCjj5yN6oIw35OWoWZ+yG1KANs
|
|
11
|
+
Tas6USWJ6wZa3FQiGZTG3LMTo2MXR1o3wfbGDUmzhtH/rLFi/puI+00TEm5RZrxF
|
|
12
|
+
ZjFvcA59NiZV5N3sAiI4RMHY1OoSEW6uaFHdIDpc6m6I0lLPNh9u1AFPxnwshAIG
|
|
13
|
+
SLUnoMVLJgxbGwezq+2pMixYaDmyVtUjPQB5keZmdIBsQpFPx0ZNZJWj2vjGiSwL
|
|
14
|
+
AFchAHWw3AobCHDUtApnlOfSVt+8c4P9NqMLIjc=
|
|
15
|
+
-----END CERTIFICATE REQUEST-----
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
-----BEGIN PRIVATE KEY-----
|
|
2
|
+
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDAAdCO3wEP6ffV
|
|
3
|
+
JWY/tf5o0e73ooAC/M8zWSIVUemVVesQlhq77zI6/R4x8qdD9i3byNpgYWVXJFLz
|
|
4
|
+
XOlDY/4ix2Wqo4/KLDAM880vwhrtfyQ+AhpdGEQ4q1KNqOmS8iMepFfa8ffCPZPV
|
|
5
|
+
c9GxD0cTHHYfDc0Ws51NIyzrUDAYfrp9xZK80DEK0bwiPUwRZ0rm1Lfqrn188eRE
|
|
6
|
+
ymA7HRxuvlBjZT6CIqL/bnL4DTZLQJ4sTiY/maDFDtF/ahoGKJrPbbELByYBFOQ6
|
|
7
|
+
46yDm2Tz/IZag0eUBbXfSfuqn+2jZRP3/vbr0fgt0K1Bg8uqNdwUoXd0P5XLFV1z
|
|
8
|
+
aYnOV5QpAgMBAAECggEAXMzDuznHLqTbVpZT2/kfNBQ7Fk7g5hDAKEYtNfa4GahE
|
|
9
|
+
C2kxFKIgOeh6fpOUCkHimjZybWDFdR+mQ98lEqAyhSawWY/iAEnpE2mGQ03ia+Um
|
|
10
|
+
ZB3qFhKTbnxHUxZPhekn1jiCCd0m7SeL2v+2WohSxsbbxFiMRiubnFui6zx/cmZ+
|
|
11
|
+
Mb78bFY4c6BPsEbXlS6l62U9oiBiV28N2snhT5F79RbN9kp9fDUGotbKPZ2epEm4
|
|
12
|
+
tHby4e/MxUsTdZpPA8PX05mVjSEK9JHZjfhhB44hTJpHTJyGenqm2n8CDnpOejh/
|
|
13
|
+
KnVB/b6mAfKyCdu5y1SJwZOj20OiUVbG0VnKjwr+LQKBgQD3LMs6+Vh+S7efIsJd
|
|
14
|
+
6Y3yIo/pF46iYvhlcpQotjIVxuYRdiYuXSFpTxomiieBcLkDXBeNWTkKpFVK/SAS
|
|
15
|
+
N3LJXEKl4+ZquyR6sacEkTw0VPuHgCx7lO+8vZVP4q0SUMZV+dtCzjidQ9+JAVeh
|
|
16
|
+
UKaYQfoVkCpFhNd1c271HeSWEwKBgQDG3MfDhwZIuAg3jQqr2ZzRtvbhVnltAkAf
|
|
17
|
+
VSTIc5uflIfL3IEzWC861mibsfEE8JMfLA+VDcOLu8fdc1TEP6y2hEyAjjXEvY42
|
|
18
|
+
xBEkYQncR1U2LPavGlqOF2LTzsRaT+/iFnJrYHkeIboWKLyDpfkZX/UxdK8WMExW
|
|
19
|
+
7v5S1GbkUwKBgQCf2Fn9Y271DeZLhWEI9pcTNYK3jMJzBWn5wSVLRrgRGTWDqVJ7
|
|
20
|
+
vUJ0JfGVZtaxgMJFB/M7N64J0chO3G83GKCk04NOYJmMAEZRCj4mV/4FIcggEqWx
|
|
21
|
+
rdlzx26d4MtoAtCgnRpMk6xNF62hnjqbWdrCsDgYZcjQeF4V2HazEYfX/QKBgBFw
|
|
22
|
+
POhNh+SKltXgPWZSf+j4BXA/OAiyINNekQou8R+uU7Yx0PairgmX0baNhRgszIn4
|
|
23
|
+
QCmO+m3feqhVu8I13zxmH5tKXTaydK0ixmoNRGMXskY87Sjvw68gJ99xC1DsH5oQ
|
|
24
|
+
49m8rQJSbNISom1c+ZobCxJaLBxjAd7BuHWlAJzXAoGAGrB6ZEjDH/mAjVpRNsZN
|
|
25
|
+
6P+3zst7r3PWIFBRkwAhfiS9IFtlCngIUzVJDjOAo/6yPvzK05Y0zq8xcJNVI6h/
|
|
26
|
+
AM42G3qhsevfEuR++blSF3i4uLOkHwkemcYjV8NcbgI3tgzn7sKBxN0l1hAVALVr
|
|
27
|
+
5GKcmOJY/PcTXiU8U9+sZrI=
|
|
28
|
+
-----END PRIVATE KEY-----
|
package/test/helper.js
CHANGED
|
@@ -1,42 +1,36 @@
|
|
|
1
1
|
'use strict'
|
|
2
2
|
|
|
3
3
|
const { Grape } = require('grenache-grape')
|
|
4
|
-
const
|
|
4
|
+
const async = require('async')
|
|
5
5
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
6
|
+
const startGrapes = async () => {
|
|
7
|
+
const grapes = [
|
|
8
|
+
new Grape({
|
|
9
|
+
dht_port: 20002,
|
|
10
|
+
dht_bootstrap: ['127.0.0.1:20001'],
|
|
11
|
+
api_port: 40001
|
|
12
|
+
}),
|
|
13
|
+
new Grape({
|
|
14
|
+
dht_port: 20001,
|
|
15
|
+
dht_bootstrap: ['127.0.0.1:20002'],
|
|
16
|
+
api_port: 30001
|
|
17
|
+
})
|
|
18
|
+
]
|
|
18
19
|
|
|
19
|
-
|
|
20
|
-
(
|
|
21
|
-
|
|
22
|
-
grape1.once('ready', cb)
|
|
23
|
-
},
|
|
24
|
-
(cb) => {
|
|
25
|
-
grape2.start()
|
|
26
|
-
grape2.once('node', cb)
|
|
27
|
-
}
|
|
28
|
-
], () => {
|
|
29
|
-
cb(null, [grape1, grape2])
|
|
20
|
+
await async.each(grapes, (grape, next) => {
|
|
21
|
+
grape.start()
|
|
22
|
+
grape.once('ready', () => next())
|
|
30
23
|
})
|
|
24
|
+
return grapes
|
|
31
25
|
}
|
|
32
26
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
if (err) throw err
|
|
37
|
-
grapes[1].stop((err) => {
|
|
38
|
-
if (err) throw err
|
|
39
|
-
done()
|
|
40
|
-
})
|
|
27
|
+
const stopGrapes = async (grapes) => {
|
|
28
|
+
await async.each(grapes, (grape, next) => {
|
|
29
|
+
grape.stop(next)
|
|
41
30
|
})
|
|
42
31
|
}
|
|
32
|
+
|
|
33
|
+
module.exports = {
|
|
34
|
+
startGrapes,
|
|
35
|
+
stopGrapes
|
|
36
|
+
}
|