@hot-updater/react-native 0.30.12 → 0.31.1

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 (119) hide show
  1. package/HotUpdater.podspec +1 -0
  2. package/android/build.gradle +1 -0
  3. package/android/src/main/java/com/hotupdater/BsdiffPatch.kt +284 -0
  4. package/android/src/main/java/com/hotupdater/BundleFileStorageService.kt +885 -5
  5. package/android/src/main/java/com/hotupdater/HotUpdaterImpl.kt +13 -2
  6. package/android/src/main/java/com/hotupdater/OkHttpDownloadService.kt +37 -8
  7. package/android/src/main/java/com/hotupdater/ReactNativeValueConverters.kt +48 -12
  8. package/android/src/main/java/com/hotupdater/SignatureVerifier.kt +60 -22
  9. package/android/src/newarch/HotUpdater.kt +14 -2
  10. package/android/src/newarch/HotUpdaterModule.kt +112 -1
  11. package/android/src/oldarch/HotUpdater.kt +14 -2
  12. package/android/src/oldarch/HotUpdaterModule.kt +107 -3
  13. package/android/src/test/java/com/hotupdater/BsdiffPatchTest.kt +46 -0
  14. package/android/src/test/java/com/hotupdater/BundleFileStorageServiceTest.kt +29 -1
  15. package/android/src/test/java/com/hotupdater/HotUpdaterImplTest.kt +4 -1
  16. package/ios/HotUpdater/Internal/BsdiffPatchBridge.h +16 -0
  17. package/ios/HotUpdater/Internal/BsdiffPatchBridge.mm +343 -0
  18. package/ios/HotUpdater/Internal/BundleFileStorageService.swift +1093 -47
  19. package/ios/HotUpdater/Internal/HotUpdater-Bridging-Header.h +2 -0
  20. package/ios/HotUpdater/Internal/HotUpdater.mm +12 -2
  21. package/ios/HotUpdater/Internal/HotUpdaterImpl.swift +64 -5
  22. package/ios/HotUpdater/Internal/NotificationExtension.swift +2 -1
  23. package/ios/HotUpdater/Internal/SignatureVerifier.swift +28 -5
  24. package/ios/HotUpdater/Internal/StreamingTarArchiveExtractor.swift +11 -0
  25. package/ios/HotUpdater/Internal/URLSessionDownloadService.swift +11 -5
  26. package/lib/commonjs/DefaultResolver.js +6 -2
  27. package/lib/commonjs/DefaultResolver.js.map +1 -1
  28. package/lib/commonjs/DefaultResolver.spec.js +79 -3
  29. package/lib/commonjs/DefaultResolver.spec.js.map +1 -1
  30. package/lib/commonjs/checkForUpdate.js +6 -0
  31. package/lib/commonjs/checkForUpdate.js.map +1 -1
  32. package/lib/commonjs/index.js +53 -18
  33. package/lib/commonjs/index.js.map +1 -1
  34. package/lib/commonjs/index.spec.js +117 -1
  35. package/lib/commonjs/index.spec.js.map +1 -1
  36. package/lib/commonjs/native.js +40 -16
  37. package/lib/commonjs/native.js.map +1 -1
  38. package/lib/commonjs/native.spec.js +119 -3
  39. package/lib/commonjs/native.spec.js.map +1 -1
  40. package/lib/commonjs/sdkVersion.js +8 -0
  41. package/lib/commonjs/sdkVersion.js.map +1 -0
  42. package/lib/commonjs/specs/NativeHotUpdater.js.map +1 -1
  43. package/lib/commonjs/store.js +72 -5
  44. package/lib/commonjs/store.js.map +1 -1
  45. package/lib/commonjs/store.spec.js +265 -8
  46. package/lib/commonjs/store.spec.js.map +1 -1
  47. package/lib/commonjs/wrap.js +19 -5
  48. package/lib/commonjs/wrap.js.map +1 -1
  49. package/lib/commonjs/wrap.spec.js +74 -0
  50. package/lib/commonjs/wrap.spec.js.map +1 -1
  51. package/lib/module/DefaultResolver.js +6 -2
  52. package/lib/module/DefaultResolver.js.map +1 -1
  53. package/lib/module/DefaultResolver.spec.js +78 -3
  54. package/lib/module/DefaultResolver.spec.js.map +1 -1
  55. package/lib/module/checkForUpdate.js +6 -0
  56. package/lib/module/checkForUpdate.js.map +1 -1
  57. package/lib/module/index.js +53 -18
  58. package/lib/module/index.js.map +1 -1
  59. package/lib/module/index.spec.js +117 -1
  60. package/lib/module/index.spec.js.map +1 -1
  61. package/lib/module/native.js +40 -16
  62. package/lib/module/native.js.map +1 -1
  63. package/lib/module/native.spec.js +119 -3
  64. package/lib/module/native.spec.js.map +1 -1
  65. package/lib/module/sdkVersion.js +4 -0
  66. package/lib/module/sdkVersion.js.map +1 -0
  67. package/lib/module/specs/NativeHotUpdater.js.map +1 -1
  68. package/lib/module/store.js +72 -5
  69. package/lib/module/store.js.map +1 -1
  70. package/lib/module/store.spec.js +265 -8
  71. package/lib/module/store.spec.js.map +1 -1
  72. package/lib/module/wrap.js +19 -5
  73. package/lib/module/wrap.js.map +1 -1
  74. package/lib/module/wrap.spec.js +74 -0
  75. package/lib/module/wrap.spec.js.map +1 -1
  76. package/lib/typescript/commonjs/DefaultResolver.d.ts.map +1 -1
  77. package/lib/typescript/commonjs/checkForUpdate.d.ts +2 -2
  78. package/lib/typescript/commonjs/checkForUpdate.d.ts.map +1 -1
  79. package/lib/typescript/commonjs/index.d.ts +36 -8
  80. package/lib/typescript/commonjs/index.d.ts.map +1 -1
  81. package/lib/typescript/commonjs/native.d.ts +56 -3
  82. package/lib/typescript/commonjs/native.d.ts.map +1 -1
  83. package/lib/typescript/commonjs/sdkVersion.d.ts +2 -0
  84. package/lib/typescript/commonjs/sdkVersion.d.ts.map +1 -0
  85. package/lib/typescript/commonjs/specs/NativeHotUpdater.d.ts +27 -0
  86. package/lib/typescript/commonjs/specs/NativeHotUpdater.d.ts.map +1 -1
  87. package/lib/typescript/commonjs/store.d.ts +5 -0
  88. package/lib/typescript/commonjs/store.d.ts.map +1 -1
  89. package/lib/typescript/commonjs/wrap.d.ts +43 -29
  90. package/lib/typescript/commonjs/wrap.d.ts.map +1 -1
  91. package/lib/typescript/module/DefaultResolver.d.ts.map +1 -1
  92. package/lib/typescript/module/checkForUpdate.d.ts +2 -2
  93. package/lib/typescript/module/checkForUpdate.d.ts.map +1 -1
  94. package/lib/typescript/module/index.d.ts +36 -8
  95. package/lib/typescript/module/index.d.ts.map +1 -1
  96. package/lib/typescript/module/native.d.ts +56 -3
  97. package/lib/typescript/module/native.d.ts.map +1 -1
  98. package/lib/typescript/module/sdkVersion.d.ts +2 -0
  99. package/lib/typescript/module/sdkVersion.d.ts.map +1 -0
  100. package/lib/typescript/module/specs/NativeHotUpdater.d.ts +27 -0
  101. package/lib/typescript/module/specs/NativeHotUpdater.d.ts.map +1 -1
  102. package/lib/typescript/module/store.d.ts +5 -0
  103. package/lib/typescript/module/store.d.ts.map +1 -1
  104. package/lib/typescript/module/wrap.d.ts +43 -29
  105. package/lib/typescript/module/wrap.d.ts.map +1 -1
  106. package/package.json +20 -10
  107. package/src/DefaultResolver.spec.ts +103 -3
  108. package/src/DefaultResolver.ts +9 -2
  109. package/src/checkForUpdate.ts +9 -2
  110. package/src/index.spec.ts +149 -1
  111. package/src/index.ts +99 -40
  112. package/src/native.spec.ts +139 -1
  113. package/src/native.ts +145 -31
  114. package/src/sdkVersion.ts +1 -0
  115. package/src/specs/NativeHotUpdater.ts +28 -0
  116. package/src/store.spec.ts +324 -9
  117. package/src/store.ts +133 -7
  118. package/src/wrap.spec.ts +91 -0
  119. package/src/wrap.tsx +79 -42
