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.
Files changed (68) hide show
  1. package/LICENSE +22 -0
  2. package/out/AppAdapter.js +19 -28
  3. package/out/AppAdapter.js.map +1 -1
  4. package/out/AppImageUpdater.js +103 -195
  5. package/out/AppImageUpdater.js.map +1 -1
  6. package/out/AppUpdater.d.ts +1 -1
  7. package/out/AppUpdater.js +517 -771
  8. package/out/AppUpdater.js.map +1 -1
  9. package/out/BaseUpdater.js +79 -103
  10. package/out/BaseUpdater.js.map +1 -1
  11. package/out/DownloadedUpdateHelper.js +150 -223
  12. package/out/DownloadedUpdateHelper.js.map +1 -1
  13. package/out/ElectronAppAdapter.js +35 -63
  14. package/out/ElectronAppAdapter.js.map +1 -1
  15. package/out/MacUpdater.js +132 -201
  16. package/out/MacUpdater.js.map +1 -1
  17. package/out/NoOpLogger.d.ts +6 -0
  18. package/out/NoOpLogger.js +19 -0
  19. package/out/NoOpLogger.js.map +1 -0
  20. package/out/NsisUpdater.js +199 -345
  21. package/out/NsisUpdater.js.map +1 -1
  22. package/out/differentialDownloader/DataSplitter.js +180 -252
  23. package/out/differentialDownloader/DataSplitter.js.map +1 -1
  24. package/out/differentialDownloader/DifferentialDownloader.d.ts +1 -1
  25. package/out/differentialDownloader/DifferentialDownloader.js +242 -355
  26. package/out/differentialDownloader/DifferentialDownloader.js.map +1 -1
  27. package/out/differentialDownloader/FileWithEmbeddedBlockMapDifferentialDownloader.js +29 -65
  28. package/out/differentialDownloader/FileWithEmbeddedBlockMapDifferentialDownloader.js.map +1 -1
  29. package/out/differentialDownloader/GenericDifferentialDownloader.js +7 -21
  30. package/out/differentialDownloader/GenericDifferentialDownloader.js.map +1 -1
  31. package/out/differentialDownloader/ProgressDifferentialDownloadCallbackTransform.js +79 -107
  32. package/out/differentialDownloader/ProgressDifferentialDownloadCallbackTransform.js.map +1 -1
  33. package/out/differentialDownloader/downloadPlanBuilder.js +99 -123
  34. package/out/differentialDownloader/downloadPlanBuilder.js.map +1 -1
  35. package/out/differentialDownloader/multipleRangeDownloader.js +99 -148
  36. package/out/differentialDownloader/multipleRangeDownloader.js.map +1 -1
  37. package/out/electronHttpExecutor.js +73 -106
  38. package/out/electronHttpExecutor.js.map +1 -1
  39. package/out/event.d.ts +35 -0
  40. package/out/event.js +39 -0
  41. package/out/event.js.map +1 -0
  42. package/out/log.d.ts +11 -0
  43. package/out/log.js +19 -0
  44. package/out/log.js.map +1 -0
  45. package/out/main.d.ts +1 -3
  46. package/out/main.js +60 -196
  47. package/out/main.js.map +1 -1
  48. package/out/providerFactory.js +49 -105
  49. package/out/providerFactory.js.map +1 -1
  50. package/out/providers/BintrayProvider.d.ts +2 -2
  51. package/out/providers/BintrayProvider.js +40 -95
  52. package/out/providers/BintrayProvider.js.map +1 -1
  53. package/out/providers/GenericProvider.d.ts +2 -2
  54. package/out/providers/GenericProvider.js +46 -80
  55. package/out/providers/GenericProvider.js.map +1 -1
  56. package/out/providers/GitHubProvider.d.ts +2 -2
  57. package/out/providers/GitHubProvider.js +122 -201
  58. package/out/providers/GitHubProvider.js.map +1 -1
  59. package/out/providers/PrivateGitHubProvider.js +87 -165
  60. package/out/providers/PrivateGitHubProvider.js.map +1 -1
  61. package/out/providers/Provider.js +122 -173
  62. package/out/providers/Provider.js.map +1 -1
  63. package/out/util.d.ts +5 -0
  64. package/out/util.js +42 -0
  65. package/out/util.js.map +1 -0
  66. package/out/windowsExecutableCodeSignatureVerifier.js +99 -139
  67. package/out/windowsExecutableCodeSignatureVerifier.js.map +1 -1
  68. package/package.json +33 -31
@@ -1,365 +1,219 @@
1
1
  "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
2
+ Object.defineProperty(exports, "__esModule", { value: true });
6
3
  exports.NsisUpdater = void 0;
