Skip to content

Commit ff7a6c8

Browse files
authored
fix: promisified methods (#398)
* chore: update ws rendezvous dep test(fix): fix tests with latest ws rendezvous server * fix: promisification of libp2p methods test: add tests to verify promisify support until async/await endeavor is complete * chore: fix linting
1 parent 9a8d609 commit ff7a6c8

9 files changed

+169
-108
lines changed

.aegir.js

+35-58
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
'use strict'
22

33
const pull = require('pull-stream')
4-
const parallel = require('async/parallel')
54
const WebSocketStarRendezvous = require('libp2p-websocket-star-rendezvous')
65
const sigServer = require('libp2p-webrtc-star/src/sig-server')
76

@@ -15,68 +14,46 @@ const {
1514
let wrtcRendezvous
1615
let wsRendezvous
1716
let node
17+
let peerInfo
1818

19-
const before = (done) => {
20-
parallel([
21-
(cb) => {
22-
sigServer.start({
23-
port: WRTC_RENDEZVOUS_MULTIADDR.nodeAddress().port
24-
// cryptoChallenge: true TODO: needs https://github.com/libp2p/js-libp2p-webrtc-star/issues/128
25-
})
26-
.then(server => {
27-
wrtcRendezvous = server
28-
cb()
29-
})
30-
.catch(cb)
31-
},
32-
(cb) => {
33-
WebSocketStarRendezvous.start({
34-
port: WS_RENDEZVOUS_MULTIADDR.nodeAddress().port,
35-
refreshPeerListIntervalMS: 1000,
36-
strictMultiaddr: false,
37-
cryptoChallenge: true
38-
}, (err, _server) => {
39-
if (err) {
40-
return cb(err)
41-
}
42-
wsRendezvous = _server
43-
cb()
44-
})
45-
},
46-
(cb) => {
47-
getPeerRelay((err, peerInfo) => {
48-
if (err) {
49-
return done(err)
50-
}
51-
52-
node = new Node({
53-
peerInfo,
54-
config: {
55-
relay: {
56-
enabled: true,
57-
hop: {
58-
enabled: true,
59-
active: true
60-
}
61-
}
62-
}
63-
})
19+
const before = async () => {
20+
[wrtcRendezvous, wsRendezvous, peerInfo] = await Promise.all([
21+
sigServer.start({
22+
port: WRTC_RENDEZVOUS_MULTIADDR.nodeAddress().port
23+
// cryptoChallenge: true TODO: needs https://github.com/libp2p/js-libp2p-webrtc-star/issues/128
24+
}),
25+
WebSocketStarRendezvous.start({
26+
port: WS_RENDEZVOUS_MULTIADDR.nodeAddress().port,
27+
refreshPeerListIntervalMS: 1000,
28+
strictMultiaddr: false,
29+
cryptoChallenge: true
30+
}),
31+
getPeerRelay()
32+
])
6433

65-
node.handle('/echo/1.0.0', (protocol, conn) => pull(conn, conn))
66-
node.start(cb)
67-
})
34+
node = new Node({
35+
peerInfo,
36+
config: {
37+
relay: {
38+
enabled: true,
39+
hop: {
40+
enabled: true,
41+
active: true
42+
}
43+
}
6844
}
69-
], done)
45+
})
46+
47+
node.handle('/echo/1.0.0', (protocol, conn) => pull(conn, conn))
48+
await node.start()
7049
}
7150

72-
const after = (done) => {
73-
setTimeout(() =>
74-
parallel([
75-
(cb) => wrtcRendezvous.stop().then(cb).catch(cb),
76-
...[node, wsRendezvous].map((s) => (cb) => s.stop(cb)),
77-
], done),
78-
2000
79-
)
51+
const after = () => {
52+
return Promise.all([
53+
wrtcRendezvous.stop(),
54+
wsRendezvous.stop(),
55+
node.stop()
56+
])
8057
}
8158

8259
module.exports = {

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@
8383
"libp2p-tcp": "^0.13.0",
8484
"libp2p-webrtc-star": "^0.16.1",
8585
"libp2p-websocket-star": "~0.10.2",
86-
"libp2p-websocket-star-rendezvous": "~0.3.0",
86+
"libp2p-websocket-star-rendezvous": "~0.4.1",
8787
"lodash.times": "^4.3.2",
8888
"merge-options": "^1.0.1",
8989
"nock": "^10.0.6",

src/index.js

+19-5
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,11 @@ class Libp2p extends EventEmitter {
187187
})
188188

189189
this._peerDiscovered = this._peerDiscovered.bind(this)
190+
191+
// promisify all instance methods
192+
;['start', 'stop', 'dial', 'dialProtocol', 'dialFSM', 'hangUp', 'ping'].forEach(method => {
193+
this[method] = promisify(this[method], { context: this })
194+
})
190195
}
191196

192197
/**
@@ -295,6 +300,13 @@ class Libp2p extends EventEmitter {
295300
})
296301
}
297302

303+
/**
304+
* Disconnects from the given peer
305+
*
306+
* @param {PeerInfo|PeerId|Multiaddr|string} peer The peer to ping
307+
* @param {function(Error)} callback
308+
* @returns {void}
309+
*/
298310
hangUp (peer, callback) {
299311
this._getPeerInfo(peer, (err, peerInfo) => {
300312
if (err) { return callback(err) }
@@ -303,6 +315,13 @@ class Libp2p extends EventEmitter {
303315
})
304316
}
305317

318+
/**
319+
* Pings the provided peer
320+
*
321+
* @param {PeerInfo|PeerId|Multiaddr|string} peer The peer to ping
322+
* @param {function(Error, Ping)} callback
323+
* @returns {void}
324+
*/
306325
ping (peer, callback) {
307326
if (!this.isStarted()) {
308327
return callback(notStarted('ping', this.state._state))
@@ -550,11 +569,6 @@ class Libp2p extends EventEmitter {
550569
}
551570
}
552571

553-
// promisify all instance methods
554-
['start', 'stop', 'dial', 'dialProtocol', 'dialFSM', 'hangUp', 'ping'].forEach(method => {
555-
Libp2p[method] = promisify(Libp2p[method])
556-
})
557-
558572
module.exports = Libp2p
559573
/**
560574
* Like `new Libp2p(options)` except it will create a `PeerInfo`

test/circuit-relay.browser.js

+1-6
Original file line numberDiff line numberDiff line change
@@ -43,12 +43,7 @@ describe('circuit relay', () => {
4343
let peerRelay
4444

4545
before('get peer relay', async () => {
46-
peerRelay = await new Promise(resolve => {
47-
getPeerRelay((err, peer) => {
48-
expect(err).to.not.exist()
49-
resolve(peer)
50-
})
51-
})
46+
peerRelay = await getPeerRelay()
5247
})
5348

5449
before('create the browser nodes', async () => {

test/node.js

+1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ require('./stream-muxing.node')
66
require('./peer-discovery.node')
77
require('./peer-routing.node')
88
require('./ping.node')
9+
require('./promisify.node')
910
require('./pubsub.node')
1011
require('./content-routing.node')
1112
require('./circuit-relay.node')

test/promisify.node.js

+87
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
/* eslint-env mocha */
2+
'use strict'
3+
4+
/**
5+
* This test suite is intended to validate compatability of
6+
* the promisified api, until libp2p has been fully migrated to
7+
* async/await. Once the migration is complete and all tests
8+
* are using async/await, this file can be removed.
9+
*/
10+
11+
const chai = require('chai')
12+
chai.use(require('dirty-chai'))
13+
const expect = chai.expect
14+
const promisify = require('promisify-es6')
15+
const createNode = promisify(require('./utils/create-node'))
16+
const { createPeerInfo } = require('./utils/create-node')
17+
const Node = require('./utils/bundle-nodejs')
18+
const pull = require('pull-stream')
19+
const Ping = require('libp2p-ping')
20+
21+
/**
22+
* As libp2p is currently promisified, when extending libp2p,
23+
* method arguments must be passed to `super` to ensure the
24+
* promisify callbacks are properly resolved
25+
*/
26+
class AsyncLibp2p extends Node {
27+
async start (...args) {
28+
await super.start(...args)
29+
}
30+
31+
async stop (...args) {
32+
await super.start(...args)
33+
}
34+
}
35+
36+
async function createAsyncNode () {
37+
const peerInfo = await promisify(createPeerInfo)()
38+
peerInfo.multiaddrs.add('/ip4/0.0.0.0/tcp/0')
39+
return new AsyncLibp2p({ peerInfo })
40+
}
41+
42+
describe('promisified libp2p', () => {
43+
let libp2p
44+
let otherNode
45+
const ECHO_PROTO = '/echo/1.0.0'
46+
47+
before('Create and Start', async () => {
48+
[libp2p, otherNode] = await Promise.all([
49+
createNode('/ip4/0.0.0.0/tcp/0'),
50+
createAsyncNode()
51+
])
52+
53+
return [libp2p, otherNode].map(node => {
54+
node.handle(ECHO_PROTO, (_, conn) => pull(conn, conn))
55+
return node.start()
56+
})
57+
})
58+
59+
after('Stop', () => {
60+
return [libp2p, otherNode].map(node => node.stop())
61+
})
62+
63+
afterEach('Hang up', () => {
64+
return libp2p.hangUp(otherNode.peerInfo)
65+
})
66+
67+
it('dial', async () => {
68+
const stream = await libp2p.dial(otherNode.peerInfo)
69+
expect(stream).to.not.exist()
70+
expect(libp2p._switch.connection.getAll()).to.have.length(1)
71+
})
72+
73+
it('dialFSM', async () => {
74+
const connectionFSM = await libp2p.dialFSM(otherNode.peerInfo, ECHO_PROTO)
75+
expect(connectionFSM).to.exist()
76+
})
77+
78+
it('dialProtocol', async () => {
79+
const stream = await libp2p.dialProtocol(otherNode.peerInfo, ECHO_PROTO)
80+
expect(stream).to.exist()
81+
})
82+
83+
it('ping', async () => {
84+
const ping = await libp2p.ping(otherNode.peerInfo)
85+
expect(ping).to.be.an.instanceOf(Ping)
86+
})
87+
})

test/transports.browser.js

+5-8
Original file line numberDiff line numberDiff line change
@@ -25,14 +25,11 @@ describe('transports', () => {
2525
let peerBMultiaddr
2626
let nodeA
2727

28-
before((done) => {
29-
getPeerRelay((err, peerInfo) => {
30-
expect(err).to.not.exist()
31-
peerB = new PeerInfo(peerInfo.id)
32-
peerBMultiaddr = `/ip4/127.0.0.1/tcp/9200/ws/p2p/${peerInfo.id.toB58String()}`
33-
peerB.multiaddrs.add(peerBMultiaddr)
34-
done()
35-
})
28+
before(async () => {
29+
const peerInfo = await getPeerRelay()
30+
peerB = new PeerInfo(peerInfo.id)
31+
peerBMultiaddr = `/ip4/127.0.0.1/tcp/9200/ws/p2p/${peerInfo.id.toB58String()}`
32+
peerB.multiaddrs.add(peerBMultiaddr)
3633
})
3734

3835
after((done) => nodeA.stop(done))

test/transports.node.js

+15-26
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,9 @@ const createNode = require('./utils/create-node.js')
1717
const tryEcho = require('./utils/try-echo')
1818
const echo = require('./utils/echo')
1919

20-
const { WRTC_RENDEZVOUS_MULTIADDR } = require('./utils/constants')
20+
const {
21+
WRTC_RENDEZVOUS_MULTIADDR
22+
} = require('./utils/constants')
2123

2224
describe('transports', () => {
2325
describe('TCP only', () => {
@@ -576,25 +578,24 @@ describe('transports', () => {
576578
let nodeTCP
577579
let nodeWS
578580
let nodeWebSocketStar
579-
580581
let ss
582+
const PORT = 24642
583+
584+
before(async () => {
585+
ss = await rendezvous.start({
586+
port: PORT
587+
})
588+
})
581589

582590
before((done) => {
583591
parallel([
584-
(cb) => {
585-
rendezvous.start({ port: 24642 }, (err, server) => {
586-
expect(err).to.not.exist()
587-
ss = server
588-
cb()
589-
})
590-
},
591592
(cb) => {
592593
const wstar = new WSStar()
593594

594595
createNode([
595596
'/ip4/0.0.0.0/tcp/0',
596597
'/ip4/127.0.0.1/tcp/25011/ws',
597-
'/ip4/127.0.0.1/tcp/24642/ws/p2p-websocket-star'
598+
`/ip4/127.0.0.1/tcp/${PORT}/ws/p2p-websocket-star`
598599
], {
599600
modules: {
600601
transport: [
@@ -603,13 +604,6 @@ describe('transports', () => {
603604
wstar
604605
],
605606
peerDiscovery: [wstar.discovery]
606-
},
607-
config: {
608-
peerDiscovery: {
609-
[wstar.discovery.tag]: {
610-
enabled: true
611-
}
612-
}
613607
}
614608
}, (err, node) => {
615609
expect(err).to.not.exist()
@@ -640,18 +634,11 @@ describe('transports', () => {
640634
const wstar = new WSStar({})
641635

642636
createNode([
643-
'/ip4/127.0.0.1/tcp/24642/ws/p2p-websocket-star'
637+
`/ip4/127.0.0.1/tcp/${PORT}/ws/p2p-websocket-star`
644638
], {
645639
modules: {
646640
transport: [wstar],
647641
peerDiscovery: [wstar.discovery]
648-
},
649-
config: {
650-
peerDiscovery: {
651-
[wstar.discovery.tag]: {
652-
enabled: true
653-
}
654-
}
655642
}
656643
}, (err, node) => {
657644
expect(err).to.not.exist()
@@ -670,7 +657,9 @@ describe('transports', () => {
670657
(cb) => nodeTCP.stop(cb),
671658
(cb) => nodeWS.stop(cb),
672659
(cb) => nodeWebSocketStar.stop(cb),
673-
(cb) => ss.stop(cb)
660+
async () => {
661+
await ss.stop()
662+
}
674663
], done)
675664
})
676665

0 commit comments

Comments
 (0)