@hot-updater/react-native 1.0.0-rc.14 → 1.0.0-rc.15

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 (181) hide show
  1. package/android/proguard-rules.pro +2 -2
  2. package/android/src/main/java/com/hotupdater/BuiltInAssetResolver.kt +286 -0
  3. package/android/src/main/java/com/hotupdater/BundleFileStorageService.kt +650 -636
  4. package/android/src/main/java/com/hotupdater/BundleMetadata.kt +3 -0
  5. package/android/src/main/java/com/hotupdater/HotUpdaterException.kt +0 -13
  6. package/android/src/main/java/com/hotupdater/HotUpdaterImpl.kt +10 -14
  7. package/android/src/main/java/com/hotupdater/OkHttpDownloadService.kt +19 -0
  8. package/android/src/main/java/com/hotupdater/TarArchiveInputStream.kt +214 -375
  9. package/android/src/main/java/com/hotupdater/TarBrArchiveExtractor.kt +119 -0
  10. package/android/src/newarch/HotUpdater.kt +7 -9
  11. package/android/src/newarch/HotUpdaterModule.kt +40 -20
  12. package/android/src/oldarch/HotUpdater.kt +7 -9
  13. package/android/src/oldarch/HotUpdaterModule.kt +40 -20
  14. package/android/src/test/java/com/hotupdater/BundleFileStorageServiceTest.kt +1126 -74
  15. package/android/src/test/java/com/hotupdater/HotUpdaterImplTest.kt +4 -5
  16. package/android/src/test/java/com/hotupdater/TarBrArchiveExtractorTest.kt +206 -0
  17. package/ios/HotUpdater/Internal/BrotliFileDecompressor.swift +167 -0
  18. package/ios/HotUpdater/Internal/BuiltInAssetResolver.swift +196 -0
  19. package/ios/HotUpdater/Internal/BundleFileStorageService.swift +773 -1016
  20. package/ios/HotUpdater/Internal/BundleMetadata.swift +5 -0
  21. package/ios/HotUpdater/Internal/FileUtilities.swift +64 -0
  22. package/ios/HotUpdater/Internal/HotUpdater-Bridging-Header.h +0 -1
  23. package/ios/HotUpdater/Internal/HotUpdater.mm +5 -27
  24. package/ios/HotUpdater/Internal/HotUpdaterImpl.swift +47 -31
  25. package/ios/HotUpdater/Internal/NotificationExtension.swift +0 -2
  26. package/ios/HotUpdater/Internal/TarArchiveExtractor.swift +182 -311
  27. package/ios/HotUpdater/Internal/URLSessionDownloadService.swift +13 -72
  28. package/lib/commonjs/checkForUpdate.js +7 -10
  29. package/lib/commonjs/checkForUpdate.js.map +1 -1
  30. package/lib/commonjs/checkForUpdate.releaseCatalog.spec.js +9 -4
  31. package/lib/commonjs/checkForUpdate.releaseCatalog.spec.js.map +1 -1
  32. package/lib/commonjs/error.js +4 -13
  33. package/lib/commonjs/error.js.map +1 -1
  34. package/lib/commonjs/fetchJSON.js +9 -2
  35. package/lib/commonjs/fetchJSON.js.map +1 -1
  36. package/lib/commonjs/httpClient.js +44 -27
  37. package/lib/commonjs/httpClient.js.map +1 -1
  38. package/lib/commonjs/httpClient.spec.js +57 -5
  39. package/lib/commonjs/httpClient.spec.js.map +1 -1
  40. package/lib/commonjs/index.js +2 -6
  41. package/lib/commonjs/index.js.map +1 -1
  42. package/lib/commonjs/native.js +7 -8
  43. package/lib/commonjs/native.js.map +1 -1
  44. package/lib/commonjs/native.spec.js +21 -16
  45. package/lib/commonjs/native.spec.js.map +1 -1
  46. package/lib/commonjs/notifyAppReadyInsights.boundary.spec.js +7 -0
  47. package/lib/commonjs/notifyAppReadyInsights.boundary.spec.js.map +1 -1
  48. package/lib/commonjs/notifyAppReadyInsights.js +4 -1
  49. package/lib/commonjs/notifyAppReadyInsights.js.map +1 -1
  50. package/lib/commonjs/notifyAppReadyInsights.spec.js +59 -0
  51. package/lib/commonjs/notifyAppReadyInsights.spec.js.map +1 -1
  52. package/lib/commonjs/notifyAppReadyInsights.transport.spec.js +7 -0
  53. package/lib/commonjs/notifyAppReadyInsights.transport.spec.js.map +1 -1
  54. package/lib/commonjs/sdkVersion.js +1 -1
  55. package/lib/commonjs/specs/NativeHotUpdater.js.map +1 -1
  56. package/lib/commonjs/store.js +3 -10
  57. package/lib/commonjs/store.js.map +1 -1
  58. package/lib/commonjs/store.notification.spec.js +12 -4
  59. package/lib/commonjs/store.notification.spec.js.map +1 -1
  60. package/lib/commonjs/store.spec.js +2 -136
  61. package/lib/commonjs/store.spec.js.map +1 -1
  62. package/lib/commonjs/wrap.js +1 -3
  63. package/lib/commonjs/wrap.js.map +1 -1
  64. package/lib/commonjs/wrap.spec.js +7 -0
  65. package/lib/commonjs/wrap.spec.js.map +1 -1
  66. package/lib/module/checkForUpdate.js +7 -10
  67. package/lib/module/checkForUpdate.js.map +1 -1
  68. package/lib/module/checkForUpdate.releaseCatalog.spec.js +9 -4
  69. package/lib/module/checkForUpdate.releaseCatalog.spec.js.map +1 -1
  70. package/lib/module/error.js +4 -13
  71. package/lib/module/error.js.map +1 -1
  72. package/lib/module/fetchJSON.js +7 -1
  73. package/lib/module/fetchJSON.js.map +1 -1
  74. package/lib/module/httpClient.js +46 -29
  75. package/lib/module/httpClient.js.map +1 -1
  76. package/lib/module/httpClient.spec.js +57 -5
  77. package/lib/module/httpClient.spec.js.map +1 -1
  78. package/lib/module/index.js +2 -6
  79. package/lib/module/index.js.map +1 -1
  80. package/lib/module/native.js +7 -8
  81. package/lib/module/native.js.map +1 -1
  82. package/lib/module/native.spec.js +21 -16
  83. package/lib/module/native.spec.js.map +1 -1
  84. package/lib/module/notifyAppReadyInsights.boundary.spec.js +7 -0
  85. package/lib/module/notifyAppReadyInsights.boundary.spec.js.map +1 -1
  86. package/lib/module/notifyAppReadyInsights.js +5 -2
  87. package/lib/module/notifyAppReadyInsights.js.map +1 -1
  88. package/lib/module/notifyAppReadyInsights.spec.js +59 -0
  89. package/lib/module/notifyAppReadyInsights.spec.js.map +1 -1
  90. package/lib/module/notifyAppReadyInsights.transport.spec.js +7 -0
  91. package/lib/module/notifyAppReadyInsights.transport.spec.js.map +1 -1
  92. package/lib/module/sdkVersion.js +1 -1
  93. package/lib/module/specs/NativeHotUpdater.js.map +1 -1
  94. package/lib/module/store.js +3 -10
  95. package/lib/module/store.js.map +1 -1
  96. package/lib/module/store.notification.spec.js +12 -4
  97. package/lib/module/store.notification.spec.js.map +1 -1
  98. package/lib/module/store.spec.js +2 -136
  99. package/lib/module/store.spec.js.map +1 -1
  100. package/lib/module/wrap.js +1 -3
  101. package/lib/module/wrap.js.map +1 -1
  102. package/lib/module/wrap.spec.js +7 -0
  103. package/lib/module/wrap.spec.js.map +1 -1
  104. package/lib/typescript/commonjs/checkForUpdate.d.ts +1 -2
  105. package/lib/typescript/commonjs/checkForUpdate.d.ts.map +1 -1
  106. package/lib/typescript/commonjs/error.d.ts +4 -13
  107. package/lib/typescript/commonjs/error.d.ts.map +1 -1
  108. package/lib/typescript/commonjs/fetchJSON.d.ts +4 -0
  109. package/lib/typescript/commonjs/fetchJSON.d.ts.map +1 -1
  110. package/lib/typescript/commonjs/httpClient.d.ts.map +1 -1
  111. package/lib/typescript/commonjs/index.d.ts +0 -2
  112. package/lib/typescript/commonjs/index.d.ts.map +1 -1
  113. package/lib/typescript/commonjs/native.d.ts +1 -6
  114. package/lib/typescript/commonjs/native.d.ts.map +1 -1
  115. package/lib/typescript/commonjs/notifyAppReadyInsights.d.ts +1 -1
  116. package/lib/typescript/commonjs/notifyAppReadyInsights.d.ts.map +1 -1
  117. package/lib/typescript/commonjs/sdkVersion.d.ts +1 -1
  118. package/lib/typescript/commonjs/specs/NativeHotUpdater.d.ts +8 -35
  119. package/lib/typescript/commonjs/specs/NativeHotUpdater.d.ts.map +1 -1
  120. package/lib/typescript/commonjs/store.d.ts +1 -3
  121. package/lib/typescript/commonjs/store.d.ts.map +1 -1
  122. package/lib/typescript/commonjs/wrap.d.ts.map +1 -1
  123. package/lib/typescript/commonjs/wrap.types.d.ts +0 -2
  124. package/lib/typescript/commonjs/wrap.types.d.ts.map +1 -1
  125. package/lib/typescript/module/checkForUpdate.d.ts +1 -2
  126. package/lib/typescript/module/checkForUpdate.d.ts.map +1 -1
  127. package/lib/typescript/module/error.d.ts +4 -13
  128. package/lib/typescript/module/error.d.ts.map +1 -1
  129. package/lib/typescript/module/fetchJSON.d.ts +4 -0
  130. package/lib/typescript/module/fetchJSON.d.ts.map +1 -1
  131. package/lib/typescript/module/httpClient.d.ts.map +1 -1
  132. package/lib/typescript/module/index.d.ts +0 -2
  133. package/lib/typescript/module/index.d.ts.map +1 -1
  134. package/lib/typescript/module/native.d.ts +1 -6
  135. package/lib/typescript/module/native.d.ts.map +1 -1
  136. package/lib/typescript/module/notifyAppReadyInsights.d.ts +1 -1
  137. package/lib/typescript/module/notifyAppReadyInsights.d.ts.map +1 -1
  138. package/lib/typescript/module/sdkVersion.d.ts +1 -1
  139. package/lib/typescript/module/specs/NativeHotUpdater.d.ts +8 -35
  140. package/lib/typescript/module/specs/NativeHotUpdater.d.ts.map +1 -1
  141. package/lib/typescript/module/store.d.ts +1 -3
  142. package/lib/typescript/module/store.d.ts.map +1 -1
  143. package/lib/typescript/module/wrap.d.ts.map +1 -1
  144. package/lib/typescript/module/wrap.types.d.ts +0 -2
  145. package/lib/typescript/module/wrap.types.d.ts.map +1 -1
  146. package/package.json +3 -3
  147. package/src/checkForUpdate.releaseCatalog.spec.ts +10 -4
  148. package/src/checkForUpdate.ts +5 -11
  149. package/src/error.ts +4 -14
  150. package/src/fetchJSON.ts +12 -1
  151. package/src/httpClient.spec.ts +70 -5
  152. package/src/httpClient.ts +67 -53
  153. package/src/index.ts +1 -5
  154. package/src/native.spec.ts +23 -16
  155. package/src/native.ts +12 -24
  156. package/src/notifyAppReadyInsights.boundary.spec.ts +8 -0
  157. package/src/notifyAppReadyInsights.spec.ts +60 -0
  158. package/src/notifyAppReadyInsights.transport.spec.ts +8 -0
  159. package/src/notifyAppReadyInsights.ts +13 -1
  160. package/src/sdkVersion.ts +1 -1
  161. package/src/specs/NativeHotUpdater.ts +8 -36
  162. package/src/store.notification.spec.ts +13 -3
  163. package/src/store.spec.ts +0 -157
  164. package/src/store.ts +2 -23
  165. package/src/wrap.spec.ts +8 -0
  166. package/src/wrap.tsx +0 -2
  167. package/src/wrap.types.ts +0 -2
  168. package/android/src/main/java/com/hotupdater/DecompressService.kt +0 -89
  169. package/android/src/main/java/com/hotupdater/DecompressionStrategy.kt +0 -26
  170. package/android/src/main/java/com/hotupdater/TarBrDecompressionStrategy.kt +0 -117
  171. package/android/src/main/java/com/hotupdater/TarGzDecompressionStrategy.kt +0 -117
  172. package/android/src/main/java/com/hotupdater/ZipDecompressionStrategy.kt +0 -192
  173. package/android/src/test/java/com/hotupdater/TarArchiveInputStreamTest.kt +0 -68
  174. package/ios/HotUpdater/Internal/ArchiveExtractionUtilities.swift +0 -178
  175. package/ios/HotUpdater/Internal/DecompressService.swift +0 -112
  176. package/ios/HotUpdater/Internal/DecompressionStrategy.swift +0 -22
  177. package/ios/HotUpdater/Internal/StreamingTarArchiveExtractor.swift +0 -370
  178. package/ios/HotUpdater/Internal/TarBrDecompressionStrategy.swift +0 -39
  179. package/ios/HotUpdater/Internal/TarGzDecompressionStrategy.swift +0 -59
  180. package/ios/HotUpdater/Internal/ZipArchiveExtractor.swift +0 -482
  181. package/ios/HotUpdater/Internal/ZipDecompressionStrategy.swift +0 -56
