@hot-updater/react-native 1.0.0-rc.3 → 1.0.0-rc.31

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 (300) hide show
  1. package/android/proguard-rules.pro +17 -2
  2. package/android/src/main/java/com/hotupdater/BuiltInAssetResolver.kt +286 -0
  3. package/android/src/main/java/com/hotupdater/BundleFileStorageService.kt +954 -837
  4. package/android/src/main/java/com/hotupdater/BundleMetadata.kt +15 -11
  5. package/android/src/main/java/com/hotupdater/FileManagerService.kt +45 -0
  6. package/android/src/main/java/com/hotupdater/HotUpdaterException.kt +287 -22
  7. package/android/src/main/java/com/hotupdater/HotUpdaterImpl.kt +43 -31
  8. package/android/src/main/java/com/hotupdater/HotUpdaterRecoveryManager.kt +37 -54
  9. package/android/src/main/java/com/hotupdater/HotUpdaterRecoveryState.kt +64 -0
  10. package/android/src/main/java/com/hotupdater/InstallIdentityService.kt +37 -0
  11. package/android/src/main/java/com/hotupdater/KeyValueStorageService.kt +86 -0
  12. package/android/src/main/java/com/hotupdater/NetworkState.kt +31 -0
  13. package/android/src/main/java/com/hotupdater/NoBackupStorage.kt +17 -0
  14. package/android/src/main/java/com/hotupdater/OkHttpDownloadService.kt +127 -50
  15. package/android/src/main/java/com/hotupdater/PreviousProcessExit.kt +89 -0
  16. package/android/src/main/java/com/hotupdater/ReactNativeValueConverters.kt +34 -0
  17. package/android/src/main/java/com/hotupdater/TarArchiveInputStream.kt +214 -375
  18. package/android/src/main/java/com/hotupdater/TarBrArchiveExtractor.kt +119 -0
  19. package/android/src/newarch/HotUpdater.kt +7 -9
  20. package/android/src/newarch/HotUpdaterModule.kt +109 -84
  21. package/android/src/oldarch/HotUpdater.kt +7 -9
  22. package/android/src/oldarch/HotUpdaterModule.kt +98 -74
  23. package/android/src/oldarch/HotUpdaterSpec.kt +4 -6
  24. package/ios/HotUpdater/Internal/BrotliFileDecompressor.swift +167 -0
  25. package/ios/HotUpdater/Internal/BuiltInAssetResolver.swift +196 -0
  26. package/ios/HotUpdater/Internal/BundleFileStorageService.swift +950 -1112
  27. package/ios/HotUpdater/Internal/BundleMetadata.swift +8 -53
  28. package/ios/HotUpdater/Internal/FileManagerService.swift +48 -0
  29. package/ios/HotUpdater/Internal/FileUtilities.swift +64 -0
  30. package/ios/HotUpdater/Internal/HotUpdater-Bridging-Header.h +0 -1
  31. package/ios/HotUpdater/Internal/HotUpdater.mm +13 -45
  32. package/ios/HotUpdater/Internal/HotUpdaterImpl.swift +190 -73
  33. package/ios/HotUpdater/Internal/KeyValueStorageService.swift +71 -0
  34. package/ios/HotUpdater/Internal/NotificationExtension.swift +0 -2
  35. package/ios/HotUpdater/Internal/TarArchiveExtractor.swift +182 -311
  36. package/ios/HotUpdater/Internal/URLSessionDownloadService.swift +119 -71
  37. package/ios/HotUpdater/Internal/UpdateFailure.swift +390 -0
  38. package/ios/HotUpdater/Recovery/HotUpdaterRecovery.h +16 -0
  39. package/ios/HotUpdater/Recovery/HotUpdaterRecovery.mm +83 -0
  40. package/ios/HotUpdater/Recovery/HotUpdaterRecoveryHooks.mm +49 -0
  41. package/lib/commonjs/appReady.js +111 -0
  42. package/lib/commonjs/appReady.js.map +1 -0
  43. package/lib/commonjs/checkForUpdate.js +124 -69
  44. package/lib/commonjs/checkForUpdate.js.map +1 -1
  45. package/lib/commonjs/clientPlugin.js +13 -0
  46. package/lib/commonjs/clientPlugin.js.map +1 -0
  47. package/lib/commonjs/error.js +4 -13
  48. package/lib/commonjs/error.js.map +1 -1
  49. package/lib/commonjs/fetchJSON.js +16 -27
  50. package/lib/commonjs/fetchJSON.js.map +1 -1
  51. package/lib/commonjs/fetchUpdateResponse.js +54 -0
  52. package/lib/commonjs/fetchUpdateResponse.js.map +1 -0
  53. package/lib/commonjs/httpClient.js +63 -94
  54. package/lib/commonjs/httpClient.js.map +1 -1
  55. package/lib/commonjs/index.js +71 -18
  56. package/lib/commonjs/index.js.map +1 -1
  57. package/lib/commonjs/native.js +78 -60
  58. package/lib/commonjs/native.js.map +1 -1
  59. package/lib/commonjs/pluginHost.js +44 -0
  60. package/lib/commonjs/pluginHost.js.map +1 -0
  61. package/lib/commonjs/releaseCatalogCache.js +36 -87
  62. package/lib/commonjs/releaseCatalogCache.js.map +1 -1
  63. package/lib/commonjs/sdkVersion.js +1 -1
  64. package/lib/commonjs/sdkVersion.js.map +1 -1
  65. package/lib/commonjs/specs/NativeHotUpdater.js.map +1 -1
  66. package/lib/commonjs/store.js +3 -10
  67. package/lib/commonjs/store.js.map +1 -1
  68. package/lib/commonjs/updateError.js +132 -0
  69. package/lib/commonjs/updateError.js.map +1 -0
  70. package/lib/commonjs/wrap.js +43 -26
  71. package/lib/commonjs/wrap.js.map +1 -1
  72. package/lib/module/appReady.js +103 -0
  73. package/lib/module/appReady.js.map +1 -0
  74. package/lib/module/checkForUpdate.js +117 -64
  75. package/lib/module/checkForUpdate.js.map +1 -1
  76. package/lib/module/clientPlugin.js +4 -0
  77. package/lib/module/clientPlugin.js.map +1 -0
  78. package/lib/module/error.js +4 -13
  79. package/lib/module/error.js.map +1 -1
  80. package/lib/module/fetchJSON.js +14 -26
  81. package/lib/module/fetchJSON.js.map +1 -1
  82. package/lib/module/fetchUpdateResponse.js +49 -0
  83. package/lib/module/fetchUpdateResponse.js.map +1 -0
  84. package/lib/module/httpClient.js +62 -93
  85. package/lib/module/httpClient.js.map +1 -1
  86. package/lib/module/index.js +58 -20
  87. package/lib/module/index.js.map +1 -1
  88. package/lib/module/native.js +71 -53
  89. package/lib/module/native.js.map +1 -1
  90. package/lib/module/pluginHost.js +35 -0
  91. package/lib/module/pluginHost.js.map +1 -0
  92. package/lib/module/releaseCatalogCache.js +32 -82
  93. package/lib/module/releaseCatalogCache.js.map +1 -1
  94. package/lib/module/sdkVersion.js +1 -1
  95. package/lib/module/sdkVersion.js.map +1 -1
  96. package/lib/module/specs/NativeHotUpdater.js.map +1 -1
  97. package/lib/module/store.js +3 -10
  98. package/lib/module/store.js.map +1 -1
  99. package/lib/module/updateError.js +126 -0
  100. package/lib/module/updateError.js.map +1 -0
  101. package/lib/module/wrap.js +43 -26
  102. package/lib/module/wrap.js.map +1 -1
  103. package/lib/typescript/commonjs/appReady.d.ts +23 -0
  104. package/lib/typescript/commonjs/appReady.d.ts.map +1 -0
  105. package/lib/typescript/commonjs/checkForUpdate.d.ts +16 -4
  106. package/lib/typescript/commonjs/checkForUpdate.d.ts.map +1 -1
  107. package/lib/typescript/commonjs/clientPlugin.d.ts +2 -0
  108. package/lib/typescript/commonjs/clientPlugin.d.ts.map +1 -0
  109. package/lib/typescript/commonjs/error.d.ts +4 -13
  110. package/lib/typescript/commonjs/error.d.ts.map +1 -1
  111. package/lib/typescript/commonjs/fetchJSON.d.ts +5 -5
  112. package/lib/typescript/commonjs/fetchJSON.d.ts.map +1 -1
  113. package/lib/typescript/commonjs/fetchUpdateResponse.d.ts +14 -0
  114. package/lib/typescript/commonjs/fetchUpdateResponse.d.ts.map +1 -0
  115. package/lib/typescript/commonjs/httpClient.d.ts +4 -33
  116. package/lib/typescript/commonjs/httpClient.d.ts.map +1 -1
  117. package/lib/typescript/commonjs/index.d.ts +4 -8
  118. package/lib/typescript/commonjs/index.d.ts.map +1 -1
  119. package/lib/typescript/commonjs/native.d.ts +31 -22
  120. package/lib/typescript/commonjs/native.d.ts.map +1 -1
  121. package/lib/typescript/commonjs/pluginHost.d.ts +4 -0
  122. package/lib/typescript/commonjs/pluginHost.d.ts.map +1 -0
  123. package/lib/typescript/commonjs/releaseCatalogCache.d.ts +8 -14
  124. package/lib/typescript/commonjs/releaseCatalogCache.d.ts.map +1 -1
  125. package/lib/typescript/commonjs/sdkVersion.d.ts +1 -1
  126. package/lib/typescript/commonjs/sdkVersion.d.ts.map +1 -1
  127. package/lib/typescript/commonjs/specs/NativeHotUpdater.d.ts +42 -47
  128. package/lib/typescript/commonjs/specs/NativeHotUpdater.d.ts.map +1 -1
  129. package/lib/typescript/commonjs/store.d.ts +1 -3
  130. package/lib/typescript/commonjs/store.d.ts.map +1 -1
  131. package/lib/typescript/commonjs/types.d.ts +1 -1
  132. package/lib/typescript/commonjs/types.d.ts.map +1 -1
  133. package/lib/typescript/commonjs/updateError.d.ts +26 -0
  134. package/lib/typescript/commonjs/updateError.d.ts.map +1 -0
  135. package/lib/typescript/commonjs/wrap.d.ts.map +1 -1
  136. package/lib/typescript/commonjs/wrap.types.d.ts +6 -7
  137. package/lib/typescript/commonjs/wrap.types.d.ts.map +1 -1
  138. package/lib/typescript/module/appReady.d.ts +23 -0
  139. package/lib/typescript/module/appReady.d.ts.map +1 -0
  140. package/lib/typescript/module/checkForUpdate.d.ts +16 -4
  141. package/lib/typescript/module/checkForUpdate.d.ts.map +1 -1
  142. package/lib/typescript/module/clientPlugin.d.ts +2 -0
  143. package/lib/typescript/module/clientPlugin.d.ts.map +1 -0
  144. package/lib/typescript/module/error.d.ts +4 -13
  145. package/lib/typescript/module/error.d.ts.map +1 -1
  146. package/lib/typescript/module/fetchJSON.d.ts +5 -5
  147. package/lib/typescript/module/fetchJSON.d.ts.map +1 -1
  148. package/lib/typescript/module/fetchUpdateResponse.d.ts +14 -0
  149. package/lib/typescript/module/fetchUpdateResponse.d.ts.map +1 -0
  150. package/lib/typescript/module/httpClient.d.ts +4 -33
  151. package/lib/typescript/module/httpClient.d.ts.map +1 -1
  152. package/lib/typescript/module/index.d.ts +4 -8
  153. package/lib/typescript/module/index.d.ts.map +1 -1
  154. package/lib/typescript/module/native.d.ts +31 -22
  155. package/lib/typescript/module/native.d.ts.map +1 -1
  156. package/lib/typescript/module/pluginHost.d.ts +4 -0
  157. package/lib/typescript/module/pluginHost.d.ts.map +1 -0
  158. package/lib/typescript/module/releaseCatalogCache.d.ts +8 -14
  159. package/lib/typescript/module/releaseCatalogCache.d.ts.map +1 -1
  160. package/lib/typescript/module/sdkVersion.d.ts +1 -1
  161. package/lib/typescript/module/sdkVersion.d.ts.map +1 -1
  162. package/lib/typescript/module/specs/NativeHotUpdater.d.ts +42 -47
  163. package/lib/typescript/module/specs/NativeHotUpdater.d.ts.map +1 -1
  164. package/lib/typescript/module/store.d.ts +1 -3
  165. package/lib/typescript/module/store.d.ts.map +1 -1
  166. package/lib/typescript/module/types.d.ts +1 -1
  167. package/lib/typescript/module/types.d.ts.map +1 -1
  168. package/lib/typescript/module/updateError.d.ts +26 -0
  169. package/lib/typescript/module/updateError.d.ts.map +1 -0
  170. package/lib/typescript/module/wrap.d.ts.map +1 -1
  171. package/lib/typescript/module/wrap.types.d.ts +6 -7
  172. package/lib/typescript/module/wrap.types.d.ts.map +1 -1
  173. package/package.json +7 -4
  174. package/src/appReady.ts +149 -0
  175. package/src/checkForUpdate.ts +151 -88
  176. package/src/clientPlugin.ts +18 -0
  177. package/src/error.ts +4 -14
  178. package/src/fetchJSON.ts +14 -30
  179. package/src/fetchUpdateResponse.ts +54 -0
  180. package/src/httpClient.ts +88 -159
  181. package/src/index.ts +90 -24
  182. package/src/native.ts +106 -102
  183. package/src/pluginHost.ts +45 -0
  184. package/src/releaseCatalogCache.ts +43 -172
  185. package/src/sdkVersion.ts +1 -1
  186. package/src/specs/NativeHotUpdater.ts +41 -48
  187. package/src/store.ts +2 -23
  188. package/src/types.ts +1 -1
  189. package/src/updateError.ts +153 -0
  190. package/src/wrap.tsx +57 -26
  191. package/src/wrap.types.ts +6 -7
  192. package/android/src/main/java/com/hotupdater/DecompressService.kt +0 -89
  193. package/android/src/main/java/com/hotupdater/DecompressionStrategy.kt +0 -26
  194. package/android/src/main/java/com/hotupdater/TarBrDecompressionStrategy.kt +0 -117
  195. package/android/src/main/java/com/hotupdater/TarGzDecompressionStrategy.kt +0 -117
  196. package/android/src/main/java/com/hotupdater/ZipDecompressionStrategy.kt +0 -192
  197. package/android/src/test/java/com/hotupdater/BsdiffPatchTest.kt +0 -46
  198. package/android/src/test/java/com/hotupdater/BundleFileStorageServiceTest.kt +0 -799
  199. package/android/src/test/java/com/hotupdater/HotUpdaterImplTest.kt +0 -273
  200. package/android/src/test/java/com/hotupdater/NativeConfigUtilsTest.kt +0 -20
  201. package/android/src/test/java/com/hotupdater/OkHttpDownloadServiceTest.kt +0 -111
  202. package/android/src/test/java/com/hotupdater/RelativePathResolverTest.kt +0 -41
  203. package/android/src/test/java/com/hotupdater/ReleaseCatalogCacheServiceTest.kt +0 -118
  204. package/android/src/test/java/com/hotupdater/TarArchiveInputStreamTest.kt +0 -68
  205. package/ios/HotUpdater/Internal/ArchiveExtractionUtilities.swift +0 -178
  206. package/ios/HotUpdater/Internal/DecompressService.swift +0 -112
  207. package/ios/HotUpdater/Internal/DecompressionStrategy.swift +0 -22
  208. package/ios/HotUpdater/Internal/StreamingTarArchiveExtractor.swift +0 -370
  209. package/ios/HotUpdater/Internal/TarBrDecompressionStrategy.swift +0 -39
  210. package/ios/HotUpdater/Internal/TarGzDecompressionStrategy.swift +0 -59
  211. package/ios/HotUpdater/Internal/ZipArchiveExtractor.swift +0 -482
  212. package/ios/HotUpdater/Internal/ZipDecompressionStrategy.swift +0 -56
  213. package/lib/commonjs/catalogCacheNative.spec.js +0 -31
  214. package/lib/commonjs/catalogCacheNative.spec.js.map +0 -1
  215. package/lib/commonjs/checkForUpdate.releaseCatalog.spec.js +0 -615
  216. package/lib/commonjs/checkForUpdate.releaseCatalog.spec.js.map +0 -1
  217. package/lib/commonjs/httpClient.spec.js +0 -102
  218. package/lib/commonjs/httpClient.spec.js.map +0 -1
  219. package/lib/commonjs/index.spec.js +0 -302
  220. package/lib/commonjs/index.spec.js.map +0 -1
  221. package/lib/commonjs/iosInterop.spec.js +0 -18
  222. package/lib/commonjs/iosInterop.spec.js.map +0 -1
  223. package/lib/commonjs/native.spec.js +0 -883
  224. package/lib/commonjs/native.spec.js.map +0 -1
  225. package/lib/commonjs/notifyAppReadyInsights.boundary.spec.js +0 -218
  226. package/lib/commonjs/notifyAppReadyInsights.boundary.spec.js.map +0 -1
  227. package/lib/commonjs/notifyAppReadyInsights.js +0 -133
  228. package/lib/commonjs/notifyAppReadyInsights.js.map +0 -1
  229. package/lib/commonjs/notifyAppReadyInsights.spec.js +0 -246
  230. package/lib/commonjs/notifyAppReadyInsights.spec.js.map +0 -1
  231. package/lib/commonjs/notifyAppReadyInsights.test-utils.js +0 -24
  232. package/lib/commonjs/notifyAppReadyInsights.test-utils.js.map +0 -1
  233. package/lib/commonjs/notifyAppReadyInsights.transport.spec.js +0 -117
  234. package/lib/commonjs/notifyAppReadyInsights.transport.spec.js.map +0 -1
  235. package/lib/commonjs/releaseCatalogCache.spec.js +0 -195
  236. package/lib/commonjs/releaseCatalogCache.spec.js.map +0 -1
  237. package/lib/commonjs/releaseCatalogCacheNativeContract.spec.js +0 -64
  238. package/lib/commonjs/releaseCatalogCacheNativeContract.spec.js.map +0 -1
  239. package/lib/commonjs/store.notification.spec.js +0 -76
  240. package/lib/commonjs/store.notification.spec.js.map +0 -1
  241. package/lib/commonjs/store.spec.js +0 -316
  242. package/lib/commonjs/store.spec.js.map +0 -1
  243. package/lib/commonjs/wrap.spec.js +0 -329
  244. package/lib/commonjs/wrap.spec.js.map +0 -1
  245. package/lib/module/catalogCacheNative.spec.js +0 -31
  246. package/lib/module/catalogCacheNative.spec.js.map +0 -1
  247. package/lib/module/checkForUpdate.releaseCatalog.spec.js +0 -614
  248. package/lib/module/checkForUpdate.releaseCatalog.spec.js.map +0 -1
  249. package/lib/module/httpClient.spec.js +0 -102
  250. package/lib/module/httpClient.spec.js.map +0 -1
  251. package/lib/module/index.spec.js +0 -301
  252. package/lib/module/index.spec.js.map +0 -1
  253. package/lib/module/iosInterop.spec.js +0 -18
  254. package/lib/module/iosInterop.spec.js.map +0 -1
  255. package/lib/module/native.spec.js +0 -882
  256. package/lib/module/native.spec.js.map +0 -1
  257. package/lib/module/notifyAppReadyInsights.boundary.spec.js +0 -217
  258. package/lib/module/notifyAppReadyInsights.boundary.spec.js.map +0 -1
  259. package/lib/module/notifyAppReadyInsights.js +0 -128
  260. package/lib/module/notifyAppReadyInsights.js.map +0 -1
  261. package/lib/module/notifyAppReadyInsights.spec.js +0 -245
  262. package/lib/module/notifyAppReadyInsights.spec.js.map +0 -1
  263. package/lib/module/notifyAppReadyInsights.test-utils.js +0 -18
  264. package/lib/module/notifyAppReadyInsights.test-utils.js.map +0 -1
  265. package/lib/module/notifyAppReadyInsights.transport.spec.js +0 -116
  266. package/lib/module/notifyAppReadyInsights.transport.spec.js.map +0 -1
  267. package/lib/module/releaseCatalogCache.spec.js +0 -195
  268. package/lib/module/releaseCatalogCache.spec.js.map +0 -1
  269. package/lib/module/releaseCatalogCacheNativeContract.spec.js +0 -64
  270. package/lib/module/releaseCatalogCacheNativeContract.spec.js.map +0 -1
  271. package/lib/module/store.notification.spec.js +0 -77
  272. package/lib/module/store.notification.spec.js.map +0 -1
  273. package/lib/module/store.spec.js +0 -315
  274. package/lib/module/store.spec.js.map +0 -1
  275. package/lib/module/wrap.spec.js +0 -330
  276. package/lib/module/wrap.spec.js.map +0 -1
  277. package/lib/typescript/commonjs/notifyAppReadyInsights.d.ts +0 -13
  278. package/lib/typescript/commonjs/notifyAppReadyInsights.d.ts.map +0 -1
  279. package/lib/typescript/commonjs/notifyAppReadyInsights.test-utils.d.ts +0 -8
  280. package/lib/typescript/commonjs/notifyAppReadyInsights.test-utils.d.ts.map +0 -1
  281. package/lib/typescript/module/notifyAppReadyInsights.d.ts +0 -13
  282. package/lib/typescript/module/notifyAppReadyInsights.d.ts.map +0 -1
  283. package/lib/typescript/module/notifyAppReadyInsights.test-utils.d.ts +0 -8
  284. package/lib/typescript/module/notifyAppReadyInsights.test-utils.d.ts.map +0 -1
  285. package/src/catalogCacheNative.spec.ts +0 -63
  286. package/src/checkForUpdate.releaseCatalog.spec.ts +0 -611
  287. package/src/httpClient.spec.ts +0 -132
  288. package/src/index.spec.ts +0 -337
  289. package/src/iosInterop.spec.ts +0 -30
  290. package/src/native.spec.ts +0 -945
  291. package/src/notifyAppReadyInsights.boundary.spec.ts +0 -234
  292. package/src/notifyAppReadyInsights.spec.ts +0 -243
  293. package/src/notifyAppReadyInsights.test-utils.ts +0 -31
  294. package/src/notifyAppReadyInsights.transport.spec.ts +0 -130
  295. package/src/notifyAppReadyInsights.ts +0 -194
  296. package/src/releaseCatalogCache.spec.ts +0 -282
  297. package/src/releaseCatalogCacheNativeContract.spec.ts +0 -80
  298. package/src/store.notification.spec.ts +0 -92
  299. package/src/store.spec.ts +0 -372
  300. package/src/wrap.spec.ts +0 -406
