@hot-updater/react-native 0.23.0 → 0.24.0
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/android/src/main/java/com/hotupdater/BundleFileStorageService.kt +393 -49
- package/android/src/main/java/com/hotupdater/BundleMetadata.kt +204 -0
- package/android/src/main/java/com/hotupdater/HotUpdater.kt +48 -36
- package/android/src/main/java/com/hotupdater/HotUpdaterException.kt +134 -0
- package/android/src/main/java/com/hotupdater/HotUpdaterImpl.kt +168 -95
- package/android/src/main/java/com/hotupdater/OkHttpDownloadService.kt +15 -3
- package/android/src/main/java/com/hotupdater/SignatureVerifier.kt +17 -12
- package/android/src/newarch/HotUpdaterModule.kt +88 -23
- package/android/src/oldarch/HotUpdaterModule.kt +89 -22
- package/android/src/oldarch/HotUpdaterSpec.kt +6 -0
- package/ios/HotUpdater/Internal/BundleFileStorageService.swift +401 -77
- package/ios/HotUpdater/Internal/BundleMetadata.swift +177 -0
- package/ios/HotUpdater/Internal/HotUpdater.mm +213 -47
- package/ios/HotUpdater/Internal/HotUpdaterImpl.swift +96 -25
- package/ios/HotUpdater/Internal/SignatureVerifier.swift +35 -29
- package/ios/HotUpdater/Internal/URLSessionDownloadService.swift +2 -2
- package/ios/HotUpdater/Public/HotUpdater.h +8 -2
- package/lib/commonjs/checkForUpdate.js +31 -28
- package/lib/commonjs/checkForUpdate.js.map +1 -1
- package/lib/commonjs/error.js +45 -1
- package/lib/commonjs/error.js.map +1 -1
- package/lib/commonjs/fetchUpdateInfo.js +7 -45
- package/lib/commonjs/fetchUpdateInfo.js.map +1 -1
- package/lib/commonjs/index.js +237 -208
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/native.js +103 -3
- package/lib/commonjs/native.js.map +1 -1
- package/lib/commonjs/specs/NativeHotUpdater.js.map +1 -1
- package/lib/commonjs/wrap.js +39 -1
- package/lib/commonjs/wrap.js.map +1 -1
- package/lib/module/checkForUpdate.js +32 -26
- package/lib/module/checkForUpdate.js.map +1 -1
- package/lib/module/error.js +45 -0
- package/lib/module/error.js.map +1 -1
- package/lib/module/fetchUpdateInfo.js +7 -45
- package/lib/module/fetchUpdateInfo.js.map +1 -1
- package/lib/module/index.js +238 -203
- package/lib/module/index.js.map +1 -1
- package/lib/module/native.js +87 -2
- package/lib/module/native.js.map +1 -1
- package/lib/module/specs/NativeHotUpdater.js.map +1 -1
- package/lib/module/wrap.js +40 -2
- package/lib/module/wrap.js.map +1 -1
- package/lib/typescript/commonjs/checkForUpdate.d.ts +11 -13
- package/lib/typescript/commonjs/checkForUpdate.d.ts.map +1 -1
- package/lib/typescript/commonjs/error.d.ts +120 -0
- package/lib/typescript/commonjs/error.d.ts.map +1 -1
- package/lib/typescript/commonjs/fetchUpdateInfo.d.ts +3 -5
- package/lib/typescript/commonjs/fetchUpdateInfo.d.ts.map +1 -1
- package/lib/typescript/commonjs/index.d.ts +35 -41
- package/lib/typescript/commonjs/index.d.ts.map +1 -1
- package/lib/typescript/commonjs/native.d.ts +58 -2
- package/lib/typescript/commonjs/native.d.ts.map +1 -1
- package/lib/typescript/commonjs/specs/NativeHotUpdater.d.ts +62 -0
- package/lib/typescript/commonjs/specs/NativeHotUpdater.d.ts.map +1 -1
- package/lib/typescript/commonjs/wrap.d.ts +76 -5
- package/lib/typescript/commonjs/wrap.d.ts.map +1 -1
- package/lib/typescript/module/checkForUpdate.d.ts +11 -13
- package/lib/typescript/module/checkForUpdate.d.ts.map +1 -1
- package/lib/typescript/module/error.d.ts +120 -0
- package/lib/typescript/module/error.d.ts.map +1 -1
- package/lib/typescript/module/fetchUpdateInfo.d.ts +3 -5
- package/lib/typescript/module/fetchUpdateInfo.d.ts.map +1 -1
- package/lib/typescript/module/index.d.ts +35 -41
- package/lib/typescript/module/index.d.ts.map +1 -1
- package/lib/typescript/module/native.d.ts +58 -2
- package/lib/typescript/module/native.d.ts.map +1 -1
- package/lib/typescript/module/specs/NativeHotUpdater.d.ts +62 -0
- package/lib/typescript/module/specs/NativeHotUpdater.d.ts.map +1 -1
- package/lib/typescript/module/wrap.d.ts +76 -5
- package/lib/typescript/module/wrap.d.ts.map +1 -1
- package/package.json +8 -7
- package/plugin/build/withHotUpdater.js +55 -4
- package/src/checkForUpdate.ts +51 -40
- package/src/error.ts +153 -0
- package/src/fetchUpdateInfo.ts +10 -58
- package/src/index.ts +283 -206
- package/src/native.ts +88 -2
- package/src/specs/NativeHotUpdater.ts +63 -0
- package/src/wrap.tsx +131 -9
- package/android/src/main/java/com/hotupdater/HotUpdaterFactory.kt +0 -52
- package/ios/HotUpdater/Internal/HotUpdaterFactory.swift +0 -24
- package/lib/commonjs/runUpdateProcess.js +0 -69
- package/lib/commonjs/runUpdateProcess.js.map +0 -1
- package/lib/module/runUpdateProcess.js +0 -64
- package/lib/module/runUpdateProcess.js.map +0 -1
- package/lib/typescript/commonjs/runUpdateProcess.d.ts +0 -49
- package/lib/typescript/commonjs/runUpdateProcess.d.ts.map +0 -1
- package/lib/typescript/module/runUpdateProcess.d.ts +0 -49
- package/lib/typescript/module/runUpdateProcess.d.ts.map +0 -1
- package/src/runUpdateProcess.ts +0 -80
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_reactNative","require","_default","exports","default","TurboModuleRegistry","getEnforcing"],"sourceRoot":"../../../src","sources":["specs/NativeHotUpdater.ts"],"mappings":";;;;;;AACA,IAAAA,YAAA,GAAAC,OAAA;AAAmD,IAAAC,QAAA,GAAAC,OAAA,CAAAC,OAAA,
|
|
1
|
+
{"version":3,"names":["_reactNative","require","_default","exports","default","TurboModuleRegistry","getEnforcing"],"sourceRoot":"../../../src","sources":["specs/NativeHotUpdater.ts"],"mappings":";;;;;;AACA,IAAAA,YAAA,GAAAC,OAAA;AAAmD,IAAAC,QAAA,GAAAC,OAAA,CAAAC,OAAA,GAgGpCC,gCAAmB,CAACC,YAAY,CAAO,YAAY,CAAC","ignoreList":[]}
|
package/lib/commonjs/wrap.js
CHANGED
|
@@ -12,7 +12,31 @@ var _store = require("./store.js");
|
|
|
12
12
|
var _jsxRuntime = require("react/jsx-runtime");
|
|
13
13
|
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
|
|
14
14
|
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
15
|
+
/**
|
|
16
|
+
* Common options shared between auto and manual update modes
|
|
17
|
+
*/
|
|
18
|
+
|
|
15
19
|
function wrap(options) {
|
|
20
|
+
if (options.updateMode === "manual") {
|
|
21
|
+
return WrappedComponent => {
|
|
22
|
+
const ManualHOC = props => {
|
|
23
|
+
(0, _react.useLayoutEffect)(() => {
|
|
24
|
+
try {
|
|
25
|
+
const result = (0, _native.notifyAppReady)();
|
|
26
|
+
options.onNotifyAppReady?.(result);
|
|
27
|
+
} catch (e) {
|
|
28
|
+
console.warn("[HotUpdater] Failed to notify app ready:", e);
|
|
29
|
+
}
|
|
30
|
+
}, []);
|
|
31
|
+
return /*#__PURE__*/(0, _jsxRuntime.jsx)(WrappedComponent, {
|
|
32
|
+
...props
|
|
33
|
+
});
|
|
34
|
+
};
|
|
35
|
+
return ManualHOC;
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// updateMode: "auto"
|
|
16
40
|
const {
|
|
17
41
|
reloadOnForceUpdate = true,
|
|
18
42
|
...restOptions
|
|
@@ -26,8 +50,10 @@ function wrap(options) {
|
|
|
26
50
|
try {
|
|
27
51
|
setUpdateStatus("CHECK_FOR_UPDATE");
|
|
28
52
|
const updateInfo = await (0, _checkForUpdate.checkForUpdate)({
|
|
29
|
-
|
|
53
|
+
baseURL: restOptions.baseURL,
|
|
54
|
+
updateStrategy: restOptions.updateStrategy,
|
|
30
55
|
requestHeaders: restOptions.requestHeaders,
|
|
56
|
+
requestTimeout: restOptions.requestTimeout,
|
|
31
57
|
onError: restOptions.onError
|
|
32
58
|
});
|
|
33
59
|
setMessage(updateInfo?.message ?? null);
|
|
@@ -78,6 +104,18 @@ function wrap(options) {
|
|
|
78
104
|
(0, _react.useEffect)(() => {
|
|
79
105
|
restOptions.onProgress?.(progress);
|
|
80
106
|
}, [progress]);
|
|
107
|
+
|
|
108
|
+
// Notify native side that app is ready (JS bundle fully loaded)
|
|
109
|
+
(0, _react.useLayoutEffect)(() => {
|
|
110
|
+
try {
|
|
111
|
+
const result = (0, _native.notifyAppReady)();
|
|
112
|
+
restOptions.onNotifyAppReady?.(result);
|
|
113
|
+
} catch (e) {
|
|
114
|
+
console.warn("[HotUpdater] Failed to notify app ready:", e);
|
|
115
|
+
}
|
|
116
|
+
}, []);
|
|
117
|
+
|
|
118
|
+
// Start update check
|
|
81
119
|
(0, _react.useLayoutEffect)(() => {
|
|
82
120
|
initHotUpdater();
|
|
83
121
|
}, []);
|
package/lib/commonjs/wrap.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_react","_interopRequireWildcard","require","_checkForUpdate","_useEventCallback","_native","_store","_jsxRuntime","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","hasOwnProperty","call","i","set","wrap","options","
|
|
1
|
+
{"version":3,"names":["_react","_interopRequireWildcard","require","_checkForUpdate","_useEventCallback","_native","_store","_jsxRuntime","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","hasOwnProperty","call","i","set","wrap","options","updateMode","WrappedComponent","ManualHOC","props","useLayoutEffect","result","nativeNotifyAppReady","onNotifyAppReady","console","warn","jsx","reloadOnForceUpdate","restOptions","HotUpdaterHOC","progress","useHotUpdaterStore","state","message","setMessage","useState","updateStatus","setUpdateStatus","initHotUpdater","useEventCallback","updateInfo","checkForUpdate","baseURL","updateStrategy","requestHeaders","requestTimeout","onError","onUpdateProcessCompleted","status","shouldForceUpdate","id","getBundleId","updateBundle","catch","error","isSuccess","Error","reload","useEffect","onProgress","fallbackComponent","Fallback"],"sourceRoot":"../../src","sources":["wrap.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -4,6 +4,25 @@ import { Platform } from "react-native";
|
|
|
4
4
|
import { HotUpdaterError } from "./error.js";
|
|
5
5
|
import { fetchUpdateInfo } from "./fetchUpdateInfo.js";
|
|
6
6
|
import { getAppVersion, getBundleId, getChannel, getFingerprintHash, getMinBundleId, updateBundle } from "./native.js";
|
|
7
|
+
|
|
8
|
+
// Internal type that includes baseURL for use within index.ts
|
|
9
|
+
|
|
10
|
+
// Internal function to build update URL (not exported)
|
|
11
|
+
function buildUpdateUrl(baseURL, updateStrategy, params) {
|
|
12
|
+
switch (updateStrategy) {
|
|
13
|
+
case "fingerprint":
|
|
14
|
+
{
|
|
15
|
+
if (!params.fingerprintHash) {
|
|
16
|
+
throw new HotUpdaterError("Fingerprint hash is required");
|
|
17
|
+
}
|
|
18
|
+
return `${baseURL}/fingerprint/${params.platform}/${params.fingerprintHash}/${params.channel}/${params.minBundleId}/${params.bundleId}`;
|
|
19
|
+
}
|
|
20
|
+
case "appVersion":
|
|
21
|
+
{
|
|
22
|
+
return `${baseURL}/app-version/${params.platform}/${params.appVersion}/${params.channel}/${params.minBundleId}/${params.bundleId}`;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
7
26
|
export async function checkForUpdate(options) {
|
|
8
27
|
if (__DEV__) {
|
|
9
28
|
return null;
|
|
@@ -12,6 +31,10 @@ export async function checkForUpdate(options) {
|
|
|
12
31
|
options.onError?.(new HotUpdaterError("HotUpdater is only supported on iOS and Android"));
|
|
13
32
|
return null;
|
|
14
33
|
}
|
|
34
|
+
if (!options.baseURL || !options.updateStrategy) {
|
|
35
|
+
options.onError?.(new HotUpdaterError("'baseURL' and 'updateStrategy' are required"));
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
15
38
|
const currentAppVersion = getAppVersion();
|
|
16
39
|
const platform = Platform.OS;
|
|
17
40
|
const currentBundleId = getBundleId();
|
|
@@ -22,16 +45,16 @@ export async function checkForUpdate(options) {
|
|
|
22
45
|
return null;
|
|
23
46
|
}
|
|
24
47
|
const fingerprintHash = getFingerprintHash();
|
|
48
|
+
const url = buildUpdateUrl(options.baseURL, options.updateStrategy, {
|
|
49
|
+
platform,
|
|
50
|
+
appVersion: currentAppVersion,
|
|
51
|
+
fingerprintHash: fingerprintHash ?? null,
|
|
52
|
+
channel,
|
|
53
|
+
minBundleId,
|
|
54
|
+
bundleId: currentBundleId
|
|
55
|
+
});
|
|
25
56
|
return fetchUpdateInfo({
|
|
26
|
-
|
|
27
|
-
params: {
|
|
28
|
-
bundleId: currentBundleId,
|
|
29
|
-
appVersion: currentAppVersion,
|
|
30
|
-
platform,
|
|
31
|
-
minBundleId,
|
|
32
|
-
channel,
|
|
33
|
-
fingerprintHash
|
|
34
|
-
},
|
|
57
|
+
url,
|
|
35
58
|
requestHeaders: options.requestHeaders,
|
|
36
59
|
onError: options.onError,
|
|
37
60
|
requestTimeout: options.requestTimeout
|
|
@@ -52,21 +75,4 @@ export async function checkForUpdate(options) {
|
|
|
52
75
|
};
|
|
53
76
|
});
|
|
54
77
|
}
|
|
55
|
-
export const getUpdateSource = (baseUrl, options) => params => {
|
|
56
|
-
switch (options.updateStrategy) {
|
|
57
|
-
case "fingerprint":
|
|
58
|
-
{
|
|
59
|
-
if (!params.fingerprintHash) {
|
|
60
|
-
throw new HotUpdaterError("Fingerprint hash is required");
|
|
61
|
-
}
|
|
62
|
-
return `${baseUrl}/fingerprint/${params.platform}/${params.fingerprintHash}/${params.channel}/${params.minBundleId}/${params.bundleId}`;
|
|
63
|
-
}
|
|
64
|
-
case "appVersion":
|
|
65
|
-
{
|
|
66
|
-
return `${baseUrl}/app-version/${params.platform}/${params.appVersion}/${params.channel}/${params.minBundleId}/${params.bundleId}`;
|
|
67
|
-
}
|
|
68
|
-
default:
|
|
69
|
-
return baseUrl;
|
|
70
|
-
}
|
|
71
|
-
};
|
|
72
78
|
//# sourceMappingURL=checkForUpdate.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["Platform","HotUpdaterError","fetchUpdateInfo","getAppVersion","getBundleId","getChannel","getFingerprintHash","getMinBundleId","updateBundle","
|
|
1
|
+
{"version":3,"names":["Platform","HotUpdaterError","fetchUpdateInfo","getAppVersion","getBundleId","getChannel","getFingerprintHash","getMinBundleId","updateBundle","buildUpdateUrl","baseURL","updateStrategy","params","fingerprintHash","platform","channel","minBundleId","bundleId","appVersion","checkForUpdate","options","__DEV__","includes","OS","onError","currentAppVersion","currentBundleId","url","requestHeaders","requestTimeout","then","updateInfo","id","fileUrl","fileHash","status"],"sourceRoot":"../../src","sources":["checkForUpdate.ts"],"mappings":"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","ignoreList":[]}
|
package/lib/module/error.js
CHANGED
|
@@ -1,5 +1,50 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
+
/**
|
|
4
|
+
* Hot Updater Error Codes
|
|
5
|
+
*
|
|
6
|
+
* This file defines all possible error codes that can be thrown by the native
|
|
7
|
+
* updateBundle function. These error codes are shared across iOS and Android
|
|
8
|
+
* implementations to ensure consistent error handling.
|
|
9
|
+
*
|
|
10
|
+
* Error Classification:
|
|
11
|
+
* - Parameter Validation: Invalid or missing function parameters
|
|
12
|
+
* - Bundle Storage: Errors during download, extraction, and storage
|
|
13
|
+
* - Signature Verification: Cryptographic verification failures (collapsed to a single public code)
|
|
14
|
+
* - Internal: Platform-specific or unexpected errors
|
|
15
|
+
*
|
|
16
|
+
* Retryability:
|
|
17
|
+
* - Retryable: DOWNLOAD_FAILED, INCOMPLETE_DOWNLOAD
|
|
18
|
+
* - Non-retryable: Most validation and verification errors
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
export let HotUpdaterErrorCode = /*#__PURE__*/function (HotUpdaterErrorCode) {
|
|
22
|
+
HotUpdaterErrorCode["MISSING_BUNDLE_ID"] = "MISSING_BUNDLE_ID";
|
|
23
|
+
HotUpdaterErrorCode["INVALID_FILE_URL"] = "INVALID_FILE_URL";
|
|
24
|
+
HotUpdaterErrorCode["DIRECTORY_CREATION_FAILED"] = "DIRECTORY_CREATION_FAILED";
|
|
25
|
+
HotUpdaterErrorCode["DOWNLOAD_FAILED"] = "DOWNLOAD_FAILED";
|
|
26
|
+
HotUpdaterErrorCode["INCOMPLETE_DOWNLOAD"] = "INCOMPLETE_DOWNLOAD";
|
|
27
|
+
HotUpdaterErrorCode["EXTRACTION_FORMAT_ERROR"] = "EXTRACTION_FORMAT_ERROR";
|
|
28
|
+
HotUpdaterErrorCode["INVALID_BUNDLE"] = "INVALID_BUNDLE";
|
|
29
|
+
HotUpdaterErrorCode["INSUFFICIENT_DISK_SPACE"] = "INSUFFICIENT_DISK_SPACE";
|
|
30
|
+
HotUpdaterErrorCode["SIGNATURE_VERIFICATION_FAILED"] = "SIGNATURE_VERIFICATION_FAILED";
|
|
31
|
+
HotUpdaterErrorCode["MOVE_OPERATION_FAILED"] = "MOVE_OPERATION_FAILED";
|
|
32
|
+
HotUpdaterErrorCode["BUNDLE_IN_CRASHED_HISTORY"] = "BUNDLE_IN_CRASHED_HISTORY";
|
|
33
|
+
HotUpdaterErrorCode["SELF_DEALLOCATED"] = "SELF_DEALLOCATED";
|
|
34
|
+
HotUpdaterErrorCode["UNKNOWN_ERROR"] = "UNKNOWN_ERROR";
|
|
35
|
+
return HotUpdaterErrorCode;
|
|
36
|
+
}({});
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Type guard to check if an error is a HotUpdaterError
|
|
40
|
+
*/
|
|
41
|
+
export function isHotUpdaterError(error) {
|
|
42
|
+
return typeof error === "object" && error !== null && "code" in error && typeof error.code === "string" && Object.values(HotUpdaterErrorCode).includes(error.code);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Base error class for Hot Updater
|
|
47
|
+
*/
|
|
3
48
|
export class HotUpdaterError extends Error {
|
|
4
49
|
constructor(message) {
|
|
5
50
|
super(message);
|
package/lib/module/error.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["HotUpdaterError","Error","constructor","message","name"],"sourceRoot":"../../src","sources":["error.ts"],"mappings":";;AAAA,OAAO,
|
|
1
|
+
{"version":3,"names":["HotUpdaterErrorCode","isHotUpdaterError","error","code","Object","values","includes","HotUpdaterError","Error","constructor","message","name"],"sourceRoot":"../../src","sources":["error.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,WAAYA,mBAAmB,0BAAnBA,mBAAmB;EAAnBA,mBAAmB;EAAnBA,mBAAmB;EAAnBA,mBAAmB;EAAnBA,mBAAmB;EAAnBA,mBAAmB;EAAnBA,mBAAmB;EAAnBA,mBAAmB;EAAnBA,mBAAmB;EAAnBA,mBAAmB;EAAnBA,mBAAmB;EAAnBA,mBAAmB;EAAnBA,mBAAmB;EAAnBA,mBAAmB;EAAA,OAAnBA,mBAAmB;AAAA;;AAmH/B;AACA;AACA;AACA,OAAO,SAASC,iBAAiBA,CAC/BC,KAAc,EAC2C;EACzD,OACE,OAAOA,KAAK,KAAK,QAAQ,IACzBA,KAAK,KAAK,IAAI,IACd,MAAM,IAAIA,KAAK,IACf,OAAOA,KAAK,CAACC,IAAI,KAAK,QAAQ,IAC9BC,MAAM,CAACC,MAAM,CAACL,mBAAmB,CAAC,CAACM,QAAQ,CACzCJ,KAAK,CAACC,IACR,CAAC;AAEL;;AAEA;AACA;AACA;AACA,OAAO,MAAMI,eAAe,SAASC,KAAK,CAAC;EACzCC,WAAWA,CAACC,OAAe,EAAE;IAC3B,KAAK,CAACA,OAAO,CAAC;IACd,IAAI,CAACC,IAAI,GAAG,iBAAiB;EAC/B;AACF","ignoreList":[]}
|
|
@@ -1,59 +1,21 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
function buildRequestHeaders(params, requestHeaders) {
|
|
4
|
-
const updateStrategy = params.fingerprintHash ? "fingerprint" : "appVersion";
|
|
5
|
-
return {
|
|
6
|
-
"Content-Type": "application/json",
|
|
7
|
-
"x-app-platform": params.platform,
|
|
8
|
-
"x-bundle-id": params.bundleId,
|
|
9
|
-
...(updateStrategy === "fingerprint" ? {
|
|
10
|
-
"x-fingerprint-hash": params.fingerprintHash
|
|
11
|
-
} : {
|
|
12
|
-
"x-app-version": params.appVersion
|
|
13
|
-
}),
|
|
14
|
-
...(params.minBundleId && {
|
|
15
|
-
"x-min-bundle-id": params.minBundleId
|
|
16
|
-
}),
|
|
17
|
-
...(params.channel && {
|
|
18
|
-
"x-channel": params.channel
|
|
19
|
-
}),
|
|
20
|
-
...requestHeaders
|
|
21
|
-
};
|
|
22
|
-
}
|
|
23
|
-
async function resolveSource(source, params) {
|
|
24
|
-
if (typeof source !== "function") {
|
|
25
|
-
return {
|
|
26
|
-
url: source
|
|
27
|
-
};
|
|
28
|
-
}
|
|
29
|
-
const result = source(params);
|
|
30
|
-
if (typeof result === "string") {
|
|
31
|
-
return {
|
|
32
|
-
url: result
|
|
33
|
-
};
|
|
34
|
-
}
|
|
35
|
-
return {
|
|
36
|
-
info: await result
|
|
37
|
-
};
|
|
38
|
-
}
|
|
39
3
|
export const fetchUpdateInfo = async ({
|
|
40
|
-
|
|
41
|
-
params,
|
|
4
|
+
url,
|
|
42
5
|
requestHeaders,
|
|
43
6
|
onError,
|
|
44
7
|
requestTimeout = 5000
|
|
45
8
|
}) => {
|
|
46
9
|
try {
|
|
47
|
-
const resolvedSource = await resolveSource(source, params);
|
|
48
|
-
if ("info" in resolvedSource) {
|
|
49
|
-
return resolvedSource.info;
|
|
50
|
-
}
|
|
51
10
|
const controller = new AbortController();
|
|
52
11
|
const timeoutId = setTimeout(() => {
|
|
53
12
|
controller.abort();
|
|
54
13
|
}, requestTimeout);
|
|
55
|
-
const headers =
|
|
56
|
-
|
|
14
|
+
const headers = {
|
|
15
|
+
"Content-Type": "application/json",
|
|
16
|
+
...requestHeaders
|
|
17
|
+
};
|
|
18
|
+
const response = await fetch(url, {
|
|
57
19
|
signal: controller.signal,
|
|
58
20
|
headers
|
|
59
21
|
});
|
|
@@ -63,7 +25,7 @@ export const fetchUpdateInfo = async ({
|
|
|
63
25
|
}
|
|
64
26
|
return response.json();
|
|
65
27
|
} catch (error) {
|
|
66
|
-
if (error.name === "AbortError") {
|
|
28
|
+
if (error instanceof Error && error.name === "AbortError") {
|
|
67
29
|
onError?.(new Error("Request timed out"));
|
|
68
30
|
} else {
|
|
69
31
|
onError?.(error);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["
|
|
1
|
+
{"version":3,"names":["fetchUpdateInfo","url","requestHeaders","onError","requestTimeout","controller","AbortController","timeoutId","setTimeout","abort","headers","response","fetch","signal","clearTimeout","status","Error","statusText","json","error","name"],"sourceRoot":"../../src","sources":["fetchUpdateInfo.ts"],"mappings":";;AAEA,OAAO,MAAMA,eAAe,GAAG,MAAAA,CAAO;EACpCC,GAAG;EACHC,cAAc;EACdC,OAAO;EACPC,cAAc,GAAG;AAMnB,CAAC,KAAoC;EACnC,IAAI;IACF,MAAMC,UAAU,GAAG,IAAIC,eAAe,CAAC,CAAC;IACxC,MAAMC,SAAS,GAAGC,UAAU,CAAC,MAAM;MACjCH,UAAU,CAACI,KAAK,CAAC,CAAC;IACpB,CAAC,EAAEL,cAAc,CAAC;IAElB,MAAMM,OAAO,GAAG;MACd,cAAc,EAAE,kBAAkB;MAClC,GAAGR;IACL,CAAC;IAED,MAAMS,QAAQ,GAAG,MAAMC,KAAK,CAACX,GAAG,EAAE;MAChCY,MAAM,EAAER,UAAU,CAACQ,MAAM;MACzBH;IACF,CAAC,CAAC;IACFI,YAAY,CAACP,SAAS,CAAC;IAEvB,IAAII,QAAQ,CAACI,MAAM,KAAK,GAAG,EAAE;MAC3B,MAAM,IAAIC,KAAK,CAACL,QAAQ,CAACM,UAAU,CAAC;IACtC;IACA,OAAON,QAAQ,CAACO,IAAI,CAAC,CAAC;EACxB,CAAC,CAAC,OAAOC,KAAc,EAAE;IACvB,IAAIA,KAAK,YAAYH,KAAK,IAAIG,KAAK,CAACC,IAAI,KAAK,YAAY,EAAE;MACzDjB,OAAO,GAAG,IAAIa,KAAK,CAAC,mBAAmB,CAAC,CAAC;IAC3C,CAAC,MAAM;MACLb,OAAO,GAAGgB,KAAc,CAAC;IAC3B;IACA,OAAO,IAAI;EACb;AACF,CAAC","ignoreList":[]}
|