-
Notifications
You must be signed in to change notification settings - Fork 2
/
AutoUpdateService.js
115 lines (105 loc) · 3.36 KB
/
AutoUpdateService.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
import EventEmitter from "events";
import log from "electron-log";
import { autoUpdater } from "electron-updater";
import { CancellationToken } from "builder-util-runtime";
import merge from "lodash.merge";
const isDevMode = process.execPath.match(/[\\/]electron/);
const defaultOptions = {
autoDownload: false
};
export default class AutoUpdateService extends EventEmitter {
constructor(options) {
super();
const self = this;
options = merge({}, defaultOptions, options || {});
log.transports.file.level = "debug";
autoUpdater.logger = log;
autoUpdater.autoDownload = options.autoDownload;
this._cancelToken = null;
this.isCheckingForUpdate = false;
this.isUpdateAvailable = false;
this.isDownloadingUpdate = false;
this.isRestartingForUpdate = false;
this.updateDownloaded = false;
autoUpdater.on("checking-for-update", () => {
self.isCheckingForUpdate = true;
self.emit("checking-for-update");
});
autoUpdater.on("update-not-available", () => {
self.isCheckingForUpdate = false;
self.isUpdateAvailable = false;
self.emit("update-not-available");
});
autoUpdater.on("update-available", updateInfo => {
self.isCheckingForUpdate = false;
self.isUpdateAvailable = true;
self.updateVersion = updateInfo.version;
self.updateReleaseName = updateInfo.releaseName;
self.updateReleaseNotes = updateInfo.releaseNotes;
self.emit("update-available", updateInfo);
});
autoUpdater.on("update-downloaded", path => {
self.updateDownloaded = true;
self._cancelToken = null;
self.emit("update-downloaded", path);
});
autoUpdater.on("error", errorInfo => {
if (self.isDownloadingUpdate) {
self.emit("download-error", errorInfo);
} else {
self.emit("error", errorInfo);
}
self.isCheckingForUpdate = false;
self.isDownloadingUpdate = false;
});
autoUpdater.on("download-progress", progress => {
self.emit("download-progress", progress);
});
}
checkForUpdates() {
if (isDevMode) {
this.emit("checking-for-update");
this.emit("update-not-available");
} else {
let promise = autoUpdater.checkForUpdates();
if (promise.catch) {
// avoid unhandled promise rejection
// error will be reported from the `error` event handler
promise.catch(() => {});
}
}
}
downloadUpdate() {
if (!isDevMode) {
this.isDownloadingUpdate = true;
if (this._cancelToken) {
this._cancelToken.cancel();
}
this._cancelToken = new CancellationToken();
let promise = autoUpdater.downloadUpdate(this._cancelToken);
if (promise.catch) {
// avoid unhandled promise rejection
// error will be reported from the `error` event handler
promise.catch(() => {});
}
}
}
cancelUpdate() {
if (this._cancelToken) {
this._cancelToken.cancel();
this._cancelToken = null;
this.isDownloadingUpdate = false;
}
}
installAndRelaunch() {
if (!isDevMode && this.updateDownloaded) {
this.restartingForUpdate = true;
let promise = autoUpdater.quitAndInstall(false, true);
if (promise.catch) {
// avoid unhandled promise rejection
// error will be reported from the `error` event handler
promise.catch(() => {});
}
}
}
}