feat(updater): add UpdaterService wrapping electron-updater lifecycle

This commit is contained in:
2026-06-08 06:12:04 +05:30
parent 57c8f92f42
commit 2e41b59da5
2 changed files with 102 additions and 0 deletions
+42
View File
@@ -0,0 +1,42 @@
const { EventEmitter } = require('events');
const DEBOUNCE_MS = 60_000;
class UpdaterService extends EventEmitter {
constructor(autoUpdater) {
super();
this.autoUpdater = autoUpdater;
this.state = 'idle';
this.lastCheckAt = 0;
this._wire();
}
_wire() {
const au = this.autoUpdater;
au.on('checking-for-update', () => this._emit({ state: 'checking' }));
au.on('update-available', (info) => this._emit({ state: 'available', version: info.version }));
au.on('download-progress', (p) => this._emit({ state: 'downloading', percent: p.percent }));
au.on('update-downloaded', (info) => this._emit({ state: 'ready', version: info.version }));
au.on('update-not-available', () => this._emit({ state: 'idle' }));
au.on('error', (err) => {
const code = err && /ENOTFOUND|ETIMEDOUT|ECONNREFUSED/.test(err.message) ? 'NETWORK' : 'UNKNOWN';
this._emit({ state: 'error', code });
});
}
_emit(payload) {
this.state = payload.state;
this.emit('status', payload);
}
async check() {
if (Date.now() - this.lastCheckAt < DEBOUNCE_MS) return;
this.lastCheckAt = Date.now();
await this.autoUpdater.checkForUpdates();
}
install() {
this.autoUpdater.quitAndInstall();
}
}
module.exports = { UpdaterService };