'use strict' const { app } = require('electron') const { EventEmitter } = require('events') const squirrelUpdate = require('@electron/internal/browser/api/auto-updater/squirrel-update-win') class AutoUpdater extends EventEmitter { quitAndInstall () { if (!this.updateAvailable) { return this.emitError('No update available, can\'t quit and install') } squirrelUpdate.processStart() app.quit() } getFeedURL () { return this.updateURL } setFeedURL (options) { let updateURL if (typeof options === 'object') { if (typeof options.url === 'string') { updateURL = options.url } else { throw new Error('Expected options object to contain a \'url\' string property in setFeedUrl call') } } else if (typeof options === 'string') { updateURL = options } else { throw new Error('Expected an options object with a \'url\' property to be provided') } this.updateURL = updateURL } checkForUpdates () { if (!this.updateURL) { return this.emitError('Update URL is not set') } if (!squirrelUpdate.supported()) { return this.emitError('Can not find Squirrel') } this.emit('checking-for-update') squirrelUpdate.checkForUpdate(this.updateURL, (error, update) => { if (error != null) { return this.emitError(error) } if (update == null) { return this.emit('update-not-available') } this.updateAvailable = true this.emit('update-available') squirrelUpdate.update(this.updateURL, (error) => { if (error != null) { return this.emitError(error) } const { releaseNotes, version } = update // Date is not available on Windows, so fake it. const date = new Date() this.emit('update-downloaded', {}, releaseNotes, version, date, this.updateURL, () => { this.quitAndInstall() }) }) }) } // Private: Emit both error object and message, this is to keep compatibility // with Old APIs. emitError (message) { this.emit('error', new Error(message), message) } } module.exports = new AutoUpdater()