fix(electron): shared-worker api binding (#11991)

<!-- This is an auto-generated comment: release notes by coderabbit.ai -->
## 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.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
This commit is contained in:
pengx17
2025-04-29 03:51:47 +00:00
committed by Peng Xiao
parent 8b402dd49a
commit a326eac1bb

View File

@@ -23,7 +23,12 @@ export class WorkerManager {
workers = new Map< workers = new Map<
string, string,
{ browserWindow: BrowserWindow; ports: Set<string>; key: string } {
browserWindow: BrowserWindow;
ports: Set<string>;
key: string;
loaded: PromiseWithResolvers<void>;
}
>(); >();
private async getOrCreateWorker(key: string) { private async getOrCreateWorker(key: string) {
@@ -42,6 +47,14 @@ export class WorkerManager {
}, },
show: false, show: false,
}); });
const record = {
browserWindow: worker,
ports: new Set<string>(),
key,
loaded: Promise.withResolvers<void>(),
};
let disconnectHelperProcess: (() => void) | null = null; let disconnectHelperProcess: (() => void) | null = null;
worker.on('closed', () => { worker.on('closed', () => {
this.workers.delete(key); this.workers.delete(key);
@@ -54,8 +67,9 @@ export class WorkerManager {
disconnectHelperProcess = helperProcessManager.connectRenderer( disconnectHelperProcess = helperProcessManager.connectRenderer(
worker.webContents worker.webContents
); );
record.loaded.resolve();
}); });
const record = { browserWindow: worker, ports: new Set<string>(), key };
this.workers.set(key, record); this.workers.set(key, record);
return record; return record;
} }
@@ -74,6 +88,8 @@ export class WorkerManager {
const { port1: portForWorker, port2: portForRenderer } = const { port1: portForWorker, port2: portForRenderer } =
new MessageChannelMain(); new MessageChannelMain();
await worker.loaded.promise;
worker.browserWindow.webContents.postMessage('worker-connect', { portId }, [ worker.browserWindow.webContents.postMessage('worker-connect', { portId }, [
portForWorker, portForWorker,
]); ]);