@@ -7,6 +7,8 @@
7
7
  #import "React/RCTConstants.h"
8
8
  #import "React/RCTRootView.h"
9
9
  #import "React/RCTUtils.h" // Needed for RCTPromiseResolveBlock/RejectBlock in Swift
10
+ #import <SSZipArchive/SSZipArchive.h>
11
+ #import "BsdiffPatchBridge.h"
10
12
 
11
13
  @interface HotUpdaterRecoverySignalBridge : NSObject
12
14
  + (void)installSignalHandlers:(NSString *)crashMarkerPath;
@@ -238,6 +238,7 @@ extern "C" NSString *HotUpdaterGetMinBundleId(void)
238
238
  // Define Notification names used for observing Swift Core
239
239
  NSNotificationName const HotUpdaterDownloadProgressUpdateNotification = @"HotUpdaterDownloadProgressUpdate";
240
240
  NSNotificationName const HotUpdaterDownloadDidFinishNotification = @"HotUpdaterDownloadDidFinish";
241
+ NSNotificationName const HotUpdaterUpdateProgressDidChangeNotification = @"HotUpdaterUpdateProgressDidChange";
241
242
 
242
243
  @interface HotUpdaterRecoverySignalBridge : NSObject
243
244
  @end
@@ -279,7 +280,7 @@ NSNotificationName const HotUpdaterDownloadDidFinishNotification = @"HotUpdaterD
279
280
 
280
281
  [[NSNotificationCenter defaultCenter] addObserver:self
281
282
  selector:@selector(handleDownloadProgress:)
282
- name:HotUpdaterDownloadProgressUpdateNotification
283
+ name:HotUpdaterUpdateProgressDidChangeNotification
283
284
  object:nil];
284
285
  [[NSNotificationCenter defaultCenter] addObserver:self
285
286
  selector:@selector(handleDownloadCompletion:)
@@ -468,7 +469,7 @@ RCT_EXPORT_MODULE();
468
469
  NSTimeInterval currentTime = [[NSDate date] timeIntervalSince1970] * 1000;
469
470
  if ((currentTime - self.lastUpdateTime) >= 100 || progress >= 1.0) {
470
471
  self.lastUpdateTime = currentTime;
471
- [self sendEvent:@"onProgress" body:@{@"progress": @(progress)}];
472
+ [self sendEvent:@"onProgress" body:userInfo ?: @{}];
472
473
  }
473
474
  }
474
475
  }
@@ -553,6 +554,15 @@ RCT_EXPORT_MODULE();
553
554
  if (params.fileHash()) {
554
555
  paramDict[@"fileHash"] = params.fileHash();
555
556
  }
557
+ if (params.manifestUrl()) {
558
+ paramDict[@"manifestUrl"] = params.manifestUrl();
559
+ }
560
+ if (params.manifestFileHash()) {
561
+ paramDict[@"manifestFileHash"] = params.manifestFileHash();
562
+ }
563
+ if (params.changedAssets()) {
564
+ paramDict[@"changedAssets"] = params.changedAssets();
565
+ }
556
566
  if (params.channel()) {
557
567
  paramDict[@"channel"] = params.channel();
558
568
  }
