Skip to content

Commit fed6f96

Browse files
RangerMauveMauve Signweaver
andauthored
fix: Reuse port for discovery server (#1065)
Co-authored-by: Mauve Signweaver <[email protected]>
1 parent c070d6b commit fed6f96

File tree

2 files changed

+33
-2
lines changed

2 files changed

+33
-2
lines changed

src/discovery/local-discovery.js

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ export class LocalDiscovery extends TypedEmitter {
4040
/** @type {(e: Error) => void} */
4141
#handleSocketError
4242
#l
43+
#port = 0
4344

4445
/**
4546
* @param {Object} opts
@@ -76,9 +77,19 @@ export class LocalDiscovery extends TypedEmitter {
7677
/** @returns {Promise<void>} */
7778
async #start() {
7879
// Let OS choose port, listen on ip4, all interfaces
79-
this.#server.listen(0, '0.0.0.0')
80-
await once(this.#server, 'listening')
80+
const onListening = once(this.#server, 'listening')
81+
82+
try {
83+
this.#server.listen(this.#port, '0.0.0.0')
84+
await onListening
85+
} catch (e) {
86+
if (this.#port === 0) throw e
87+
// Account for errors from re-binding the port failing
88+
this.#port = 0
89+
return this.#start()
90+
}
8191
const addr = getAddress(this.#server)
92+
this.#port = addr.port
8293
this.#log('server listening on port ' + addr.port)
8394
}
8495

test-e2e/manager-basic.js

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -471,6 +471,26 @@ test('Consistent storage folders', async () => {
471471
)
472472
})
473473

474+
test('Reusing port after start/stop of discovery', async (t) => {
475+
const manager = new MapeoManager({
476+
rootKey: KeyManager.generateRootKey(),
477+
projectMigrationsFolder,
478+
clientMigrationsFolder,
479+
dbFolder: ':memory:',
480+
coreStorage: () => new RAM(),
481+
fastify: Fastify(),
482+
})
483+
484+
t.after(() => manager.stopLocalPeerDiscoveryServer())
485+
486+
const { port } = await manager.startLocalPeerDiscoveryServer()
487+
488+
await manager.stopLocalPeerDiscoveryServer({ force: true })
489+
490+
const { port: newPort } = await manager.startLocalPeerDiscoveryServer()
491+
assert.equal(newPort, port, 'Port got reused')
492+
})
493+
474494
/**
475495
* Generate a deterministic random bytes
476496
*

0 commit comments

Comments
 (0)