@hot-updater/react-native 1.0.0-rc.4 → 1.0.0-rc.41
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 +96 -0
- package/lib/commonjs/appReady.js.map +1 -0
- package/lib/commonjs/checkForUpdate.js +121 -69
- 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 +5 -14
- 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 +64 -95
- package/lib/commonjs/httpClient.js.map +1 -1
- package/lib/commonjs/index.js +355 -324
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/init.types.js +6 -0
- package/lib/commonjs/init.types.js.map +1 -0
- package/lib/commonjs/native.js +77 -63
- package/lib/commonjs/native.js.map +1 -1
- package/lib/commonjs/pluginHost.js +41 -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 +46 -38
- package/lib/commonjs/wrap.js.map +1 -1
- package/lib/module/appReady.js +90 -0
- package/lib/module/appReady.js.map +1 -0
- package/lib/module/checkForUpdate.js +114 -64
- 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 +5 -14
- 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 +63 -94
- package/lib/module/httpClient.js.map +1 -1
- package/lib/module/index.js +335 -327
- package/lib/module/index.js.map +1 -1
- package/lib/module/init.types.js +4 -0
- package/lib/module/init.types.js.map +1 -0
- package/lib/module/native.js +70 -56
- 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 +47 -38
- package/lib/module/wrap.js.map +1 -1
- package/lib/typescript/commonjs/appReady.d.ts +30 -0
- package/lib/typescript/commonjs/appReady.d.ts.map +1 -0
- package/lib/typescript/commonjs/checkForUpdate.d.ts +20 -6
- 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 +5 -14
- 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 +5 -34
- package/lib/typescript/commonjs/httpClient.d.ts.map +1 -1
- package/lib/typescript/commonjs/index.d.ts +124 -116
- package/lib/typescript/commonjs/index.d.ts.map +1 -1
- package/lib/typescript/commonjs/init.types.d.ts +21 -0
- package/lib/typescript/commonjs/init.types.d.ts.map +1 -0
- package/lib/typescript/commonjs/native.d.ts +32 -25
- package/lib/typescript/commonjs/native.d.ts.map +1 -1
- package/lib/typescript/commonjs/pluginHost.d.ts +8 -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 +2 -3
- package/lib/typescript/commonjs/wrap.d.ts.map +1 -1
- package/lib/typescript/commonjs/wrap.types.d.ts +13 -41
- package/lib/typescript/commonjs/wrap.types.d.ts.map +1 -1
- package/lib/typescript/module/appReady.d.ts +30 -0
- package/lib/typescript/module/appReady.d.ts.map +1 -0
- package/lib/typescript/module/checkForUpdate.d.ts +20 -6
- 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 +5 -14
- 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 +5 -34
- package/lib/typescript/module/httpClient.d.ts.map +1 -1
- package/lib/typescript/module/index.d.ts +124 -116
- package/lib/typescript/module/index.d.ts.map +1 -1
- package/lib/typescript/module/init.types.d.ts +21 -0
- package/lib/typescript/module/init.types.d.ts.map +1 -0
- package/lib/typescript/module/native.d.ts +32 -25
- package/lib/typescript/module/native.d.ts.map +1 -1
- package/lib/typescript/module/pluginHost.d.ts +8 -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 +2 -3
- package/lib/typescript/module/wrap.d.ts.map +1 -1
- package/lib/typescript/module/wrap.types.d.ts +13 -41
- package/lib/typescript/module/wrap.types.d.ts.map +1 -1
- package/package.json +8 -4
- package/src/appReady.ts +147 -0
- package/src/checkForUpdate.ts +156 -89
- package/src/clientPlugin.ts +21 -0
- package/src/error.ts +5 -15
- package/src/fetchJSON.ts +14 -30
- package/src/fetchUpdateResponse.ts +60 -0
- package/src/httpClient.ts +89 -160
- package/src/index.ts +413 -425
- package/src/init.types.ts +24 -0
- package/src/native.ts +101 -105
- package/src/pluginHost.ts +52 -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 +60 -43
- package/src/wrap.types.ts +18 -46
- 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
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { HotUpdaterClientPlugin } from "./clientPlugin";
|
|
2
|
+
import type { HotUpdaterError } from "./error";
|
|
3
|
+
import type { NotifyAppReadyResult } from "./native";
|
|
4
|
+
import type { HotUpdaterBaseURL } from "./types";
|
|
5
|
+
|
|
6
|
+
export interface HotUpdaterInitOptions<
|
|
7
|
+
TPlugins extends readonly HotUpdaterClientPlugin[] =
|
|
8
|
+
readonly HotUpdaterClientPlugin[],
|
|
9
|
+
> {
|
|
10
|
+
/**
|
|
11
|
+
* Client plugins, such as `insights()` and `remoteConfig()` from
|
|
12
|
+
* `@hot-updater/react-native`. Each plugin's `setup` runs once for the
|
|
13
|
+
* instance `init` returns; its hooks observe that instance's launch,
|
|
14
|
+
* update checks, downloads, and update failures, and its API is on the
|
|
15
|
+
* instance, under the plugin's id. Plugin ids must be unique.
|
|
16
|
+
*/
|
|
17
|
+
plugins?: TPlugins;
|
|
18
|
+
/** Base URL of a server exposing the Hot Updater v1 client HTTP protocol. */
|
|
19
|
+
baseURL: HotUpdaterBaseURL;
|
|
20
|
+
requestHeaders?: Record<string, string>;
|
|
21
|
+
requestTimeout?: number;
|
|
22
|
+
onNotifyAppReady?: (result: NotifyAppReadyResult) => void;
|
|
23
|
+
onError?: (error: HotUpdaterError | Error | unknown) => void;
|
|
24
|
+
}
|
package/src/native.ts
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import {
|
|
2
|
-
type
|
|
2
|
+
type ArtifactAsset,
|
|
3
3
|
type CatalogHighWater,
|
|
4
4
|
INVALID_COHORT_ERROR_MESSAGE,
|
|
5
5
|
isValidCohort,
|
|
6
6
|
normalizeCohortValue,
|
|
7
7
|
type UpdateStatus,
|
|
8
8
|
type PersistedSelectionReceipt,
|
|
9
|
-
} from "@hot-updater/
|
|
9
|
+
} from "@hot-updater/protocol";
|
|
10
10
|
import { NativeEventEmitter, Platform } from "react-native";
|
|
11
11
|
|
|
12
12
|
import { HotUpdaterErrorCode, isHotUpdaterError } from "./error";
|
|
@@ -46,7 +46,7 @@ type ActiveBundleSnapshotCacheValues = {
|
|
|
46
46
|
type ActiveBundleSnapshotCacheKey = keyof ActiveBundleSnapshotCacheValues;
|
|
47
47
|
|
|
48
48
|
/**
|
|
49
|
-
* Built-in reload behaviors used by `
|
|
49
|
+
* Built-in reload behaviors used by `hotUpdater.reload()`.
|
|
50
50
|
*
|
|
51
51
|
* - `reload`: In-process React Native reload.
|
|
52
52
|
* - `processRestart`: Android-only cold restart. On iOS the same call behaves like `reload`.
|
|
@@ -74,7 +74,10 @@ class HotUpdaterSessionState {
|
|
|
74
74
|
private readonly defaultChannel: string;
|
|
75
75
|
private currentChannel: string;
|
|
76
76
|
private cachedCohort: string | undefined;
|
|
77
|
-
private readonly inflightUpdates = new Map<
|
|
77
|
+
private readonly inflightUpdates = new Map<
|
|
78
|
+
string,
|
|
79
|
+
Promise<BundleDelivery | null>
|
|
80
|
+
>();
|
|
78
81
|
private lastInstalledBundleId: string | null = null;
|
|
79
82
|
private readonly activeBundleSnapshotCache = new Map<
|
|
80
83
|
ActiveBundleSnapshotCacheKey,
|
|
@@ -103,11 +106,16 @@ class HotUpdaterSessionState {
|
|
|
103
106
|
return this.lastInstalledBundleId === bundleId;
|
|
104
107
|
}
|
|
105
108
|
|
|
106
|
-
getInflightUpdate(
|
|
109
|
+
getInflightUpdate(
|
|
110
|
+
bundleId: string,
|
|
111
|
+
): Promise<BundleDelivery | null> | undefined {
|
|
107
112
|
return this.inflightUpdates.get(bundleId);
|
|
108
113
|
}
|
|
109
114
|
|
|
110
|
-
trackInflightUpdate(
|
|
115
|
+
trackInflightUpdate(
|
|
116
|
+
bundleId: string,
|
|
117
|
+
promise: Promise<BundleDelivery | null>,
|
|
118
|
+
) {
|
|
111
119
|
this.inflightUpdates.set(bundleId, promise);
|
|
112
120
|
}
|
|
113
121
|
|
|
@@ -234,7 +242,7 @@ const getReloadProcess = (): (() => Promise<void>) | null => {
|
|
|
234
242
|
: null;
|
|
235
243
|
};
|
|
236
244
|
|
|
237
|
-
export type HotUpdaterProgressArtifactType = "
|
|
245
|
+
export type HotUpdaterProgressArtifactType = "diff";
|
|
238
246
|
|
|
239
247
|
export type HotUpdaterDiffFileStatus =
|
|
240
248
|
| "pending"
|
|
@@ -286,18 +294,11 @@ export interface HotUpdaterDiffProgressDetails {
|
|
|
286
294
|
files: HotUpdaterDiffFileSnapshot[];
|
|
287
295
|
}
|
|
288
296
|
|
|
289
|
-
export type HotUpdaterProgressEvent =
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
totalBytes?: number;
|
|
295
|
-
}
|
|
296
|
-
| {
|
|
297
|
-
progress: number;
|
|
298
|
-
artifactType: "diff";
|
|
299
|
-
details: HotUpdaterDiffProgressDetails;
|
|
300
|
-
};
|
|
297
|
+
export type HotUpdaterProgressEvent = {
|
|
298
|
+
progress: number;
|
|
299
|
+
artifactType: "diff";
|
|
300
|
+
details: HotUpdaterDiffProgressDetails;
|
|
301
|
+
};
|
|
301
302
|
|
|
302
303
|
export type HotUpdaterEvent = {
|
|
303
304
|
onProgress: HotUpdaterProgressEvent;
|
|
@@ -424,18 +425,42 @@ export const commitReleaseSelection = async (input: {
|
|
|
424
425
|
return ok;
|
|
425
426
|
};
|
|
426
427
|
|
|
428
|
+
/** How native delivered a staged bundle. */
|
|
429
|
+
export type BundleDelivery = {
|
|
430
|
+
/**
|
|
431
|
+
* "patch" when a bsdiff patch produced a file, "manifest" when only the
|
|
432
|
+
* changed files were downloaded, "archive" for the full archive.
|
|
433
|
+
*/
|
|
434
|
+
readonly delivery: "patch" | "manifest" | "archive";
|
|
435
|
+
/** A patch was tried, but the file or the archive was downloaded instead. */
|
|
436
|
+
readonly patchFallback: boolean;
|
|
437
|
+
};
|
|
438
|
+
|
|
439
|
+
const readBundleDelivery = (value: unknown): BundleDelivery | null => {
|
|
440
|
+
if (typeof value !== "object" || value === null) return null;
|
|
441
|
+
const { delivery, patchFallback } = value as Record<string, unknown>;
|
|
442
|
+
if (
|
|
443
|
+
delivery !== "patch" &&
|
|
444
|
+
delivery !== "manifest" &&
|
|
445
|
+
delivery !== "archive"
|
|
446
|
+
) {
|
|
447
|
+
return null;
|
|
448
|
+
}
|
|
449
|
+
return { delivery, patchFallback: patchFallback === true };
|
|
450
|
+
};
|
|
451
|
+
|
|
427
452
|
/**
|
|
428
|
-
*
|
|
453
|
+
* Stages a bundle for the next launch. Resolves with how native delivered
|
|
454
|
+
* it, or with null when this runtime had already staged it and nothing was
|
|
455
|
+
* downloaded; rejects when the download or install fails.
|
|
429
456
|
*
|
|
430
|
-
* @param {UpdateParams} params - Parameters object required for bundle update
|
|
431
|
-
* @returns {Promise<boolean>} Resolves with true if download was successful
|
|
432
457
|
* @throws {Error} Rejects with error.code from HotUpdaterErrorCode enum and error.message
|
|
433
458
|
*/
|
|
434
|
-
export async function
|
|
459
|
+
export async function stageBundle(
|
|
460
|
+
params: UpdateParams,
|
|
461
|
+
): Promise<BundleDelivery | null> {
|
|
435
462
|
const updateBundleId = params.bundleId;
|
|
436
463
|
const status = params.status;
|
|
437
|
-
const targetFileUrl = params.fileUrl;
|
|
438
|
-
|
|
439
464
|
const currentBundleId = status === "UPDATE" ? getFreshBundleId() : undefined;
|
|
440
465
|
|
|
441
466
|
// If native is still on the same bundle we installed in this session,
|
|
@@ -446,7 +471,7 @@ export async function updateBundle(params: UpdateParams): Promise<boolean> {
|
|
|
446
471
|
sessionState.hasInstalledBundle(updateBundleId) &&
|
|
447
472
|
currentBundleId === updateBundleId
|
|
448
473
|
) {
|
|
449
|
-
return
|
|
474
|
+
return null;
|
|
450
475
|
}
|
|
451
476
|
|
|
452
477
|
const shouldSkipCurrentBundleIdCheck =
|
|
@@ -467,30 +492,25 @@ export async function updateBundle(params: UpdateParams): Promise<boolean> {
|
|
|
467
492
|
const existing = sessionState.getInflightUpdate(updateBundleId);
|
|
468
493
|
if (existing) return existing;
|
|
469
494
|
|
|
470
|
-
const targetFileHash = params.fileHash;
|
|
471
495
|
const targetChannel = params.channel;
|
|
472
496
|
const targetManifestUrl = params.manifestUrl;
|
|
473
497
|
const targetManifestFileHash = params.manifestFileHash;
|
|
474
|
-
const
|
|
498
|
+
const targetAssets = params.assets;
|
|
475
499
|
|
|
476
500
|
const promise = (async () => {
|
|
477
501
|
try {
|
|
478
502
|
const selection = params.selection;
|
|
479
|
-
const
|
|
503
|
+
const staged = await HotUpdaterNative.updateBundle({
|
|
480
504
|
bundleId: updateBundleId,
|
|
481
505
|
channel: targetChannel,
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
manifestFileHash: targetManifestFileHash ?? null,
|
|
487
|
-
manifestUrl: targetManifestUrl ?? null,
|
|
506
|
+
assets: targetAssets as Record<string, ArtifactAsset>,
|
|
507
|
+
manifestFileHash: targetManifestFileHash,
|
|
508
|
+
manifestUrl: targetManifestUrl,
|
|
509
|
+
...(params.archiveUrl ? { archiveUrl: params.archiveUrl } : {}),
|
|
488
510
|
...(selection === undefined ? {} : { selection }),
|
|
489
511
|
});
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
}
|
|
493
|
-
return ok;
|
|
512
|
+
sessionState.markBundleInstalled(updateBundleId, targetChannel);
|
|
513
|
+
return readBundleDelivery(staged);
|
|
494
514
|
} finally {
|
|
495
515
|
sessionState.clearInflightUpdate(updateBundleId);
|
|
496
516
|
}
|
|
@@ -500,6 +520,18 @@ export async function updateBundle(params: UpdateParams): Promise<boolean> {
|
|
|
500
520
|
return promise;
|
|
501
521
|
}
|
|
502
522
|
|
|
523
|
+
/**
|
|
524
|
+
* Downloads files and applies them to the app.
|
|
525
|
+
*
|
|
526
|
+
* @param {UpdateParams} params - Parameters object required for bundle update
|
|
527
|
+
* @returns {Promise<boolean>} Resolves with true if download was successful
|
|
528
|
+
* @throws {Error} Rejects with error.code from HotUpdaterErrorCode enum and error.message
|
|
529
|
+
*/
|
|
530
|
+
export async function updateBundle(params: UpdateParams): Promise<boolean> {
|
|
531
|
+
await stageBundle(params);
|
|
532
|
+
return true;
|
|
533
|
+
}
|
|
534
|
+
|
|
503
535
|
/**
|
|
504
536
|
* Fetches the current app version.
|
|
505
537
|
*/
|
|
@@ -546,7 +578,7 @@ export const reload = async () => {
|
|
|
546
578
|
};
|
|
547
579
|
|
|
548
580
|
/**
|
|
549
|
-
* Configures how `
|
|
581
|
+
* Configures how `hotUpdater.reload()` should behave.
|
|
550
582
|
*
|
|
551
583
|
* This API is available on both Android and iOS so app code can stay symmetric.
|
|
552
584
|
* By default, HotUpdater uses `processRestart`.
|
|
@@ -705,64 +737,31 @@ export const getInstallId = (): string => {
|
|
|
705
737
|
return nativeModule.getInstallId();
|
|
706
738
|
};
|
|
707
739
|
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
export const getPersistedUserIdentity = (): PersistedUserIdentity => {
|
|
714
|
-
const nativeModule = HotUpdaterNative as typeof HotUpdaterNative & {
|
|
715
|
-
getUserId?: () => string | null;
|
|
716
|
-
getUsername?: () => string | null;
|
|
717
|
-
};
|
|
718
|
-
|
|
719
|
-
if (
|
|
720
|
-
typeof nativeModule.getUserId !== "function" ||
|
|
721
|
-
typeof nativeModule.getUsername !== "function"
|
|
722
|
-
) {
|
|
740
|
+
const requireStorageNativeMethod = <T extends (...args: any[]) => any>(
|
|
741
|
+
name: "getStorageItem" | "setStorageItem",
|
|
742
|
+
): T => {
|
|
743
|
+
const method = (HotUpdaterNative as unknown as Record<string, unknown>)[name];
|
|
744
|
+
if (typeof method !== "function") {
|
|
723
745
|
throw new Error(
|
|
724
|
-
|
|
746
|
+
`[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.`,
|
|
725
747
|
);
|
|
726
748
|
}
|
|
727
|
-
|
|
728
|
-
const userId = nativeModule.getUserId();
|
|
729
|
-
const username = nativeModule.getUsername();
|
|
730
|
-
|
|
731
|
-
return {
|
|
732
|
-
...(userId != null ? { userId } : {}),
|
|
733
|
-
...(username != null ? { username } : {}),
|
|
734
|
-
};
|
|
749
|
+
return method.bind(HotUpdaterNative) as T;
|
|
735
750
|
};
|
|
736
751
|
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
752
|
+
/** Reads a value from the SDK's native key-value store. */
|
|
753
|
+
export const getStorageItem = (key: string): string | null => {
|
|
754
|
+
const value =
|
|
755
|
+
requireStorageNativeMethod<(key: string) => unknown>("getStorageItem")(key);
|
|
756
|
+
return typeof value === "string" ? value : null;
|
|
740
757
|
};
|
|
741
758
|
|
|
742
|
-
|
|
743
|
-
export
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
if (typeof nativeModule.setUser !== "function") {
|
|
750
|
-
throw new Error(
|
|
751
|
-
"[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.",
|
|
752
|
-
);
|
|
753
|
-
}
|
|
754
|
-
|
|
755
|
-
if (params === null) {
|
|
756
|
-
nativeModule.setUser(null, null);
|
|
757
|
-
return;
|
|
758
|
-
}
|
|
759
|
-
|
|
760
|
-
const normalizedUserId =
|
|
761
|
-
params.userId === null || params.userId === undefined
|
|
762
|
-
? null
|
|
763
|
-
: String(params.userId);
|
|
764
|
-
nativeModule.setUser(normalizedUserId, params.username ?? null);
|
|
765
|
-
}
|
|
759
|
+
/** Writes a value to the SDK's native key-value store; null removes it. */
|
|
760
|
+
export const setStorageItem = (key: string, value: string | null): void => {
|
|
761
|
+
requireStorageNativeMethod<(key: string, value: string | null) => void>(
|
|
762
|
+
"setStorageItem",
|
|
763
|
+
)(key, value);
|
|
764
|
+
};
|
|
766
765
|
|
|
767
766
|
/**
|
|
768
767
|
* Result returned by notifyAppReady()
|
|
@@ -784,12 +783,13 @@ export type NotifyAppReadyResult =
|
|
|
784
783
|
toReleaseId?: string;
|
|
785
784
|
};
|
|
786
785
|
|
|
787
|
-
|
|
786
|
+
/** An update applied or recovered at this launch, as native persisted it. */
|
|
787
|
+
export type LaunchTransition = {
|
|
788
788
|
type: "UPDATE_APPLIED" | "RECOVERED";
|
|
789
789
|
fromBundleId: string;
|
|
790
790
|
toBundleId: string;
|
|
791
|
-
fromReleaseId
|
|
792
|
-
toReleaseId
|
|
791
|
+
fromReleaseId: string | null;
|
|
792
|
+
toReleaseId: string | null;
|
|
793
793
|
updateStrategy: PersistedUpdateStrategy;
|
|
794
794
|
};
|
|
795
795
|
|
|
@@ -892,9 +892,9 @@ const getNotifyAppReadyTransition = (
|
|
|
892
892
|
return null;
|
|
893
893
|
};
|
|
894
894
|
|
|
895
|
-
const
|
|
895
|
+
const getLaunchTransition = (
|
|
896
896
|
result: RawNotifyAppReadyResult,
|
|
897
|
-
):
|
|
897
|
+
): LaunchTransition | null => {
|
|
898
898
|
const transition = getNotifyAppReadyTransition(result);
|
|
899
899
|
|
|
900
900
|
if (!transition || !isPersistedUpdateStrategy(result.updateStrategy)) {
|
|
@@ -905,12 +905,8 @@ const getNotifyAppReadyInsightsEvent = (
|
|
|
905
905
|
type: transition.status,
|
|
906
906
|
fromBundleId: transition.fromBundleId,
|
|
907
907
|
toBundleId: transition.toBundleId,
|
|
908
|
-
|
|
909
|
-
|
|
910
|
-
: { fromReleaseId: transition.fromReleaseId }),
|
|
911
|
-
...(transition.toReleaseId === null
|
|
912
|
-
? {}
|
|
913
|
-
: { toReleaseId: transition.toReleaseId }),
|
|
908
|
+
fromReleaseId: transition.fromReleaseId,
|
|
909
|
+
toReleaseId: transition.toReleaseId,
|
|
914
910
|
updateStrategy: result.updateStrategy,
|
|
915
911
|
};
|
|
916
912
|
};
|
|
@@ -939,14 +935,14 @@ const normalizeNotifyAppReadyResult = (
|
|
|
939
935
|
|
|
940
936
|
export const readNotifyAppReady = (): {
|
|
941
937
|
result: NotifyAppReadyResult;
|
|
942
|
-
|
|
938
|
+
transition: LaunchTransition | null;
|
|
943
939
|
pending: boolean;
|
|
944
940
|
} => {
|
|
945
941
|
const rawResult = readRawNotifyAppReadyResult();
|
|
946
942
|
|
|
947
943
|
return {
|
|
948
944
|
result: normalizeNotifyAppReadyResult(rawResult),
|
|
949
|
-
|
|
945
|
+
transition: getLaunchTransition(rawResult),
|
|
950
946
|
pending: rawResult.status === "PENDING",
|
|
951
947
|
};
|
|
952
948
|
};
|
|
@@ -963,7 +959,7 @@ export const readNotifyAppReady = (): {
|
|
|
963
959
|
*
|
|
964
960
|
* @example
|
|
965
961
|
* ```ts
|
|
966
|
-
* const result =
|
|
962
|
+
* const result = hotUpdater.notifyAppReady();
|
|
967
963
|
*
|
|
968
964
|
* if (result.status === "RECOVERED") {
|
|
969
965
|
* console.log(result.fromBundleId, result.toBundleId);
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import {
|
|
2
|
+
createPluginHost,
|
|
3
|
+
type PluginHost,
|
|
4
|
+
type PluginHostEnvironment,
|
|
5
|
+
} from "@hot-updater/protocol";
|
|
6
|
+
import { Platform } from "react-native";
|
|
7
|
+
|
|
8
|
+
import {
|
|
9
|
+
getAppVersion,
|
|
10
|
+
getBundleId,
|
|
11
|
+
getChannel,
|
|
12
|
+
getCohort,
|
|
13
|
+
getFingerprintHash,
|
|
14
|
+
getInstallId,
|
|
15
|
+
getMinBundleId,
|
|
16
|
+
getStorageItem,
|
|
17
|
+
setStorageItem,
|
|
18
|
+
} from "./native";
|
|
19
|
+
import { HOT_UPDATER_SDK_VERSION } from "./sdkVersion";
|
|
20
|
+
|
|
21
|
+
export type { PluginHost, PluginHostConfig } from "@hot-updater/protocol";
|
|
22
|
+
|
|
23
|
+
/** The native module and runtime every plugin host reads. */
|
|
24
|
+
const environment: PluginHostEnvironment = {
|
|
25
|
+
fetch: (url, init) => fetch(url, init),
|
|
26
|
+
get platform() {
|
|
27
|
+
return Platform.OS === "android" ? "android" : "ios";
|
|
28
|
+
},
|
|
29
|
+
get isDebugBuild() {
|
|
30
|
+
return typeof __DEV__ !== "undefined" && __DEV__;
|
|
31
|
+
},
|
|
32
|
+
get sdkVersion() {
|
|
33
|
+
return HOT_UPDATER_SDK_VERSION;
|
|
34
|
+
},
|
|
35
|
+
getInstallId: () => getInstallId(),
|
|
36
|
+
getAppVersion: () => getAppVersion(),
|
|
37
|
+
getMinBundleId: () => getMinBundleId(),
|
|
38
|
+
getBundleId: () => getBundleId(),
|
|
39
|
+
getChannel: () => getChannel(),
|
|
40
|
+
getCohort: () => getCohort(),
|
|
41
|
+
getFingerprintHash: () => getFingerprintHash(),
|
|
42
|
+
getStorageItem: (key) => getStorageItem(key),
|
|
43
|
+
setStorageItem: (key, value) => setStorageItem(key, value),
|
|
44
|
+
now: () => Date.now(),
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Creates an instance's plugin host: its plugins read the native module and
|
|
49
|
+
* fetch the server the instance was configured with.
|
|
50
|
+
*/
|
|
51
|
+
export const createAppPluginHost = (): PluginHost =>
|
|
52
|
+
createPluginHost(environment);
|