diff --git a/README.md b/README.md index 7b43ad6..9cb3c87 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,8 @@ mdns.on('peer', (peerInfo) => { }) // Broadcast for 20 seconds -mdns.start(() => setTimeout(() => mdns.stop(() => {}), 20 * 1000)) +mdns.start() +setTimeout(() => mdns.stop(), 20 * 1000) ``` - options diff --git a/package.json b/package.json index 1ea6894..27dcb2c 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,6 @@ "homepage": "https://github.com/libp2p/js-libp2p-mdns", "devDependencies": { "aegir": "^18.0.2", - "async": "^2.6.1", "chai": "^4.2.0", "dirty-chai": "^2.0.1" }, @@ -40,8 +39,8 @@ "libp2p-tcp": "~0.13.0", "multiaddr": "^6.0.2", "multicast-dns": "^7.2.0", - "peer-id": "~0.12.0", - "peer-info": "~0.15.0" + "peer-id": "libp2p/js-peer-id#feat/async-await", + "peer-info": "libp2p/js-peer-info#feat/async-await" }, "contributors": [ "Alan Shaw ", diff --git a/src/index.js b/src/index.js index d2c3ef3..0c1dcd8 100644 --- a/src/index.js +++ b/src/index.js @@ -8,7 +8,7 @@ const log = debug('libp2p:mdns') const query = require('./query') class MulticastDNS extends EventEmitter { - constructor (options) { + constructor (options = {}) { super() assert(options.peerInfo, 'needs a PeerInfo to work') @@ -18,42 +18,55 @@ class MulticastDNS extends EventEmitter { this.port = options.port || 5353 this.peerInfo = options.peerInfo this._queryInterval = null - } - start (callback) { - const self = this - const mdns = multicastDNS({ port: this.port }) + this._onMdnsQuery = this._onMdnsQuery.bind(this) + this._onMdnsResponse = this._onMdnsResponse.bind(this) + } - this.mdns = mdns + /** + * Start sending queries to the LAN. + * + * @returns {void} + */ + start () { + this.mdns = multicastDNS({ port: this.port }) + this.mdns.on('query', this._onMdnsQuery) + this.mdns.on('response', this._onMdnsResponse) this._queryInterval = query.queryLAN(this.mdns, this.serviceTag, this.interval) + } - mdns.on('response', (event) => { - query.gotResponse(event, this.peerInfo, this.serviceTag, (err, foundPeer) => { - if (err) { - return log('Error processing peer response', err) - } - - self.emit('peer', foundPeer) - }) - }) - - mdns.on('query', (event) => { - query.gotQuery(event, this.mdns, this.peerInfo, this.serviceTag, this.broadcast) - }) + _onMdnsQuery (event) { + query.gotQuery(event, this.mdns, this.peerInfo, this.serviceTag, this.broadcast) + } - setImmediate(() => callback()) + async _onMdnsResponse (event) { + try { + const foundPeer = await query.gotResponse(event, this.peerInfo, this.serviceTag) + this.emit('peer', foundPeer) + } catch (err) { + log('Error processing peer response', err) + } } - stop (callback) { + /** + * Stop sending queries to the LAN. + * + * @returns {Promise} + */ + async stop () { if (!this.mdns) { - callback(new Error('MulticastDNS service had not started yet')) - } else { - clearInterval(this._queryInterval) - this._queryInterval = null - this.mdns.destroy(callback) - this.mdns = undefined + throw new Error('MulticastDNS service had not started yet') } + + this.mdns.removeListener('query', this._onMdnsQuery) + this.mdns.removeListener('query', this._onMdnsResponse) + + clearInterval(this._queryInterval) + this._queryInterval = null + + await new Promise((resolve) => this.mdns.destroy(resolve)) + this.mdns = undefined } } diff --git a/src/query.js b/src/query.js index 9b919a1..f667a6a 100644 --- a/src/query.js +++ b/src/query.js @@ -27,7 +27,7 @@ module.exports = { return setInterval(query, interval) }, - gotResponse: function (rsp, peerInfo, serviceTag, callback) { + gotResponse: async function (rsp, peerInfo, serviceTag) { if (!rsp.answers) { return } const answers = { @@ -72,15 +72,13 @@ module.exports = { const peerId = Id.createFromB58String(b58Id) - Peer.create(peerId, (err, peerFound) => { - if (err) { - return log('Error creating PeerInfo from new found peer', err) - } - + try { + const peerFound = await Peer.create(peerId) multiaddrs.forEach((addr) => peerFound.multiaddrs.add(addr)) - - callback(null, peerFound) - }) + return peerFound + } catch (err) { + log('Error creating PeerInfo from new found peer', err) + } }, gotQuery: function (qry, mdns, peerInfo, serviceTag, broadcast) { diff --git a/test/multicast-dns.spec.js b/test/multicast-dns.spec.js index 8958477..47593e2 100644 --- a/test/multicast-dns.spec.js +++ b/test/multicast-dns.spec.js @@ -7,8 +7,6 @@ const expect = chai.expect chai.use(dirtyChai) const multiaddr = require('multiaddr') const PeerInfo = require('peer-info') -const parallel = require('async/parallel') -const series = require('async/series') const MulticastDNS = require('./../src') @@ -18,50 +16,28 @@ describe('MulticastDNS', () => { let pC let pD - before(function (done) { - this.timeout(80 * 1000) - - parallel([ - (cb) => { - PeerInfo.create((err, peer) => { - expect(err).to.not.exist() - - pA = peer - pA.multiaddrs.add(multiaddr('/ip4/127.0.0.1/tcp/20001')) - cb() - }) - }, - (cb) => { - PeerInfo.create((err, peer) => { - expect(err).to.not.exist() - - pB = peer - pB.multiaddrs.add(multiaddr('/ip4/127.0.0.1/tcp/20002')) - pB.multiaddrs.add(multiaddr('/ip6/::1/tcp/20002')) - cb() - }) - }, - (cb) => { - PeerInfo.create((err, peer) => { - expect(err).to.not.exist() - pC = peer - pC.multiaddrs.add(multiaddr('/ip4/127.0.0.1/tcp/20003')) - pC.multiaddrs.add(multiaddr('/ip4/127.0.0.1/tcp/30003/ws')) - cb() - }) - }, - (cb) => { - PeerInfo.create((err, peer) => { - if (err) { cb(err) } - pD = peer - pD.multiaddrs.add(multiaddr('/ip4/127.0.0.1/tcp/30003/ws')) - cb() - }) - } - ], done) + before(async function () { + this.timeout(80 * 1000); + + [pA, pB, pC, pD] = await Promise.all([ + PeerInfo.create(), + PeerInfo.create(), + PeerInfo.create(), + PeerInfo.create() + ]) + + pA.multiaddrs.add(multiaddr('/ip4/127.0.0.1/tcp/20001')) + + pB.multiaddrs.add(multiaddr('/ip4/127.0.0.1/tcp/20002')) + pB.multiaddrs.add(multiaddr('/ip6/::1/tcp/20002')) + + pC.multiaddrs.add(multiaddr('/ip4/127.0.0.1/tcp/20003')) + pC.multiaddrs.add(multiaddr('/ip4/127.0.0.1/tcp/30003/ws')) + + pD.multiaddrs.add(multiaddr('/ip4/127.0.0.1/tcp/30003/ws')) }) - it('find another peer', function (done) { + it('find another peer', async function () { this.timeout(40 * 1000) const mdnsA = new MulticastDNS({ @@ -75,23 +51,17 @@ describe('MulticastDNS', () => { port: 50001 // port must be the same }) - parallel([ - (cb) => mdnsA.start(cb), - (cb) => mdnsB.start(cb) - ], () => { - mdnsA.once('peer', (peerInfo) => { - expect(pB.id.toB58String()).to.eql(peerInfo.id.toB58String()) - parallel([ - (cb) => mdnsA.stop(cb), - (cb) => mdnsB.stop(cb) - ], done) - }) - - mdnsB.once('peer', (peerInfo) => {}) - }) + mdnsA.start() + mdnsB.start() + + const peerInfo = await new Promise((resolve) => mdnsA.once('peer', resolve)) + + expect(pB.id.toB58String()).to.eql(peerInfo.id.toB58String()) + + await Promise.all([mdnsA.stop(), mdnsB.stop()]) }) - it('only announce TCP multiaddrs', function (done) { + it('only announce TCP multiaddrs', async function () { this.timeout(40 * 1000) const mdnsA = new MulticastDNS({ @@ -108,27 +78,23 @@ describe('MulticastDNS', () => { port: 50003 // port must be the same }) - parallel([ - (cb) => mdnsA.start(cb), - (cb) => mdnsC.start(cb), - (cb) => mdnsD.start(cb) - - ], () => { - mdnsA.once('peer', (peerInfo) => { - expect(pC.id.toB58String()).to.eql(peerInfo.id.toB58String()) - expect(peerInfo.multiaddrs.size).to.equal(1) - parallel([ - (cb) => mdnsA.stop(cb), - (cb) => mdnsC.stop(cb), - (cb) => mdnsD.stop(cb) - ], done) - }) - - mdnsC.once('peer', (peerInfo) => {}) - }) + mdnsA.start() + mdnsC.start() + mdnsD.start() + + const peerInfo = await new Promise((resolve) => mdnsA.once('peer', resolve)) + + expect(pC.id.toB58String()).to.eql(peerInfo.id.toB58String()) + expect(peerInfo.multiaddrs.size).to.equal(1) + + await Promise.all([ + mdnsA.stop(), + mdnsC.stop(), + mdnsD.stop() + ]) }) - it('announces IP6 addresses', function (done) { + it('announces IP6 addresses', async function () { this.timeout(40 * 1000) const mdnsA = new MulticastDNS({ @@ -142,24 +108,18 @@ describe('MulticastDNS', () => { port: 50001 }) - series([ - (cb) => mdnsB.start(cb), - (cb) => mdnsA.start(cb) - ], () => { - mdnsA.once('peer', (peerInfo) => { - expect(pB.id.toB58String()).to.eql(peerInfo.id.toB58String()) - expect(peerInfo.multiaddrs.size).to.equal(2) - parallel([ - (cb) => mdnsA.stop(cb), - (cb) => mdnsB.stop(cb) - ], done) - }) - - mdnsB.once('peer', (peerInfo) => {}) - }) + mdnsA.start() + mdnsB.start() + + const peerInfo = await new Promise((resolve) => mdnsA.once('peer', resolve)) + + expect(pB.id.toB58String()).to.eql(peerInfo.id.toB58String()) + expect(peerInfo.multiaddrs.size).to.equal(2) + + await Promise.all([mdnsA.stop(), mdnsB.stop()]) }) - it('doesn\'t emit peers after stop', function (done) { + it('doesn\'t emit peers after stop', async function () { this.timeout(40 * 1000) const mdnsA = new MulticastDNS({ @@ -172,16 +132,16 @@ describe('MulticastDNS', () => { port: 50004 }) - series([ - (cb) => mdnsA.start(cb), - (cb) => setTimeout(cb, 1000), - (cb) => mdnsA.stop(cb), - (cb) => mdnsC.start(cb) - ], () => { - setTimeout(() => mdnsC.stop(done), 5000) - mdnsC.once('peer', (peerInfo) => { - done(new Error('Should not receive new peer.')) - }) + mdnsA.start() + await new Promise((resolve) => setTimeout(resolve, 1000)) + await mdnsA.stop() + mdnsC.start() + + mdnsC.once('peer', (peerInfo) => { + throw new Error('Should not receive new peer.') }) + + await new Promise((resolve) => setTimeout(resolve, 5000)) + await mdnsC.stop() }) })