electron-incremental-update 1.3.0 → 2.0.0-beta.10

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,232 @@
1
+ 'use strict';
2
+
3
+ var url = require('url');
4
+ var electron = require('electron');
5
+ var crypto = require('crypto');
6
+ var zlib = require('zlib');
7
+
8
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
9
+
10
+ var crypto__default = /*#__PURE__*/_interopDefault(crypto);
11
+ var zlib__default = /*#__PURE__*/_interopDefault(zlib);
12
+
13
+ // src/provider/github.ts
14
+
15
+ // src/utils/version.ts
16
+ function parseVersion(version) {
17
+ const match = /^(\d+)\.(\d+)\.(\d+)(?:-([a-z0-9.-]+))?/i.exec(version);
18
+ if (!match) {
19
+ throw new TypeError(`invalid version: ${version}`);
20
+ }
21
+ const [major, minor, patch] = match.slice(1, 4).map(Number);
22
+ const ret = {
23
+ major,
24
+ minor,
25
+ patch,
26
+ stage: "",
27
+ stageVersion: -1
28
+ };
29
+ if (match[4]) {
30
+ let [stage, _v] = match[4].split(".");
31
+ ret.stage = stage;
32
+ ret.stageVersion = Number(_v) || -1;
33
+ }
34
+ if (Number.isNaN(major) || Number.isNaN(minor) || Number.isNaN(patch) || Number.isNaN(ret.stageVersion)) {
35
+ throw new TypeError(`invalid version: ${version}`);
36
+ }
37
+ return ret;
38
+ }
39
+ function defaultIsLowerVersion(oldVer, newVer) {
40
+ const oldV = parseVersion(oldVer);
41
+ const newV = parseVersion(newVer);
42
+ function compareStrings(str1, str2) {
43
+ if (str1 === "") {
44
+ return str2 !== "";
45
+ } else if (str2 === "") {
46
+ return true;
47
+ }
48
+ return str1 < str2;
49
+ }
50
+ for (let key of Object.keys(oldV)) {
51
+ if (key === "stage" && compareStrings(oldV[key], newV[key])) {
52
+ return true;
53
+ } else if (oldV[key] !== newV[key]) {
54
+ return oldV[key] < newV[key];
55
+ }
56
+ }
57
+ return false;
58
+ }
59
+ function isUpdateJSON(json) {
60
+ const is = (j) => !!(j && j.minimumVersion && j.signature && j.version);
61
+ return is(json) && is(json?.beta);
62
+ }
63
+
64
+ // src/provider/download.ts
65
+ function getHeader(headers, key) {
66
+ const value = headers[key];
67
+ if (Array.isArray(value)) {
68
+ return value.length === 0 ? null : value[value.length - 1];
69
+ } else {
70
+ return value;
71
+ }
72
+ }
73
+ async function downloadFn(url, headers, onResponse) {
74
+ await electron.app.whenReady();
75
+ return new Promise((resolve, reject) => {
76
+ const request = electron.net.request({ url, method: "GET", redirect: "follow", headers });
77
+ request.on("response", (resp) => {
78
+ resp.on("aborted", () => reject(new Error("aborted")));
79
+ resp.on("error", () => reject(new Error("download error")));
80
+ onResponse(resp, resolve, reject);
81
+ });
82
+ request.on("error", reject);
83
+ request.end();
84
+ });
85
+ }
86
+ async function defaultDownloadUpdateJSON(url, headers) {
87
+ return await downloadFn(url, headers, (resp, resolve, reject) => {
88
+ let data = "";
89
+ resp.on("data", (chunk) => data += chunk);
90
+ resp.on("end", () => {
91
+ try {
92
+ const json = JSON.parse(data);
93
+ if (isUpdateJSON(json)) {
94
+ resolve(json);
95
+ } else {
96
+ throw Error;
97
+ }
98
+ } catch {
99
+ reject(new Error("invalid update json"));
100
+ }
101
+ });
102
+ });
103
+ }
104
+ async function defaultDownloadAsar(url, headers, onDownloading) {
105
+ let transferred = 0;
106
+ let time = Date.now();
107
+ return await downloadFn(url, headers, (resp, resolve) => {
108
+ const total = getHeader(resp.headers, "content-length") || -1;
109
+ let data = [];
110
+ resp.on("data", (chunk) => {
111
+ const delta = chunk.length;
112
+ transferred += delta;
113
+ const current = Date.now();
114
+ onDownloading?.({
115
+ percent: +(transferred / total).toFixed(2) * 100,
116
+ total,
117
+ transferred,
118
+ delta,
119
+ bps: delta / ((current - time) * 1e3)
120
+ });
121
+ time = current;
122
+ data.push(chunk);
123
+ });
124
+ resp.on("end", () => resolve(Buffer.concat(data)));
125
+ });
126
+ }
127
+ function hashBuffer(data, length) {
128
+ const hash = crypto__default.default.createHash("SHA256").update(data).digest("binary");
129
+ return Buffer.from(hash).subarray(0, length);
130
+ }
131
+ function aesDecrypt(encryptedText, key, iv) {
132
+ const decipher = crypto__default.default.createDecipheriv("aes-256-cbc", key, iv);
133
+ return decipher.update(encryptedText, "base64url", "utf8") + decipher.final("utf8");
134
+ }
135
+ function defaultVerifySignature(buffer, version, signature, cert) {
136
+ try {
137
+ const [sig, ver] = aesDecrypt(signature, hashBuffer(cert, 32), hashBuffer(buffer, 16)).split("%");
138
+ if (ver !== version) {
139
+ return false;
140
+ }
141
+ return crypto__default.default.createVerify("RSA-SHA256").update(buffer).verify(cert, sig, "base64");
142
+ } catch {
143
+ return false;
144
+ }
145
+ }
146
+ async function defaultUnzipFile(buffer) {
147
+ return new Promise((resolve, reject) => {
148
+ zlib__default.default.brotliDecompress(buffer, (err, buffer2) => {
149
+ if (err) {
150
+ reject(err);
151
+ } else {
152
+ resolve(buffer2);
153
+ }
154
+ });
155
+ });
156
+ }
157
+
158
+ // src/provider/base.ts
159
+ var BaseProvider = class {
160
+ name = "BaseProvider";
161
+ /**
162
+ * @inheritdoc
163
+ */
164
+ isLowerVersion = defaultIsLowerVersion;
165
+ /**
166
+ * @inheritdoc
167
+ */
168
+ verifySignaure = defaultVerifySignature;
169
+ /**
170
+ * @inheritdoc
171
+ */
172
+ unzipFile = defaultUnzipFile;
173
+ };
174
+
175
+ // src/provider/github.ts
176
+ var GitHubProvider = class extends BaseProvider {
177
+ name = "GithubProvider";
178
+ options;
179
+ /**
180
+ * Update Provider for Github repo
181
+ * - download update json from `https://raw.githubusercontent.com/{user}/{repo}/HEAD/{versionPath}`
182
+ * - download update asar from `https://github.com/{user}/{repo}/releases/download/v{version}/{name}-{version}.asar.gz`
183
+ *
184
+ * you can setup `urlHandler` in {@link GitHubProviderOptions} or `Updater` to modify url before request
185
+ * @param options provider options
186
+ */
187
+ constructor(options) {
188
+ super();
189
+ this.options = options;
190
+ if (!options.branch) {
191
+ this.options.branch = "HEAD";
192
+ }
193
+ }
194
+ get urlHandler() {
195
+ return this.options.urlHandler;
196
+ }
197
+ set urlHandler(handler) {
198
+ this.options.urlHandler = handler;
199
+ }
200
+ async parseURL(isDownloadAsar, extraPath) {
201
+ const url$1 = new url.URL(
202
+ `/${this.options.username}/${this.options.repo}/${extraPath}`,
203
+ "https://" + (isDownloadAsar ? "github.com" : "raw.githubusercontent.com")
204
+ );
205
+ return (await this.urlHandler?.(url$1, isDownloadAsar) || url$1).toString();
206
+ }
207
+ /**
208
+ * @inheritdoc
209
+ */
210
+ async downloadJSON(versionPath) {
211
+ return await defaultDownloadUpdateJSON(
212
+ await this.parseURL(false, `${this.options.branch}/${versionPath}`),
213
+ { Accept: "application/json", ...this.options.extraHeaders }
214
+ );
215
+ }
216
+ /**
217
+ * @inheritdoc
218
+ */
219
+ async downloadAsar(name, info, onDownloading) {
220
+ return await defaultDownloadAsar(
221
+ await this.parseURL(true, `releases/download/v${info.version}/${name}-${info.version}.asar.gz`),
222
+ { Accept: "application/octet-stream", ...this.options.extraHeaders },
223
+ onDownloading
224
+ );
225
+ }
226
+ };
227
+
228
+ exports.BaseProvider = BaseProvider;
229
+ exports.GitHubProvider = GitHubProvider;
230
+ exports.defaultDownloadAsar = defaultDownloadAsar;
231
+ exports.defaultDownloadUpdateJSON = defaultDownloadUpdateJSON;
232
+ exports.getHeader = getHeader;
@@ -0,0 +1,109 @@
1
+ import { d as defaultIsLowerVersion, a as UpdateJSON, U as UpdateInfo } from './version-C4tF_trh.cjs';
2
+ import { I as IProvider, D as DownloadingInfo, U as URLHandler, O as OnDownloading } from './types-DEYw5VrL.cjs';
3
+ import { f as defaultVerifySignature, a as defaultUnzipFile } from './zip-rm9ED9nU.cjs';
4
+ import { Arrayable } from '@subframe7536/type-utils';
5
+
6
+ declare abstract class BaseProvider implements IProvider {
7
+ name: string;
8
+ /**
9
+ * @inheritdoc
10
+ */
11
+ isLowerVersion: typeof defaultIsLowerVersion;
12
+ /**
13
+ * @inheritdoc
14
+ */
15
+ verifySignaure: typeof defaultVerifySignature;
16
+ /**
17
+ * @inheritdoc
18
+ */
19
+ unzipFile: typeof defaultUnzipFile;
20
+ /**
21
+ * @inheritdoc
22
+ */
23
+ abstract downloadJSON(versionPath: string): Promise<UpdateJSON>;
24
+ /**
25
+ * @inheritdoc
26
+ */
27
+ abstract downloadAsar(name: string, info: UpdateInfo, onDownloading?: (info: DownloadingInfo) => void): Promise<Buffer>;
28
+ }
29
+
30
+ interface GitHubProviderOptions {
31
+ /**
32
+ * Github user name
33
+ */
34
+ username: string;
35
+ /**
36
+ * Github repo name
37
+ */
38
+ repo: string;
39
+ /**
40
+ * Github branch name that fetch version
41
+ * @default 'HEAD'
42
+ */
43
+ branch?: string;
44
+ /**
45
+ * Extra headers
46
+ */
47
+ extraHeaders?: Record<string, string>;
48
+ /**
49
+ * Custom url handler
50
+ *
51
+ * for Github, there are some {@link https://github.com/XIU2/UserScript/blob/master/GithubEnhanced-High-Speed-Download.user.js#L40 public CDN links}
52
+ * @example
53
+ * (url, isDownloadAsar) => {
54
+ * if (isDownloadAsar) {
55
+ * url.hostname = 'mirror.ghproxy.com'
56
+ * url.pathname = 'https://github.com' + url.pathname
57
+ * return url
58
+ * }
59
+ * }
60
+ */
61
+ urlHandler?: URLHandler;
62
+ }
63
+ declare class GitHubProvider extends BaseProvider {
64
+ name: string;
65
+ private options;
66
+ /**
67
+ * Update Provider for Github repo
68
+ * - download update json from `https://raw.githubusercontent.com/{user}/{repo}/HEAD/{versionPath}`
69
+ * - download update asar from `https://github.com/{user}/{repo}/releases/download/v{version}/{name}-{version}.asar.gz`
70
+ *
71
+ * you can setup `urlHandler` in {@link GitHubProviderOptions} or `Updater` to modify url before request
72
+ * @param options provider options
73
+ */
74
+ constructor(options: GitHubProviderOptions);
75
+ get urlHandler(): URLHandler | undefined;
76
+ set urlHandler(handler: URLHandler);
77
+ private parseURL;
78
+ /**
79
+ * @inheritdoc
80
+ */
81
+ downloadJSON(versionPath: string): Promise<UpdateJSON>;
82
+ /**
83
+ * @inheritdoc
84
+ */
85
+ downloadAsar(name: string, info: UpdateInfo, onDownloading?: (info: DownloadingInfo) => void): Promise<Buffer>;
86
+ }
87
+
88
+ /**
89
+ * Safe get value from header
90
+ * @param headers response header
91
+ * @param key target header key
92
+ */
93
+ declare function getHeader(headers: Record<string, Arrayable<string>>, key: any): any;
94
+ /**
95
+ * Default function to download json and parse to UpdateJson
96
+ * @param url target url
97
+ * @param headers extra headers
98
+ */
99
+ declare function defaultDownloadUpdateJSON(url: string, headers: Record<string, any>): Promise<UpdateJSON>;
100
+ /**
101
+ * Default function to download asar buffer,
102
+ * get total size from `Content-Length` header
103
+ * @param url target url
104
+ * @param headers extra headers
105
+ * @param onDownloading on downloading callback
106
+ */
107
+ declare function defaultDownloadAsar(url: string, headers: Record<string, any>, onDownloading?: OnDownloading): Promise<Buffer>;
108
+
109
+ export { BaseProvider, DownloadingInfo, GitHubProvider, type GitHubProviderOptions, IProvider, OnDownloading, URLHandler, defaultDownloadAsar, defaultDownloadUpdateJSON, getHeader };
@@ -0,0 +1,109 @@
1
+ import { d as defaultIsLowerVersion, a as UpdateJSON, U as UpdateInfo } from './version-C4tF_trh.js';
2
+ import { I as IProvider, D as DownloadingInfo, U as URLHandler, O as OnDownloading } from './types-Bnc4jz6R.js';
3
+ import { f as defaultVerifySignature, a as defaultUnzipFile } from './zip-rm9ED9nU.js';
4
+ import { Arrayable } from '@subframe7536/type-utils';
5
+
6
+ declare abstract class BaseProvider implements IProvider {
7
+ name: string;
8
+ /**
9
+ * @inheritdoc
10
+ */
11
+ isLowerVersion: typeof defaultIsLowerVersion;
12
+ /**
13
+ * @inheritdoc
14
+ */
15
+ verifySignaure: typeof defaultVerifySignature;
16
+ /**
17
+ * @inheritdoc
18
+ */
19
+ unzipFile: typeof defaultUnzipFile;
20
+ /**
21
+ * @inheritdoc
22
+ */
23
+ abstract downloadJSON(versionPath: string): Promise<UpdateJSON>;
24
+ /**
25
+ * @inheritdoc
26
+ */
27
+ abstract downloadAsar(name: string, info: UpdateInfo, onDownloading?: (info: DownloadingInfo) => void): Promise<Buffer>;
28
+ }
29
+
30
+ interface GitHubProviderOptions {
31
+ /**
32
+ * Github user name
33
+ */
34
+ username: string;
35
+ /**
36
+ * Github repo name
37
+ */
38
+ repo: string;
39
+ /**
40
+ * Github branch name that fetch version
41
+ * @default 'HEAD'
42
+ */
43
+ branch?: string;
44
+ /**
45
+ * Extra headers
46
+ */
47
+ extraHeaders?: Record<string, string>;
48
+ /**
49
+ * Custom url handler
50
+ *
51
+ * for Github, there are some {@link https://github.com/XIU2/UserScript/blob/master/GithubEnhanced-High-Speed-Download.user.js#L40 public CDN links}
52
+ * @example
53
+ * (url, isDownloadAsar) => {
54
+ * if (isDownloadAsar) {
55
+ * url.hostname = 'mirror.ghproxy.com'
56
+ * url.pathname = 'https://github.com' + url.pathname
57
+ * return url
58
+ * }
59
+ * }
60
+ */
61
+ urlHandler?: URLHandler;
62
+ }
63
+ declare class GitHubProvider extends BaseProvider {
64
+ name: string;
65
+ private options;
66
+ /**
67
+ * Update Provider for Github repo
68
+ * - download update json from `https://raw.githubusercontent.com/{user}/{repo}/HEAD/{versionPath}`
69
+ * - download update asar from `https://github.com/{user}/{repo}/releases/download/v{version}/{name}-{version}.asar.gz`
70
+ *
71
+ * you can setup `urlHandler` in {@link GitHubProviderOptions} or `Updater` to modify url before request
72
+ * @param options provider options
73
+ */
74
+ constructor(options: GitHubProviderOptions);
75
+ get urlHandler(): URLHandler | undefined;
76
+ set urlHandler(handler: URLHandler);
77
+ private parseURL;
78
+ /**
79
+ * @inheritdoc
80
+ */
81
+ downloadJSON(versionPath: string): Promise<UpdateJSON>;
82
+ /**
83
+ * @inheritdoc
84
+ */
85
+ downloadAsar(name: string, info: UpdateInfo, onDownloading?: (info: DownloadingInfo) => void): Promise<Buffer>;
86
+ }
87
+
88
+ /**
89
+ * Safe get value from header
90
+ * @param headers response header
91
+ * @param key target header key
92
+ */
93
+ declare function getHeader(headers: Record<string, Arrayable<string>>, key: any): any;
94
+ /**
95
+ * Default function to download json and parse to UpdateJson
96
+ * @param url target url
97
+ * @param headers extra headers
98
+ */
99
+ declare function defaultDownloadUpdateJSON(url: string, headers: Record<string, any>): Promise<UpdateJSON>;
100
+ /**
101
+ * Default function to download asar buffer,
102
+ * get total size from `Content-Length` header
103
+ * @param url target url
104
+ * @param headers extra headers
105
+ * @param onDownloading on downloading callback
106
+ */
107
+ declare function defaultDownloadAsar(url: string, headers: Record<string, any>, onDownloading?: OnDownloading): Promise<Buffer>;
108
+
109
+ export { BaseProvider, DownloadingInfo, GitHubProvider, type GitHubProviderOptions, IProvider, OnDownloading, URLHandler, defaultDownloadAsar, defaultDownloadUpdateJSON, getHeader };
@@ -0,0 +1,139 @@
1
+ import { defaultVerifySignature, defaultUnzipFile } from './chunk-KZSYEXLO.js';
2
+ import { defaultIsLowerVersion, isUpdateJSON } from './chunk-72ZAJ7AF.js';
3
+ import { URL } from 'node:url';
4
+ import { app, net } from 'electron';
5
+
6
+ function getHeader(headers, key) {
7
+ const value = headers[key];
8
+ if (Array.isArray(value)) {
9
+ return value.length === 0 ? null : value[value.length - 1];
10
+ } else {
11
+ return value;
12
+ }
13
+ }
14
+ async function downloadFn(url, headers, onResponse) {
15
+ await app.whenReady();
16
+ return new Promise((resolve, reject) => {
17
+ const request = net.request({ url, method: "GET", redirect: "follow", headers });
18
+ request.on("response", (resp) => {
19
+ resp.on("aborted", () => reject(new Error("aborted")));
20
+ resp.on("error", () => reject(new Error("download error")));
21
+ onResponse(resp, resolve, reject);
22
+ });
23
+ request.on("error", reject);
24
+ request.end();
25
+ });
26
+ }
27
+ async function defaultDownloadUpdateJSON(url, headers) {
28
+ return await downloadFn(url, headers, (resp, resolve, reject) => {
29
+ let data = "";
30
+ resp.on("data", (chunk) => data += chunk);
31
+ resp.on("end", () => {
32
+ try {
33
+ const json = JSON.parse(data);
34
+ if (isUpdateJSON(json)) {
35
+ resolve(json);
36
+ } else {
37
+ throw Error;
38
+ }
39
+ } catch {
40
+ reject(new Error("invalid update json"));
41
+ }
42
+ });
43
+ });
44
+ }
45
+ async function defaultDownloadAsar(url, headers, onDownloading) {
46
+ let transferred = 0;
47
+ let time = Date.now();
48
+ return await downloadFn(url, headers, (resp, resolve) => {
49
+ const total = getHeader(resp.headers, "content-length") || -1;
50
+ let data = [];
51
+ resp.on("data", (chunk) => {
52
+ const delta = chunk.length;
53
+ transferred += delta;
54
+ const current = Date.now();
55
+ onDownloading?.({
56
+ percent: +(transferred / total).toFixed(2) * 100,
57
+ total,
58
+ transferred,
59
+ delta,
60
+ bps: delta / ((current - time) * 1e3)
61
+ });
62
+ time = current;
63
+ data.push(chunk);
64
+ });
65
+ resp.on("end", () => resolve(Buffer.concat(data)));
66
+ });
67
+ }
68
+
69
+ // src/provider/base.ts
70
+ var BaseProvider = class {
71
+ name = "BaseProvider";
72
+ /**
73
+ * @inheritdoc
74
+ */
75
+ isLowerVersion = defaultIsLowerVersion;
76
+ /**
77
+ * @inheritdoc
78
+ */
79
+ verifySignaure = defaultVerifySignature;
80
+ /**
81
+ * @inheritdoc
82
+ */
83
+ unzipFile = defaultUnzipFile;
84
+ };
85
+
86
+ // src/provider/github.ts
87
+ var GitHubProvider = class extends BaseProvider {
88
+ name = "GithubProvider";
89
+ options;
90
+ /**
91
+ * Update Provider for Github repo
92
+ * - download update json from `https://raw.githubusercontent.com/{user}/{repo}/HEAD/{versionPath}`
93
+ * - download update asar from `https://github.com/{user}/{repo}/releases/download/v{version}/{name}-{version}.asar.gz`
94
+ *
95
+ * you can setup `urlHandler` in {@link GitHubProviderOptions} or `Updater` to modify url before request
96
+ * @param options provider options
97
+ */
98
+ constructor(options) {
99
+ super();
100
+ this.options = options;
101
+ if (!options.branch) {
102
+ this.options.branch = "HEAD";
103
+ }
104
+ }
105
+ get urlHandler() {
106
+ return this.options.urlHandler;
107
+ }
108
+ set urlHandler(handler) {
109
+ this.options.urlHandler = handler;
110
+ }
111
+ async parseURL(isDownloadAsar, extraPath) {
112
+ const url = new URL(
113
+ `/${this.options.username}/${this.options.repo}/${extraPath}`,
114
+ "https://" + (isDownloadAsar ? "github.com" : "raw.githubusercontent.com")
115
+ );
116
+ return (await this.urlHandler?.(url, isDownloadAsar) || url).toString();
117
+ }
118
+ /**
119
+ * @inheritdoc
120
+ */
121
+ async downloadJSON(versionPath) {
122
+ return await defaultDownloadUpdateJSON(
123
+ await this.parseURL(false, `${this.options.branch}/${versionPath}`),
124
+ { Accept: "application/json", ...this.options.extraHeaders }
125
+ );
126
+ }
127
+ /**
128
+ * @inheritdoc
129
+ */
130
+ async downloadAsar(name, info, onDownloading) {
131
+ return await defaultDownloadAsar(
132
+ await this.parseURL(true, `releases/download/v${info.version}/${name}-${info.version}.asar.gz`),
133
+ { Accept: "application/octet-stream", ...this.options.extraHeaders },
134
+ onDownloading
135
+ );
136
+ }
137
+ };
138
+
139
+ export { BaseProvider, GitHubProvider, defaultDownloadAsar, defaultDownloadUpdateJSON, getHeader };
@@ -0,0 +1,78 @@
1
+ import { Promisable } from '@subframe7536/type-utils';
2
+ import { a as UpdateJSON, U as UpdateInfo } from './version-C4tF_trh.js';
3
+
4
+ type URLHandler = (url: URL, isDownloadAsar: boolean) => Promisable<URL | string | undefined | null>;
5
+ type OnDownloading = (progress: DownloadingInfo) => void;
6
+ interface DownloadingInfo {
7
+ /**
8
+ * Download buffer delta
9
+ */
10
+ delta: number;
11
+ /**
12
+ * Downloaded percent, 0 ~ 100
13
+ *
14
+ * If no `Content-Length` header, will be nagative
15
+ */
16
+ percent: number;
17
+ /**
18
+ * Total size
19
+ *
20
+ * If not `Content-Length` header, will be -1
21
+ */
22
+ total: number;
23
+ /**
24
+ * Downloaded size
25
+ */
26
+ transferred: number;
27
+ /**
28
+ * Download speed, bytes per second
29
+ */
30
+ bps: number;
31
+ }
32
+ interface IProvider {
33
+ /**
34
+ * Provider name
35
+ */
36
+ name: string;
37
+ /**
38
+ * Custom url handler
39
+ *
40
+ * for Github, there are some {@link https://github.com/XIU2/UserScript/blob/master/GithubEnhanced-High-Speed-Download.user.js#L34 public CDN links}
41
+ */
42
+ urlHandler?: URLHandler;
43
+ onDownloading?: OnDownloading;
44
+ /**
45
+ * Download update json
46
+ * @param versionPath parsed version path in project
47
+ */
48
+ downloadJSON: (versionPath: string) => Promise<UpdateJSON>;
49
+ /**
50
+ * Download update asar
51
+ * @param name app name
52
+ * @param updateInfo existing update info
53
+ * @param onDownloading hook for on downloading
54
+ */
55
+ downloadAsar: (name: string, updateInfo: UpdateInfo, onDownloading?: (info: DownloadingInfo) => void) => Promise<Buffer>;
56
+ /**
57
+ * Check the old version is less than new version
58
+ * @param oldVer old version string
59
+ * @param newVer new version string
60
+ */
61
+ isLowerVersion: (oldVer: string, newVer: string) => boolean;
62
+ /**
63
+ * Function to decompress file using brotli
64
+ * @param buffer compressed file buffer
65
+ */
66
+ unzipFile: (buffer: Buffer) => Promise<Buffer>;
67
+ /**
68
+ * Verify asar signature,
69
+ * if signature is valid, returns the version, otherwise returns `undefined`
70
+ * @param buffer file buffer
71
+ * @param version target version
72
+ * @param signature signature
73
+ * @param cert certificate
74
+ */
75
+ verifySignaure: (buffer: Buffer, version: string, signature: string, cert: string) => Promisable<boolean>;
76
+ }
77
+
78
+ export type { DownloadingInfo as D, IProvider as I, OnDownloading as O, URLHandler as U };