Skip to content
This repository has been archived by the owner on Jul 21, 2023. It is now read-only.

Commit

Permalink
chore: callbacks -> async / await
Browse files Browse the repository at this point in the history
BREAKING CHANGE: All places in the API that used callbacks are now replaced with async/await
  • Loading branch information
dirkmc committed Mar 15, 2019
1 parent c4e90b4 commit 1ede512
Show file tree
Hide file tree
Showing 5 changed files with 115 additions and 144 deletions.
3 changes: 2 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
5 changes: 2 additions & 3 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -32,16 +32,15 @@
"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"
},
"dependencies": {
"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 <alan.shaw@protocol.ai>",
Expand Down
67 changes: 40 additions & 27 deletions src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -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')

Expand All @@ -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
}
}

Expand Down
16 changes: 7 additions & 9 deletions src/query.js
Original file line number Diff line number Diff line change
Expand Up @@ -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 = {
Expand Down Expand Up @@ -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) {
Expand Down
168 changes: 64 additions & 104 deletions test/multicast-dns.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -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')

Expand All @@ -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({
Expand All @@ -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({
Expand All @@ -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({
Expand All @@ -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({
Expand All @@ -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()
})
})

0 comments on commit 1ede512

Please sign in to comment.