From 9e09d4a56229c0fe8837ce7e091f5c2de3431b25 Mon Sep 17 00:00:00 2001 From: Lightning Pixel Date: Thu, 26 Mar 2026 14:18:23 +0100 Subject: [PATCH] fix(infra): fix auto updater --- electron/main/ipc-handlers.ts | 4 +++- electron/main/updater.ts | 24 ++++++++++++++++++++++++ package.json | 1 + 3 files changed, 28 insertions(+), 1 deletion(-) diff --git a/electron/main/ipc-handlers.ts b/electron/main/ipc-handlers.ts index 8083694..831dda3 100644 --- a/electron/main/ipc-handlers.ts +++ b/electron/main/ipc-handlers.ts @@ -574,7 +574,9 @@ export function setupIpcHandlers(pythonBridge: PythonBridge, getWindow: WindowGe }) ipcMain.handle('updater:quitAndInstall', () => { - autoUpdater.quitAndInstall(false, true) + app.removeAllListeners('window-all-closed') + BrowserWindow.getAllWindows().forEach(w => w.destroy()) + autoUpdater.quitAndInstall(true, true) }) // Update FastAPI paths at runtime (without restarting) diff --git a/electron/main/updater.ts b/electron/main/updater.ts index 262748b..c04174b 100644 --- a/electron/main/updater.ts +++ b/electron/main/updater.ts @@ -1,10 +1,31 @@ import { app, BrowserWindow } from 'electron' import { autoUpdater } from 'electron-updater' +import { existsSync, rmSync, writeFileSync, readFileSync } from 'fs' +import { join } from 'path' import { logger } from './logger' type WindowGetter = () => BrowserWindow | null +function pendingFilePath(): string { + return join(app.getPath('userData'), '.last-update-installer') +} + +function cleanupLastInstaller(): void { + const marker = pendingFilePath() + if (!existsSync(marker)) return + try { + const installerPath = readFileSync(marker, 'utf-8').trim() + if (existsSync(installerPath)) { + rmSync(installerPath) + logger.info(`[updater] Cleaned up installer: ${installerPath}`) + } + rmSync(marker) + } catch {} +} + export function initAutoUpdater(getWindow: WindowGetter): void { + cleanupLastInstaller() + // eslint-disable-next-line @typescript-eslint/no-explicit-any autoUpdater.logger = logger as any autoUpdater.autoDownload = false @@ -30,6 +51,9 @@ export function initAutoUpdater(getWindow: WindowGetter): void { autoUpdater.on('update-downloaded', (info) => { logger.info(`[updater] Patch update ${info.version} downloaded — showing badge`) + try { + writeFileSync(pendingFilePath(), info.downloadedFile, 'utf-8') + } catch {} getWindow()?.webContents.send('updater:patch-ready', { version: info.version }) }) diff --git a/package.json b/package.json index 183af65..7bc3bea 100644 --- a/package.json +++ b/package.json @@ -74,6 +74,7 @@ }, "win": { "target": "nsis", + "artifactName": "${productName}-Setup-${version}.${ext}", "icon": "resources/icons/icon.ico", "extraResources": [ {