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 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 version json function
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
- generateVersionJson?: (
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, U as UpdateJSONWithURL } from './types-CWtySwqA.cjs';
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, U as UpdateJSONWithURL } from './types-CStrrQPl.js';
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-JI27JWJN.js';
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 downloadFn(url, headers, signal, onResponse) {
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 downloadFn(
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 downloadFn(
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;
@@ -1,10 +1,12 @@
1
- import { I as IProvider, U as UpdateJSONWithURL, a as UpdateInfoWithURL, D as DownloadingInfo, O as OnDownloading, b as URLHandler } from './types-CWtySwqA.cjs';
2
- import { c as defaultVerifySignature, f as defaultUnzipFile } from './zip-DQdr8pFv.cjs';
3
- import { d as defaultIsLowerVersion, a as UpdateJSON } from './version-Bl_0oO5f.cjs';
4
- import { Arrayable } from '@subframe7536/type-utils';
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<UpdateJSONWithURL>;
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<UpdateJSONWithURL>;
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<UpdateJSONWithURL>;
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, OnDownloading, URLHandler, UpdateInfoWithURL, UpdateJSONWithURL, defaultDownloadAsar, defaultDownloadJSON, defaultDownloadUpdateJSON, getHeader };
137
+ export { BaseProvider, DownloadingInfo, GitHubApiProvider, type GitHubApiProviderOptions, GitHubProvider, type GitHubProviderOptions, IProvider, URLHandler, UpdateInfoWithURL };
@@ -1,10 +1,12 @@
1
- import { I as IProvider, U as UpdateJSONWithURL, a as UpdateInfoWithURL, D as DownloadingInfo, O as OnDownloading, b as URLHandler } from './types-CStrrQPl.js';
2
- import { c as defaultVerifySignature, f as defaultUnzipFile } from './zip-DQdr8pFv.js';
3
- import { d as defaultIsLowerVersion, a as UpdateJSON } from './version-Bl_0oO5f.js';
4
- import { Arrayable } from '@subframe7536/type-utils';
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<UpdateJSONWithURL>;
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<UpdateJSONWithURL>;
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<UpdateJSONWithURL>;
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, OnDownloading, URLHandler, UpdateInfoWithURL, UpdateJSONWithURL, defaultDownloadAsar, defaultDownloadJSON, defaultDownloadUpdateJSON, getHeader };
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-XGWQQVIZ.js';
2
- import { defaultIsLowerVersion, isUpdateJSON } from './chunk-AAAM44NW.js';
3
- import electron from 'electron';
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, defaultDownloadAsar, defaultDownloadJSON, defaultDownloadUpdateJSON, getHeader };
178
+ export { BaseProvider, GitHubApiProvider, GitHubProvider };