Skip to content

Commit 4125e9e

Browse files
authored
fix: handle listen error (#224)
The `net.Server` `.listen` callback is not a node-style callback that gets passed an error, it's a listener for the `listen` event. To handle errors when `.listen`ing, one must listen for the `error` event, so update the code to do that and add a test to prevent regressions.
1 parent 2778c38 commit 4125e9e

File tree

2 files changed

+20
-4
lines changed

2 files changed

+20
-4
lines changed

src/listener.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -155,10 +155,10 @@ export class TCPListener extends EventEmitter<ListenerEvents> implements Listene
155155

156156
return await new Promise<void>((resolve, reject) => {
157157
const options = multiaddrToNetConfig(listeningAddr)
158-
this.server.listen(options, (err?: any) => {
159-
if (err != null) {
160-
return reject(err)
161-
}
158+
this.server.on('error', (err) => {
159+
reject(err)
160+
})
161+
this.server.listen(options, () => {
162162
log('Listening on %s', this.server.address())
163163
resolve()
164164
})

test/listen-dial.spec.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,22 @@ describe('listen', () => {
4747
await listener.listen(mh)
4848
})
4949

50+
it('errors when listening on busy port', async () => {
51+
const mh = multiaddr('/ip4/127.0.0.1/tcp/0')
52+
listener = transport.createListener({
53+
upgrader
54+
})
55+
await listener.listen(mh)
56+
57+
const listener2 = transport.createListener({
58+
upgrader
59+
})
60+
61+
const mh2 = listener.getAddrs()[0]
62+
await expect(listener2.listen(mh2)).to.eventually.be.rejected()
63+
.with.property('code', 'EADDRINUSE')
64+
})
65+
5066
it('listen on IPv6 addr', async () => {
5167
if (isCI != null) {
5268
return

0 commit comments

Comments
 (0)