electron-incremental-update 2.0.0-beta.2 → 2.0.0-beta.4
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 +76 -0
- package/dist/chunk-JSYIRKTR.js +53 -0
- package/dist/chunk-PNYRQYFC.js +77 -0
- package/dist/core-CW7TMqi7.d.cts +134 -0
- package/dist/core-D6QlpOgp.d.ts +134 -0
- package/dist/index.cjs +83 -152
- package/dist/index.d.cts +8 -133
- package/dist/index.d.ts +8 -133
- package/dist/index.js +60 -84
- package/dist/provider.cjs +85 -123
- package/dist/provider.d.cts +44 -17
- package/dist/provider.d.ts +44 -17
- package/dist/provider.js +50 -44
- package/dist/{types-CPq1MrYZ.d.ts → types-Bz1VD18z.d.cts} +39 -3
- package/dist/{types-COqp44eg.d.cts → types-Bz1VD18z.d.ts} +39 -3
- package/dist/utils.cjs +108 -174
- package/dist/utils.d.cts +10 -16
- package/dist/utils.d.ts +10 -16
- package/dist/utils.js +12 -62
- package/dist/vite.d.ts +397 -0
- package/dist/vite.js +138 -155
- package/dist/zip-WRrEMkgp.d.cts +10 -0
- package/dist/zip-WRrEMkgp.d.ts +10 -0
- package/package.json +7 -7
- package/dist/chunk-BG22XZAB.js +0 -257
- package/dist/decrypt-D9WdXYjH.d.cts +0 -4
- package/dist/decrypt-D9WdXYjH.d.ts +0 -4
- package/dist/version-CffZWDhZ.d.cts +0 -32
- package/dist/version-CffZWDhZ.d.ts +0 -32
package/dist/provider.cjs
CHANGED
|
@@ -1,58 +1,11 @@
|
|
|
1
|
-
|
|
2
|
-
var __defProp = Object.defineProperty;
|
|
3
|
-
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
-
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
-
var __export = (target, all) => {
|
|
7
|
-
for (var name in all)
|
|
8
|
-
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
-
};
|
|
10
|
-
var __copyProps = (to, from, except, desc) => {
|
|
11
|
-
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
-
for (let key of __getOwnPropNames(from))
|
|
13
|
-
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
-
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
-
}
|
|
16
|
-
return to;
|
|
17
|
-
};
|
|
18
|
-
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
1
|
+
'use strict';
|
|
19
2
|
|
|
20
|
-
|
|
21
|
-
var
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
downloadAsarBufferDefault: () => downloadAsarBufferDefault,
|
|
25
|
-
downloadUpdateJSONDefault: () => downloadUpdateJSONDefault
|
|
26
|
-
});
|
|
27
|
-
module.exports = __toCommonJS(provider_exports);
|
|
3
|
+
var url = require('url');
|
|
4
|
+
var electron = require('electron');
|
|
5
|
+
var crypto = require('crypto');
|
|
6
|
+
var zlib = require('zlib');
|
|
28
7
|
|
|
29
|
-
// src/
|
|
30
|
-
var import_node_fs = require("fs");
|
|
31
|
-
var import_node_path = require("path");
|
|
32
|
-
var import_electron = require("electron");
|
|
33
|
-
var isDev = __EIU_IS_DEV__;
|
|
34
|
-
var isWin = process.platform === "win32";
|
|
35
|
-
var isMac = process.platform === "darwin";
|
|
36
|
-
var isLinux = process.platform === "linux";
|
|
37
|
-
function waitAppReady(timeout = 1e3) {
|
|
38
|
-
return import_electron.app.isReady() ? Promise.resolve() : new Promise((resolve, reject) => {
|
|
39
|
-
const _ = setTimeout(() => {
|
|
40
|
-
reject(new Error("app is not ready"));
|
|
41
|
-
}, timeout);
|
|
42
|
-
import_electron.app.whenReady().then(() => {
|
|
43
|
-
clearTimeout(_);
|
|
44
|
-
resolve();
|
|
45
|
-
});
|
|
46
|
-
});
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
// src/utils/zip.ts
|
|
50
|
-
var import_node_fs2 = require("fs");
|
|
51
|
-
var import_node_zlib = require("zlib");
|
|
52
|
-
|
|
53
|
-
// src/utils/unzip.ts
|
|
54
|
-
var import_node_fs3 = require("fs");
|
|
55
|
-
var import_node_zlib2 = require("zlib");
|
|
8
|
+
// src/provider/github.ts
|
|
56
9
|
|
|
57
10
|
// src/utils/version.ts
|
|
58
11
|
function parseVersion(version) {
|
|
@@ -78,7 +31,7 @@ function parseVersion(version) {
|
|
|
78
31
|
}
|
|
79
32
|
return ret;
|
|
80
33
|
}
|
|
81
|
-
function
|
|
34
|
+
function defaultIsLowerVersion(oldVer, newVer) {
|
|
82
35
|
const oldV = parseVersion(oldVer);
|
|
83
36
|
const newV = parseVersion(newVer);
|
|
84
37
|
function compareStrings(str1, str2) {
|
|
@@ -103,42 +56,11 @@ function isUpdateJSON(json) {
|
|
|
103
56
|
return is(json) && is(json?.beta);
|
|
104
57
|
}
|
|
105
58
|
|
|
106
|
-
// src/utils/crypto/decrypt.ts
|
|
107
|
-
var import_node_crypto2 = require("crypto");
|
|
108
|
-
|
|
109
|
-
// src/utils/crypto/utils.ts
|
|
110
|
-
var import_node_crypto = require("crypto");
|
|
111
|
-
function hashString(data, length) {
|
|
112
|
-
const hash = (0, import_node_crypto.createHash)("SHA256").update(data).digest("binary");
|
|
113
|
-
return Buffer.from(hash).subarray(0, length);
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
// src/utils/crypto/decrypt.ts
|
|
117
|
-
function decrypt(encryptedText, key, iv) {
|
|
118
|
-
const decipher = (0, import_node_crypto2.createDecipheriv)("aes-256-cbc", key, iv);
|
|
119
|
-
let decrypted = decipher.update(encryptedText, "base64url", "utf8");
|
|
120
|
-
decrypted += decipher.final("utf8");
|
|
121
|
-
return decrypted;
|
|
122
|
-
}
|
|
123
|
-
function verifySignatureDefault(buffer, signature, cert) {
|
|
124
|
-
try {
|
|
125
|
-
const [sig, version] = decrypt(signature, hashString(cert, 32), hashString(buffer, 16)).split("%");
|
|
126
|
-
const result = (0, import_node_crypto2.createVerify)("RSA-SHA256").update(buffer).verify(cert, sig, "base64");
|
|
127
|
-
return result ? version : void 0;
|
|
128
|
-
} catch {
|
|
129
|
-
return void 0;
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
// src/utils/crypto/encrypt.ts
|
|
134
|
-
var import_node_crypto3 = require("crypto");
|
|
135
|
-
|
|
136
59
|
// src/provider/download.ts
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
await waitAppReady();
|
|
60
|
+
async function downloadFn(url, headers, onResponse) {
|
|
61
|
+
await electron.app.whenReady();
|
|
140
62
|
return new Promise((resolve, reject) => {
|
|
141
|
-
const request =
|
|
63
|
+
const request = electron.net.request({ url, method: "GET", redirect: "follow" });
|
|
142
64
|
Object.keys(headers).forEach((key) => request.setHeader(key, headers[key]));
|
|
143
65
|
request.on("response", (resp) => {
|
|
144
66
|
resp.on("aborted", () => reject(new Error("aborted")));
|
|
@@ -149,8 +71,8 @@ async function downlaodFn(url, headers, onResponse) {
|
|
|
149
71
|
request.end();
|
|
150
72
|
});
|
|
151
73
|
}
|
|
152
|
-
async function
|
|
153
|
-
return await
|
|
74
|
+
async function defaultDownloadUpdateJSON(url, headers) {
|
|
75
|
+
return await downloadFn(url, headers, (resp, resolve, reject) => {
|
|
154
76
|
let data = "";
|
|
155
77
|
resp.on("data", (chunk) => data += chunk);
|
|
156
78
|
resp.on("end", () => {
|
|
@@ -167,10 +89,10 @@ async function downloadUpdateJSONDefault(url, headers) {
|
|
|
167
89
|
});
|
|
168
90
|
});
|
|
169
91
|
}
|
|
170
|
-
async function
|
|
92
|
+
async function defaultDownloadAsar(url, headers, total, onDownloading) {
|
|
171
93
|
let transferred = 0;
|
|
172
94
|
let time = Date.now();
|
|
173
|
-
return await
|
|
95
|
+
return await downloadFn(url, headers, (resp, resolve) => {
|
|
174
96
|
let data = [];
|
|
175
97
|
resp.on("data", (chunk) => {
|
|
176
98
|
transferred += chunk.length;
|
|
@@ -188,49 +110,89 @@ async function downloadAsarBufferDefault(url, headers, total, onDownloading) {
|
|
|
188
110
|
resp.on("end", () => resolve(Buffer.concat(data)));
|
|
189
111
|
});
|
|
190
112
|
}
|
|
113
|
+
function hashBuffer(data, length) {
|
|
114
|
+
const hash = crypto.createHash("SHA256").update(data).digest("binary");
|
|
115
|
+
return Buffer.from(hash).subarray(0, length);
|
|
116
|
+
}
|
|
117
|
+
function aesDecrypt(encryptedText, key, iv) {
|
|
118
|
+
const decipher = crypto.createDecipheriv("aes-256-cbc", key, iv);
|
|
119
|
+
return decipher.update(encryptedText, "base64url", "utf8") + decipher.final("utf8");
|
|
120
|
+
}
|
|
121
|
+
function defaultVerify(buffer, signature, cert) {
|
|
122
|
+
try {
|
|
123
|
+
const [sig, version] = aesDecrypt(signature, hashBuffer(cert, 32), hashBuffer(buffer, 16)).split("%");
|
|
124
|
+
const result = crypto.createVerify("RSA-SHA256").update(buffer).verify(cert, sig, "base64");
|
|
125
|
+
return result ? version : void 0;
|
|
126
|
+
} catch {
|
|
127
|
+
return void 0;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
async function defaultUnzipFile(buffer) {
|
|
131
|
+
return new Promise((resolve, reject) => {
|
|
132
|
+
zlib.brotliDecompress(buffer, (err, buffer2) => {
|
|
133
|
+
if (err) {
|
|
134
|
+
reject(err);
|
|
135
|
+
} else {
|
|
136
|
+
resolve(buffer2);
|
|
137
|
+
}
|
|
138
|
+
});
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
// src/provider/base.ts
|
|
143
|
+
var BaseProvider = class {
|
|
144
|
+
name = "BaseProvider";
|
|
145
|
+
isLowerVersion = defaultIsLowerVersion;
|
|
146
|
+
verifySignaure = defaultVerify;
|
|
147
|
+
unzipFile = defaultUnzipFile;
|
|
148
|
+
};
|
|
191
149
|
|
|
192
150
|
// src/provider/github.ts
|
|
193
|
-
var GitHubProvider = class {
|
|
194
|
-
ua = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.183 Safari/537.36";
|
|
151
|
+
var GitHubProvider = class extends BaseProvider {
|
|
195
152
|
name = "GithubProvider";
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
153
|
+
options;
|
|
154
|
+
/**
|
|
155
|
+
* Update Provider for Github repo
|
|
156
|
+
* - download update json from `https://raw.githubusercontent.com/{user}/{repo}/HEAD/{versionPath}`
|
|
157
|
+
* - download update asar from `https://github.com/{user}/{repo}/releases/download/v{version}/{name}-{version}.asar.gz`
|
|
158
|
+
*
|
|
159
|
+
* you can setup `urlHandler` in {@link GitHubProviderOptions} or `Updater` to modify url before request
|
|
160
|
+
* @param options provider options
|
|
161
|
+
*/
|
|
199
162
|
constructor(options) {
|
|
200
|
-
|
|
201
|
-
this.
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
}
|
|
206
|
-
if (!this.url.pathname.endsWith("/")) {
|
|
207
|
-
this.url.pathname += "/";
|
|
208
|
-
}
|
|
163
|
+
super();
|
|
164
|
+
this.options = options;
|
|
165
|
+
}
|
|
166
|
+
get urlHandler() {
|
|
167
|
+
return this.options.urlHandler;
|
|
209
168
|
}
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
169
|
+
set urlHandler(handler) {
|
|
170
|
+
this.options.urlHandler = handler;
|
|
171
|
+
}
|
|
172
|
+
async parseURL(isDownloadAsar, extraPath) {
|
|
173
|
+
const url$1 = new url.URL(
|
|
174
|
+
`/${this.options.username}/${this.options.repo}/${extraPath}`,
|
|
175
|
+
"https://" + (isDownloadAsar ? "github.com" : "raw.githubusercontent.com")
|
|
176
|
+
);
|
|
177
|
+
return (await this.urlHandler?.(url$1, isDownloadAsar) || url$1).toString();
|
|
213
178
|
}
|
|
214
|
-
isLowerVersion = isLowerVersionDefault;
|
|
215
|
-
verifySignaure = verifySignatureDefault;
|
|
216
179
|
async downloadJSON(versionPath) {
|
|
217
|
-
return await
|
|
218
|
-
this.parseURL(false, `HEAD/${versionPath}`),
|
|
219
|
-
{
|
|
180
|
+
return await defaultDownloadUpdateJSON(
|
|
181
|
+
await this.parseURL(false, `HEAD/${versionPath}`),
|
|
182
|
+
{ accept: "application/json", ...this.options.extraHeaders }
|
|
220
183
|
);
|
|
221
184
|
}
|
|
222
185
|
async downloadAsar(name, { version, size }, onDownloading) {
|
|
223
|
-
return await
|
|
224
|
-
this.parseURL(true, `releases/download/v${version}/${name}-${version}.asar.gz`),
|
|
225
|
-
{
|
|
186
|
+
return await defaultDownloadAsar(
|
|
187
|
+
await this.parseURL(true, `releases/download/v${version}/${name}-${version}.asar.gz`),
|
|
188
|
+
{ accept: "application/octet-stream", ...this.options.extraHeaders },
|
|
226
189
|
size,
|
|
227
190
|
onDownloading
|
|
228
191
|
);
|
|
229
192
|
}
|
|
230
193
|
};
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
});
|
|
194
|
+
|
|
195
|
+
exports.BaseProvider = BaseProvider;
|
|
196
|
+
exports.GitHubProvider = GitHubProvider;
|
|
197
|
+
exports.defaultDownloadAsar = defaultDownloadAsar;
|
|
198
|
+
exports.defaultDownloadUpdateJSON = defaultDownloadUpdateJSON;
|
package/dist/provider.d.cts
CHANGED
|
@@ -1,37 +1,64 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import { U as URLHandler, I as IProvider, D as DownloadingInfo, O as OnDownloading } from './types-COqp44eg.cjs';
|
|
1
|
+
import { I as IProvider, d as defaultIsLowerVersion, a as UpdateJSON, U as UpdateInfo, D as DownloadingInfo, c as URLHandler, O as OnDownloading } from './types-Bz1VD18z.cjs';
|
|
2
|
+
import { f as defaultVerify, a as defaultUnzipFile } from './zip-WRrEMkgp.cjs';
|
|
4
3
|
import '@subframe7536/type-utils';
|
|
5
4
|
|
|
5
|
+
declare abstract class BaseProvider implements IProvider {
|
|
6
|
+
name: string;
|
|
7
|
+
isLowerVersion: typeof defaultIsLowerVersion;
|
|
8
|
+
verifySignaure: typeof defaultVerify;
|
|
9
|
+
unzipFile: typeof defaultUnzipFile;
|
|
10
|
+
abstract downloadJSON(versionPath: string): Promise<UpdateJSON>;
|
|
11
|
+
abstract downloadAsar(name: string, info: UpdateInfo, onDownloading?: (info: DownloadingInfo) => void): Promise<Buffer>;
|
|
12
|
+
}
|
|
13
|
+
|
|
6
14
|
interface GitHubProviderOptions {
|
|
7
15
|
/**
|
|
8
|
-
* github
|
|
9
|
-
|
|
16
|
+
* github user name
|
|
17
|
+
*/
|
|
18
|
+
username: string;
|
|
19
|
+
/**
|
|
20
|
+
* github repo name
|
|
21
|
+
*/
|
|
22
|
+
repo: string;
|
|
23
|
+
/**
|
|
24
|
+
* extra headers
|
|
10
25
|
*/
|
|
11
|
-
url: string;
|
|
12
26
|
extraHeaders?: Record<string, string>;
|
|
13
27
|
/**
|
|
14
28
|
* custom url handler
|
|
15
29
|
*
|
|
16
|
-
* for Github, there are some {@link https://github.com/XIU2/UserScript/blob/master/GithubEnhanced-High-Speed-Download.user.js#
|
|
30
|
+
* for Github, there are some {@link https://github.com/XIU2/UserScript/blob/master/GithubEnhanced-High-Speed-Download.user.js#L40 public CDN links}
|
|
31
|
+
* @example
|
|
32
|
+
* (url, isDownloadAsar) => {
|
|
33
|
+
* if (isDownloadAsar) {
|
|
34
|
+
* url.hostname = 'mirror.ghproxy.com'
|
|
35
|
+
* url.pathname = 'https://github.com' + url.pathname
|
|
36
|
+
* return url
|
|
37
|
+
* }
|
|
38
|
+
* }
|
|
17
39
|
*/
|
|
18
40
|
urlHandler?: URLHandler;
|
|
19
41
|
}
|
|
20
|
-
declare class GitHubProvider
|
|
21
|
-
private ua;
|
|
42
|
+
declare class GitHubProvider extends BaseProvider {
|
|
22
43
|
name: string;
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
44
|
+
private options;
|
|
45
|
+
/**
|
|
46
|
+
* Update Provider for Github repo
|
|
47
|
+
* - download update json from `https://raw.githubusercontent.com/{user}/{repo}/HEAD/{versionPath}`
|
|
48
|
+
* - download update asar from `https://github.com/{user}/{repo}/releases/download/v{version}/{name}-{version}.asar.gz`
|
|
49
|
+
*
|
|
50
|
+
* you can setup `urlHandler` in {@link GitHubProviderOptions} or `Updater` to modify url before request
|
|
51
|
+
* @param options provider options
|
|
52
|
+
*/
|
|
26
53
|
constructor(options: GitHubProviderOptions);
|
|
54
|
+
get urlHandler(): URLHandler | undefined;
|
|
55
|
+
set urlHandler(handler: URLHandler);
|
|
27
56
|
private parseURL;
|
|
28
|
-
isLowerVersion: typeof isLowerVersionDefault;
|
|
29
|
-
verifySignaure: typeof verifySignatureDefault;
|
|
30
57
|
downloadJSON(versionPath: string): Promise<UpdateJSON>;
|
|
31
58
|
downloadAsar(name: string, { version, size }: UpdateInfo, onDownloading?: (info: DownloadingInfo) => void): Promise<Buffer>;
|
|
32
59
|
}
|
|
33
60
|
|
|
34
|
-
declare function
|
|
35
|
-
declare function
|
|
61
|
+
declare function defaultDownloadUpdateJSON(url: string, headers: Record<string, any>): Promise<UpdateJSON>;
|
|
62
|
+
declare function defaultDownloadAsar(url: string, headers: Record<string, any>, total: number, onDownloading?: OnDownloading): Promise<Buffer>;
|
|
36
63
|
|
|
37
|
-
export { DownloadingInfo, GitHubProvider, type GitHubProviderOptions, IProvider, OnDownloading, URLHandler,
|
|
64
|
+
export { BaseProvider, DownloadingInfo, GitHubProvider, type GitHubProviderOptions, IProvider, OnDownloading, URLHandler, defaultDownloadAsar, defaultDownloadUpdateJSON };
|
package/dist/provider.d.ts
CHANGED
|
@@ -1,37 +1,64 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import { U as URLHandler, I as IProvider, D as DownloadingInfo, O as OnDownloading } from './types-CPq1MrYZ.js';
|
|
1
|
+
import { I as IProvider, d as defaultIsLowerVersion, a as UpdateJSON, U as UpdateInfo, D as DownloadingInfo, c as URLHandler, O as OnDownloading } from './types-Bz1VD18z.js';
|
|
2
|
+
import { f as defaultVerify, a as defaultUnzipFile } from './zip-WRrEMkgp.js';
|
|
4
3
|
import '@subframe7536/type-utils';
|
|
5
4
|
|
|
5
|
+
declare abstract class BaseProvider implements IProvider {
|
|
6
|
+
name: string;
|
|
7
|
+
isLowerVersion: typeof defaultIsLowerVersion;
|
|
8
|
+
verifySignaure: typeof defaultVerify;
|
|
9
|
+
unzipFile: typeof defaultUnzipFile;
|
|
10
|
+
abstract downloadJSON(versionPath: string): Promise<UpdateJSON>;
|
|
11
|
+
abstract downloadAsar(name: string, info: UpdateInfo, onDownloading?: (info: DownloadingInfo) => void): Promise<Buffer>;
|
|
12
|
+
}
|
|
13
|
+
|
|
6
14
|
interface GitHubProviderOptions {
|
|
7
15
|
/**
|
|
8
|
-
* github
|
|
9
|
-
|
|
16
|
+
* github user name
|
|
17
|
+
*/
|
|
18
|
+
username: string;
|
|
19
|
+
/**
|
|
20
|
+
* github repo name
|
|
21
|
+
*/
|
|
22
|
+
repo: string;
|
|
23
|
+
/**
|
|
24
|
+
* extra headers
|
|
10
25
|
*/
|
|
11
|
-
url: string;
|
|
12
26
|
extraHeaders?: Record<string, string>;
|
|
13
27
|
/**
|
|
14
28
|
* custom url handler
|
|
15
29
|
*
|
|
16
|
-
* for Github, there are some {@link https://github.com/XIU2/UserScript/blob/master/GithubEnhanced-High-Speed-Download.user.js#
|
|
30
|
+
* for Github, there are some {@link https://github.com/XIU2/UserScript/blob/master/GithubEnhanced-High-Speed-Download.user.js#L40 public CDN links}
|
|
31
|
+
* @example
|
|
32
|
+
* (url, isDownloadAsar) => {
|
|
33
|
+
* if (isDownloadAsar) {
|
|
34
|
+
* url.hostname = 'mirror.ghproxy.com'
|
|
35
|
+
* url.pathname = 'https://github.com' + url.pathname
|
|
36
|
+
* return url
|
|
37
|
+
* }
|
|
38
|
+
* }
|
|
17
39
|
*/
|
|
18
40
|
urlHandler?: URLHandler;
|
|
19
41
|
}
|
|
20
|
-
declare class GitHubProvider
|
|
21
|
-
private ua;
|
|
42
|
+
declare class GitHubProvider extends BaseProvider {
|
|
22
43
|
name: string;
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
44
|
+
private options;
|
|
45
|
+
/**
|
|
46
|
+
* Update Provider for Github repo
|
|
47
|
+
* - download update json from `https://raw.githubusercontent.com/{user}/{repo}/HEAD/{versionPath}`
|
|
48
|
+
* - download update asar from `https://github.com/{user}/{repo}/releases/download/v{version}/{name}-{version}.asar.gz`
|
|
49
|
+
*
|
|
50
|
+
* you can setup `urlHandler` in {@link GitHubProviderOptions} or `Updater` to modify url before request
|
|
51
|
+
* @param options provider options
|
|
52
|
+
*/
|
|
26
53
|
constructor(options: GitHubProviderOptions);
|
|
54
|
+
get urlHandler(): URLHandler | undefined;
|
|
55
|
+
set urlHandler(handler: URLHandler);
|
|
27
56
|
private parseURL;
|
|
28
|
-
isLowerVersion: typeof isLowerVersionDefault;
|
|
29
|
-
verifySignaure: typeof verifySignatureDefault;
|
|
30
57
|
downloadJSON(versionPath: string): Promise<UpdateJSON>;
|
|
31
58
|
downloadAsar(name: string, { version, size }: UpdateInfo, onDownloading?: (info: DownloadingInfo) => void): Promise<Buffer>;
|
|
32
59
|
}
|
|
33
60
|
|
|
34
|
-
declare function
|
|
35
|
-
declare function
|
|
61
|
+
declare function defaultDownloadUpdateJSON(url: string, headers: Record<string, any>): Promise<UpdateJSON>;
|
|
62
|
+
declare function defaultDownloadAsar(url: string, headers: Record<string, any>, total: number, onDownloading?: OnDownloading): Promise<Buffer>;
|
|
36
63
|
|
|
37
|
-
export { DownloadingInfo, GitHubProvider, type GitHubProviderOptions, IProvider, OnDownloading, URLHandler,
|
|
64
|
+
export { BaseProvider, DownloadingInfo, GitHubProvider, type GitHubProviderOptions, IProvider, OnDownloading, URLHandler, defaultDownloadAsar, defaultDownloadUpdateJSON };
|
package/dist/provider.js
CHANGED
|
@@ -1,14 +1,10 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
waitAppReady
|
|
6
|
-
} from "./chunk-BG22XZAB.js";
|
|
1
|
+
import { defaultVerify, defaultUnzipFile } from './chunk-JSYIRKTR.js';
|
|
2
|
+
import { defaultIsLowerVersion, isUpdateJSON } from './chunk-BVFQWBLK.js';
|
|
3
|
+
import { URL } from 'node:url';
|
|
4
|
+
import { app, net } from 'electron';
|
|
7
5
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
async function downlaodFn(url, headers, onResponse) {
|
|
11
|
-
await waitAppReady();
|
|
6
|
+
async function downloadFn(url, headers, onResponse) {
|
|
7
|
+
await app.whenReady();
|
|
12
8
|
return new Promise((resolve, reject) => {
|
|
13
9
|
const request = net.request({ url, method: "GET", redirect: "follow" });
|
|
14
10
|
Object.keys(headers).forEach((key) => request.setHeader(key, headers[key]));
|
|
@@ -21,8 +17,8 @@ async function downlaodFn(url, headers, onResponse) {
|
|
|
21
17
|
request.end();
|
|
22
18
|
});
|
|
23
19
|
}
|
|
24
|
-
async function
|
|
25
|
-
return await
|
|
20
|
+
async function defaultDownloadUpdateJSON(url, headers) {
|
|
21
|
+
return await downloadFn(url, headers, (resp, resolve, reject) => {
|
|
26
22
|
let data = "";
|
|
27
23
|
resp.on("data", (chunk) => data += chunk);
|
|
28
24
|
resp.on("end", () => {
|
|
@@ -39,10 +35,10 @@ async function downloadUpdateJSONDefault(url, headers) {
|
|
|
39
35
|
});
|
|
40
36
|
});
|
|
41
37
|
}
|
|
42
|
-
async function
|
|
38
|
+
async function defaultDownloadAsar(url, headers, total, onDownloading) {
|
|
43
39
|
let transferred = 0;
|
|
44
40
|
let time = Date.now();
|
|
45
|
-
return await
|
|
41
|
+
return await downloadFn(url, headers, (resp, resolve) => {
|
|
46
42
|
let data = [];
|
|
47
43
|
resp.on("data", (chunk) => {
|
|
48
44
|
transferred += chunk.length;
|
|
@@ -61,47 +57,57 @@ async function downloadAsarBufferDefault(url, headers, total, onDownloading) {
|
|
|
61
57
|
});
|
|
62
58
|
}
|
|
63
59
|
|
|
60
|
+
// src/provider/base.ts
|
|
61
|
+
var BaseProvider = class {
|
|
62
|
+
name = "BaseProvider";
|
|
63
|
+
isLowerVersion = defaultIsLowerVersion;
|
|
64
|
+
verifySignaure = defaultVerify;
|
|
65
|
+
unzipFile = defaultUnzipFile;
|
|
66
|
+
};
|
|
67
|
+
|
|
64
68
|
// src/provider/github.ts
|
|
65
|
-
var GitHubProvider = class {
|
|
66
|
-
ua = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.183 Safari/537.36";
|
|
69
|
+
var GitHubProvider = class extends BaseProvider {
|
|
67
70
|
name = "GithubProvider";
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
+
options;
|
|
72
|
+
/**
|
|
73
|
+
* Update Provider for Github repo
|
|
74
|
+
* - download update json from `https://raw.githubusercontent.com/{user}/{repo}/HEAD/{versionPath}`
|
|
75
|
+
* - download update asar from `https://github.com/{user}/{repo}/releases/download/v{version}/{name}-{version}.asar.gz`
|
|
76
|
+
*
|
|
77
|
+
* you can setup `urlHandler` in {@link GitHubProviderOptions} or `Updater` to modify url before request
|
|
78
|
+
* @param options provider options
|
|
79
|
+
*/
|
|
71
80
|
constructor(options) {
|
|
72
|
-
|
|
73
|
-
this.
|
|
74
|
-
this.urlHandler = options.urlHandler;
|
|
75
|
-
if (this.url.host !== "github.com") {
|
|
76
|
-
throw new Error(`${this.name}: invalid github url: ${options.url}`);
|
|
77
|
-
}
|
|
78
|
-
if (!this.url.pathname.endsWith("/")) {
|
|
79
|
-
this.url.pathname += "/";
|
|
80
|
-
}
|
|
81
|
+
super();
|
|
82
|
+
this.options = options;
|
|
81
83
|
}
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
84
|
+
get urlHandler() {
|
|
85
|
+
return this.options.urlHandler;
|
|
86
|
+
}
|
|
87
|
+
set urlHandler(handler) {
|
|
88
|
+
this.options.urlHandler = handler;
|
|
89
|
+
}
|
|
90
|
+
async parseURL(isDownloadAsar, extraPath) {
|
|
91
|
+
const url = new URL(
|
|
92
|
+
`/${this.options.username}/${this.options.repo}/${extraPath}`,
|
|
93
|
+
"https://" + (isDownloadAsar ? "github.com" : "raw.githubusercontent.com")
|
|
94
|
+
);
|
|
95
|
+
return (await this.urlHandler?.(url, isDownloadAsar) || url).toString();
|
|
85
96
|
}
|
|
86
|
-
isLowerVersion = isLowerVersionDefault;
|
|
87
|
-
verifySignaure = verifySignatureDefault;
|
|
88
97
|
async downloadJSON(versionPath) {
|
|
89
|
-
return await
|
|
90
|
-
this.parseURL(false, `HEAD/${versionPath}`),
|
|
91
|
-
{
|
|
98
|
+
return await defaultDownloadUpdateJSON(
|
|
99
|
+
await this.parseURL(false, `HEAD/${versionPath}`),
|
|
100
|
+
{ accept: "application/json", ...this.options.extraHeaders }
|
|
92
101
|
);
|
|
93
102
|
}
|
|
94
103
|
async downloadAsar(name, { version, size }, onDownloading) {
|
|
95
|
-
return await
|
|
96
|
-
this.parseURL(true, `releases/download/v${version}/${name}-${version}.asar.gz`),
|
|
97
|
-
{
|
|
104
|
+
return await defaultDownloadAsar(
|
|
105
|
+
await this.parseURL(true, `releases/download/v${version}/${name}-${version}.asar.gz`),
|
|
106
|
+
{ accept: "application/octet-stream", ...this.options.extraHeaders },
|
|
98
107
|
size,
|
|
99
108
|
onDownloading
|
|
100
109
|
);
|
|
101
110
|
}
|
|
102
111
|
};
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
downloadAsarBufferDefault,
|
|
106
|
-
downloadUpdateJSONDefault
|
|
107
|
-
};
|
|
112
|
+
|
|
113
|
+
export { BaseProvider, GitHubProvider, defaultDownloadAsar, defaultDownloadUpdateJSON };
|
|
@@ -1,7 +1,38 @@
|
|
|
1
1
|
import { Promisable } from '@subframe7536/type-utils';
|
|
2
|
-
import { U as UpdateJSON, a as UpdateInfo } from './version-CffZWDhZ.js';
|
|
3
2
|
|
|
4
|
-
|
|
3
|
+
/**
|
|
4
|
+
* handle all unhandled error
|
|
5
|
+
* @param callback callback function
|
|
6
|
+
*/
|
|
7
|
+
declare function handleUnexpectedErrors(callback: (err: unknown) => void): void;
|
|
8
|
+
interface Version {
|
|
9
|
+
major: number;
|
|
10
|
+
minor: number;
|
|
11
|
+
patch: number;
|
|
12
|
+
stage: string;
|
|
13
|
+
stageVersion: number;
|
|
14
|
+
}
|
|
15
|
+
declare function parseVersion(version: string): Version;
|
|
16
|
+
declare function defaultIsLowerVersion(oldVer: string, newVer: string): boolean;
|
|
17
|
+
/**
|
|
18
|
+
* update info json
|
|
19
|
+
*/
|
|
20
|
+
type UpdateInfo = {
|
|
21
|
+
signature: string;
|
|
22
|
+
minimumVersion: string;
|
|
23
|
+
version: string;
|
|
24
|
+
size: number;
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* {@link UpdateInfo} with beta
|
|
28
|
+
*/
|
|
29
|
+
type UpdateJSON = UpdateInfo & {
|
|
30
|
+
beta: UpdateInfo;
|
|
31
|
+
};
|
|
32
|
+
declare function isUpdateJSON(json: any): json is UpdateJSON;
|
|
33
|
+
declare function defaultVersionJsonGenerator(existingJson: UpdateJSON, buffer: Buffer, signature: string, version: string, minimumVersion: string): UpdateJSON;
|
|
34
|
+
|
|
35
|
+
type URLHandler = (url: URL, isDownloadAsar: boolean) => Promisable<URL | string | undefined | null>;
|
|
5
36
|
type OnDownloading = (progress: DownloadingInfo) => void;
|
|
6
37
|
interface DownloadingInfo {
|
|
7
38
|
/**
|
|
@@ -56,6 +87,11 @@ interface IProvider {
|
|
|
56
87
|
* @returns if version1 < version2
|
|
57
88
|
*/
|
|
58
89
|
isLowerVersion: (oldVer: string, newVer: string) => boolean;
|
|
90
|
+
/**
|
|
91
|
+
* unzip file buffer
|
|
92
|
+
* @param buffer source buffer
|
|
93
|
+
*/
|
|
94
|
+
unzipFile: (buffer: Buffer) => Promise<Buffer>;
|
|
59
95
|
/**
|
|
60
96
|
* verify asar signature
|
|
61
97
|
* @param buffer file buffer
|
|
@@ -66,4 +102,4 @@ interface IProvider {
|
|
|
66
102
|
verifySignaure: (buffer: Buffer, signature: string, cert: string) => Promisable<string | undefined>;
|
|
67
103
|
}
|
|
68
104
|
|
|
69
|
-
export type
|
|
105
|
+
export { type DownloadingInfo as D, type IProvider as I, type OnDownloading as O, type UpdateInfo as U, type Version as V, type UpdateJSON as a, defaultVersionJsonGenerator as b, type URLHandler as c, defaultIsLowerVersion as d, handleUnexpectedErrors as h, isUpdateJSON as i, parseVersion as p };
|