@hot-updater/react-native 1.0.0-rc.4 → 1.0.0-rc.40
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/build.gradle +13 -2
- package/android/proguard-rules.pro +8 -2
- package/android/src/bridge/BridgeReactInstance.kt +38 -0
- package/android/src/bridgeless/BridgeReactInstance.kt +24 -0
- package/android/src/main/java/com/hotupdater/ActivityStartGate.kt +94 -0
- package/android/src/main/java/com/hotupdater/BuiltInAssetResolver.kt +286 -0
- package/android/src/main/java/com/hotupdater/BundleFileStorageService.kt +1064 -844
- package/android/src/main/java/com/hotupdater/BundleMetadata.kt +50 -11
- package/android/src/main/java/com/hotupdater/FileManagerService.kt +45 -0
- package/android/src/main/java/com/hotupdater/HotUpdaterException.kt +287 -22
- package/android/src/main/java/com/hotupdater/HotUpdaterImpl.kt +46 -30
- package/android/src/main/java/com/hotupdater/HotUpdaterRecoveryManager.kt +75 -192
- package/android/src/main/java/com/hotupdater/HotUpdaterRecoveryState.kt +64 -0
- package/android/src/main/java/com/hotupdater/InstallIdentityService.kt +37 -0
- package/android/src/main/java/com/hotupdater/KeyValueStorageService.kt +86 -0
- package/android/src/main/java/com/hotupdater/NetworkState.kt +31 -0
- package/android/src/main/java/com/hotupdater/NoBackupStorage.kt +17 -0
- package/android/src/main/java/com/hotupdater/OkHttpDownloadService.kt +127 -50
- package/android/src/main/java/com/hotupdater/ReactNativeValueConverters.kt +34 -0
- package/android/src/main/java/com/hotupdater/TarArchiveInputStream.kt +214 -375
- package/android/src/main/java/com/hotupdater/TarBrArchiveExtractor.kt +119 -0
- package/android/src/newarch/HotUpdater.kt +7 -9
- package/android/src/newarch/HotUpdaterModule.kt +109 -84
- package/android/src/newarch/JavaScriptExceptionHooks.kt +48 -0
- package/android/src/newarch/ReactIntegrationManager.kt +6 -32
- package/android/src/oldarch/HotUpdater.kt +7 -9
- package/android/src/oldarch/HotUpdaterModule.kt +98 -74
- package/android/src/oldarch/HotUpdaterSpec.kt +4 -6
- package/android/src/oldarch/JavaScriptExceptionHooks.kt +71 -0
- package/ios/HotUpdater/Internal/BrotliFileDecompressor.swift +167 -0
- package/ios/HotUpdater/Internal/BuiltInAssetResolver.swift +196 -0
- package/ios/HotUpdater/Internal/BundleFileStorageService.swift +1032 -1116
- package/ios/HotUpdater/Internal/BundleMetadata.swift +61 -54
- package/ios/HotUpdater/Internal/FileManagerService.swift +48 -0
- package/ios/HotUpdater/Internal/FileUtilities.swift +64 -0
- package/ios/HotUpdater/Internal/HotUpdater-Bridging-Header.h +0 -1
- package/ios/HotUpdater/Internal/HotUpdater.mm +32 -67
- package/ios/HotUpdater/Internal/HotUpdaterImpl.swift +229 -73
- package/ios/HotUpdater/Internal/KeyValueStorageService.swift +71 -0
- package/ios/HotUpdater/Internal/NotificationExtension.swift +0 -2
- package/ios/HotUpdater/Internal/TarArchiveExtractor.swift +182 -311
- package/ios/HotUpdater/Internal/URLSessionDownloadService.swift +119 -71
- package/ios/HotUpdater/Internal/UpdateFailure.swift +390 -0
- package/ios/HotUpdater/Recovery/HotUpdaterRecovery.h +16 -0
- package/ios/HotUpdater/Recovery/HotUpdaterRecovery.mm +83 -0
- package/ios/HotUpdater/Recovery/HotUpdaterRecoveryHooks.mm +49 -0
- package/lib/commonjs/appReady.js +102 -0
- package/lib/commonjs/appReady.js.map +1 -0
- package/lib/commonjs/checkForUpdate.js +120 -68
- package/lib/commonjs/checkForUpdate.js.map +1 -1
- package/lib/commonjs/clientPlugin.js +13 -0
- package/lib/commonjs/clientPlugin.js.map +1 -0
- package/lib/commonjs/error.js +4 -13
- package/lib/commonjs/error.js.map +1 -1
- package/lib/commonjs/fetchJSON.js +16 -27
- package/lib/commonjs/fetchJSON.js.map +1 -1
- package/lib/commonjs/fetchUpdateResponse.js +60 -0
- package/lib/commonjs/fetchUpdateResponse.js.map +1 -0
- package/lib/commonjs/httpClient.js +63 -94
- package/lib/commonjs/httpClient.js.map +1 -1
- package/lib/commonjs/index.js +71 -18
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/native.js +74 -60
- package/lib/commonjs/native.js.map +1 -1
- package/lib/commonjs/pluginHost.js +45 -0
- package/lib/commonjs/pluginHost.js.map +1 -0
- package/lib/commonjs/releaseCatalogCache.js +36 -87
- package/lib/commonjs/releaseCatalogCache.js.map +1 -1
- package/lib/commonjs/sdkVersion.js +1 -1
- package/lib/commonjs/sdkVersion.js.map +1 -1
- package/lib/commonjs/specs/NativeHotUpdater.js.map +1 -1
- package/lib/commonjs/store.js +3 -10
- package/lib/commonjs/store.js.map +1 -1
- package/lib/commonjs/updateError.js +145 -0
- package/lib/commonjs/updateError.js.map +1 -0
- package/lib/commonjs/wrap.js +43 -26
- package/lib/commonjs/wrap.js.map +1 -1
- package/lib/module/appReady.js +95 -0
- package/lib/module/appReady.js.map +1 -0
- package/lib/module/checkForUpdate.js +113 -63
- package/lib/module/checkForUpdate.js.map +1 -1
- package/lib/module/clientPlugin.js +4 -0
- package/lib/module/clientPlugin.js.map +1 -0
- package/lib/module/error.js +4 -13
- package/lib/module/error.js.map +1 -1
- package/lib/module/fetchJSON.js +14 -26
- package/lib/module/fetchJSON.js.map +1 -1
- package/lib/module/fetchUpdateResponse.js +55 -0
- package/lib/module/fetchUpdateResponse.js.map +1 -0
- package/lib/module/httpClient.js +62 -93
- package/lib/module/httpClient.js.map +1 -1
- package/lib/module/index.js +58 -20
- package/lib/module/index.js.map +1 -1
- package/lib/module/native.js +67 -53
- package/lib/module/native.js.map +1 -1
- package/lib/module/pluginHost.js +36 -0
- package/lib/module/pluginHost.js.map +1 -0
- package/lib/module/releaseCatalogCache.js +32 -82
- package/lib/module/releaseCatalogCache.js.map +1 -1
- package/lib/module/sdkVersion.js +1 -1
- package/lib/module/sdkVersion.js.map +1 -1
- package/lib/module/specs/NativeHotUpdater.js.map +1 -1
- package/lib/module/store.js +3 -10
- package/lib/module/store.js.map +1 -1
- package/lib/module/updateError.js +139 -0
- package/lib/module/updateError.js.map +1 -0
- package/lib/module/wrap.js +43 -26
- package/lib/module/wrap.js.map +1 -1
- package/lib/typescript/commonjs/appReady.d.ts +21 -0
- package/lib/typescript/commonjs/appReady.d.ts.map +1 -0
- package/lib/typescript/commonjs/checkForUpdate.d.ts +16 -4
- package/lib/typescript/commonjs/checkForUpdate.d.ts.map +1 -1
- package/lib/typescript/commonjs/clientPlugin.d.ts +2 -0
- package/lib/typescript/commonjs/clientPlugin.d.ts.map +1 -0
- package/lib/typescript/commonjs/error.d.ts +4 -13
- package/lib/typescript/commonjs/error.d.ts.map +1 -1
- package/lib/typescript/commonjs/fetchJSON.d.ts +5 -5
- package/lib/typescript/commonjs/fetchJSON.d.ts.map +1 -1
- package/lib/typescript/commonjs/fetchUpdateResponse.d.ts +14 -0
- package/lib/typescript/commonjs/fetchUpdateResponse.d.ts.map +1 -0
- package/lib/typescript/commonjs/httpClient.d.ts +4 -33
- package/lib/typescript/commonjs/httpClient.d.ts.map +1 -1
- package/lib/typescript/commonjs/index.d.ts +4 -8
- package/lib/typescript/commonjs/index.d.ts.map +1 -1
- package/lib/typescript/commonjs/native.d.ts +29 -22
- package/lib/typescript/commonjs/native.d.ts.map +1 -1
- package/lib/typescript/commonjs/pluginHost.d.ts +4 -0
- package/lib/typescript/commonjs/pluginHost.d.ts.map +1 -0
- package/lib/typescript/commonjs/releaseCatalogCache.d.ts +8 -14
- package/lib/typescript/commonjs/releaseCatalogCache.d.ts.map +1 -1
- package/lib/typescript/commonjs/sdkVersion.d.ts +1 -1
- package/lib/typescript/commonjs/sdkVersion.d.ts.map +1 -1
- package/lib/typescript/commonjs/specs/NativeHotUpdater.d.ts +35 -47
- package/lib/typescript/commonjs/specs/NativeHotUpdater.d.ts.map +1 -1
- package/lib/typescript/commonjs/store.d.ts +1 -3
- package/lib/typescript/commonjs/store.d.ts.map +1 -1
- package/lib/typescript/commonjs/types.d.ts +1 -1
- package/lib/typescript/commonjs/types.d.ts.map +1 -1
- package/lib/typescript/commonjs/updateError.d.ts +26 -0
- package/lib/typescript/commonjs/updateError.d.ts.map +1 -0
- package/lib/typescript/commonjs/wrap.d.ts.map +1 -1
- package/lib/typescript/commonjs/wrap.types.d.ts +6 -7
- package/lib/typescript/commonjs/wrap.types.d.ts.map +1 -1
- package/lib/typescript/module/appReady.d.ts +21 -0
- package/lib/typescript/module/appReady.d.ts.map +1 -0
- package/lib/typescript/module/checkForUpdate.d.ts +16 -4
- package/lib/typescript/module/checkForUpdate.d.ts.map +1 -1
- package/lib/typescript/module/clientPlugin.d.ts +2 -0
- package/lib/typescript/module/clientPlugin.d.ts.map +1 -0
- package/lib/typescript/module/error.d.ts +4 -13
- package/lib/typescript/module/error.d.ts.map +1 -1
- package/lib/typescript/module/fetchJSON.d.ts +5 -5
- package/lib/typescript/module/fetchJSON.d.ts.map +1 -1
- package/lib/typescript/module/fetchUpdateResponse.d.ts +14 -0
- package/lib/typescript/module/fetchUpdateResponse.d.ts.map +1 -0
- package/lib/typescript/module/httpClient.d.ts +4 -33
- package/lib/typescript/module/httpClient.d.ts.map +1 -1
- package/lib/typescript/module/index.d.ts +4 -8
- package/lib/typescript/module/index.d.ts.map +1 -1
- package/lib/typescript/module/native.d.ts +29 -22
- package/lib/typescript/module/native.d.ts.map +1 -1
- package/lib/typescript/module/pluginHost.d.ts +4 -0
- package/lib/typescript/module/pluginHost.d.ts.map +1 -0
- package/lib/typescript/module/releaseCatalogCache.d.ts +8 -14
- package/lib/typescript/module/releaseCatalogCache.d.ts.map +1 -1
- package/lib/typescript/module/sdkVersion.d.ts +1 -1
- package/lib/typescript/module/sdkVersion.d.ts.map +1 -1
- package/lib/typescript/module/specs/NativeHotUpdater.d.ts +35 -47
- package/lib/typescript/module/specs/NativeHotUpdater.d.ts.map +1 -1
- package/lib/typescript/module/store.d.ts +1 -3
- package/lib/typescript/module/store.d.ts.map +1 -1
- package/lib/typescript/module/types.d.ts +1 -1
- package/lib/typescript/module/types.d.ts.map +1 -1
- package/lib/typescript/module/updateError.d.ts +26 -0
- package/lib/typescript/module/updateError.d.ts.map +1 -0
- package/lib/typescript/module/wrap.d.ts.map +1 -1
- package/lib/typescript/module/wrap.types.d.ts +6 -7
- package/lib/typescript/module/wrap.types.d.ts.map +1 -1
- package/package.json +7 -4
- package/src/appReady.ts +141 -0
- package/src/checkForUpdate.ts +145 -86
- package/src/clientPlugin.ts +18 -0
- package/src/error.ts +4 -14
- package/src/fetchJSON.ts +14 -30
- package/src/fetchUpdateResponse.ts +60 -0
- package/src/httpClient.ts +88 -159
- package/src/index.ts +90 -24
- package/src/native.ts +98 -102
- package/src/pluginHost.ts +47 -0
- package/src/releaseCatalogCache.ts +43 -172
- package/src/sdkVersion.ts +1 -1
- package/src/specs/NativeHotUpdater.ts +34 -48
- package/src/store.ts +2 -23
- package/src/types.ts +1 -1
- package/src/updateError.ts +167 -0
- package/src/wrap.tsx +57 -26
- package/src/wrap.types.ts +6 -7
- package/android/src/main/java/com/hotupdater/DecompressService.kt +0 -89
- package/android/src/main/java/com/hotupdater/DecompressionStrategy.kt +0 -26
- package/android/src/main/java/com/hotupdater/TarBrDecompressionStrategy.kt +0 -117
- package/android/src/main/java/com/hotupdater/TarGzDecompressionStrategy.kt +0 -117
- package/android/src/main/java/com/hotupdater/ZipDecompressionStrategy.kt +0 -192
- package/android/src/test/java/com/hotupdater/BsdiffPatchTest.kt +0 -46
- package/android/src/test/java/com/hotupdater/BundleFileStorageServiceTest.kt +0 -799
- package/android/src/test/java/com/hotupdater/HotUpdaterImplTest.kt +0 -273
- package/android/src/test/java/com/hotupdater/NativeConfigUtilsTest.kt +0 -20
- package/android/src/test/java/com/hotupdater/OkHttpDownloadServiceTest.kt +0 -111
- package/android/src/test/java/com/hotupdater/RelativePathResolverTest.kt +0 -41
- package/android/src/test/java/com/hotupdater/ReleaseCatalogCacheServiceTest.kt +0 -118
- package/android/src/test/java/com/hotupdater/TarArchiveInputStreamTest.kt +0 -68
- package/ios/HotUpdater/Internal/ArchiveExtractionUtilities.swift +0 -178
- package/ios/HotUpdater/Internal/DecompressService.swift +0 -112
- package/ios/HotUpdater/Internal/DecompressionStrategy.swift +0 -22
- package/ios/HotUpdater/Internal/StreamingTarArchiveExtractor.swift +0 -370
- package/ios/HotUpdater/Internal/TarBrDecompressionStrategy.swift +0 -39
- package/ios/HotUpdater/Internal/TarGzDecompressionStrategy.swift +0 -59
- package/ios/HotUpdater/Internal/ZipArchiveExtractor.swift +0 -482
- package/ios/HotUpdater/Internal/ZipDecompressionStrategy.swift +0 -56
- package/lib/commonjs/catalogCacheNative.spec.js +0 -31
- package/lib/commonjs/catalogCacheNative.spec.js.map +0 -1
- package/lib/commonjs/checkForUpdate.releaseCatalog.spec.js +0 -616
- package/lib/commonjs/checkForUpdate.releaseCatalog.spec.js.map +0 -1
- package/lib/commonjs/httpClient.spec.js +0 -102
- package/lib/commonjs/httpClient.spec.js.map +0 -1
- package/lib/commonjs/index.spec.js +0 -302
- package/lib/commonjs/index.spec.js.map +0 -1
- package/lib/commonjs/iosInterop.spec.js +0 -18
- package/lib/commonjs/iosInterop.spec.js.map +0 -1
- package/lib/commonjs/native.spec.js +0 -883
- package/lib/commonjs/native.spec.js.map +0 -1
- package/lib/commonjs/notifyAppReadyInsights.boundary.spec.js +0 -218
- package/lib/commonjs/notifyAppReadyInsights.boundary.spec.js.map +0 -1
- package/lib/commonjs/notifyAppReadyInsights.js +0 -133
- package/lib/commonjs/notifyAppReadyInsights.js.map +0 -1
- package/lib/commonjs/notifyAppReadyInsights.spec.js +0 -246
- package/lib/commonjs/notifyAppReadyInsights.spec.js.map +0 -1
- package/lib/commonjs/notifyAppReadyInsights.test-utils.js +0 -24
- package/lib/commonjs/notifyAppReadyInsights.test-utils.js.map +0 -1
- package/lib/commonjs/notifyAppReadyInsights.transport.spec.js +0 -117
- package/lib/commonjs/notifyAppReadyInsights.transport.spec.js.map +0 -1
- package/lib/commonjs/releaseCatalogCache.spec.js +0 -195
- package/lib/commonjs/releaseCatalogCache.spec.js.map +0 -1
- package/lib/commonjs/releaseCatalogCacheNativeContract.spec.js +0 -64
- package/lib/commonjs/releaseCatalogCacheNativeContract.spec.js.map +0 -1
- package/lib/commonjs/store.notification.spec.js +0 -76
- package/lib/commonjs/store.notification.spec.js.map +0 -1
- package/lib/commonjs/store.spec.js +0 -316
- package/lib/commonjs/store.spec.js.map +0 -1
- package/lib/commonjs/wrap.spec.js +0 -329
- package/lib/commonjs/wrap.spec.js.map +0 -1
- package/lib/module/catalogCacheNative.spec.js +0 -31
- package/lib/module/catalogCacheNative.spec.js.map +0 -1
- package/lib/module/checkForUpdate.releaseCatalog.spec.js +0 -615
- package/lib/module/checkForUpdate.releaseCatalog.spec.js.map +0 -1
- package/lib/module/httpClient.spec.js +0 -102
- package/lib/module/httpClient.spec.js.map +0 -1
- package/lib/module/index.spec.js +0 -301
- package/lib/module/index.spec.js.map +0 -1
- package/lib/module/iosInterop.spec.js +0 -18
- package/lib/module/iosInterop.spec.js.map +0 -1
- package/lib/module/native.spec.js +0 -882
- package/lib/module/native.spec.js.map +0 -1
- package/lib/module/notifyAppReadyInsights.boundary.spec.js +0 -217
- package/lib/module/notifyAppReadyInsights.boundary.spec.js.map +0 -1
- package/lib/module/notifyAppReadyInsights.js +0 -128
- package/lib/module/notifyAppReadyInsights.js.map +0 -1
- package/lib/module/notifyAppReadyInsights.spec.js +0 -245
- package/lib/module/notifyAppReadyInsights.spec.js.map +0 -1
- package/lib/module/notifyAppReadyInsights.test-utils.js +0 -18
- package/lib/module/notifyAppReadyInsights.test-utils.js.map +0 -1
- package/lib/module/notifyAppReadyInsights.transport.spec.js +0 -116
- package/lib/module/notifyAppReadyInsights.transport.spec.js.map +0 -1
- package/lib/module/releaseCatalogCache.spec.js +0 -195
- package/lib/module/releaseCatalogCache.spec.js.map +0 -1
- package/lib/module/releaseCatalogCacheNativeContract.spec.js +0 -64
- package/lib/module/releaseCatalogCacheNativeContract.spec.js.map +0 -1
- package/lib/module/store.notification.spec.js +0 -77
- package/lib/module/store.notification.spec.js.map +0 -1
- package/lib/module/store.spec.js +0 -315
- package/lib/module/store.spec.js.map +0 -1
- package/lib/module/wrap.spec.js +0 -330
- package/lib/module/wrap.spec.js.map +0 -1
- package/lib/typescript/commonjs/notifyAppReadyInsights.d.ts +0 -13
- package/lib/typescript/commonjs/notifyAppReadyInsights.d.ts.map +0 -1
- package/lib/typescript/commonjs/notifyAppReadyInsights.test-utils.d.ts +0 -8
- package/lib/typescript/commonjs/notifyAppReadyInsights.test-utils.d.ts.map +0 -1
- package/lib/typescript/module/notifyAppReadyInsights.d.ts +0 -13
- package/lib/typescript/module/notifyAppReadyInsights.d.ts.map +0 -1
- package/lib/typescript/module/notifyAppReadyInsights.test-utils.d.ts +0 -8
- package/lib/typescript/module/notifyAppReadyInsights.test-utils.d.ts.map +0 -1
- package/src/catalogCacheNative.spec.ts +0 -63
- package/src/checkForUpdate.releaseCatalog.spec.ts +0 -612
- package/src/httpClient.spec.ts +0 -132
- package/src/index.spec.ts +0 -337
- package/src/iosInterop.spec.ts +0 -30
- package/src/native.spec.ts +0 -945
- package/src/notifyAppReadyInsights.boundary.spec.ts +0 -234
- package/src/notifyAppReadyInsights.spec.ts +0 -243
- package/src/notifyAppReadyInsights.test-utils.ts +0 -31
- package/src/notifyAppReadyInsights.transport.spec.ts +0 -130
- package/src/notifyAppReadyInsights.ts +0 -194
- package/src/releaseCatalogCache.spec.ts +0 -282
- package/src/releaseCatalogCacheNativeContract.spec.ts +0 -80
- package/src/store.notification.spec.ts +0 -92
- package/src/store.spec.ts +0 -372
- package/src/wrap.spec.ts +0 -406
package/lib/module/httpClient.js
CHANGED
|
@@ -1,103 +1,57 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
import { encodeChannelKey } from "@hot-updater/
|
|
4
|
-
import {
|
|
5
|
-
import { fetchJSON } from "./fetchJSON.js";
|
|
3
|
+
import { ARTIFACT_PROTOCOL_VERSION, canonicalizeAppVersion, encodeChannelKey, resolveBaseURL } from "@hot-updater/protocol";
|
|
4
|
+
import { fetchJSON, FetchJSONResponseError } from "./fetchJSON.js";
|
|
6
5
|
import { fetchReleaseCatalogWithCache } from "./releaseCatalogCache.js";
|
|
7
|
-
import {
|
|
8
|
-
const resolveBaseURL = async baseURL => {
|
|
9
|
-
const resolvedBaseURL = typeof baseURL === "function" ? await baseURL() : baseURL;
|
|
10
|
-
if (!resolvedBaseURL) {
|
|
11
|
-
throw new Error("baseURL function must return a non-empty string");
|
|
12
|
-
}
|
|
13
|
-
return resolvedBaseURL.replace(/\/+$/, "");
|
|
14
|
-
};
|
|
6
|
+
import { InvalidUpdateResponseError } from "./updateError.js";
|
|
15
7
|
const resolveArtifactUrl = (baseURL, value) => {
|
|
16
8
|
if (/^https?:\/\//i.test(value)) {
|
|
17
|
-
|
|
9
|
+
try {
|
|
10
|
+
new URL(value);
|
|
11
|
+
} catch (error) {
|
|
12
|
+
throw new InvalidUpdateResponseError(`Invalid artifact URL: ${value}`, {
|
|
13
|
+
cause: error
|
|
14
|
+
});
|
|
15
|
+
}
|
|
18
16
|
return value;
|
|
19
17
|
}
|
|
20
18
|
if (!value.startsWith("/storage/")) {
|
|
21
|
-
throw new
|
|
19
|
+
throw new InvalidUpdateResponseError("Artifact URLs must be absolute HTTP(S) URLs or client-relative storage paths.");
|
|
22
20
|
}
|
|
23
21
|
return `${baseURL}/${value.slice(1)}`;
|
|
24
22
|
};
|
|
25
23
|
const resolveArtifactUrls = (baseURL, info) => ({
|
|
26
24
|
...info,
|
|
27
|
-
|
|
28
|
-
...(info.
|
|
29
|
-
|
|
30
|
-
}),
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
...
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
}
|
|
45
|
-
} : {})
|
|
46
|
-
}]))
|
|
47
|
-
})
|
|
25
|
+
manifestUrl: resolveArtifactUrl(baseURL, info.manifestUrl),
|
|
26
|
+
...(info.archiveUrl ? {
|
|
27
|
+
archiveUrl: resolveArtifactUrl(baseURL, info.archiveUrl)
|
|
28
|
+
} : {}),
|
|
29
|
+
assets: Object.fromEntries(Object.entries(info.assets).map(([path, asset]) => [path, {
|
|
30
|
+
...asset,
|
|
31
|
+
file: {
|
|
32
|
+
...asset.file,
|
|
33
|
+
url: resolveArtifactUrl(baseURL, asset.file.url)
|
|
34
|
+
},
|
|
35
|
+
...(asset.patch ? {
|
|
36
|
+
patch: {
|
|
37
|
+
...asset.patch,
|
|
38
|
+
patchUrl: resolveArtifactUrl(baseURL, asset.patch.patchUrl)
|
|
39
|
+
}
|
|
40
|
+
} : {})
|
|
41
|
+
}]))
|
|
48
42
|
});
|
|
49
|
-
const
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
body: JSON.stringify({
|
|
57
|
-
appVersion: params.appVersion,
|
|
58
|
-
channel: params.channel,
|
|
59
|
-
cohort: params.cohort,
|
|
60
|
-
fingerprintHash: params.fingerprintHash,
|
|
61
|
-
fromBundleId: params.fromBundleId,
|
|
62
|
-
...(params.fromReleaseId === undefined ? {} : {
|
|
63
|
-
fromReleaseId: params.fromReleaseId
|
|
64
|
-
}),
|
|
65
|
-
installId: params.installId,
|
|
66
|
-
platform: params.platform,
|
|
67
|
-
sdkVersion: HOT_UPDATER_SDK_VERSION,
|
|
68
|
-
toBundleId: params.toBundleId,
|
|
69
|
-
...(params.toReleaseId === undefined ? {} : {
|
|
70
|
-
toReleaseId: params.toReleaseId
|
|
71
|
-
}),
|
|
72
|
-
type: params.type,
|
|
73
|
-
updateStrategy: params.updateStrategy,
|
|
74
|
-
...(params.userId != null ? {
|
|
75
|
-
userId: params.userId
|
|
76
|
-
} : {}),
|
|
77
|
-
...(params.username != null ? {
|
|
78
|
-
username: params.username
|
|
79
|
-
} : {})
|
|
80
|
-
}),
|
|
81
|
-
headers: {
|
|
82
|
-
"Content-Type": "application/json",
|
|
83
|
-
...params.requestHeaders
|
|
84
|
-
},
|
|
85
|
-
method: "POST",
|
|
86
|
-
signal: controller.signal
|
|
87
|
-
});
|
|
88
|
-
if (response.status !== 204) {
|
|
89
|
-
throw new Error(`Expected HTTP 204 from /events, received ${response.status}`);
|
|
90
|
-
}
|
|
91
|
-
} catch (error) {
|
|
92
|
-
if (error instanceof Error && error.name === "AbortError") {
|
|
93
|
-
throw new Error("Request timed out");
|
|
43
|
+
const requireArtifactProtocolV1 = info => {
|
|
44
|
+
if (info.artifactProtocolVersion !== ARTIFACT_PROTOCOL_VERSION || !info.assets || !info.manifestUrl || !info.manifestFileHash || info.archiveUrl !== undefined && typeof info.archiveUrl !== "string") {
|
|
45
|
+
throw new InvalidUpdateResponseError(`Server does not support artifact protocol ${ARTIFACT_PROTOCOL_VERSION}.`);
|
|
46
|
+
}
|
|
47
|
+
for (const asset of Object.values(info.assets)) {
|
|
48
|
+
if (!asset.file?.url || !asset.fileHash) {
|
|
49
|
+
throw new InvalidUpdateResponseError("Artifact protocol 1 requires an original file for every asset.");
|
|
94
50
|
}
|
|
95
|
-
throw error;
|
|
96
|
-
} finally {
|
|
97
|
-
clearTimeout(timeoutId);
|
|
98
51
|
}
|
|
52
|
+
return info;
|
|
99
53
|
};
|
|
100
|
-
const createSession = baseURL => ({
|
|
54
|
+
const createSession = (baseURL, onResponse) => ({
|
|
101
55
|
fetchReleaseCatalog: async params => {
|
|
102
56
|
const channelKey = encodeChannelKey(params.channel);
|
|
103
57
|
let strategyValue;
|
|
@@ -115,6 +69,9 @@ const createSession = baseURL => ({
|
|
|
115
69
|
const url = `${baseURL}/release-catalogs/${strategyPath}/${params.platform}/${channelKey}/${encodeURIComponent(strategyValue)}`;
|
|
116
70
|
return fetchReleaseCatalogWithCache({
|
|
117
71
|
baseURL,
|
|
72
|
+
...(onResponse ? {
|
|
73
|
+
onResponse
|
|
74
|
+
} : {}),
|
|
118
75
|
expectedScope: params.updateStrategy === "fingerprint" ? {
|
|
119
76
|
channelKey,
|
|
120
77
|
fingerprintHash: strategyValue,
|
|
@@ -131,18 +88,30 @@ const createSession = baseURL => ({
|
|
|
131
88
|
});
|
|
132
89
|
},
|
|
133
90
|
resolveArtifact: async params => {
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
91
|
+
let info;
|
|
92
|
+
try {
|
|
93
|
+
info = await fetchJSON({
|
|
94
|
+
...(onResponse ? {
|
|
95
|
+
onResponse
|
|
96
|
+
} : {}),
|
|
97
|
+
requestHeaders: params.requestHeaders,
|
|
98
|
+
requestTimeout: params.requestTimeout,
|
|
99
|
+
url: `${baseURL}/artifacts/v1/${encodeURIComponent(params.targetBundleId)}/from/${encodeURIComponent(params.currentBundleId)}`
|
|
100
|
+
});
|
|
101
|
+
} catch (error) {
|
|
102
|
+
if (error instanceof FetchJSONResponseError && error.status === 404) {
|
|
103
|
+
throw new InvalidUpdateResponseError(`Server does not support artifact protocol ${ARTIFACT_PROTOCOL_VERSION}.`, {
|
|
104
|
+
cause: error
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
throw error;
|
|
108
|
+
}
|
|
109
|
+
return resolveArtifactUrls(baseURL, requireArtifactProtocolV1(info));
|
|
110
|
+
}
|
|
142
111
|
});
|
|
143
112
|
|
|
144
113
|
/** Creates the private HTTP client used by HotUpdater.init and HotUpdater.wrap. */
|
|
145
|
-
export const createHttpClient = baseURL => ({
|
|
146
|
-
createSession: async () => createSession(await resolveBaseURL(baseURL))
|
|
114
|
+
export const createHttpClient = (baseURL, onResponse) => ({
|
|
115
|
+
createSession: async () => createSession(await resolveBaseURL(baseURL), onResponse)
|
|
147
116
|
});
|
|
148
117
|
//# sourceMappingURL=httpClient.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["
|
|
1
|
+
{"version":3,"names":["ARTIFACT_PROTOCOL_VERSION","canonicalizeAppVersion","encodeChannelKey","resolveBaseURL","fetchJSON","FetchJSONResponseError","fetchReleaseCatalogWithCache","InvalidUpdateResponseError","resolveArtifactUrl","baseURL","value","test","URL","error","cause","startsWith","slice","resolveArtifactUrls","info","manifestUrl","archiveUrl","assets","Object","fromEntries","entries","map","path","asset","file","url","patch","patchUrl","requireArtifactProtocolV1","artifactProtocolVersion","manifestFileHash","undefined","values","fileHash","createSession","onResponse","fetchReleaseCatalog","params","channelKey","channel","strategyValue","updateStrategy","fingerprintHash","Error","appVersion","strategyPath","platform","encodeURIComponent","expectedScope","strategy","requestHeaders","requestTimeout","resolveArtifact","targetBundleId","currentBundleId","status","createHttpClient"],"sourceRoot":"../../src","sources":["httpClient.ts"],"mappings":"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","ignoreList":[]}
|
package/lib/module/index.js
CHANGED
|
@@ -1,10 +1,15 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
import {
|
|
3
|
+
import { emitAfterAppReady } from "./appReady.js";
|
|
4
|
+
import { checkForUpdate, reportUpdateError } from "./checkForUpdate.js";
|
|
4
5
|
import { createHttpClient } from "./httpClient.js";
|
|
5
|
-
import { addListener, getPublicActiveUpdateState, clearCrashHistory, getAppVersion, getBaseURL, getUpdateId, getChannel, getCohort, getCrashHistory, getDefaultChannel, getFingerprintHash, getInstallId, getManifest, getMinBundleId, isChannelSwitched, notifyAppReady, reload, resetChannel, setCohort, setReloadBehavior,
|
|
6
|
+
import { addListener, getPublicActiveUpdateState, getActiveUpdateState, getBundleId, clearCrashHistory, getAppVersion, getBaseURL, getUpdateId, getChannel, getCohort, getCrashHistory, getDefaultChannel, getFingerprintHash, getInstallId, getManifest, getMinBundleId, isChannelSwitched, notifyAppReady, reload, resetChannel, setCohort, setReloadBehavior, stageBundle } from "./native.js";
|
|
7
|
+
import { configurePlugins } from "./pluginHost.js";
|
|
6
8
|
import { hotUpdaterStore } from "./store.js";
|
|
7
9
|
import { init, wrap } from "./wrap.js";
|
|
10
|
+
export { defineClientPlugin } from "./clientPlugin.js";
|
|
11
|
+
// The built-in Insights client plugin, for HotUpdater.init({ plugins }).
|
|
12
|
+
export { insights } from "@hot-updater/plugin-insights/client";
|
|
8
13
|
export * from "./store.js";
|
|
9
14
|
export { extractSignatureFailure, isSignatureVerificationError } from "./types.js";
|
|
10
15
|
/**
|
|
@@ -34,7 +39,6 @@ function createHotUpdaterClient() {
|
|
|
34
39
|
|
|
35
40
|
// Global configuration stored from wrap
|
|
36
41
|
const globalConfig = {
|
|
37
|
-
insights: true,
|
|
38
42
|
client: null
|
|
39
43
|
};
|
|
40
44
|
const createMissingNetworkConfigError = apiName => {
|
|
@@ -53,12 +57,14 @@ function createHotUpdaterClient() {
|
|
|
53
57
|
if (autoOptions.baseURL) {
|
|
54
58
|
const {
|
|
55
59
|
baseURL,
|
|
60
|
+
plugins: _plugins,
|
|
56
61
|
...rest
|
|
57
62
|
} = autoOptions;
|
|
58
63
|
return {
|
|
59
64
|
...rest,
|
|
60
|
-
|
|
61
|
-
|
|
65
|
+
client: createHttpClient(baseURL, response => {
|
|
66
|
+
emitAfterAppReady("onHttpResponse", () => response);
|
|
67
|
+
})
|
|
62
68
|
};
|
|
63
69
|
}
|
|
64
70
|
throw createMissingNetworkConfigError("wrap");
|
|
@@ -71,18 +77,26 @@ function createHotUpdaterClient() {
|
|
|
71
77
|
if (rest.baseURL) {
|
|
72
78
|
const {
|
|
73
79
|
baseURL,
|
|
80
|
+
plugins: _plugins,
|
|
74
81
|
...baseURLRest
|
|
75
82
|
} = rest;
|
|
76
83
|
return {
|
|
77
84
|
...baseURLRest,
|
|
78
|
-
|
|
79
|
-
|
|
85
|
+
client: createHttpClient(baseURL, response => {
|
|
86
|
+
emitAfterAppReady("onHttpResponse", () => response);
|
|
87
|
+
})
|
|
80
88
|
};
|
|
81
89
|
}
|
|
82
90
|
throw createMissingNetworkConfigError("init");
|
|
83
91
|
};
|
|
84
92
|
const configureGlobal = (normalizedOptions, options) => {
|
|
85
|
-
|
|
93
|
+
// Plugins are set up before init or wrap reads the launch they observe.
|
|
94
|
+
configurePlugins(options.plugins, {
|
|
95
|
+
baseURL: options.baseURL,
|
|
96
|
+
requestHeaders: options.requestHeaders,
|
|
97
|
+
requestTimeout: options.requestTimeout,
|
|
98
|
+
onError: options.onError
|
|
99
|
+
});
|
|
86
100
|
globalConfig.client = normalizedOptions.client;
|
|
87
101
|
globalConfig.requestHeaders = options.requestHeaders;
|
|
88
102
|
globalConfig.requestTimeout = options.requestTimeout;
|
|
@@ -295,7 +309,6 @@ function createHotUpdaterClient() {
|
|
|
295
309
|
const client = ensureGlobalClient("checkForUpdate");
|
|
296
310
|
const mergedConfig = {
|
|
297
311
|
...config,
|
|
298
|
-
insights: globalConfig.insights,
|
|
299
312
|
client,
|
|
300
313
|
requestHeaders: {
|
|
301
314
|
...globalConfig.requestHeaders,
|
|
@@ -311,8 +324,6 @@ function createHotUpdaterClient() {
|
|
|
311
324
|
*
|
|
312
325
|
* @param {UpdateBundleParams} params - Parameters object required for bundle update
|
|
313
326
|
* @param {string} params.bundleId - The bundle ID of the app
|
|
314
|
-
* @param {string|null} params.fileUrl - The URL of the zip file
|
|
315
|
-
*
|
|
316
327
|
* @returns {Promise<boolean>} Whether the update was successful
|
|
317
328
|
*
|
|
318
329
|
* @example
|
|
@@ -336,9 +347,42 @@ function createHotUpdaterClient() {
|
|
|
336
347
|
* }
|
|
337
348
|
* ```
|
|
338
349
|
*/
|
|
339
|
-
updateBundle: params => {
|
|
350
|
+
updateBundle: async params => {
|
|
340
351
|
ensureGlobalClient("updateBundle");
|
|
341
|
-
|
|
352
|
+
const fromBundleId = getBundleId();
|
|
353
|
+
const state = getActiveUpdateState();
|
|
354
|
+
const active = state.activeSelection;
|
|
355
|
+
const fromReleaseId = active?.bundleId === fromBundleId ? active.releaseId : state.stableSelection?.bundleId === fromBundleId ? state.stableSelection.releaseId : null;
|
|
356
|
+
const channel = params.channel ?? getChannel();
|
|
357
|
+
const strategyOf = scopeKey => scopeKey?.startsWith("v1:fingerprint:") ? "fingerprint" : "appVersion";
|
|
358
|
+
let delivery;
|
|
359
|
+
try {
|
|
360
|
+
delivery = await stageBundle(params);
|
|
361
|
+
} catch (error) {
|
|
362
|
+
reportUpdateError(error, "download", undefined, {
|
|
363
|
+
bundleId: fromBundleId,
|
|
364
|
+
channel,
|
|
365
|
+
targetBundleId: params.bundleId,
|
|
366
|
+
targetReleaseId: params.selection?.releaseId ?? null,
|
|
367
|
+
updateStrategy: strategyOf(params.selection?.scopeKey)
|
|
368
|
+
});
|
|
369
|
+
throw error;
|
|
370
|
+
}
|
|
371
|
+
if (delivery !== null && params.bundleId !== fromBundleId) {
|
|
372
|
+
emitAfterAppReady("onBundleDownloaded", () => {
|
|
373
|
+
const selection = getActiveUpdateState().activeSelection;
|
|
374
|
+
return {
|
|
375
|
+
channel,
|
|
376
|
+
fromBundleId,
|
|
377
|
+
fromReleaseId,
|
|
378
|
+
toBundleId: params.bundleId,
|
|
379
|
+
toReleaseId: selection?.releaseId ?? null,
|
|
380
|
+
updateStrategy: strategyOf(selection?.scopeKey),
|
|
381
|
+
...delivery
|
|
382
|
+
};
|
|
383
|
+
});
|
|
384
|
+
}
|
|
385
|
+
return true;
|
|
342
386
|
},
|
|
343
387
|
/**
|
|
344
388
|
* Clears the runtime channel override and restores the original bundle.
|
|
@@ -351,10 +395,8 @@ function createHotUpdaterClient() {
|
|
|
351
395
|
hotUpdaterStore.setState({
|
|
352
396
|
artifactType: null,
|
|
353
397
|
details: null,
|
|
354
|
-
downloadedBytes: undefined,
|
|
355
398
|
isUpdateDownloaded: false,
|
|
356
|
-
progress: 0
|
|
357
|
-
totalBytes: undefined
|
|
399
|
+
progress: 0
|
|
358
400
|
});
|
|
359
401
|
}
|
|
360
402
|
return ok;
|
|
@@ -375,10 +417,6 @@ function createHotUpdaterClient() {
|
|
|
375
417
|
* Fetches the persisted install id for this app installation.
|
|
376
418
|
*/
|
|
377
419
|
getInstallId,
|
|
378
|
-
/**
|
|
379
|
-
* Persists nullable user identity fields associated with this installation.
|
|
380
|
-
*/
|
|
381
|
-
setUser,
|
|
382
420
|
/**
|
|
383
421
|
* Reads the native launch report for the current process.
|
|
384
422
|
*/
|
package/lib/module/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["checkForUpdate","createHttpClient","addListener","getPublicActiveUpdateState","clearCrashHistory","getAppVersion","getBaseURL","getUpdateId","getChannel","getCohort","getCrashHistory","getDefaultChannel","getFingerprintHash","getInstallId","getManifest","getMinBundleId","isChannelSwitched","notifyAppReady","reload","resetChannel","setCohort","setReloadBehavior","
|
|
1
|
+
{"version":3,"names":["emitAfterAppReady","checkForUpdate","reportUpdateError","createHttpClient","addListener","getPublicActiveUpdateState","getActiveUpdateState","getBundleId","clearCrashHistory","getAppVersion","getBaseURL","getUpdateId","getChannel","getCohort","getCrashHistory","getDefaultChannel","getFingerprintHash","getInstallId","getManifest","getMinBundleId","isChannelSwitched","notifyAppReady","reload","resetChannel","setCohort","setReloadBehavior","stageBundle","configurePlugins","hotUpdaterStore","init","wrap","defineClientPlugin","insights","extractSignatureFailure","isSignatureVerificationError","registerGlobalGetBaseURL","fn","globalThis","HotUpdaterGetBaseURL","createHotUpdaterClient","configurationAPI","mixedConfigurationReported","globalConfig","client","createMissingNetworkConfigError","apiName","Error","baseURLExample","normalizeOptions","options","incoming","updateMode","autoOptions","baseURL","plugins","_plugins","rest","response","normalizeInitOptions","_updateMode","baseURLRest","configureGlobal","normalizedOptions","requestHeaders","requestTimeout","onError","reportMixedConfiguration","nextAPI","console","error","ensureGlobalClient","methodName","isUpdateDownloaded","getSnapshot","config","mergedConfig","updateBundle","params","fromBundleId","state","active","activeSelection","fromReleaseId","bundleId","releaseId","stableSelection","channel","strategyOf","scopeKey","startsWith","delivery","undefined","targetBundleId","targetReleaseId","selection","updateStrategy","toBundleId","toReleaseId","ok","setState","artifactType","details","progress","HotUpdater"],"sourceRoot":"../../src","sources":["index.ts"],"mappings":"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OAAO,CAAC;MAE3C,OAAOnB,IAAI,CAACgC,iBAAiB,CAAC;IAChC,CAAC;IAED;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;IACIjC,IAAI,EAAGoB,OAA8B,IAAW;MAC9C,MAAMa,iBAAiB,GAAGJ,oBAAoB,CAACT,OAAO,CAAC;MAEvDiB,wBAAwB,CAAC,MAAM,CAAC;MAChCL,eAAe,CAACC,iBAAiB,EAAEb,OAAO,CAAC;MAE3CpB,IAAI,CAACiC,iBAAiB,CAAC;IACzB,CAAC;IAED;AACJ;AACA;IACIxC,MAAM;IAEN;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;IACIG,iBAAiB;IAEjB;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;IACI+C,kBAAkB,EAAEA,CAAA,KAAM5C,eAAe,CAAC6C,WAAW,CAAC,CAAC,CAACD,kBAAkB;IAE1E;AACJ;AACA;IACI/D,aAAa;IAEb;IACAH,oBAAoB,EAAE,MAAAA,CAAA,KAAYD,0BAA0B,CAAC,CAAC;IAE9D;AACJ;AACA;AACA;IACIE,WAAW,EAAEI,WAAW;IAExB;IACAQ,cAAc;IAEd;AACJ;AACA;IACID,WAAW;IAEX;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;IACIN,UAAU;IAEV;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;IACIG,iBAAiB;IAEjB;AACJ;AACA;AACA;AACA;IACIK,iBAAiB;IAEjB;AACJ;AACA;AACA;IACII,SAAS;IAET;AACJ;AACA;IACIX,SAAS;IAET;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;IACIT,WAAW;IAEX;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA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","ignoreList":[]}
|
package/lib/module/native.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
import { INVALID_COHORT_ERROR_MESSAGE, isValidCohort, normalizeCohortValue } from "@hot-updater/
|
|
3
|
+
import { INVALID_COHORT_ERROR_MESSAGE, isValidCohort, normalizeCohortValue } from "@hot-updater/protocol";
|
|
4
4
|
import { NativeEventEmitter, Platform } from "react-native";
|
|
5
5
|
import { HotUpdaterErrorCode, isHotUpdaterError } from "./error.js";
|
|
6
6
|
import HotUpdaterNative from "./specs/NativeHotUpdater.js";
|
|
@@ -188,24 +188,40 @@ export const commitReleaseSelection = async input => {
|
|
|
188
188
|
return ok;
|
|
189
189
|
};
|
|
190
190
|
|
|
191
|
+
/** How native delivered a staged bundle. */
|
|
192
|
+
|
|
193
|
+
const readBundleDelivery = value => {
|
|
194
|
+
if (typeof value !== "object" || value === null) return null;
|
|
195
|
+
const {
|
|
196
|
+
delivery,
|
|
197
|
+
patchFallback
|
|
198
|
+
} = value;
|
|
199
|
+
if (delivery !== "patch" && delivery !== "manifest" && delivery !== "archive") {
|
|
200
|
+
return null;
|
|
201
|
+
}
|
|
202
|
+
return {
|
|
203
|
+
delivery,
|
|
204
|
+
patchFallback: patchFallback === true
|
|
205
|
+
};
|
|
206
|
+
};
|
|
207
|
+
|
|
191
208
|
/**
|
|
192
|
-
*
|
|
209
|
+
* Stages a bundle for the next launch. Resolves with how native delivered
|
|
210
|
+
* it, or with null when this runtime had already staged it and nothing was
|
|
211
|
+
* downloaded; rejects when the download or install fails.
|
|
193
212
|
*
|
|
194
|
-
* @param {UpdateParams} params - Parameters object required for bundle update
|
|
195
|
-
* @returns {Promise<boolean>} Resolves with true if download was successful
|
|
196
213
|
* @throws {Error} Rejects with error.code from HotUpdaterErrorCode enum and error.message
|
|
197
214
|
*/
|
|
198
|
-
export async function
|
|
215
|
+
export async function stageBundle(params) {
|
|
199
216
|
const updateBundleId = params.bundleId;
|
|
200
217
|
const status = params.status;
|
|
201
|
-
const targetFileUrl = params.fileUrl;
|
|
202
218
|
const currentBundleId = status === "UPDATE" ? getFreshBundleId() : undefined;
|
|
203
219
|
|
|
204
220
|
// If native is still on the same bundle we installed in this session,
|
|
205
221
|
// skip re-download. Native state can move back to the built-in bundle after
|
|
206
222
|
// rollback/reset, so check a fresh native bundle id before using this guard.
|
|
207
223
|
if (status === "UPDATE" && sessionState.hasInstalledBundle(updateBundleId) && currentBundleId === updateBundleId) {
|
|
208
|
-
return
|
|
224
|
+
return null;
|
|
209
225
|
}
|
|
210
226
|
const shouldSkipCurrentBundleIdCheck = params.shouldSkipCurrentBundleIdCheck === true;
|
|
211
227
|
if (!shouldSkipCurrentBundleIdCheck && status === "UPDATE" && currentBundleId !== undefined && updateBundleId.localeCompare(currentBundleId) <= 0) {
|
|
@@ -215,30 +231,28 @@ export async function updateBundle(params) {
|
|
|
215
231
|
// In-flight guard: return the same promise if the same bundle is already updating.
|
|
216
232
|
const existing = sessionState.getInflightUpdate(updateBundleId);
|
|
217
233
|
if (existing) return existing;
|
|
218
|
-
const targetFileHash = params.fileHash;
|
|
219
234
|
const targetChannel = params.channel;
|
|
220
235
|
const targetManifestUrl = params.manifestUrl;
|
|
221
236
|
const targetManifestFileHash = params.manifestFileHash;
|
|
222
|
-
const
|
|
237
|
+
const targetAssets = params.assets;
|
|
223
238
|
const promise = (async () => {
|
|
224
239
|
try {
|
|
225
240
|
const selection = params.selection;
|
|
226
|
-
const
|
|
241
|
+
const staged = await HotUpdaterNative.updateBundle({
|
|
227
242
|
bundleId: updateBundleId,
|
|
228
243
|
channel: targetChannel,
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
244
|
+
assets: targetAssets,
|
|
245
|
+
manifestFileHash: targetManifestFileHash,
|
|
246
|
+
manifestUrl: targetManifestUrl,
|
|
247
|
+
...(params.archiveUrl ? {
|
|
248
|
+
archiveUrl: params.archiveUrl
|
|
249
|
+
} : {}),
|
|
234
250
|
...(selection === undefined ? {} : {
|
|
235
251
|
selection
|
|
236
252
|
})
|
|
237
253
|
});
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
}
|
|
241
|
-
return ok;
|
|
254
|
+
sessionState.markBundleInstalled(updateBundleId, targetChannel);
|
|
255
|
+
return readBundleDelivery(staged);
|
|
242
256
|
} finally {
|
|
243
257
|
sessionState.clearInflightUpdate(updateBundleId);
|
|
244
258
|
}
|
|
@@ -247,6 +261,18 @@ export async function updateBundle(params) {
|
|
|
247
261
|
return promise;
|
|
248
262
|
}
|
|
249
263
|
|
|
264
|
+
/**
|
|
265
|
+
* Downloads files and applies them to the app.
|
|
266
|
+
*
|
|
267
|
+
* @param {UpdateParams} params - Parameters object required for bundle update
|
|
268
|
+
* @returns {Promise<boolean>} Resolves with true if download was successful
|
|
269
|
+
* @throws {Error} Rejects with error.code from HotUpdaterErrorCode enum and error.message
|
|
270
|
+
*/
|
|
271
|
+
export async function updateBundle(params) {
|
|
272
|
+
await stageBundle(params);
|
|
273
|
+
return true;
|
|
274
|
+
}
|
|
275
|
+
|
|
250
276
|
/**
|
|
251
277
|
* Fetches the current app version.
|
|
252
278
|
*/
|
|
@@ -419,39 +445,31 @@ export const getInstallId = () => {
|
|
|
419
445
|
}
|
|
420
446
|
return nativeModule.getInstallId();
|
|
421
447
|
};
|
|
422
|
-
|
|
423
|
-
const
|
|
424
|
-
if (typeof
|
|
425
|
-
throw new Error(
|
|
448
|
+
const requireStorageNativeMethod = name => {
|
|
449
|
+
const method = HotUpdaterNative[name];
|
|
450
|
+
if (typeof method !== "function") {
|
|
451
|
+
throw new Error(`[HotUpdater] Native module is missing '${name}()'. This JS bundle requires a newer native @hot-updater/react-native SDK. Rebuild and release a new app version before delivering this OTA update.`);
|
|
426
452
|
}
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
453
|
+
return method.bind(HotUpdaterNative);
|
|
454
|
+
};
|
|
455
|
+
|
|
456
|
+
/** Reads a value from the SDK's native key-value store. */
|
|
457
|
+
export const getStorageItem = key => {
|
|
458
|
+
const value = requireStorageNativeMethod("getStorageItem")(key);
|
|
459
|
+
return typeof value === "string" ? value : null;
|
|
460
|
+
};
|
|
461
|
+
|
|
462
|
+
/** Writes a value to the SDK's native key-value store; null removes it. */
|
|
463
|
+
export const setStorageItem = (key, value) => {
|
|
464
|
+
requireStorageNativeMethod("setStorageItem")(key, value);
|
|
437
465
|
};
|
|
438
|
-
export function setUser(params) {
|
|
439
|
-
const nativeModule = HotUpdaterNative;
|
|
440
|
-
if (typeof nativeModule.setUser !== "function") {
|
|
441
|
-
throw new Error("[HotUpdater] Native module is missing 'setUser()'. This JS bundle requires a newer native @hot-updater/react-native SDK. Rebuild and release a new app version before delivering this OTA update.");
|
|
442
|
-
}
|
|
443
|
-
if (params === null) {
|
|
444
|
-
nativeModule.setUser(null, null);
|
|
445
|
-
return;
|
|
446
|
-
}
|
|
447
|
-
const normalizedUserId = params.userId === null || params.userId === undefined ? null : String(params.userId);
|
|
448
|
-
nativeModule.setUser(normalizedUserId, params.username ?? null);
|
|
449
|
-
}
|
|
450
466
|
|
|
451
467
|
/**
|
|
452
468
|
* Result returned by notifyAppReady()
|
|
453
469
|
*/
|
|
454
470
|
|
|
471
|
+
/** An update applied or recovered at this launch, as native persisted it. */
|
|
472
|
+
|
|
455
473
|
const isPersistedUpdateStrategy = value => {
|
|
456
474
|
return value === "appVersion" || value === "fingerprint";
|
|
457
475
|
};
|
|
@@ -517,7 +535,7 @@ const getNotifyAppReadyTransition = result => {
|
|
|
517
535
|
}
|
|
518
536
|
return null;
|
|
519
537
|
};
|
|
520
|
-
const
|
|
538
|
+
const getLaunchTransition = result => {
|
|
521
539
|
const transition = getNotifyAppReadyTransition(result);
|
|
522
540
|
if (!transition || !isPersistedUpdateStrategy(result.updateStrategy)) {
|
|
523
541
|
return null;
|
|
@@ -526,12 +544,8 @@ const getNotifyAppReadyInsightsEvent = result => {
|
|
|
526
544
|
type: transition.status,
|
|
527
545
|
fromBundleId: transition.fromBundleId,
|
|
528
546
|
toBundleId: transition.toBundleId,
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
}),
|
|
532
|
-
...(transition.toReleaseId === null ? {} : {
|
|
533
|
-
toReleaseId: transition.toReleaseId
|
|
534
|
-
}),
|
|
547
|
+
fromReleaseId: transition.fromReleaseId,
|
|
548
|
+
toReleaseId: transition.toReleaseId,
|
|
535
549
|
updateStrategy: result.updateStrategy
|
|
536
550
|
};
|
|
537
551
|
};
|
|
@@ -558,7 +572,7 @@ export const readNotifyAppReady = () => {
|
|
|
558
572
|
const rawResult = readRawNotifyAppReadyResult();
|
|
559
573
|
return {
|
|
560
574
|
result: normalizeNotifyAppReadyResult(rawResult),
|
|
561
|
-
|
|
575
|
+
transition: getLaunchTransition(rawResult),
|
|
562
576
|
pending: rawResult.status === "PENDING"
|
|
563
577
|
};
|
|
564
578
|
};
|