electron-incremental-update 2.2.2 → 2.2.3
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/README.md +56 -3
- package/dist/chunk-D7NXTCQW.js +135 -0
- package/dist/{chunk-JI27JWJN.js → chunk-YZGE4RFY.js} +12 -1
- package/dist/index.cjs +1 -1
- package/dist/index.d.cts +1 -2
- package/dist/index.d.ts +1 -2
- package/dist/index.js +2 -2
- package/dist/provider.cjs +4 -3
- package/dist/provider.d.cts +13 -43
- package/dist/provider.d.ts +13 -43
- package/dist/provider.js +4 -95
- package/dist/{types-CStrrQPl.d.ts → types-C5M2xRjF.d.cts} +74 -3
- package/dist/{types-CWtySwqA.d.cts → types-C5M2xRjF.d.ts} +74 -3
- package/dist/utils.cjs +185 -75
- package/dist/utils.d.cts +6 -3
- package/dist/utils.d.ts +6 -3
- package/dist/utils.js +2 -2
- package/dist/vite.d.ts +3 -4
- package/dist/vite.js +8 -8
- package/dist/zip-BQS8qbGA.d.cts +70 -0
- package/dist/zip-DbfskMQi.d.ts +70 -0
- package/package.json +18 -18
- package/dist/chunk-XGWQQVIZ.js +0 -43
- package/dist/version-Bl_0oO5f.d.cts +0 -74
- package/dist/version-Bl_0oO5f.d.ts +0 -74
- package/dist/zip-DQdr8pFv.d.cts +0 -33
- package/dist/zip-DQdr8pFv.d.ts +0 -33
package/README.md
CHANGED
|
@@ -472,6 +472,60 @@ function getPathFromEntryAsar(...paths: string[]): string
|
|
|
472
472
|
* @param callback callback function
|
|
473
473
|
*/
|
|
474
474
|
function handleUnexpectedErrors(callback: (err: unknown) => void): void
|
|
475
|
+
/**
|
|
476
|
+
* Safe get value from header
|
|
477
|
+
* @param headers response header
|
|
478
|
+
* @param key target header key
|
|
479
|
+
*/
|
|
480
|
+
function getHeader(headers: Record<string, Arrayable<string>>, key: any): any
|
|
481
|
+
function downloadUtil<T>(
|
|
482
|
+
url: string,
|
|
483
|
+
headers: Record<string, any>,
|
|
484
|
+
signal: AbortSignal,
|
|
485
|
+
onResponse: (
|
|
486
|
+
resp: IncomingMessage,
|
|
487
|
+
resolve: (data: T) => void,
|
|
488
|
+
reject: (e: any) => void
|
|
489
|
+
) => void
|
|
490
|
+
): Promise<T>
|
|
491
|
+
/**
|
|
492
|
+
* Default function to download json and parse to UpdateJson
|
|
493
|
+
* @param url target url
|
|
494
|
+
* @param headers extra headers
|
|
495
|
+
* @param signal abort signal
|
|
496
|
+
* @param resolveData on resolve
|
|
497
|
+
*/
|
|
498
|
+
function defaultDownloadJSON<T>(
|
|
499
|
+
url: string,
|
|
500
|
+
headers: Record<string, any>,
|
|
501
|
+
signal: AbortSignal,
|
|
502
|
+
resolveData?: ResolveDataFn
|
|
503
|
+
): Promise<T>
|
|
504
|
+
/**
|
|
505
|
+
* Default function to download json and parse to UpdateJson
|
|
506
|
+
* @param url target url
|
|
507
|
+
* @param headers extra headers
|
|
508
|
+
* @param signal abort signal
|
|
509
|
+
*/
|
|
510
|
+
function defaultDownloadUpdateJSON(
|
|
511
|
+
url: string,
|
|
512
|
+
headers: Record<string, any>,
|
|
513
|
+
signal: AbortSignal
|
|
514
|
+
): Promise<UpdateJSON>
|
|
515
|
+
/**
|
|
516
|
+
* Default function to download asar buffer,
|
|
517
|
+
* get total size from `Content-Length` header
|
|
518
|
+
* @param url target url
|
|
519
|
+
* @param headers extra headers
|
|
520
|
+
* @param signal abort signal
|
|
521
|
+
* @param onDownloading on downloading callback
|
|
522
|
+
*/
|
|
523
|
+
function defaultDownloadAsar(
|
|
524
|
+
url: string,
|
|
525
|
+
headers: Record<string, any>,
|
|
526
|
+
signal: AbortSignal,
|
|
527
|
+
onDownloading?: (progress: DownloadingInfo) => void
|
|
528
|
+
): Promise<Buffer>
|
|
475
529
|
```
|
|
476
530
|
|
|
477
531
|
### Types
|
|
@@ -925,15 +979,14 @@ export interface GeneratorOverrideFunctions {
|
|
|
925
979
|
version: string
|
|
926
980
|
) => Promisable<string>
|
|
927
981
|
/**
|
|
928
|
-
* Custom generate
|
|
982
|
+
* Custom generate update json function
|
|
929
983
|
* @param existingJson The existing JSON object.
|
|
930
984
|
* @param buffer file buffer
|
|
931
985
|
* @param signature generated signature
|
|
932
986
|
* @param version current version
|
|
933
987
|
* @param minVersion The minimum version
|
|
934
|
-
* @returns The updated version json
|
|
935
988
|
*/
|
|
936
|
-
|
|
989
|
+
generateUpdateJson?: (
|
|
937
990
|
existingJson: UpdateJSON,
|
|
938
991
|
signature: string,
|
|
939
992
|
version: string,
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import { isUpdateJSON } from './chunk-AAAM44NW.js';
|
|
2
|
+
import crypto from 'node:crypto';
|
|
3
|
+
import electron from 'electron';
|
|
4
|
+
import zlib from 'node:zlib';
|
|
5
|
+
|
|
6
|
+
function hashBuffer(data, length) {
|
|
7
|
+
const hash = crypto.createHash("SHA256").update(data).digest("binary");
|
|
8
|
+
return Buffer.from(hash).subarray(0, length);
|
|
9
|
+
}
|
|
10
|
+
function aesEncrypt(plainText, key, iv) {
|
|
11
|
+
const cipher = crypto.createCipheriv("aes-256-cbc", key, iv);
|
|
12
|
+
return cipher.update(plainText, "utf8", "base64url") + cipher.final("base64url");
|
|
13
|
+
}
|
|
14
|
+
function defaultSignature(buffer, privateKey, cert, version) {
|
|
15
|
+
const sig = crypto.createSign("RSA-SHA256").update(buffer).sign(crypto.createPrivateKey(privateKey), "base64");
|
|
16
|
+
return aesEncrypt(`${sig}%${version}`, hashBuffer(cert, 32), hashBuffer(buffer, 16));
|
|
17
|
+
}
|
|
18
|
+
function aesDecrypt(encryptedText, key, iv) {
|
|
19
|
+
const decipher = crypto.createDecipheriv("aes-256-cbc", key, iv);
|
|
20
|
+
return decipher.update(encryptedText, "base64url", "utf8") + decipher.final("utf8");
|
|
21
|
+
}
|
|
22
|
+
function defaultVerifySignature(buffer, version, signature, cert) {
|
|
23
|
+
try {
|
|
24
|
+
const [sig, ver] = aesDecrypt(signature, hashBuffer(cert, 32), hashBuffer(buffer, 16)).split("%");
|
|
25
|
+
if (ver !== version) {
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
return crypto.createVerify("RSA-SHA256").update(buffer).verify(cert, sig, "base64");
|
|
29
|
+
} catch {
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
function getHeader(headers, key) {
|
|
34
|
+
const value = headers[key];
|
|
35
|
+
if (Array.isArray(value)) {
|
|
36
|
+
return value.length === 0 ? null : value[value.length - 1];
|
|
37
|
+
} else {
|
|
38
|
+
return value;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
async function downloadUtil(url, headers, signal, onResponse) {
|
|
42
|
+
await electron.app.whenReady();
|
|
43
|
+
return new Promise((resolve, reject) => {
|
|
44
|
+
const request = electron.net.request({ url, method: "GET", redirect: "follow", headers, cache: "no-cache" });
|
|
45
|
+
signal.addEventListener("abort", () => request.abort(), { once: true });
|
|
46
|
+
request.on("response", (resp) => {
|
|
47
|
+
resp.on("aborted", () => reject(new Error("aborted")));
|
|
48
|
+
resp.on("error", () => reject(new Error("download error")));
|
|
49
|
+
onResponse(resp, resolve, reject);
|
|
50
|
+
});
|
|
51
|
+
request.on("error", reject);
|
|
52
|
+
request.end();
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
function trimData(data) {
|
|
56
|
+
return data.trim().slice(0, 5e3).replace(/\s+/g, " ");
|
|
57
|
+
}
|
|
58
|
+
var defaultResolveDataFn = (data, resolve, reject) => {
|
|
59
|
+
try {
|
|
60
|
+
resolve(JSON.parse(data));
|
|
61
|
+
} catch {
|
|
62
|
+
reject(new Error(`Invalid json, "${trimData(data)}"`));
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
async function defaultDownloadJSON(url, headers, signal, resolveData = defaultResolveDataFn) {
|
|
66
|
+
return await downloadUtil(
|
|
67
|
+
url,
|
|
68
|
+
headers,
|
|
69
|
+
signal,
|
|
70
|
+
(resp, resolve, reject) => {
|
|
71
|
+
let data = "";
|
|
72
|
+
resp.on("data", (chunk) => data += chunk);
|
|
73
|
+
resp.on("end", () => resolveData(data, resolve, reject));
|
|
74
|
+
}
|
|
75
|
+
);
|
|
76
|
+
}
|
|
77
|
+
async function defaultDownloadUpdateJSON(url, headers, signal) {
|
|
78
|
+
return await defaultDownloadJSON(
|
|
79
|
+
url,
|
|
80
|
+
headers,
|
|
81
|
+
signal,
|
|
82
|
+
(data, resolve, reject) => {
|
|
83
|
+
try {
|
|
84
|
+
const json = JSON.parse(data);
|
|
85
|
+
if (isUpdateJSON(json)) {
|
|
86
|
+
resolve(json);
|
|
87
|
+
} else {
|
|
88
|
+
throw Error;
|
|
89
|
+
}
|
|
90
|
+
} catch {
|
|
91
|
+
reject(new Error(`Invalid update json, "${trimData(data)}"`));
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
);
|
|
95
|
+
}
|
|
96
|
+
async function defaultDownloadAsar(url, headers, signal, onDownloading) {
|
|
97
|
+
let transferred = 0;
|
|
98
|
+
let time = Date.now();
|
|
99
|
+
return await downloadUtil(
|
|
100
|
+
url,
|
|
101
|
+
headers,
|
|
102
|
+
signal,
|
|
103
|
+
(resp, resolve) => {
|
|
104
|
+
const total = +getHeader(resp.headers, "content-length") || -1;
|
|
105
|
+
const data = [];
|
|
106
|
+
resp.on("data", (chunk) => {
|
|
107
|
+
const delta = chunk.length;
|
|
108
|
+
transferred += delta;
|
|
109
|
+
const current = Date.now();
|
|
110
|
+
onDownloading?.({
|
|
111
|
+
percent: total > 0 ? +(transferred / total).toFixed(2) * 100 : -1,
|
|
112
|
+
total,
|
|
113
|
+
transferred,
|
|
114
|
+
delta,
|
|
115
|
+
bps: delta / (current - time)
|
|
116
|
+
});
|
|
117
|
+
time = current;
|
|
118
|
+
data.push(chunk);
|
|
119
|
+
});
|
|
120
|
+
resp.on("end", () => resolve(Buffer.concat(data)));
|
|
121
|
+
}
|
|
122
|
+
);
|
|
123
|
+
}
|
|
124
|
+
async function defaultZipFile(buffer) {
|
|
125
|
+
return new Promise((resolve, reject) => {
|
|
126
|
+
zlib.brotliCompress(buffer, (err, buffer2) => err ? reject(err) : resolve(buffer2));
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
async function defaultUnzipFile(buffer) {
|
|
130
|
+
return new Promise((resolve, reject) => {
|
|
131
|
+
zlib.brotliDecompress(buffer, (err, buffer2) => err ? reject(err) : resolve(buffer2));
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
export { aesDecrypt, aesEncrypt, defaultDownloadAsar, defaultDownloadJSON, defaultDownloadUpdateJSON, defaultSignature, defaultUnzipFile, defaultVerifySignature, defaultZipFile, downloadUtil, getHeader, hashBuffer };
|
|
@@ -96,5 +96,16 @@ function handleUnexpectedErrors(callback) {
|
|
|
96
96
|
process.on("uncaughtException", callback);
|
|
97
97
|
process.on("unhandledRejection", callback);
|
|
98
98
|
}
|
|
99
|
+
function reloadOnPreloadScriptChanged() {
|
|
100
|
+
if (isDev) {
|
|
101
|
+
process.on("message", (msg) => {
|
|
102
|
+
if (msg === "electron-vite&type=hot-reload") {
|
|
103
|
+
for (const window of electron.BrowserWindow.getAllWindows()) {
|
|
104
|
+
window.reload();
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
}
|
|
99
110
|
|
|
100
|
-
export { beautifyDevTools, disableHWAccForWin7, getAppVersion, getEntryVersion, getPathFromAppNameAsar, getPathFromEntryAsar, getPathFromMain, getPathFromPreload, getPathFromPublic, handleUnexpectedErrors, importNative, isDev, isLinux, isMac, isWin, loadPage, requireNative, restartApp, setAppUserModelId, setPortableAppDataPath, singleInstance };
|
|
111
|
+
export { beautifyDevTools, disableHWAccForWin7, getAppVersion, getEntryVersion, getPathFromAppNameAsar, getPathFromEntryAsar, getPathFromMain, getPathFromPreload, getPathFromPublic, handleUnexpectedErrors, importNative, isDev, isLinux, isMac, isWin, loadPage, reloadOnPreloadScriptChanged, requireNative, restartApp, setAppUserModelId, setPortableAppDataPath, singleInstance };
|
package/dist/index.cjs
CHANGED
|
@@ -256,7 +256,7 @@ async function createElectronApp(appOptions = {}) {
|
|
|
256
256
|
__require(mainPath)(updaterInstance);
|
|
257
257
|
}
|
|
258
258
|
} catch (error) {
|
|
259
|
-
logger?.error("startup error", error);
|
|
259
|
+
logger?.error("startup error, exit", error);
|
|
260
260
|
onStartError?.(error, logger);
|
|
261
261
|
electron__default.default.app.quit();
|
|
262
262
|
}
|
package/dist/index.d.cts
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { Promisable } from '@subframe7536/type-utils';
|
|
2
|
-
import { I as IProvider, D as DownloadingInfo,
|
|
3
|
-
import { U as UpdateInfo, a as UpdateJSON } from './version-Bl_0oO5f.cjs';
|
|
2
|
+
import { I as IProvider, U as UpdateInfo, D as DownloadingInfo, a as UpdateJSON, b as UpdateJSONWithURL } from './types-C5M2xRjF.cjs';
|
|
4
3
|
import { EventEmitter } from 'node:events';
|
|
5
4
|
import 'node:url';
|
|
6
5
|
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { Promisable } from '@subframe7536/type-utils';
|
|
2
|
-
import { I as IProvider, D as DownloadingInfo,
|
|
3
|
-
import { U as UpdateInfo, a as UpdateJSON } from './version-Bl_0oO5f.js';
|
|
2
|
+
import { I as IProvider, U as UpdateInfo, D as DownloadingInfo, a as UpdateJSON, b as UpdateJSONWithURL } from './types-C5M2xRjF.js';
|
|
4
3
|
import { EventEmitter } from 'node:events';
|
|
5
4
|
import 'node:url';
|
|
6
5
|
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { isDev, getAppVersion, getEntryVersion, getPathFromAppNameAsar, restartApp } from './chunk-
|
|
1
|
+
import { isDev, getAppVersion, getEntryVersion, getPathFromAppNameAsar, restartApp } from './chunk-YZGE4RFY.js';
|
|
2
2
|
import { isUpdateJSON, __require } from './chunk-AAAM44NW.js';
|
|
3
3
|
import fs2 from 'node:fs';
|
|
4
4
|
import path from 'node:path';
|
|
@@ -220,7 +220,7 @@ async function createElectronApp(appOptions = {}) {
|
|
|
220
220
|
__require(mainPath)(updaterInstance);
|
|
221
221
|
}
|
|
222
222
|
} catch (error) {
|
|
223
|
-
logger?.error("startup error", error);
|
|
223
|
+
logger?.error("startup error, exit", error);
|
|
224
224
|
onStartError?.(error, logger);
|
|
225
225
|
electron2.app.quit();
|
|
226
226
|
}
|
package/dist/provider.cjs
CHANGED
|
@@ -110,7 +110,7 @@ function getHeader(headers, key) {
|
|
|
110
110
|
return value;
|
|
111
111
|
}
|
|
112
112
|
}
|
|
113
|
-
async function
|
|
113
|
+
async function downloadUtil(url, headers, signal, onResponse) {
|
|
114
114
|
await electron__default.default.app.whenReady();
|
|
115
115
|
return new Promise((resolve, reject) => {
|
|
116
116
|
const request = electron__default.default.net.request({ url, method: "GET", redirect: "follow", headers, cache: "no-cache" });
|
|
@@ -135,7 +135,7 @@ var defaultResolveDataFn = (data, resolve, reject) => {
|
|
|
135
135
|
}
|
|
136
136
|
};
|
|
137
137
|
async function defaultDownloadJSON(url, headers, signal, resolveData = defaultResolveDataFn) {
|
|
138
|
-
return await
|
|
138
|
+
return await downloadUtil(
|
|
139
139
|
url,
|
|
140
140
|
headers,
|
|
141
141
|
signal,
|
|
@@ -168,7 +168,7 @@ async function defaultDownloadUpdateJSON(url, headers, signal) {
|
|
|
168
168
|
async function defaultDownloadAsar(url, headers, signal, onDownloading) {
|
|
169
169
|
let transferred = 0;
|
|
170
170
|
let time = Date.now();
|
|
171
|
-
return await
|
|
171
|
+
return await downloadUtil(
|
|
172
172
|
url,
|
|
173
173
|
headers,
|
|
174
174
|
signal,
|
|
@@ -355,4 +355,5 @@ exports.GitHubProvider = GitHubProvider;
|
|
|
355
355
|
exports.defaultDownloadAsar = defaultDownloadAsar;
|
|
356
356
|
exports.defaultDownloadJSON = defaultDownloadJSON;
|
|
357
357
|
exports.defaultDownloadUpdateJSON = defaultDownloadUpdateJSON;
|
|
358
|
+
exports.downloadUtil = downloadUtil;
|
|
358
359
|
exports.getHeader = getHeader;
|
package/dist/provider.d.cts
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
import {
|
|
4
|
-
|
|
1
|
+
import { e as UpdateInfoWithURL, I as IProvider, d as defaultIsLowerVersion, D as DownloadingInfo, f as URLHandler } from './types-C5M2xRjF.cjs';
|
|
2
|
+
export { b as UpdateJSONWithURL } from './types-C5M2xRjF.cjs';
|
|
3
|
+
import { c as defaultVerifySignature, l as defaultUnzipFile } from './zip-BQS8qbGA.cjs';
|
|
4
|
+
export { j as defaultDownloadAsar, f as defaultDownloadJSON, i as defaultDownloadUpdateJSON, e as downloadUtil, g as getHeader } from './zip-BQS8qbGA.cjs';
|
|
5
|
+
import '@subframe7536/type-utils';
|
|
5
6
|
import 'node:url';
|
|
7
|
+
import 'electron';
|
|
6
8
|
|
|
7
|
-
declare abstract class BaseProvider implements IProvider {
|
|
9
|
+
declare abstract class BaseProvider<T extends UpdateInfoWithURL = UpdateInfoWithURL> implements IProvider<T> {
|
|
8
10
|
name: string;
|
|
9
11
|
/**
|
|
10
12
|
* @inheritdoc
|
|
@@ -21,45 +23,13 @@ declare abstract class BaseProvider implements IProvider {
|
|
|
21
23
|
/**
|
|
22
24
|
* @inheritdoc
|
|
23
25
|
*/
|
|
24
|
-
abstract downloadJSON(name: string, versionPath: string, signal: AbortSignal): Promise<
|
|
26
|
+
abstract downloadJSON(name: string, versionPath: string, signal: AbortSignal): Promise<T>;
|
|
25
27
|
/**
|
|
26
28
|
* @inheritdoc
|
|
27
29
|
*/
|
|
28
30
|
abstract downloadAsar(info: UpdateInfoWithURL, signal: AbortSignal, onDownloading?: (info: DownloadingInfo) => void): Promise<Buffer>;
|
|
29
31
|
}
|
|
30
32
|
|
|
31
|
-
/**
|
|
32
|
-
* Safe get value from header
|
|
33
|
-
* @param headers response header
|
|
34
|
-
* @param key target header key
|
|
35
|
-
*/
|
|
36
|
-
declare function getHeader(headers: Record<string, Arrayable<string>>, key: any): any;
|
|
37
|
-
type ResolveDataFn = (data: string, resolve: (data: any) => void, reject: (e: any) => void) => void;
|
|
38
|
-
/**
|
|
39
|
-
* Default function to download json and parse to UpdateJson
|
|
40
|
-
* @param url target url
|
|
41
|
-
* @param headers extra headers
|
|
42
|
-
* @param signal abort signal
|
|
43
|
-
* @param resolveData on resolve
|
|
44
|
-
*/
|
|
45
|
-
declare function defaultDownloadJSON<T>(url: string, headers: Record<string, any>, signal: AbortSignal, resolveData?: ResolveDataFn): Promise<T>;
|
|
46
|
-
/**
|
|
47
|
-
* Default function to download json and parse to UpdateJson
|
|
48
|
-
* @param url target url
|
|
49
|
-
* @param headers extra headers
|
|
50
|
-
* @param signal abort signal
|
|
51
|
-
*/
|
|
52
|
-
declare function defaultDownloadUpdateJSON(url: string, headers: Record<string, any>, signal: AbortSignal): Promise<UpdateJSON>;
|
|
53
|
-
/**
|
|
54
|
-
* Default function to download asar buffer,
|
|
55
|
-
* get total size from `Content-Length` header
|
|
56
|
-
* @param url target url
|
|
57
|
-
* @param headers extra headers
|
|
58
|
-
* @param signal abort signal
|
|
59
|
-
* @param onDownloading on downloading callback
|
|
60
|
-
*/
|
|
61
|
-
declare function defaultDownloadAsar(url: string, headers: Record<string, any>, signal: AbortSignal, onDownloading?: OnDownloading): Promise<Buffer>;
|
|
62
|
-
|
|
63
33
|
interface GitHubProviderOptions {
|
|
64
34
|
/**
|
|
65
35
|
* Github user name
|
|
@@ -89,7 +59,7 @@ interface GitHubProviderOptions {
|
|
|
89
59
|
*/
|
|
90
60
|
urlHandler?: URLHandler;
|
|
91
61
|
}
|
|
92
|
-
declare class GitHubProvider extends BaseProvider {
|
|
62
|
+
declare class GitHubProvider<T extends UpdateInfoWithURL = UpdateInfoWithURL> extends BaseProvider<T> {
|
|
93
63
|
name: string;
|
|
94
64
|
private options;
|
|
95
65
|
/**
|
|
@@ -108,7 +78,7 @@ declare class GitHubProvider extends BaseProvider {
|
|
|
108
78
|
/**
|
|
109
79
|
* @inheritdoc
|
|
110
80
|
*/
|
|
111
|
-
downloadJSON(name: string, versionPath: string, signal: AbortSignal): Promise<
|
|
81
|
+
downloadJSON(name: string, versionPath: string, signal: AbortSignal): Promise<T>;
|
|
112
82
|
/**
|
|
113
83
|
* @inheritdoc
|
|
114
84
|
*/
|
|
@@ -137,7 +107,7 @@ interface GitHubApiProviderOptions {
|
|
|
137
107
|
*/
|
|
138
108
|
urlHandler?: URLHandler;
|
|
139
109
|
}
|
|
140
|
-
declare class GitHubApiProvider extends BaseProvider {
|
|
110
|
+
declare class GitHubApiProvider<T extends UpdateInfoWithURL = UpdateInfoWithURL> extends BaseProvider<T> {
|
|
141
111
|
name: string;
|
|
142
112
|
private options;
|
|
143
113
|
/**
|
|
@@ -157,11 +127,11 @@ declare class GitHubApiProvider extends BaseProvider {
|
|
|
157
127
|
/**
|
|
158
128
|
* @inheritdoc
|
|
159
129
|
*/
|
|
160
|
-
downloadJSON(name: string, versionPath: string, signal: AbortSignal): Promise<
|
|
130
|
+
downloadJSON(name: string, versionPath: string, signal: AbortSignal): Promise<T>;
|
|
161
131
|
/**
|
|
162
132
|
* @inheritdoc
|
|
163
133
|
*/
|
|
164
134
|
downloadAsar(info: UpdateInfoWithURL, signal: AbortSignal, onDownloading?: (info: DownloadingInfo) => void): Promise<Buffer>;
|
|
165
135
|
}
|
|
166
136
|
|
|
167
|
-
export { BaseProvider, DownloadingInfo, GitHubApiProvider, type GitHubApiProviderOptions, GitHubProvider, type GitHubProviderOptions, IProvider,
|
|
137
|
+
export { BaseProvider, DownloadingInfo, GitHubApiProvider, type GitHubApiProviderOptions, GitHubProvider, type GitHubProviderOptions, IProvider, URLHandler, UpdateInfoWithURL };
|
package/dist/provider.d.ts
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
import {
|
|
4
|
-
|
|
1
|
+
import { e as UpdateInfoWithURL, I as IProvider, d as defaultIsLowerVersion, D as DownloadingInfo, f as URLHandler } from './types-C5M2xRjF.js';
|
|
2
|
+
export { b as UpdateJSONWithURL } from './types-C5M2xRjF.js';
|
|
3
|
+
import { c as defaultVerifySignature, l as defaultUnzipFile } from './zip-DbfskMQi.js';
|
|
4
|
+
export { j as defaultDownloadAsar, f as defaultDownloadJSON, i as defaultDownloadUpdateJSON, e as downloadUtil, g as getHeader } from './zip-DbfskMQi.js';
|
|
5
|
+
import '@subframe7536/type-utils';
|
|
5
6
|
import 'node:url';
|
|
7
|
+
import 'electron';
|
|
6
8
|
|
|
7
|
-
declare abstract class BaseProvider implements IProvider {
|
|
9
|
+
declare abstract class BaseProvider<T extends UpdateInfoWithURL = UpdateInfoWithURL> implements IProvider<T> {
|
|
8
10
|
name: string;
|
|
9
11
|
/**
|
|
10
12
|
* @inheritdoc
|
|
@@ -21,45 +23,13 @@ declare abstract class BaseProvider implements IProvider {
|
|
|
21
23
|
/**
|
|
22
24
|
* @inheritdoc
|
|
23
25
|
*/
|
|
24
|
-
abstract downloadJSON(name: string, versionPath: string, signal: AbortSignal): Promise<
|
|
26
|
+
abstract downloadJSON(name: string, versionPath: string, signal: AbortSignal): Promise<T>;
|
|
25
27
|
/**
|
|
26
28
|
* @inheritdoc
|
|
27
29
|
*/
|
|
28
30
|
abstract downloadAsar(info: UpdateInfoWithURL, signal: AbortSignal, onDownloading?: (info: DownloadingInfo) => void): Promise<Buffer>;
|
|
29
31
|
}
|
|
30
32
|
|
|
31
|
-
/**
|
|
32
|
-
* Safe get value from header
|
|
33
|
-
* @param headers response header
|
|
34
|
-
* @param key target header key
|
|
35
|
-
*/
|
|
36
|
-
declare function getHeader(headers: Record<string, Arrayable<string>>, key: any): any;
|
|
37
|
-
type ResolveDataFn = (data: string, resolve: (data: any) => void, reject: (e: any) => void) => void;
|
|
38
|
-
/**
|
|
39
|
-
* Default function to download json and parse to UpdateJson
|
|
40
|
-
* @param url target url
|
|
41
|
-
* @param headers extra headers
|
|
42
|
-
* @param signal abort signal
|
|
43
|
-
* @param resolveData on resolve
|
|
44
|
-
*/
|
|
45
|
-
declare function defaultDownloadJSON<T>(url: string, headers: Record<string, any>, signal: AbortSignal, resolveData?: ResolveDataFn): Promise<T>;
|
|
46
|
-
/**
|
|
47
|
-
* Default function to download json and parse to UpdateJson
|
|
48
|
-
* @param url target url
|
|
49
|
-
* @param headers extra headers
|
|
50
|
-
* @param signal abort signal
|
|
51
|
-
*/
|
|
52
|
-
declare function defaultDownloadUpdateJSON(url: string, headers: Record<string, any>, signal: AbortSignal): Promise<UpdateJSON>;
|
|
53
|
-
/**
|
|
54
|
-
* Default function to download asar buffer,
|
|
55
|
-
* get total size from `Content-Length` header
|
|
56
|
-
* @param url target url
|
|
57
|
-
* @param headers extra headers
|
|
58
|
-
* @param signal abort signal
|
|
59
|
-
* @param onDownloading on downloading callback
|
|
60
|
-
*/
|
|
61
|
-
declare function defaultDownloadAsar(url: string, headers: Record<string, any>, signal: AbortSignal, onDownloading?: OnDownloading): Promise<Buffer>;
|
|
62
|
-
|
|
63
33
|
interface GitHubProviderOptions {
|
|
64
34
|
/**
|
|
65
35
|
* Github user name
|
|
@@ -89,7 +59,7 @@ interface GitHubProviderOptions {
|
|
|
89
59
|
*/
|
|
90
60
|
urlHandler?: URLHandler;
|
|
91
61
|
}
|
|
92
|
-
declare class GitHubProvider extends BaseProvider {
|
|
62
|
+
declare class GitHubProvider<T extends UpdateInfoWithURL = UpdateInfoWithURL> extends BaseProvider<T> {
|
|
93
63
|
name: string;
|
|
94
64
|
private options;
|
|
95
65
|
/**
|
|
@@ -108,7 +78,7 @@ declare class GitHubProvider extends BaseProvider {
|
|
|
108
78
|
/**
|
|
109
79
|
* @inheritdoc
|
|
110
80
|
*/
|
|
111
|
-
downloadJSON(name: string, versionPath: string, signal: AbortSignal): Promise<
|
|
81
|
+
downloadJSON(name: string, versionPath: string, signal: AbortSignal): Promise<T>;
|
|
112
82
|
/**
|
|
113
83
|
* @inheritdoc
|
|
114
84
|
*/
|
|
@@ -137,7 +107,7 @@ interface GitHubApiProviderOptions {
|
|
|
137
107
|
*/
|
|
138
108
|
urlHandler?: URLHandler;
|
|
139
109
|
}
|
|
140
|
-
declare class GitHubApiProvider extends BaseProvider {
|
|
110
|
+
declare class GitHubApiProvider<T extends UpdateInfoWithURL = UpdateInfoWithURL> extends BaseProvider<T> {
|
|
141
111
|
name: string;
|
|
142
112
|
private options;
|
|
143
113
|
/**
|
|
@@ -157,11 +127,11 @@ declare class GitHubApiProvider extends BaseProvider {
|
|
|
157
127
|
/**
|
|
158
128
|
* @inheritdoc
|
|
159
129
|
*/
|
|
160
|
-
downloadJSON(name: string, versionPath: string, signal: AbortSignal): Promise<
|
|
130
|
+
downloadJSON(name: string, versionPath: string, signal: AbortSignal): Promise<T>;
|
|
161
131
|
/**
|
|
162
132
|
* @inheritdoc
|
|
163
133
|
*/
|
|
164
134
|
downloadAsar(info: UpdateInfoWithURL, signal: AbortSignal, onDownloading?: (info: DownloadingInfo) => void): Promise<Buffer>;
|
|
165
135
|
}
|
|
166
136
|
|
|
167
|
-
export { BaseProvider, DownloadingInfo, GitHubApiProvider, type GitHubApiProviderOptions, GitHubProvider, type GitHubProviderOptions, IProvider,
|
|
137
|
+
export { BaseProvider, DownloadingInfo, GitHubApiProvider, type GitHubApiProviderOptions, GitHubProvider, type GitHubProviderOptions, IProvider, URLHandler, UpdateInfoWithURL };
|
package/dist/provider.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { defaultVerifySignature, defaultUnzipFile } from './chunk-
|
|
2
|
-
|
|
3
|
-
import
|
|
1
|
+
import { defaultVerifySignature, defaultUnzipFile, defaultDownloadUpdateJSON, defaultDownloadAsar, defaultDownloadJSON } from './chunk-D7NXTCQW.js';
|
|
2
|
+
export { defaultDownloadAsar, defaultDownloadJSON, defaultDownloadUpdateJSON, downloadUtil, getHeader } from './chunk-D7NXTCQW.js';
|
|
3
|
+
import { defaultIsLowerVersion } from './chunk-AAAM44NW.js';
|
|
4
4
|
import { URL } from 'node:url';
|
|
5
5
|
|
|
6
6
|
// src/provider/base.ts
|
|
@@ -19,97 +19,6 @@ var BaseProvider = class {
|
|
|
19
19
|
*/
|
|
20
20
|
unzipFile = defaultUnzipFile;
|
|
21
21
|
};
|
|
22
|
-
function getHeader(headers, key) {
|
|
23
|
-
const value = headers[key];
|
|
24
|
-
if (Array.isArray(value)) {
|
|
25
|
-
return value.length === 0 ? null : value[value.length - 1];
|
|
26
|
-
} else {
|
|
27
|
-
return value;
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
async function downloadFn(url, headers, signal, onResponse) {
|
|
31
|
-
await electron.app.whenReady();
|
|
32
|
-
return new Promise((resolve, reject) => {
|
|
33
|
-
const request = electron.net.request({ url, method: "GET", redirect: "follow", headers, cache: "no-cache" });
|
|
34
|
-
signal.addEventListener("abort", () => request.abort(), { once: true });
|
|
35
|
-
request.on("response", (resp) => {
|
|
36
|
-
resp.on("aborted", () => reject(new Error("aborted")));
|
|
37
|
-
resp.on("error", () => reject(new Error("download error")));
|
|
38
|
-
onResponse(resp, resolve, reject);
|
|
39
|
-
});
|
|
40
|
-
request.on("error", reject);
|
|
41
|
-
request.end();
|
|
42
|
-
});
|
|
43
|
-
}
|
|
44
|
-
function trimData(data) {
|
|
45
|
-
return data.trim().slice(0, 5e3).replace(/\s+/g, " ");
|
|
46
|
-
}
|
|
47
|
-
var defaultResolveDataFn = (data, resolve, reject) => {
|
|
48
|
-
try {
|
|
49
|
-
resolve(JSON.parse(data));
|
|
50
|
-
} catch {
|
|
51
|
-
reject(new Error(`Invalid json, "${trimData(data)}"`));
|
|
52
|
-
}
|
|
53
|
-
};
|
|
54
|
-
async function defaultDownloadJSON(url, headers, signal, resolveData = defaultResolveDataFn) {
|
|
55
|
-
return await downloadFn(
|
|
56
|
-
url,
|
|
57
|
-
headers,
|
|
58
|
-
signal,
|
|
59
|
-
(resp, resolve, reject) => {
|
|
60
|
-
let data = "";
|
|
61
|
-
resp.on("data", (chunk) => data += chunk);
|
|
62
|
-
resp.on("end", () => resolveData(data, resolve, reject));
|
|
63
|
-
}
|
|
64
|
-
);
|
|
65
|
-
}
|
|
66
|
-
async function defaultDownloadUpdateJSON(url, headers, signal) {
|
|
67
|
-
return await defaultDownloadJSON(
|
|
68
|
-
url,
|
|
69
|
-
headers,
|
|
70
|
-
signal,
|
|
71
|
-
(data, resolve, reject) => {
|
|
72
|
-
try {
|
|
73
|
-
const json = JSON.parse(data);
|
|
74
|
-
if (isUpdateJSON(json)) {
|
|
75
|
-
resolve(json);
|
|
76
|
-
} else {
|
|
77
|
-
throw Error;
|
|
78
|
-
}
|
|
79
|
-
} catch {
|
|
80
|
-
reject(new Error(`Invalid update json, "${trimData(data)}"`));
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
);
|
|
84
|
-
}
|
|
85
|
-
async function defaultDownloadAsar(url, headers, signal, onDownloading) {
|
|
86
|
-
let transferred = 0;
|
|
87
|
-
let time = Date.now();
|
|
88
|
-
return await downloadFn(
|
|
89
|
-
url,
|
|
90
|
-
headers,
|
|
91
|
-
signal,
|
|
92
|
-
(resp, resolve) => {
|
|
93
|
-
const total = +getHeader(resp.headers, "content-length") || -1;
|
|
94
|
-
const data = [];
|
|
95
|
-
resp.on("data", (chunk) => {
|
|
96
|
-
const delta = chunk.length;
|
|
97
|
-
transferred += delta;
|
|
98
|
-
const current = Date.now();
|
|
99
|
-
onDownloading?.({
|
|
100
|
-
percent: total > 0 ? +(transferred / total).toFixed(2) * 100 : -1,
|
|
101
|
-
total,
|
|
102
|
-
transferred,
|
|
103
|
-
delta,
|
|
104
|
-
bps: delta / (current - time)
|
|
105
|
-
});
|
|
106
|
-
time = current;
|
|
107
|
-
data.push(chunk);
|
|
108
|
-
});
|
|
109
|
-
resp.on("end", () => resolve(Buffer.concat(data)));
|
|
110
|
-
}
|
|
111
|
-
);
|
|
112
|
-
}
|
|
113
22
|
var GitHubProvider = class extends BaseProvider {
|
|
114
23
|
name = "GithubProvider";
|
|
115
24
|
options;
|
|
@@ -266,4 +175,4 @@ var GitHubApiProvider = class extends BaseProvider {
|
|
|
266
175
|
}
|
|
267
176
|
};
|
|
268
177
|
|
|
269
|
-
export { BaseProvider, GitHubApiProvider, GitHubProvider
|
|
178
|
+
export { BaseProvider, GitHubApiProvider, GitHubProvider };
|