electron-incremental-update 3.0.0-beta.5 → 3.0.0

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.
@@ -0,0 +1,259 @@
1
+ //#region \0rolldown/runtime.js
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __copyProps = (to, from, except, desc) => {
9
+ if (from && typeof from === "object" || typeof from === "function") for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
10
+ key = keys[i];
11
+ if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
12
+ get: ((k) => from[k]).bind(null, key),
13
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
14
+ });
15
+ }
16
+ return to;
17
+ };
18
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", {
19
+ value: mod,
20
+ enumerable: true
21
+ }) : target, mod));
22
+ //#endregion
23
+ let node_zlib = require("node:zlib");
24
+ node_zlib = __toESM(node_zlib, 1);
25
+ let node_crypto = require("node:crypto");
26
+ node_crypto = __toESM(node_crypto, 1);
27
+ //#region src/utils/version.ts
28
+ const REG_VERSION = /^(\d+)\.(\d+)\.(\d+)(?:-([a-z0-9]+)(?:\.(\d+))?)?$/i;
29
+ /**
30
+ * Parse version string to {@link Version}, like `0.2.0-beta.1`
31
+ *
32
+ * **Supported format**: `major.minor.patch[-stage[.stageVersion]]`
33
+ *
34
+ * Build metadata (`+build`) and complex semver prerelease identifiers
35
+ * (e.g. `1.0.0-beta.1.2`) are not supported yet.
36
+ * @param version version string
37
+ */
38
+ function parseVersion(version) {
39
+ const match = REG_VERSION.exec(version);
40
+ if (!match) throw new TypeError(`invalid version: ${version}`);
41
+ const [major, minor, patch] = match.slice(1, 4).map(Number);
42
+ const ret = {
43
+ major,
44
+ minor,
45
+ patch,
46
+ stage: "",
47
+ stageVersion: -1
48
+ };
49
+ if (match[4]) {
50
+ ret.stage = match[4];
51
+ ret.stageVersion = match[5] === void 0 ? -1 : Number(match[5]);
52
+ }
53
+ if (Number.isNaN(major) || Number.isNaN(minor) || Number.isNaN(patch) || Number.isNaN(ret.stageVersion)) throw new TypeError(`Invalid version: ${version}`);
54
+ return ret;
55
+ }
56
+ function parsePrerelease(version) {
57
+ if (!version.stage) return [];
58
+ return [version.stage, version.stageVersion === -1 ? void 0 : String(version.stageVersion)].filter((value) => value !== void 0).flatMap((value) => value.split(".")).map((raw) => {
59
+ return {
60
+ raw,
61
+ numeric: /^\d+$/.test(raw) ? Number(raw) : void 0
62
+ };
63
+ });
64
+ }
65
+ function comparePrerelease(oldV, newV) {
66
+ const oldParts = parsePrerelease(oldV);
67
+ const newParts = parsePrerelease(newV);
68
+ if (oldParts.length === 0 || newParts.length === 0) return oldParts.length > 0 && newParts.length === 0;
69
+ const length = Math.max(oldParts.length, newParts.length);
70
+ for (let i = 0; i < length; i++) {
71
+ const oldPart = oldParts[i];
72
+ const newPart = newParts[i];
73
+ if (!oldPart) return true;
74
+ if (!newPart) return false;
75
+ if (oldPart.raw === newPart.raw) continue;
76
+ if (oldPart.numeric !== void 0 && newPart.numeric !== void 0) return oldPart.numeric < newPart.numeric;
77
+ if (oldPart.numeric !== void 0) return true;
78
+ if (newPart.numeric !== void 0) return false;
79
+ return oldPart.raw < newPart.raw;
80
+ }
81
+ return false;
82
+ }
83
+ /**
84
+ * Default function to check the old version is less than new version
85
+ * @param oldVer old version string
86
+ * @param newVer new version string
87
+ */
88
+ function defaultIsLowerVersion(oldVer, newVer) {
89
+ const oldV = parseVersion(oldVer);
90
+ const newV = parseVersion(newVer);
91
+ for (const key of [
92
+ "major",
93
+ "minor",
94
+ "patch"
95
+ ]) if (oldV[key] !== newV[key]) return oldV[key] < newV[key];
96
+ return comparePrerelease(oldV, newV);
97
+ }
98
+ const is = (j) => !!(j && j.minimumVersion && j.signature && j.version);
99
+ /**
100
+ * Check is `UpdateJSON`
101
+ * @param json any variable
102
+ */
103
+ function isUpdateJSON(json) {
104
+ return json && is(json) && is(json.beta);
105
+ }
106
+ /**
107
+ * Default function to generate `UpdateJSON`
108
+ * @param existingJson exising update json
109
+ * @param signature sigature
110
+ * @param version target version
111
+ * @param minimumVersion minimum version
112
+ */
113
+ function defaultVersionJsonGenerator(existingJson, signature, version, minimumVersion) {
114
+ existingJson.beta = {
115
+ version,
116
+ minimumVersion,
117
+ signature
118
+ };
119
+ if (!parseVersion(version).stage) {
120
+ existingJson.version = version;
121
+ existingJson.minimumVersion = minimumVersion;
122
+ existingJson.signature = signature;
123
+ }
124
+ return existingJson;
125
+ }
126
+ //#endregion
127
+ //#region src/utils/compress.ts
128
+ /**
129
+ * Default function to compress file using brotli
130
+ * @param buffer uncompressed file buffer
131
+ */
132
+ async function defaultCompressFile(buffer) {
133
+ return new Promise((resolve, reject) => {
134
+ node_zlib.default.brotliCompress(buffer, (err, buffer) => err ? reject(err) : resolve(buffer));
135
+ });
136
+ }
137
+ /**
138
+ * Default function to decompress file using brotli
139
+ * @param buffer compressed file buffer
140
+ */
141
+ async function defaultDecompressFile(buffer) {
142
+ return new Promise((resolve, reject) => {
143
+ node_zlib.default.brotliDecompress(buffer, (err, buffer) => err ? reject(err) : resolve(buffer));
144
+ });
145
+ }
146
+ //#endregion
147
+ //#region src/utils/crypto.ts
148
+ function hashBuffer(data, length) {
149
+ const hash = node_crypto.default.createHash("SHA256").update(data).digest("binary");
150
+ return Buffer.from(hash).subarray(0, length);
151
+ }
152
+ function aesEncrypt(plainText, key, iv) {
153
+ const cipher = node_crypto.default.createCipheriv("aes-256-cbc", key, iv);
154
+ return cipher.update(plainText, "utf8", "base64url") + cipher.final("base64url");
155
+ }
156
+ /**
157
+ * Default function to generate asar signature, returns generated signature
158
+ * @param buffer file buffer
159
+ * @param privateKey primary key
160
+ * @param cert certificate
161
+ * @param version target version
162
+ */
163
+ function defaultSignature(buffer, privateKey, cert, version) {
164
+ return aesEncrypt(`${node_crypto.default.createSign("RSA-SHA256").update(buffer).sign(node_crypto.default.createPrivateKey(privateKey), "base64")}%${version}`, hashBuffer(cert, 32), hashBuffer(buffer, 16));
165
+ }
166
+ function aesDecrypt(encryptedText, key, iv) {
167
+ const decipher = node_crypto.default.createDecipheriv("aes-256-cbc", key, iv);
168
+ return decipher.update(encryptedText, "base64url", "utf8") + decipher.final("utf8");
169
+ }
170
+ /**
171
+ * Default function to verify asar signature,
172
+ * if signature is valid, returns the version, otherwise returns `undefined`
173
+ * @param buffer file buffer
174
+ * @param version target version
175
+ * @param signature signature
176
+ * @param cert certificate
177
+ */
178
+ function defaultVerifySignature(buffer, version, signature, cert) {
179
+ try {
180
+ const [sig, ver] = aesDecrypt(signature, hashBuffer(cert, 32), hashBuffer(buffer, 16)).split("%");
181
+ if (ver !== version) return false;
182
+ return node_crypto.default.createVerify("RSA-SHA256").update(buffer).verify(cert, sig, "base64");
183
+ } catch {
184
+ return false;
185
+ }
186
+ }
187
+ //#endregion
188
+ Object.defineProperty(exports, "__toESM", {
189
+ enumerable: true,
190
+ get: function() {
191
+ return __toESM;
192
+ }
193
+ });
194
+ Object.defineProperty(exports, "aesDecrypt", {
195
+ enumerable: true,
196
+ get: function() {
197
+ return aesDecrypt;
198
+ }
199
+ });
200
+ Object.defineProperty(exports, "aesEncrypt", {
201
+ enumerable: true,
202
+ get: function() {
203
+ return aesEncrypt;
204
+ }
205
+ });
206
+ Object.defineProperty(exports, "defaultCompressFile", {
207
+ enumerable: true,
208
+ get: function() {
209
+ return defaultCompressFile;
210
+ }
211
+ });
212
+ Object.defineProperty(exports, "defaultDecompressFile", {
213
+ enumerable: true,
214
+ get: function() {
215
+ return defaultDecompressFile;
216
+ }
217
+ });
218
+ Object.defineProperty(exports, "defaultIsLowerVersion", {
219
+ enumerable: true,
220
+ get: function() {
221
+ return defaultIsLowerVersion;
222
+ }
223
+ });
224
+ Object.defineProperty(exports, "defaultSignature", {
225
+ enumerable: true,
226
+ get: function() {
227
+ return defaultSignature;
228
+ }
229
+ });
230
+ Object.defineProperty(exports, "defaultVerifySignature", {
231
+ enumerable: true,
232
+ get: function() {
233
+ return defaultVerifySignature;
234
+ }
235
+ });
236
+ Object.defineProperty(exports, "defaultVersionJsonGenerator", {
237
+ enumerable: true,
238
+ get: function() {
239
+ return defaultVersionJsonGenerator;
240
+ }
241
+ });
242
+ Object.defineProperty(exports, "hashBuffer", {
243
+ enumerable: true,
244
+ get: function() {
245
+ return hashBuffer;
246
+ }
247
+ });
248
+ Object.defineProperty(exports, "isUpdateJSON", {
249
+ enumerable: true,
250
+ get: function() {
251
+ return isUpdateJSON;
252
+ }
253
+ });
254
+ Object.defineProperty(exports, "parseVersion", {
255
+ enumerable: true,
256
+ get: function() {
257
+ return parseVersion;
258
+ }
259
+ });
@@ -0,0 +1,164 @@
1
+ import zlib from "node:zlib";
2
+ import crypto from "node:crypto";
3
+ //#region src/utils/version.ts
4
+ const REG_VERSION = /^(\d+)\.(\d+)\.(\d+)(?:-([a-z0-9]+)(?:\.(\d+))?)?$/i;
5
+ /**
6
+ * Parse version string to {@link Version}, like `0.2.0-beta.1`
7
+ *
8
+ * **Supported format**: `major.minor.patch[-stage[.stageVersion]]`
9
+ *
10
+ * Build metadata (`+build`) and complex semver prerelease identifiers
11
+ * (e.g. `1.0.0-beta.1.2`) are not supported yet.
12
+ * @param version version string
13
+ */
14
+ function parseVersion(version) {
15
+ const match = REG_VERSION.exec(version);
16
+ if (!match) throw new TypeError(`invalid version: ${version}`);
17
+ const [major, minor, patch] = match.slice(1, 4).map(Number);
18
+ const ret = {
19
+ major,
20
+ minor,
21
+ patch,
22
+ stage: "",
23
+ stageVersion: -1
24
+ };
25
+ if (match[4]) {
26
+ ret.stage = match[4];
27
+ ret.stageVersion = match[5] === void 0 ? -1 : Number(match[5]);
28
+ }
29
+ if (Number.isNaN(major) || Number.isNaN(minor) || Number.isNaN(patch) || Number.isNaN(ret.stageVersion)) throw new TypeError(`Invalid version: ${version}`);
30
+ return ret;
31
+ }
32
+ function parsePrerelease(version) {
33
+ if (!version.stage) return [];
34
+ return [version.stage, version.stageVersion === -1 ? void 0 : String(version.stageVersion)].filter((value) => value !== void 0).flatMap((value) => value.split(".")).map((raw) => {
35
+ return {
36
+ raw,
37
+ numeric: /^\d+$/.test(raw) ? Number(raw) : void 0
38
+ };
39
+ });
40
+ }
41
+ function comparePrerelease(oldV, newV) {
42
+ const oldParts = parsePrerelease(oldV);
43
+ const newParts = parsePrerelease(newV);
44
+ if (oldParts.length === 0 || newParts.length === 0) return oldParts.length > 0 && newParts.length === 0;
45
+ const length = Math.max(oldParts.length, newParts.length);
46
+ for (let i = 0; i < length; i++) {
47
+ const oldPart = oldParts[i];
48
+ const newPart = newParts[i];
49
+ if (!oldPart) return true;
50
+ if (!newPart) return false;
51
+ if (oldPart.raw === newPart.raw) continue;
52
+ if (oldPart.numeric !== void 0 && newPart.numeric !== void 0) return oldPart.numeric < newPart.numeric;
53
+ if (oldPart.numeric !== void 0) return true;
54
+ if (newPart.numeric !== void 0) return false;
55
+ return oldPart.raw < newPart.raw;
56
+ }
57
+ return false;
58
+ }
59
+ /**
60
+ * Default function to check the old version is less than new version
61
+ * @param oldVer old version string
62
+ * @param newVer new version string
63
+ */
64
+ function defaultIsLowerVersion(oldVer, newVer) {
65
+ const oldV = parseVersion(oldVer);
66
+ const newV = parseVersion(newVer);
67
+ for (const key of [
68
+ "major",
69
+ "minor",
70
+ "patch"
71
+ ]) if (oldV[key] !== newV[key]) return oldV[key] < newV[key];
72
+ return comparePrerelease(oldV, newV);
73
+ }
74
+ const is = (j) => !!(j && j.minimumVersion && j.signature && j.version);
75
+ /**
76
+ * Check is `UpdateJSON`
77
+ * @param json any variable
78
+ */
79
+ function isUpdateJSON(json) {
80
+ return json && is(json) && is(json.beta);
81
+ }
82
+ /**
83
+ * Default function to generate `UpdateJSON`
84
+ * @param existingJson exising update json
85
+ * @param signature sigature
86
+ * @param version target version
87
+ * @param minimumVersion minimum version
88
+ */
89
+ function defaultVersionJsonGenerator(existingJson, signature, version, minimumVersion) {
90
+ existingJson.beta = {
91
+ version,
92
+ minimumVersion,
93
+ signature
94
+ };
95
+ if (!parseVersion(version).stage) {
96
+ existingJson.version = version;
97
+ existingJson.minimumVersion = minimumVersion;
98
+ existingJson.signature = signature;
99
+ }
100
+ return existingJson;
101
+ }
102
+ //#endregion
103
+ //#region src/utils/compress.ts
104
+ /**
105
+ * Default function to compress file using brotli
106
+ * @param buffer uncompressed file buffer
107
+ */
108
+ async function defaultCompressFile(buffer) {
109
+ return new Promise((resolve, reject) => {
110
+ zlib.brotliCompress(buffer, (err, buffer) => err ? reject(err) : resolve(buffer));
111
+ });
112
+ }
113
+ /**
114
+ * Default function to decompress file using brotli
115
+ * @param buffer compressed file buffer
116
+ */
117
+ async function defaultDecompressFile(buffer) {
118
+ return new Promise((resolve, reject) => {
119
+ zlib.brotliDecompress(buffer, (err, buffer) => err ? reject(err) : resolve(buffer));
120
+ });
121
+ }
122
+ //#endregion
123
+ //#region src/utils/crypto.ts
124
+ function hashBuffer(data, length) {
125
+ const hash = crypto.createHash("SHA256").update(data).digest("binary");
126
+ return Buffer.from(hash).subarray(0, length);
127
+ }
128
+ function aesEncrypt(plainText, key, iv) {
129
+ const cipher = crypto.createCipheriv("aes-256-cbc", key, iv);
130
+ return cipher.update(plainText, "utf8", "base64url") + cipher.final("base64url");
131
+ }
132
+ /**
133
+ * Default function to generate asar signature, returns generated signature
134
+ * @param buffer file buffer
135
+ * @param privateKey primary key
136
+ * @param cert certificate
137
+ * @param version target version
138
+ */
139
+ function defaultSignature(buffer, privateKey, cert, version) {
140
+ return aesEncrypt(`${crypto.createSign("RSA-SHA256").update(buffer).sign(crypto.createPrivateKey(privateKey), "base64")}%${version}`, hashBuffer(cert, 32), hashBuffer(buffer, 16));
141
+ }
142
+ function aesDecrypt(encryptedText, key, iv) {
143
+ const decipher = crypto.createDecipheriv("aes-256-cbc", key, iv);
144
+ return decipher.update(encryptedText, "base64url", "utf8") + decipher.final("utf8");
145
+ }
146
+ /**
147
+ * Default function to verify asar signature,
148
+ * if signature is valid, returns the version, otherwise returns `undefined`
149
+ * @param buffer file buffer
150
+ * @param version target version
151
+ * @param signature signature
152
+ * @param cert certificate
153
+ */
154
+ function defaultVerifySignature(buffer, version, signature, cert) {
155
+ try {
156
+ const [sig, ver] = aesDecrypt(signature, hashBuffer(cert, 32), hashBuffer(buffer, 16)).split("%");
157
+ if (ver !== version) return false;
158
+ return crypto.createVerify("RSA-SHA256").update(buffer).verify(cert, sig, "base64");
159
+ } catch {
160
+ return false;
161
+ }
162
+ }
163
+ //#endregion
164
+ export { hashBuffer as a, defaultIsLowerVersion as c, parseVersion as d, defaultVerifySignature as i, defaultVersionJsonGenerator as l, aesEncrypt as n, defaultCompressFile as o, defaultSignature as r, defaultDecompressFile as s, aesDecrypt as t, isUpdateJSON as u };
@@ -1,4 +1,4 @@
1
- import { p as Arrayable, s as UpdateJSON, t as DownloadingInfo } from "./types-DASqEPXE.mjs";
1
+ import { p as Arrayable, s as UpdateJSON, t as DownloadingInfo } from "./types-q78spjKB.cjs";
2
2
  import { ClientRequest, IncomingMessage } from "electron";
