@hot-updater/react-native 1.0.0-rc.16 → 1.0.0-rc.17

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 (316) hide show
  1. package/android/src/main/java/com/hotupdater/BundleFileStorageService.kt +491 -388
  2. package/android/src/main/java/com/hotupdater/BundleMetadata.kt +5 -11
  3. package/android/src/main/java/com/hotupdater/FileManagerService.kt +45 -0
  4. package/android/src/main/java/com/hotupdater/HotUpdaterException.kt +290 -12
  5. package/android/src/main/java/com/hotupdater/HotUpdaterImpl.kt +35 -19
  6. package/android/src/main/java/com/hotupdater/InstallIdentityService.kt +37 -0
  7. package/android/src/main/java/com/hotupdater/KeyValueStorageService.kt +86 -0
  8. package/android/src/main/java/com/hotupdater/NetworkState.kt +31 -0
  9. package/android/src/main/java/com/hotupdater/NoBackupStorage.kt +17 -0
  10. package/android/src/main/java/com/hotupdater/OkHttpDownloadService.kt +110 -52
  11. package/android/src/main/java/com/hotupdater/PreviousProcessExit.kt +89 -0
  12. package/android/src/main/java/com/hotupdater/ReactNativeValueConverters.kt +34 -0
  13. package/android/src/newarch/HotUpdaterModule.kt +74 -69
  14. package/android/src/oldarch/HotUpdaterModule.kt +63 -59
  15. package/android/src/oldarch/HotUpdaterSpec.kt +4 -6
  16. package/android/src/test/java/com/hotupdater/BsdiffPatchTest.kt +1 -1
  17. package/android/src/test/java/com/hotupdater/BundleFileStorageServiceTest.kt +446 -61
  18. package/android/src/test/java/com/hotupdater/HotUpdaterExceptionTest.kt +220 -0
  19. package/android/src/test/java/com/hotupdater/HotUpdaterImplTest.kt +19 -27
  20. package/android/src/test/java/com/hotupdater/InstallIdentityServiceTest.kt +71 -0
  21. package/android/src/test/java/com/hotupdater/KeyValueStorageServiceTest.kt +106 -0
  22. package/android/src/test/java/com/hotupdater/NoBackupContext.kt +11 -0
  23. package/android/src/test/java/com/hotupdater/OkHttpDownloadServiceTest.kt +309 -23
  24. package/android/src/test/java/com/hotupdater/PreviousProcessExitTest.kt +57 -0
  25. package/ios/HotUpdater/Internal/BundleFileStorageService.swift +238 -157
  26. package/ios/HotUpdater/Internal/BundleMetadata.swift +3 -53
  27. package/ios/HotUpdater/Internal/FileManagerService.swift +48 -0
  28. package/ios/HotUpdater/Internal/HotUpdater.mm +8 -18
  29. package/ios/HotUpdater/Internal/HotUpdaterImpl.swift +48 -29
  30. package/ios/HotUpdater/Internal/KeyValueStorageService.swift +71 -0
  31. package/ios/HotUpdater/Internal/URLSessionDownloadService.swift +108 -1
  32. package/ios/HotUpdater/Internal/UpdateFailure.swift +390 -0
  33. package/lib/commonjs/appReady.js +111 -0
  34. package/lib/commonjs/appReady.js.map +1 -0
  35. package/lib/commonjs/appReady.spec.js +360 -0
  36. package/lib/commonjs/appReady.spec.js.map +1 -0
  37. package/lib/commonjs/{notifyAppReadyInsights.test-utils.js → appReady.test-utils.js} +4 -3
  38. package/lib/commonjs/appReady.test-utils.js.map +1 -0
  39. package/lib/commonjs/baseURL.js +16 -0
  40. package/lib/commonjs/baseURL.js.map +1 -0
  41. package/lib/commonjs/checkForUpdate.js +104 -56
  42. package/lib/commonjs/checkForUpdate.js.map +1 -1
  43. package/lib/commonjs/checkForUpdate.releaseCatalog.spec.js +337 -74
  44. package/lib/commonjs/checkForUpdate.releaseCatalog.spec.js.map +1 -1
  45. package/lib/commonjs/clientPlugin.js +49 -0
  46. package/lib/commonjs/clientPlugin.js.map +1 -0
  47. package/lib/commonjs/entryImportGraph.spec.js +50 -0
  48. package/lib/commonjs/entryImportGraph.spec.js.map +1 -0
  49. package/lib/commonjs/fetchJSON.js +2 -6
  50. package/lib/commonjs/fetchJSON.js.map +1 -1
  51. package/lib/commonjs/httpClient.js +18 -165
  52. package/lib/commonjs/httpClient.js.map +1 -1
  53. package/lib/commonjs/httpClient.spec.js +26 -199
  54. package/lib/commonjs/httpClient.spec.js.map +1 -1
  55. package/lib/commonjs/index.js +49 -36
  56. package/lib/commonjs/index.js.map +1 -1
  57. package/lib/commonjs/index.spec.js +108 -123
  58. package/lib/commonjs/index.spec.js.map +1 -1
  59. package/lib/commonjs/native.js +67 -48
  60. package/lib/commonjs/native.js.map +1 -1
  61. package/lib/commonjs/native.spec.js +80 -58
  62. package/lib/commonjs/native.spec.js.map +1 -1
  63. package/lib/commonjs/pluginHost.js +208 -0
  64. package/lib/commonjs/pluginHost.js.map +1 -0
  65. package/lib/commonjs/pluginHost.spec.js +292 -0
  66. package/lib/commonjs/pluginHost.spec.js.map +1 -0
  67. package/lib/commonjs/plugins/insights/eventId.js +129 -0
  68. package/lib/commonjs/plugins/insights/eventId.js.map +1 -0
  69. package/lib/commonjs/plugins/insights/eventId.spec.js +47 -0
  70. package/lib/commonjs/plugins/insights/eventId.spec.js.map +1 -0
  71. package/lib/commonjs/plugins/insights/index.js +272 -0
  72. package/lib/commonjs/plugins/insights/index.js.map +1 -0
  73. package/lib/commonjs/plugins/insights/insights.spec.js +640 -0
  74. package/lib/commonjs/plugins/insights/insights.spec.js.map +1 -0
  75. package/lib/commonjs/plugins/insights/sender.js +128 -0
  76. package/lib/commonjs/plugins/insights/sender.js.map +1 -0
  77. package/lib/commonjs/plugins/insights/sender.spec.js +265 -0
  78. package/lib/commonjs/plugins/insights/sender.spec.js.map +1 -0
  79. package/lib/commonjs/plugins/insights/state.js +145 -0
  80. package/lib/commonjs/plugins/insights/state.js.map +1 -0
  81. package/lib/commonjs/releaseCatalogCache.js +13 -2
  82. package/lib/commonjs/releaseCatalogCache.js.map +1 -1
  83. package/lib/commonjs/releaseCatalogCache.spec.js +18 -0
  84. package/lib/commonjs/releaseCatalogCache.spec.js.map +1 -1
  85. package/lib/commonjs/sdkVersion.js +1 -1
  86. package/lib/commonjs/specs/NativeHotUpdater.js.map +1 -1
  87. package/lib/commonjs/updateError.js +132 -0
  88. package/lib/commonjs/updateError.js.map +1 -0
  89. package/lib/commonjs/updateError.spec.js +149 -0
  90. package/lib/commonjs/updateError.spec.js.map +1 -0
  91. package/lib/commonjs/wrap.js +43 -25
  92. package/lib/commonjs/wrap.js.map +1 -1
  93. package/lib/commonjs/wrap.progress.spec.js +195 -0
  94. package/lib/commonjs/wrap.progress.spec.js.map +1 -0
  95. package/lib/commonjs/wrap.spec.js +94 -230
  96. package/lib/commonjs/wrap.spec.js.map +1 -1
  97. package/lib/module/appReady.js +103 -0
  98. package/lib/module/appReady.js.map +1 -0
  99. package/lib/module/appReady.spec.js +359 -0
  100. package/lib/module/appReady.spec.js.map +1 -0
  101. package/lib/module/{notifyAppReadyInsights.test-utils.js → appReady.test-utils.js} +4 -3
  102. package/lib/module/appReady.test-utils.js.map +1 -0
  103. package/lib/module/baseURL.js +11 -0
  104. package/lib/module/baseURL.js.map +1 -0
  105. package/lib/module/checkForUpdate.js +103 -57
  106. package/lib/module/checkForUpdate.js.map +1 -1
  107. package/lib/module/checkForUpdate.releaseCatalog.spec.js +337 -74
  108. package/lib/module/checkForUpdate.releaseCatalog.spec.js.map +1 -1
  109. package/lib/module/clientPlugin.js +44 -0
  110. package/lib/module/clientPlugin.js.map +1 -0
  111. package/lib/module/entryImportGraph.spec.js +50 -0
  112. package/lib/module/entryImportGraph.spec.js.map +1 -0
  113. package/lib/module/fetchJSON.js +2 -6
  114. package/lib/module/fetchJSON.js.map +1 -1
  115. package/lib/module/httpClient.js +18 -165
  116. package/lib/module/httpClient.js.map +1 -1
  117. package/lib/module/httpClient.spec.js +27 -200
  118. package/lib/module/httpClient.spec.js.map +1 -1
  119. package/lib/module/index.js +44 -38
  120. package/lib/module/index.js.map +1 -1
  121. package/lib/module/index.spec.js +108 -123
  122. package/lib/module/index.spec.js.map +1 -1
  123. package/lib/module/native.js +63 -44
  124. package/lib/module/native.js.map +1 -1
  125. package/lib/module/native.spec.js +80 -58
  126. package/lib/module/native.spec.js.map +1 -1
  127. package/lib/module/pluginHost.js +200 -0
  128. package/lib/module/pluginHost.js.map +1 -0
  129. package/lib/module/pluginHost.spec.js +291 -0
  130. package/lib/module/pluginHost.spec.js.map +1 -0
  131. package/lib/module/plugins/insights/eventId.js +122 -0
  132. package/lib/module/plugins/insights/eventId.js.map +1 -0
  133. package/lib/module/plugins/insights/eventId.spec.js +47 -0
  134. package/lib/module/plugins/insights/eventId.spec.js.map +1 -0
  135. package/lib/module/plugins/insights/index.js +268 -0
  136. package/lib/module/plugins/insights/index.js.map +1 -0
  137. package/lib/module/plugins/insights/insights.spec.js +639 -0
  138. package/lib/module/plugins/insights/insights.spec.js.map +1 -0
  139. package/lib/module/plugins/insights/sender.js +123 -0
  140. package/lib/module/plugins/insights/sender.js.map +1 -0
  141. package/lib/module/plugins/insights/sender.spec.js +265 -0
  142. package/lib/module/plugins/insights/sender.spec.js.map +1 -0
  143. package/lib/module/plugins/insights/state.js +139 -0
  144. package/lib/module/plugins/insights/state.js.map +1 -0
  145. package/lib/module/releaseCatalogCache.js +13 -2
  146. package/lib/module/releaseCatalogCache.js.map +1 -1
  147. package/lib/module/releaseCatalogCache.spec.js +18 -0
  148. package/lib/module/releaseCatalogCache.spec.js.map +1 -1
  149. package/lib/module/sdkVersion.js +1 -1
  150. package/lib/module/specs/NativeHotUpdater.js.map +1 -1
  151. package/lib/module/updateError.js +126 -0
  152. package/lib/module/updateError.js.map +1 -0
  153. package/lib/module/updateError.spec.js +149 -0
  154. package/lib/module/updateError.spec.js.map +1 -0
  155. package/lib/module/wrap.js +43 -25
  156. package/lib/module/wrap.js.map +1 -1
  157. package/lib/module/wrap.progress.spec.js +196 -0
  158. package/lib/module/wrap.progress.spec.js.map +1 -0
  159. package/lib/module/wrap.spec.js +93 -229
  160. package/lib/module/wrap.spec.js.map +1 -1
  161. package/lib/typescript/commonjs/appReady.d.ts +23 -0
  162. package/lib/typescript/commonjs/appReady.d.ts.map +1 -0
  163. package/lib/typescript/commonjs/appReady.test-utils.d.ts +9 -0
  164. package/lib/typescript/commonjs/appReady.test-utils.d.ts.map +1 -0
  165. package/lib/typescript/commonjs/baseURL.d.ts +4 -0
  166. package/lib/typescript/commonjs/baseURL.d.ts.map +1 -0
  167. package/lib/typescript/commonjs/checkForUpdate.d.ts +15 -2
  168. package/lib/typescript/commonjs/checkForUpdate.d.ts.map +1 -1
  169. package/lib/typescript/commonjs/clientPlugin.d.ts +185 -0
  170. package/lib/typescript/commonjs/clientPlugin.d.ts.map +1 -0
  171. package/lib/typescript/commonjs/fetchJSON.d.ts +2 -3
  172. package/lib/typescript/commonjs/fetchJSON.d.ts.map +1 -1
  173. package/lib/typescript/commonjs/httpClient.d.ts +2 -36
  174. package/lib/typescript/commonjs/httpClient.d.ts.map +1 -1
  175. package/lib/typescript/commonjs/index.d.ts +3 -6
  176. package/lib/typescript/commonjs/index.d.ts.map +1 -1
  177. package/lib/typescript/commonjs/native.d.ts +29 -15
  178. package/lib/typescript/commonjs/native.d.ts.map +1 -1
  179. package/lib/typescript/commonjs/pluginHost.d.ts +29 -0
  180. package/lib/typescript/commonjs/pluginHost.d.ts.map +1 -0
  181. package/lib/typescript/commonjs/plugins/insights/eventId.d.ts +18 -0
  182. package/lib/typescript/commonjs/plugins/insights/eventId.d.ts.map +1 -0
  183. package/lib/typescript/commonjs/plugins/insights/index.d.ts +40 -0
  184. package/lib/typescript/commonjs/plugins/insights/index.d.ts.map +1 -0
  185. package/lib/typescript/commonjs/plugins/insights/sender.d.ts +74 -0
  186. package/lib/typescript/commonjs/plugins/insights/sender.d.ts.map +1 -0
  187. package/lib/typescript/commonjs/plugins/insights/state.d.ts +46 -0
  188. package/lib/typescript/commonjs/plugins/insights/state.d.ts.map +1 -0
  189. package/lib/typescript/commonjs/releaseCatalogCache.d.ts +5 -1
  190. package/lib/typescript/commonjs/releaseCatalogCache.d.ts.map +1 -1
  191. package/lib/typescript/commonjs/sdkVersion.d.ts +1 -1
  192. package/lib/typescript/commonjs/specs/NativeHotUpdater.d.ts +34 -12
  193. package/lib/typescript/commonjs/specs/NativeHotUpdater.d.ts.map +1 -1
  194. package/lib/typescript/commonjs/updateError.d.ts +26 -0
  195. package/lib/typescript/commonjs/updateError.d.ts.map +1 -0
  196. package/lib/typescript/commonjs/wrap.d.ts.map +1 -1
  197. package/lib/typescript/commonjs/wrap.types.d.ts +6 -10
  198. package/lib/typescript/commonjs/wrap.types.d.ts.map +1 -1
  199. package/lib/typescript/module/appReady.d.ts +23 -0
  200. package/lib/typescript/module/appReady.d.ts.map +1 -0
  201. package/lib/typescript/module/appReady.test-utils.d.ts +9 -0
  202. package/lib/typescript/module/appReady.test-utils.d.ts.map +1 -0
  203. package/lib/typescript/module/baseURL.d.ts +4 -0
  204. package/lib/typescript/module/baseURL.d.ts.map +1 -0
  205. package/lib/typescript/module/checkForUpdate.d.ts +15 -2
  206. package/lib/typescript/module/checkForUpdate.d.ts.map +1 -1
  207. package/lib/typescript/module/clientPlugin.d.ts +185 -0
  208. package/lib/typescript/module/clientPlugin.d.ts.map +1 -0
  209. package/lib/typescript/module/fetchJSON.d.ts +2 -3
  210. package/lib/typescript/module/fetchJSON.d.ts.map +1 -1
  211. package/lib/typescript/module/httpClient.d.ts +2 -36
  212. package/lib/typescript/module/httpClient.d.ts.map +1 -1
  213. package/lib/typescript/module/index.d.ts +3 -6
  214. package/lib/typescript/module/index.d.ts.map +1 -1
  215. package/lib/typescript/module/native.d.ts +29 -15
  216. package/lib/typescript/module/native.d.ts.map +1 -1
  217. package/lib/typescript/module/pluginHost.d.ts +29 -0
  218. package/lib/typescript/module/pluginHost.d.ts.map +1 -0
  219. package/lib/typescript/module/plugins/insights/eventId.d.ts +18 -0
  220. package/lib/typescript/module/plugins/insights/eventId.d.ts.map +1 -0
  221. package/lib/typescript/module/plugins/insights/index.d.ts +40 -0
  222. package/lib/typescript/module/plugins/insights/index.d.ts.map +1 -0
  223. package/lib/typescript/module/plugins/insights/sender.d.ts +74 -0
  224. package/lib/typescript/module/plugins/insights/sender.d.ts.map +1 -0
  225. package/lib/typescript/module/plugins/insights/state.d.ts +46 -0
  226. package/lib/typescript/module/plugins/insights/state.d.ts.map +1 -0
  227. package/lib/typescript/module/releaseCatalogCache.d.ts +5 -1
  228. package/lib/typescript/module/releaseCatalogCache.d.ts.map +1 -1
  229. package/lib/typescript/module/sdkVersion.d.ts +1 -1
  230. package/lib/typescript/module/specs/NativeHotUpdater.d.ts +34 -12
  231. package/lib/typescript/module/specs/NativeHotUpdater.d.ts.map +1 -1
  232. package/lib/typescript/module/updateError.d.ts +26 -0
  233. package/lib/typescript/module/updateError.d.ts.map +1 -0
  234. package/lib/typescript/module/wrap.d.ts.map +1 -1
  235. package/lib/typescript/module/wrap.types.d.ts +6 -10
  236. package/lib/typescript/module/wrap.types.d.ts.map +1 -1
  237. package/package.json +14 -2
  238. package/plugins/insights/package.json +8 -0
  239. package/src/appReady.spec.ts +393 -0
  240. package/src/{notifyAppReadyInsights.test-utils.ts → appReady.test-utils.ts} +7 -7
  241. package/src/appReady.ts +149 -0
  242. package/src/baseURL.ts +15 -0
  243. package/src/checkForUpdate.releaseCatalog.spec.ts +370 -76
  244. package/src/checkForUpdate.ts +135 -80
  245. package/src/clientPlugin.ts +231 -0
  246. package/src/entryImportGraph.spec.ts +65 -0
  247. package/src/fetchJSON.ts +3 -10
  248. package/src/httpClient.spec.ts +30 -227
  249. package/src/httpClient.ts +20 -256
  250. package/src/index.spec.ts +117 -93
  251. package/src/index.ts +67 -52
  252. package/src/native.spec.ts +98 -72
  253. package/src/native.ts +93 -77
  254. package/src/pluginHost.spec.ts +297 -0
  255. package/src/pluginHost.ts +262 -0
  256. package/src/plugins/insights/eventId.spec.ts +60 -0
  257. package/src/plugins/insights/eventId.ts +171 -0
  258. package/src/plugins/insights/index.ts +367 -0
  259. package/src/plugins/insights/insights.spec.ts +732 -0
  260. package/src/plugins/insights/sender.spec.ts +287 -0
  261. package/src/plugins/insights/sender.ts +221 -0
  262. package/src/plugins/insights/state.ts +184 -0
  263. package/src/releaseCatalogCache.spec.ts +22 -0
  264. package/src/releaseCatalogCache.ts +19 -4
  265. package/src/sdkVersion.ts +1 -1
  266. package/src/specs/NativeHotUpdater.ts +34 -13
  267. package/src/updateError.spec.ts +144 -0
  268. package/src/updateError.ts +153 -0
  269. package/src/wrap.progress.spec.ts +232 -0
  270. package/src/wrap.spec.ts +100 -283
  271. package/src/wrap.tsx +57 -26
  272. package/src/wrap.types.ts +6 -12
  273. package/lib/commonjs/notifyAppReadyInsights.boundary.spec.js +0 -225
  274. package/lib/commonjs/notifyAppReadyInsights.boundary.spec.js.map +0 -1
  275. package/lib/commonjs/notifyAppReadyInsights.js +0 -188
  276. package/lib/commonjs/notifyAppReadyInsights.js.map +0 -1
  277. package/lib/commonjs/notifyAppReadyInsights.spec.js +0 -378
  278. package/lib/commonjs/notifyAppReadyInsights.spec.js.map +0 -1
  279. package/lib/commonjs/notifyAppReadyInsights.test-utils.js.map +0 -1
  280. package/lib/commonjs/notifyAppReadyInsights.transport.spec.js +0 -171
  281. package/lib/commonjs/notifyAppReadyInsights.transport.spec.js.map +0 -1
  282. package/lib/commonjs/uuidv7.js +0 -41
  283. package/lib/commonjs/uuidv7.js.map +0 -1
  284. package/lib/commonjs/uuidv7.spec.js +0 -30
  285. package/lib/commonjs/uuidv7.spec.js.map +0 -1
  286. package/lib/module/notifyAppReadyInsights.boundary.spec.js +0 -224
  287. package/lib/module/notifyAppReadyInsights.boundary.spec.js.map +0 -1
  288. package/lib/module/notifyAppReadyInsights.js +0 -181
  289. package/lib/module/notifyAppReadyInsights.js.map +0 -1
  290. package/lib/module/notifyAppReadyInsights.spec.js +0 -377
  291. package/lib/module/notifyAppReadyInsights.spec.js.map +0 -1
  292. package/lib/module/notifyAppReadyInsights.test-utils.js.map +0 -1
  293. package/lib/module/notifyAppReadyInsights.transport.spec.js +0 -170
  294. package/lib/module/notifyAppReadyInsights.transport.spec.js.map +0 -1
  295. package/lib/module/uuidv7.js +0 -36
  296. package/lib/module/uuidv7.js.map +0 -1
  297. package/lib/module/uuidv7.spec.js +0 -30
  298. package/lib/module/uuidv7.spec.js.map +0 -1
  299. package/lib/typescript/commonjs/notifyAppReadyInsights.d.ts +0 -25
  300. package/lib/typescript/commonjs/notifyAppReadyInsights.d.ts.map +0 -1
  301. package/lib/typescript/commonjs/notifyAppReadyInsights.test-utils.d.ts +0 -8
  302. package/lib/typescript/commonjs/notifyAppReadyInsights.test-utils.d.ts.map +0 -1
  303. package/lib/typescript/commonjs/uuidv7.d.ts +0 -10
  304. package/lib/typescript/commonjs/uuidv7.d.ts.map +0 -1
  305. package/lib/typescript/module/notifyAppReadyInsights.d.ts +0 -25
  306. package/lib/typescript/module/notifyAppReadyInsights.d.ts.map +0 -1
  307. package/lib/typescript/module/notifyAppReadyInsights.test-utils.d.ts +0 -8
  308. package/lib/typescript/module/notifyAppReadyInsights.test-utils.d.ts.map +0 -1
  309. package/lib/typescript/module/uuidv7.d.ts +0 -10
  310. package/lib/typescript/module/uuidv7.d.ts.map +0 -1
  311. package/src/notifyAppReadyInsights.boundary.spec.ts +0 -242
  312. package/src/notifyAppReadyInsights.spec.ts +0 -362
  313. package/src/notifyAppReadyInsights.transport.spec.ts +0 -196
  314. package/src/notifyAppReadyInsights.ts +0 -293
  315. package/src/uuidv7.spec.ts +0 -25
  316. package/src/uuidv7.ts +0 -38
