@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.
- package/HotUpdater.podspec +1 -0
- package/android/build.gradle +1 -0
- package/android/src/main/java/com/hotupdater/BsdiffPatch.kt +284 -0
- package/android/src/main/java/com/hotupdater/BundleFileStorageService.kt +885 -5
- package/android/src/main/java/com/hotupdater/HotUpdaterImpl.kt +13 -2
- package/android/src/main/java/com/hotupdater/OkHttpDownloadService.kt +37 -8
- package/android/src/main/java/com/hotupdater/ReactNativeValueConverters.kt +48 -12
- package/android/src/main/java/com/hotupdater/SignatureVerifier.kt +60 -22
- package/android/src/newarch/HotUpdater.kt +14 -2
- package/android/src/newarch/HotUpdaterModule.kt +112 -1
- package/android/src/oldarch/HotUpdater.kt +14 -2
- package/android/src/oldarch/HotUpdaterModule.kt +107 -3
- package/android/src/test/java/com/hotupdater/BsdiffPatchTest.kt +46 -0
- package/android/src/test/java/com/hotupdater/BundleFileStorageServiceTest.kt +29 -1
- package/android/src/test/java/com/hotupdater/HotUpdaterImplTest.kt +4 -1
- package/ios/HotUpdater/Internal/BsdiffPatchBridge.h +16 -0
- package/ios/HotUpdater/Internal/BsdiffPatchBridge.mm +343 -0
- package/ios/HotUpdater/Internal/BundleFileStorageService.swift +1093 -47
- package/ios/HotUpdater/Internal/HotUpdater-Bridging-Header.h +2 -0
- package/ios/HotUpdater/Internal/HotUpdater.mm +12 -2
- package/ios/HotUpdater/Internal/HotUpdaterImpl.swift +64 -5
- package/ios/HotUpdater/Internal/NotificationExtension.swift +2 -1
- package/ios/HotUpdater/Internal/SignatureVerifier.swift +28 -5
- package/ios/HotUpdater/Internal/StreamingTarArchiveExtractor.swift +11 -0
- package/ios/HotUpdater/Internal/URLSessionDownloadService.swift +11 -5
- package/lib/commonjs/DefaultResolver.js +6 -2
- package/lib/commonjs/DefaultResolver.js.map +1 -1
- package/lib/commonjs/DefaultResolver.spec.js +79 -3
- package/lib/commonjs/DefaultResolver.spec.js.map +1 -1
- package/lib/commonjs/checkForUpdate.js +6 -0
- package/lib/commonjs/checkForUpdate.js.map +1 -1
- package/lib/commonjs/index.js +53 -18
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/index.spec.js +117 -1
- package/lib/commonjs/index.spec.js.map +1 -1
- package/lib/commonjs/native.js +40 -16
- package/lib/commonjs/native.js.map +1 -1
- package/lib/commonjs/native.spec.js +119 -3
- package/lib/commonjs/native.spec.js.map +1 -1
- package/lib/commonjs/sdkVersion.js +8 -0
- package/lib/commonjs/sdkVersion.js.map +1 -0
- package/lib/commonjs/specs/NativeHotUpdater.js.map +1 -1
- package/lib/commonjs/store.js +72 -5
- package/lib/commonjs/store.js.map +1 -1
- package/lib/commonjs/store.spec.js +265 -8
- package/lib/commonjs/store.spec.js.map +1 -1
- package/lib/commonjs/wrap.js +19 -5
- package/lib/commonjs/wrap.js.map +1 -1
- package/lib/commonjs/wrap.spec.js +74 -0
- package/lib/commonjs/wrap.spec.js.map +1 -1
- package/lib/module/DefaultResolver.js +6 -2
- package/lib/module/DefaultResolver.js.map +1 -1
- package/lib/module/DefaultResolver.spec.js +78 -3
- package/lib/module/DefaultResolver.spec.js.map +1 -1
- package/lib/module/checkForUpdate.js +6 -0
- package/lib/module/checkForUpdate.js.map +1 -1
- package/lib/module/index.js +53 -18
- package/lib/module/index.js.map +1 -1
- package/lib/module/index.spec.js +117 -1
- package/lib/module/index.spec.js.map +1 -1
- package/lib/module/native.js +40 -16
- package/lib/module/native.js.map +1 -1
- package/lib/module/native.spec.js +119 -3
- package/lib/module/native.spec.js.map +1 -1
- package/lib/module/sdkVersion.js +4 -0
- package/lib/module/sdkVersion.js.map +1 -0
- package/lib/module/specs/NativeHotUpdater.js.map +1 -1
- package/lib/module/store.js +72 -5
- package/lib/module/store.js.map +1 -1
- package/lib/module/store.spec.js +265 -8
- package/lib/module/store.spec.js.map +1 -1
- package/lib/module/wrap.js +19 -5
- package/lib/module/wrap.js.map +1 -1
- package/lib/module/wrap.spec.js +74 -0
- package/lib/module/wrap.spec.js.map +1 -1
- package/lib/typescript/commonjs/DefaultResolver.d.ts.map +1 -1
- package/lib/typescript/commonjs/checkForUpdate.d.ts +2 -2
- package/lib/typescript/commonjs/checkForUpdate.d.ts.map +1 -1
- package/lib/typescript/commonjs/index.d.ts +36 -8
- package/lib/typescript/commonjs/index.d.ts.map +1 -1
- package/lib/typescript/commonjs/native.d.ts +56 -3
- package/lib/typescript/commonjs/native.d.ts.map +1 -1
- package/lib/typescript/commonjs/sdkVersion.d.ts +2 -0
- package/lib/typescript/commonjs/sdkVersion.d.ts.map +1 -0
- package/lib/typescript/commonjs/specs/NativeHotUpdater.d.ts +27 -0
- package/lib/typescript/commonjs/specs/NativeHotUpdater.d.ts.map +1 -1
- package/lib/typescript/commonjs/store.d.ts +5 -0
- package/lib/typescript/commonjs/store.d.ts.map +1 -1
- package/lib/typescript/commonjs/wrap.d.ts +43 -29
- package/lib/typescript/commonjs/wrap.d.ts.map +1 -1
- package/lib/typescript/module/DefaultResolver.d.ts.map +1 -1
- package/lib/typescript/module/checkForUpdate.d.ts +2 -2
- package/lib/typescript/module/checkForUpdate.d.ts.map +1 -1
- package/lib/typescript/module/index.d.ts +36 -8
- package/lib/typescript/module/index.d.ts.map +1 -1
- package/lib/typescript/module/native.d.ts +56 -3
- package/lib/typescript/module/native.d.ts.map +1 -1
- package/lib/typescript/module/sdkVersion.d.ts +2 -0
- package/lib/typescript/module/sdkVersion.d.ts.map +1 -0
- package/lib/typescript/module/specs/NativeHotUpdater.d.ts +27 -0
- package/lib/typescript/module/specs/NativeHotUpdater.d.ts.map +1 -1
- package/lib/typescript/module/store.d.ts +5 -0
- package/lib/typescript/module/store.d.ts.map +1 -1
- package/lib/typescript/module/wrap.d.ts +43 -29
- package/lib/typescript/module/wrap.d.ts.map +1 -1
- package/package.json +20 -10
- package/src/DefaultResolver.spec.ts +103 -3
- package/src/DefaultResolver.ts +9 -2
- package/src/checkForUpdate.ts +9 -2
- package/src/index.spec.ts +149 -1
- package/src/index.ts +99 -40
- package/src/native.spec.ts +139 -1
- package/src/native.ts +145 -31
- package/src/sdkVersion.ts +1 -0
- package/src/specs/NativeHotUpdater.ts +28 -0
- package/src/store.spec.ts +324 -9
- package/src/store.ts +133 -7
- package/src/wrap.spec.ts +91 -0
- 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:
|
|
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
|
|
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: {
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
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
|
-
|
|
243
|
-
|
|
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
|
-
|
|
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 (
|
|
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: (
|
|
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 (
|
|
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:
|
|
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,
|
|
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:
|
|
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:
|
|
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:
|
|
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":["
|
|
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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
|
|
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":[]}
|