7
-
8
- function _builderUtilRuntime() {
9
- const data = require("builder-util-runtime");
10
-
11
- _builderUtilRuntime = function () {
12
- return data;
13
- };
14
-
15
- return data;
16
- }
17
-
18
- function _child_process() {
19
- const data = require("child_process");
20
-
21
- _child_process = function () {
22
- return data;
23
- };
24
-
25
- return data;
26
- }
27
-
28
- var path = _interopRequireWildcard(require("path"));
29
-
30
- function _BaseUpdater() {
31
- const data = require("./BaseUpdater");
32
-
33
- _BaseUpdater = function () {
34
- return data;
35
- };
36
-
37
- return data;
38
- }
39
-
40
- function _FileWithEmbeddedBlockMapDifferentialDownloader() {
41
- const data = require("./differentialDownloader/FileWithEmbeddedBlockMapDifferentialDownloader");
42
-
43
- _FileWithEmbeddedBlockMapDifferentialDownloader = function () {
44
- return data;
45
- };
46
-
47
- return data;
48
- }
49
-
50
- function _GenericDifferentialDownloader() {
51
- const data = require("./differentialDownloader/GenericDifferentialDownloader");
52
-
53
- _GenericDifferentialDownloader = function () {
54
- return data;
55
- };
56
-
57
- return data;
58
- }
59
-
60
- function _main() {
61
- const data = require("./main");
62
-
63
- _main = function () {
64
- return data;
65
- };
66
-
67
- return data;
68
- }
69
-
70
- function _Provider() {
71
- const data = require("./providers/Provider");
72
-
73
- _Provider = function () {
74
- return data;
75
- };
76
-
77
- return data;
78
- }
79
-
80
- function _fsExtra() {
81
- const data = require("fs-extra");
82
-
83
- _fsExtra = function () {
84
- return data;
85
- };
86
-
87
- return data;
88
- }
89
-
90
- function _windowsExecutableCodeSignatureVerifier() {
91
- const data = require("./windowsExecutableCodeSignatureVerifier");
92
-
93
- _windowsExecutableCodeSignatureVerifier = function () {
94
- return data;
95
- };
96
-
97
- return data;
98
- }
99
-
100
- function _url() {
101
- const data = require("url");
102
-
103
- _url = function () {
104
- return data;
105
- };
106
-
107
- return data;
108
- }
109
-
110
- function _zlib() {
111
- const data = require("zlib");
112
-
113
- _zlib = function () {
114
- return data;
115
- };
116
-
117
- return data;
118
- }
119
-
120
- function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }
121
-
122
- 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; }
123
-
124
- class NsisUpdater extends _BaseUpdater().BaseUpdater {
125
- constructor(options, app) {
126
- super(options, app);
127
- }
128
- /*** @private */
129
-
130
-
131
- doDownloadUpdate(downloadUpdateOptions) {
132
- const provider = downloadUpdateOptions.updateInfoAndProvider.provider;
133
- const fileInfo = (0, _Provider().findFile)(provider.resolveFiles(downloadUpdateOptions.updateInfoAndProvider.info), "exe");
134
- return this.executeDownload({
135
- fileExtension: "exe",
136
- downloadUpdateOptions,
137
- fileInfo,
138
- task: async (destinationFile, downloadOptions, packageFile, removeTempDirIfAny) => {
139
- const packageInfo = fileInfo.packageInfo;
140
- const isWebInstaller = packageInfo != null && packageFile != null;
141
-
142
- if (isWebInstaller || (await this.differentialDownloadInstaller(fileInfo, downloadUpdateOptions, destinationFile, provider))) {
143
- await this.httpExecutor.download(fileInfo.url, destinationFile, downloadOptions);
144
- }
145
-
146
- const signatureVerificationStatus = await this.verifySignature(destinationFile);
147
-
148
- if (signatureVerificationStatus != null) {
149
- await removeTempDirIfAny(); // noinspection ThrowInsideFinallyBlockJS
150
-
151
- throw (0, _builderUtilRuntime().newError)(`New version ${downloadUpdateOptions.updateInfoAndProvider.info.version} is not signed by the application owner: ${signatureVerificationStatus}`, "ERR_UPDATER_INVALID_SIGNATURE");
4
+ const builder_util_runtime_1 = require("builder-util-runtime");
5
+ const child_process_1 = require("child_process");
6
+ const path = require("path");
7
+ const BaseUpdater_1 = require("./BaseUpdater");
8
+ const FileWithEmbeddedBlockMapDifferentialDownloader_1 = require("./differentialDownloader/FileWithEmbeddedBlockMapDifferentialDownloader");
9
+ const GenericDifferentialDownloader_1 = require("./differentialDownloader/GenericDifferentialDownloader");
10
+ const main_1 = require("./main");
11
+ const util_1 = require("./util");
12
+ const Provider_1 = require("./providers/Provider");
13
+ const fs_extra_1 = require("fs-extra");
14
+ const windowsExecutableCodeSignatureVerifier_1 = require("./windowsExecutableCodeSignatureVerifier");
15
+ const url_1 = require("url");
16
+ const zlib_1 = require("zlib");
17
+ class NsisUpdater extends BaseUpdater_1.BaseUpdater {
18
+ constructor(options, app) {
19
+ super(options, app);
20
+ }
21
+ /*** @private */
22
+ doDownloadUpdate(downloadUpdateOptions) {
23
+ const provider = downloadUpdateOptions.updateInfoAndProvider.provider;
24
+ const fileInfo = Provider_1.findFile(provider.resolveFiles(downloadUpdateOptions.updateInfoAndProvider.info), "exe");
25
+ return this.executeDownload({
26
+ fileExtension: "exe",
27
+ downloadUpdateOptions,
28
+ fileInfo,
29
+ task: async (destinationFile, downloadOptions, packageFile, removeTempDirIfAny) => {
30
+ const packageInfo = fileInfo.packageInfo;
31
+ const isWebInstaller = packageInfo != null && packageFile != null;
32
+ if (isWebInstaller || (await this.differentialDownloadInstaller(fileInfo, downloadUpdateOptions, destinationFile, provider))) {
33
+ await this.httpExecutor.download(fileInfo.url, destinationFile, downloadOptions);
34
+ }
35
+ const signatureVerificationStatus = await this.verifySignature(destinationFile);
36
+ if (signatureVerificationStatus != null) {
37
+ await removeTempDirIfAny();
38
+ // noinspection ThrowInsideFinallyBlockJS
39
+ throw builder_util_runtime_1.newError(`New version ${downloadUpdateOptions.updateInfoAndProvider.info.version} is not signed by the application owner: ${signatureVerificationStatus}`, "ERR_UPDATER_INVALID_SIGNATURE");
40
+ }
41
+ if (isWebInstaller) {
42
+ if (await this.differentialDownloadWebPackage(downloadUpdateOptions, packageInfo, packageFile, provider)) {
43
+ try {
44
+ await this.httpExecutor.download(new url_1.URL(packageInfo.path), packageFile, {
45
+ headers: downloadUpdateOptions.requestHeaders,
46
+ cancellationToken: downloadUpdateOptions.cancellationToken,
47
+ sha512: packageInfo.sha512,
48
+ });
49
+ }
50
+ catch (e) {
51
+ try {
52
+ await fs_extra_1.unlink(packageFile);
53
+ }
54
+ catch (ignored) {
55
+ // ignore
56
+ }
57
+ throw e;
58
+ }
59
+ }
60
+ }
61
+ },
62
+ });
63
+ }
64
+ // $certificateInfo = (Get-AuthenticodeSignature 'xxx\yyy.exe'
65
+ // | where {$_.Status.Equals([System.Management.Automation.SignatureStatus]::Valid) -and $_.SignerCertificate.Subject.Contains("CN=siemens.com")})
66
+ // | Out-String ; if ($certificateInfo) { exit 0 } else { exit 1 }
67
+ async verifySignature(tempUpdateFile) {
68
+ let publisherName;
69
+ try {
70
+ publisherName = (await this.configOnDisk.value).publisherName;
71
+ if (publisherName == null) {
72
+ return null;
73
+ }
152
74
  }
153
-
154
- if (isWebInstaller) {
155
- if (await this.differentialDownloadWebPackage(downloadUpdateOptions, packageInfo, packageFile, provider)) {
156
- try {
157
- await this.httpExecutor.download(new (_url().URL)(packageInfo.path), packageFile, {
158
- headers: downloadUpdateOptions.requestHeaders,
159
- cancellationToken: downloadUpdateOptions.cancellationToken,
160
- sha512: packageInfo.sha512
161
- });
162
- } catch (e) {
163
- try {
164
- await (0, _fsExtra().unlink)(packageFile);
165
- } catch (ignored) {// ignore
166
- }
167
-
168
- throw e;
75
+ catch (e) {
76
+ if (e.code === "ENOENT") {
77
+ // no app-update.yml
78
+ return null;
169
79
  }
170
- }
80
+ throw e;
171
81
  }
172
- }
173
- });
174
- } // $certificateInfo = (Get-AuthenticodeSignature 'xxx\yyy.exe'
175
- // | where {$_.Status.Equals([System.Management.Automation.SignatureStatus]::Valid) -and $_.SignerCertificate.Subject.Contains("CN=siemens.com")})
176
- // | Out-String ; if ($certificateInfo) { exit 0 } else { exit 1 }
177
-
178
-
179
- async verifySignature(tempUpdateFile) {
180
- let publisherName;
181
-
182
- try {
183
- publisherName = (await this.configOnDisk.value).publisherName;
184
-
185
- if (publisherName == null) {
186
- return null;
187
- }
188
- } catch (e) {
189
- if (e.code === "ENOENT") {
190
- // no app-update.yml
191
- return null;
192
- }
193
-
194
- throw e;
195
- }
196
-
197
- return await (0, _windowsExecutableCodeSignatureVerifier().verifySignature)(Array.isArray(publisherName) ? publisherName : [publisherName], tempUpdateFile, this._logger);
198
- }
199
-
200
- doInstall(options) {
201
- const args = ["--updated"];
202
-
203
- if (options.isSilent) {
204
- args.push("/S");
205
- }
206
-
207
- if (options.isForceRunAfter) {
208
- args.push("--force-run");
82
+ return await windowsExecutableCodeSignatureVerifier_1.verifySignature(Array.isArray(publisherName) ? publisherName : [publisherName], tempUpdateFile, this._logger);
209
83
  }
210
-
211
- const packagePath = this.downloadedUpdateHelper == null ? null : this.downloadedUpdateHelper.packageFile;
212
-
213
- if (packagePath != null) {
214
- // only = form is supported
215
- args.push(`--package-file=${packagePath}`);
84
+ doInstall(options) {
85
+ const args = ["--updated"];
86
+ if (options.isSilent) {
87
+ args.push("/S");
88
+ }
89
+ if (options.isForceRunAfter) {
90
+ args.push("--force-run");
91
+ }
92
+ const packagePath = this.downloadedUpdateHelper == null ? null : this.downloadedUpdateHelper.packageFile;
93
+ if (packagePath != null) {
94
+ // only = form is supported
95
+ args.push(`--package-file=${packagePath}`);
96
+ }
97
+ const callUsingElevation = () => {
98
+ _spawn(path.join(process.resourcesPath, "elevate.exe"), [options.installerPath].concat(args)).catch(e => this.dispatchError(e));
99
+ };
100
+ if (options.isAdminRightsRequired) {
101
+ this._logger.info("isAdminRightsRequired is set to true, run installer using elevate.exe");
102
+ callUsingElevation();
103
+ return true;
104
+ }
105
+ _spawn(options.installerPath, args).catch((e) => {
106
+ // https://github.com/electron-userland/electron-builder/issues/1129
107
+ // Node 8 sends errors: https://nodejs.org/dist/latest-v8.x/docs/api/errors.html#errors_common_system_errors
108
+ const errorCode = e.code;
109
+ this._logger.info(`Cannot run installer: error code: ${errorCode}, error message: "${e.message}", will be executed again using elevate if EACCES"`);
110
+ if (errorCode === "UNKNOWN" || errorCode === "EACCES") {
111
+ callUsingElevation();
112
+ }
113
+ else {
114
+ this.dispatchError(e);
115
+ }
116
+ });
117
+ return true;
216
118
  }
217
-
218
- const callUsingElevation = () => {
219
- _spawn(path.join(process.resourcesPath, "elevate.exe"), [options.installerPath].concat(args)).catch(e => this.dispatchError(e));
220
- };
221
-
222
- if (options.isAdminRightsRequired) {
223
- this._logger.info("isAdminRightsRequired is set to true, run installer using elevate.exe");
224
-
225
- callUsingElevation();
226
- return true;
119
+ async differentialDownloadInstaller(fileInfo, downloadUpdateOptions, installerPath, provider) {
120
+ try {
121
+ if (this._testOnlyOptions != null && !this._testOnlyOptions.isUseDifferentialDownload) {
122
+ return true;
123
+ }
124
+ const blockmapFileUrls = util_1.blockmapFiles(fileInfo.url, downloadUpdateOptions.updateInfoAndProvider.info.version, this.app.version);
125
+ this._logger.info(`Download block maps (old: "${blockmapFileUrls[0]}", new: ${blockmapFileUrls[1]})`);
126
+ const downloadBlockMap = async (url) => {
127
+ const data = await this.httpExecutor.downloadToBuffer(url, {
128
+ headers: downloadUpdateOptions.requestHeaders,
129
+ cancellationToken: downloadUpdateOptions.cancellationToken,
130
+ });
131
+ if (data == null || data.length === 0) {
132
+ throw new Error(`Blockmap "${url.href}" is empty`);
133
+ }
134
+ try {
135
+ return JSON.parse(zlib_1.gunzipSync(data).toString());
136
+ }
137
+ catch (e) {
138
+ throw new Error(`Cannot parse blockmap "${url.href}", error: ${e}, raw data: ${data}`);
139
+ }
140
+ };
141
+ const downloadOptions = {
142
+ newUrl: fileInfo.url,
143
+ oldFile: path.join(this.downloadedUpdateHelper.cacheDir, builder_util_runtime_1.CURRENT_APP_INSTALLER_FILE_NAME),
144
+ logger: this._logger,
145
+ newFile: installerPath,
146
+ isUseMultipleRangeRequest: provider.isUseMultipleRangeRequest,
147
+ requestHeaders: downloadUpdateOptions.requestHeaders,
148
+ cancellationToken: downloadUpdateOptions.cancellationToken,
149
+ };
150
+ if (this.listenerCount(main_1.DOWNLOAD_PROGRESS) > 0) {
151
+ downloadOptions.onProgress = it => this.emit(main_1.DOWNLOAD_PROGRESS, it);
152
+ }
153
+ const blockMapDataList = await Promise.all(blockmapFileUrls.map(u => downloadBlockMap(u)));
154
+ await new GenericDifferentialDownloader_1.GenericDifferentialDownloader(fileInfo.info, this.httpExecutor, downloadOptions).download(blockMapDataList[0], blockMapDataList[1]);
155
+ return false;
156
+ }
157
+ catch (e) {
158
+ this._logger.error(`Cannot download differentially, fallback to full download: ${e.stack || e}`);
159
+ if (this._testOnlyOptions != null) {
160
+ // test mode
161
+ throw e;
162
+ }
163
+ return true;
164
+ }
227
165
  }
228
-
229
- _spawn(options.installerPath, args).catch(e => {
230
- // https://github.com/electron-userland/electron-builder/issues/1129
231
- // Node 8 sends errors: https://nodejs.org/dist/latest-v8.x/docs/api/errors.html#errors_common_system_errors
232
- const errorCode = e.code;
233
-
234
- this._logger.info(`Cannot run installer: error code: ${errorCode}, error message: "${e.message}", will be executed again using elevate if EACCES"`);
235
-
236
- if (errorCode === "UNKNOWN" || errorCode === "EACCES") {
237
- callUsingElevation();
238
- } else {
239
- this.dispatchError(e);
240
- }
241
- });
242
-
243
- return true;
244
- }
245
-
246
- async differentialDownloadInstaller(fileInfo, downloadUpdateOptions, installerPath, provider) {
247
- try {
248
- if (this._testOnlyOptions != null && !this._testOnlyOptions.isUseDifferentialDownload) {
249
- return true;
250
- }
251
-
252
- const newBlockMapUrl = (0, _main().newUrlFromBase)(`${fileInfo.url.pathname}.blockmap`, fileInfo.url);
253
- const oldBlockMapUrl = (0, _main().newUrlFromBase)(`${fileInfo.url.pathname.replace(new RegExp(downloadUpdateOptions.updateInfoAndProvider.info.version, "g"), this.app.version)}.blockmap`, fileInfo.url);
254
-
255
- this._logger.info(`Download block maps (old: "${oldBlockMapUrl.href}", new: ${newBlockMapUrl.href})`);
256
-
257
- const downloadBlockMap = async url => {
258
- const data = await this.httpExecutor.downloadToBuffer(url, {
259
- headers: downloadUpdateOptions.requestHeaders,
260
- cancellationToken: downloadUpdateOptions.cancellationToken
261
- });
262
-
263
- if (data == null || data.length === 0) {
264
- throw new Error(`Blockmap "${url.href}" is empty`);
166
+ async differentialDownloadWebPackage(downloadUpdateOptions, packageInfo, packagePath, provider) {
167
+ if (packageInfo.blockMapSize == null) {
168
+ return true;
265
169
  }
266
-
267
170
  try {
268
- return JSON.parse((0, _zlib().gunzipSync)(data).toString());
269
- } catch (e) {
270
- throw new Error(`Cannot parse blockmap "${url.href}", error: ${e}, raw data: ${data}`);
171
+ const downloadOptions = {
172
+ newUrl: new url_1.URL(packageInfo.path),
173
+ oldFile: path.join(this.downloadedUpdateHelper.cacheDir, builder_util_runtime_1.CURRENT_APP_PACKAGE_FILE_NAME),
174
+ logger: this._logger,
175
+ newFile: packagePath,
176
+ requestHeaders: this.requestHeaders,
177
+ isUseMultipleRangeRequest: provider.isUseMultipleRangeRequest,
178
+ cancellationToken: downloadUpdateOptions.cancellationToken,
179
+ };
180
+ if (this.listenerCount(main_1.DOWNLOAD_PROGRESS) > 0) {
181
+ downloadOptions.onProgress = it => this.emit(main_1.DOWNLOAD_PROGRESS, it);
182
+ }
183
+ await new FileWithEmbeddedBlockMapDifferentialDownloader_1.FileWithEmbeddedBlockMapDifferentialDownloader(packageInfo, this.httpExecutor, downloadOptions).download();
271
184
  }
272
- };
273
-
274
- const downloadOptions = {
275
- newUrl: fileInfo.url,
276
- oldFile: path.join(this.downloadedUpdateHelper.cacheDir, _builderUtilRuntime().CURRENT_APP_INSTALLER_FILE_NAME),
277
- logger: this._logger,
278
- newFile: installerPath,
279
- isUseMultipleRangeRequest: provider.isUseMultipleRangeRequest,
280
- requestHeaders: downloadUpdateOptions.requestHeaders,
281
- cancellationToken: downloadUpdateOptions.cancellationToken
282
- };
283
-
284
- if (this.listenerCount(_main().DOWNLOAD_PROGRESS) > 0) {
285
- downloadOptions.onProgress = it => this.emit(_main().DOWNLOAD_PROGRESS, it);
286
- }
287
-
288
- const blockMapDataList = await Promise.all([downloadBlockMap(oldBlockMapUrl), downloadBlockMap(newBlockMapUrl)]);
289
- await new (_GenericDifferentialDownloader().GenericDifferentialDownloader)(fileInfo.info, this.httpExecutor, downloadOptions).download(blockMapDataList[0], blockMapDataList[1]);
290
- return false;
291
- } catch (e) {
292
- this._logger.error(`Cannot download differentially, fallback to full download: ${e.stack || e}`);
293
-
294
- if (this._testOnlyOptions != null) {
295
- // test mode
296
- throw e;
297
- }
298
-
299
- return true;
300
- }
301
- }
302
-
303
- async differentialDownloadWebPackage(downloadUpdateOptions, packageInfo, packagePath, provider) {
304
- if (packageInfo.blockMapSize == null) {
305
- return true;
306
- }
307
-
308
- try {
309
- const downloadOptions = {
310
- newUrl: new (_url().URL)(packageInfo.path),
311
- oldFile: path.join(this.downloadedUpdateHelper.cacheDir, _builderUtilRuntime().CURRENT_APP_PACKAGE_FILE_NAME),
312
- logger: this._logger,
313
- newFile: packagePath,
314
- requestHeaders: this.requestHeaders,
315
- isUseMultipleRangeRequest: provider.isUseMultipleRangeRequest,
316
- cancellationToken: downloadUpdateOptions.cancellationToken
317
- };
318
-
319
- if (this.listenerCount(_main().DOWNLOAD_PROGRESS) > 0) {
320
- downloadOptions.onProgress = it => this.emit(_main().DOWNLOAD_PROGRESS, it);
321
- }
322
-
323
- await new (_FileWithEmbeddedBlockMapDifferentialDownloader().FileWithEmbeddedBlockMapDifferentialDownloader)(packageInfo, this.httpExecutor, downloadOptions).download();
324
- } catch (e) {
325
- this._logger.error(`Cannot download differentially, fallback to full download: ${e.stack || e}`); // during test (developer machine mac or linux) we must throw error
326
-
327
-
328
- return process.platform === "win32";
185
+ catch (e) {
186
+ this._logger.error(`Cannot download differentially, fallback to full download: ${e.stack || e}`);
187
+ // during test (developer machine mac or linux) we must throw error
188
+ return process.platform === "win32";
189
+ }
190
+ return false;
329
191
  }
330
-
331
- return false;
332
- }
333
-
334
192
  }
193
+ exports.NsisUpdater = NsisUpdater;
335
194
  /**
336
195
  * This handles both node 8 and node 10 way of emitting error when spawning a process
337
196
  * - node 8: Throws the error
338
197
  * - node 10: Emit the error(Need to listen with on)
339
198
  */
340
-
341
-
342
- exports.NsisUpdater = NsisUpdater;
343
-
344
199
  async function _spawn(exe, args) {
345
- return new Promise((resolve, reject) => {
346
- try {
347
- const process = (0, _child_process().spawn)(exe, args, {
348
- detached: true,
349
- stdio: "ignore"
350
- });
351
- process.on("error", error => {
352
- reject(error);
353
- });
354
- process.unref();
355
-
356
- if (process.pid !== undefined) {
357
- resolve(true);
358
- }
359
- } catch (error) {
360
- reject(error);
361
- }
362
- });
363
- }
364
- // __ts-babel@6.0.4
200
+ return new Promise((resolve, reject) => {
201
+ try {
202
+ const process = child_process_1.spawn(exe, args, {
203
+ detached: true,
204
+ stdio: "ignore",
205
+ });
206
+ process.on("error", error => {
207
+ reject(error);
208
+ });
209
+ process.unref();
210
+ if (process.pid !== undefined) {
211
+ resolve(true);
212
+ }
213
+ }
214
+ catch (error) {
215
+ reject(error);
216
+ }
217
+ });
218
+ }
365
219
  //# sourceMappingURL=NsisUpdater.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/NsisUpdater.ts"],"names":[],"mappings":"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","sourcesContent":["import { AllPublishOptions, newError, PackageFileInfo, BlockMap, CURRENT_APP_PACKAGE_FILE_NAME, CURRENT_APP_INSTALLER_FILE_NAME } from \"builder-util-runtime\"\nimport { spawn } from \"child_process\"\nimport * as path from \"path\"\nimport { AppAdapter } from \"./AppAdapter\"\nimport { DownloadUpdateOptions } from \"./AppUpdater\"\nimport { BaseUpdater, InstallOptions } from \"./BaseUpdater\"\nimport { DifferentialDownloaderOptions } from \"./differentialDownloader/DifferentialDownloader\"\nimport { FileWithEmbeddedBlockMapDifferentialDownloader } from \"./differentialDownloader/FileWithEmbeddedBlockMapDifferentialDownloader\"\nimport { GenericDifferentialDownloader } from \"./differentialDownloader/GenericDifferentialDownloader\"\nimport { DOWNLOAD_PROGRESS, newUrlFromBase, ResolvedUpdateFileInfo } from \"./main\"\nimport { findFile, Provider } from \"./providers/Provider\"\nimport { unlink } from \"fs-extra\"\nimport { verifySignature } from \"./windowsExecutableCodeSignatureVerifier\"\nimport { URL } from \"url\"\nimport { gunzipSync } from \"zlib\"\n\nexport class NsisUpdater extends BaseUpdater {\n constructor(options?: AllPublishOptions | null, app?: AppAdapter) {\n super(options, app)\n }\n\n /*** @private */\n protected doDownloadUpdate(downloadUpdateOptions: DownloadUpdateOptions): Promise<Array<string>> {\n const provider = downloadUpdateOptions.updateInfoAndProvider.provider\n const fileInfo = findFile(provider.resolveFiles(downloadUpdateOptions.updateInfoAndProvider.info), \"exe\")!!\n return this.executeDownload({\n fileExtension: \"exe\",\n downloadUpdateOptions,\n fileInfo,\n task: async (destinationFile, downloadOptions, packageFile, removeTempDirIfAny) => {\n const packageInfo = fileInfo.packageInfo\n const isWebInstaller = packageInfo != null && packageFile != null\n if (isWebInstaller || await this.differentialDownloadInstaller(fileInfo, downloadUpdateOptions, destinationFile, provider)) {\n await this.httpExecutor.download(fileInfo.url, destinationFile, downloadOptions)\n }\n\n const signatureVerificationStatus = await this.verifySignature(destinationFile)\n if (signatureVerificationStatus != null) {\n await removeTempDirIfAny()\n // noinspection ThrowInsideFinallyBlockJS\n throw newError(`New version ${downloadUpdateOptions.updateInfoAndProvider.info.version} is not signed by the application owner: ${signatureVerificationStatus}`, \"ERR_UPDATER_INVALID_SIGNATURE\")\n }\n\n if (isWebInstaller) {\n if (await this.differentialDownloadWebPackage(downloadUpdateOptions, packageInfo!!, packageFile!!, provider)) {\n try {\n await this.httpExecutor.download(new URL(packageInfo!!.path), packageFile!!, {\n headers: downloadUpdateOptions.requestHeaders,\n cancellationToken: downloadUpdateOptions.cancellationToken,\n sha512: packageInfo!!.sha512,\n })\n }\n catch (e) {\n try {\n await unlink(packageFile!!)\n }\n catch (ignored) {\n // ignore\n }\n\n throw e\n }\n }\n }\n },\n })\n }\n\n // $certificateInfo = (Get-AuthenticodeSignature 'xxx\\yyy.exe'\n // | where {$_.Status.Equals([System.Management.Automation.SignatureStatus]::Valid) -and $_.SignerCertificate.Subject.Contains(\"CN=siemens.com\")})\n // | Out-String ; if ($certificateInfo) { exit 0 } else { exit 1 }\n private async verifySignature(tempUpdateFile: string): Promise<string | null> {\n let publisherName: Array<string> | string | null\n try {\n publisherName = (await this.configOnDisk.value).publisherName\n if (publisherName == null) {\n return null\n }\n }\n catch (e) {\n if (e.code === \"ENOENT\") {\n // no app-update.yml\n return null\n }\n throw e\n }\n return await verifySignature(Array.isArray(publisherName) ? publisherName : [publisherName], tempUpdateFile, this._logger)\n }\n\n protected doInstall(options: InstallOptions): boolean {\n const args = [\"--updated\"]\n if (options.isSilent) {\n args.push(\"/S\")\n }\n\n if (options.isForceRunAfter) {\n args.push(\"--force-run\")\n }\n\n const packagePath = this.downloadedUpdateHelper == null ? null : this.downloadedUpdateHelper.packageFile\n if (packagePath != null) {\n // only = form is supported\n args.push(`--package-file=${packagePath}`)\n }\n\n const callUsingElevation = (): void => {\n _spawn(path.join(process.resourcesPath!!, \"elevate.exe\"), [options.installerPath].concat(args))\n .catch(e => this.dispatchError(e))\n }\n\n if (options.isAdminRightsRequired) {\n this._logger.info(\"isAdminRightsRequired is set to true, run installer using elevate.exe\")\n callUsingElevation()\n return true\n }\n\n _spawn(options.installerPath, args)\n .catch((e: Error) => {\n // https://github.com/electron-userland/electron-builder/issues/1129\n // Node 8 sends errors: https://nodejs.org/dist/latest-v8.x/docs/api/errors.html#errors_common_system_errors\n const errorCode = (e as NodeJS.ErrnoException).code\n this._logger.info(`Cannot run installer: error code: ${errorCode}, error message: \"${e.message}\", will be executed again using elevate if EACCES\"`)\n if (errorCode === \"UNKNOWN\" || errorCode === \"EACCES\") {\n callUsingElevation()\n }\n else {\n this.dispatchError(e)\n }\n })\n return true\n }\n\n private async differentialDownloadInstaller(fileInfo: ResolvedUpdateFileInfo, downloadUpdateOptions: DownloadUpdateOptions, installerPath: string, provider: Provider<any>): Promise<boolean> {\n try {\n if (this._testOnlyOptions != null && !this._testOnlyOptions.isUseDifferentialDownload) {\n return true\n }\n\n const newBlockMapUrl = newUrlFromBase(`${fileInfo.url.pathname}.blockmap`, fileInfo.url)\n const oldBlockMapUrl = newUrlFromBase(`${fileInfo.url.pathname.replace(new RegExp(downloadUpdateOptions.updateInfoAndProvider.info.version, \"g\"), this.app.version)}.blockmap`, fileInfo.url)\n this._logger.info(`Download block maps (old: \"${oldBlockMapUrl.href}\", new: ${newBlockMapUrl.href})`)\n\n const downloadBlockMap = async (url: URL): Promise<BlockMap> => {\n const data = await this.httpExecutor.downloadToBuffer(url, {\n headers: downloadUpdateOptions.requestHeaders,\n cancellationToken: downloadUpdateOptions.cancellationToken,\n })\n\n if (data == null || data.length === 0) {\n throw new Error(`Blockmap \"${url.href}\" is empty`)\n }\n\n try {\n return JSON.parse(gunzipSync(data).toString())\n }\n catch (e) {\n throw new Error(`Cannot parse blockmap \"${url.href}\", error: ${e}, raw data: ${data}`)\n }\n }\n\n const downloadOptions: DifferentialDownloaderOptions = {\n newUrl: fileInfo.url,\n oldFile: path.join(this.downloadedUpdateHelper!!.cacheDir, CURRENT_APP_INSTALLER_FILE_NAME),\n logger: this._logger,\n newFile: installerPath,\n isUseMultipleRangeRequest: provider.isUseMultipleRangeRequest,\n requestHeaders: downloadUpdateOptions.requestHeaders,\n cancellationToken: downloadUpdateOptions.cancellationToken,\n }\n\n if (this.listenerCount(DOWNLOAD_PROGRESS) > 0) {\n downloadOptions.onProgress = it => this.emit(DOWNLOAD_PROGRESS, it)\n }\n\n const blockMapDataList = await Promise.all([downloadBlockMap(oldBlockMapUrl), downloadBlockMap(newBlockMapUrl)])\n await new GenericDifferentialDownloader(fileInfo.info, this.httpExecutor, downloadOptions)\n .download(blockMapDataList[0], blockMapDataList[1])\n return false\n }\n catch (e) {\n this._logger.error(`Cannot download differentially, fallback to full download: ${e.stack || e}`)\n if (this._testOnlyOptions != null) {\n // test mode\n throw e\n }\n return true\n }\n }\n\n private async differentialDownloadWebPackage(downloadUpdateOptions: DownloadUpdateOptions, packageInfo: PackageFileInfo, packagePath: string, provider: Provider<any>): Promise<boolean> {\n if (packageInfo.blockMapSize == null) {\n return true\n }\n\n try {\n const downloadOptions: DifferentialDownloaderOptions = {\n newUrl: new URL(packageInfo.path),\n oldFile: path.join(this.downloadedUpdateHelper!!.cacheDir, CURRENT_APP_PACKAGE_FILE_NAME),\n logger: this._logger,\n newFile: packagePath,\n requestHeaders: this.requestHeaders,\n isUseMultipleRangeRequest: provider.isUseMultipleRangeRequest,\n cancellationToken: downloadUpdateOptions.cancellationToken,\n }\n\n if (this.listenerCount(DOWNLOAD_PROGRESS) > 0) {\n downloadOptions.onProgress = it => this.emit(DOWNLOAD_PROGRESS, it)\n }\n\n await new FileWithEmbeddedBlockMapDifferentialDownloader(packageInfo, this.httpExecutor, downloadOptions)\n .download()\n }\n catch (e) {\n this._logger.error(`Cannot download differentially, fallback to full download: ${e.stack || e}`)\n // during test (developer machine mac or linux) we must throw error\n return process.platform === \"win32\"\n }\n return false\n }\n}\n\n/**\n * This handles both node 8 and node 10 way of emitting error when spawning a process\n * - node 8: Throws the error\n * - node 10: Emit the error(Need to listen with on)\n */\nasync function _spawn(exe: string, args: Array<string>): Promise<any> {\n return new Promise((resolve, reject) => {\n try {\n const process = spawn(exe, args, {\n detached: true,\n stdio: \"ignore\",\n })\n process.on(\"error\", error => {\n reject(error)\n })\n process.unref()\n\n if (process.pid !== undefined) {\n resolve(true)\n }\n }\n catch (error) {\n reject(error)\n }\n })\n}\n"],"sourceRoot":""}
1
+ {"version":3,"file":"NsisUpdater.js","sourceRoot":"","sources":["../src/NsisUpdater.ts"],"names":[],"mappings":"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","sourcesContent":["import { AllPublishOptions, newError, PackageFileInfo, BlockMap, CURRENT_APP_PACKAGE_FILE_NAME, CURRENT_APP_INSTALLER_FILE_NAME } from \"builder-util-runtime\"\nimport { spawn } from \"child_process\"\nimport * as path from \"path\"\nimport { AppAdapter } from \"./AppAdapter\"\nimport { DownloadUpdateOptions } from \"./AppUpdater\"\nimport { BaseUpdater, InstallOptions } from \"./BaseUpdater\"\nimport { DifferentialDownloaderOptions } from \"./differentialDownloader/DifferentialDownloader\"\nimport { FileWithEmbeddedBlockMapDifferentialDownloader } from \"./differentialDownloader/FileWithEmbeddedBlockMapDifferentialDownloader\"\nimport { GenericDifferentialDownloader } from \"./differentialDownloader/GenericDifferentialDownloader\"\nimport { DOWNLOAD_PROGRESS, ResolvedUpdateFileInfo } from \"./main\"\nimport { blockmapFiles } from \"./util\"\nimport { findFile, Provider } from \"./providers/Provider\"\nimport { unlink } from \"fs-extra\"\nimport { verifySignature } from \"./windowsExecutableCodeSignatureVerifier\"\nimport { URL } from \"url\"\nimport { gunzipSync } from \"zlib\"\n\nexport class NsisUpdater extends BaseUpdater {\n constructor(options?: AllPublishOptions | null, app?: AppAdapter) {\n super(options, app)\n }\n\n /*** @private */\n protected doDownloadUpdate(downloadUpdateOptions: DownloadUpdateOptions): Promise<Array<string>> {\n const provider = downloadUpdateOptions.updateInfoAndProvider.provider\n const fileInfo = findFile(provider.resolveFiles(downloadUpdateOptions.updateInfoAndProvider.info), \"exe\")!\n return this.executeDownload({\n fileExtension: \"exe\",\n downloadUpdateOptions,\n fileInfo,\n task: async (destinationFile, downloadOptions, packageFile, removeTempDirIfAny) => {\n const packageInfo = fileInfo.packageInfo\n const isWebInstaller = packageInfo != null && packageFile != null\n if (isWebInstaller || (await this.differentialDownloadInstaller(fileInfo, downloadUpdateOptions, destinationFile, provider))) {\n await this.httpExecutor.download(fileInfo.url, destinationFile, downloadOptions)\n }\n\n const signatureVerificationStatus = await this.verifySignature(destinationFile)\n if (signatureVerificationStatus != null) {\n await removeTempDirIfAny()\n // noinspection ThrowInsideFinallyBlockJS\n throw newError(\n `New version ${downloadUpdateOptions.updateInfoAndProvider.info.version} is not signed by the application owner: ${signatureVerificationStatus}`,\n \"ERR_UPDATER_INVALID_SIGNATURE\"\n )\n }\n\n if (isWebInstaller) {\n if (await this.differentialDownloadWebPackage(downloadUpdateOptions, packageInfo!, packageFile!, provider)) {\n try {\n await this.httpExecutor.download(new URL(packageInfo!.path), packageFile!, {\n headers: downloadUpdateOptions.requestHeaders,\n cancellationToken: downloadUpdateOptions.cancellationToken,\n sha512: packageInfo!.sha512,\n })\n } catch (e) {\n try {\n await unlink(packageFile!)\n } catch (ignored) {\n // ignore\n }\n\n throw e\n }\n }\n }\n },\n })\n }\n\n // $certificateInfo = (Get-AuthenticodeSignature 'xxx\\yyy.exe'\n // | where {$_.Status.Equals([System.Management.Automation.SignatureStatus]::Valid) -and $_.SignerCertificate.Subject.Contains(\"CN=siemens.com\")})\n // | Out-String ; if ($certificateInfo) { exit 0 } else { exit 1 }\n private async verifySignature(tempUpdateFile: string): Promise<string | null> {\n let publisherName: Array<string> | string | null\n try {\n publisherName = (await this.configOnDisk.value).publisherName\n if (publisherName == null) {\n return null\n }\n } catch (e) {\n if (e.code === \"ENOENT\") {\n // no app-update.yml\n return null\n }\n throw e\n }\n return await verifySignature(Array.isArray(publisherName) ? publisherName : [publisherName], tempUpdateFile, this._logger)\n }\n\n protected doInstall(options: InstallOptions): boolean {\n const args = [\"--updated\"]\n if (options.isSilent) {\n args.push(\"/S\")\n }\n\n if (options.isForceRunAfter) {\n args.push(\"--force-run\")\n }\n\n const packagePath = this.downloadedUpdateHelper == null ? null : this.downloadedUpdateHelper.packageFile\n if (packagePath != null) {\n // only = form is supported\n args.push(`--package-file=${packagePath}`)\n }\n\n const callUsingElevation = (): void => {\n _spawn(path.join(process.resourcesPath!, \"elevate.exe\"), [options.installerPath].concat(args)).catch(e => this.dispatchError(e))\n }\n\n if (options.isAdminRightsRequired) {\n this._logger.info(\"isAdminRightsRequired is set to true, run installer using elevate.exe\")\n callUsingElevation()\n return true\n }\n\n _spawn(options.installerPath, args).catch((e: Error) => {\n // https://github.com/electron-userland/electron-builder/issues/1129\n // Node 8 sends errors: https://nodejs.org/dist/latest-v8.x/docs/api/errors.html#errors_common_system_errors\n const errorCode = (e as NodeJS.ErrnoException).code\n this._logger.info(`Cannot run installer: error code: ${errorCode}, error message: \"${e.message}\", will be executed again using elevate if EACCES\"`)\n if (errorCode === \"UNKNOWN\" || errorCode === \"EACCES\") {\n callUsingElevation()\n } else {\n this.dispatchError(e)\n }\n })\n return true\n }\n\n private async differentialDownloadInstaller(\n fileInfo: ResolvedUpdateFileInfo,\n downloadUpdateOptions: DownloadUpdateOptions,\n installerPath: string,\n provider: Provider<any>\n ): Promise<boolean> {\n try {\n if (this._testOnlyOptions != null && !this._testOnlyOptions.isUseDifferentialDownload) {\n return true\n }\n const blockmapFileUrls = blockmapFiles(fileInfo.url, downloadUpdateOptions.updateInfoAndProvider.info.version, this.app.version)\n this._logger.info(`Download block maps (old: \"${blockmapFileUrls[0]}\", new: ${blockmapFileUrls[1]})`)\n\n const downloadBlockMap = async (url: URL): Promise<BlockMap> => {\n const data = await this.httpExecutor.downloadToBuffer(url, {\n headers: downloadUpdateOptions.requestHeaders,\n cancellationToken: downloadUpdateOptions.cancellationToken,\n })\n\n if (data == null || data.length === 0) {\n throw new Error(`Blockmap \"${url.href}\" is empty`)\n }\n\n try {\n return JSON.parse(gunzipSync(data).toString())\n } catch (e) {\n throw new Error(`Cannot parse blockmap \"${url.href}\", error: ${e}, raw data: ${data}`)\n }\n }\n\n const downloadOptions: DifferentialDownloaderOptions = {\n newUrl: fileInfo.url,\n oldFile: path.join(this.downloadedUpdateHelper!.cacheDir, CURRENT_APP_INSTALLER_FILE_NAME),\n logger: this._logger,\n newFile: installerPath,\n isUseMultipleRangeRequest: provider.isUseMultipleRangeRequest,\n requestHeaders: downloadUpdateOptions.requestHeaders,\n cancellationToken: downloadUpdateOptions.cancellationToken,\n }\n\n if (this.listenerCount(DOWNLOAD_PROGRESS) > 0) {\n downloadOptions.onProgress = it => this.emit(DOWNLOAD_PROGRESS, it)\n }\n\n const blockMapDataList = await Promise.all(blockmapFileUrls.map(u => downloadBlockMap(u)))\n await new GenericDifferentialDownloader(fileInfo.info, this.httpExecutor, downloadOptions).download(blockMapDataList[0], blockMapDataList[1])\n return false\n } catch (e) {\n this._logger.error(`Cannot download differentially, fallback to full download: ${e.stack || e}`)\n if (this._testOnlyOptions != null) {\n // test mode\n throw e\n }\n return true\n }\n }\n\n private async differentialDownloadWebPackage(\n downloadUpdateOptions: DownloadUpdateOptions,\n packageInfo: PackageFileInfo,\n packagePath: string,\n provider: Provider<any>\n ): Promise<boolean> {\n if (packageInfo.blockMapSize == null) {\n return true\n }\n\n try {\n const downloadOptions: DifferentialDownloaderOptions = {\n newUrl: new URL(packageInfo.path),\n oldFile: path.join(this.downloadedUpdateHelper!.cacheDir, CURRENT_APP_PACKAGE_FILE_NAME),\n logger: this._logger,\n newFile: packagePath,\n requestHeaders: this.requestHeaders,\n isUseMultipleRangeRequest: provider.isUseMultipleRangeRequest,\n cancellationToken: downloadUpdateOptions.cancellationToken,\n }\n\n if (this.listenerCount(DOWNLOAD_PROGRESS) > 0) {\n downloadOptions.onProgress = it => this.emit(DOWNLOAD_PROGRESS, it)\n }\n\n await new FileWithEmbeddedBlockMapDifferentialDownloader(packageInfo, this.httpExecutor, downloadOptions).download()\n } catch (e) {\n this._logger.error(`Cannot download differentially, fallback to full download: ${e.stack || e}`)\n // during test (developer machine mac or linux) we must throw error\n return process.platform === \"win32\"\n }\n return false\n }\n}\n\n/**\n * This handles both node 8 and node 10 way of emitting error when spawning a process\n * - node 8: Throws the error\n * - node 10: Emit the error(Need to listen with on)\n */\nasync function _spawn(exe: string, args: Array<string>): Promise<any> {\n return new Promise((resolve, reject) => {\n try {\n const process = spawn(exe, args, {\n detached: true,\n stdio: \"ignore\",\n })\n process.on(\"error\", error => {\n reject(error)\n })\n process.unref()\n\n if (process.pid !== undefined) {\n resolve(true)\n }\n } catch (error) {\n reject(error)\n }\n })\n}\n"]}