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.
- package/dist/{chunk-BVFQWBLK.js → chunk-72ZAJ7AF.js} +4 -10
- package/dist/{chunk-PNYRQYFC.js → chunk-DFNDKSE6.js} +6 -2
- package/dist/{chunk-JSYIRKTR.js → chunk-N77WQ5WB.js} +8 -6
- package/dist/index.cjs +11 -12
- package/dist/index.js +12 -13
- package/dist/provider.cjs +27 -15
- package/dist/provider.js +21 -12
- package/dist/utils.cjs +20 -15
- package/dist/utils.js +4 -3
- package/dist/vite.js +25 -27
- package/package.json +3 -2
- package/dist/core-CW7TMqi7.d.cts +0 -134
- package/dist/core-D6QlpOgp.d.ts +0 -134
- package/dist/index.d.cts +0 -78
- package/dist/index.d.ts +0 -78
- package/dist/provider.d.cts +0 -64
- package/dist/provider.d.ts +0 -64
- package/dist/types-Bz1VD18z.d.cts +0 -105
- package/dist/types-Bz1VD18z.d.ts +0 -105
- package/dist/utils.d.cts +0 -75
- package/dist/utils.d.ts +0 -75
- package/dist/vite.d.ts +0 -397
- package/dist/zip-WRrEMkgp.d.cts +0 -10
- package/dist/zip-WRrEMkgp.d.ts +0 -10
|
@@ -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.
|
|
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,
|
|
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,
|
|
70
|
+
export { __require, defaultIsLowerVersion, defaultVersionJsonGenerator, isUpdateJSON, parseVersion };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { __require } from './chunk-
|
|
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
|
|
43
|
+
function defaultVerifySignature(buffer, version, signature, cert) {
|
|
44
44
|
try {
|
|
45
|
-
const [sig,
|
|
46
|
-
|
|
47
|
-
|
|
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
|
|
51
|
+
return false;
|
|
50
52
|
}
|
|
51
53
|
}
|
|
52
54
|
|
|
53
|
-
export { aesDecrypt, aesEncrypt, defaultSignature, defaultUnzipFile,
|
|
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.
|
|
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,
|
|
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},
|
|
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
|
|
152
|
+
this.info = { signature, minimumVersion, version };
|
|
154
153
|
this.emit("update-available", this.info);
|
|
155
154
|
return true;
|
|
156
155
|
}
|
|
157
|
-
async downloadUpdate(data,
|
|
158
|
-
const _sig =
|
|
159
|
-
|
|
160
|
-
|
|
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
|
-
|
|
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: ${
|
|
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-
|
|
2
|
-
import { isUpdateJSON, __require } from './chunk-
|
|
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,
|
|
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},
|
|
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
|
|
122
|
+
this.info = { signature, minimumVersion, version };
|
|
124
123
|
this.emit("update-available", this.info);
|
|
125
124
|
return true;
|
|
126
125
|
}
|
|
127
|
-
async downloadUpdate(data,
|
|
128
|
-
const _sig =
|
|
129
|
-
|
|
130
|
-
|
|
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
|
-
|
|
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: ${
|
|
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.
|
|
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,
|
|
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
|
-
|
|
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
|
|
105
|
-
bps:
|
|
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
|
|
131
|
+
function defaultVerifySignature(buffer, version, signature, cert) {
|
|
122
132
|
try {
|
|
123
|
-
const [sig,
|
|
124
|
-
|
|
125
|
-
|
|
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
|
|
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 =
|
|
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,
|
|
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,
|
|
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 {
|
|
2
|
-
import { defaultIsLowerVersion, isUpdateJSON } from './chunk-
|
|
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,
|
|
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
|
-
|
|
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
|
|
51
|
-
bps:
|
|
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 =
|
|
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,
|
|
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,
|
|
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.
|
|
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,
|
|
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
|
|
190
|
+
function defaultVerifySignature(buffer, version, signature, cert) {
|
|
192
191
|
try {
|
|
193
|
-
const [sig,
|
|
194
|
-
|
|
195
|
-
|
|
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
|
|
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.
|
|
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-
|
|
2
|
-
export { aesDecrypt, aesEncrypt, defaultSignature, defaultUnzipFile,
|
|
3
|
-
export { defaultIsLowerVersion, defaultVersionJsonGenerator,
|
|
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.
|
|
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,
|
|
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,
|
|
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}
|
|
283
|
+
`${filePath} [${(buffer.byteLength / 1e3).toFixed(2)} kB]`,
|
|
274
284
|
{ timestamp: true }
|
|
275
285
|
);
|
|
276
286
|
}
|
|
277
|
-
bytecodeLog.info(`${filePaths.length}
|
|
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}
|
|
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
|
-
|
|
742
|
-
|
|
743
|
-
|
|
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
|
+
"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
|
+
}
|