From 26f1be106f7ca1d74474f40a3929fc177bd368f5 Mon Sep 17 00:00:00 2001 From: Kai Gritun Date: Wed, 11 Feb 2026 23:15:45 -0500 Subject: [PATCH] fix(worker): register leader-now listener early to prevent race condition Fixes #850 The 'leader-now' message from the worker could be lost if the main thread was still blocked (e.g., awaiting acquireLock) when the message arrived. This happened because the listener was registered after several async operations that could yield control. By moving the listener registration to immediately after the worker signals it's ready (and before any other async operations), we ensure the message is never missed, regardless of main thread load. --- packages/pglite/src/worker/index.ts | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/packages/pglite/src/worker/index.ts b/packages/pglite/src/worker/index.ts index 93a552173..9e5b21803 100644 --- a/packages/pglite/src/worker/index.ts +++ b/packages/pglite/src/worker/index.ts @@ -148,6 +148,18 @@ export class PGliteWorker // Wait for the worker let us know it's ready await this.#workerReadyPromise + // Register leader-now listener early to avoid race condition (#850) + // The worker may send 'leader-now' immediately after becoming leader, + // before we've finished setting up broadcast channels. By registering + // this listener before any async operations, we ensure we don't miss + // the message. + this.#workerProcess.addEventListener('message', async (event) => { + if (event.data.type === 'leader-now') { + this.#isLeader = true + this.#eventTarget.dispatchEvent(new Event('leader-change')) + } + }) + // Acquire the tab close lock, this is released then the tab, or this // PGliteWorker instance, is closed const tabCloseLockId = `pglite-tab-close:${this.#tabId}` @@ -180,13 +192,6 @@ export class PGliteWorker } }) - this.#workerProcess.addEventListener('message', async (event) => { - if (event.data.type === 'leader-now') { - this.#isLeader = true - this.#eventTarget.dispatchEvent(new Event('leader-change')) - } - }) - this.#leaderNotifyLoop() // Init array types