electron-incremental-update 2.0.0-beta.4 → 2.0.0-beta.6

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.
@@ -6,10 +6,6 @@ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require
6
6
  });
7
7
 
8
8
  // src/utils/version.ts
9
- function handleUnexpectedErrors(callback) {
10
- process.on("uncaughtException", callback);
11
- process.on("unhandledRejection", callback);
12
- }
13
9
  function parseVersion(version) {
14
10
  const match = /^(\d+)\.(\d+)\.(\d+)(?:-([a-z0-9.-]+))?/i.exec(version);
15
11
  if (!match) {
@@ -54,23 +50,21 @@ function defaultIsLowerVersion(oldVer, newVer) {
54
50
  return false;
55
51
  }
56
52
  function isUpdateJSON(json) {
57
- const is = (j) => !!(j && j.minimumVersion && j.signature && j.size && j.version);
53
+ const is = (j) => !!(j && j.minimumVersion && j.signature && j.version);
58
54
  return is(json) && is(json?.beta);
59
55
  }
60
- function defaultVersionJsonGenerator(existingJson, buffer, signature, version, minimumVersion) {
56
+ function defaultVersionJsonGenerator(existingJson, signature, version, minimumVersion) {
61
57
  existingJson.beta = {
62
58
  version,
63
59
  minimumVersion,
64
- signature,
65
- size: buffer.length
60
+ signature
66
61
  };
67
62
  if (!parseVersion(version).stage) {
68
63
  existingJson.version = version;
69
64
  existingJson.minimumVersion = minimumVersion;
70
65
  existingJson.signature = signature;
71
- existingJson.size = buffer.length;
72
66
  }
73
67
  return existingJson;
74
68
  }
75
69
 
76
- export { __require, defaultIsLowerVersion, defaultVersionJsonGenerator, handleUnexpectedErrors, isUpdateJSON, parseVersion };
70
+ export { __require, defaultIsLowerVersion, defaultVersionJsonGenerator, isUpdateJSON, parseVersion };
@@ -1,4 +1,4 @@
1
- import { __require } from './chunk-BVFQWBLK.js';
1
+ import { __require } from './chunk-72ZAJ7AF.js';
2
2
  import { readFileSync, existsSync, mkdirSync } from 'node:fs';
3
3
  import { join, dirname } from 'node:path';
4
4
  import { app } from 'electron';
@@ -73,5 +73,9 @@ function getPathFromPublic(...paths) {
73
73
  function getPathFromEntryAsar(...paths) {
74
74
  return join(app.getAppPath(), __EIU_ENTRY_DIST_PATH__, ...paths);
75
75
  }
76
+ function handleUnexpectedErrors(callback) {
77
+ process.on("uncaughtException", callback);
78
+ process.on("unhandledRejection", callback);
79
+ }
76
80
 
77
- export { disableHWAccForWin7, getAppVersion, getEntryVersion, getPathFromAppNameAsar, getPathFromEntryAsar, getPathFromPreload, getPathFromPublic, isDev, isLinux, isMac, isWin, loadPage, requireNative, restartApp, setAppUserModelId, setPortableAppDataPath, singleInstance };
81
+ export { disableHWAccForWin7, getAppVersion, getEntryVersion, getPathFromAppNameAsar, getPathFromEntryAsar, getPathFromPreload, getPathFromPublic, handleUnexpectedErrors, isDev, isLinux, isMac, isWin, loadPage, requireNative, restartApp, setAppUserModelId, setPortableAppDataPath, singleInstance };
@@ -40,14 +40,16 @@ function aesDecrypt(encryptedText, key, iv) {
40
40
  const decipher = createDecipheriv("aes-256-cbc", key, iv);
41
41
  return decipher.update(encryptedText, "base64url", "utf8") + decipher.final("utf8");
42
42
  }
43
- function defaultVerify(buffer, signature, cert) {
43
+ function defaultVerifySignature(buffer, version, signature, cert) {
44
44
  try {
45
- const [sig, version] = aesDecrypt(signature, hashBuffer(cert, 32), hashBuffer(buffer, 16)).split("%");
46
- const result = createVerify("RSA-SHA256").update(buffer).verify(cert, sig, "base64");
47
- return result ? version : void 0;
45
+ const [sig, ver] = aesDecrypt(signature, hashBuffer(cert, 32), hashBuffer(buffer, 16)).split("%");
46
+ if (ver !== version) {
47
+ return false;
48
+ }
49
+ return createVerify("RSA-SHA256").update(buffer).verify(cert, sig, "base64");
48
50
  } catch {
49
- return void 0;
51
+ return false;
50
52
  }
51
53
  }
52
54
 
53
- export { aesDecrypt, aesEncrypt, defaultSignature, defaultUnzipFile, defaultVerify, defaultZipFile, hashBuffer };
55
+ export { aesDecrypt, aesEncrypt, defaultSignature, defaultUnzipFile, defaultVerifySignature, defaultZipFile, hashBuffer };
package/dist/index.cjs CHANGED
@@ -14,7 +14,7 @@ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require
14
14
 
15
15
  // src/utils/version.ts
16
16
  function isUpdateJSON(json) {
17
- const is = (j) => !!(j && j.minimumVersion && j.signature && j.size && j.version);
17
+ const is = (j) => !!(j && j.minimumVersion && j.signature && j.version);
18
18
  return is(json) && is(json?.beta);
19
19
  }
20
20
  var isDev = __EIU_IS_DEV__;
@@ -128,14 +128,13 @@ var Updater = class extends events.EventEmitter {
128
128
  if (!_data) {
129
129
  return emitUnavailable("failed to get update info");
130
130
  }
131
- let { signature, size, version, minimumVersion, beta } = _data;
131
+ let { signature, version, minimumVersion, beta } = _data;
132
132
  if (this.receiveBeta) {
133
133
  version = beta.version;
134
134
  signature = beta.signature;
135
135
  minimumVersion = beta.minimumVersion;
136
- size = beta.size;
137
136
  }
138
- this.logger?.debug(`checked update, version: ${version}, size: ${size}, signature: ${signature}`);
137
+ this.logger?.debug(`checked update, version: ${version}, signature: ${signature}`);
139
138
  if (isDev && !this.forceUpdate && !data) {
140
139
  return emitUnavailable("skip check update in dev mode, to force update, set `updater.forceUpdate` to true or call checkUpdate with UpdateJSON");
141
140
  }
@@ -150,14 +149,15 @@ var Updater = class extends events.EventEmitter {
150
149
  return emitUnavailable(`current version (${appVersion}) < new version (${version})`);
151
150
  }
152
151
  this.logger?.info(`update available: ${version}`);
153
- this.info = { signature, minimumVersion, version, size };
152
+ this.info = { signature, minimumVersion, version };
154
153
  this.emit("update-available", this.info);
155
154
  return true;
156
155
  }
157
- async downloadUpdate(data, sig) {
158
- const _sig = sig ?? this.info?.signature;
159
- if (!_sig) {
160
- this.err("download failed", "param", "no update signature, please call `checkUpdate` first");
156
+ async downloadUpdate(data, info) {
157
+ const _sig = info?.signature ?? this.info?.signature;
158
+ const _version = info?.version ?? this.info?.version;
159
+ if (!_sig || !_version) {
160
+ this.err("download failed", "param", "no update signature, please call `checkUpdate` first or manually setup params");
161
161
  return false;
162
162
  }
163
163
  const buffer = await this.fetch("buffer", data ? Buffer.from(data) : void 0);
@@ -166,8 +166,7 @@ var Updater = class extends events.EventEmitter {
166
166
  return false;
167
167
  }
168
168
  this.logger?.debug("verify start");
169
- const _ver = await this.provider.verifySignaure(buffer, _sig, this.CERT);
170
- if (!_ver) {
169
+ if (!await this.provider.verifySignaure(buffer, _version, _sig, this.CERT)) {
171
170
  this.err("download failed", "validate", "invalid signature / certificate pair");
172
171
  return false;
173
172
  }
@@ -176,7 +175,7 @@ var Updater = class extends events.EventEmitter {
176
175
  const tmpFilePath = getPathFromAppNameAsar() + ".tmp";
177
176
  this.logger?.debug(`install to ${tmpFilePath}`);
178
177
  fs.writeFileSync(tmpFilePath, await this.provider.unzipFile(buffer));
179
- this.logger?.info(`download success, version: ${_ver}`);
178
+ this.logger?.info(`download success, version: ${_version}`);
180
179
  this.info = void 0;
181
180
  this.emit("update-downloaded");
182
181
  return true;
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
- import { isDev, getEntryVersion, getAppVersion, getPathFromAppNameAsar, restartApp } from './chunk-PNYRQYFC.js';
2
- import { isUpdateJSON, __require } from './chunk-BVFQWBLK.js';
1
+ import { isDev, getEntryVersion, getAppVersion, getPathFromAppNameAsar, restartApp } from './chunk-DFNDKSE6.js';
2
+ import { isUpdateJSON, __require } from './chunk-72ZAJ7AF.js';
3
3
  import { join } from 'node:path';
4
4
  import { writeFileSync, existsSync, renameSync } from 'node:fs';
5
5
  import { app } from 'electron';
@@ -98,14 +98,13 @@ var Updater = class extends EventEmitter {
98
98
  if (!_data) {
99
99
  return emitUnavailable("failed to get update info");
100
100
  }
101
- let { signature, size, version, minimumVersion, beta } = _data;
101
+ let { signature, version, minimumVersion, beta } = _data;
102
102
  if (this.receiveBeta) {
103
103
  version = beta.version;
104
104
  signature = beta.signature;
105
105
  minimumVersion = beta.minimumVersion;
106
- size = beta.size;
107
106
  }
108
- this.logger?.debug(`checked update, version: ${version}, size: ${size}, signature: ${signature}`);
107
+ this.logger?.debug(`checked update, version: ${version}, signature: ${signature}`);
109
108
  if (isDev && !this.forceUpdate && !data) {
110
109
  return emitUnavailable("skip check update in dev mode, to force update, set `updater.forceUpdate` to true or call checkUpdate with UpdateJSON");
111
110
  }
@@ -120,14 +119,15 @@ var Updater = class extends EventEmitter {
120
119
  return emitUnavailable(`current version (${appVersion}) < new version (${version})`);
121
120
  }
122
121
  this.logger?.info(`update available: ${version}`);
123
- this.info = { signature, minimumVersion, version, size };
122
+ this.info = { signature, minimumVersion, version };
124
123
  this.emit("update-available", this.info);
125
124
  return true;
126
125
  }
127
- async downloadUpdate(data, sig) {
128
- const _sig = sig ?? this.info?.signature;
129
- if (!_sig) {
130
- this.err("download failed", "param", "no update signature, please call `checkUpdate` first");
126
+ async downloadUpdate(data, info) {
127
+ const _sig = info?.signature ?? this.info?.signature;
128
+ const _version = info?.version ?? this.info?.version;
129
+ if (!_sig || !_version) {
130
+ this.err("download failed", "param", "no update signature, please call `checkUpdate` first or manually setup params");
131
131
  return false;
132
132
  }
133
133
  const buffer = await this.fetch("buffer", data ? Buffer.from(data) : void 0);
@@ -136,8 +136,7 @@ var Updater = class extends EventEmitter {
136
136
  return false;
137
137
  }
138
138
  this.logger?.debug("verify start");
139
- const _ver = await this.provider.verifySignaure(buffer, _sig, this.CERT);
140
- if (!_ver) {
139
+ if (!await this.provider.verifySignaure(buffer, _version, _sig, this.CERT)) {
141
140
  this.err("download failed", "validate", "invalid signature / certificate pair");
142
141
  return false;
143
142
  }
@@ -146,7 +145,7 @@ var Updater = class extends EventEmitter {
146
145
  const tmpFilePath = getPathFromAppNameAsar() + ".tmp";
147
146
  this.logger?.debug(`install to ${tmpFilePath}`);
148
147
  writeFileSync(tmpFilePath, await this.provider.unzipFile(buffer));
149
- this.logger?.info(`download success, version: ${_ver}`);
148
+ this.logger?.info(`download success, version: ${_version}`);
150
149
  this.info = void 0;
151
150
  this.emit("update-downloaded");
152
151
  return true;
package/dist/provider.cjs CHANGED
@@ -52,11 +52,19 @@ function defaultIsLowerVersion(oldVer, newVer) {
52
52
  return false;
53
53
  }
54
54
  function isUpdateJSON(json) {
55
- const is = (j) => !!(j && j.minimumVersion && j.signature && j.size && j.version);
55
+ const is = (j) => !!(j && j.minimumVersion && j.signature && j.version);
56
56
  return is(json) && is(json?.beta);
57
57
  }
58
58
 
59
59
  // src/provider/download.ts
60
+ function getHeader(response, headerKey) {
61
+ const value = response.headers[headerKey];
62
+ if (Array.isArray(value)) {
63
+ return value.length === 0 ? null : value[value.length - 1];
64
+ } else {
65
+ return value;
66
+ }
67
+ }
60
68
  async function downloadFn(url, headers, onResponse) {
61
69
  await electron.app.whenReady();
62
70
  return new Promise((resolve, reject) => {
@@ -89,20 +97,22 @@ async function defaultDownloadUpdateJSON(url, headers) {
89
97
  });
90
98
  });
91
99
  }
92
- async function defaultDownloadAsar(url, headers, total, onDownloading) {
100
+ async function defaultDownloadAsar(url, headers, onDownloading) {
93
101
  let transferred = 0;
94
102
  let time = Date.now();
95
103
  return await downloadFn(url, headers, (resp, resolve) => {
104
+ const total = getHeader(resp.headers, "content-length") || -1;
96
105
  let data = [];
97
106
  resp.on("data", (chunk) => {
98
- transferred += chunk.length;
107
+ const delta = chunk.length;
108
+ transferred += delta;
99
109
  const current = Date.now();
100
110
  onDownloading?.({
101
111
  percent: +(transferred / total).toFixed(2) * 100,
102
112
  total,
103
113
  transferred,
104
- delta: chunk.length,
105
- bps: chunk.length / ((current - time) * 1e3)
114
+ delta,
115
+ bps: delta / ((current - time) * 1e3)
106
116
  });
107
117
  time = current;
108
118
  data.push(chunk);
@@ -118,13 +128,15 @@ function aesDecrypt(encryptedText, key, iv) {
118
128
  const decipher = crypto.createDecipheriv("aes-256-cbc", key, iv);
119
129
  return decipher.update(encryptedText, "base64url", "utf8") + decipher.final("utf8");
120
130
  }
121
- function defaultVerify(buffer, signature, cert) {
131
+ function defaultVerifySignature(buffer, version, signature, cert) {
122
132
  try {
123
- const [sig, version] = aesDecrypt(signature, hashBuffer(cert, 32), hashBuffer(buffer, 16)).split("%");
124
- const result = crypto.createVerify("RSA-SHA256").update(buffer).verify(cert, sig, "base64");
125
- return result ? version : void 0;
133
+ const [sig, ver] = aesDecrypt(signature, hashBuffer(cert, 32), hashBuffer(buffer, 16)).split("%");
134
+ if (ver !== version) {
135
+ return false;
136
+ }
137
+ return crypto.createVerify("RSA-SHA256").update(buffer).verify(cert, sig, "base64");
126
138
  } catch {
127
- return void 0;
139
+ return false;
128
140
  }
129
141
  }
130
142
  async function defaultUnzipFile(buffer) {
@@ -143,7 +155,7 @@ async function defaultUnzipFile(buffer) {
143
155
  var BaseProvider = class {
144
156
  name = "BaseProvider";
145
157
  isLowerVersion = defaultIsLowerVersion;
146
- verifySignaure = defaultVerify;
158
+ verifySignaure = defaultVerifySignature;
147
159
  unzipFile = defaultUnzipFile;
148
160
  };
149
161
 
@@ -178,15 +190,14 @@ var GitHubProvider = class extends BaseProvider {
178
190
  }
179
191
  async downloadJSON(versionPath) {
180
192
  return await defaultDownloadUpdateJSON(
181
- await this.parseURL(false, `HEAD/${versionPath}`),
193
+ await this.parseURL(false, `${this.options.branch ?? "HEAD"}/${versionPath}`),
182
194
  { accept: "application/json", ...this.options.extraHeaders }
183
195
  );
184
196
  }
185
- async downloadAsar(name, { version, size }, onDownloading) {
197
+ async downloadAsar(name, info, onDownloading) {
186
198
  return await defaultDownloadAsar(
187
- await this.parseURL(true, `releases/download/v${version}/${name}-${version}.asar.gz`),
199
+ await this.parseURL(true, `releases/download/v${info.version}/${name}-${info.version}.asar.gz`),
188
200
  { accept: "application/octet-stream", ...this.options.extraHeaders },
189
- size,
190
201
  onDownloading
191
202
  );
192
203
  }
@@ -196,3 +207,4 @@ exports.BaseProvider = BaseProvider;
196
207
  exports.GitHubProvider = GitHubProvider;
197
208
  exports.defaultDownloadAsar = defaultDownloadAsar;
198
209
  exports.defaultDownloadUpdateJSON = defaultDownloadUpdateJSON;
210
+ exports.getHeader = getHeader;
package/dist/provider.js CHANGED
@@ -1,8 +1,16 @@
1
- import { defaultVerify, defaultUnzipFile } from './chunk-JSYIRKTR.js';
2
- import { defaultIsLowerVersion, isUpdateJSON } from './chunk-BVFQWBLK.js';
1
+ import { defaultVerifySignature, defaultUnzipFile } from './chunk-N77WQ5WB.js';
2
+ import { defaultIsLowerVersion, isUpdateJSON } from './chunk-72ZAJ7AF.js';
3
3
  import { URL } from 'node:url';
4
4
  import { app, net } from 'electron';
5
5
 
6
+ function getHeader(response, headerKey) {
7
+ const value = response.headers[headerKey];
8
+ if (Array.isArray(value)) {
9
+ return value.length === 0 ? null : value[value.length - 1];
10
+ } else {
11
+ return value;
12
+ }
13
+ }
6
14
  async function downloadFn(url, headers, onResponse) {
7
15
  await app.whenReady();
8
16
  return new Promise((resolve, reject) => {
@@ -35,20 +43,22 @@ async function defaultDownloadUpdateJSON(url, headers) {
35
43
  });
36
44
  });
37
45
  }
38
- async function defaultDownloadAsar(url, headers, total, onDownloading) {
46
+ async function defaultDownloadAsar(url, headers, onDownloading) {
39
47
  let transferred = 0;
40
48
  let time = Date.now();
41
49
  return await downloadFn(url, headers, (resp, resolve) => {
50
+ const total = getHeader(resp.headers, "content-length") || -1;
42
51
  let data = [];
43
52
  resp.on("data", (chunk) => {
44
- transferred += chunk.length;
53
+ const delta = chunk.length;
54
+ transferred += delta;
45
55
  const current = Date.now();
46
56
  onDownloading?.({
47
57
  percent: +(transferred / total).toFixed(2) * 100,
48
58
  total,
49
59
  transferred,
50
- delta: chunk.length,
51
- bps: chunk.length / ((current - time) * 1e3)
60
+ delta,
61
+ bps: delta / ((current - time) * 1e3)
52
62
  });
53
63
  time = current;
54
64
  data.push(chunk);
@@ -61,7 +71,7 @@ async function defaultDownloadAsar(url, headers, total, onDownloading) {
61
71
  var BaseProvider = class {
62
72
  name = "BaseProvider";
63
73
  isLowerVersion = defaultIsLowerVersion;
64
- verifySignaure = defaultVerify;
74
+ verifySignaure = defaultVerifySignature;
65
75
  unzipFile = defaultUnzipFile;
66
76
  };
67
77
 
@@ -96,18 +106,17 @@ var GitHubProvider = class extends BaseProvider {
96
106
  }
97
107
  async downloadJSON(versionPath) {
98
108
  return await defaultDownloadUpdateJSON(
99
- await this.parseURL(false, `HEAD/${versionPath}`),
109
+ await this.parseURL(false, `${this.options.branch ?? "HEAD"}/${versionPath}`),
100
110
  { accept: "application/json", ...this.options.extraHeaders }
101
111
  );
102
112
  }
103
- async downloadAsar(name, { version, size }, onDownloading) {
113
+ async downloadAsar(name, info, onDownloading) {
104
114
  return await defaultDownloadAsar(
105
- await this.parseURL(true, `releases/download/v${version}/${name}-${version}.asar.gz`),
115
+ await this.parseURL(true, `releases/download/v${info.version}/${name}-${info.version}.asar.gz`),
106
116
  { accept: "application/octet-stream", ...this.options.extraHeaders },
107
- size,
108
117
  onDownloading
109
118
  );
110
119
  }
111
120
  };
112
121
 
113
- export { BaseProvider, GitHubProvider, defaultDownloadAsar, defaultDownloadUpdateJSON };
122
+ export { BaseProvider, GitHubProvider, defaultDownloadAsar, defaultDownloadUpdateJSON, getHeader };
package/dist/utils.cjs CHANGED
@@ -5,6 +5,7 @@ var path = require('path');
5
5
  var electron = require('electron');
6
6
  var zlib = require('zlib');
7
7
  var crypto = require('crypto');
8
+ var ciInfo = require('ci-info');
8
9
 
9
10
  var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
10
11
  get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
@@ -82,6 +83,10 @@ function getPathFromPublic(...paths) {
82
83
  function getPathFromEntryAsar(...paths) {
83
84
  return path.join(electron.app.getAppPath(), __EIU_ENTRY_DIST_PATH__, ...paths);
84
85
  }
86
+ function handleUnexpectedErrors(callback) {
87
+ process.on("uncaughtException", callback);
88
+ process.on("unhandledRejection", callback);
89
+ }
85
90
  async function defaultZipFile(buffer) {
86
91
  return new Promise((resolve, reject) => {
87
92
  zlib.brotliCompress(buffer, (err, buffer2) => {
@@ -106,10 +111,6 @@ async function defaultUnzipFile(buffer) {
106
111
  }
107
112
 
108
113
  // src/utils/version.ts
109
- function handleUnexpectedErrors(callback) {
110
- process.on("uncaughtException", callback);
111
- process.on("unhandledRejection", callback);
112
- }
113
114
  function parseVersion(version) {
114
115
  const match = /^(\d+)\.(\d+)\.(\d+)(?:-([a-z0-9.-]+))?/i.exec(version);
115
116
  if (!match) {
@@ -154,21 +155,19 @@ function defaultIsLowerVersion(oldVer, newVer) {
154
155
  return false;
155
156
  }
156
157
  function isUpdateJSON(json) {
157
- const is = (j) => !!(j && j.minimumVersion && j.signature && j.size && j.version);
158
+ const is = (j) => !!(j && j.minimumVersion && j.signature && j.version);
158
159
  return is(json) && is(json?.beta);
159
160
  }
160
- function defaultVersionJsonGenerator(existingJson, buffer, signature, version, minimumVersion) {
161
+ function defaultVersionJsonGenerator(existingJson, signature, version, minimumVersion) {
161
162
  existingJson.beta = {
162
163
  version,
163
164
  minimumVersion,
164
- signature,
165
- size: buffer.length
165
+ signature
166
166
  };
167
167
  if (!parseVersion(version).stage) {
168
168
  existingJson.version = version;
169
169
  existingJson.minimumVersion = minimumVersion;
170
170
  existingJson.signature = signature;
171
- existingJson.size = buffer.length;
172
171
  }
173
172
  return existingJson;
174
173
  }
@@ -188,13 +187,15 @@ function aesDecrypt(encryptedText, key, iv) {
188
187
  const decipher = crypto.createDecipheriv("aes-256-cbc", key, iv);
189
188
  return decipher.update(encryptedText, "base64url", "utf8") + decipher.final("utf8");
190
189
  }
191
- function defaultVerify(buffer, signature, cert) {
190
+ function defaultVerifySignature(buffer, version, signature, cert) {
192
191
  try {
193
- const [sig, version] = aesDecrypt(signature, hashBuffer(cert, 32), hashBuffer(buffer, 16)).split("%");
194
- const result = crypto.createVerify("RSA-SHA256").update(buffer).verify(cert, sig, "base64");
195
- return result ? version : void 0;
192
+ const [sig, ver] = aesDecrypt(signature, hashBuffer(cert, 32), hashBuffer(buffer, 16)).split("%");
193
+ if (ver !== version) {
194
+ return false;
195
+ }
196
+ return crypto.createVerify("RSA-SHA256").update(buffer).verify(cert, sig, "base64");
196
197
  } catch {
197
- return void 0;
198
+ return false;
198
199
  }
199
200
  }
200
201
 
@@ -205,13 +206,17 @@ async function autoUpdate(updater) {
205
206
  }
206
207
  }
207
208
 
209
+ Object.defineProperty(exports, "isCI", {
210
+ enumerable: true,
211
+ get: function () { return ciInfo.isCI; }
212
+ });
208
213
  exports.aesDecrypt = aesDecrypt;
209
214
  exports.aesEncrypt = aesEncrypt;
210
215
  exports.autoUpdate = autoUpdate;
211
216
  exports.defaultIsLowerVersion = defaultIsLowerVersion;
212
217
  exports.defaultSignature = defaultSignature;
213
218
  exports.defaultUnzipFile = defaultUnzipFile;
214
- exports.defaultVerify = defaultVerify;
219
+ exports.defaultVerifySignature = defaultVerifySignature;
215
220
  exports.defaultVersionJsonGenerator = defaultVersionJsonGenerator;
216
221
  exports.defaultZipFile = defaultZipFile;
217
222
  exports.disableHWAccForWin7 = disableHWAccForWin7;
package/dist/utils.js CHANGED
@@ -1,6 +1,7 @@
1
- export { disableHWAccForWin7, getAppVersion, getEntryVersion, getPathFromAppNameAsar, getPathFromEntryAsar, getPathFromPreload, getPathFromPublic, isDev, isLinux, isMac, isWin, loadPage, requireNative, restartApp, setAppUserModelId, setPortableAppDataPath, singleInstance } from './chunk-PNYRQYFC.js';
2
- export { aesDecrypt, aesEncrypt, defaultSignature, defaultUnzipFile, defaultVerify, defaultZipFile, hashBuffer } from './chunk-JSYIRKTR.js';
3
- export { defaultIsLowerVersion, defaultVersionJsonGenerator, handleUnexpectedErrors, isUpdateJSON, parseVersion } from './chunk-BVFQWBLK.js';
1
+ export { disableHWAccForWin7, getAppVersion, getEntryVersion, getPathFromAppNameAsar, getPathFromEntryAsar, getPathFromPreload, getPathFromPublic, handleUnexpectedErrors, isDev, isLinux, isMac, isWin, loadPage, requireNative, restartApp, setAppUserModelId, setPortableAppDataPath, singleInstance } from './chunk-DFNDKSE6.js';
2
+ export { aesDecrypt, aesEncrypt, defaultSignature, defaultUnzipFile, defaultVerifySignature, defaultZipFile, hashBuffer } from './chunk-N77WQ5WB.js';
3
+ export { defaultIsLowerVersion, defaultVersionJsonGenerator, isUpdateJSON, parseVersion } from './chunk-72ZAJ7AF.js';
4
+ export { isCI } from 'ci-info';
4
5
 
5
6
  // src/utils/updater.ts
6
7
  async function autoUpdate(updater) {
package/dist/vite.js CHANGED
@@ -5,6 +5,7 @@ import ElectronSimple from 'vite-plugin-electron/simple';
5
5
  import { startup } from 'vite-plugin-electron';
6
6
  import { notBundle } from 'vite-plugin-electron/plugin';
7
7
  import { getPackageInfoSync, loadPackageJSON } from 'local-pkg';
8
+ import { isCI } from 'ci-info';
8
9
  import Asar from '@electron/asar';
9
10
  import { build } from 'esbuild';
10
11
  import { spawn } from 'node:child_process';
@@ -41,21 +42,19 @@ function parseVersion(version) {
41
42
  return ret;
42
43
  }
43
44
  function isUpdateJSON(json) {
44
- const is = (j) => !!(j && j.minimumVersion && j.signature && j.size && j.version);
45
+ const is = (j) => !!(j && j.minimumVersion && j.signature && j.version);
45
46
  return is(json) && is(json?.beta);
46
47
  }
47
- function defaultVersionJsonGenerator(existingJson, buffer, signature, version, minimumVersion) {
48
+ function defaultVersionJsonGenerator(existingJson, signature, version, minimumVersion) {
48
49
  existingJson.beta = {
49
50
  version,
50
51
  minimumVersion,
51
- signature,
52
- size: buffer.length
52
+ signature
53
53
  };
54
54
  if (!parseVersion(version).stage) {
55
55
  existingJson.version = version;
56
56
  existingJson.minimumVersion = minimumVersion;
57
57
  existingJson.signature = signature;
58
- existingJson.size = buffer.length;
59
58
  }
60
59
  return existingJson;
61
60
  }
@@ -159,6 +158,17 @@ function obfuscateString(input) {
159
158
  return `(${decodeFn})([${hexArray.join(",")}],${offset})`;
160
159
  }
161
160
 
161
+ // src/build-plugins/utils.ts
162
+ function readableSize(size) {
163
+ const units = ["B", "KB", "MB", "GB"];
164
+ let i = 0;
165
+ while (size >= 1024 && i < units.length - 1) {
166
+ size /= 1024;
167
+ i++;
168
+ }
169
+ return `${size.toFixed(2)} ${units[i]}`;
170
+ }
171
+
162
172
  // src/build-plugins/build.ts
163
173
  async function buildAsar({
164
174
  version,
@@ -173,6 +183,7 @@ async function buildAsar({
173
183
  await Asar.createPackage(electronDistPath, asarOutputPath);
174
184
  const buf = await generateGzipFile(readFileSync(asarOutputPath));
175
185
  writeFileSync(gzipPath, buf);
186
+ log.info(`build update asar to '${gzipPath}' [${readableSize(buf.length)}]`, { timestamp: true });
176
187
  return buf;
177
188
  }
178
189
  async function buildVersion({
@@ -188,12 +199,10 @@ async function buildVersion({
188
199
  beta: {
189
200
  minimumVersion: version,
190
201
  signature: "",
191
- size: 0,
192
202
  version
193
203
  },
194
204
  minimumVersion: version,
195
205
  signature: "",
196
- size: 0,
197
206
  version
198
207
  };
199
208
  if (existsSync(versionPath)) {
@@ -208,11 +217,12 @@ async function buildVersion({
208
217
  }
209
218
  }
210
219
  const sig = await generateSignature(asarBuffer, privateKey, cert, version);
211
- _json = await generateVersionJson(_json, asarBuffer, sig, version, minimumVersion);
220
+ _json = await generateVersionJson(_json, sig, version, minimumVersion);
212
221
  if (!isUpdateJSON(_json)) {
213
222
  throw new Error("invalid version info");
214
223
  }
215
224
  writeFileSync(versionPath, JSON.stringify(_json, null, 2));
225
+ log.info(`build version info to '${versionPath}'`, { timestamp: true });
216
226
  }
217
227
  async function buildEntry({
218
228
  sourcemap,
@@ -270,11 +280,11 @@ async function buildEntry({
270
280
  `${isEntry ? bytecodeModuleLoaderCode : useStrict}${isEntry ? "" : "module.exports = "}require("./${fileName}c")`
271
281
  );
272
282
  bytecodeLog.info(
273
- `${filePath} => ${(buffer.byteLength / 1e3).toFixed(2)} kB`,
283
+ `${filePath} [${(buffer.byteLength / 1e3).toFixed(2)} kB]`,
274
284
  { timestamp: true }
275
285
  );
276
286
  }
277
- bytecodeLog.info(`${filePaths.length} bundles compiled into bytecode`, { timestamp: true });
287
+ bytecodeLog.info(`${filePaths.length} file${filePaths.length > 1 ? "s" : ""} compiled into bytecode`, { timestamp: true });
278
288
  }
279
289
  function getCert(code) {
280
290
  const cert = code.match(/-----BEGIN CERTIFICATE-----[\s\S]*-----END CERTIFICATE-----\\n/)?.[0];
@@ -421,19 +431,6 @@ function parseOptions(pkg, sourcemap = false, minify = false, options = {}) {
421
431
  };
422
432
  return { buildAsarOption, buildEntryOption, buildVersionOption, postBuild, cert };
423
433
  }
424
-
425
- // src/build-plugins/utils.ts
426
- function readableSize(size) {
427
- const units = ["B", "KB", "MB", "GB"];
428
- let i = 0;
429
- while (size >= 1024 && i < units.length - 1) {
430
- size /= 1024;
431
- i++;
432
- }
433
- return `${size.toFixed(2)} ${units[i]}`;
434
- }
435
-
436
- // src/build-plugins/bytecode/index.ts
437
434
  function bytecodePlugin(isBuild, env, options = {}) {
438
435
  if (!isBuild) {
439
436
  return null;
@@ -571,7 +568,7 @@ ${bytecodeLoaderBlock}`) : _code;
571
568
  const outDir = `${normalizePath(path2.relative(config.root, path2.resolve(config.root, config.build.outDir)))}/`;
572
569
  bytecodeFiles.forEach((file) => {
573
570
  bytecodeLog.info(
574
- `${outDir}${file.name} => ${readableSize(file.size)}`,
571
+ `${outDir}${file.name} [${readableSize(file.size)}]`,
575
572
  { timestamp: true }
576
573
  );
577
574
  });
@@ -619,6 +616,7 @@ async function electronWithUpdater(options) {
619
616
  preload: _preload,
620
617
  sourcemap = !isBuild,
621
618
  minify = isBuild,
619
+ buildVersionJson = isCI,
622
620
  updater,
623
621
  bytecode,
624
622
  useNotBundle = true,
@@ -738,9 +736,9 @@ async function electronWithUpdater(options) {
738
736
  await _buildEntry();
739
737
  await _postBuild();
740
738
  const buffer = await buildAsar(buildAsarOption);
741
- log.info(`build update asar to '${buildAsarOption.gzipPath}' => ${readableSize(buffer.length)}`, { timestamp: true });
742
- await buildVersion(buildVersionOption, buffer);
743
- log.info(`build version info to '${buildVersionOption.versionPath}'`, { timestamp: true });
739
+ if (buildVersionJson) {
740
+ await buildVersion(buildVersionOption, buffer);
741
+ }
744
742
  }
745
743
  }
746
744
  ],
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "electron-incremental-update",
3
3
  "type": "module",
4
- "version": "2.0.0-beta.4",
4
+ "version": "2.0.0-beta.6",
5
5
  "description": "electron incremental update tools, powered by vite",
6
6
  "author": "subframe7536",
7
7
  "license": "MIT",
@@ -60,6 +60,7 @@
60
60
  "@babel/core": "^7.24.7",
61
61
  "@babel/plugin-transform-arrow-functions": "^7.24.7",
62
62
  "@subframe7536/type-utils": "^0.1.6",
63
+ "ci-info": "^4.0.0",
63
64
  "local-pkg": "^0.5.0",
64
65
  "selfsigned": "^2.4.1",
65
66
  "vite-plugin-electron": "^0.28.7"
@@ -78,4 +79,4 @@
78
79
  "vite-plugin-electron": "^0.28.7",
79
80
  "vitest": "^2.0.3"
80
81
  }
81
- }
82
+ }