@onekeyfe/react-native-range-downloader 3.0.81 → 3.0.82
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/ReactNativeRangeDownloader.podspec +7 -0
- package/android/src/main/java/com/margelo/nitro/reactnativerangedownloader/FirmwareArchiveRules.kt +291 -0
- package/android/src/main/java/com/margelo/nitro/reactnativerangedownloader/FirmwareArtifactOrphanSweep.kt +111 -0
- package/android/src/main/java/com/margelo/nitro/reactnativerangedownloader/FirmwareArtifactStore.kt +822 -0
- package/android/src/main/java/com/margelo/nitro/reactnativerangedownloader/ReactNativeRangeDownloader.kt +148 -0
- package/android/src/test/java/com/margelo/nitro/reactnativerangedownloader/FirmwareArchiveRulesTest.kt +114 -0
- package/android/src/test/java/com/margelo/nitro/reactnativerangedownloader/FirmwareArtifactDeadlineTest.kt +26 -0
- package/android/src/test/java/com/margelo/nitro/reactnativerangedownloader/FirmwareArtifactOrphanSweepTest.kt +107 -0
- package/ios/FirmwareArchiveMinizipBridge.h +33 -0
- package/ios/FirmwareArchiveMinizipBridge.mm +213 -0
- package/ios/FirmwareArtifactStore.swift +1508 -0
- package/ios/RangeDownloadLogic.swift +317 -0
- package/ios/ReactNativeRangeDownloader.swift +214 -6
- package/lib/module/index.js +2 -1
- package/lib/module/index.js.map +1 -1
- package/lib/typescript/src/ReactNativeRangeDownloader.nitro.d.ts +92 -1
- package/lib/typescript/src/ReactNativeRangeDownloader.nitro.d.ts.map +1 -1
- package/lib/typescript/src/index.d.ts +1 -0
- package/lib/typescript/src/index.d.ts.map +1 -1
- package/nitrogen/generated/android/c++/JDownloadChannel.hpp +8 -6
- package/nitrogen/generated/android/c++/JFirmwareArchiveExpectedEntry.hpp +69 -0
- package/nitrogen/generated/android/c++/JFirmwareArchiveMaterializeParams.hpp +87 -0
- package/nitrogen/generated/android/c++/JFirmwareArchiveMaterializeResult.hpp +80 -0
- package/nitrogen/generated/android/c++/JFirmwareArchiveMaterializedArtifact.hpp +63 -0
- package/nitrogen/generated/android/c++/JFirmwareArtifactCancelParams.hpp +57 -0
- package/nitrogen/generated/android/c++/JFirmwareArtifactCapabilities.hpp +88 -0
- package/nitrogen/generated/android/c++/JFirmwareArtifactDownloadParams.hpp +98 -0
- package/nitrogen/generated/android/c++/JFirmwareArtifactLease.hpp +57 -0
- package/nitrogen/generated/android/c++/JFirmwareArtifactLeaseCreateParams.hpp +57 -0
- package/nitrogen/generated/android/c++/JFirmwareArtifactLeaseReleaseParams.hpp +61 -0
- package/nitrogen/generated/android/c++/JFirmwareArtifactLeaseRetainParams.hpp +61 -0
- package/nitrogen/generated/android/c++/JFirmwareArtifactReaderCloseParams.hpp +57 -0
- package/nitrogen/generated/android/c++/JFirmwareArtifactReaderInfo.hpp +61 -0
- package/nitrogen/generated/android/c++/JFirmwareArtifactReaderReadParams.hpp +65 -0
- package/nitrogen/generated/android/c++/JFirmwareArtifactReceipt.hpp +69 -0
- package/nitrogen/generated/android/c++/JFirmwareArtifactRefParams.hpp +57 -0
- package/nitrogen/generated/android/c++/JFirmwareArtifactSweepResult.hpp +61 -0
- package/nitrogen/generated/android/c++/JFunc_void_RangeDownloadEvent.hpp +3 -3
- package/nitrogen/generated/android/c++/JHybridReactNativeRangeDownloaderSpec.cpp +274 -25
- package/nitrogen/generated/android/c++/JHybridReactNativeRangeDownloaderSpec.hpp +32 -22
- package/nitrogen/generated/android/c++/JRangeDownloadEvent.hpp +2 -2
- package/nitrogen/generated/android/c++/JRangeDownloadOutcome.hpp +6 -7
- package/nitrogen/generated/android/c++/JRangeDownloadParams.hpp +2 -2
- package/nitrogen/generated/android/c++/JRangeDownloadResult.hpp +2 -2
- package/nitrogen/generated/android/c++/JRangeFallbackKind.hpp +12 -13
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/reactnativerangedownloader/DownloadChannel.kt +5 -2
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/reactnativerangedownloader/FirmwareArchiveExpectedEntry.kt +47 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/reactnativerangedownloader/FirmwareArchiveMaterializeParams.kt +44 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/reactnativerangedownloader/FirmwareArchiveMaterializeResult.kt +38 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/reactnativerangedownloader/FirmwareArchiveMaterializedArtifact.kt +41 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/reactnativerangedownloader/FirmwareArtifactCancelParams.kt +38 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/reactnativerangedownloader/FirmwareArtifactCapabilities.kt +47 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/reactnativerangedownloader/FirmwareArtifactDownloadParams.kt +68 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/reactnativerangedownloader/FirmwareArtifactLease.kt +38 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/reactnativerangedownloader/FirmwareArtifactLeaseCreateParams.kt +38 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/reactnativerangedownloader/FirmwareArtifactLeaseReleaseParams.kt +41 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/reactnativerangedownloader/FirmwareArtifactLeaseRetainParams.kt +41 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/reactnativerangedownloader/FirmwareArtifactReaderCloseParams.kt +38 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/reactnativerangedownloader/FirmwareArtifactReaderInfo.kt +41 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/reactnativerangedownloader/FirmwareArtifactReaderReadParams.kt +44 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/reactnativerangedownloader/FirmwareArtifactReceipt.kt +47 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/reactnativerangedownloader/FirmwareArtifactRefParams.kt +38 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/reactnativerangedownloader/FirmwareArtifactSweepResult.kt +41 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/reactnativerangedownloader/Func_void_RangeDownloadEvent.kt +1 -1
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/reactnativerangedownloader/HybridReactNativeRangeDownloaderSpec.kt +65 -19
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/reactnativerangedownloader/RangeDownloadEvent.kt +2 -2
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/reactnativerangedownloader/RangeDownloadOutcome.kt +3 -1
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/reactnativerangedownloader/RangeDownloadParams.kt +2 -2
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/reactnativerangedownloader/RangeDownloadResult.kt +2 -2
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/reactnativerangedownloader/RangeFallbackKind.kt +3 -1
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/reactnativerangedownloader/reactnativerangedownloaderOnLoad.kt +1 -1
- package/nitrogen/generated/android/reactnativerangedownloader+autolinking.cmake +1 -1
- package/nitrogen/generated/android/reactnativerangedownloader+autolinking.gradle +1 -1
- package/nitrogen/generated/android/reactnativerangedownloaderOnLoad.cpp +28 -18
- package/nitrogen/generated/android/reactnativerangedownloaderOnLoad.hpp +14 -5
- package/nitrogen/generated/ios/ReactNativeRangeDownloader+autolinking.rb +2 -2
- package/nitrogen/generated/ios/ReactNativeRangeDownloader-Swift-Cxx-Bridge.cpp +49 -1
- package/nitrogen/generated/ios/ReactNativeRangeDownloader-Swift-Cxx-Bridge.hpp +348 -4
- package/nitrogen/generated/ios/ReactNativeRangeDownloader-Swift-Cxx-Umbrella.hpp +54 -1
- package/nitrogen/generated/ios/ReactNativeRangeDownloaderAutolinking.mm +1 -1
- package/nitrogen/generated/ios/ReactNativeRangeDownloaderAutolinking.swift +9 -8
- package/nitrogen/generated/ios/c++/HybridReactNativeRangeDownloaderSpecSwift.cpp +1 -1
- package/nitrogen/generated/ios/c++/HybridReactNativeRangeDownloaderSpecSwift.hpp +159 -1
- package/nitrogen/generated/ios/swift/DownloadChannel.swift +5 -1
- package/nitrogen/generated/ios/swift/FirmwareArchiveExpectedEntry.swift +44 -0
- package/nitrogen/generated/ios/swift/FirmwareArchiveMaterializeParams.swift +58 -0
- package/nitrogen/generated/ios/swift/FirmwareArchiveMaterializeResult.swift +35 -0
- package/nitrogen/generated/ios/swift/FirmwareArchiveMaterializedArtifact.swift +34 -0
- package/nitrogen/generated/ios/swift/FirmwareArtifactCancelParams.swift +29 -0
- package/nitrogen/generated/ios/swift/FirmwareArtifactCapabilities.swift +50 -0
- package/nitrogen/generated/ios/swift/FirmwareArtifactDownloadParams.swift +131 -0
- package/nitrogen/generated/ios/swift/FirmwareArtifactLease.swift +29 -0
- package/nitrogen/generated/ios/swift/FirmwareArtifactLeaseCreateParams.swift +29 -0
- package/nitrogen/generated/ios/swift/FirmwareArtifactLeaseReleaseParams.swift +34 -0
- package/nitrogen/generated/ios/swift/FirmwareArtifactLeaseRetainParams.swift +34 -0
- package/nitrogen/generated/ios/swift/FirmwareArtifactReaderCloseParams.swift +29 -0
- package/nitrogen/generated/ios/swift/FirmwareArtifactReaderInfo.swift +34 -0
- package/nitrogen/generated/ios/swift/FirmwareArtifactReaderReadParams.swift +39 -0
- package/nitrogen/generated/ios/swift/FirmwareArtifactReceipt.swift +44 -0
- package/nitrogen/generated/ios/swift/FirmwareArtifactRefParams.swift +29 -0
- package/nitrogen/generated/ios/swift/FirmwareArtifactSweepResult.swift +34 -0
- package/nitrogen/generated/ios/swift/Func_void.swift +1 -2
- package/nitrogen/generated/ios/swift/Func_void_FirmwareArchiveMaterializeResult.swift +46 -0
- package/nitrogen/generated/ios/swift/Func_void_FirmwareArtifactLease.swift +46 -0
- package/nitrogen/generated/ios/swift/Func_void_FirmwareArtifactReaderInfo.swift +46 -0
- package/nitrogen/generated/ios/swift/Func_void_FirmwareArtifactReceipt.swift +46 -0
- package/nitrogen/generated/ios/swift/Func_void_FirmwareArtifactSweepResult.swift +46 -0
- package/nitrogen/generated/ios/swift/Func_void_RangeDownloadEvent.swift +1 -2
- package/nitrogen/generated/ios/swift/Func_void_RangeDownloadResult.swift +1 -2
- package/nitrogen/generated/ios/swift/Func_void_std__exception_ptr.swift +1 -2
- package/nitrogen/generated/ios/swift/Func_void_std__shared_ptr_ArrayBuffer_.swift +46 -0
- package/nitrogen/generated/ios/swift/HybridReactNativeRangeDownloaderSpec.swift +15 -4
- package/nitrogen/generated/ios/swift/HybridReactNativeRangeDownloaderSpec_cxx.swift +230 -2
- package/nitrogen/generated/ios/swift/RangeDownloadEvent.swift +11 -42
- package/nitrogen/generated/ios/swift/RangeDownloadOutcome.swift +1 -1
- package/nitrogen/generated/ios/swift/RangeDownloadParams.swift +72 -139
- package/nitrogen/generated/ios/swift/RangeDownloadResult.swift +16 -53
- package/nitrogen/generated/ios/swift/RangeFallbackKind.swift +1 -1
- package/nitrogen/generated/shared/c++/DownloadChannel.hpp +5 -1
- package/nitrogen/generated/shared/c++/FirmwareArchiveExpectedEntry.hpp +95 -0
- package/nitrogen/generated/shared/c++/FirmwareArchiveMaterializeParams.hpp +95 -0
- package/nitrogen/generated/shared/c++/FirmwareArchiveMaterializeResult.hpp +85 -0
- package/nitrogen/generated/shared/c++/FirmwareArchiveMaterializedArtifact.hpp +89 -0
- package/nitrogen/generated/shared/c++/FirmwareArtifactCancelParams.hpp +83 -0
- package/nitrogen/generated/shared/c++/FirmwareArtifactCapabilities.hpp +96 -0
- package/nitrogen/generated/shared/c++/FirmwareArtifactDownloadParams.hpp +124 -0
- package/nitrogen/generated/shared/c++/FirmwareArtifactLease.hpp +83 -0
- package/nitrogen/generated/shared/c++/FirmwareArtifactLeaseCreateParams.hpp +83 -0
- package/nitrogen/generated/shared/c++/FirmwareArtifactLeaseReleaseParams.hpp +87 -0
- package/nitrogen/generated/shared/c++/FirmwareArtifactLeaseRetainParams.hpp +87 -0
- package/nitrogen/generated/shared/c++/FirmwareArtifactReaderCloseParams.hpp +83 -0
- package/nitrogen/generated/shared/c++/FirmwareArtifactReaderInfo.hpp +87 -0
- package/nitrogen/generated/shared/c++/FirmwareArtifactReaderReadParams.hpp +91 -0
- package/nitrogen/generated/shared/c++/FirmwareArtifactReceipt.hpp +95 -0
- package/nitrogen/generated/shared/c++/FirmwareArtifactRefParams.hpp +83 -0
- package/nitrogen/generated/shared/c++/FirmwareArtifactSweepResult.hpp +87 -0
- package/nitrogen/generated/shared/c++/HybridReactNativeRangeDownloaderSpec.cpp +13 -1
- package/nitrogen/generated/shared/c++/HybridReactNativeRangeDownloaderSpec.hpp +59 -1
- package/nitrogen/generated/shared/c++/RangeDownloadEvent.hpp +25 -17
- package/nitrogen/generated/shared/c++/RangeDownloadOutcome.hpp +1 -1
- package/nitrogen/generated/shared/c++/RangeDownloadParams.hpp +43 -35
- package/nitrogen/generated/shared/c++/RangeDownloadResult.hpp +22 -14
- package/nitrogen/generated/shared/c++/RangeFallbackKind.hpp +1 -1
- package/package.json +4 -4
- package/src/ReactNativeRangeDownloader.nitro.ts +130 -1
- package/src/index.tsx +3 -1
|
@@ -1,6 +1,323 @@
|
|
|
1
1
|
import Foundation
|
|
2
2
|
import CommonCrypto
|
|
3
3
|
|
|
4
|
+
enum FirmwareArtifactStoreError: Error, CustomStringConvertible {
|
|
5
|
+
case invalidInput(String)
|
|
6
|
+
case downloadFailed(String)
|
|
7
|
+
case integrityMismatch(String)
|
|
8
|
+
case readerInvalid(String)
|
|
9
|
+
case archiveInvalid(String)
|
|
10
|
+
|
|
11
|
+
var description: String {
|
|
12
|
+
switch self {
|
|
13
|
+
case let .invalidInput(message), let .downloadFailed(message),
|
|
14
|
+
let .integrityMismatch(message), let .readerInvalid(message),
|
|
15
|
+
let .archiveInvalid(message):
|
|
16
|
+
return message
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
enum FirmwareArtifactDeadlineError: Error {
|
|
22
|
+
case exceeded
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
enum FirmwareArtifactWallClockDeadline {
|
|
26
|
+
static func run<T>(
|
|
27
|
+
timeoutSeconds: TimeInterval,
|
|
28
|
+
operation: @escaping @Sendable () async throws -> T
|
|
29
|
+
) async throws -> T {
|
|
30
|
+
let timeoutNanoseconds = UInt64(max(0.001, timeoutSeconds) * 1_000_000_000.0)
|
|
31
|
+
return try await withThrowingTaskGroup(of: T.self) { group in
|
|
32
|
+
group.addTask {
|
|
33
|
+
try await operation()
|
|
34
|
+
}
|
|
35
|
+
group.addTask {
|
|
36
|
+
try await Task.sleep(nanoseconds: timeoutNanoseconds)
|
|
37
|
+
throw FirmwareArtifactDeadlineError.exceeded
|
|
38
|
+
}
|
|
39
|
+
defer { group.cancelAll() }
|
|
40
|
+
guard let result = try await group.next() else {
|
|
41
|
+
throw FirmwareArtifactDeadlineError.exceeded
|
|
42
|
+
}
|
|
43
|
+
return result
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
func firmwareArtifactDownloadKey(
|
|
49
|
+
transactionId: String,
|
|
50
|
+
taskId: String,
|
|
51
|
+
expectedSize: Int64?,
|
|
52
|
+
expectedSha256: String?,
|
|
53
|
+
downloadToken: String
|
|
54
|
+
) -> String {
|
|
55
|
+
"\(transactionId)|\(taskId)|\(expectedSize.map(String.init) ?? "unknown")|\(expectedSha256 ?? "unknown")|\(downloadToken)"
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
enum FirmwareArchiveDiscoveredEntriesIssue: Equatable {
|
|
59
|
+
case empty
|
|
60
|
+
case duplicateName
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
func firmwareArchiveDiscoveredEntriesIssue(
|
|
64
|
+
_ entryNames: [String]
|
|
65
|
+
) -> FirmwareArchiveDiscoveredEntriesIssue? {
|
|
66
|
+
guard !entryNames.isEmpty else {
|
|
67
|
+
return .empty
|
|
68
|
+
}
|
|
69
|
+
var names = Set<String>()
|
|
70
|
+
guard entryNames.allSatisfy({ names.insert($0).inserted }) else {
|
|
71
|
+
return .duplicateName
|
|
72
|
+
}
|
|
73
|
+
return nil
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
func firmwareArtifactDownloadToken(
|
|
77
|
+
expectedSha256: String?,
|
|
78
|
+
url: String
|
|
79
|
+
) -> String {
|
|
80
|
+
if let expectedSha256 {
|
|
81
|
+
return expectedSha256.lowercased()
|
|
82
|
+
}
|
|
83
|
+
let urlData = Data(url.utf8)
|
|
84
|
+
var hash = [UInt8](repeating: 0, count: Int(CC_SHA256_DIGEST_LENGTH))
|
|
85
|
+
urlData.withUnsafeBytes {
|
|
86
|
+
_ = CC_SHA256($0.baseAddress, CC_LONG(urlData.count), &hash)
|
|
87
|
+
}
|
|
88
|
+
return hash.map { String(format: "%02x", $0) }.joined()
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
func firmwareArtifactPartialFileName(
|
|
92
|
+
transactionId: String,
|
|
93
|
+
taskId: String,
|
|
94
|
+
downloadToken: String
|
|
95
|
+
) -> String {
|
|
96
|
+
let transactionData = Data(transactionId.utf8)
|
|
97
|
+
var hash = [UInt8](repeating: 0, count: Int(CC_SHA256_DIGEST_LENGTH))
|
|
98
|
+
transactionData.withUnsafeBytes {
|
|
99
|
+
_ = CC_SHA256($0.baseAddress, CC_LONG(transactionData.count), &hash)
|
|
100
|
+
}
|
|
101
|
+
let transactionToken = hash
|
|
102
|
+
.prefix(8)
|
|
103
|
+
.map { String(format: "%02x", $0) }
|
|
104
|
+
.joined()
|
|
105
|
+
return "\(downloadToken).\(taskId).\(transactionToken).partial"
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
func firmwareArtifactContentRangeIsValid(
|
|
109
|
+
_ value: String,
|
|
110
|
+
expectedStart: Int64,
|
|
111
|
+
expectedTotal: Int64?,
|
|
112
|
+
maxBytes: Int64
|
|
113
|
+
) -> Bool {
|
|
114
|
+
guard value.lowercased().hasPrefix("bytes ") else {
|
|
115
|
+
return false
|
|
116
|
+
}
|
|
117
|
+
guard
|
|
118
|
+
let bounds = RangeDownloadLogic.parseContentRangeBounds(value),
|
|
119
|
+
let total = RangeDownloadLogic.parseContentRangeTotal(value)
|
|
120
|
+
else {
|
|
121
|
+
return false
|
|
122
|
+
}
|
|
123
|
+
let totalMatches = expectedTotal.map { total == $0 } ?? (total > 0 && total <= maxBytes)
|
|
124
|
+
return bounds.start == expectedStart &&
|
|
125
|
+
bounds.end >= bounds.start &&
|
|
126
|
+
bounds.end < total &&
|
|
127
|
+
totalMatches
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
func firmwareArtifactResponseFits(
|
|
131
|
+
expectedContentLength: Int64,
|
|
132
|
+
baseOffset: Int64,
|
|
133
|
+
maxBytes: Int64
|
|
134
|
+
) -> Bool {
|
|
135
|
+
guard baseOffset >= 0, baseOffset <= maxBytes else {
|
|
136
|
+
return false
|
|
137
|
+
}
|
|
138
|
+
return expectedContentLength < 0 ||
|
|
139
|
+
expectedContentLength <= maxBytes - baseOffset
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
let firmwareArtifactFinalGrace: TimeInterval = 24 * 60 * 60
|
|
143
|
+
let firmwareArtifactPartialGrace: TimeInterval = 7 * 24 * 60 * 60
|
|
144
|
+
let firmwareArtifactScratchGrace: TimeInterval = firmwareArtifactPartialGrace
|
|
145
|
+
let firmwareArtifactMaxBytes: Int64 = 512 * 1024 * 1024
|
|
146
|
+
let firmwareArtifactMaxReadBytes: Int64 = 256 * 1024
|
|
147
|
+
|
|
148
|
+
func firmwareArtifactExactInt64(
|
|
149
|
+
_ value: Double,
|
|
150
|
+
minimum: Int64,
|
|
151
|
+
maximum: Int64
|
|
152
|
+
) -> Int64? {
|
|
153
|
+
guard
|
|
154
|
+
minimum <= maximum,
|
|
155
|
+
value.isFinite,
|
|
156
|
+
value.rounded() == value,
|
|
157
|
+
let converted = Int64(exactly: value),
|
|
158
|
+
converted >= minimum,
|
|
159
|
+
converted <= maximum
|
|
160
|
+
else {
|
|
161
|
+
return nil
|
|
162
|
+
}
|
|
163
|
+
return converted
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
func firmwareArtifactIdentifierIsSafe(_ value: String) -> Bool {
|
|
167
|
+
value.range(
|
|
168
|
+
of: "^[A-Za-z0-9._:-]{1,160}$",
|
|
169
|
+
options: .regularExpression
|
|
170
|
+
) != nil
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
private func firmwareArtifactScratchNameIsValid(
|
|
174
|
+
_ name: String,
|
|
175
|
+
prefix: String
|
|
176
|
+
) -> Bool {
|
|
177
|
+
guard name.hasPrefix(prefix) else {
|
|
178
|
+
return false
|
|
179
|
+
}
|
|
180
|
+
let rawUUID = String(name.dropFirst(prefix.count))
|
|
181
|
+
guard
|
|
182
|
+
rawUUID.count == 36,
|
|
183
|
+
let uuid = UUID(uuidString: rawUUID)
|
|
184
|
+
else {
|
|
185
|
+
return false
|
|
186
|
+
}
|
|
187
|
+
return uuid.uuidString.caseInsensitiveCompare(rawUUID) == .orderedSame
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
private func firmwareArtifactEntrySize(
|
|
191
|
+
_ entryURL: URL,
|
|
192
|
+
values: URLResourceValues,
|
|
193
|
+
fileManager: FileManager
|
|
194
|
+
) -> Int64 {
|
|
195
|
+
if values.isRegularFile == true {
|
|
196
|
+
return Int64(values.fileSize ?? 0)
|
|
197
|
+
}
|
|
198
|
+
guard
|
|
199
|
+
values.isDirectory == true,
|
|
200
|
+
let enumerator = fileManager.enumerator(
|
|
201
|
+
at: entryURL,
|
|
202
|
+
includingPropertiesForKeys: [
|
|
203
|
+
.isRegularFileKey,
|
|
204
|
+
.isSymbolicLinkKey,
|
|
205
|
+
.fileSizeKey,
|
|
206
|
+
],
|
|
207
|
+
options: [],
|
|
208
|
+
errorHandler: nil
|
|
209
|
+
)
|
|
210
|
+
else {
|
|
211
|
+
return 0
|
|
212
|
+
}
|
|
213
|
+
var size: Int64 = 0
|
|
214
|
+
for case let childURL as URL in enumerator {
|
|
215
|
+
guard
|
|
216
|
+
let childValues = try? childURL.resourceValues(
|
|
217
|
+
forKeys: [.isRegularFileKey, .isSymbolicLinkKey, .fileSizeKey]
|
|
218
|
+
),
|
|
219
|
+
childValues.isRegularFile == true,
|
|
220
|
+
childValues.isSymbolicLink != true
|
|
221
|
+
else {
|
|
222
|
+
continue
|
|
223
|
+
}
|
|
224
|
+
size += Int64(childValues.fileSize ?? 0)
|
|
225
|
+
}
|
|
226
|
+
return size
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
func sweepFirmwareArtifactOrphansAtRoot(
|
|
230
|
+
_ rootURL: URL,
|
|
231
|
+
retainedSha256: Set<String>,
|
|
232
|
+
activeSha256: Set<String>,
|
|
233
|
+
openPaths: Set<String>,
|
|
234
|
+
now: Date = Date(),
|
|
235
|
+
fileManager: FileManager = .default
|
|
236
|
+
) throws -> (deletedFiles: Int, deletedBytes: Int64) {
|
|
237
|
+
var deletedFiles = 0
|
|
238
|
+
var deletedBytes: Int64 = 0
|
|
239
|
+
let resourceKeys: Set<URLResourceKey> = [
|
|
240
|
+
.isRegularFileKey,
|
|
241
|
+
.isDirectoryKey,
|
|
242
|
+
.isSymbolicLinkKey,
|
|
243
|
+
.contentModificationDateKey,
|
|
244
|
+
.fileSizeKey,
|
|
245
|
+
]
|
|
246
|
+
let entries = try fileManager.contentsOfDirectory(
|
|
247
|
+
at: rootURL,
|
|
248
|
+
includingPropertiesForKeys: Array(resourceKeys),
|
|
249
|
+
options: []
|
|
250
|
+
)
|
|
251
|
+
for entryURL in entries {
|
|
252
|
+
let name = entryURL.lastPathComponent
|
|
253
|
+
let values = try entryURL.resourceValues(forKeys: resourceKeys)
|
|
254
|
+
let isArchiveScratch = firmwareArtifactScratchNameIsValid(
|
|
255
|
+
name,
|
|
256
|
+
prefix: "archive-"
|
|
257
|
+
)
|
|
258
|
+
let isPromoteScratch = firmwareArtifactScratchNameIsValid(
|
|
259
|
+
name,
|
|
260
|
+
prefix: ".promote-"
|
|
261
|
+
)
|
|
262
|
+
let isScratchCandidate = values.isSymbolicLink != true &&
|
|
263
|
+
((isArchiveScratch && values.isDirectory == true) ||
|
|
264
|
+
(isPromoteScratch && values.isRegularFile == true))
|
|
265
|
+
if isScratchCandidate {
|
|
266
|
+
guard
|
|
267
|
+
let modifiedAt = values.contentModificationDate,
|
|
268
|
+
now.timeIntervalSince(modifiedAt) >= firmwareArtifactScratchGrace
|
|
269
|
+
else {
|
|
270
|
+
continue
|
|
271
|
+
}
|
|
272
|
+
let size = firmwareArtifactEntrySize(
|
|
273
|
+
entryURL,
|
|
274
|
+
values: values,
|
|
275
|
+
fileManager: fileManager
|
|
276
|
+
)
|
|
277
|
+
try fileManager.removeItem(at: entryURL)
|
|
278
|
+
deletedFiles += 1
|
|
279
|
+
deletedBytes += size
|
|
280
|
+
continue
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
guard
|
|
284
|
+
values.isRegularFile == true,
|
|
285
|
+
values.isSymbolicLink != true,
|
|
286
|
+
name.count >= 64
|
|
287
|
+
else {
|
|
288
|
+
continue
|
|
289
|
+
}
|
|
290
|
+
let sha256 = String(name.prefix(64))
|
|
291
|
+
guard
|
|
292
|
+
sha256.range(of: "^[a-f0-9]{64}$", options: .regularExpression) != nil,
|
|
293
|
+
!retainedSha256.contains(sha256),
|
|
294
|
+
!activeSha256.contains(sha256),
|
|
295
|
+
!openPaths.contains(entryURL.path)
|
|
296
|
+
else {
|
|
297
|
+
continue
|
|
298
|
+
}
|
|
299
|
+
let grace: TimeInterval
|
|
300
|
+
if name.hasSuffix(".bin") {
|
|
301
|
+
grace = firmwareArtifactFinalGrace
|
|
302
|
+
} else if name.hasSuffix(".partial") {
|
|
303
|
+
grace = firmwareArtifactPartialGrace
|
|
304
|
+
} else {
|
|
305
|
+
continue
|
|
306
|
+
}
|
|
307
|
+
guard
|
|
308
|
+
let modifiedAt = values.contentModificationDate,
|
|
309
|
+
now.timeIntervalSince(modifiedAt) >= grace
|
|
310
|
+
else {
|
|
311
|
+
continue
|
|
312
|
+
}
|
|
313
|
+
let size = Int64(values.fileSize ?? 0)
|
|
314
|
+
try fileManager.removeItem(at: entryURL)
|
|
315
|
+
deletedFiles += 1
|
|
316
|
+
deletedBytes += size
|
|
317
|
+
}
|
|
318
|
+
return (deletedFiles, deletedBytes)
|
|
319
|
+
}
|
|
320
|
+
|
|
4
321
|
// MARK: - Dependency-free RangeDownloader logic (OCDS §4 / §5)
|
|
5
322
|
//
|
|
6
323
|
// This file holds the DETERMINISTIC, dependency-light pieces of the range
|
|
@@ -2,6 +2,16 @@ import Foundation
|
|
|
2
2
|
import NitroModules
|
|
3
3
|
import ReactNativeNativeLogger
|
|
4
4
|
|
|
5
|
+
private func settledFirmwareArtifactPromise<T>(
|
|
6
|
+
_ operation: () throws -> T
|
|
7
|
+
) -> Promise<T> {
|
|
8
|
+
do {
|
|
9
|
+
return Promise.resolved(withResult: try operation())
|
|
10
|
+
} catch {
|
|
11
|
+
return Promise.rejected(withError: error)
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
|
|
5
15
|
// MARK: - Nitro HybridObject entry point
|
|
6
16
|
//
|
|
7
17
|
// Thin Nitro shim over `RangeDownloader.shared`. The heavy lifting — concurrent
|
|
@@ -95,6 +105,188 @@ class ReactNativeRangeDownloader: HybridReactNativeRangeDownloaderSpec {
|
|
|
95
105
|
}
|
|
96
106
|
return NSTemporaryDirectory()
|
|
97
107
|
}
|
|
108
|
+
|
|
109
|
+
func getFirmwareArtifactCapabilities() throws -> FirmwareArtifactCapabilities {
|
|
110
|
+
FirmwareArtifactCapabilities(
|
|
111
|
+
firmwareArtifactProtocolVersion: 4,
|
|
112
|
+
supportedRouteTypes: ["domain"],
|
|
113
|
+
supportsArchiveMaterialization: true,
|
|
114
|
+
maxReadBytes: Double(FirmwareArtifactStore.maxReadBytes)
|
|
115
|
+
)
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
func downloadFirmwareArtifact(
|
|
119
|
+
params: FirmwareArtifactDownloadParams
|
|
120
|
+
) throws -> Promise<FirmwareArtifactReceipt> {
|
|
121
|
+
do {
|
|
122
|
+
if let artifact = try FirmwareArtifactStore.shared.cachedArtifact(params) {
|
|
123
|
+
return Promise.resolved(
|
|
124
|
+
withResult: FirmwareArtifactReceipt(
|
|
125
|
+
artifactRef: artifact.artifactRef,
|
|
126
|
+
size: Double(artifact.size),
|
|
127
|
+
sha256: artifact.sha256,
|
|
128
|
+
expectedSha256Verified: params.expectedSha256 != nil
|
|
129
|
+
)
|
|
130
|
+
)
|
|
131
|
+
}
|
|
132
|
+
} catch {
|
|
133
|
+
return Promise.rejected(withError: error)
|
|
134
|
+
}
|
|
135
|
+
return Promise.async {
|
|
136
|
+
let artifact = try await FirmwareArtifactStore.shared.download(params)
|
|
137
|
+
return FirmwareArtifactReceipt(
|
|
138
|
+
artifactRef: artifact.artifactRef,
|
|
139
|
+
size: Double(artifact.size),
|
|
140
|
+
sha256: artifact.sha256,
|
|
141
|
+
expectedSha256Verified: params.expectedSha256 != nil
|
|
142
|
+
)
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
func cancelFirmwareArtifactDownloads(
|
|
147
|
+
params: FirmwareArtifactCancelParams
|
|
148
|
+
) throws -> Promise<Void> {
|
|
149
|
+
guard FirmwareArtifactStore.isSafeIdentifier(params.transactionId) else {
|
|
150
|
+
return Promise.rejected(
|
|
151
|
+
withError: FirmwareArtifactStoreError.invalidInput(
|
|
152
|
+
"Invalid firmware transactionId"
|
|
153
|
+
)
|
|
154
|
+
)
|
|
155
|
+
}
|
|
156
|
+
return Promise.async {
|
|
157
|
+
try await FirmwareArtifactStore.shared.cancelDownloads(
|
|
158
|
+
transactionId: params.transactionId
|
|
159
|
+
)
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
func discardFirmwareArtifact(
|
|
164
|
+
params: FirmwareArtifactRefParams
|
|
165
|
+
) throws -> Promise<Void> {
|
|
166
|
+
settledFirmwareArtifactPromise {
|
|
167
|
+
try FirmwareArtifactStore.shared.discard(artifactRef: params.artifactRef)
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
func openFirmwareArtifact(
|
|
172
|
+
params: FirmwareArtifactRefParams
|
|
173
|
+
) throws -> Promise<FirmwareArtifactReaderInfo> {
|
|
174
|
+
settledFirmwareArtifactPromise {
|
|
175
|
+
let reader = try FirmwareArtifactStore.shared.open(
|
|
176
|
+
artifactRef: params.artifactRef
|
|
177
|
+
)
|
|
178
|
+
return FirmwareArtifactReaderInfo(
|
|
179
|
+
readerId: reader.readerId,
|
|
180
|
+
size: Double(reader.size)
|
|
181
|
+
)
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
func readFirmwareArtifact(
|
|
186
|
+
params: FirmwareArtifactReaderReadParams
|
|
187
|
+
) throws -> Promise<ArrayBuffer> {
|
|
188
|
+
settledFirmwareArtifactPromise {
|
|
189
|
+
guard
|
|
190
|
+
let offset = firmwareArtifactExactInt64(
|
|
191
|
+
params.offset,
|
|
192
|
+
minimum: 0,
|
|
193
|
+
maximum: FirmwareArtifactStore.maxArtifactBytes
|
|
194
|
+
),
|
|
195
|
+
let length = firmwareArtifactExactInt64(
|
|
196
|
+
params.length,
|
|
197
|
+
minimum: 1,
|
|
198
|
+
maximum: firmwareArtifactMaxReadBytes
|
|
199
|
+
)
|
|
200
|
+
else {
|
|
201
|
+
throw FirmwareArtifactStoreError.readerInvalid(
|
|
202
|
+
"Invalid firmware artifact read"
|
|
203
|
+
)
|
|
204
|
+
}
|
|
205
|
+
let data = try FirmwareArtifactStore.shared.read(
|
|
206
|
+
readerId: params.readerId,
|
|
207
|
+
offset: offset,
|
|
208
|
+
length: Int(length)
|
|
209
|
+
)
|
|
210
|
+
return try ArrayBuffer.copy(data: data)
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
func closeFirmwareArtifact(
|
|
215
|
+
params: FirmwareArtifactReaderCloseParams
|
|
216
|
+
) throws -> Promise<Void> {
|
|
217
|
+
settledFirmwareArtifactPromise {
|
|
218
|
+
try FirmwareArtifactStore.shared.close(readerId: params.readerId)
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
func materializeFirmwareArchive(
|
|
223
|
+
params: FirmwareArchiveMaterializeParams
|
|
224
|
+
) throws -> Promise<FirmwareArchiveMaterializeResult> {
|
|
225
|
+
settledFirmwareArtifactPromise {
|
|
226
|
+
let entries = try FirmwareArtifactStore.shared.materializeArchive(
|
|
227
|
+
leaseRef: params.leaseRef,
|
|
228
|
+
artifactRef: params.archiveArtifactRef,
|
|
229
|
+
expectedEntries: params.expectedEntries
|
|
230
|
+
)
|
|
231
|
+
return FirmwareArchiveMaterializeResult(
|
|
232
|
+
artifacts: entries.map { entry in
|
|
233
|
+
FirmwareArchiveMaterializedArtifact(
|
|
234
|
+
entryName: entry.entryName,
|
|
235
|
+
receipt: FirmwareArtifactReceipt(
|
|
236
|
+
artifactRef: entry.artifact.artifactRef,
|
|
237
|
+
size: Double(entry.artifact.size),
|
|
238
|
+
sha256: entry.artifact.sha256,
|
|
239
|
+
expectedSha256Verified: params.expectedEntries != nil
|
|
240
|
+
)
|
|
241
|
+
)
|
|
242
|
+
}
|
|
243
|
+
)
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
func createFirmwareArtifactLease(
|
|
248
|
+
params: FirmwareArtifactLeaseCreateParams
|
|
249
|
+
) throws -> Promise<FirmwareArtifactLease> {
|
|
250
|
+
settledFirmwareArtifactPromise {
|
|
251
|
+
FirmwareArtifactLease(
|
|
252
|
+
leaseRef: try FirmwareArtifactStore.shared.createLease(
|
|
253
|
+
transactionId: params.transactionId
|
|
254
|
+
)
|
|
255
|
+
)
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
func retainFirmwareArtifact(
|
|
260
|
+
params: FirmwareArtifactLeaseRetainParams
|
|
261
|
+
) throws -> Promise<Void> {
|
|
262
|
+
settledFirmwareArtifactPromise {
|
|
263
|
+
try FirmwareArtifactStore.shared.retain(
|
|
264
|
+
leaseRef: params.leaseRef,
|
|
265
|
+
artifactRef: params.artifactRef
|
|
266
|
+
)
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
func releaseFirmwareArtifactLease(
|
|
271
|
+
params: FirmwareArtifactLeaseReleaseParams
|
|
272
|
+
) throws -> Promise<Void> {
|
|
273
|
+
settledFirmwareArtifactPromise {
|
|
274
|
+
try FirmwareArtifactStore.shared.releaseLease(
|
|
275
|
+
leaseRef: params.leaseRef,
|
|
276
|
+
disposition: params.disposition
|
|
277
|
+
)
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
func sweepFirmwareArtifactOrphans() throws -> Promise<FirmwareArtifactSweepResult> {
|
|
282
|
+
settledFirmwareArtifactPromise {
|
|
283
|
+
let result = try FirmwareArtifactStore.shared.sweepOrphans()
|
|
284
|
+
return FirmwareArtifactSweepResult(
|
|
285
|
+
deletedFiles: Double(result.deletedFiles),
|
|
286
|
+
deletedBytes: Double(result.deletedBytes)
|
|
287
|
+
)
|
|
288
|
+
}
|
|
289
|
+
}
|
|
98
290
|
}
|
|
99
291
|
|
|
100
292
|
// MARK: - RangeDownloader (migrated core)
|
|
@@ -326,16 +518,32 @@ public final class RangeDownloader: NSObject, URLSessionDownloadDelegate {
|
|
|
326
518
|
@objc private func handleBackgroundEventsNotification(_ note: Notification) {
|
|
327
519
|
guard let identifier = note.userInfo?["identifier"] as? String,
|
|
328
520
|
Self.channel(forIdentifier: identifier) != nil else { return }
|
|
329
|
-
// Re-create the session with this delegate so queued completion events are
|
|
330
|
-
// delivered here on a background relaunch.
|
|
331
|
-
_ = session(forIdentifier: identifier)
|
|
332
521
|
if let handler = note.userInfo?["completionHandler"] as? () -> Void {
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
522
|
+
attachBackgroundEvents(
|
|
523
|
+
identifier: identifier,
|
|
524
|
+
completionHandler: handler
|
|
525
|
+
)
|
|
336
526
|
}
|
|
337
527
|
}
|
|
338
528
|
|
|
529
|
+
private func attachBackgroundEvents(
|
|
530
|
+
identifier: String,
|
|
531
|
+
completionHandler: @escaping () -> Void
|
|
532
|
+
) {
|
|
533
|
+
let replacedHandler: (() -> Void)? = lock.withLockValue {
|
|
534
|
+
backgroundCompletionHandlers.updateValue(
|
|
535
|
+
completionHandler,
|
|
536
|
+
forKey: identifier
|
|
537
|
+
)
|
|
538
|
+
}
|
|
539
|
+
// UIKit should provide one live handler per session. Complete an older
|
|
540
|
+
// handler instead of leaking it if the callback is unexpectedly repeated.
|
|
541
|
+
replacedHandler?()
|
|
542
|
+
// Store the handler before creating the session. Delegate delivery can
|
|
543
|
+
// begin immediately when a background relaunch reattaches this identifier.
|
|
544
|
+
_ = session(forIdentifier: identifier)
|
|
545
|
+
}
|
|
546
|
+
|
|
339
547
|
// MARK: - Session cache
|
|
340
548
|
|
|
341
549
|
private func session(forChannel channel: DownloadChannel, segmentCount: Int) -> URLSession {
|
package/lib/module/index.js
CHANGED
|
@@ -10,6 +10,7 @@ export const ReactNativeRangeDownloader = ReactNativeRangeDownloaderHybridObject
|
|
|
10
10
|
export const RangeDownloadChannel = {
|
|
11
11
|
Bundle: 'bundle',
|
|
12
12
|
Apk: 'apk',
|
|
13
|
-
Chart: 'chart'
|
|
13
|
+
Chart: 'chart',
|
|
14
|
+
Firmware: 'firmware'
|
|
14
15
|
};
|
|
15
16
|
//# sourceMappingURL=index.js.map
|
package/lib/module/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["NitroModules","ReactNativeRangeDownloaderHybridObject","createHybridObject","ReactNativeRangeDownloader","RangeDownloadChannel","Bundle","Apk","Chart"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;AAAA,SAASA,YAAY,QAAQ,4BAA4B;AAGzD,MAAMC,sCAAsC,GAC1CD,YAAY,CAACE,kBAAkB,CAC7B,4BACF,CAAC;AAEH,OAAO,MAAMC,0BAA0B,
|
|
1
|
+
{"version":3,"names":["NitroModules","ReactNativeRangeDownloaderHybridObject","createHybridObject","ReactNativeRangeDownloader","RangeDownloadChannel","Bundle","Apk","Chart","Firmware"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;AAAA,SAASA,YAAY,QAAQ,4BAA4B;AAGzD,MAAMC,sCAAsC,GAC1CD,YAAY,CAACE,kBAAkB,CAC7B,4BACF,CAAC;AAEH,OAAO,MAAMC,0BAA0B,GACrCF,sCAAsC;;AAExC;AACA;AACA;AACA,OAAO,MAAMG,oBAAoB,GAAG;EAClCC,MAAM,EAAE,QAAQ;EAChBC,GAAG,EAAE,KAAK;EACVC,KAAK,EAAE,OAAO;EACdC,QAAQ,EAAE;AACZ,CAAU","ignoreList":[]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { HybridObject } from 'react-native-nitro-modules';
|
|
2
|
-
export type DownloadChannel = 'bundle' | 'apk' | 'chart';
|
|
2
|
+
export type DownloadChannel = 'bundle' | 'apk' | 'chart' | 'firmware';
|
|
3
3
|
export interface RangeDownloadParams {
|
|
4
4
|
channel: DownloadChannel;
|
|
5
5
|
taskId: string;
|
|
@@ -28,6 +28,85 @@ export interface RangeDownloadEvent {
|
|
|
28
28
|
progress: number;
|
|
29
29
|
message: string;
|
|
30
30
|
}
|
|
31
|
+
export interface FirmwareArtifactDownloadParams {
|
|
32
|
+
taskId: string;
|
|
33
|
+
transactionId: string;
|
|
34
|
+
leaseRef: string;
|
|
35
|
+
artifactId: string;
|
|
36
|
+
url: string;
|
|
37
|
+
routeType: string;
|
|
38
|
+
resolvedIp?: string;
|
|
39
|
+
expectedSize?: number;
|
|
40
|
+
expectedSha256?: string;
|
|
41
|
+
maxBytes: number;
|
|
42
|
+
overallDeadlineSeconds?: number;
|
|
43
|
+
}
|
|
44
|
+
export interface FirmwareArtifactReceipt {
|
|
45
|
+
artifactRef: string;
|
|
46
|
+
size: number;
|
|
47
|
+
sha256: string;
|
|
48
|
+
expectedSha256Verified: boolean;
|
|
49
|
+
}
|
|
50
|
+
export interface FirmwareArtifactCapabilities {
|
|
51
|
+
firmwareArtifactProtocolVersion: number;
|
|
52
|
+
supportedRouteTypes: string[];
|
|
53
|
+
supportsArchiveMaterialization: boolean;
|
|
54
|
+
maxReadBytes: number;
|
|
55
|
+
}
|
|
56
|
+
export interface FirmwareArtifactRefParams {
|
|
57
|
+
artifactRef: string;
|
|
58
|
+
}
|
|
59
|
+
export interface FirmwareArtifactCancelParams {
|
|
60
|
+
transactionId: string;
|
|
61
|
+
}
|
|
62
|
+
export interface FirmwareArtifactReaderInfo {
|
|
63
|
+
readerId: string;
|
|
64
|
+
size: number;
|
|
65
|
+
}
|
|
66
|
+
export interface FirmwareArtifactReaderReadParams {
|
|
67
|
+
readerId: string;
|
|
68
|
+
offset: number;
|
|
69
|
+
length: number;
|
|
70
|
+
}
|
|
71
|
+
export interface FirmwareArtifactReaderCloseParams {
|
|
72
|
+
readerId: string;
|
|
73
|
+
}
|
|
74
|
+
export interface FirmwareArchiveMaterializeParams {
|
|
75
|
+
leaseRef: string;
|
|
76
|
+
archiveArtifactRef: string;
|
|
77
|
+
expectedEntries?: FirmwareArchiveExpectedEntry[];
|
|
78
|
+
}
|
|
79
|
+
export interface FirmwareArchiveExpectedEntry {
|
|
80
|
+
artifactId: string;
|
|
81
|
+
entryName: string;
|
|
82
|
+
expectedSize: number;
|
|
83
|
+
expectedSha256: string;
|
|
84
|
+
}
|
|
85
|
+
export interface FirmwareArchiveMaterializedArtifact {
|
|
86
|
+
entryName: string;
|
|
87
|
+
receipt: FirmwareArtifactReceipt;
|
|
88
|
+
}
|
|
89
|
+
export interface FirmwareArchiveMaterializeResult {
|
|
90
|
+
artifacts: FirmwareArchiveMaterializedArtifact[];
|
|
91
|
+
}
|
|
92
|
+
export interface FirmwareArtifactLeaseCreateParams {
|
|
93
|
+
transactionId: string;
|
|
94
|
+
}
|
|
95
|
+
export interface FirmwareArtifactLease {
|
|
96
|
+
leaseRef: string;
|
|
97
|
+
}
|
|
98
|
+
export interface FirmwareArtifactLeaseRetainParams {
|
|
99
|
+
leaseRef: string;
|
|
100
|
+
artifactRef: string;
|
|
101
|
+
}
|
|
102
|
+
export interface FirmwareArtifactLeaseReleaseParams {
|
|
103
|
+
leaseRef: string;
|
|
104
|
+
disposition: string;
|
|
105
|
+
}
|
|
106
|
+
export interface FirmwareArtifactSweepResult {
|
|
107
|
+
deletedFiles: number;
|
|
108
|
+
deletedBytes: number;
|
|
109
|
+
}
|
|
31
110
|
export interface ReactNativeRangeDownloader extends HybridObject<{
|
|
32
111
|
ios: 'swift';
|
|
33
112
|
android: 'kotlin';
|
|
@@ -38,5 +117,17 @@ export interface ReactNativeRangeDownloader extends HybridObject<{
|
|
|
38
117
|
addDownloadListener(callback: (event: RangeDownloadEvent) => void): number;
|
|
39
118
|
removeDownloadListener(id: number): void;
|
|
40
119
|
getDownloadsDir(): string;
|
|
120
|
+
getFirmwareArtifactCapabilities(): FirmwareArtifactCapabilities;
|
|
121
|
+
downloadFirmwareArtifact(params: FirmwareArtifactDownloadParams): Promise<FirmwareArtifactReceipt>;
|
|
122
|
+
cancelFirmwareArtifactDownloads(params: FirmwareArtifactCancelParams): Promise<void>;
|
|
123
|
+
discardFirmwareArtifact(params: FirmwareArtifactRefParams): Promise<void>;
|
|
124
|
+
openFirmwareArtifact(params: FirmwareArtifactRefParams): Promise<FirmwareArtifactReaderInfo>;
|
|
125
|
+
readFirmwareArtifact(params: FirmwareArtifactReaderReadParams): Promise<ArrayBuffer>;
|
|
126
|
+
closeFirmwareArtifact(params: FirmwareArtifactReaderCloseParams): Promise<void>;
|
|
127
|
+
materializeFirmwareArchive(params: FirmwareArchiveMaterializeParams): Promise<FirmwareArchiveMaterializeResult>;
|
|
128
|
+
createFirmwareArtifactLease(params: FirmwareArtifactLeaseCreateParams): Promise<FirmwareArtifactLease>;
|
|
129
|
+
retainFirmwareArtifact(params: FirmwareArtifactLeaseRetainParams): Promise<void>;
|
|
130
|
+
releaseFirmwareArtifactLease(params: FirmwareArtifactLeaseReleaseParams): Promise<void>;
|
|
131
|
+
sweepFirmwareArtifactOrphans(): Promise<FirmwareArtifactSweepResult>;
|
|
41
132
|
}
|
|
42
133
|
//# sourceMappingURL=ReactNativeRangeDownloader.nitro.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ReactNativeRangeDownloader.nitro.d.ts","sourceRoot":"","sources":["../../../src/ReactNativeRangeDownloader.nitro.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAM/D,MAAM,MAAM,eAAe,GAAG,QAAQ,GAAG,KAAK,GAAG,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"ReactNativeRangeDownloader.nitro.d.ts","sourceRoot":"","sources":["../../../src/ReactNativeRangeDownloader.nitro.ts"],"names":[],"mappings":"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"}
|