From 6ec0c6edc10be515025af58897e737c9b6aa8574 Mon Sep 17 00:00:00 2001 From: Yanhu007 Date: Sun, 12 Apr 2026 15:35:18 +0800 Subject: [PATCH] fix(pglite-socket): propagate server startup errors from start() The error handler in start() checks `if (!this.active)` before calling reject(), but this.active is set to true before the server.listen() call. When listen fails (e.g. EACCES, EADDRINUSE), the error is logged and emitted but reject() is never called, causing the start() Promise to hang forever. Replace the this.active check with a local `listening` flag that is only set to true inside the listen callback. This ensures startup errors always reject the Promise. Fixes #964 --- packages/pglite-socket/src/index.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/pglite-socket/src/index.ts b/packages/pglite-socket/src/index.ts index 572b9cfa7..b65c7fbaa 100644 --- a/packages/pglite-socket/src/index.ts +++ b/packages/pglite-socket/src/index.ts @@ -607,16 +607,19 @@ export class PGLiteSocketServer extends EventTarget { return new Promise((resolve, reject) => { if (!this.server) return reject(new Error('Server not initialized')) + let listening = false + this.server.on('error', (err) => { this.log(`start: server error:`, err) this.dispatchEvent(new CustomEvent('error', { detail: err })) - if (!this.active) { + if (!listening) { reject(err) } }) if (this.path) { this.server.listen(this.path, () => { + listening = true this.log(`start: server listening on ${this.getServerConn()}`) this.dispatchEvent( new CustomEvent('listening', { @@ -628,6 +631,7 @@ export class PGLiteSocketServer extends EventTarget { } else { const server = this.server server.listen(this.port, this.host, () => { + listening = true const address = server.address() // We are not using pipes, so return type should be AddressInfo if (address === null || typeof address !== 'object') {