From ccf220fc299ceb23bebbafa3948c48c2f3be5715 Mon Sep 17 00:00:00 2001 From: imbytecat Date: Sun, 8 Feb 2026 23:59:54 +0800 Subject: [PATCH] fix(desktop): ensure sidecar process stops on app shutdown --- apps/desktop/src/main/index.ts | 32 ++++++++++++++++++++++++++++---- 1 file changed, 28 insertions(+), 4 deletions(-) diff --git a/apps/desktop/src/main/index.ts b/apps/desktop/src/main/index.ts index 06e1551..c315b6b 100644 --- a/apps/desktop/src/main/index.ts +++ b/apps/desktop/src/main/index.ts @@ -44,6 +44,21 @@ const waitForServer = async ( return false } +const stopServerProcess = () => { + if (!serverProcess) { + return + } + + const runningServer = serverProcess + serverProcess = null + + if (!runningServer.pid || runningServer.exitCode !== null) { + return + } + + runningServer.kill() +} + const spawnServer = (port: number): string => { const binaryName = process.platform === 'win32' ? 'server.exe' : 'server' const binaryPath = join(process.resourcesPath, binaryName) @@ -69,6 +84,10 @@ const spawnServer = (port: number): string => { console.error('Failed to start server:', err) }) + serverProcess.on('exit', () => { + serverProcess = null + }) + return `http://127.0.0.1:${port}` } @@ -96,6 +115,10 @@ const createWindow = async () => { return { action: 'deny' } }) + mainWindow.on('closed', () => { + mainWindow = null + }) + if (process.env.ELECTRON_RENDERER_URL) { mainWindow.loadURL(process.env.ELECTRON_RENDERER_URL) } else { @@ -118,6 +141,9 @@ const createWindow = async () => { } console.log(`Loading ${serverUrl}`) + if (!mainWindow || mainWindow.isDestroyed()) { + return + } mainWindow.loadURL(serverUrl) } @@ -125,6 +151,7 @@ app.whenReady().then(createWindow) app.on('window-all-closed', () => { if (process.platform !== 'darwin') { + stopServerProcess() app.quit() } }) @@ -136,8 +163,5 @@ app.on('activate', () => { }) app.on('before-quit', () => { - if (serverProcess) { - serverProcess.kill() - serverProcess = null - } + stopServerProcess() })