@hot-updater/react-native 0.23.1 → 0.24.1
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/DefaultResolver.js +38 -0
- package/lib/commonjs/DefaultResolver.js.map +1 -0
- package/lib/commonjs/checkForUpdate.js +33 -45
- 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 +249 -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/types.js +12 -0
- package/lib/commonjs/types.js.map +1 -1
- package/lib/commonjs/wrap.js +70 -1
- package/lib/commonjs/wrap.js.map +1 -1
- package/lib/module/DefaultResolver.js +34 -0
- package/lib/module/DefaultResolver.js.map +1 -0
- package/lib/module/checkForUpdate.js +34 -43
- 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 +250 -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/types.js +12 -0
- package/lib/module/types.js.map +1 -1
- package/lib/module/wrap.js +71 -2
- package/lib/module/wrap.js.map +1 -1
- package/lib/typescript/commonjs/DefaultResolver.d.ts +10 -0
- package/lib/typescript/commonjs/DefaultResolver.d.ts.map +1 -0
- package/lib/typescript/commonjs/checkForUpdate.d.ts +12 -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 +38 -44
- 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/types.d.ts +115 -0
- package/lib/typescript/commonjs/types.d.ts.map +1 -1
- package/lib/typescript/commonjs/wrap.d.ts +132 -7
- package/lib/typescript/commonjs/wrap.d.ts.map +1 -1
- package/lib/typescript/module/DefaultResolver.d.ts +10 -0
- package/lib/typescript/module/DefaultResolver.d.ts.map +1 -0
- package/lib/typescript/module/checkForUpdate.d.ts +12 -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 +38 -44
- 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/types.d.ts +115 -0
- package/lib/typescript/module/types.d.ts.map +1 -1
- package/lib/typescript/module/wrap.d.ts +132 -7
- package/lib/typescript/module/wrap.d.ts.map +1 -1
- package/package.json +6 -6
- package/plugin/build/withHotUpdater.js +3 -3
- package/src/DefaultResolver.ts +36 -0
- package/src/checkForUpdate.ts +51 -56
- package/src/error.ts +153 -0
- package/src/fetchUpdateInfo.ts +10 -58
- package/src/index.ts +315 -206
- package/src/native.ts +88 -2
- package/src/specs/NativeHotUpdater.ts +63 -0
- package/src/types.ts +135 -0
- package/src/wrap.tsx +245 -34
- 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
package/lib/commonjs/native.js
CHANGED
|
@@ -3,9 +3,24 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.
|
|
6
|
+
exports.HotUpdaterConstants = void 0;
|
|
7
|
+
Object.defineProperty(exports, "HotUpdaterErrorCode", {
|
|
8
|
+
enumerable: true,
|
|
9
|
+
get: function () {
|
|
10
|
+
return _error.HotUpdaterErrorCode;
|
|
11
|
+
}
|
|
12
|
+
});
|
|
13
|
+
exports.getMinBundleId = exports.getFingerprintHash = exports.getCrashHistory = exports.getChannel = exports.getBundleId = exports.getAppVersion = exports.clearCrashHistory = exports.addListener = void 0;
|
|
14
|
+
Object.defineProperty(exports, "isHotUpdaterError", {
|
|
15
|
+
enumerable: true,
|
|
16
|
+
get: function () {
|
|
17
|
+
return _error.isHotUpdaterError;
|
|
18
|
+
}
|
|
19
|
+
});
|
|
20
|
+
exports.reload = exports.notifyAppReady = void 0;
|
|
7
21
|
exports.updateBundle = updateBundle;
|
|
8
22
|
var _reactNative = require("react-native");
|
|
23
|
+
var _error = require("./error.js");
|
|
9
24
|
var _NativeHotUpdater = _interopRequireDefault(require("./specs/NativeHotUpdater.js"));
|
|
10
25
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
11
26
|
const NIL_UUID = "00000000-0000-0000-0000-000000000000";
|
|
@@ -29,7 +44,8 @@ let lastInstalledBundleId = null;
|
|
|
29
44
|
* Downloads files and applies them to the app.
|
|
30
45
|
*
|
|
31
46
|
* @param {UpdateParams} params - Parameters object required for bundle update
|
|
32
|
-
* @returns {Promise<boolean>} Resolves with true if download was successful
|
|
47
|
+
* @returns {Promise<boolean>} Resolves with true if download was successful
|
|
48
|
+
* @throws {Error} Rejects with error.code from HotUpdaterErrorCode enum and error.message
|
|
33
49
|
*/
|
|
34
50
|
|
|
35
51
|
/**
|
|
@@ -107,7 +123,7 @@ const getMinBundleId = () => {
|
|
|
107
123
|
* Fetches the current bundle version id.
|
|
108
124
|
*
|
|
109
125
|
* @async
|
|
110
|
-
* @returns {
|
|
126
|
+
* @returns {string} Resolves with the current version id or null if not available.
|
|
111
127
|
*/
|
|
112
128
|
exports.getMinBundleId = getMinBundleId;
|
|
113
129
|
const getBundleId = () => {
|
|
@@ -135,5 +151,89 @@ const getFingerprintHash = () => {
|
|
|
135
151
|
const constants = _NativeHotUpdater.default.getConstants();
|
|
136
152
|
return constants.FINGERPRINT_HASH;
|
|
137
153
|
};
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* Result returned by notifyAppReady()
|
|
157
|
+
*/
|
|
138
158
|
exports.getFingerprintHash = getFingerprintHash;
|
|
159
|
+
/**
|
|
160
|
+
* Notifies the native side that the app has successfully started with the current bundle.
|
|
161
|
+
* If the bundle matches the staging bundle, it promotes to stable.
|
|
162
|
+
*
|
|
163
|
+
* This function is called automatically when the module loads.
|
|
164
|
+
*
|
|
165
|
+
* @returns {NotifyAppReadyResult} Bundle state information
|
|
166
|
+
* - `status: "PROMOTED"` - Staging bundle was promoted to stable (ACTIVE event)
|
|
167
|
+
* - `status: "RECOVERED"` - App recovered from crash, rollback occurred (ROLLBACK event)
|
|
168
|
+
* - `status: "STABLE"` - No changes, already stable
|
|
169
|
+
* - `crashedBundleId` - Present only when status is "RECOVERED"
|
|
170
|
+
*
|
|
171
|
+
* @example
|
|
172
|
+
* ```ts
|
|
173
|
+
* const result = HotUpdater.notifyAppReady();
|
|
174
|
+
*
|
|
175
|
+
* switch (result.status) {
|
|
176
|
+
* case "PROMOTED":
|
|
177
|
+
* // Send ACTIVE analytics event
|
|
178
|
+
* analytics.track('bundle_active', { bundleId: HotUpdater.getBundleId() });
|
|
179
|
+
* break;
|
|
180
|
+
* case "RECOVERED":
|
|
181
|
+
* // Send ROLLBACK analytics event
|
|
182
|
+
* analytics.track('bundle_rollback', { crashedBundleId: result.crashedBundleId });
|
|
183
|
+
* break;
|
|
184
|
+
* case "STABLE":
|
|
185
|
+
* // No special action needed
|
|
186
|
+
* break;
|
|
187
|
+
* }
|
|
188
|
+
* ```
|
|
189
|
+
*/
|
|
190
|
+
const notifyAppReady = () => {
|
|
191
|
+
const bundleId = getBundleId();
|
|
192
|
+
const result = _NativeHotUpdater.default.notifyAppReady({
|
|
193
|
+
bundleId
|
|
194
|
+
});
|
|
195
|
+
// Oldarch returns JSON string, newarch returns array
|
|
196
|
+
if (typeof result === "string") {
|
|
197
|
+
try {
|
|
198
|
+
return JSON.parse(result);
|
|
199
|
+
} catch {
|
|
200
|
+
return {
|
|
201
|
+
status: "STABLE"
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
return result;
|
|
206
|
+
};
|
|
207
|
+
|
|
208
|
+
/**
|
|
209
|
+
* Gets the list of bundle IDs that have been marked as crashed.
|
|
210
|
+
* These bundles will be rejected if attempted to install again.
|
|
211
|
+
*
|
|
212
|
+
* @returns {string[]} Array of crashed bundle IDs
|
|
213
|
+
*/
|
|
214
|
+
exports.notifyAppReady = notifyAppReady;
|
|
215
|
+
const getCrashHistory = () => {
|
|
216
|
+
const result = _NativeHotUpdater.default.getCrashHistory();
|
|
217
|
+
// Oldarch returns JSON string, newarch returns array
|
|
218
|
+
if (typeof result === "string") {
|
|
219
|
+
try {
|
|
220
|
+
return JSON.parse(result);
|
|
221
|
+
} catch {
|
|
222
|
+
return [];
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
return result;
|
|
226
|
+
};
|
|
227
|
+
|
|
228
|
+
/**
|
|
229
|
+
* Clears the crashed bundle history, allowing previously crashed bundles
|
|
230
|
+
* to be installed again.
|
|
231
|
+
*
|
|
232
|
+
* @returns {boolean} true if clearing was successful
|
|
233
|
+
*/
|
|
234
|
+
exports.getCrashHistory = getCrashHistory;
|
|
235
|
+
const clearCrashHistory = () => {
|
|
236
|
+
return _NativeHotUpdater.default.clearCrashHistory();
|
|
237
|
+
};
|
|
238
|
+
exports.clearCrashHistory = clearCrashHistory;
|
|
139
239
|
//# sourceMappingURL=native.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_reactNative","require","_NativeHotUpdater","_interopRequireDefault","e","__esModule","default","NIL_UUID","HotUpdaterConstants","exports","HOT_UPDATER_BUNDLE_ID","__HOT_UPDATER_BUNDLE_ID","addListener","eventName","listener","eventEmitter","NativeEventEmitter","HotUpdaterNative","subscription","remove","inflightUpdates","Map","lastInstalledBundleId","updateBundle","paramsOrBundleId","fileUrl","updateBundleId","bundleId","status","currentBundleId","getBundleId","localeCompare","Error","existing","get","targetFileUrl","targetFileHash","undefined","fileHash","promise","ok","delete","set","getAppVersion","constants","getConstants","APP_VERSION","reload","getMinBundleId","MIN_BUNDLE_ID","getChannel","CHANNEL","getFingerprintHash","FINGERPRINT_HASH"],"sourceRoot":"../../src","sources":["native.ts"],"mappings":"
|
|
1
|
+
{"version":3,"names":["_reactNative","require","_error","_NativeHotUpdater","_interopRequireDefault","e","__esModule","default","NIL_UUID","HotUpdaterConstants","exports","HOT_UPDATER_BUNDLE_ID","__HOT_UPDATER_BUNDLE_ID","addListener","eventName","listener","eventEmitter","NativeEventEmitter","HotUpdaterNative","subscription","remove","inflightUpdates","Map","lastInstalledBundleId","updateBundle","paramsOrBundleId","fileUrl","updateBundleId","bundleId","status","currentBundleId","getBundleId","localeCompare","Error","existing","get","targetFileUrl","targetFileHash","undefined","fileHash","promise","ok","delete","set","getAppVersion","constants","getConstants","APP_VERSION","reload","getMinBundleId","MIN_BUNDLE_ID","getChannel","CHANNEL","getFingerprintHash","FINGERPRINT_HASH","notifyAppReady","result","JSON","parse","getCrashHistory","clearCrashHistory"],"sourceRoot":"../../src","sources":["native.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -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/types.js
CHANGED
|
@@ -5,6 +5,18 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports.extractSignatureFailure = extractSignatureFailure;
|
|
7
7
|
exports.isSignatureVerificationError = isSignatureVerificationError;
|
|
8
|
+
/**
|
|
9
|
+
* Parameters passed to resolver.checkUpdate method
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Parameters passed to resolver.notifyAppReady method
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Resolver interface for custom network operations
|
|
18
|
+
*/
|
|
19
|
+
|
|
8
20
|
/**
|
|
9
21
|
* Information about a signature verification failure.
|
|
10
22
|
* This is a security-critical event that indicates the bundle
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["isSignatureVerificationError","error","Error","message","toLowerCase","includes","extractSignatureFailure","bundleId","normalizedError","String"],"sourceRoot":"../../src","sources":["types.ts"],"mappings":";;;;;;;
|
|
1
|
+
{"version":3,"names":["isSignatureVerificationError","error","Error","message","toLowerCase","includes","extractSignatureFailure","bundleId","normalizedError","String"],"sourceRoot":"../../src","sources":["types.ts"],"mappings":";;;;;;;AAGA;AACA;AACA;;AAgDA;AACA;AACA;;AA0BA;AACA;AACA;;AAoDA;AACA;AACA;AACA;AACA;;AAgBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASA,4BAA4BA,CAACC,KAAc,EAAW;EACpE,IAAI,EAAEA,KAAK,YAAYC,KAAK,CAAC,EAAE;IAC7B,OAAO,KAAK;EACd;EAEA,MAAMC,OAAO,GAAGF,KAAK,CAACE,OAAO,CAACC,WAAW,CAAC,CAAC;;EAE3C;EACA;EACA,OACED,OAAO,CAACE,QAAQ,CAAC,wBAAwB,CAAC,IAC1CF,OAAO,CAACE,QAAQ,CAAC,2BAA2B,CAAC,IAC7CF,OAAO,CAACE,QAAQ,CAAC,8BAA8B,CAAC,IAChDF,OAAO,CAACE,QAAQ,CAAC,6BAA6B,CAAC,IAC/CF,OAAO,CAACE,QAAQ,CAAC,qCAAqC,CAAC;AAE3D;;AAEA;AACA;AACA;AACO,SAASC,uBAAuBA,CACrCL,KAAc,EACdM,QAAgB,EACc;EAC9B,MAAMC,eAAe,GACnBP,KAAK,YAAYC,KAAK,GAAGD,KAAK,GAAG,IAAIC,KAAK,CAACO,MAAM,CAACR,KAAK,CAAC,CAAC;EAE3D,OAAO;IACLM,QAAQ;IACRJ,OAAO,EAAEK,eAAe,CAACL,OAAO;IAChCF,KAAK,EAAEO;EACT,CAAC;AACH","ignoreList":[]}
|
package/lib/commonjs/wrap.js
CHANGED
|
@@ -12,7 +12,67 @@ 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
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Configuration with baseURL for standard server-based updates
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Configuration with resolver for custom network operations
|
|
25
|
+
*/
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Union type ensuring baseURL and resolver are mutually exclusive
|
|
29
|
+
*/
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Internal options after normalization in index.ts
|
|
33
|
+
* Always has resolver (never baseURL)
|
|
34
|
+
*/
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Helper function to handle notifyAppReady flow
|
|
38
|
+
*/
|
|
39
|
+
const handleNotifyAppReady = async options => {
|
|
40
|
+
try {
|
|
41
|
+
// Always call native notifyAppReady for bundle promotion
|
|
42
|
+
const nativeResult = (0, _native.notifyAppReady)();
|
|
43
|
+
|
|
44
|
+
// If resolver.notifyAppReady exists, call it with simplified params
|
|
45
|
+
if (options.resolver?.notifyAppReady) {
|
|
46
|
+
await options.resolver.notifyAppReady({
|
|
47
|
+
status: nativeResult.status,
|
|
48
|
+
crashedBundleId: nativeResult.crashedBundleId,
|
|
49
|
+
requestHeaders: options.requestHeaders,
|
|
50
|
+
requestTimeout: options.requestTimeout
|
|
51
|
+
}).catch(e => {
|
|
52
|
+
console.warn("[HotUpdater] Resolver notifyAppReady failed:", e);
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
options.onNotifyAppReady?.(nativeResult);
|
|
56
|
+
} catch (e) {
|
|
57
|
+
console.warn("[HotUpdater] Failed to notify app ready:", e);
|
|
58
|
+
}
|
|
59
|
+
};
|
|
15
60
|
function wrap(options) {
|
|
61
|
+
if (options.updateMode === "manual") {
|
|
62
|
+
return WrappedComponent => {
|
|
63
|
+
const ManualHOC = props => {
|
|
64
|
+
(0, _react.useLayoutEffect)(() => {
|
|
65
|
+
void handleNotifyAppReady(options);
|
|
66
|
+
}, []);
|
|
67
|
+
return /*#__PURE__*/(0, _jsxRuntime.jsx)(WrappedComponent, {
|
|
68
|
+
...props
|
|
69
|
+
});
|
|
70
|
+
};
|
|
71
|
+
return ManualHOC;
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// updateMode: "auto"
|
|
16
76
|
const {
|
|
17
77
|
reloadOnForceUpdate = true,
|
|
18
78
|
...restOptions
|
|
@@ -26,8 +86,10 @@ function wrap(options) {
|
|
|
26
86
|
try {
|
|
27
87
|
setUpdateStatus("CHECK_FOR_UPDATE");
|
|
28
88
|
const updateInfo = await (0, _checkForUpdate.checkForUpdate)({
|
|
29
|
-
|
|
89
|
+
resolver: restOptions.resolver,
|
|
90
|
+
updateStrategy: restOptions.updateStrategy,
|
|
30
91
|
requestHeaders: restOptions.requestHeaders,
|
|
92
|
+
requestTimeout: restOptions.requestTimeout,
|
|
31
93
|
onError: restOptions.onError
|
|
32
94
|
});
|
|
33
95
|
setMessage(updateInfo?.message ?? null);
|
|
@@ -78,6 +140,13 @@ function wrap(options) {
|
|
|
78
140
|
(0, _react.useEffect)(() => {
|
|
79
141
|
restOptions.onProgress?.(progress);
|
|
80
142
|
}, [progress]);
|
|
143
|
+
|
|
144
|
+
// Notify native side that app is ready (JS bundle fully loaded)
|
|
145
|
+
(0, _react.useLayoutEffect)(() => {
|
|
146
|
+
void handleNotifyAppReady(restOptions);
|
|
147
|
+
}, []);
|
|
148
|
+
|
|
149
|
+
// Start update check
|
|
81
150
|
(0, _react.useLayoutEffect)(() => {
|
|
82
151
|
initHotUpdater();
|
|
83
152
|
}, []);
|
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","
|
|
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","handleNotifyAppReady","options","nativeResult","nativeNotifyAppReady","resolver","notifyAppReady","status","crashedBundleId","requestHeaders","requestTimeout","catch","console","warn","onNotifyAppReady","wrap","updateMode","WrappedComponent","ManualHOC","props","useLayoutEffect","jsx","reloadOnForceUpdate","restOptions","HotUpdaterHOC","progress","useHotUpdaterStore","state","message","setMessage","useState","updateStatus","setUpdateStatus","initHotUpdater","useEventCallback","updateInfo","checkForUpdate","updateStrategy","onError","onUpdateProcessCompleted","shouldForceUpdate","id","getBundleId","updateBundle","error","isSuccess","Error","reload","useEffect","onProgress","fallbackComponent","Fallback"],"sourceRoot":"../../src","sources":["wrap.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { fetchUpdateInfo } from "./fetchUpdateInfo.js";
|
|
4
|
+
/**
|
|
5
|
+
* Creates a default resolver that uses baseURL for network operations.
|
|
6
|
+
* This encapsulates the existing baseURL logic into a resolver.
|
|
7
|
+
*
|
|
8
|
+
* @param baseURL - The base URL for the update server
|
|
9
|
+
* @returns A HotUpdaterResolver that uses the baseURL
|
|
10
|
+
*/
|
|
11
|
+
export function createDefaultResolver(baseURL) {
|
|
12
|
+
return {
|
|
13
|
+
checkUpdate: async params => {
|
|
14
|
+
// Build URL based on strategy (existing buildUpdateUrl logic)
|
|
15
|
+
let url;
|
|
16
|
+
if (params.updateStrategy === "fingerprint") {
|
|
17
|
+
if (!params.fingerprintHash) {
|
|
18
|
+
throw new Error("Fingerprint hash is required");
|
|
19
|
+
}
|
|
20
|
+
url = `${baseURL}/fingerprint/${params.platform}/${params.fingerprintHash}/${params.channel}/${params.minBundleId}/${params.bundleId}`;
|
|
21
|
+
} else {
|
|
22
|
+
url = `${baseURL}/app-version/${params.platform}/${params.appVersion}/${params.channel}/${params.minBundleId}/${params.bundleId}`;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// Use existing fetchUpdateInfo
|
|
26
|
+
return fetchUpdateInfo({
|
|
27
|
+
url,
|
|
28
|
+
requestHeaders: params.requestHeaders,
|
|
29
|
+
requestTimeout: params.requestTimeout
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=DefaultResolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["fetchUpdateInfo","createDefaultResolver","baseURL","checkUpdate","params","url","updateStrategy","fingerprintHash","Error","platform","channel","minBundleId","bundleId","appVersion","requestHeaders","requestTimeout"],"sourceRoot":"../../src","sources":["DefaultResolver.ts"],"mappings":";;AACA,SAASA,eAAe,QAAQ,sBAAmB;AAGnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,qBAAqBA,CAACC,OAAe,EAAsB;EACzE,OAAO;IACLC,WAAW,EAAE,MACXC,MAAiC,IACC;MAClC;MACA,IAAIC,GAAW;MACf,IAAID,MAAM,CAACE,cAAc,KAAK,aAAa,EAAE;QAC3C,IAAI,CAACF,MAAM,CAACG,eAAe,EAAE;UAC3B,MAAM,IAAIC,KAAK,CAAC,8BAA8B,CAAC;QACjD;QACAH,GAAG,GAAG,GAAGH,OAAO,gBAAgBE,MAAM,CAACK,QAAQ,IAAIL,MAAM,CAACG,eAAe,IAAIH,MAAM,CAACM,OAAO,IAAIN,MAAM,CAACO,WAAW,IAAIP,MAAM,CAACQ,QAAQ,EAAE;MACxI,CAAC,MAAM;QACLP,GAAG,GAAG,GAAGH,OAAO,gBAAgBE,MAAM,CAACK,QAAQ,IAAIL,MAAM,CAACS,UAAU,IAAIT,MAAM,CAACM,OAAO,IAAIN,MAAM,CAACO,WAAW,IAAIP,MAAM,CAACQ,QAAQ,EAAE;MACnI;;MAEA;MACA,OAAOZ,eAAe,CAAC;QACrBK,GAAG;QACHS,cAAc,EAAEV,MAAM,CAACU,cAAc;QACrCC,cAAc,EAAEX,MAAM,CAACW;MACzB,CAAC,CAAC;IACJ;EACF,CAAC;AACH","ignoreList":[]}
|
|
@@ -2,8 +2,10 @@
|
|
|
2
2
|
|
|
3
3
|
import { Platform } from "react-native";
|
|
4
4
|
import { HotUpdaterError } from "./error.js";
|
|
5
|
-
import { fetchUpdateInfo } from "./fetchUpdateInfo.js";
|
|
6
5
|
import { getAppVersion, getBundleId, getChannel, getFingerprintHash, getMinBundleId, updateBundle } from "./native.js";
|
|
6
|
+
|
|
7
|
+
// Internal type that includes resolver for use within index.ts
|
|
8
|
+
|
|
7
9
|
export async function checkForUpdate(options) {
|
|
8
10
|
if (__DEV__) {
|
|
9
11
|
return null;
|
|
@@ -22,51 +24,40 @@ export async function checkForUpdate(options) {
|
|
|
22
24
|
return null;
|
|
23
25
|
}
|
|
24
26
|
const fingerprintHash = getFingerprintHash();
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
27
|
+
if (!options.resolver?.checkUpdate) {
|
|
28
|
+
options.onError?.(new HotUpdaterError("Resolver is required but not configured"));
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
let updateInfo = null;
|
|
32
|
+
try {
|
|
33
|
+
updateInfo = await options.resolver.checkUpdate({
|
|
30
34
|
platform,
|
|
35
|
+
appVersion: currentAppVersion,
|
|
36
|
+
bundleId: currentBundleId,
|
|
31
37
|
minBundleId,
|
|
32
38
|
channel,
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
})
|
|
39
|
-
|
|
40
|
-
|
|
39
|
+
updateStrategy: options.updateStrategy,
|
|
40
|
+
fingerprintHash,
|
|
41
|
+
requestHeaders: options.requestHeaders,
|
|
42
|
+
requestTimeout: options.requestTimeout
|
|
43
|
+
});
|
|
44
|
+
} catch (error) {
|
|
45
|
+
options.onError?.(error);
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
if (!updateInfo) {
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
return {
|
|
52
|
+
...updateInfo,
|
|
53
|
+
updateBundle: async () => {
|
|
54
|
+
return updateBundle({
|
|
55
|
+
bundleId: updateInfo.id,
|
|
56
|
+
fileUrl: updateInfo.fileUrl,
|
|
57
|
+
fileHash: updateInfo.fileHash,
|
|
58
|
+
status: updateInfo.status
|
|
59
|
+
});
|
|
41
60
|
}
|
|
42
|
-
|
|
43
|
-
...updateInfo,
|
|
44
|
-
updateBundle: async () => {
|
|
45
|
-
return updateBundle({
|
|
46
|
-
bundleId: updateInfo.id,
|
|
47
|
-
fileUrl: updateInfo.fileUrl,
|
|
48
|
-
fileHash: updateInfo.fileHash,
|
|
49
|
-
status: updateInfo.status
|
|
50
|
-
});
|
|
51
|
-
}
|
|
52
|
-
};
|
|
53
|
-
});
|
|
61
|
+
};
|
|
54
62
|
}
|
|
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
63
|
//# sourceMappingURL=checkForUpdate.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["Platform","HotUpdaterError","
|
|
1
|
+
{"version":3,"names":["Platform","HotUpdaterError","getAppVersion","getBundleId","getChannel","getFingerprintHash","getMinBundleId","updateBundle","checkForUpdate","options","__DEV__","includes","OS","onError","currentAppVersion","platform","currentBundleId","minBundleId","channel","fingerprintHash","resolver","checkUpdate","updateInfo","appVersion","bundleId","updateStrategy","requestHeaders","requestTimeout","error","id","fileUrl","fileHash","status"],"sourceRoot":"../../src","sources":["checkForUpdate.ts"],"mappings":";;AACA,SAASA,QAAQ,QAAQ,cAAc;AACvC,SAASC,eAAe,QAAQ,YAAS;AACzC,SACEC,aAAa,EACbC,WAAW,EACXC,UAAU,EACVC,kBAAkB,EAClBC,cAAc,EACdC,YAAY,QACP,aAAU;;AA6BjB;;AAKA,OAAO,eAAeC,cAAcA,CAClCC,OAAsC,EACA;EACtC,IAAIC,OAAO,EAAE;IACX,OAAO,IAAI;EACb;EAEA,IAAI,CAAC,CAAC,KAAK,EAAE,SAAS,CAAC,CAACC,QAAQ,CAACX,QAAQ,CAACY,EAAE,CAAC,EAAE;IAC7CH,OAAO,CAACI,OAAO,GACb,IAAIZ,eAAe,CAAC,iDAAiD,CACvE,CAAC;IACD,OAAO,IAAI;EACb;EAEA,MAAMa,iBAAiB,GAAGZ,aAAa,CAAC,CAAC;EACzC,MAAMa,QAAQ,GAAGf,QAAQ,CAACY,EAAuB;EACjD,MAAMI,eAAe,GAAGb,WAAW,CAAC,CAAC;EACrC,MAAMc,WAAW,GAAGX,cAAc,CAAC,CAAC;EACpC,MAAMY,OAAO,GAAGd,UAAU,CAAC,CAAC;EAE5B,IAAI,CAACU,iBAAiB,EAAE;IACtBL,OAAO,CAACI,OAAO,GAAG,IAAIZ,eAAe,CAAC,2BAA2B,CAAC,CAAC;IACnE,OAAO,IAAI;EACb;EAEA,MAAMkB,eAAe,GAAGd,kBAAkB,CAAC,CAAC;EAE5C,IAAI,CAACI,OAAO,CAACW,QAAQ,EAAEC,WAAW,EAAE;IAClCZ,OAAO,CAACI,OAAO,GACb,IAAIZ,eAAe,CAAC,yCAAyC,CAC/D,CAAC;IACD,OAAO,IAAI;EACb;EAEA,IAAIqB,UAAgC,GAAG,IAAI;EAE3C,IAAI;IACFA,UAAU,GAAG,MAAMb,OAAO,CAACW,QAAQ,CAACC,WAAW,CAAC;MAC9CN,QAAQ;MACRQ,UAAU,EAAET,iBAAiB;MAC7BU,QAAQ,EAAER,eAAe;MACzBC,WAAW;MACXC,OAAO;MACPO,cAAc,EAAEhB,OAAO,CAACgB,cAAc;MACtCN,eAAe;MACfO,cAAc,EAAEjB,OAAO,CAACiB,cAAc;MACtCC,cAAc,EAAElB,OAAO,CAACkB;IAC1B,CAAC,CAAC;EACJ,CAAC,CAAC,OAAOC,KAAK,EAAE;IACdnB,OAAO,CAACI,OAAO,GAAGe,KAAc,CAAC;IACjC,OAAO,IAAI;EACb;EAEA,IAAI,CAACN,UAAU,EAAE;IACf,OAAO,IAAI;EACb;EAEA,OAAO;IACL,GAAGA,UAAU;IACbf,YAAY,EAAE,MAAAA,CAAA,KAAY;MACxB,OAAOA,YAAY,CAAC;QAClBiB,QAAQ,EAAEF,UAAU,CAACO,EAAE;QACvBC,OAAO,EAAER,UAAU,CAACQ,OAAO;QAC3BC,QAAQ,EAAET,UAAU,CAACS,QAAQ;QAC7BC,MAAM,EAAEV,UAAU,CAACU;MACrB,CAAC,CAAC;IACJ;EACF,CAAC;AACH","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":[]}
|