electron-updater 4.3.8 → 4.3.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +22 -0
- package/out/AppAdapter.js +19 -28
- package/out/AppAdapter.js.map +1 -1
- package/out/AppImageUpdater.js +103 -195
- package/out/AppImageUpdater.js.map +1 -1
- package/out/AppUpdater.d.ts +1 -1
- package/out/AppUpdater.js +517 -771
- package/out/AppUpdater.js.map +1 -1
- package/out/BaseUpdater.js +79 -103
- package/out/BaseUpdater.js.map +1 -1
- package/out/DownloadedUpdateHelper.js +150 -223
- package/out/DownloadedUpdateHelper.js.map +1 -1
- package/out/ElectronAppAdapter.js +35 -63
- package/out/ElectronAppAdapter.js.map +1 -1
- package/out/MacUpdater.js +132 -201
- package/out/MacUpdater.js.map +1 -1
- package/out/NoOpLogger.d.ts +6 -0
- package/out/NoOpLogger.js +19 -0
- package/out/NoOpLogger.js.map +1 -0
- package/out/NsisUpdater.js +199 -345
- package/out/NsisUpdater.js.map +1 -1
- package/out/differentialDownloader/DataSplitter.js +180 -252
- package/out/differentialDownloader/DataSplitter.js.map +1 -1
- package/out/differentialDownloader/DifferentialDownloader.d.ts +1 -1
- package/out/differentialDownloader/DifferentialDownloader.js +242 -355
- package/out/differentialDownloader/DifferentialDownloader.js.map +1 -1
- package/out/differentialDownloader/FileWithEmbeddedBlockMapDifferentialDownloader.js +29 -65
- package/out/differentialDownloader/FileWithEmbeddedBlockMapDifferentialDownloader.js.map +1 -1
- package/out/differentialDownloader/GenericDifferentialDownloader.js +7 -21
- package/out/differentialDownloader/GenericDifferentialDownloader.js.map +1 -1
- package/out/differentialDownloader/ProgressDifferentialDownloadCallbackTransform.js +79 -107
- package/out/differentialDownloader/ProgressDifferentialDownloadCallbackTransform.js.map +1 -1
- package/out/differentialDownloader/downloadPlanBuilder.js +99 -123
- package/out/differentialDownloader/downloadPlanBuilder.js.map +1 -1
- package/out/differentialDownloader/multipleRangeDownloader.js +99 -148
- package/out/differentialDownloader/multipleRangeDownloader.js.map +1 -1
- package/out/electronHttpExecutor.js +73 -106
- package/out/electronHttpExecutor.js.map +1 -1
- package/out/event.d.ts +35 -0
- package/out/event.js +39 -0
- package/out/event.js.map +1 -0
- package/out/log.d.ts +11 -0
- package/out/log.js +19 -0
- package/out/log.js.map +1 -0
- package/out/main.d.ts +1 -3
- package/out/main.js +60 -196
- package/out/main.js.map +1 -1
- package/out/providerFactory.js +49 -105
- package/out/providerFactory.js.map +1 -1
- package/out/providers/BintrayProvider.d.ts +2 -2
- package/out/providers/BintrayProvider.js +40 -95
- package/out/providers/BintrayProvider.js.map +1 -1
- package/out/providers/GenericProvider.d.ts +2 -2
- package/out/providers/GenericProvider.js +46 -80
- package/out/providers/GenericProvider.js.map +1 -1
- package/out/providers/GitHubProvider.d.ts +2 -2
- package/out/providers/GitHubProvider.js +122 -201
- package/out/providers/GitHubProvider.js.map +1 -1
- package/out/providers/PrivateGitHubProvider.js +87 -165
- package/out/providers/PrivateGitHubProvider.js.map +1 -1
- package/out/providers/Provider.js +122 -173
- package/out/providers/Provider.js.map +1 -1
- package/out/util.d.ts +5 -0
- package/out/util.js +42 -0
- package/out/util.js.map +1 -0
- package/out/windowsExecutableCodeSignatureVerifier.js +99 -139
- package/out/windowsExecutableCodeSignatureVerifier.js.map +1 -1
- package/package.json +33 -31
|
@@ -1,243 +1,170 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
const data = require("crypto");
|
|
11
|
-
|
|
12
|
-
_crypto = function () {
|
|
13
|
-
return data;
|
|
14
|
-
};
|
|
15
|
-
|
|
16
|
-
return data;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
var _fs = require("fs");
|
|
20
|
-
|
|
21
|
-
function _lodash() {
|
|
22
|
-
const data = _interopRequireDefault(require("lodash.isequal"));
|
|
23
|
-
|
|
24
|
-
_lodash = function () {
|
|
25
|
-
return data;
|
|
26
|
-
};
|
|
27
|
-
|
|
28
|
-
return data;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
function _fsExtra() {
|
|
32
|
-
const data = require("fs-extra");
|
|
33
|
-
|
|
34
|
-
_fsExtra = function () {
|
|
35
|
-
return data;
|
|
36
|
-
};
|
|
37
|
-
|
|
38
|
-
return data;
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
var path = _interopRequireWildcard(require("path"));
|
|
42
|
-
|
|
43
|
-
function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }
|
|
44
|
-
|
|
45
|
-
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
46
|
-
|
|
47
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
48
|
-
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createTempUpdateFile = exports.DownloadedUpdateHelper = void 0;
|
|
4
|
+
const crypto_1 = require("crypto");
|
|
5
|
+
const fs_1 = require("fs");
|
|
6
|
+
// @ts-ignore
|
|
7
|
+
const isEqual = require("lodash.isequal");
|
|
8
|
+
const fs_extra_1 = require("fs-extra");
|
|
9
|
+
const path = require("path");
|
|
49
10
|
/** @private **/
|
|
50
11
|
class DownloadedUpdateHelper {
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
get downloadedFileInfo() {
|
|
61
|
-
return this._downloadedFileInfo;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
get file() {
|
|
65
|
-
return this._file;
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
get packageFile() {
|
|
69
|
-
return this._packageFile;
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
get cacheDirForPendingUpdate() {
|
|
73
|
-
return path.join(this.cacheDir, "pending");
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
async validateDownloadedPath(updateFile, updateInfo, fileInfo, logger) {
|
|
77
|
-
if (this.versionInfo != null && this.file === updateFile && this.fileInfo != null) {
|
|
78
|
-
// update has already been downloaded from this running instance
|
|
79
|
-
// check here only existence, not checksum
|
|
80
|
-
if ((0, _lodash().default)(this.versionInfo, updateInfo) && (0, _lodash().default)(this.fileInfo.info, fileInfo.info) && (await (0, _fsExtra().pathExists)(updateFile))) {
|
|
81
|
-
return updateFile;
|
|
82
|
-
} else {
|
|
83
|
-
return null;
|
|
84
|
-
}
|
|
85
|
-
} // update has already been downloaded from some previous app launch
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
const cachedUpdateFile = await this.getValidCachedUpdateFile(fileInfo, logger);
|
|
89
|
-
|
|
90
|
-
if (cachedUpdateFile === null) {
|
|
91
|
-
return null;
|
|
12
|
+
constructor(cacheDir) {
|
|
13
|
+
this.cacheDir = cacheDir;
|
|
14
|
+
this._file = null;
|
|
15
|
+
this._packageFile = null;
|
|
16
|
+
this.versionInfo = null;
|
|
17
|
+
this.fileInfo = null;
|
|
18
|
+
this._downloadedFileInfo = null;
|
|
92
19
|
}
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
this._file = cachedUpdateFile;
|
|
96
|
-
return cachedUpdateFile;
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
async setDownloadedFile(downloadedFile, packageFile, versionInfo, fileInfo, updateFileName, isSaveCache) {
|
|
100
|
-
this._file = downloadedFile;
|
|
101
|
-
this._packageFile = packageFile;
|
|
102
|
-
this.versionInfo = versionInfo;
|
|
103
|
-
this.fileInfo = fileInfo;
|
|
104
|
-
this._downloadedFileInfo = {
|
|
105
|
-
fileName: updateFileName,
|
|
106
|
-
sha512: fileInfo.info.sha512,
|
|
107
|
-
isAdminRightsRequired: fileInfo.info.isAdminRightsRequired === true
|
|
108
|
-
};
|
|
109
|
-
|
|
110
|
-
if (isSaveCache) {
|
|
111
|
-
await (0, _fsExtra().outputJson)(this.getUpdateInfoFile(), this._downloadedFileInfo);
|
|
20
|
+
get downloadedFileInfo() {
|
|
21
|
+
return this._downloadedFileInfo;
|
|
112
22
|
}
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
async clear() {
|
|
116
|
-
this._file = null;
|
|
117
|
-
this._packageFile = null;
|
|
118
|
-
this.versionInfo = null;
|
|
119
|
-
this.fileInfo = null;
|
|
120
|
-
await this.cleanCacheDirForPendingUpdate();
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
async cleanCacheDirForPendingUpdate() {
|
|
124
|
-
try {
|
|
125
|
-
// remove stale data
|
|
126
|
-
await (0, _fsExtra().emptyDir)(this.cacheDirForPendingUpdate);
|
|
127
|
-
} catch (ignore) {// ignore
|
|
23
|
+
get file() {
|
|
24
|
+
return this._file;
|
|
128
25
|
}
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
* Returns "update-info.json" which is created in the update cache directory's "pending" subfolder after the first update is downloaded. If the update file does not exist then the cache is cleared and recreated. If the update file exists then its properties are validated.
|
|
132
|
-
* @param fileInfo
|
|
133
|
-
* @param logger
|
|
134
|
-
*/
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
async getValidCachedUpdateFile(fileInfo, logger) {
|
|
138
|
-
var _a;
|
|
139
|
-
|
|
140
|
-
const updateInfoFilePath = this.getUpdateInfoFile();
|
|
141
|
-
const doesUpdateInfoFileExist = await (0, _fsExtra().pathExistsSync)(updateInfoFilePath);
|
|
142
|
-
|
|
143
|
-
if (!doesUpdateInfoFileExist) {
|
|
144
|
-
return null;
|
|
26
|
+
get packageFile() {
|
|
27
|
+
return this._packageFile;
|
|
145
28
|
}
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
try {
|
|
150
|
-
cachedInfo = await (0, _fsExtra().readJson)(updateInfoFilePath);
|
|
151
|
-
} catch (error) {
|
|
152
|
-
let message = `No cached update info available`;
|
|
153
|
-
|
|
154
|
-
if (error.code !== "ENOENT") {
|
|
155
|
-
await this.cleanCacheDirForPendingUpdate();
|
|
156
|
-
message += ` (error on read: ${error.message})`;
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
logger.info(message);
|
|
160
|
-
return null;
|
|
29
|
+
get cacheDirForPendingUpdate() {
|
|
30
|
+
return path.join(this.cacheDir, "pending");
|
|
161
31
|
}
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
32
|
+
async validateDownloadedPath(updateFile, updateInfo, fileInfo, logger) {
|
|
33
|
+
if (this.versionInfo != null && this.file === updateFile && this.fileInfo != null) {
|
|
34
|
+
// update has already been downloaded from this running instance
|
|
35
|
+
// check here only existence, not checksum
|
|
36
|
+
if (isEqual(this.versionInfo, updateInfo) && isEqual(this.fileInfo.info, fileInfo.info) && (await fs_extra_1.pathExists(updateFile))) {
|
|
37
|
+
return updateFile;
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
// update has already been downloaded from some previous app launch
|
|
44
|
+
const cachedUpdateFile = await this.getValidCachedUpdateFile(fileInfo, logger);
|
|
45
|
+
if (cachedUpdateFile === null) {
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
logger.info(`Update has already been downloaded to ${updateFile}).`);
|
|
49
|
+
this._file = cachedUpdateFile;
|
|
50
|
+
return cachedUpdateFile;
|
|
169
51
|
}
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
52
|
+
async setDownloadedFile(downloadedFile, packageFile, versionInfo, fileInfo, updateFileName, isSaveCache) {
|
|
53
|
+
this._file = downloadedFile;
|
|
54
|
+
this._packageFile = packageFile;
|
|
55
|
+
this.versionInfo = versionInfo;
|
|
56
|
+
this.fileInfo = fileInfo;
|
|
57
|
+
this._downloadedFileInfo = {
|
|
58
|
+
fileName: updateFileName,
|
|
59
|
+
sha512: fileInfo.info.sha512,
|
|
60
|
+
isAdminRightsRequired: fileInfo.info.isAdminRightsRequired === true,
|
|
61
|
+
};
|
|
62
|
+
if (isSaveCache) {
|
|
63
|
+
await fs_extra_1.outputJson(this.getUpdateInfoFile(), this._downloadedFileInfo);
|
|
64
|
+
}
|
|
175
65
|
}
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
66
|
+
async clear() {
|
|
67
|
+
this._file = null;
|
|
68
|
+
this._packageFile = null;
|
|
69
|
+
this.versionInfo = null;
|
|
70
|
+
this.fileInfo = null;
|
|
71
|
+
await this.cleanCacheDirForPendingUpdate();
|
|
72
|
+
}
|
|
73
|
+
async cleanCacheDirForPendingUpdate() {
|
|
74
|
+
try {
|
|
75
|
+
// remove stale data
|
|
76
|
+
await fs_extra_1.emptyDir(this.cacheDirForPendingUpdate);
|
|
77
|
+
}
|
|
78
|
+
catch (ignore) {
|
|
79
|
+
// ignore
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Returns "update-info.json" which is created in the update cache directory's "pending" subfolder after the first update is downloaded. If the update file does not exist then the cache is cleared and recreated. If the update file exists then its properties are validated.
|
|
84
|
+
* @param fileInfo
|
|
85
|
+
* @param logger
|
|
86
|
+
*/
|
|
87
|
+
async getValidCachedUpdateFile(fileInfo, logger) {
|
|
88
|
+
var _a;
|
|
89
|
+
const updateInfoFilePath = this.getUpdateInfoFile();
|
|
90
|
+
const doesUpdateInfoFileExist = await fs_extra_1.pathExists(updateInfoFilePath);
|
|
91
|
+
if (!doesUpdateInfoFileExist) {
|
|
92
|
+
return null;
|
|
93
|
+
}
|
|
94
|
+
let cachedInfo;
|
|
95
|
+
try {
|
|
96
|
+
cachedInfo = await fs_extra_1.readJson(updateInfoFilePath);
|
|
97
|
+
}
|
|
98
|
+
catch (error) {
|
|
99
|
+
let message = `No cached update info available`;
|
|
100
|
+
if (error.code !== "ENOENT") {
|
|
101
|
+
await this.cleanCacheDirForPendingUpdate();
|
|
102
|
+
message += ` (error on read: ${error.message})`;
|
|
103
|
+
}
|
|
104
|
+
logger.info(message);
|
|
105
|
+
return null;
|
|
106
|
+
}
|
|
107
|
+
const isCachedInfoFileNameValid = (_a = (cachedInfo === null || cachedInfo === void 0 ? void 0 : cachedInfo.fileName) !== null) !== null && _a !== void 0 ? _a : false;
|
|
108
|
+
if (!isCachedInfoFileNameValid) {
|
|
109
|
+
logger.warn(`Cached update info is corrupted: no fileName, directory for cached update will be cleaned`);
|
|
110
|
+
await this.cleanCacheDirForPendingUpdate();
|
|
111
|
+
return null;
|
|
112
|
+
}
|
|
113
|
+
if (fileInfo.info.sha512 !== cachedInfo.sha512) {
|
|
114
|
+
logger.info(`Cached update sha512 checksum doesn't match the latest available update. New update must be downloaded. Cached: ${cachedInfo.sha512}, expected: ${fileInfo.info.sha512}. Directory for cached update will be cleaned`);
|
|
115
|
+
await this.cleanCacheDirForPendingUpdate();
|
|
116
|
+
return null;
|
|
117
|
+
}
|
|
118
|
+
const updateFile = path.join(this.cacheDirForPendingUpdate, cachedInfo.fileName);
|
|
119
|
+
if (!(await fs_extra_1.pathExists(updateFile))) {
|
|
120
|
+
logger.info("Cached update file doesn't exist");
|
|
121
|
+
return null;
|
|
122
|
+
}
|
|
123
|
+
const sha512 = await hashFile(updateFile);
|
|
124
|
+
if (fileInfo.info.sha512 !== sha512) {
|
|
125
|
+
logger.warn(`Sha512 checksum doesn't match the latest available update. New update must be downloaded. Cached: ${sha512}, expected: ${fileInfo.info.sha512}`);
|
|
126
|
+
await this.cleanCacheDirForPendingUpdate();
|
|
127
|
+
return null;
|
|
128
|
+
}
|
|
129
|
+
this._downloadedFileInfo = cachedInfo;
|
|
130
|
+
return updateFile;
|
|
182
131
|
}
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
if (fileInfo.info.sha512 !== sha512) {
|
|
187
|
-
logger.warn(`Sha512 checksum doesn't match the latest available update. New update must be downloaded. Cached: ${sha512}, expected: ${fileInfo.info.sha512}`);
|
|
188
|
-
await this.cleanCacheDirForPendingUpdate();
|
|
189
|
-
return null;
|
|
132
|
+
getUpdateInfoFile() {
|
|
133
|
+
return path.join(this.cacheDirForPendingUpdate, "update-info.json");
|
|
190
134
|
}
|
|
191
|
-
|
|
192
|
-
this._downloadedFileInfo = cachedInfo;
|
|
193
|
-
return updateFile;
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
getUpdateInfoFile() {
|
|
197
|
-
return path.join(this.cacheDirForPendingUpdate, "update-info.json");
|
|
198
|
-
}
|
|
199
|
-
|
|
200
135
|
}
|
|
201
|
-
|
|
202
136
|
exports.DownloadedUpdateHelper = DownloadedUpdateHelper;
|
|
203
|
-
|
|
204
137
|
function hashFile(file, algorithm = "sha512", encoding = "base64", options) {
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
}).pipe(hash, {
|
|
216
|
-
end: false
|
|
138
|
+
return new Promise((resolve, reject) => {
|
|
139
|
+
const hash = crypto_1.createHash(algorithm);
|
|
140
|
+
hash.on("error", reject).setEncoding(encoding);
|
|
141
|
+
fs_1.createReadStream(file, { ...options, highWaterMark: 1024 * 1024 /* better to use more memory but hash faster */ })
|
|
142
|
+
.on("error", reject)
|
|
143
|
+
.on("end", () => {
|
|
144
|
+
hash.end();
|
|
145
|
+
resolve(hash.read());
|
|
146
|
+
})
|
|
147
|
+
.pipe(hash, { end: false });
|
|
217
148
|
});
|
|
218
|
-
});
|
|
219
149
|
}
|
|
220
|
-
|
|
221
150
|
async function createTempUpdateFile(name, cacheDir, log) {
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
151
|
+
// https://github.com/electron-userland/electron-builder/pull/2474#issuecomment-366481912
|
|
152
|
+
let nameCounter = 0;
|
|
153
|
+
let result = path.join(cacheDir, name);
|
|
154
|
+
for (let i = 0; i < 3; i++) {
|
|
155
|
+
try {
|
|
156
|
+
await fs_extra_1.unlink(result);
|
|
157
|
+
return result;
|
|
158
|
+
}
|
|
159
|
+
catch (e) {
|
|
160
|
+
if (e.code === "ENOENT") {
|
|
161
|
+
return result;
|
|
162
|
+
}
|
|
163
|
+
log.warn(`Error on remove temp update file: ${e}`);
|
|
164
|
+
result = path.join(cacheDir, `${nameCounter++}-${name}`);
|
|
165
|
+
}
|
|
237
166
|
}
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
}
|
|
242
|
-
// __ts-babel@6.0.4
|
|
167
|
+
return result;
|
|
168
|
+
}
|
|
169
|
+
exports.createTempUpdateFile = createTempUpdateFile;
|
|
243
170
|
//# sourceMappingURL=DownloadedUpdateHelper.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/DownloadedUpdateHelper.ts"],"names":[],"mappings":"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","sourcesContent":["import { UpdateInfo } from \"builder-util-runtime\"\nimport { createHash } from \"crypto\"\nimport { createReadStream } from \"fs\"\nimport isEqual from \"lodash.isequal\"\nimport { Logger, ResolvedUpdateFileInfo } from \"./main\"\nimport { pathExists, readJson, emptyDir, outputJson, unlink, pathExistsSync } from \"fs-extra\"\nimport * as path from \"path\"\n\n/** @private **/\nexport class DownloadedUpdateHelper {\n private _file: string | null = null\n private _packageFile: string | null = null\n\n private versionInfo: UpdateInfo | null = null\n private fileInfo: ResolvedUpdateFileInfo | null = null\n\n constructor(readonly cacheDir: string) {\n }\n\n private _downloadedFileInfo: CachedUpdateInfo | null = null\n get downloadedFileInfo(): CachedUpdateInfo | null {\n return this._downloadedFileInfo\n }\n\n get file(): string | null {\n return this._file\n }\n\n get packageFile(): string | null {\n return this._packageFile\n }\n\n get cacheDirForPendingUpdate(): string {\n return path.join(this.cacheDir, \"pending\")\n }\n\n async validateDownloadedPath(updateFile: string, updateInfo: UpdateInfo, fileInfo: ResolvedUpdateFileInfo, logger: Logger): Promise<string | null> {\n if (this.versionInfo != null && this.file === updateFile && this.fileInfo != null) {\n // update has already been downloaded from this running instance\n // check here only existence, not checksum\n if (isEqual(this.versionInfo, updateInfo) && isEqual(this.fileInfo.info, fileInfo.info) && (await pathExists(updateFile))) {\n return updateFile\n }\n else {\n return null\n }\n }\n\n // update has already been downloaded from some previous app launch\n const cachedUpdateFile = await this.getValidCachedUpdateFile(fileInfo, logger)\n if (cachedUpdateFile === null) {\n return null\n }\n logger.info(`Update has already been downloaded to ${updateFile}).`)\n this._file = cachedUpdateFile\n return cachedUpdateFile\n }\n\n async setDownloadedFile(downloadedFile: string, packageFile: string | null, versionInfo: UpdateInfo, fileInfo: ResolvedUpdateFileInfo, updateFileName: string, isSaveCache: boolean): Promise<void> {\n this._file = downloadedFile\n this._packageFile = packageFile\n this.versionInfo = versionInfo\n this.fileInfo = fileInfo\n this._downloadedFileInfo = {\n fileName: updateFileName,\n sha512: fileInfo.info.sha512,\n isAdminRightsRequired: fileInfo.info.isAdminRightsRequired === true,\n }\n\n if (isSaveCache) {\n await outputJson(this.getUpdateInfoFile(), this._downloadedFileInfo)\n }\n }\n\n async clear(): Promise<void> {\n this._file = null\n this._packageFile = null\n this.versionInfo = null\n this.fileInfo = null\n await this.cleanCacheDirForPendingUpdate()\n }\n\n private async cleanCacheDirForPendingUpdate(): Promise<void> {\n try {\n // remove stale data\n await emptyDir(this.cacheDirForPendingUpdate)\n }\n catch (ignore) {\n // ignore\n }\n }\n\n /**\n * Returns \"update-info.json\" which is created in the update cache directory's \"pending\" subfolder after the first update is downloaded. If the update file does not exist then the cache is cleared and recreated. If the update file exists then its properties are validated.\n * @param fileInfo\n * @param logger\n */\n private async getValidCachedUpdateFile(fileInfo: ResolvedUpdateFileInfo, logger: Logger): Promise<string | null> {\n const updateInfoFilePath: string = this.getUpdateInfoFile()\n\n const doesUpdateInfoFileExist = await pathExistsSync(updateInfoFilePath);\n if(!doesUpdateInfoFileExist) {\n return null;\n }\n\n\n let cachedInfo: CachedUpdateInfo\n try {\n cachedInfo = await readJson(updateInfoFilePath)\n }\n catch (error) {\n let message = `No cached update info available`\n if (error.code !== \"ENOENT\") {\n await this.cleanCacheDirForPendingUpdate()\n message += ` (error on read: ${error.message})`\n }\n logger.info(message)\n return null\n }\n\n const isCachedInfoFileNameValid = cachedInfo?.fileName !== null ?? false\n if (!isCachedInfoFileNameValid) {\n logger.warn(`Cached update info is corrupted: no fileName, directory for cached update will be cleaned`)\n await this.cleanCacheDirForPendingUpdate()\n return null\n }\n\n if (fileInfo.info.sha512 !== cachedInfo.sha512) {\n logger.info(`Cached update sha512 checksum doesn't match the latest available update. New update must be downloaded. Cached: ${cachedInfo.sha512}, expected: ${fileInfo.info.sha512}. Directory for cached update will be cleaned`)\n await this.cleanCacheDirForPendingUpdate()\n return null\n }\n\n const updateFile = path.join(this.cacheDirForPendingUpdate, cachedInfo.fileName)\n if (!(await pathExists(updateFile))) {\n logger.info(\"Cached update file doesn't exist\")\n return null\n }\n\n const sha512 = await hashFile(updateFile)\n if (fileInfo.info.sha512 !== sha512) {\n logger.warn(`Sha512 checksum doesn't match the latest available update. New update must be downloaded. Cached: ${sha512}, expected: ${fileInfo.info.sha512}`)\n await this.cleanCacheDirForPendingUpdate()\n return null\n }\n this._downloadedFileInfo = cachedInfo\n return updateFile\n }\n\n private getUpdateInfoFile(): string {\n return path.join(this.cacheDirForPendingUpdate, \"update-info.json\")\n }\n}\n\ninterface CachedUpdateInfo {\n fileName: string\n sha512: string\n readonly isAdminRightsRequired: boolean\n}\n\nfunction hashFile(file: string, algorithm = \"sha512\", encoding: \"base64\" | \"hex\" = \"base64\", options?: any): Promise<string> {\n return new Promise<string>((resolve, reject) => {\n const hash = createHash(algorithm)\n hash\n .on(\"error\", reject)\n .setEncoding(encoding)\n\n createReadStream(file, {...options, highWaterMark: 1024 * 1024 /* better to use more memory but hash faster */})\n .on(\"error\", reject)\n .on(\"end\", () => {\n hash.end()\n resolve(hash.read() as string)\n })\n .pipe(hash, {end: false})\n })\n}\n\nexport async function createTempUpdateFile(name: string, cacheDir: string, log: Logger): Promise<string> {\n // https://github.com/electron-userland/electron-builder/pull/2474#issuecomment-366481912\n let nameCounter = 0\n let result = path.join(cacheDir, name)\n for (let i = 0; i < 3; i++) {\n try {\n await unlink(result)\n return result\n }\n catch (e) {\n if (e.code === \"ENOENT\") {\n return result\n }\n\n log.warn(`Error on remove temp update file: ${e}`)\n result = path.join(cacheDir, `${nameCounter++}-${name}`)\n }\n }\n return result\n}\n"],"sourceRoot":""}
|
|
1
|
+
{"version":3,"file":"DownloadedUpdateHelper.js","sourceRoot":"","sources":["../src/DownloadedUpdateHelper.ts"],"names":[],"mappings":"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","sourcesContent":["import { UpdateInfo } from \"builder-util-runtime\"\nimport { createHash } from \"crypto\"\nimport { createReadStream } from \"fs\"\n// @ts-ignore\nimport * as isEqual from \"lodash.isequal\"\nimport { Logger, ResolvedUpdateFileInfo } from \"./main\"\nimport { pathExists, readJson, emptyDir, outputJson, unlink } from \"fs-extra\"\nimport * as path from \"path\"\n\n/** @private **/\nexport class DownloadedUpdateHelper {\n private _file: string | null = null\n private _packageFile: string | null = null\n\n private versionInfo: UpdateInfo | null = null\n private fileInfo: ResolvedUpdateFileInfo | null = null\n\n constructor(readonly cacheDir: string) {}\n\n private _downloadedFileInfo: CachedUpdateInfo | null = null\n get downloadedFileInfo(): CachedUpdateInfo | null {\n return this._downloadedFileInfo\n }\n\n get file(): string | null {\n return this._file\n }\n\n get packageFile(): string | null {\n return this._packageFile\n }\n\n get cacheDirForPendingUpdate(): string {\n return path.join(this.cacheDir, \"pending\")\n }\n\n async validateDownloadedPath(updateFile: string, updateInfo: UpdateInfo, fileInfo: ResolvedUpdateFileInfo, logger: Logger): Promise<string | null> {\n if (this.versionInfo != null && this.file === updateFile && this.fileInfo != null) {\n // update has already been downloaded from this running instance\n // check here only existence, not checksum\n if (isEqual(this.versionInfo, updateInfo) && isEqual(this.fileInfo.info, fileInfo.info) && (await pathExists(updateFile))) {\n return updateFile\n } else {\n return null\n }\n }\n\n // update has already been downloaded from some previous app launch\n const cachedUpdateFile = await this.getValidCachedUpdateFile(fileInfo, logger)\n if (cachedUpdateFile === null) {\n return null\n }\n logger.info(`Update has already been downloaded to ${updateFile}).`)\n this._file = cachedUpdateFile\n return cachedUpdateFile\n }\n\n async setDownloadedFile(\n downloadedFile: string,\n packageFile: string | null,\n versionInfo: UpdateInfo,\n fileInfo: ResolvedUpdateFileInfo,\n updateFileName: string,\n isSaveCache: boolean\n ): Promise<void> {\n this._file = downloadedFile\n this._packageFile = packageFile\n this.versionInfo = versionInfo\n this.fileInfo = fileInfo\n this._downloadedFileInfo = {\n fileName: updateFileName,\n sha512: fileInfo.info.sha512,\n isAdminRightsRequired: fileInfo.info.isAdminRightsRequired === true,\n }\n\n if (isSaveCache) {\n await outputJson(this.getUpdateInfoFile(), this._downloadedFileInfo)\n }\n }\n\n async clear(): Promise<void> {\n this._file = null\n this._packageFile = null\n this.versionInfo = null\n this.fileInfo = null\n await this.cleanCacheDirForPendingUpdate()\n }\n\n private async cleanCacheDirForPendingUpdate(): Promise<void> {\n try {\n // remove stale data\n await emptyDir(this.cacheDirForPendingUpdate)\n } catch (ignore) {\n // ignore\n }\n }\n\n /**\n * Returns \"update-info.json\" which is created in the update cache directory's \"pending\" subfolder after the first update is downloaded. If the update file does not exist then the cache is cleared and recreated. If the update file exists then its properties are validated.\n * @param fileInfo\n * @param logger\n */\n private async getValidCachedUpdateFile(fileInfo: ResolvedUpdateFileInfo, logger: Logger): Promise<string | null> {\n const updateInfoFilePath: string = this.getUpdateInfoFile()\n\n const doesUpdateInfoFileExist = await pathExists(updateInfoFilePath)\n if (!doesUpdateInfoFileExist) {\n return null\n }\n\n let cachedInfo: CachedUpdateInfo\n try {\n cachedInfo = await readJson(updateInfoFilePath)\n } catch (error) {\n let message = `No cached update info available`\n if (error.code !== \"ENOENT\") {\n await this.cleanCacheDirForPendingUpdate()\n message += ` (error on read: ${error.message})`\n }\n logger.info(message)\n return null\n }\n\n const isCachedInfoFileNameValid = cachedInfo?.fileName !== null ?? false\n if (!isCachedInfoFileNameValid) {\n logger.warn(`Cached update info is corrupted: no fileName, directory for cached update will be cleaned`)\n await this.cleanCacheDirForPendingUpdate()\n return null\n }\n\n if (fileInfo.info.sha512 !== cachedInfo.sha512) {\n logger.info(\n `Cached update sha512 checksum doesn't match the latest available update. New update must be downloaded. Cached: ${cachedInfo.sha512}, expected: ${fileInfo.info.sha512}. Directory for cached update will be cleaned`\n )\n await this.cleanCacheDirForPendingUpdate()\n return null\n }\n\n const updateFile = path.join(this.cacheDirForPendingUpdate, cachedInfo.fileName)\n if (!(await pathExists(updateFile))) {\n logger.info(\"Cached update file doesn't exist\")\n return null\n }\n\n const sha512 = await hashFile(updateFile)\n if (fileInfo.info.sha512 !== sha512) {\n logger.warn(`Sha512 checksum doesn't match the latest available update. New update must be downloaded. Cached: ${sha512}, expected: ${fileInfo.info.sha512}`)\n await this.cleanCacheDirForPendingUpdate()\n return null\n }\n this._downloadedFileInfo = cachedInfo\n return updateFile\n }\n\n private getUpdateInfoFile(): string {\n return path.join(this.cacheDirForPendingUpdate, \"update-info.json\")\n }\n}\n\ninterface CachedUpdateInfo {\n fileName: string\n sha512: string\n readonly isAdminRightsRequired: boolean\n}\n\nfunction hashFile(file: string, algorithm = \"sha512\", encoding: \"base64\" | \"hex\" = \"base64\", options?: any): Promise<string> {\n return new Promise<string>((resolve, reject) => {\n const hash = createHash(algorithm)\n hash.on(\"error\", reject).setEncoding(encoding)\n\n createReadStream(file, { ...options, highWaterMark: 1024 * 1024 /* better to use more memory but hash faster */ })\n .on(\"error\", reject)\n .on(\"end\", () => {\n hash.end()\n resolve(hash.read() as string)\n })\n .pipe(hash, { end: false })\n })\n}\n\nexport async function createTempUpdateFile(name: string, cacheDir: string, log: Logger): Promise<string> {\n // https://github.com/electron-userland/electron-builder/pull/2474#issuecomment-366481912\n let nameCounter = 0\n let result = path.join(cacheDir, name)\n for (let i = 0; i < 3; i++) {\n try {\n await unlink(result)\n return result\n } catch (e) {\n if (e.code === \"ENOENT\") {\n return result\n }\n\n log.warn(`Error on remove temp update file: ${e}`)\n result = path.join(cacheDir, `${nameCounter++}-${name}`)\n }\n }\n return result\n}\n"]}
|
|
@@ -1,67 +1,39 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
3
|
exports.ElectronAppAdapter = void 0;
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
function _AppAdapter() {
|
|
11
|
-
const data = require("./AppAdapter");
|
|
12
|
-
|
|
13
|
-
_AppAdapter = function () {
|
|
14
|
-
return data;
|
|
15
|
-
};
|
|
16
|
-
|
|
17
|
-
return data;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }
|
|
21
|
-
|
|
22
|
-
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
23
|
-
|
|
4
|
+
const path = require("path");
|
|
5
|
+
const AppAdapter_1 = require("./AppAdapter");
|
|
24
6
|
class ElectronAppAdapter {
|
|
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
|
-
quit() {
|
|
58
|
-
this.app.quit();
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
onQuit(handler) {
|
|
62
|
-
this.app.once("quit", (_, exitCode) => handler(exitCode));
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
} exports.ElectronAppAdapter = ElectronAppAdapter;
|
|
66
|
-
// __ts-babel@6.0.4
|
|
7
|
+
constructor(app = require("electron").app) {
|
|
8
|
+
this.app = app;
|
|
9
|
+
}
|
|
10
|
+
whenReady() {
|
|
11
|
+
return this.app.whenReady();
|
|
12
|
+
}
|
|
13
|
+
get version() {
|
|
14
|
+
return this.app.getVersion();
|
|
15
|
+
}
|
|
16
|
+
get name() {
|
|
17
|
+
return this.app.getName();
|
|
18
|
+
}
|
|
19
|
+
get isPackaged() {
|
|
20
|
+
return this.app.isPackaged === true;
|
|
21
|
+
}
|
|
22
|
+
get appUpdateConfigPath() {
|
|
23
|
+
return this.isPackaged ? path.join(process.resourcesPath, "app-update.yml") : path.join(this.app.getAppPath(), "dev-app-update.yml");
|
|
24
|
+
}
|
|
25
|
+
get userDataPath() {
|
|
26
|
+
return this.app.getPath("userData");
|
|
27
|
+
}
|
|
28
|
+
get baseCachePath() {
|
|
29
|
+
return AppAdapter_1.getAppCacheDir();
|
|
30
|
+
}
|
|
31
|
+
quit() {
|
|
32
|
+
this.app.quit();
|
|
33
|
+
}
|
|
34
|
+
onQuit(handler) {
|
|
35
|
+
this.app.once("quit", (_, exitCode) => handler(exitCode));
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
exports.ElectronAppAdapter = ElectronAppAdapter;
|
|
67
39
|
//# sourceMappingURL=ElectronAppAdapter.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/ElectronAppAdapter.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ElectronAppAdapter.js","sourceRoot":"","sources":["../src/ElectronAppAdapter.ts"],"names":[],"mappings":";;;AAAA,6BAA4B;AAC5B,6CAAyD;AAEzD,MAAa,kBAAkB;IAC7B,YAA6B,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG;QAA7B,QAAG,GAAH,GAAG,CAA0B;IAAG,CAAC;IAE9D,SAAS;QACP,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,CAAA;IAC7B,CAAC;IAED,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,CAAA;IAC9B,CAAC;IAED,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAA;IAC3B,CAAC;IAED,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,GAAG,CAAC,UAAU,KAAK,IAAI,CAAA;IACrC,CAAC;IAED,IAAI,mBAAmB;QACrB,OAAO,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,aAAc,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,EAAE,oBAAoB,CAAC,CAAA;IACvI,CAAC;IAED,IAAI,YAAY;QACd,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;IACrC,CAAC;IAED,IAAI,aAAa;QACf,OAAO,2BAAc,EAAE,CAAA;IACzB,CAAC;IAED,IAAI;QACF,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAA;IACjB,CAAC;IAED,MAAM,CAAC,OAAmC;QACxC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAQ,EAAE,QAAgB,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAA;IAC1E,CAAC;CACF;AAtCD,gDAsCC","sourcesContent":["import * as path from \"path\"\nimport { AppAdapter, getAppCacheDir } from \"./AppAdapter\"\n\nexport class ElectronAppAdapter implements AppAdapter {\n constructor(private readonly app = require(\"electron\").app) {}\n\n whenReady(): Promise<void> {\n return this.app.whenReady()\n }\n\n get version(): string {\n return this.app.getVersion()\n }\n\n get name(): string {\n return this.app.getName()\n }\n\n get isPackaged(): boolean {\n return this.app.isPackaged === true\n }\n\n get appUpdateConfigPath(): string {\n return this.isPackaged ? path.join(process.resourcesPath!, \"app-update.yml\") : path.join(this.app.getAppPath(), \"dev-app-update.yml\")\n }\n\n get userDataPath(): string {\n return this.app.getPath(\"userData\")\n }\n\n get baseCachePath(): string {\n return getAppCacheDir()\n }\n\n quit(): void {\n this.app.quit()\n }\n\n onQuit(handler: (exitCode: number) => void): void {\n this.app.once(\"quit\", (_: Event, exitCode: number) => handler(exitCode))\n }\n}\n"]}
|