@@ -1,293 +0,0 @@
1
- import { Platform } from "react-native";
2
-
3
- import type { HotUpdaterError } from "./error";
4
- import type { InsightsEventParams, HotUpdaterHttpClient } from "./httpClient";
5
- import {
6
- getActiveUpdateState,
7
- getAppVersion,
8
- getBundleId,
9
- getChannel,
10
- getCohort,
11
- getFingerprintHash,
12
- getInstallId,
13
- getPersistedUserIdentity,
14
- type NotifyAppReadyInsightsEvent,
15
- type NotifyAppReadyResult,
16
- readNotifyAppReady,
17
- } from "./native";
18
-
19
- export type NotifyAppReadyOptions = {
20
- insights?: boolean;
21
- client: HotUpdaterHttpClient;
22
- requestHeaders?: Record<string, string>;
23
- requestTimeout?: number;
24
- reportUnchanged?: boolean;
25
- onNotifyAppReady?: (result: NotifyAppReadyResult) => void;
26
- onError?: (error: HotUpdaterError | Error | unknown) => void;
27
- };
28
-
29
- type RequestAnimationFrame = (callback: (timestamp: number) => void) => number;
30
-
31
- let didAttemptAutomaticInsights = false;
32
- let didDownload = false;
33
- let readinessPromise: Promise<NotifyAppReadyResult | undefined> | undefined;
34
-
35
- const waitForNextFrame = () =>
36
- new Promise<void>((resolve) => {
37
- const requestAnimationFrame = (
38
- globalThis as typeof globalThis & {
39
- requestAnimationFrame?: RequestAnimationFrame;
40
- }
41
- )?.requestAnimationFrame;
42
-
43
- if (requestAnimationFrame) {
44
- requestAnimationFrame(() => resolve());
45
- return;
46
- }
47
-
48
- void Promise.resolve().then(resolve);
49
- });
50
-
51
- const assertNever = (value: never): never => {
52
- throw new Error(`[HotUpdater] Unexpected notifyAppReady status: ${value}`);
53
- };
54
-
55
- const buildNotifyAppReadyInsightsParams = (
56
- nativeResult: NotifyAppReadyResult,
57
- insightsEvent: NotifyAppReadyInsightsEvent | null,
58
- options: Pick<NotifyAppReadyOptions, "requestHeaders" | "requestTimeout">,
59
- ): InsightsEventParams => {
60
- const appVersion = getAppVersion();
61
-
62
- if (!appVersion) {
63
- throw new Error(
64
- "[HotUpdater] Automatic insights requires a non-null native app version.",
65
- );
66
- }
67
-
68
- const { userId, username } = getPersistedUserIdentity();
69
- const installId = getInstallId();
70
-
71
- if (!installId) {
72
- throw new Error(
73
- "[HotUpdater] Automatic insights requires a non-null native install id.",
74
- );
75
- }
76
-
77
- const platform: "ios" | "android" =
78
- Platform.OS === "android" ? "android" : "ios";
79
-
80
- const commonParams = {
81
- appVersion,
82
- channel: getChannel(),
83
- cohort: getCohort(),
84
- fingerprintHash: getFingerprintHash(),
85
- fromReleaseId: insightsEvent?.fromReleaseId ?? null,
86
- installId,
87
- platform,
88
- requestHeaders: options.requestHeaders,
89
- requestTimeout: options.requestTimeout,
90
- toReleaseId: insightsEvent?.toReleaseId ?? null,
91
- ...(userId != null ? { userId } : {}),
92
- ...(username != null ? { username } : {}),
93
- };
94
-
95
- switch (nativeResult.status) {
96
- case "UNCHANGED": {
97
- const bundleId = getBundleId();
98
-
99
- if (!bundleId) {
100
- throw new Error(
101
- "[HotUpdater] Automatic insights requires a non-null current bundle id.",
102
- );
103
- }
104
-
105
- const state = getActiveUpdateState();
106
- const runningSelection = [
107
- state.activeSelection,
108
- state.stableSelection,
109
- ].find(
110
- (selection) =>
111
- selection?.bundleId === bundleId &&
112
- selection.channel === commonParams.channel,
113
- );
114
-
115
- return {
116
- ...commonParams,
117
- fromBundleId: null,
118
- toBundleId: bundleId,
119
- toReleaseId: runningSelection?.releaseId ?? null,
120
- type: "UNCHANGED",
121
- updateStrategy: null,
122
- };
123
- }
124
- case "UPDATE_APPLIED":
125
- case "RECOVERED":
126
- if (!insightsEvent) {
127
- throw new Error(
128
- "[HotUpdater] Native launch report is missing persisted metadata required for automatic insights.",
129
- );
130
- }
131
-
132
- switch (insightsEvent.type) {
133
- case "UPDATE_APPLIED":
134
- return {
135
- ...commonParams,
136
- fromBundleId: insightsEvent.fromBundleId,
137
- toBundleId: insightsEvent.toBundleId,
138
- type: "UPDATE_APPLIED",
139
- updateStrategy: insightsEvent.updateStrategy,
140
- };
141
- case "RECOVERED":
142
- return {
143
- ...commonParams,
144
- fromBundleId: insightsEvent.fromBundleId,
145
- toBundleId: insightsEvent.toBundleId,
146
- type: "RECOVERED",
147
- updateStrategy: insightsEvent.updateStrategy,
148
- };
149
- default:
150
- return assertNever(insightsEvent.type);
151
- }
152
- default:
153
- return assertNever(nativeResult);
154
- }
155
- };
156
-
157
- let lastInsightsReport = Promise.resolve();
158
- const sendInsights = (
159
- options: Pick<NotifyAppReadyOptions, "client">,
160
- params: InsightsEventParams,
161
- ): Promise<void> => {
162
- lastInsightsReport = lastInsightsReport
163
- .catch(() => {})
164
- .then(async () => {
165
- const session = await options.client.createSession();
166
- await session.sendInsightsEvent(params);
167
- });
168
- return lastInsightsReport;
169
- };
170
-
171
- const maybeSendAutomaticInsights = async (
172
- options: NotifyAppReadyOptions,
173
- nativeResult: NotifyAppReadyResult,
174
- insightsEvent: NotifyAppReadyInsightsEvent | null,
175
- ): Promise<void> => {
176
- if (
177
- !options.insights ||
178
- didAttemptAutomaticInsights ||
179
- (nativeResult.status === "UNCHANGED" &&
180
- (options.reportUnchanged === false || didDownload))
181
- ) {
182
- return;
183
- }
184
-
185
- didAttemptAutomaticInsights = true;
186
-
187
- if (nativeResult.status !== "UNCHANGED" && !insightsEvent) {
188
- throw new Error(
189
- "[HotUpdater] Native launch report is missing persisted metadata required for automatic insights.",
190
- );
191
- }
192
-
193
- await sendInsights(
194
- options,
195
- buildNotifyAppReadyInsightsParams(nativeResult, insightsEvent, options),
196
- );
197
- };
198
-
199
- const notifyAppReady = async (
200
- options: NotifyAppReadyOptions,
201
- ): Promise<NotifyAppReadyResult | undefined> => {
202
- try {
203
- let nativeReadResult: ReturnType<typeof readNotifyAppReady>;
204
- do {
205
- await waitForNextFrame();
206
- nativeReadResult = readNotifyAppReady();
207
- } while (nativeReadResult.pending);
208
-
209
- const { insightsEvent, result: nativeResult } = nativeReadResult;
210
-
211
- try {
212
- await maybeSendAutomaticInsights(options, nativeResult, insightsEvent);
213
- } catch (error) {
214
- const warning = error instanceof Error ? error : new Error(String(error));
215
- console.warn(
216
- "[HotUpdater] Automatic notifyAppReady insights failed:",
217
- warning,
218
- );
219
- }
220
-
221
- options.onNotifyAppReady?.(nativeResult);
222
- return nativeResult;
223
- } catch (error) {
224
- const normalizedError =
225
- error instanceof Error ? error : new Error(String(error));
226
- options.onError?.(error);
227
- console.warn("[HotUpdater] Failed to notify app ready:", normalizedError);
228
- return undefined;
229
- }
230
- };
231
-
232
- export const handleNotifyAppReady = (
233
- options: NotifyAppReadyOptions,
234
- ): Promise<NotifyAppReadyResult | undefined> => {
235
- readinessPromise = notifyAppReady(options);
236
- return readinessPromise;
237
- };
238
-
239
- /** Called after an automatic update check finds no download or transition. */
240
- export const reportNoChange = async (
241
- options: NotifyAppReadyOptions,
242
- ): Promise<void> => {
243
- try {
244
- await maybeSendAutomaticInsights(options, { status: "UNCHANGED" }, null);
245
- } catch (error) {
246
- console.warn("[HotUpdater] Automatic no-change insights failed:", error);
247
- }
248
- };
249
-
250
- let lastDownloadedSelection: string | undefined;
251
-
252
- /** Report only after the manifest update has been verified and staged successfully. */
253
- export const reportBundleDownloaded = async (
254
- options: Pick<
255
- NotifyAppReadyOptions,
256
- "insights" | "client" | "requestHeaders" | "requestTimeout"
257
- >,
258
- transition: {
259
- readonly fromBundleId: string;
260
- readonly fromReleaseId: string | null;
261
- readonly toBundleId: string;
262
- readonly toReleaseId: string | null;
263
- readonly channel: string;
264
- readonly updateStrategy: "fingerprint" | "appVersion";
265
- },
266
- ): Promise<void> => {
267
- if (!options.insights || transition.fromBundleId === transition.toBundleId)
268
- return;
269
- const key = JSON.stringify([
270
- transition.channel,
271
- transition.toReleaseId,
272
- transition.toBundleId,
273
- ]);
274
- if (lastDownloadedSelection === key) return;
275
- lastDownloadedSelection = key;
276
- // A later init/mount in this JS runtime must not overwrite pending apply with UNCHANGED.
277
- didDownload = true;
278
- try {
279
- await readinessPromise;
280
- const common = buildNotifyAppReadyInsightsParams(
281
- { status: "UNCHANGED" },
282
- null,
283
- options,
284
- );
285
- await sendInsights(options, {
286
- ...common,
287
- ...transition,
288
- type: "UPDATE_DOWNLOADED",
289
- });
290
- } catch (error) {
291
- console.warn("[HotUpdater] Download insights failed:", error);
292
- }
293
- };
@@ -1,25 +0,0 @@
1
- import { isUUIDv7 } from "@hot-updater/core";
2
- import { afterEach, describe, expect, it, vi } from "vitest";
3
-
4
- import { createUUIDv7 } from "./uuidv7";
5
-
6
- describe("createUUIDv7", () => {
7
- afterEach(() => {
8
- vi.useRealTimers();
9
- vi.unstubAllGlobals();
10
- });
11
-
12
- it.each([
13
- { label: "Web Crypto", crypto: globalThis.crypto },
14
- { label: "no Web Crypto, as in React Native", crypto: undefined },
15
- ])("leads with the 48-bit millisecond time using $label", ({ crypto }) => {
16
- vi.useFakeTimers({ now: 0x0192_3456_789a });
17
- vi.stubGlobal("crypto", crypto);
18
-
19
- const id = createUUIDv7();
20
-
21
- expect(isUUIDv7(id)).toBe(true);
22
- expect(id.startsWith("01923456-789a-7")).toBe(true);
23
- expect(createUUIDv7()).not.toBe(id);
24
- });
25
- });
package/src/uuidv7.ts DELETED
@@ -1,38 +0,0 @@
1
- type RandomValuesSource = {
2
- readonly getRandomValues?: (array: Uint8Array) => Uint8Array;
3
- };
4
-
5
- /**
6
- * Creates an RFC 9562 UUIDv7: a 48-bit millisecond timestamp, then random bits.
7
- *
8
- * `createUUIDv7` from `@hot-updater/plugin-core` calls `crypto.getRandomValues`
9
- * unconditionally, but React Native has no Web Crypto unless the app installs a
10
- * polyfill. An Insights event ID only has to tell one event from another so a
11
- * retried POST is counted once, so `Math.random` is enough without one.
12
- */
13
- export const createUUIDv7 = (): string => {
14
- const bytes = new Uint8Array(16);
15
- const { crypto } = globalThis as { crypto?: RandomValuesSource };
16
- if (typeof crypto?.getRandomValues === "function") {
17
- crypto.getRandomValues(bytes);
18
- } else {
19
- for (let index = 0; index < bytes.length; index += 1) {
20
- bytes[index] = Math.floor(Math.random() * 256);
21
- }
22
- }
23
-
24
- // Division, not bit shifts: shifts truncate to 32 bits, and a millisecond
25
- // timestamp already needs 41.
26
- let timestamp = Date.now();
27
- for (let index = 5; index >= 0; index -= 1) {
28
- bytes[index] = timestamp % 256;
29
- timestamp = Math.floor(timestamp / 256);
30
- }
31
- bytes[6] = 0x70 | (bytes[6]! & 0x0f);
32
- bytes[8] = 0x80 | (bytes[8]! & 0x3f);
33
-
34
- const hex = Array.from(bytes, (byte) =>
35
- byte.toString(16).padStart(2, "0"),
36
- ).join("");
37
- return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;
38
- };