Skip to content

Commit 84f30fa

Browse files
server: port-skipping (try PORT, skip busy ports) instead of failing on a taken 3000
1 parent 4db867d commit 84f30fa

1 file changed

Lines changed: 19 additions & 2 deletions

File tree

src/server.js

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,25 @@ export async function startServer(port = process.env.PORT || 3000) {
5050
});
5151

5252
app.use((err, _req, res, _next) => res.status(500).json({ error: err.message }));
53-
app.listen(port, () => console.log(`[beacon] read API on :${port}`));
54-
return app;
53+
54+
const server = await listenWithSkip(app, Number(port) || 3000);
55+
console.log(`[beacon] serving on http://localhost:${server.address().port}`);
56+
return server;
57+
}
58+
59+
// Try `port`, skipping to the next port on EADDRINUSE (so a busy 3000 just moves on).
60+
function listenWithSkip(app, port, attempts = 25) {
61+
return new Promise((resolve, reject) => {
62+
const tryPort = (p, left) => {
63+
const server = app.listen(p);
64+
server.once('listening', () => resolve(server));
65+
server.once('error', (e) => {
66+
if (e.code === 'EADDRINUSE' && left > 0) { console.log(`[beacon] port ${p} busy, skipping…`); tryPort(p + 1, left - 1); }
67+
else reject(e);
68+
});
69+
};
70+
tryPort(port, attempts);
71+
});
5572
}
5673

5774
if (import.meta.url === `file://${process.argv[1]}`) startServer();

0 commit comments

Comments
 (0)