3
3
 
4
4
  //#region src/utils/download.d.ts
@@ -8,7 +8,7 @@ import { ClientRequest, IncomingMessage } from "electron";
8
8
  * @param key target header key
9
9
  */
10
10
  declare function getHeader(headers: Record<string, Arrayable<string>>, key: any): any;
11
- declare function downloadUtil<T>(url: string, headers: Record<string, any>, onResponse: (req: ClientRequest, resp: IncomingMessage, resolve: (data: T) => void, reject: (e: any) => void) => void): Promise<T>;
11
+ declare function downloadUtil<T>(url: string, headers: Record<string, any>, onResponse: (req: ClientRequest, resp: IncomingMessage, resolve: (data: T) => void, reject: (e: any) => void) => void, signal?: AbortSignal): Promise<T>;
12
12
  type ResolveDataFn = (data: string, resolve: (data: any) => void, reject: (e: any) => void) => void;
13
13
  declare const resolveJson: ResolveDataFn;
14
14
  /**
@@ -0,0 +1,130 @@
1
+ import { u as isUpdateJSON } from "./crypto-DZzMmoz2.mjs";
2
+ import { app, net } from "electron";
3
+ //#region src/utils/download.ts
4
+ /**
5
+ * Safe get value from header
6
+ * @param headers response header
7
+ * @param key target header key
8
+ */
9
+ function getHeader(headers, key) {
10
+ const value = headers[key];
11
+ if (Array.isArray(value)) return value.length === 0 ? null : value[value.length - 1];
12
+ else return value;
13
+ }
14
+ async function downloadUtil(url, headers, onResponse, signal) {
15
+ await app.whenReady();
16
+ return new Promise((resolve, reject) => {
17
+ const rejectUnexpectedStatus = (resp) => {
18
+ const statusCode = resp.statusCode ?? 0;
19
+ if (statusCode >= 200 && statusCode < 300) return false;
20
+ let data = "";
21
+ resp.on("data", (chunk) => {
22
+ data += chunk;
23
+ data = trimData(data);
24
+ });
25
+ resp.on("end", () => {
26
+ reject(/* @__PURE__ */ new Error(`Unexpected response status ${statusCode}${resp.statusMessage ? ` ${resp.statusMessage}` : ""} from ${url}: "${data}"`));
27
+ });
28
+ return true;
29
+ };
30
+ const request = net.request({
31
+ cache: "no-cache",
32
+ headers,
33
+ method: "GET",
34
+ redirect: "follow",
35
+ url
36
+ });
37
+ if (signal) {
38
+ if (signal.aborted) {
39
+ reject(/* @__PURE__ */ new Error("Aborted"));
40
+ return;
41
+ }
42
+ signal.addEventListener("abort", () => request.abort(), { once: true });
43
+ }
44
+ request.on("response", (resp) => {
45
+ resp.on("aborted", () => reject(/* @__PURE__ */ new Error("Aborted")));
46
+ resp.on("error", reject);
47
+ if (rejectUnexpectedStatus(resp)) return;
48
+ onResponse(request, resp, resolve, reject);
49
+ });
50
+ request.on("error", reject);
51
+ request.end();
52
+ });
53
+ }
54
+ /**
55
+ * trim length to 5000
56
+ */
57
+ function trimData(data) {
58
+ return data.trim().slice(0, 5e3).replace(/\s+/g, " ");
59
+ }
60
+ const resolveJson = (data, resolve, reject) => {
61
+ try {
62
+ resolve(JSON.parse(data));
63
+ } catch {
64
+ reject(/* @__PURE__ */ new Error(`Invalid json, "${trimData(data)}"`));
65
+ }
66
+ };
67
+ /**
68
+ * Default function to download json and parse to UpdateJson
69
+ * @param url target url
70
+ * @param headers extra headers
71
+ * @param signal abort signal
72
+ * @param resolveData on resolve
73
+ */
74
+ async function defaultDownloadText(url, headers, signal, resolveData) {
75
+ return await downloadUtil(url, headers, (request, resp, resolve, reject) => {
76
+ let data = "";
77
+ resp.on("data", (chunk) => data += chunk);
78
+ resp.on("end", () => resolveData(data, resolve, reject));
79
+ }, signal);
80
+ }
81
+ /**
82
+ * Default function to download json and parse to UpdateJson
83
+ * @param url target url
84
+ * @param headers extra headers
85
+ * @param signal abort signal
86
+ */
87
+ async function defaultDownloadUpdateJSON(url, headers, signal) {
88
+ return await defaultDownloadText(url, headers, signal, (data, resolve, reject) => {
89
+ try {
90
+ const json = JSON.parse(data);
91
+ if (isUpdateJSON(json)) resolve(json);
92
+ else throw Error;
93
+ } catch {
94
+ reject(/* @__PURE__ */ new Error(`Invalid update json, "${trimData(data)}"`));
95
+ }
96
+ });
97
+ }
98
+ /**
99
+ * Default function to download asar buffer,
100
+ * get total size from `Content-Length` header
101
+ * @param url target url
102
+ * @param headers extra headers
103
+ * @param signal abort signal
104
+ * @param onDownloading on downloading callback
105
+ */
106
+ async function defaultDownloadAsar(url, headers, signal, onDownloading) {
107
+ let transferred = 0;
108
+ let time = Date.now();
109
+ return await downloadUtil(url, headers, (_request, resp, resolve) => {
110
+ const total = +getHeader(resp.headers, "content-length") || -1;
111
+ let data = [];
112
+ resp.on("data", (chunk) => {
113
+ const delta = chunk.length;
114
+ transferred += delta;
115
+ const current = Date.now();
116
+ onDownloading?.({
117
+ bps: delta / Math.max(current - time, 1) * 1e3,
118
+ delta,
119
+ percent: total > 0 ? +(transferred / total).toFixed(2) * 100 : -1,
120
+ total,
121
+ transferred
122
+ });
123
+ time = current;
124
+ data.push(chunk);
125
+ });
126
+ resp.on("end", () => resolve(Buffer.concat(data)));
127
+ }, signal);
128
+ }
129
+ //#endregion
130
+ export { getHeader as a, downloadUtil as i, defaultDownloadText as n, resolveJson as o, defaultDownloadUpdateJSON as r, defaultDownloadAsar as t };
@@ -1,4 +1,4 @@
1
- import { p as Arrayable, s as UpdateJSON, t as DownloadingInfo } from "./types-BM9Jfu7q.cjs";
1
+ import { p as Arrayable, s as UpdateJSON, t as DownloadingInfo } from "./types-q78spjKB.mjs";
2
2
  import { ClientRequest, IncomingMessage } from "electron";
3
3
 
4
4
  //#region src/utils/download.d.ts
@@ -8,7 +8,7 @@ import { ClientRequest, IncomingMessage } from "electron";
8
8
  * @param key target header key
9
9
  */
10
10
  declare function getHeader(headers: Record<string, Arrayable<string>>, key: any): any;
11
- declare function downloadUtil<T>(url: string, headers: Record<string, any>, onResponse: (req: ClientRequest, resp: IncomingMessage, resolve: (data: T) => void, reject: (e: any) => void) => void): Promise<T>;
11
+ declare function downloadUtil<T>(url: string, headers: Record<string, any>, onResponse: (req: ClientRequest, resp: IncomingMessage, resolve: (data: T) => void, reject: (e: any) => void) => void, signal?: AbortSignal): Promise<T>;
12
12
  type ResolveDataFn = (data: string, resolve: (data: any) => void, reject: (e: any) => void) => void;
13
13
  declare const resolveJson: ResolveDataFn;
14
14
  /**