Skip to content
This repository was archived by the owner on Aug 23, 2019. It is now read-only.

Commit 5d47adc

Browse files
dignifiedquiredaviddias
authored andcommitted
fix(transport): do not callback after listen errored (#139)
* fix(transport): do not callback after listen errored * fix(close): wait for the muxer to close * chore(deps): use latest * test: ensure all callbacks are done
1 parent 1b3207d commit 5d47adc

File tree

4 files changed

+45
-26
lines changed

4 files changed

+45
-26
lines changed

package.json

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@
4343
"gulp": "^3.9.1",
4444
"libp2p-multiplex": "^0.2.1",
4545
"libp2p-secio": "^0.6.3",
46-
"libp2p-spdy": "^0.10.0",
46+
"libp2p-spdy": "^0.10.1",
4747
"libp2p-tcp": "^0.9.1",
4848
"libp2p-webrtc-star": "^0.7.0",
4949
"libp2p-websockets": "^0.9.1",
@@ -62,7 +62,8 @@
6262
"lodash.includes": "^4.3.0",
6363
"multiaddr": "^2.1.1",
6464
"multistream-select": "^0.13.0",
65-
"peer-id": "^0.8.0",
65+
"once": "^1.4.0",
66+
"peer-id": "^0.8.1",
6667
"peer-info": "^0.8.1",
6768
"protocol-buffers": "^3.1.8"
6869
},
@@ -79,4 +80,4 @@
7980
"Richard Littauer <[email protected]>",
8081
"Sid Harder <[email protected]>"
8182
]
82-
}
83+
}

src/index.js

Lines changed: 22 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@
22

33
const util = require('util')
44
const EE = require('events').EventEmitter
5-
const parallel = require('async/parallel')
5+
const each = require('async/each')
6+
const series = require('async/series')
67
const includes = require('lodash.includes')
78

89
const transport = require('./transport')
@@ -84,10 +85,10 @@ function Swarm (peerInfo) {
8485

8586
// Start listening on all available transports
8687
this.listen = (callback) => {
87-
parallel(this.availableTransports(peerInfo).map((ts) => (cb) => {
88+
each(this.availableTransports(peerInfo), (ts, cb) => {
8889
// Listen on the given transport
8990
this.transport.listen(ts, {}, null, cb)
90-
}), callback)
91+
}, callback)
9192
}
9293

9394
this.handle = (protocol, handlerFunc, matchFunc) => {
@@ -124,19 +125,23 @@ function Swarm (peerInfo) {
124125
}
125126

126127
this.close = (callback) => {
127-
Object.keys(this.muxedConns).forEach((key) => {
128-
this.muxedConns[key].muxer.end()
129-
})
130-
131-
const transports = this.transports
132-
133-
parallel(
134-
Object.keys(transports).map((key) => (cb) => {
135-
parallel(transports[key].listeners.map((listener) => {
136-
return (cb) => listener.close(cb)
137-
}), cb)
138-
}),
139-
callback
140-
)
128+
series([
129+
(cb) => each(this.muxedConns, (conn, cb) => {
130+
conn.muxer.end((err) => {
131+
// If OK things are fine, and someone just shut down
132+
if (err && err.message !== 'Fatal error: OK') {
133+
return cb(err)
134+
}
135+
cb()
136+
})
137+
}, cb),
138+
(cb) => {
139+
each(this.transports, (transport, cb) => {
140+
each(transport.listeners, (listener, cb) => {
141+
listener.close(cb)
142+
}, cb)
143+
}, cb)
144+
}
145+
], callback)
141146
}
142147
}

src/transport.js

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
const Connection = require('interface-connection').Connection
44
const parallel = require('async/parallel')
5+
const once = require('once')
56
const debug = require('debug')
67
const log = debug('libp2p:swarm:transport')
78

@@ -81,19 +82,19 @@ module.exports = function (swarm) {
8182

8283
const createListeners = multiaddrs.map((ma) => {
8384
return (cb) => {
85+
const done = once(cb)
8486
const listener = transport.createListener(handler)
85-
86-
listener.once('error', cb)
87+
listener.once('error', done)
8788

8889
listener.listen(ma, () => {
89-
listener.removeListener('error', cb)
90+
listener.removeListener('error', done)
9091
listener.getAddrs((err, addrs) => {
9192
if (err) {
92-
return cb(err)
93+
return done(err)
9394
}
9495
freshMultiaddrs = freshMultiaddrs.concat(addrs)
9596
transport.listeners.push(listener)
96-
cb()
97+
done()
9798
})
9899
})
99100
}

test/09-swarm-with-muxing.node.js

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -209,10 +209,21 @@ describe('high level API - with everything mixed all together!', () => {
209209
})
210210

211211
it('dial from tcp+ws to tcp+ws', (done) => {
212+
let i = 0
213+
const check = (err) => {
214+
if (err) {
215+
return done(err)
216+
}
217+
218+
if (i++ === 2) {
219+
done()
220+
}
221+
}
212222
swarmC.handle('/mamao/1.0.0', (protocol, conn) => {
213223
conn.getPeerInfo((err, peerInfo) => {
214224
expect(err).to.not.exist
215225
expect(peerInfo).to.exist
226+
check()
216227
})
217228
pull(conn, conn)
218229
})
@@ -222,13 +233,14 @@ describe('high level API - with everything mixed all together!', () => {
222233
conn.getPeerInfo((err, peerInfo) => {
223234
expect(err).to.not.exist
224235
expect(peerInfo).to.exist
236+
check()
225237
})
226238
expect(Object.keys(swarmA.muxedConns).length).to.equal(2)
227239

228240
pull(
229241
pull.empty(),
230242
conn,
231-
pull.onEnd(done)
243+
pull.onEnd(check)
232244
)
233245
})
234246
})

0 commit comments

Comments
 (0)