From 4fd13260894dd46c7c5248a524d03e96cda7d2e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9B=B7=E7=94=B5=E8=8A=BD=E8=A1=A3?= Date: Thu, 16 Apr 2026 23:04:29 -0400 Subject: [PATCH] fix(browser-manager): await login-window close during shutdown --- src/main/browser-action-service.ts | 4 ++-- src/main/browser-manager.ts | 16 ++++++++++++++-- src/main/main-runtime-support.ts | 2 +- 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/src/main/browser-action-service.ts b/src/main/browser-action-service.ts index ebab0dee..c37f9c0d 100644 --- a/src/main/browser-action-service.ts +++ b/src/main/browser-action-service.ts @@ -130,8 +130,8 @@ export function createBrowserActionService({ return requireBrowserManager().launchLoginBrowser(socialAccountId, platform, loginUrl); } - function resetBrowserManager() { - browserManagerRef.current?.shutdown(); + async function resetBrowserManager() { + await browserManagerRef.current?.shutdown(); browserManagerRef.current = new BrowserManager(join(db.artifactsDir, "browser")); } diff --git a/src/main/browser-manager.ts b/src/main/browser-manager.ts index c9b5d987..2f25f4a9 100644 --- a/src/main/browser-manager.ts +++ b/src/main/browser-manager.ts @@ -300,10 +300,22 @@ export class BrowserManager { } } - shutdown() { + async shutdown() { + // Wait for each pending window-close to finish so any callers that chain + // `await shutdown()` before recreating the manager don't observe torn + // state (half-closed login windows still holding a partition). + const closePromises: Promise[] = []; for (const [, win] of this.loginWindows) { - if (!win.isDestroyed()) win.close(); + if (!win.isDestroyed()) { + closePromises.push( + new Promise((resolve) => { + win.once("closed", () => resolve()); + win.close(); + }), + ); + } } + await Promise.all(closePromises); this.loginWindows.clear(); this.activeActionWindows.clear(); this.cancelledActionIds.clear(); diff --git a/src/main/main-runtime-support.ts b/src/main/main-runtime-support.ts index 4bb9ace5..b87bddb0 100644 --- a/src/main/main-runtime-support.ts +++ b/src/main/main-runtime-support.ts @@ -151,7 +151,7 @@ export function createMainRuntimeSupport(state: MainRuntimeState) { getWorkerProcess: () => requireServiceGraph().getWorkerService()?.getWorker() ?? null, resetAfterRestore: () => { initializeAgentTokenSigningKey(requireDb().profileDir); - requireBrowserActionService().resetBrowserManager(); + void requireBrowserActionService().resetBrowserManager(); }, getApiPort: () => state.apiServer?.port ?? 0, notify: (options) => requireIpcSupport().notify(options),