package/src/wrap.spec.ts DELETED
@@ -1,406 +0,0 @@
1
- // @vitest-environment jsdom
2
-
3
- import { cleanup, render, waitFor } from "@testing-library/react";
4
- import { createElement, type ComponentType } from "react";
5
- import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
6
-
7
- import type {
8
- NotifyAppReadyInsightsEvent,
9
- NotifyAppReadyResult,
10
- } from "./native";
11
- import type { HotUpdaterOptions } from "./wrap";
12
-
13
- vi.mock("react-native", () => ({
14
- Platform: {
15
- OS: "ios",
16
- },
17
- }));
18
-
19
- const createNotifyReadResult = (
20
- result: NotifyAppReadyResult = { status: "UNCHANGED" },
21
- insightsEvent: NotifyAppReadyInsightsEvent | null = null,
22
- pending = false,
23
- ): {
24
- insightsEvent: NotifyAppReadyInsightsEvent | null;
25
- pending: boolean;
26
- result: NotifyAppReadyResult;
27
- } => ({
28
- insightsEvent,
29
- pending,
30
- result,
31
- });
32
-
33
- const mocks = vi.hoisted(() => ({
34
- addListener: vi.fn(() => () => {}),
35
- checkForUpdate: vi.fn(),
36
- getAppVersion: vi.fn(() => "1.0.0"),
37
- getBundleId: vi.fn(() => "bundle-id"),
38
- getUpdateId: vi.fn(() => "release-id"),
39
- getChannel: vi.fn(() => "production"),
40
- getCohort: vi.fn(() => "123"),
41
- getFingerprintHash: vi.fn(() => "fingerprint-hash"),
42
- getInstallId: vi.fn(() => "install-id"),
43
- getPersistedUserIdentity: vi.fn(() => ({})),
44
- readNotifyAppReady: vi.fn<
45
- () => {
46
- insightsEvent: NotifyAppReadyInsightsEvent | null;
47
- pending: boolean;
48
- result: NotifyAppReadyResult;
49
- }
50
- >(() => createNotifyReadResult()),
51
- reload: vi.fn(),
52
- }));
53
-
54
- vi.mock("./checkForUpdate", () => ({
55
- checkForUpdate: mocks.checkForUpdate,
56
- }));
57
-
58
- vi.mock("./native", () => ({
59
- addListener: mocks.addListener,
60
- getAppVersion: mocks.getAppVersion,
61
- getBundleId: mocks.getBundleId,
62
- getUpdateId: mocks.getUpdateId,
63
- getChannel: mocks.getChannel,
64
- getCohort: mocks.getCohort,
65
- getFingerprintHash: mocks.getFingerprintHash,
66
- getInstallId: mocks.getInstallId,
67
- getPersistedUserIdentity: mocks.getPersistedUserIdentity,
68
- readNotifyAppReady: mocks.readNotifyAppReady,
69
- reload: mocks.reload,
70
- }));
71
-
72
- const createClient = (
73
- sendInsightsEvent = vi.fn().mockResolvedValue(undefined),
74
- ) => ({
75
- client: {
76
- createSession: vi.fn(async () => ({
77
- fetchReleaseCatalog: vi.fn(),
78
- resolveArtifact: vi.fn(),
79
- sendInsightsEvent,
80
- })),
81
- },
82
- sendInsightsEvent,
83
- });
84
-
85
- describe("HotUpdater wrap initialization", () => {
86
- beforeEach(() => {
87
- vi.resetModules();
88
- vi.unstubAllGlobals();
89
- vi.useRealTimers();
90
-
91
- for (const mock of Object.values(mocks)) {
92
- mock.mockReset();
93
- }
94
-
95
- mocks.checkForUpdate.mockResolvedValue(null);
96
- mocks.addListener.mockReturnValue(() => {});
97
- mocks.getAppVersion.mockReturnValue("1.0.0");
98
- mocks.getPersistedUserIdentity.mockReturnValue({});
99
- mocks.getBundleId.mockReturnValue("bundle-id");
100
- mocks.getUpdateId.mockReturnValue("release-id");
101
- mocks.getChannel.mockReturnValue("production");
102
- mocks.getCohort.mockReturnValue("123");
103
- mocks.getFingerprintHash.mockReturnValue("fingerprint-hash");
104
- mocks.getInstallId.mockReturnValue("install-id");
105
- mocks.readNotifyAppReady.mockReturnValue(createNotifyReadResult());
106
- });
107
-
108
- afterEach(cleanup);
109
-
110
- it("reports the console ID when up to date while retaining file IDs in insights", async () => {
111
- const onUpdateProcessCompleted = vi.fn();
112
- const { client, sendInsightsEvent } = createClient();
113
- const { wrap } = await import("./wrap");
114
- const WrappedComponent = wrap({
115
- insights: true,
116
- client,
117
- onUpdateProcessCompleted,
118
- updateStrategy: "appVersion",
119
- })(() => null);
120
-
121
- render(createElement(WrappedComponent));
122
-
123
- await waitFor(() =>
124
- expect(onUpdateProcessCompleted).toHaveBeenCalledWith({
125
- id: "release-id",
126
- message: null,
127
- shouldForceUpdate: false,
128
- status: "UP_TO_DATE",
129
- }),
130
- );
131
- await waitFor(() =>
132
- expect(sendInsightsEvent).toHaveBeenCalledWith(
133
- expect.objectContaining({
134
- toBundleId: "bundle-id",
135
- type: "UNCHANGED",
136
- }),
137
- ),
138
- );
139
- });
140
-
141
- it("returns void from init and defers notifyAppReady to the next frame", async () => {
142
- vi.useFakeTimers();
143
-
144
- const requestAnimationFrame = vi.fn(
145
- (callback: (timestamp: number) => void) => {
146
- setTimeout(() => callback(0), 0);
147
- return 1;
148
- },
149
- );
150
- vi.stubGlobal("requestAnimationFrame", requestAnimationFrame);
151
-
152
- const { client, sendInsightsEvent } = createClient();
153
- const { init } = await import("./wrap");
154
-
155
- const result = init({
156
- client,
157
- requestHeaders: {
158
- Authorization: "Bearer token",
159
- },
160
- requestTimeout: 1000,
161
- });
162
-
163
- expect(result).toBeUndefined();
164
- expect(mocks.readNotifyAppReady).not.toHaveBeenCalled();
165
- expect(sendInsightsEvent).not.toHaveBeenCalled();
166
-
167
- expect(requestAnimationFrame).toHaveBeenCalled();
168
-
169
- await vi.runOnlyPendingTimersAsync();
170
-
171
- expect(mocks.readNotifyAppReady).toHaveBeenCalledWith();
172
- expect(sendInsightsEvent).not.toHaveBeenCalled();
173
- });
174
-
175
- it("waits for native launch verification before sending insights", async () => {
176
- vi.useFakeTimers();
177
-
178
- vi.stubGlobal(
179
- "requestAnimationFrame",
180
- vi.fn((callback: (timestamp: number) => void) => {
181
- setTimeout(() => callback(0), 0);
182
- return 1;
183
- }),
184
- );
185
-
186
- mocks.readNotifyAppReady
187
- .mockReturnValueOnce(createNotifyReadResult(undefined, null, true))
188
- .mockReturnValueOnce(
189
- createNotifyReadResult(
190
- {
191
- fromBundleId: "bundle-a",
192
- status: "UPDATE_APPLIED",
193
- toBundleId: "bundle-b",
194
- },
195
- {
196
- fromBundleId: "bundle-a",
197
- toBundleId: "bundle-b",
198
- type: "UPDATE_APPLIED",
199
- updateStrategy: "appVersion",
200
- },
201
- ),
202
- );
203
-
204
- const { client, sendInsightsEvent } = createClient();
205
- const { init } = await import("./wrap");
206
-
207
- init({ insights: true, client });
208
-
209
- await vi.runAllTimersAsync();
210
-
211
- expect(mocks.readNotifyAppReady).toHaveBeenCalledTimes(2);
212
- expect(sendInsightsEvent).toHaveBeenCalledTimes(1);
213
- });
214
-
215
- it("sends automatic insights only from init when enabled", async () => {
216
- vi.useFakeTimers();
217
-
218
- vi.stubGlobal(
219
- "requestAnimationFrame",
220
- vi.fn((callback: (timestamp: number) => void) => {
221
- setTimeout(() => callback(0), 0);
222
- return 1;
223
- }),
224
- );
225
-
226
- mocks.readNotifyAppReady.mockReturnValue(
227
- createNotifyReadResult(
228
- {
229
- fromBundleId: "bundle-a",
230
- status: "UPDATE_APPLIED",
231
- toBundleId: "bundle-b",
232
- },
233
- {
234
- fromBundleId: "bundle-a",
235
- toBundleId: "bundle-b",
236
- type: "UPDATE_APPLIED",
237
- updateStrategy: "fingerprint",
238
- },
239
- ),
240
- );
241
-
242
- mocks.getPersistedUserIdentity.mockReturnValue({
243
- userId: "user-123",
244
- username: "alice",
245
- });
246
-
247
- const { client, sendInsightsEvent } = createClient();
248
- const { init } = await import("./wrap");
249
-
250
- init({
251
- insights: true,
252
- requestHeaders: {
253
- Authorization: "Bearer token",
254
- },
255
- requestTimeout: 1000,
256
- client,
257
- });
258
-
259
- await vi.runOnlyPendingTimersAsync();
260
-
261
- expect(sendInsightsEvent).toHaveBeenCalledWith({
262
- appVersion: "1.0.0",
263
- channel: "production",
264
- cohort: "123",
265
- fingerprintHash: "fingerprint-hash",
266
- fromBundleId: "bundle-a",
267
- fromReleaseId: null,
268
- installId: "install-id",
269
- platform: "ios",
270
- requestHeaders: {
271
- Authorization: "Bearer token",
272
- },
273
- requestTimeout: 1000,
274
- toBundleId: "bundle-b",
275
- toReleaseId: null,
276
- type: "UPDATE_APPLIED",
277
- updateStrategy: "fingerprint",
278
- userId: "user-123",
279
- username: "alice",
280
- });
281
- });
282
-
283
- it("guards automatic insights to a single delivery attempt per runtime", async () => {
284
- vi.useFakeTimers();
285
-
286
- vi.stubGlobal(
287
- "requestAnimationFrame",
288
- vi.fn((callback: (timestamp: number) => void) => {
289
- setTimeout(() => callback(0), 0);
290
- return 1;
291
- }),
292
- );
293
-
294
- mocks.readNotifyAppReady.mockReturnValue(
295
- createNotifyReadResult(
296
- {
297
- fromBundleId: "bundle-a",
298
- status: "RECOVERED",
299
- toBundleId: "bundle-b",
300
- },
301
- {
302
- fromBundleId: "bundle-a",
303
- toBundleId: "bundle-b",
304
- type: "RECOVERED",
305
- updateStrategy: "appVersion",
306
- },
307
- ),
308
- );
309
-
310
- const { client, sendInsightsEvent } = createClient();
311
- const { init } = await import("./wrap");
312
-
313
- init({ insights: true, client });
314
- init({ insights: true, client });
315
-
316
- await vi.runOnlyPendingTimersAsync();
317
-
318
- expect(sendInsightsEvent).toHaveBeenCalledTimes(1);
319
- });
320
-
321
- it("warns without interrupting app readiness when insights transport fails", async () => {
322
- vi.useFakeTimers();
323
-
324
- const warn = vi.spyOn(console, "warn").mockImplementation(() => {});
325
- const error = new Error("Expected HTTP 204 from /events, received 404");
326
- const onError = vi.fn();
327
- const onNotifyAppReady = vi.fn();
328
- vi.stubGlobal(
329
- "requestAnimationFrame",
330
- vi.fn((callback: (timestamp: number) => void) => {
331
- setTimeout(() => callback(0), 0);
332
- return 1;
333
- }),
334
- );
335
- mocks.readNotifyAppReady.mockReturnValue(
336
- createNotifyReadResult(
337
- {
338
- fromBundleId: "bundle-a",
339
- status: "UPDATE_APPLIED",
340
- toBundleId: "bundle-b",
341
- },
342
- {
343
- fromBundleId: "bundle-a",
344
- toBundleId: "bundle-b",
345
- type: "UPDATE_APPLIED",
346
- updateStrategy: "appVersion",
347
- },
348
- ),
349
- );
350
- const { client } = createClient(vi.fn().mockRejectedValue(error));
351
- const { init } = await import("./wrap");
352
-
353
- init({
354
- insights: true,
355
- onError,
356
- onNotifyAppReady,
357
- client,
358
- });
359
-
360
- await vi.runOnlyPendingTimersAsync();
361
-
362
- expect(onError).not.toHaveBeenCalled();
363
- expect(warn).toHaveBeenCalledWith(
364
- "[HotUpdater] Automatic notifyAppReady insights failed:",
365
- error,
366
- );
367
- expect(onNotifyAppReady).toHaveBeenCalledWith({
368
- fromBundleId: "bundle-a",
369
- status: "UPDATE_APPLIED",
370
- toBundleId: "bundle-b",
371
- });
372
- warn.mockRestore();
373
- });
374
-
375
- it("does not accept a manual wrap HOC", async () => {
376
- const { wrap } = await import("./wrap");
377
-
378
- wrap({
379
- client: createClient().client,
380
- updateStrategy: "appVersion",
381
- });
382
- });
383
-
384
- it("preserves wrapped component prop inference", async () => {
385
- const { wrap } = await import("./wrap");
386
- const Component: ComponentType<{ title: string }> = () => null;
387
-
388
- const WrappedComponent = wrap({
389
- client: createClient().client,
390
- updateStrategy: "appVersion",
391
- })(Component);
392
-
393
- const acceptsTitleProps: ComponentType<{ title: string }> =
394
- WrappedComponent;
395
- expect(acceptsTitleProps).toBe(WrappedComponent);
396
- });
397
-
398
- it("types public wrap options as automatic mode by default", () => {
399
- const autoOptions = {
400
- baseURL: "https://updates.example.com",
401
- updateStrategy: "appVersion",
402
- } satisfies HotUpdaterOptions;
403
-
404
- expect(autoOptions.updateStrategy).toBe("appVersion");
405
- });
406
- });