From a326eac1bb144328df98dd5caa28d0ec0a0c0a2f Mon Sep 17 00:00:00 2001 From: pengx17 Date: Tue, 29 Apr 2025 03:51:47 +0000 Subject: [PATCH] fix(electron): shared-worker api binding (#11991) ## Summary by CodeRabbit - **New Features** - Improved security by adding cross-origin isolation headers to HTTP responses in the desktop app. - **Bug Fixes** - Enhanced reliability of worker connections by ensuring workers are fully loaded before establishing communication. --- .../apps/electron/src/main/worker/pool.ts | 20 +++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/packages/frontend/apps/electron/src/main/worker/pool.ts b/packages/frontend/apps/electron/src/main/worker/pool.ts index 63b86323e4..1b8f07637b 100644 --- a/packages/frontend/apps/electron/src/main/worker/pool.ts +++ b/packages/frontend/apps/electron/src/main/worker/pool.ts @@ -23,7 +23,12 @@ export class WorkerManager { workers = new Map< string, - { browserWindow: BrowserWindow; ports: Set; key: string } + { + browserWindow: BrowserWindow; + ports: Set; + key: string; + loaded: PromiseWithResolvers; + } >(); private async getOrCreateWorker(key: string) { @@ -42,6 +47,14 @@ export class WorkerManager { }, show: false, }); + + const record = { + browserWindow: worker, + ports: new Set(), + key, + loaded: Promise.withResolvers(), + }; + let disconnectHelperProcess: (() => void) | null = null; worker.on('closed', () => { this.workers.delete(key); @@ -54,8 +67,9 @@ export class WorkerManager { disconnectHelperProcess = helperProcessManager.connectRenderer( worker.webContents ); + record.loaded.resolve(); }); - const record = { browserWindow: worker, ports: new Set(), key }; + this.workers.set(key, record); return record; } @@ -74,6 +88,8 @@ export class WorkerManager { const { port1: portForWorker, port2: portForRenderer } = new MessageChannelMain(); + await worker.loaded.promise; + worker.browserWindow.webContents.postMessage('worker-connect', { portId }, [ portForWorker, ]);