@@ -21,6 +21,7 @@ data class BundleMetadata(
21
21
  val pendingUpdateStrategy: String? = null,
22
22
  val pendingTransition: PendingSelectionTransition? = null,
23
23
  val verificationPending: Boolean = false,
24
+ val launchInProgress: Boolean = false,
24
25
  val highestSeenCatalogs: Map<String, CatalogHighWater> = emptyMap(),
25
26
  val currentSelectionContexts: Map<String, String> = emptyMap(),
26
27
  val updatedAt: Long = System.currentTimeMillis(),
@@ -71,6 +72,7 @@ data class BundleMetadata(
71
72
  pendingTransition =
72
73
  json.optJSONObject("pendingTransition")?.let(PendingSelectionTransition::fromJson),
73
74
  verificationPending = json.optBoolean("verificationPending", false),
75
+ launchInProgress = json.optBoolean("launchInProgress", false),
74
76
  highestSeenCatalogs = highestSeenCatalogs,
75
77
  currentSelectionContexts = currentSelectionContexts,
76
78
  updatedAt = json.optLong("updatedAt", System.currentTimeMillis()),
@@ -121,6 +123,7 @@ data class BundleMetadata(
121
123
  put("pendingUpdateStrategy", pendingUpdateStrategy ?: JSONObject.NULL)
122
124
  put("pendingTransition", pendingTransition?.toJson() ?: JSONObject.NULL)
123
125
  put("verificationPending", verificationPending)
126
+ put("launchInProgress", launchInProgress)
124
127
  put(
125
128
  "highestSeenCatalogs",
126
129
  JSONObject().apply {
@@ -17,12 +17,6 @@ class HotUpdaterException(
17
17
  "Missing or empty 'bundleId'",
18
18
  )
19
19
 
20
- fun invalidFileUrl() =
21
- HotUpdaterException(
22
- "INVALID_FILE_URL",
23
- "Invalid 'fileUrl' provided",
24
- )
25
-
26
20
  // Bundle storage errors
27
21
  fun directoryCreationFailed() =
28
22
  HotUpdaterException(
@@ -45,13 +39,6 @@ class HotUpdaterException(
45
39
  "Download incomplete: received $actualSize bytes, expected $expectedSize bytes",
46
40
  )
47
41
 
48
- fun extractionFormatError(cause: Throwable? = null) =
49
- HotUpdaterException(
50
- "EXTRACTION_FORMAT_ERROR",
51
- "The downloaded bundle file is not a valid compressed archive",
52
- cause,
53
- )
54
-
55
42
  fun invalidBundle() =
56
43
  HotUpdaterException(
57
44
  "INVALID_BUNDLE",
@@ -83,14 +83,12 @@ class HotUpdaterImpl {
83
83
  val fileSystem = FileManagerService(appContext)
84
84
  val preferences = createPreferences(appContext)
85
85
  val downloadService = OkHttpDownloadService()
86
- val decompressService = DecompressService()
87
86
  val isolationKey = getIsolationKey(appContext)
88
87
 
89
88
  return BundleFileStorageService(
90
89
  appContext,
91
90
  fileSystem,
92
91
  downloadService,
93
- decompressService,
94
92
  preferences,
95
93
  isolationKey,
96
94
  )
@@ -268,22 +266,22 @@ class HotUpdaterImpl {
268
266
  fun getJSBundleFile(): String = prepareLaunchIfNeeded().bundleUrl
269
267
 
270
268
  /**
271
- * Updates the bundle from the specified URL
269
+ * Updates the bundle from its manifest and complete asset descriptors.
272
270
  * @param bundleId ID of the bundle to update
273
- * @param fileUrl URL of the bundle file to download (or null to reset)
274
- * @param fileHash Combined hash string for verification (sig:<signature> or <hex_hash>)
271
+ * @param manifestUrl URL of the target manifest
272
+ * @param manifestFileHash Hash or signature used to verify the target manifest
273
+ * @param assets Complete target asset descriptor map
275
274
  * @param progressCallback Callback for download progress updates
276
275
  * @throws HotUpdaterException if the update fails
277
276
  */
278
277
  suspend fun updateBundle(
279
278
  bundleId: String,
280
- fileUrl: String?,
281
- fileHash: String?,
282
- manifestUrl: String?,
283
- manifestFileHash: String?,
284
- changedAssets: Map<String, ChangedAssetDescriptor>?,
279
+ manifestUrl: String,
280
+ manifestFileHash: String,
281
+ assets: Map<String, ChangedAssetDescriptor>,
285
282
  channel: String?,
286
283
  selection: PersistedSelection? = null,
284
+ archiveUrl: String? = null,
287
285
  progressCallback: (UpdateProgressPayload) -> Unit,
288
286
  ) {
289
287
  if (selection != null && !bundleStorage.stageReleaseSelection(selection)) {
@@ -291,11 +289,10 @@ class HotUpdaterImpl {
291
289
  }
292
290
  bundleStorage.updateBundle(
293
291
  bundleId,
294
- fileUrl,
295
- fileHash,
296
292
  manifestUrl,
297
293
  manifestFileHash,
298
- changedAssets,
294
+ assets,
295
+ archiveUrl,
299
296
  progressCallback,
300
297
  )
301
298
 
@@ -467,7 +464,6 @@ class HotUpdaterImpl {
467
464
 
468
465
  /**
469
466
  * Gets the current launched bundle ID.
470
- * Reads manifest.json first and falls back to the legacy BUNDLE_ID file.
471
467
  * Built-in bundle fallback is handled in JS.
472
468
  */
473
469
  fun getBundleId(): String? {
@@ -65,6 +65,13 @@ interface DownloadService {
65
65
  fileSizeCallback: ((Long) -> Unit)? = null,
66
66
  progressCallback: (DownloadProgress) -> Unit,
67
67
  ): DownloadResult
68
+
69
+ suspend fun downloadFileOnce(
70
+ fileUrl: URL,
71
+ destination: File,
72
+ fileSizeCallback: ((Long) -> Unit)? = null,
73
+ progressCallback: (DownloadProgress) -> Unit,
74
+ ): DownloadResult = downloadFile(fileUrl, destination, fileSizeCallback, progressCallback)
68
75
  }
69
76
 
70
77
  /**
@@ -185,6 +192,18 @@ class OkHttpDownloadService : DownloadService {
185
192
  DownloadResult.Error(lastException ?: Exception("Download failed after $MAX_RETRIES attempts"))
186
193
  }
187
194
 
195
+ override suspend fun downloadFileOnce(
196
+ fileUrl: URL,
197
+ destination: File,
198
+ fileSizeCallback: ((Long) -> Unit)?,
199
+ progressCallback: (DownloadProgress) -> Unit,
200
+ ): DownloadResult =
201
+ try {
202
+ attemptDownload(fileUrl, destination, fileSizeCallback, progressCallback)
203
+ } catch (error: Exception) {
204
+ DownloadResult.Error(error)
205
+ }
206
+
188
207
  private suspend fun attemptDownload(
189
208
  fileUrl: URL,
190
209
  destination: File,