Skip to content

Commit d2fbd4b

Browse files
haadcodedaviddias
authored andcommitted
Catch unhandled exception (EADDRINUSE) in listeners (libp2p#128)
fix(transport): Catch unhandled errors (EADDRINUSE)
1 parent 87af9c5 commit d2fbd4b

File tree

2 files changed

+32
-1
lines changed

2 files changed

+32
-1
lines changed

src/transport.js

+9-1
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,11 @@ module.exports = function (swarm) {
8080
const createListeners = multiaddrs.map((ma) => {
8181
return (cb) => {
8282
const listener = transport.createListener(handler)
83+
84+
listener.once('error', cb)
85+
8386
listener.listen(ma, () => {
87+
listener.removeListener('error', cb)
8488
listener.getAddrs((err, addrs) => {
8589
if (err) {
8690
return cb(err)
@@ -93,7 +97,11 @@ module.exports = function (swarm) {
9397
}
9498
})
9599

96-
parallel(createListeners, () => {
100+
parallel(createListeners, (err) => {
101+
if (err) {
102+
return callback(err)
103+
}
104+
97105
// cause we can listen on port 0 or 0.0.0.0
98106
swarm._peerInfo.multiaddr.replace(multiaddrs, freshMultiaddrs)
99107
callback()

test/01-transport-tcp.node.js

+23
Original file line numberDiff line numberDiff line change
@@ -186,4 +186,27 @@ describe('transport - tcp', function () {
186186
swarm.close(done)
187187
}
188188
})
189+
190+
it('handles EADDRINUSE error when trying to listen', (done) => {
191+
let swarm1, swarm2
192+
swarm1 = new Swarm(peerA)
193+
swarm1.transport.add('tcp', new TCP())
194+
swarm1.transport.listen('tcp', {}, (conn) => {
195+
pull(conn, conn)
196+
}, () => {
197+
// Add in-use (peerA) address to peerB
198+
peerB.multiaddr.add(multiaddr('/ip4/127.0.0.1/tcp/9888'))
199+
swarm2 = new Swarm(peerB)
200+
swarm2.transport.add('tcp', new TCP())
201+
swarm2.transport.listen('tcp', {}, (conn) => {
202+
pull(conn, conn)
203+
}, ready)
204+
})
205+
206+
function ready (err) {
207+
expect(err).to.exist
208+
expect(err.code).to.equal('EADDRINUSE')
209+
swarm1.close(() => swarm2.close(done))
210+
}
211+
})
189212
})

0 commit comments

Comments
 (0)