grenache-nodejs-http 0.7.13 → 1.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.
Files changed (38) hide show
  1. package/examples/rpc_server.js +1 -3
  2. package/examples/rpc_server_stream.js +1 -3
  3. package/examples/ssl/rpc_client_map.js +4 -4
  4. package/examples/ssl/rpc_server.js +4 -5
  5. package/lib/TransportRPCClient.js +60 -33
  6. package/lib/TransportRPCServer.js +1 -1
  7. package/package.json +17 -11
  8. package/test/before-after.js +10 -12
  9. package/test/certs/ca-crt.pem +19 -0
  10. package/test/certs/ca-crt.srl +1 -0
  11. package/test/certs/ca-key.pem +28 -0
  12. package/test/certs/client1-crt.pem +17 -0
  13. package/test/certs/client1-csr.pem +15 -0
  14. package/test/certs/client1-key.pem +28 -0
  15. package/test/certs/server-crt.pem +17 -0
  16. package/test/certs/server-csr.pem +15 -0
  17. package/test/certs/server-key.pem +28 -0
  18. package/test/helper.js +26 -32
  19. package/test/peer-rpc-server-secure-buffered.js +262 -0
  20. package/test/peer-rpc-server-secure-streaming.js +224 -0
  21. package/test/peer-rpc-server-secure.js +96 -0
  22. package/test/peer-rpc-server.js +76 -0
  23. package/examples/ssl/ca-crt.pem +0 -32
  24. package/examples/ssl/ca-crt.srl +0 -1
  25. package/examples/ssl/ca-key.pem +0 -54
  26. package/examples/ssl/ca.cnf +0 -31
  27. package/examples/ssl/client1-crt.pem +0 -32
  28. package/examples/ssl/client1-csr.pem +0 -29
  29. package/examples/ssl/client1-key.pem +0 -51
  30. package/examples/ssl/client1.cnf +0 -26
  31. package/examples/ssl/client2-crt.pem +0 -32
  32. package/examples/ssl/client2-csr.pem +0 -29
  33. package/examples/ssl/client2-key.pem +0 -51
  34. package/examples/ssl/client2.cnf +0 -26
  35. package/examples/ssl/server-crt.pem +0 -32
  36. package/examples/ssl/server-csr.pem +0 -29
  37. package/examples/ssl/server-key.pem +0 -51
  38. package/examples/ssl/server.cnf +0 -26
@@ -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(_.random(1000) + 1024)
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(_.random(1000) + 1024)
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: 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(_.random(1000) + 1024)
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 request = require('request')
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
- this.socket = this.getSocket(this.conf.secure)
22
- }
23
-
24
- getSocket (secure) {
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 (opts, secure) {
32
+ getOpts (_opts, secure) {
37
33
  const u = secure
38
- ? ('https://' + this.conf.dest) : ('http://' + 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
- if (!secure) {
47
- return _.extend(def, opts)
43
+ const opts = { ...def, ..._opts }
44
+ if (secure) {
45
+ opts.agent = new https.Agent(secure)
48
46
  }
49
47
 
50
- return _.extend(def, opts, secure)
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
- const req = socket.post(opts, (err, res, body) => {
138
- if (err) {
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
- req.on('error', (err) => {
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
- const stream = this.socket.post(opts)
175
- return stream
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: isStream, compress: isCompress }
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.7.13",
3
+ "version": "1.0.0",
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": "^3.2.4",
15
- "grenache-nodejs-base": "^0.7.5",
16
- "grenache-nodejs-link": "^0.7.13",
17
- "lodash": "^4.17.21",
18
- "request": "^2.88.0"
17
+ "async": "3.2.6",
18
+ "duplexify": "4.1.3",
19
+ "grenache-nodejs-base": "1.0.0",
20
+ "grenache-nodejs-link": "1.0.1",
21
+ "node-fetch": "2.7.0",
22
+ "pump": "3.0.2"
19
23
  },
20
24
  "main": "index.js",
21
25
  "devDependencies": {
22
- "grenache-grape": "^0.9.12",
23
- "mocha": "^10.2.0",
24
- "standard": "^17.0.0"
26
+ "grenache-grape": "0.9.12",
27
+ "mocha": "11.1.0",
28
+ "standard": "17.1.2"
25
29
  },
26
30
  "scripts": {
27
- "test": "npm run lint",
28
- "lint": "standard"
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": {
@@ -2,26 +2,24 @@
2
2
 
3
3
  'use strict'
4
4
 
5
- const { bootTwoGrapes, killGrapes } = require('./helper')
5
+ const { startGrapes, stopGrapes } = require('./helper')
6
6
 
7
7
  let grapes
8
8
  function setupHooks (cb) {
9
- beforeEach(function (done) {
9
+ beforeEach(async function () {
10
10
  this.timeout(20000)
11
- bootTwoGrapes((err, g) => {
12
- if (err) throw err
13
- grapes = g
14
- grapes[0].once('announce', () => {
15
- done()
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 (done) {
20
+ afterEach(async function () {
23
21
  this.timeout(5000)
24
- killGrapes(grapes, done)
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 waterfall = require('async/waterfall')
4
+ const async = require('async')
5
5
 
6
- exports.bootTwoGrapes = bootTwoGrapes
7
- function bootTwoGrapes (cb) {
8
- const grape1 = new Grape({
9
- dht_port: 20002,
10
- dht_bootstrap: ['127.0.0.1:20001'],
11
- api_port: 40001
12
- })
13
- const grape2 = new Grape({
14
- dht_port: 20001,
15
- dht_bootstrap: ['127.0.0.1:20002'],
16
- api_port: 30001
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
- waterfall([
20
- (cb) => {
21
- grape1.start()
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
- exports.killGrapes = killGrapes
34
- function killGrapes (grapes, done) {
35
- grapes[0].stop((err) => {
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
+ }