Files
tk-electron-ai/main/updater.js
2025-10-28 19:40:13 +08:00

70 lines
2.4 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// main/updater.js
const { app, BrowserWindow, ipcMain } = require('electron')
const { autoUpdater } = require('electron-updater')
const log = require('electron-log')
Object.assign(console, log.functions)
const updaterState = {
updateInProgress: false,
updateDownloaded: false,
pendingNavs: [],
}
function flushPendingNavs() {
const fns = updaterState.pendingNavs.slice()
updaterState.pendingNavs = []
for (const fn of fns) try { fn() } catch (e) { console.warn('[Nav defer err]', e) }
}
function broadcast(channel, payload) {
BrowserWindow.getAllWindows().forEach(w => !w.isDestroyed() && w.webContents.send(channel, payload))
}
function registerUpdater() {
autoUpdater.logger = log
autoUpdater.logger.transports.file.level = 'info'
autoUpdater.autoDownload = true
autoUpdater.autoInstallOnAppQuit = false
autoUpdater.on('checking-for-update', () => console.log('[updater] checking...'))
autoUpdater.on('update-available', (info) => {
updaterState.updateInProgress = true
console.log('[updater] available', info.version)
broadcast('update:available', info)
})
autoUpdater.on('update-not-available', () => {
console.log('[updater] not-available')
updaterState.updateInProgress = false
flushPendingNavs()
})
let lastSend = 0
autoUpdater.on('download-progress', (p) => {
updaterState.updateInProgress = true
const now = Date.now()
if (now - lastSend > 150) {
lastSend = now
broadcast('update:progress', p)
}
const win = BrowserWindow.getAllWindows()[0]
if (win) win.setProgressBar(p.percent / 100)
})
autoUpdater.on('update-downloaded', (info) => {
console.log('[updater] downloaded')
updaterState.updateInProgress = true
updaterState.updateDownloaded = true
broadcast('update:downloaded', info)
// 想要自动安装autoUpdater.quitAndInstall(false, true)
})
autoUpdater.on('error', (err) => {
console.error('[updater] error', err)
broadcast('update:error', { message: String(err) })
updaterState.updateInProgress = false
flushPendingNavs()
})
ipcMain.handle('update:quitAndInstall', () => autoUpdater.quitAndInstall(false, true))
ipcMain.handle('update:checkNow', () => autoUpdater.checkForUpdates())
autoUpdater.checkForUpdates()
}
module.exports = { registerUpdater, updaterState }