import { app, ipcMain } from 'electron' import { type ProgressInfo, type UpdateDownloadedEvent, autoUpdater } from 'electron-updater' export function update(win: Electron.BrowserWindow) { // When set to false, the update download will be triggered through the API autoUpdater.autoDownload = false autoUpdater.disableWebInstaller = false autoUpdater.allowDowngrade = false // start check autoUpdater.on('checking-for-update', function () { }) // update available autoUpdater.on('update-available', (arg) => { win.webContents.send('update-can-available', { update: true, version: app.getVersion(), newVersion: arg?.version }) }) // update not available autoUpdater.on('update-not-available', (arg) => { win.webContents.send('update-can-available', { update: false, version: app.getVersion(), newVersion: arg?.version }) }) // Checking for updates ipcMain.handle('check-update', async () => { if (!app.isPackaged) { const error = new Error('The update feature is only available after the package.') return { message: error.message, error } } try { return await autoUpdater.checkForUpdatesAndNotify() } catch (error) { return { message: 'Network error', error } } }) // Start downloading and feedback on progress ipcMain.handle('start-download', (event) => { startDownload( (error, progressInfo) => { if (error) { // feedback download error message event.sender.send('update-error', { message: error.message, error }) } else { // feedback update progress message event.sender.send('download-progress', progressInfo) } }, () => { // feedback update downloaded message event.sender.send('update-downloaded') } ) }) // Install now ipcMain.handle('quit-and-install', () => { autoUpdater.quitAndInstall(false, true) }) } function startDownload( callback: (error: Error | null, info: ProgressInfo) => void, complete: (evnet: UpdateDownloadedEvent) => void, ) { autoUpdater.on('download-progress', info => callback(null, info)) autoUpdater.on('error', error => callback(error, null)) autoUpdater.on('update-downloaded', complete) autoUpdater.downloadUpdate() }