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/provider.cjs CHANGED
@@ -1,58 +1,11 @@
1
- "use strict";
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
- // src/provider/index.ts
21
- var provider_exports = {};
22
- __export(provider_exports, {
23
- GitHubProvider: () => GitHubProvider,
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/utils/electron.ts
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 isLowerVersionDefault(oldVer, newVer) {
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
- var import_electron2 = require("electron");
138
- async function downlaodFn(url, headers, onResponse) {
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 = import_electron2.net.request({ url, method: "GET", redirect: "follow" });
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 downloadUpdateJSONDefault(url, headers) {
153
- return await downlaodFn(url, headers, (resp, resolve, reject) => {
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 downloadAsarBufferDefault(url, headers, total, onDownloading) {
92
+ async function defaultDownloadAsar(url, headers, total, onDownloading) {
171
93
  let transferred = 0;
172
94
  let time = Date.now();
173
- return await downlaodFn(url, headers, (resp, resolve) => {
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
- urlHandler;
197
- url;
198
- extraHeaders;
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
- this.url = new URL(options.url);
201
- this.extraHeaders = options.extraHeaders;
202
- this.urlHandler = options.urlHandler;
203
- if (this.url.host !== "github.com") {
204
- throw new Error(`${this.name}: invalid github url: ${options.url}`);
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
- parseURL(isDownloadAsar, path) {
211
- const url = this.url.href + path;
212
- return this.urlHandler ? this.urlHandler(url, isDownloadAsar) : url;
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 downloadUpdateJSONDefault(
218
- this.parseURL(false, `HEAD/${versionPath}`),
219
- { userAgent: this.ua, accept: "application/json", ...this.extraHeaders }
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 downloadAsarBufferDefault(
224
- this.parseURL(true, `releases/download/v${version}/${name}-${version}.asar.gz`),
225
- { userAgent: this.ua, accept: "application/octet-stream", ...this.extraHeaders },
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
- // Annotate the CommonJS export names for ESM import in node:
232
- 0 && (module.exports = {
233
- GitHubProvider,
234
- downloadAsarBufferDefault,
235
- downloadUpdateJSONDefault
236
- });
194
+
195
+ exports.BaseProvider = BaseProvider;
196
+ exports.GitHubProvider = GitHubProvider;
197
+ exports.defaultDownloadAsar = defaultDownloadAsar;
198
+ exports.defaultDownloadUpdateJSON = defaultDownloadUpdateJSON;
@@ -1,37 +1,64 @@
1
- import { i as isLowerVersionDefault, U as UpdateJSON, a as UpdateInfo } from './version-CffZWDhZ.cjs';
2
- import { v as verifySignatureDefault } from './decrypt-D9WdXYjH.cjs';
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 repo root url
9
- * @example 'https://github.com/electron/electron'
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#L34 public CDN links}
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 implements IProvider {
21
- private ua;
42
+ declare class GitHubProvider extends BaseProvider {
22
43
  name: string;
23
- urlHandler?: URLHandler;
24
- private url;
25
- private extraHeaders?;
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 downloadUpdateJSONDefault(url: string, headers: Record<string, any>): Promise<UpdateJSON>;
35
- declare function downloadAsarBufferDefault(url: string, headers: Record<string, any>, total: number, onDownloading?: OnDownloading): Promise<Buffer>;
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, downloadAsarBufferDefault, downloadUpdateJSONDefault };
64
+ export { BaseProvider, DownloadingInfo, GitHubProvider, type GitHubProviderOptions, IProvider, OnDownloading, URLHandler, defaultDownloadAsar, defaultDownloadUpdateJSON };
@@ -1,37 +1,64 @@
1
- import { i as isLowerVersionDefault, U as UpdateJSON, a as UpdateInfo } from './version-CffZWDhZ.js';
2
- import { v as verifySignatureDefault } from './decrypt-D9WdXYjH.js';
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 repo root url
9
- * @example 'https://github.com/electron/electron'
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#L34 public CDN links}
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 implements IProvider {
21
- private ua;
42
+ declare class GitHubProvider extends BaseProvider {
22
43
  name: string;
23
- urlHandler?: URLHandler;
24
- private url;
25
- private extraHeaders?;
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 downloadUpdateJSONDefault(url: string, headers: Record<string, any>): Promise<UpdateJSON>;
35
- declare function downloadAsarBufferDefault(url: string, headers: Record<string, any>, total: number, onDownloading?: OnDownloading): Promise<Buffer>;
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, downloadAsarBufferDefault, downloadUpdateJSONDefault };
64
+ export { BaseProvider, DownloadingInfo, GitHubProvider, type GitHubProviderOptions, IProvider, OnDownloading, URLHandler, defaultDownloadAsar, defaultDownloadUpdateJSON };
package/dist/provider.js CHANGED
@@ -1,14 +1,10 @@
1
- import {
2
- isLowerVersionDefault,
3
- isUpdateJSON,
4
- verifySignatureDefault,
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
- // src/provider/download.ts
9
- import { net } from "electron";
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 downloadUpdateJSONDefault(url, headers) {
25
- return await downlaodFn(url, headers, (resp, resolve, reject) => {
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 downloadAsarBufferDefault(url, headers, total, onDownloading) {
38
+ async function defaultDownloadAsar(url, headers, total, onDownloading) {
43
39
  let transferred = 0;
44
40
  let time = Date.now();
45
- return await downlaodFn(url, headers, (resp, resolve) => {
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
- urlHandler;
69
- url;
70
- extraHeaders;
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
- this.url = new URL(options.url);
73
- this.extraHeaders = options.extraHeaders;
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
- parseURL(isDownloadAsar, path) {
83
- const url = this.url.href + path;
84
- return this.urlHandler ? this.urlHandler(url, isDownloadAsar) : url;
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 downloadUpdateJSONDefault(
90
- this.parseURL(false, `HEAD/${versionPath}`),
91
- { userAgent: this.ua, accept: "application/json", ...this.extraHeaders }
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 downloadAsarBufferDefault(
96
- this.parseURL(true, `releases/download/v${version}/${name}-${version}.asar.gz`),
97
- { userAgent: this.ua, accept: "application/octet-stream", ...this.extraHeaders },
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
- export {
104
- GitHubProvider,
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
- type URLHandler = (url: string, isDownloadAsar: boolean) => string;
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 { DownloadingInfo as D, IProvider as I, OnDownloading as O, URLHandler as U };
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 };