Files
16gagent/cases/mealprep-v2/electron/electron/updater.ts
T
2026-06-06 10:40:48 +08:00

88 lines
2.4 KiB
TypeScript

import { autoUpdater } from "electron-updater";
import { ipcMain, BrowserWindow } from "electron";
let updateAvailable = false;
let updateDownloaded = false;
export function setupUpdater(appName: string): void {
autoUpdater.autoDownload = false;
autoUpdater.autoInstallOnAppQuit = true;
autoUpdater.logger = {
info: (msg) => console.log("[updater]", msg),
warn: (msg) => console.warn("[updater]", msg),
error: (msg) => console.error("[updater]", msg),
debug: (msg) => console.debug("[updater]", msg),
};
autoUpdater.on("checking-for-update", () => {
console.log("[updater] Checking for updates...");
});
autoUpdater.on("update-available", (info) => {
updateAvailable = true;
console.log("[updater] Update available:", info.version);
broadcast("updater:available", info);
});
autoUpdater.on("update-not-available", (info) => {
console.log("[updater] Up to date:", info.version);
});
autoUpdater.on("download-progress", (progress) => {
broadcast("updater:progress", {
percent: progress.percent,
bytesPerSecond: progress.bytesPerSecond,
transferred: progress.transferred,
total: progress.total,
});
});
autoUpdater.on("update-downloaded", (info) => {
updateDownloaded = true;
console.log("[updater] Update downloaded:", info.version);
broadcast("updater:downloaded", info);
});
autoUpdater.on("error", (err) => {
console.error("[updater] Error:", err.message);
broadcast("updater:error", err.message);
});
ipcMain.handle("updater:check", async () => {
try {
const result = await autoUpdater.checkForUpdates();
return result?.updateInfo ?? null;
} catch (err) {
console.error("[updater] Check failed:", err);
return null;
}
});
ipcMain.handle("updater:download", async () => {
if (!updateAvailable) return;
try {
await autoUpdater.downloadUpdate();
} catch (err) {
console.error("[updater] Download failed:", err);
}
});
ipcMain.on("updater:quitAndInstall", () => {
if (updateDownloaded) {
autoUpdater.quitAndInstall(false, true);
}
});
setTimeout(() => {
autoUpdater.checkForUpdates().catch(() => {});
}, 10_000);
}
function broadcast(channel: string, data: unknown): void {
for (const win of BrowserWindow.getAllWindows()) {
if (!win.isDestroyed()) {
win.webContents.send(channel, data);
}
}
}