@@ -211,7 +211,61 @@ private func hotUpdaterPerformRecoveryReload() -> Bool {
211
211
 
212
212
  // Extract fileHash if provided
213
213
  let fileHash = data["fileHash"] as? String
214
+ let manifestFileHash = data["manifestFileHash"] as? String
214
215
  let channel = data["channel"] as? String
216
+ let manifestUrlString = data["manifestUrl"] as? String ?? ""
217
+ var manifestUrl: URL? = nil
218
+ if !manifestUrlString.isEmpty {
219
+ guard let url = URL(string: manifestUrlString) else {
220
+ let error = NSError(domain: "HotUpdater", code: 0,
221
+ userInfo: [NSLocalizedDescriptionKey: "Invalid 'manifestUrl' provided: \(manifestUrlString)"])
222
+ reject("INVALID_FILE_URL", error.localizedDescription, error)
223
+ return
224
+ }
225
+ manifestUrl = url
226
+ }
227
+ let changedAssetsPayload = data["changedAssets"] as? [String: [String: Any]]
228
+ let changedAssets = changedAssetsPayload?.reduce(into: [String: ChangedAssetDescriptor]()) { partialResult, entry in
229
+ guard let fileHash = entry.value["fileHash"] as? String,
230
+ !fileHash.isEmpty
231
+ else {
232
+ return
233
+ }
234
+
235
+ let patchPayload = entry.value["patch"] as? [String: Any]
236
+ let patch = patchPayload.flatMap { payload -> BsdiffPatchDescriptor? in
237
+ guard let algorithm = payload["algorithm"] as? String,
238
+ let baseBundleId = payload["baseBundleId"] as? String,
239
+ let baseFileHash = payload["baseFileHash"] as? String,
240
+ let patchFileHash = payload["patchFileHash"] as? String,
241
+ let patchUrlString = payload["patchUrl"] as? String,
242
+ let patchUrl = URL(string: patchUrlString)
243
+ else {
244
+ return nil
245
+ }
246
+
247
+ return BsdiffPatchDescriptor(
248
+ algorithm: algorithm,
249
+ baseBundleId: baseBundleId,
250
+ baseFileHash: baseFileHash,
251
+ patchFileHash: patchFileHash,
252
+ patchUrl: patchUrl
253
+ )
254
+ }
255
+ let filePayload = entry.value["file"] as? [String: Any]
256
+ let fileUrl = (filePayload?["url"] as? String).flatMap { URL(string: $0) }
257
+ let fileCompression = filePayload?["compression"] as? String
258
+ guard fileUrl != nil || patch != nil else {
259
+ return
260
+ }
261
+
262
+ partialResult[entry.key] = ChangedAssetDescriptor(
263
+ fileUrl: fileUrl,
264
+ fileHash: fileHash,
265
+ fileCompression: fileCompression,
266
+ patch: patch
267
+ )
268
+ }
215
269
 
216
270
  // Extract progress callback if provided
217
271
  let progressCallback = data["progressCallback"] as? RCTResponseSenderBlock
@@ -219,11 +273,16 @@ private func hotUpdaterPerformRecoveryReload() -> Bool {
219
273
  NSLog("[HotUpdaterImpl] updateBundle called with bundleId: \(bundleId), fileUrl: \(fileUrl?.absoluteString ?? "nil"), fileHash: \(fileHash ?? "nil")")
220
274
 
221
275
  // Heavy work is delegated to bundle storage service with safe error handling
222
- bundleStorage.updateBundle(bundleId: bundleId, fileUrl: fileUrl, fileHash: fileHash, progressHandler: { progress in
223
- // Call JS progress callback if provided
224
- if let callback = progressCallback {
225
- DispatchQueue.main.async {
226
- callback([progress])
276
+ bundleStorage.updateBundle(bundleId: bundleId, fileUrl: fileUrl, fileHash: fileHash, manifestUrl: manifestUrl, manifestFileHash: manifestFileHash, changedAssets: changedAssets, progressHandler: { payload in
277
+ DispatchQueue.main.async {
278
+ NotificationCenter.default.post(
279
+ name: .updateProgressDidChange,
280
+ object: nil,
281
+ userInfo: payload.userInfo
282
+ )
283
+
284
+ if let callback = progressCallback {
285
+ callback([payload.progress])
227
286
  }
228
287
  }
229
288
  }) { [weak self] result in
@@ -3,4 +3,5 @@ import Foundation
3
3
  extension Notification.Name {
4
4
  static let downloadProgressUpdate = Notification.Name("HotUpdaterDownloadProgressUpdate")
5
5
  static let downloadDidFinish = Notification.Name("HotUpdaterDownloadDidFinish")
6
- }
6
+ static let updateProgressDidChange = Notification.Name("HotUpdaterUpdateProgressDidChange")
7
+ }
@@ -239,19 +239,41 @@ public class SignatureVerifier {
239
239
 
240
240
  NSLog("[SignatureVerifier] Calculated file hash: \(fileHashHex)")
241
241
 
242
- // Decode signature from base64
243
- guard let signatureData = Data(base64Encoded: signatureBase64) else {
242
+ return verifySignature(fileHash: fileHashHex, signatureBase64: signatureBase64, publicKey: publicKey)
243
+ }
244
+
245
+ /**
246
+ * Verifies an RSA-SHA256 signature for an explicit SHA256 file hash.
247
+ */
248
+ public static func verifyHashSignature(fileHash: String, signatureBase64: String) -> Result<Void, SignatureVerificationError> {
249
+ guard let publicKeyPEM = getPublicKeyFromConfig() else {
250
+ NSLog("[SignatureVerifier] Cannot verify signature: public key not configured in Info.plist")
251
+ return .failure(.publicKeyNotConfigured)
252
+ }
253
+
254
+ let publicKeyResult = createPublicKey(from: publicKeyPEM)
255
+ guard case .success(let publicKey) = publicKeyResult else {
256
+ if case .failure(let error) = publicKeyResult {
257
+ return .failure(error)
258
+ }
259
+ return .failure(.invalidPublicKeyFormat)
260
+ }
261
+
262
+ return verifySignature(fileHash: fileHash, signatureBase64: signatureBase64, publicKey: publicKey)
263
+ }
264
+
265
+ private static func verifySignature(fileHash: String, signatureBase64: String, publicKey: SecKey) -> Result<Void, SignatureVerificationError> {
266
+ guard !signatureBase64.isEmpty,
267
+ let signatureData = Data(base64Encoded: signatureBase64) else {
244
268
  NSLog("[SignatureVerifier] Failed to decode signature from base64")
245
269
  return .failure(.invalidSignatureFormat)
246
270
  }
247
271
 
248
- // Convert hex fileHash to data
249
- guard let fileHashData = dataFromHexString(fileHashHex) else {
272
+ guard let fileHashData = dataFromHexString(fileHash) else {
250
273
  NSLog("[SignatureVerifier] Failed to convert fileHash from hex")
251
274
  return .failure(.invalidSignatureFormat)
252
275
  }
253
276
 
254
- // Verify signature
255
277
  let algorithm: SecKeyAlgorithm = .rsaSignatureMessagePKCS1v15SHA256
256
278
 
257
279
  guard SecKeyIsAlgorithmSupported(publicKey, .verify, algorithm) else {
@@ -326,6 +348,7 @@ public class SignatureVerifier {
326
348
  * @return Data or nil if invalid format
327
349
  */
328
350
  private static func dataFromHexString(_ hexString: String) -> Data? {
351
+ guard hexString.count % 2 == 0 else { return nil }
329
352
  var data = Data(capacity: hexString.count / 2)
330
353
 
331
354
  var index = hexString.startIndex
@@ -49,6 +49,17 @@ enum StreamingTarArchiveExtractor {
49
49
  }
50
50
  }
51
51
 
52
+ static func decompressBrotliFile(
53
+ from sourcePath: String,
54
+ to outputPath: String
55
+ ) throws {
56
+ try decompressBrotliArchive(
57
+ from: sourcePath,
58
+ to: outputPath,
59
+ progressHandler: { _ in }
60
+ )
61
+ }
62
+
52
63
  static func containsTarEntries(file: String, algorithm: CompressedTarAlgorithm) -> Bool {
53
64
  do {
54
65
  return try withTemporaryTarFile { temporaryTarURL in
@@ -3,6 +3,12 @@ import Foundation
3
3
  import UIKit
4
4
  #endif
5
5
 
6
+ struct DownloadProgress {
7
+ let progress: Double
8
+ let downloadedBytes: Int64
9
+ let totalBytes: Int64?
10
+ }
11
+
6
12
  protocol DownloadService {
7
13
  /**
8
14
  * Downloads a file from a URL.
@@ -13,7 +19,7 @@ protocol DownloadService {
13
19
  * @param completion Callback with downloaded file URL or error
14
20
  * @return The download task (optional)
15
21
  */
16
- func downloadFile(from url: URL, to destination: String, fileSizeHandler: ((Int64) -> Void)?, progressHandler: @escaping (Double) -> Void, completion: @escaping (Result<URL, Error>) -> Void) -> URLSessionDownloadTask?
22
+ func downloadFile(from url: URL, to destination: String, fileSizeHandler: ((Int64) -> Void)?, progressHandler: @escaping (DownloadProgress) -> Void, completion: @escaping (Result<URL, Error>) -> Void) -> URLSessionDownloadTask?
17
23
  }
18
24
 
19
25
 
@@ -33,7 +39,7 @@ struct TaskState: Codable {
33
39
  class URLSessionDownloadService: NSObject, DownloadService {
34
40
  private var session: URLSession!
35
41
  private var backgroundSession: URLSession!
36
- private var progressHandlers: [URLSessionTask: (Double) -> Void] = [:]
42
+ private var progressHandlers: [URLSessionTask: (DownloadProgress) -> Void] = [:]
37
43
  private var completionHandlers: [URLSessionTask: (Result<URL, Error>) -> Void] = [:]
38
44
  private var destinations: [URLSessionTask: String] = [:]
39
45
  private var fileSizeHandlers: [URLSessionTask: (Int64) -> Void] = [:]
@@ -91,7 +97,7 @@ class URLSessionDownloadService: NSObject, DownloadService {
91
97
  }
92
98
  }
93
99
 
94
- func downloadFile(from url: URL, to destination: String, fileSizeHandler: ((Int64) -> Void)?, progressHandler: @escaping (Double) -> Void, completion: @escaping (Result<URL, Error>) -> Void) -> URLSessionDownloadTask? {
100
+ func downloadFile(from url: URL, to destination: String, fileSizeHandler: ((Int64) -> Void)?, progressHandler: @escaping (DownloadProgress) -> Void, completion: @escaping (Result<URL, Error>) -> Void) -> URLSessionDownloadTask? {
95
101
  // Determine if we should use background session
96
102
  #if !os(macOS)
97
103
  let appState = UIApplication.shared.applicationState
@@ -224,7 +230,7 @@ extension URLSessionDownloadService: URLSessionDownloadDelegate {
224
230
 
225
231
  if totalBytesExpectedToWrite > 0 {
226
232
  let progress = Double(totalBytesWritten) / Double(totalBytesExpectedToWrite)
227
- progressHandler?(progress)
233
+ progressHandler?(DownloadProgress(progress: progress, downloadedBytes: totalBytesWritten, totalBytes: totalBytesExpectedToWrite))
228
234
 
229
235
  let progressInfo: [String: Any] = [
230
236
  "progress": progress,
@@ -233,7 +239,7 @@ extension URLSessionDownloadService: URLSessionDownloadDelegate {
233
239
  ]
234
240
  NotificationCenter.default.post(name: .downloadProgressUpdate, object: downloadTask, userInfo: progressInfo)
235
241
  } else {
236
- progressHandler?(0)
242
+ progressHandler?(DownloadProgress(progress: 0, downloadedBytes: totalBytesWritten, totalBytes: nil))
237
243
 
238
244
  NotificationCenter.default.post(name: .downloadProgressUpdate, object: downloadTask, userInfo: ["progress": 0.0, "totalBytesReceived": 0, "totalBytesExpected": 0])
239
245
  }
@@ -5,6 +5,7 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.createDefaultResolver = createDefaultResolver;
7
7
  var _fetchUpdateInfo = require("./fetchUpdateInfo.js");
8
+ var _sdkVersion = require("./sdkVersion.js");
8
9
  const resolveBaseURL = async baseURL => {
9
10
  const resolvedBaseURL = typeof baseURL === "function" ? await baseURL() : baseURL;
10
11
  if (!resolvedBaseURL) {
@@ -24,7 +25,7 @@ const resolveBaseURL = async baseURL => {
24
25
  function createDefaultResolver(baseURL) {
25
26
  return {
26
27
  checkUpdate: async params => {
27
- const resolvedBaseURL = await resolveBaseURL(baseURL);
28
+ const resolvedBaseURL = (await resolveBaseURL(baseURL)).replace(/\/+$/, "");
28
29
  let url;
29
30
  const cohortPath = `/${encodeURIComponent(params.cohort)}`;
30
31
  if (params.updateStrategy === "fingerprint") {
@@ -37,7 +38,10 @@ function createDefaultResolver(baseURL) {
37
38
  }
38
39
  return (0, _fetchUpdateInfo.fetchUpdateInfo)({
39
40
  url,
40
- requestHeaders: params.requestHeaders,
41
+ requestHeaders: {
42
+ ...params.requestHeaders,
43
+ "Hot-Updater-SDK-Version": _sdkVersion.HOT_UPDATER_SDK_VERSION
44
+ },
41
45
  requestTimeout: params.requestTimeout
42
46
  });
43
47
  }
@@ -1 +1 @@
1
- {"version":3,"names":["_fetchUpdateInfo","require","resolveBaseURL","baseURL","resolvedBaseURL","Error","createDefaultResolver","checkUpdate","params","url","cohortPath","encodeURIComponent","cohort","updateStrategy","fingerprintHash","platform","channel","minBundleId","bundleId","appVersion","fetchUpdateInfo","requestHeaders","requestTimeout"],"sourceRoot":"../../src","sources":["DefaultResolver.ts"],"mappings":";;;;;;AAEA,IAAAA,gBAAA,GAAAC,OAAA;AAOA,MAAMC,cAAc,GAAG,MAAOC,OAA0B,IAAsB;EAC5E,MAAMC,eAAe,GACnB,OAAOD,OAAO,KAAK,UAAU,GAAG,MAAMA,OAAO,CAAC,CAAC,GAAGA,OAAO;EAE3D,IAAI,CAACC,eAAe,EAAE;IACpB,MAAM,IAAIC,KAAK,CAAC,iDAAiD,CAAC;EACpE;EAEA,OAAOD,eAAe;AACxB,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASE,qBAAqBA,CACnCH,OAA0B,EACN;EACpB,OAAO;IACLI,WAAW,EAAE,MACXC,MAAiC,IACC;MAClC,MAAMJ,eAAe,GAAG,MAAMF,cAAc,CAACC,OAAO,CAAC;MACrD,IAAIM,GAAW;MACf,MAAMC,UAAU,GAAG,IAAIC,kBAAkB,CAACH,MAAM,CAACI,MAAM,CAAC,EAAE;MAE1D,IAAIJ,MAAM,CAACK,cAAc,KAAK,aAAa,EAAE;QAC3C,IAAI,CAACL,MAAM,CAACM,eAAe,EAAE;UAC3B,MAAM,IAAIT,KAAK,CAAC,8BAA8B,CAAC;QACjD;QACAI,GAAG,GAAG,GAAGL,eAAe,gBAAgBI,MAAM,CAACO,QAAQ,IAAIP,MAAM,CAACM,eAAe,IAAIN,MAAM,CAACQ,OAAO,IAAIR,MAAM,CAACS,WAAW,IAAIT,MAAM,CAACU,QAAQ,GAAGR,UAAU,EAAE;MAC7J,CAAC,MAAM;QACLD,GAAG,GAAG,GAAGL,eAAe,gBAAgBI,MAAM,CAACO,QAAQ,IAAIP,MAAM,CAACW,UAAU,IAAIX,MAAM,CAACQ,OAAO,IAAIR,MAAM,CAACS,WAAW,IAAIT,MAAM,CAACU,QAAQ,GAAGR,UAAU,EAAE;MACxJ;MAEA,OAAO,IAAAU,gCAAe,EAAC;QACrBX,GAAG;QACHY,cAAc,EAAEb,MAAM,CAACa,cAAc;QACrCC,cAAc,EAAEd,MAAM,CAACc;MACzB,CAAC,CAAC;IACJ;EACF,CAAC;AACH","ignoreList":[]}
1
+ {"version":3,"names":["_fetchUpdateInfo","require","_sdkVersion","resolveBaseURL","baseURL","resolvedBaseURL","Error","createDefaultResolver","checkUpdate","params","replace","url","cohortPath","encodeURIComponent","cohort","updateStrategy","fingerprintHash","platform","channel","minBundleId","bundleId","appVersion","fetchUpdateInfo","requestHeaders","HOT_UPDATER_SDK_VERSION","requestTimeout"],"sourceRoot":"../../src","sources":["DefaultResolver.ts"],"mappings":";;;;;;AAEA,IAAAA,gBAAA,GAAAC,OAAA;AACA,IAAAC,WAAA,GAAAD,OAAA;AAOA,MAAME,cAAc,GAAG,MAAOC,OAA0B,IAAsB;EAC5E,MAAMC,eAAe,GACnB,OAAOD,OAAO,KAAK,UAAU,GAAG,MAAMA,OAAO,CAAC,CAAC,GAAGA,OAAO;EAE3D,IAAI,CAACC,eAAe,EAAE;IACpB,MAAM,IAAIC,KAAK,CAAC,iDAAiD,CAAC;EACpE;EAEA,OAAOD,eAAe;AACxB,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASE,qBAAqBA,CACnCH,OAA0B,EACN;EACpB,OAAO;IACLI,WAAW,EAAE,MACXC,MAAiC,IACC;MAClC,MAAMJ,eAAe,GAAG,CAAC,MAAMF,cAAc,CAACC,OAAO,CAAC,EAAEM,OAAO,CAC7D,MAAM,EACN,EACF,CAAC;MACD,IAAIC,GAAW;MACf,MAAMC,UAAU,GAAG,IAAIC,kBAAkB,CAACJ,MAAM,CAACK,MAAM,CAAC,EAAE;MAE1D,IAAIL,MAAM,CAACM,cAAc,KAAK,aAAa,EAAE;QAC3C,IAAI,CAACN,MAAM,CAACO,eAAe,EAAE;UAC3B,MAAM,IAAIV,KAAK,CAAC,8BAA8B,CAAC;QACjD;QACAK,GAAG,GAAG,GAAGN,eAAe,gBAAgBI,MAAM,CAACQ,QAAQ,IAAIR,MAAM,CAACO,eAAe,IAAIP,MAAM,CAACS,OAAO,IAAIT,MAAM,CAACU,WAAW,IAAIV,MAAM,CAACW,QAAQ,GAAGR,UAAU,EAAE;MAC7J,CAAC,MAAM;QACLD,GAAG,GAAG,GAAGN,eAAe,gBAAgBI,MAAM,CAACQ,QAAQ,IAAIR,MAAM,CAACY,UAAU,IAAIZ,MAAM,CAACS,OAAO,IAAIT,MAAM,CAACU,WAAW,IAAIV,MAAM,CAACW,QAAQ,GAAGR,UAAU,EAAE;MACxJ;MAEA,OAAO,IAAAU,gCAAe,EAAC;QACrBX,GAAG;QACHY,cAAc,EAAE;UACd,GAAGd,MAAM,CAACc,cAAc;UACxB,yBAAyB,EAAEC;QAC7B,CAAC;QACDC,cAAc,EAAEhB,MAAM,CAACgB;MACzB,CAAC,CAAC;IACJ;EACF,CAAC;AACH","ignoreList":[]}
@@ -1,7 +1,11 @@
1
1
  "use strict";
2
2
 
3
+ var _promises = require("node:fs/promises");
4
+ var _nodePath = require("node:path");
3
5
  var _vitest = require("vitest");
4
6
  var _DefaultResolver = require("./DefaultResolver.js");
7
+ var _sdkVersion = require("./sdkVersion.js");
8
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
5
9
  const mocks = _vitest.vi.hoisted(() => ({
6
10
  fetchUpdateInfo: _vitest.vi.fn()
7
11
  }));
@@ -24,13 +28,70 @@ const createParams = params => ({
24
28
  mocks.fetchUpdateInfo.mockReset();
25
29
  mocks.fetchUpdateInfo.mockResolvedValue(null);
26
30
  });
31
+ (0, _vitest.it)("strips trailing slashes from baseURL for app-version requests", async () => {
32
+ const resolver = (0, _DefaultResolver.createDefaultResolver)("http://localhost:3007/hot-updater/");
33
+ await resolver.checkUpdate?.(createParams({
34
+ appVersion: "1.0",
35
+ bundleId: "current-bundle",
36
+ channel: "production",
37
+ cohort: "730",
38
+ minBundleId: "min-bundle",
39
+ platform: "android"
40
+ }));
41
+ (0, _vitest.expect)(mocks.fetchUpdateInfo).toHaveBeenCalledWith({
42
+ requestHeaders: {
43
+ "Hot-Updater-SDK-Version": _sdkVersion.HOT_UPDATER_SDK_VERSION
44
+ },
45
+ requestTimeout: undefined,
46
+ url: "http://localhost:3007/hot-updater/app-version/android/1.0/production/min-bundle/current-bundle/730"
47
+ });
48
+ });
49
+ (0, _vitest.it)("strips trailing slashes from baseURL for fingerprint requests", async () => {
50
+ const resolver = (0, _DefaultResolver.createDefaultResolver)("http://localhost:3007/hot-updater///");
51
+ await resolver.checkUpdate?.(createParams({
52
+ appVersion: "1.0",
53
+ bundleId: "current-bundle",
54
+ channel: "beta",
55
+ cohort: "qa",
56
+ fingerprintHash: "fingerprint-hash",
57
+ minBundleId: "min-bundle",
58
+ platform: "ios",
59
+ requestHeaders: {
60
+ authorization: "Bearer token"
61
+ },
62
+ requestTimeout: 1500,
63
+ updateStrategy: "fingerprint"
64
+ }));
65
+ (0, _vitest.expect)(mocks.fetchUpdateInfo).toHaveBeenCalledWith({
66
+ requestHeaders: {
67
+ authorization: "Bearer token",
68
+ "Hot-Updater-SDK-Version": _sdkVersion.HOT_UPDATER_SDK_VERSION
69
+ },
70
+ requestTimeout: 1500,
71
+ url: "http://localhost:3007/hot-updater/fingerprint/ios/fingerprint-hash/beta/min-bundle/current-bundle/qa"
72
+ });
73
+ });
74
+ (0, _vitest.it)("keeps the SDK version header aligned with package.json", async () => {
75
+ const [{
76
+ HOT_UPDATER_SDK_VERSION
77
+ }, packageJson] = await Promise.all([Promise.resolve().then(() => _interopRequireWildcard(require("./sdkVersion"))), (0, _promises.readFile)((0, _nodePath.join)(__dirname, "../package.json"), "utf-8")]);
78
+ const pkg = JSON.parse(packageJson);
79
+ (0, _vitest.expect)(HOT_UPDATER_SDK_VERSION).toBe(pkg.version);
80
+ });
81
+ (0, _vitest.it)("propagates fetchUpdateInfo errors", async () => {
82
+ mocks.fetchUpdateInfo.mockRejectedValueOnce(new Error("Network failed"));
83
+ const resolver = (0, _DefaultResolver.createDefaultResolver)("http://localhost:3007/hot-updater");
84
+ await (0, _vitest.expect)(resolver.checkUpdate?.(createParams())).rejects.toThrow("Network failed");
85
+ });
27
86
  (0, _vitest.it)("resolves dynamic baseURL before checking for updates", async () => {
28
87
  const resolveBaseURL = _vitest.vi.fn(async () => "https://updates.example.com");
29
88
  const resolver = (0, _DefaultResolver.createDefaultResolver)(resolveBaseURL);
30
89
  await resolver.checkUpdate?.(createParams());
31
90
  (0, _vitest.expect)(resolveBaseURL).toHaveBeenCalledWith();
32
91
  (0, _vitest.expect)(mocks.fetchUpdateInfo).toHaveBeenCalledWith({
33
- requestHeaders: undefined,
92
+ requestHeaders: {
93
+ "Hot-Updater-SDK-Version": _sdkVersion.HOT_UPDATER_SDK_VERSION
94
+ },
34
95
  requestTimeout: undefined,
35
96
  url: "https://updates.example.com/app-version/ios/1.0.0/production/min-bundle-id/bundle-id/cohort"
36
97
  });
@@ -42,16 +103,31 @@ const createParams = params => ({
42
103
  await resolver.checkUpdate?.(createParams());
43
104
  (0, _vitest.expect)(resolveBaseURL).toHaveBeenCalledTimes(2);
44
105
  (0, _vitest.expect)(mocks.fetchUpdateInfo).toHaveBeenNthCalledWith(1, {
45
- requestHeaders: undefined,
106
+ requestHeaders: {
107
+ "Hot-Updater-SDK-Version": _sdkVersion.HOT_UPDATER_SDK_VERSION
108
+ },
46
109
  requestTimeout: undefined,
47
110
  url: "https://one.example.com/app-version/ios/1.0.0/production/min-bundle-id/bundle-id/cohort"
48
111
  });
49
112
  (0, _vitest.expect)(mocks.fetchUpdateInfo).toHaveBeenNthCalledWith(2, {
50
- requestHeaders: undefined,
113
+ requestHeaders: {
114
+ "Hot-Updater-SDK-Version": _sdkVersion.HOT_UPDATER_SDK_VERSION
115
+ },
51
116
  requestTimeout: undefined,
52
117
  url: "https://two.example.com/app-version/ios/1.0.0/production/min-bundle-id/bundle-id/cohort"
53
118
  });
54
119
  });
120
+ (0, _vitest.it)("strips trailing slashes from dynamic baseURL results", async () => {
121
+ const resolver = (0, _DefaultResolver.createDefaultResolver)(() => "https://updates.example.com/");
122
+ await resolver.checkUpdate?.(createParams());
123
+ (0, _vitest.expect)(mocks.fetchUpdateInfo).toHaveBeenCalledWith({
124
+ requestHeaders: {
125
+ "Hot-Updater-SDK-Version": _sdkVersion.HOT_UPDATER_SDK_VERSION
126
+ },
127
+ requestTimeout: undefined,
128
+ url: "https://updates.example.com/app-version/ios/1.0.0/production/min-bundle-id/bundle-id/cohort"
129
+ });
130
+ });
55
131
  (0, _vitest.it)("rejects an empty dynamic baseURL", async () => {
56
132
  const resolver = (0, _DefaultResolver.createDefaultResolver)(() => "");
57
133
  await (0, _vitest.expect)(resolver.checkUpdate?.(createParams())).rejects.toThrow("baseURL resolver must return a non-empty string");
@@ -1 +1 @@
1
- {"version":3,"names":["_vitest","require","_DefaultResolver","mocks","vi","hoisted","fetchUpdateInfo","fn","mock","createParams","params","appVersion","bundleId","channel","cohort","fingerprintHash","minBundleId","platform","updateStrategy","describe","beforeEach","mockReset","mockResolvedValue","it","resolveBaseURL","resolver","createDefaultResolver","checkUpdate","expect","toHaveBeenCalledWith","requestHeaders","undefined","requestTimeout","url","mockResolvedValueOnce","toHaveBeenCalledTimes","toHaveBeenNthCalledWith","rejects","toThrow"],"sourceRoot":"../../src","sources":["DefaultResolver.spec.ts"],"mappings":";;AAAA,IAAAA,OAAA,GAAAC,OAAA;AAEA,IAAAC,gBAAA,GAAAD,OAAA;AAGA,MAAME,KAAK,GAAGC,UAAE,CAACC,OAAO,CAAC,OAAO;EAC9BC,eAAe,EAAEF,UAAE,CAACG,EAAE,CAAC;AACzB,CAAC,CAAC,CAAC;AAEHH,UAAE,CAACI,IAAI,CAAC,mBAAmB,EAAE,OAAO;EAClCF,eAAe,EAAEH,KAAK,CAACG;AACzB,CAAC,CAAC,CAAC;AAEH,MAAMG,YAAY,GAChBC,MAA2C,KACZ;EAC/BC,UAAU,EAAE,OAAO;EACnBC,QAAQ,EAAE,WAAW;EACrBC,OAAO,EAAE,YAAY;EACrBC,MAAM,EAAE,QAAQ;EAChBC,eAAe,EAAE,IAAI;EACrBC,WAAW,EAAE,eAAe;EAC5BC,QAAQ,EAAE,KAAK;EACfC,cAAc,EAAE,YAAY;EAC5B,GAAGR;AACL,CAAC,CAAC;AAEF,IAAAS,gBAAQ,EAAC,uBAAuB,EAAE,MAAM;EACtC,IAAAC,kBAAU,EAAC,MAAM;IACfjB,KAAK,CAACG,eAAe,CAACe,SAAS,CAAC,CAAC;IACjClB,KAAK,CAACG,eAAe,CAACgB,iBAAiB,CAAC,IAAI,CAAC;EAC/C,CAAC,CAAC;EAEF,IAAAC,UAAE,EAAC,sDAAsD,EAAE,YAAY;IACrE,MAAMC,cAAc,GAAGpB,UAAE,CAACG,EAAE,CAAC,YAAY,6BAA6B,CAAC;IACvE,MAAMkB,QAAQ,GAAG,IAAAC,sCAAqB,EAACF,cAAc,CAAC;IAEtD,MAAMC,QAAQ,CAACE,WAAW,GAAGlB,YAAY,CAAC,CAAC,CAAC;IAE5C,IAAAmB,cAAM,EAACJ,cAAc,CAAC,CAACK,oBAAoB,CAAC,CAAC;IAC7C,IAAAD,cAAM,EAACzB,KAAK,CAACG,eAAe,CAAC,CAACuB,oBAAoB,CAAC;MACjDC,cAAc,EAAEC,SAAS;MACzBC,cAAc,EAAED,SAAS;MACzBE,GAAG,EAAE;IACP,CAAC,CAAC;EACJ,CAAC,CAAC;EAEF,IAAAV,UAAE,EAAC,6CAA6C,EAAE,YAAY;IAC5D,MAAMC,cAAc,GAAGpB,UAAE,CACtBG,EAAE,CAAwB,CAAC,CAC3B2B,qBAAqB,CAAC,yBAAyB,CAAC,CAChDA,qBAAqB,CAAC,yBAAyB,CAAC;IACnD,MAAMT,QAAQ,GAAG,IAAAC,sCAAqB,EAACF,cAAc,CAAC;IAEtD,MAAMC,QAAQ,CAACE,WAAW,GAAGlB,YAAY,CAAC,CAAC,CAAC;IAC5C,MAAMgB,QAAQ,CAACE,WAAW,GAAGlB,YAAY,CAAC,CAAC,CAAC;IAE5C,IAAAmB,cAAM,EAACJ,cAAc,CAAC,CAACW,qBAAqB,CAAC,CAAC,CAAC;IAC/C,IAAAP,cAAM,EAACzB,KAAK,CAACG,eAAe,CAAC,CAAC8B,uBAAuB,CAAC,CAAC,EAAE;MACvDN,cAAc,EAAEC,SAAS;MACzBC,cAAc,EAAED,SAAS;MACzBE,GAAG,EAAE;IACP,CAAC,CAAC;IACF,IAAAL,cAAM,EAACzB,KAAK,CAACG,eAAe,CAAC,CAAC8B,uBAAuB,CAAC,CAAC,EAAE;MACvDN,cAAc,EAAEC,SAAS;MACzBC,cAAc,EAAED,SAAS;MACzBE,GAAG,EAAE;IACP,CAAC,CAAC;EACJ,CAAC,CAAC;EAEF,IAAAV,UAAE,EAAC,kCAAkC,EAAE,YAAY;IACjD,MAAME,QAAQ,GAAG,IAAAC,sCAAqB,EAAC,MAAM,EAAE,CAAC;IAEhD,MAAM,IAAAE,cAAM,EAACH,QAAQ,CAACE,WAAW,GAAGlB,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC4B,OAAO,CAACC,OAAO,CAClE,iDACF,CAAC;EACH,CAAC,CAAC;AACJ,CAAC,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["_promises","require","_nodePath","_vitest","_DefaultResolver","_sdkVersion","_interopRequireWildcard","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","mocks","vi","hoisted","fetchUpdateInfo","fn","mock","createParams","params","appVersion","bundleId","channel","cohort","fingerprintHash","minBundleId","platform","updateStrategy","describe","beforeEach","mockReset","mockResolvedValue","it","resolver","createDefaultResolver","checkUpdate","expect","toHaveBeenCalledWith","requestHeaders","HOT_UPDATER_SDK_VERSION","requestTimeout","undefined","url","authorization","packageJson","Promise","all","resolve","then","readFile","join","__dirname","pkg","JSON","parse","toBe","version","mockRejectedValueOnce","Error","rejects","toThrow","resolveBaseURL","mockResolvedValueOnce","toHaveBeenCalledTimes","toHaveBeenNthCalledWith"],"sourceRoot":"../../src","sources":["DefaultResolver.spec.ts"],"mappings":"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","ignoreList":[]}
@@ -69,6 +69,9 @@ async function checkForUpdate(options) {
69
69
  if (!updateInfo) {
70
70
  return null;
71
71
  }
72
+ if (updateInfo.status === "UP_TO_DATE") {
73
+ return null;
74
+ }
72
75
  if (explicitChannel && explicitChannel !== defaultChannel && !isSwitched && updateInfo.status === "ROLLBACK") {
73
76
  return null;
74
77
  }
@@ -82,8 +85,11 @@ async function checkForUpdate(options) {
82
85
  return (0, _native.updateBundle)({
83
86
  bundleId: updateInfo.id,
84
87
  channel: runtimeChannel,
88
+ changedAssets: updateInfo.changedAssets ?? null,
85
89
  fileUrl: updateInfo.fileUrl,
86
90
  fileHash: updateInfo.fileHash,
91
+ manifestFileHash: updateInfo.manifestFileHash ?? null,
92
+ manifestUrl: updateInfo.manifestUrl ?? null,
87
93
  status: updateInfo.status,
88
94
  shouldSkipCurrentBundleIdCheck: isFirstRuntimeChannelSwitchAttempt
89
95
  });
@@ -1 +1 @@
1
- {"version":3,"names":["_reactNative","require","_error","_native","NIL_UUID","isResetToBuiltInResponse","updateInfo","status","id","fileUrl","checkForUpdate","options","__DEV__","includes","Platform","OS","onError","HotUpdaterError","currentAppVersion","getAppVersion","platform","currentBundleId","getBundleId","minBundleId","getMinBundleId","defaultChannel","getDefaultChannel","isSwitched","isChannelSwitched","currentChannel","getChannel","explicitChannel","channel","undefined","targetChannel","isFirstRuntimeChannelSwitchAttempt","requestBundleId","cohort","getCohort","error","fingerprintHash","getFingerprintHash","resolver","checkUpdate","appVersion","bundleId","updateStrategy","requestHeaders","requestTimeout","updateBundle","resetChannel","runtimeChannel","fileHash","shouldSkipCurrentBundleIdCheck"],"sourceRoot":"../../src","sources":["checkForUpdate.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_reactNative","require","_error","_native","NIL_UUID","isResetToBuiltInResponse","updateInfo","status","id","fileUrl","checkForUpdate","options","__DEV__","includes","Platform","OS","onError","HotUpdaterError","currentAppVersion","getAppVersion","platform","currentBundleId","getBundleId","minBundleId","getMinBundleId","defaultChannel","getDefaultChannel","isSwitched","isChannelSwitched","currentChannel","getChannel","explicitChannel","channel","undefined","targetChannel","isFirstRuntimeChannelSwitchAttempt","requestBundleId","cohort","getCohort","error","fingerprintHash","getFingerprintHash","resolver","checkUpdate","appVersion","bundleId","updateStrategy","requestHeaders","requestTimeout","updateBundle","resetChannel","runtimeChannel","changedAssets","fileHash","manifestFileHash","manifestUrl","shouldSkipCurrentBundleIdCheck"],"sourceRoot":"../../src","sources":["checkForUpdate.ts"],"mappings":"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","ignoreList":[]}