Skip to content

Commit ad1e8ab

Browse files
committed
fix: emit peer discovery for dht discovery
1 parent ab028a2 commit ad1e8ab

File tree

3 files changed

+72
-2
lines changed

3 files changed

+72
-2
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@
7272
"libp2p-circuit": "~0.3.0",
7373
"libp2p-delegated-content-routing": "~0.2.2",
7474
"libp2p-delegated-peer-routing": "~0.2.2",
75-
"libp2p-kad-dht": "~0.14.2",
75+
"libp2p-kad-dht": "~0.14.5",
7676
"libp2p-mdns": "~0.12.0",
7777
"libp2p-mplex": "~0.8.4",
7878
"libp2p-secio": "~0.11.0",

src/index.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -404,7 +404,10 @@ class Node extends EventEmitter {
404404
// have to set started here because DHT requires libp2p is already started
405405
this._isStarted = true
406406
if (this._dht) {
407-
this._dht.start(cb)
407+
this._dht.start(() => {
408+
this._dht.on('peer', (peerInfo) => this.emit('peer:discovery', peerInfo))
409+
cb()
410+
})
408411
} else {
409412
cb()
410413
}

test/peer-discovery.node.js

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,13 @@ const expect = chai.expect
77
const sinon = require('sinon')
88
const signalling = require('libp2p-webrtc-star/src/sig-server')
99
const parallel = require('async/parallel')
10+
const retry = require('async/retry')
11+
const series = require('async/series')
1012
const crypto = require('crypto')
1113

14+
const PeerId = require('peer-id')
15+
const PeerInfo = require('peer-info')
16+
1217
const createNode = require('./utils/create-node')
1318
const echo = require('./utils/echo')
1419

@@ -284,6 +289,68 @@ describe('peer discovery', () => {
284289
})
285290
})
286291

292+
describe('dht', () => {
293+
setup({
294+
config: {
295+
peerDiscovery: {
296+
mdns: {
297+
enabled: false
298+
},
299+
webRTCStar: {
300+
enabled: false
301+
}
302+
}
303+
}
304+
})
305+
306+
// connect two dhts
307+
function connectNoSync (a, b, callback) {
308+
const publicPeerId = new PeerId(b.peerInfo.id.id, null, b.peerInfo.id.pubKey)
309+
const target = new PeerInfo(publicPeerId)
310+
target.multiaddrs = b.peerInfo.multiaddrs
311+
a.switch.dial(target, callback)
312+
}
313+
314+
function find (a, b, cb) {
315+
retry({ times: 50, interval: 100 }, (cb) => {
316+
a.routingTable.find(b.peerInfo.id, (err, match) => {
317+
if (err) {
318+
return cb(err)
319+
}
320+
if (!match) {
321+
return cb(new Error('not found'))
322+
}
323+
324+
try {
325+
expect(a.peerBook.get(b.peerInfo).multiaddrs.toArray()[0].toString())
326+
.to.eql(b.peerInfo.multiaddrs.toArray()[0].toString())
327+
} catch (err) {
328+
return cb(err)
329+
}
330+
331+
cb()
332+
})
333+
}, cb)
334+
}
335+
336+
it('find a peer', function (done) {
337+
this.timeout(15 * 1000)
338+
339+
nodeA.once('peer:discovery', (peerInfo) => {
340+
expect(nodeB.peerInfo.id.toB58String())
341+
.to.eql(peerInfo.id.toB58String())
342+
done()
343+
})
344+
345+
// connect to dhts
346+
series([
347+
(cb) => connectNoSync(nodeA._dht, nodeB._dht, cb),
348+
(cb) => find(nodeA._dht, nodeB._dht, cb),
349+
(cb) => find(nodeB._dht, nodeA._dht, cb)
350+
])
351+
})
352+
})
353+
287354
describe('MulticastDNS + WebRTCStar', () => {
288355
setup({
289356
config: {

0 commit comments

Comments
 (0)