@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.
Files changed (317) hide show
  1. package/android/build.gradle +13 -2
  2. package/android/proguard-rules.pro +8 -2
  3. package/android/src/bridge/BridgeReactInstance.kt +38 -0
  4. package/android/src/bridgeless/BridgeReactInstance.kt +24 -0
  5. package/android/src/main/java/com/hotupdater/ActivityStartGate.kt +94 -0
  6. package/android/src/main/java/com/hotupdater/BuiltInAssetResolver.kt +286 -0
  7. package/android/src/main/java/com/hotupdater/BundleFileStorageService.kt +1064 -844
  8. package/android/src/main/java/com/hotupdater/BundleMetadata.kt +50 -11
  9. package/android/src/main/java/com/hotupdater/FileManagerService.kt +45 -0
  10. package/android/src/main/java/com/hotupdater/HotUpdaterException.kt +287 -22
  11. package/android/src/main/java/com/hotupdater/HotUpdaterImpl.kt +46 -30
  12. package/android/src/main/java/com/hotupdater/HotUpdaterRecoveryManager.kt +75 -192
  13. package/android/src/main/java/com/hotupdater/HotUpdaterRecoveryState.kt +64 -0
  14. package/android/src/main/java/com/hotupdater/InstallIdentityService.kt +37 -0
  15. package/android/src/main/java/com/hotupdater/KeyValueStorageService.kt +86 -0
  16. package/android/src/main/java/com/hotupdater/NetworkState.kt +31 -0
  17. package/android/src/main/java/com/hotupdater/NoBackupStorage.kt +17 -0
  18. package/android/src/main/java/com/hotupdater/OkHttpDownloadService.kt +127 -50
  19. package/android/src/main/java/com/hotupdater/ReactNativeValueConverters.kt +34 -0
  20. package/android/src/main/java/com/hotupdater/TarArchiveInputStream.kt +214 -375
  21. package/android/src/main/java/com/hotupdater/TarBrArchiveExtractor.kt +119 -0
  22. package/android/src/newarch/HotUpdater.kt +7 -9
  23. package/android/src/newarch/HotUpdaterModule.kt +109 -84
  24. package/android/src/newarch/JavaScriptExceptionHooks.kt +48 -0
  25. package/android/src/newarch/ReactIntegrationManager.kt +6 -32
  26. package/android/src/oldarch/HotUpdater.kt +7 -9
  27. package/android/src/oldarch/HotUpdaterModule.kt +98 -74
  28. package/android/src/oldarch/HotUpdaterSpec.kt +4 -6
  29. package/android/src/oldarch/JavaScriptExceptionHooks.kt +71 -0
  30. package/ios/HotUpdater/Internal/BrotliFileDecompressor.swift +167 -0
  31. package/ios/HotUpdater/Internal/BuiltInAssetResolver.swift +196 -0
  32. package/ios/HotUpdater/Internal/BundleFileStorageService.swift +1032 -1116
  33. package/ios/HotUpdater/Internal/BundleMetadata.swift +61 -54
  34. package/ios/HotUpdater/Internal/FileManagerService.swift +48 -0
  35. package/ios/HotUpdater/Internal/FileUtilities.swift +64 -0
  36. package/ios/HotUpdater/Internal/HotUpdater-Bridging-Header.h +0 -1
  37. package/ios/HotUpdater/Internal/HotUpdater.mm +32 -67
  38. package/ios/HotUpdater/Internal/HotUpdaterImpl.swift +229 -73
  39. package/ios/HotUpdater/Internal/KeyValueStorageService.swift +71 -0
  40. package/ios/HotUpdater/Internal/NotificationExtension.swift +0 -2
  41. package/ios/HotUpdater/Internal/TarArchiveExtractor.swift +182 -311
  42. package/ios/HotUpdater/Internal/URLSessionDownloadService.swift +119 -71
  43. package/ios/HotUpdater/Internal/UpdateFailure.swift +390 -0
  44. package/ios/HotUpdater/Recovery/HotUpdaterRecovery.h +16 -0
  45. package/ios/HotUpdater/Recovery/HotUpdaterRecovery.mm +83 -0
  46. package/ios/HotUpdater/Recovery/HotUpdaterRecoveryHooks.mm +49 -0
  47. package/lib/commonjs/appReady.js +96 -0
  48. package/lib/commonjs/appReady.js.map +1 -0
  49. package/lib/commonjs/checkForUpdate.js +121 -69
  50. package/lib/commonjs/checkForUpdate.js.map +1 -1
  51. package/lib/commonjs/clientPlugin.js +13 -0
  52. package/lib/commonjs/clientPlugin.js.map +1 -0
  53. package/lib/commonjs/error.js +5 -14
  54. package/lib/commonjs/error.js.map +1 -1
  55. package/lib/commonjs/fetchJSON.js +16 -27
  56. package/lib/commonjs/fetchJSON.js.map +1 -1
  57. package/lib/commonjs/fetchUpdateResponse.js +60 -0
  58. package/lib/commonjs/fetchUpdateResponse.js.map +1 -0
  59. package/lib/commonjs/httpClient.js +64 -95
  60. package/lib/commonjs/httpClient.js.map +1 -1
  61. package/lib/commonjs/index.js +355 -324
  62. package/lib/commonjs/index.js.map +1 -1
  63. package/lib/commonjs/init.types.js +6 -0
  64. package/lib/commonjs/init.types.js.map +1 -0
  65. package/lib/commonjs/native.js +77 -63
  66. package/lib/commonjs/native.js.map +1 -1
  67. package/lib/commonjs/pluginHost.js +41 -0
  68. package/lib/commonjs/pluginHost.js.map +1 -0
  69. package/lib/commonjs/releaseCatalogCache.js +36 -87
  70. package/lib/commonjs/releaseCatalogCache.js.map +1 -1
  71. package/lib/commonjs/sdkVersion.js +1 -1
  72. package/lib/commonjs/sdkVersion.js.map +1 -1
  73. package/lib/commonjs/specs/NativeHotUpdater.js.map +1 -1
  74. package/lib/commonjs/store.js +3 -10
  75. package/lib/commonjs/store.js.map +1 -1
  76. package/lib/commonjs/updateError.js +145 -0
  77. package/lib/commonjs/updateError.js.map +1 -0
  78. package/lib/commonjs/wrap.js +46 -38
  79. package/lib/commonjs/wrap.js.map +1 -1
  80. package/lib/module/appReady.js +90 -0
  81. package/lib/module/appReady.js.map +1 -0
  82. package/lib/module/checkForUpdate.js +114 -64
  83. package/lib/module/checkForUpdate.js.map +1 -1
  84. package/lib/module/clientPlugin.js +4 -0
  85. package/lib/module/clientPlugin.js.map +1 -0
  86. package/lib/module/error.js +5 -14
  87. package/lib/module/error.js.map +1 -1
  88. package/lib/module/fetchJSON.js +14 -26
  89. package/lib/module/fetchJSON.js.map +1 -1
  90. package/lib/module/fetchUpdateResponse.js +55 -0
  91. package/lib/module/fetchUpdateResponse.js.map +1 -0
  92. package/lib/module/httpClient.js +63 -94
  93. package/lib/module/httpClient.js.map +1 -1
  94. package/lib/module/index.js +335 -327
  95. package/lib/module/index.js.map +1 -1
  96. package/lib/module/init.types.js +4 -0
  97. package/lib/module/init.types.js.map +1 -0
  98. package/lib/module/native.js +70 -56
  99. package/lib/module/native.js.map +1 -1
  100. package/lib/module/pluginHost.js +36 -0
  101. package/lib/module/pluginHost.js.map +1 -0
  102. package/lib/module/releaseCatalogCache.js +32 -82
  103. package/lib/module/releaseCatalogCache.js.map +1 -1
  104. package/lib/module/sdkVersion.js +1 -1
  105. package/lib/module/sdkVersion.js.map +1 -1
  106. package/lib/module/specs/NativeHotUpdater.js.map +1 -1
  107. package/lib/module/store.js +3 -10
  108. package/lib/module/store.js.map +1 -1
  109. package/lib/module/updateError.js +139 -0
  110. package/lib/module/updateError.js.map +1 -0
  111. package/lib/module/wrap.js +47 -38
  112. package/lib/module/wrap.js.map +1 -1
  113. package/lib/typescript/commonjs/appReady.d.ts +30 -0
  114. package/lib/typescript/commonjs/appReady.d.ts.map +1 -0
  115. package/lib/typescript/commonjs/checkForUpdate.d.ts +20 -6
  116. package/lib/typescript/commonjs/checkForUpdate.d.ts.map +1 -1
  117. package/lib/typescript/commonjs/clientPlugin.d.ts +2 -0
  118. package/lib/typescript/commonjs/clientPlugin.d.ts.map +1 -0
  119. package/lib/typescript/commonjs/error.d.ts +5 -14
  120. package/lib/typescript/commonjs/error.d.ts.map +1 -1
  121. package/lib/typescript/commonjs/fetchJSON.d.ts +5 -5
  122. package/lib/typescript/commonjs/fetchJSON.d.ts.map +1 -1
  123. package/lib/typescript/commonjs/fetchUpdateResponse.d.ts +14 -0
  124. package/lib/typescript/commonjs/fetchUpdateResponse.d.ts.map +1 -0
  125. package/lib/typescript/commonjs/httpClient.d.ts +5 -34
  126. package/lib/typescript/commonjs/httpClient.d.ts.map +1 -1
  127. package/lib/typescript/commonjs/index.d.ts +124 -116
  128. package/lib/typescript/commonjs/index.d.ts.map +1 -1
  129. package/lib/typescript/commonjs/init.types.d.ts +21 -0
  130. package/lib/typescript/commonjs/init.types.d.ts.map +1 -0
  131. package/lib/typescript/commonjs/native.d.ts +32 -25
  132. package/lib/typescript/commonjs/native.d.ts.map +1 -1
  133. package/lib/typescript/commonjs/pluginHost.d.ts +8 -0
  134. package/lib/typescript/commonjs/pluginHost.d.ts.map +1 -0
  135. package/lib/typescript/commonjs/releaseCatalogCache.d.ts +8 -14
  136. package/lib/typescript/commonjs/releaseCatalogCache.d.ts.map +1 -1
  137. package/lib/typescript/commonjs/sdkVersion.d.ts +1 -1
  138. package/lib/typescript/commonjs/sdkVersion.d.ts.map +1 -1
  139. package/lib/typescript/commonjs/specs/NativeHotUpdater.d.ts +35 -47
  140. package/lib/typescript/commonjs/specs/NativeHotUpdater.d.ts.map +1 -1
  141. package/lib/typescript/commonjs/store.d.ts +1 -3
  142. package/lib/typescript/commonjs/store.d.ts.map +1 -1
  143. package/lib/typescript/commonjs/types.d.ts +1 -1
  144. package/lib/typescript/commonjs/types.d.ts.map +1 -1
  145. package/lib/typescript/commonjs/updateError.d.ts +26 -0
  146. package/lib/typescript/commonjs/updateError.d.ts.map +1 -0
  147. package/lib/typescript/commonjs/wrap.d.ts +2 -3
  148. package/lib/typescript/commonjs/wrap.d.ts.map +1 -1
  149. package/lib/typescript/commonjs/wrap.types.d.ts +13 -41
  150. package/lib/typescript/commonjs/wrap.types.d.ts.map +1 -1
  151. package/lib/typescript/module/appReady.d.ts +30 -0
  152. package/lib/typescript/module/appReady.d.ts.map +1 -0
  153. package/lib/typescript/module/checkForUpdate.d.ts +20 -6
  154. package/lib/typescript/module/checkForUpdate.d.ts.map +1 -1
  155. package/lib/typescript/module/clientPlugin.d.ts +2 -0
  156. package/lib/typescript/module/clientPlugin.d.ts.map +1 -0
  157. package/lib/typescript/module/error.d.ts +5 -14
  158. package/lib/typescript/module/error.d.ts.map +1 -1
  159. package/lib/typescript/module/fetchJSON.d.ts +5 -5
  160. package/lib/typescript/module/fetchJSON.d.ts.map +1 -1
  161. package/lib/typescript/module/fetchUpdateResponse.d.ts +14 -0
  162. package/lib/typescript/module/fetchUpdateResponse.d.ts.map +1 -0
  163. package/lib/typescript/module/httpClient.d.ts +5 -34
  164. package/lib/typescript/module/httpClient.d.ts.map +1 -1
  165. package/lib/typescript/module/index.d.ts +124 -116
  166. package/lib/typescript/module/index.d.ts.map +1 -1
  167. package/lib/typescript/module/init.types.d.ts +21 -0
  168. package/lib/typescript/module/init.types.d.ts.map +1 -0
  169. package/lib/typescript/module/native.d.ts +32 -25
  170. package/lib/typescript/module/native.d.ts.map +1 -1
  171. package/lib/typescript/module/pluginHost.d.ts +8 -0
  172. package/lib/typescript/module/pluginHost.d.ts.map +1 -0
  173. package/lib/typescript/module/releaseCatalogCache.d.ts +8 -14
  174. package/lib/typescript/module/releaseCatalogCache.d.ts.map +1 -1
  175. package/lib/typescript/module/sdkVersion.d.ts +1 -1
  176. package/lib/typescript/module/sdkVersion.d.ts.map +1 -1
  177. package/lib/typescript/module/specs/NativeHotUpdater.d.ts +35 -47
  178. package/lib/typescript/module/specs/NativeHotUpdater.d.ts.map +1 -1
  179. package/lib/typescript/module/store.d.ts +1 -3
  180. package/lib/typescript/module/store.d.ts.map +1 -1
  181. package/lib/typescript/module/types.d.ts +1 -1
  182. package/lib/typescript/module/types.d.ts.map +1 -1
  183. package/lib/typescript/module/updateError.d.ts +26 -0
  184. package/lib/typescript/module/updateError.d.ts.map +1 -0
  185. package/lib/typescript/module/wrap.d.ts +2 -3
  186. package/lib/typescript/module/wrap.d.ts.map +1 -1
  187. package/lib/typescript/module/wrap.types.d.ts +13 -41
  188. package/lib/typescript/module/wrap.types.d.ts.map +1 -1
  189. package/package.json +8 -4
  190. package/src/appReady.ts +147 -0
  191. package/src/checkForUpdate.ts +156 -89
  192. package/src/clientPlugin.ts +21 -0
  193. package/src/error.ts +5 -15
  194. package/src/fetchJSON.ts +14 -30
  195. package/src/fetchUpdateResponse.ts +60 -0
  196. package/src/httpClient.ts +89 -160
  197. package/src/index.ts +413 -425
  198. package/src/init.types.ts +24 -0
  199. package/src/native.ts +101 -105
  200. package/src/pluginHost.ts +52 -0
  201. package/src/releaseCatalogCache.ts +43 -172
  202. package/src/sdkVersion.ts +1 -1
  203. package/src/specs/NativeHotUpdater.ts +34 -48
  204. package/src/store.ts +2 -23
  205. package/src/types.ts +1 -1
  206. package/src/updateError.ts +167 -0
  207. package/src/wrap.tsx +60 -43
  208. package/src/wrap.types.ts +18 -46
  209. package/android/src/main/java/com/hotupdater/DecompressService.kt +0 -89
  210. package/android/src/main/java/com/hotupdater/DecompressionStrategy.kt +0 -26
  211. package/android/src/main/java/com/hotupdater/TarBrDecompressionStrategy.kt +0 -117
  212. package/android/src/main/java/com/hotupdater/TarGzDecompressionStrategy.kt +0 -117
  213. package/android/src/main/java/com/hotupdater/ZipDecompressionStrategy.kt +0 -192
  214. package/android/src/test/java/com/hotupdater/BsdiffPatchTest.kt +0 -46
  215. package/android/src/test/java/com/hotupdater/BundleFileStorageServiceTest.kt +0 -799
  216. package/android/src/test/java/com/hotupdater/HotUpdaterImplTest.kt +0 -273
  217. package/android/src/test/java/com/hotupdater/NativeConfigUtilsTest.kt +0 -20
  218. package/android/src/test/java/com/hotupdater/OkHttpDownloadServiceTest.kt +0 -111
  219. package/android/src/test/java/com/hotupdater/RelativePathResolverTest.kt +0 -41
  220. package/android/src/test/java/com/hotupdater/ReleaseCatalogCacheServiceTest.kt +0 -118
  221. package/android/src/test/java/com/hotupdater/TarArchiveInputStreamTest.kt +0 -68
  222. package/ios/HotUpdater/Internal/ArchiveExtractionUtilities.swift +0 -178
  223. package/ios/HotUpdater/Internal/DecompressService.swift +0 -112
  224. package/ios/HotUpdater/Internal/DecompressionStrategy.swift +0 -22
  225. package/ios/HotUpdater/Internal/StreamingTarArchiveExtractor.swift +0 -370
  226. package/ios/HotUpdater/Internal/TarBrDecompressionStrategy.swift +0 -39
  227. package/ios/HotUpdater/Internal/TarGzDecompressionStrategy.swift +0 -59
  228. package/ios/HotUpdater/Internal/ZipArchiveExtractor.swift +0 -482
  229. package/ios/HotUpdater/Internal/ZipDecompressionStrategy.swift +0 -56
  230. package/lib/commonjs/catalogCacheNative.spec.js +0 -31
  231. package/lib/commonjs/catalogCacheNative.spec.js.map +0 -1
  232. package/lib/commonjs/checkForUpdate.releaseCatalog.spec.js +0 -616
  233. package/lib/commonjs/checkForUpdate.releaseCatalog.spec.js.map +0 -1
  234. package/lib/commonjs/httpClient.spec.js +0 -102
  235. package/lib/commonjs/httpClient.spec.js.map +0 -1
  236. package/lib/commonjs/index.spec.js +0 -302
  237. package/lib/commonjs/index.spec.js.map +0 -1
  238. package/lib/commonjs/iosInterop.spec.js +0 -18
  239. package/lib/commonjs/iosInterop.spec.js.map +0 -1
  240. package/lib/commonjs/native.spec.js +0 -883
  241. package/lib/commonjs/native.spec.js.map +0 -1
  242. package/lib/commonjs/notifyAppReadyInsights.boundary.spec.js +0 -218
  243. package/lib/commonjs/notifyAppReadyInsights.boundary.spec.js.map +0 -1
  244. package/lib/commonjs/notifyAppReadyInsights.js +0 -133
  245. package/lib/commonjs/notifyAppReadyInsights.js.map +0 -1
  246. package/lib/commonjs/notifyAppReadyInsights.spec.js +0 -246
  247. package/lib/commonjs/notifyAppReadyInsights.spec.js.map +0 -1
  248. package/lib/commonjs/notifyAppReadyInsights.test-utils.js +0 -24
  249. package/lib/commonjs/notifyAppReadyInsights.test-utils.js.map +0 -1
  250. package/lib/commonjs/notifyAppReadyInsights.transport.spec.js +0 -117
  251. package/lib/commonjs/notifyAppReadyInsights.transport.spec.js.map +0 -1
  252. package/lib/commonjs/releaseCatalogCache.spec.js +0 -195
  253. package/lib/commonjs/releaseCatalogCache.spec.js.map +0 -1
  254. package/lib/commonjs/releaseCatalogCacheNativeContract.spec.js +0 -64
  255. package/lib/commonjs/releaseCatalogCacheNativeContract.spec.js.map +0 -1
  256. package/lib/commonjs/store.notification.spec.js +0 -76
  257. package/lib/commonjs/store.notification.spec.js.map +0 -1
  258. package/lib/commonjs/store.spec.js +0 -316
  259. package/lib/commonjs/store.spec.js.map +0 -1
  260. package/lib/commonjs/wrap.spec.js +0 -329
  261. package/lib/commonjs/wrap.spec.js.map +0 -1
  262. package/lib/module/catalogCacheNative.spec.js +0 -31
  263. package/lib/module/catalogCacheNative.spec.js.map +0 -1
  264. package/lib/module/checkForUpdate.releaseCatalog.spec.js +0 -615
  265. package/lib/module/checkForUpdate.releaseCatalog.spec.js.map +0 -1
  266. package/lib/module/httpClient.spec.js +0 -102
  267. package/lib/module/httpClient.spec.js.map +0 -1
  268. package/lib/module/index.spec.js +0 -301
  269. package/lib/module/index.spec.js.map +0 -1
  270. package/lib/module/iosInterop.spec.js +0 -18
  271. package/lib/module/iosInterop.spec.js.map +0 -1
  272. package/lib/module/native.spec.js +0 -882
  273. package/lib/module/native.spec.js.map +0 -1
  274. package/lib/module/notifyAppReadyInsights.boundary.spec.js +0 -217
  275. package/lib/module/notifyAppReadyInsights.boundary.spec.js.map +0 -1
  276. package/lib/module/notifyAppReadyInsights.js +0 -128
  277. package/lib/module/notifyAppReadyInsights.js.map +0 -1
  278. package/lib/module/notifyAppReadyInsights.spec.js +0 -245
  279. package/lib/module/notifyAppReadyInsights.spec.js.map +0 -1
  280. package/lib/module/notifyAppReadyInsights.test-utils.js +0 -18
  281. package/lib/module/notifyAppReadyInsights.test-utils.js.map +0 -1
  282. package/lib/module/notifyAppReadyInsights.transport.spec.js +0 -116
  283. package/lib/module/notifyAppReadyInsights.transport.spec.js.map +0 -1
  284. package/lib/module/releaseCatalogCache.spec.js +0 -195
  285. package/lib/module/releaseCatalogCache.spec.js.map +0 -1
  286. package/lib/module/releaseCatalogCacheNativeContract.spec.js +0 -64
  287. package/lib/module/releaseCatalogCacheNativeContract.spec.js.map +0 -1
  288. package/lib/module/store.notification.spec.js +0 -77
  289. package/lib/module/store.notification.spec.js.map +0 -1
  290. package/lib/module/store.spec.js +0 -315
  291. package/lib/module/store.spec.js.map +0 -1
  292. package/lib/module/wrap.spec.js +0 -330
  293. package/lib/module/wrap.spec.js.map +0 -1
  294. package/lib/typescript/commonjs/notifyAppReadyInsights.d.ts +0 -13
  295. package/lib/typescript/commonjs/notifyAppReadyInsights.d.ts.map +0 -1
  296. package/lib/typescript/commonjs/notifyAppReadyInsights.test-utils.d.ts +0 -8
  297. package/lib/typescript/commonjs/notifyAppReadyInsights.test-utils.d.ts.map +0 -1
  298. package/lib/typescript/module/notifyAppReadyInsights.d.ts +0 -13
  299. package/lib/typescript/module/notifyAppReadyInsights.d.ts.map +0 -1
  300. package/lib/typescript/module/notifyAppReadyInsights.test-utils.d.ts +0 -8
  301. package/lib/typescript/module/notifyAppReadyInsights.test-utils.d.ts.map +0 -1
  302. package/src/catalogCacheNative.spec.ts +0 -63
  303. package/src/checkForUpdate.releaseCatalog.spec.ts +0 -612
  304. package/src/httpClient.spec.ts +0 -132
  305. package/src/index.spec.ts +0 -337
  306. package/src/iosInterop.spec.ts +0 -30
  307. package/src/native.spec.ts +0 -945
  308. package/src/notifyAppReadyInsights.boundary.spec.ts +0 -234
  309. package/src/notifyAppReadyInsights.spec.ts +0 -243
  310. package/src/notifyAppReadyInsights.test-utils.ts +0 -31
  311. package/src/notifyAppReadyInsights.transport.spec.ts +0 -130
  312. package/src/notifyAppReadyInsights.ts +0 -194
  313. package/src/releaseCatalogCache.spec.ts +0 -282
  314. package/src/releaseCatalogCacheNativeContract.spec.ts +0 -80
  315. package/src/store.notification.spec.ts +0 -92
  316. package/src/store.spec.ts +0 -372
  317. 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 ChangedAsset,
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/core";
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 `HotUpdater.reload()`.
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<string, Promise<boolean>>();
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(bundleId: string): Promise<boolean> | undefined {
109
+ getInflightUpdate(
110
+ bundleId: string,
111
+ ): Promise<BundleDelivery | null> | undefined {
107
112
  return this.inflightUpdates.get(bundleId);
108
113
  }
109
114
 
110
- trackInflightUpdate(bundleId: string, promise: Promise<boolean>) {
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 = "archive" | "diff";
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
- progress: number;
292
- artifactType: "archive";
293
- downloadedBytes?: number;
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
- * Downloads files and applies them to the app.
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 updateBundle(params: UpdateParams): Promise<boolean> {
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 true;
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 targetChangedAssets = params.changedAssets;
498
+ const targetAssets = params.assets;
475
499
 
476
500
  const promise = (async () => {
477
501
  try {
478
502
  const selection = params.selection;
479
- const ok = await HotUpdaterNative.updateBundle({
503
+ const staged = await HotUpdaterNative.updateBundle({
480
504
  bundleId: updateBundleId,
481
505
  channel: targetChannel,
482
- changedAssets:
483
- (targetChangedAssets as Record<string, ChangedAsset> | null) ?? null,
484
- fileUrl: targetFileUrl,
485
- fileHash: targetFileHash ?? null,
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
- if (ok) {
491
- sessionState.markBundleInstalled(updateBundleId, targetChannel);
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 `HotUpdater.reload()` should behave.
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
- export type PersistedUserIdentity = {
709
- userId?: string;
710
- username?: string;
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
- "[HotUpdater] Native module is missing 'getUserId()' or 'getUsername()'. This JS bundle requires a newer native @hot-updater/react-native SDK. Rebuild and release a new app version before delivering this OTA update.",
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
- export type SetUserParams = {
738
- userId?: string | number | null;
739
- username?: string | null;
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
- export function setUser(params: SetUserParams): void;
743
- export function setUser(params: null): void;
744
- export function setUser(params: SetUserParams | null): void {
745
- const nativeModule = HotUpdaterNative as typeof HotUpdaterNative & {
746
- setUser?: (userId: string | null, username: string | null) => void;
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
- export type NotifyAppReadyInsightsEvent = {
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?: string | null;
792
- toReleaseId?: string | null;
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 getNotifyAppReadyInsightsEvent = (
895
+ const getLaunchTransition = (
896
896
  result: RawNotifyAppReadyResult,
897
- ): NotifyAppReadyInsightsEvent | null => {
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
- ...(transition.fromReleaseId === null
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
- insightsEvent: NotifyAppReadyInsightsEvent | null;
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
- insightsEvent: getNotifyAppReadyInsightsEvent(rawResult),
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 = HotUpdater.notifyAppReady();
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);