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),