@onekeyfe/react-native-range-downloader 3.0.81-alpha.5 → 3.0.81-alpha.7

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.
@@ -1,5 +1,6 @@
1
1
  import CryptoKit
2
2
  import Foundation
3
+ import ReactNativeNativeLogger
3
4
  import SniConnect
4
5
 
5
6
  func isFirmwareArtifactTLSError(_ error: Error) -> Bool {
@@ -520,6 +521,10 @@ final class FirmwareArtifactStore {
520
521
  return artifact
521
522
  } catch {
522
523
  markDownloadActive(expectedSha256, delta: -1)
524
+ OneKeyLog.error(
525
+ "FirmwareArtifact",
526
+ "event=download_failed transactionId=\(params.transactionId) artifactId=\(params.artifactId) route=\(params.routeType) errorType=\(String(describing: type(of: error)))"
527
+ )
523
528
  if error is CancellationError ||
524
529
  isTransactionCancelled(params.transactionId) {
525
530
  throw FirmwareArtifactStoreError.downloadFailed(
@@ -530,6 +535,29 @@ final class FirmwareArtifactStore {
530
535
  }
531
536
  }
532
537
 
538
+ func cachedArtifact(
539
+ _ params: FirmwareArtifactDownloadParams
540
+ ) throws -> StoredFirmwareArtifact? {
541
+ try Self.validateDownloadParams(params)
542
+ try rejectIfCancelled(transactionId: params.transactionId)
543
+ let expectedSha256 = params.expectedSha256.lowercased()
544
+ let finalURL = artifactURL(sha256: expectedSha256)
545
+ guard let artifact = try? validateStoredArtifact(
546
+ fileURL: finalURL,
547
+ expectedSize: Int64(params.expectedSize),
548
+ expectedSha256: expectedSha256
549
+ ) else {
550
+ return nil
551
+ }
552
+ try retainExpectedArtifact(
553
+ leaseRef: params.leaseRef,
554
+ transactionId: params.transactionId,
555
+ artifactRef: artifact.artifactRef
556
+ )
557
+ try rejectIfCancelled(transactionId: params.transactionId)
558
+ return artifact
559
+ }
560
+
533
561
  func cancelDownloads(transactionId: String) async throws {
534
562
  guard Self.isSafeIdentifier(transactionId) else {
535
563
  throw FirmwareArtifactStoreError.invalidInput(
@@ -558,12 +586,8 @@ final class FirmwareArtifactStore {
558
586
  return existing
559
587
  }
560
588
 
561
- if params.routeType == "domain" {
562
- return try await RangeDownloader.shared.downloadFirmwareArtifact(
563
- params: params
564
- )
565
- }
566
-
589
+ // Firmware preflight is foreground-bound, so both routes use the same
590
+ // cancellable stream instead of waiting on process-owned background tasks.
567
591
  let partialURL = rootURL.appendingPathComponent(
568
592
  firmwareArtifactPartialFileName(
569
593
  transactionId: params.transactionId,
@@ -600,11 +624,19 @@ final class FirmwareArtifactStore {
600
624
  currentSize = 0
601
625
  }
602
626
 
627
+ OneKeyLog.info(
628
+ "FirmwareArtifact",
629
+ "event=stream_start transactionId=\(params.transactionId) artifactId=\(params.artifactId) route=\(params.routeType) expectedBytes=\(Int64(params.expectedSize)) resumeBytes=\(currentSize)"
630
+ )
603
631
  try await streamDownload(
604
632
  params,
605
633
  partialURL: partialURL,
606
634
  resumeOffset: min(currentSize, Int64(params.expectedSize))
607
635
  )
636
+ OneKeyLog.info(
637
+ "FirmwareArtifact",
638
+ "event=stream_complete transactionId=\(params.transactionId) artifactId=\(params.artifactId) route=\(params.routeType) expectedBytes=\(Int64(params.expectedSize))"
639
+ )
608
640
  let artifact: StoredFirmwareArtifact
609
641
  do {
610
642
  artifact = try validateStoredArtifact(
@@ -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
@@ -108,7 +118,20 @@ class ReactNativeRangeDownloader: HybridReactNativeRangeDownloaderSpec {
108
118
  func downloadFirmwareArtifact(
109
119
  params: FirmwareArtifactDownloadParams
110
120
  ) throws -> Promise<FirmwareArtifactReceipt> {
111
- Promise.async {
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
+ )
129
+ )
130
+ }
131
+ } catch {
132
+ return Promise.rejected(withError: error)
133
+ }
134
+ return Promise.async {
112
135
  let artifact = try await FirmwareArtifactStore.shared.download(params)
113
136
  return FirmwareArtifactReceipt(
114
137
  artifactRef: artifact.artifactRef,
@@ -131,7 +154,7 @@ class ReactNativeRangeDownloader: HybridReactNativeRangeDownloaderSpec {
131
154
  func discardFirmwareArtifact(
132
155
  params: FirmwareArtifactRefParams
133
156
  ) throws -> Promise<Void> {
134
- Promise.async {
157
+ settledFirmwareArtifactPromise {
135
158
  try FirmwareArtifactStore.shared.discard(artifactRef: params.artifactRef)
136
159
  }
137
160
  }
@@ -139,7 +162,7 @@ class ReactNativeRangeDownloader: HybridReactNativeRangeDownloaderSpec {
139
162
  func openFirmwareArtifact(
140
163
  params: FirmwareArtifactRefParams
141
164
  ) throws -> Promise<FirmwareArtifactReaderInfo> {
142
- Promise.async {
165
+ settledFirmwareArtifactPromise {
143
166
  let reader = try FirmwareArtifactStore.shared.open(
144
167
  artifactRef: params.artifactRef
145
168
  )
@@ -153,7 +176,7 @@ class ReactNativeRangeDownloader: HybridReactNativeRangeDownloaderSpec {
153
176
  func readFirmwareArtifact(
154
177
  params: FirmwareArtifactReaderReadParams
155
178
  ) throws -> Promise<ArrayBuffer> {
156
- Promise.async {
179
+ settledFirmwareArtifactPromise {
157
180
  guard
158
181
  params.offset.isFinite,
159
182
  params.offset >= 0,
@@ -180,7 +203,7 @@ class ReactNativeRangeDownloader: HybridReactNativeRangeDownloaderSpec {
180
203
  func closeFirmwareArtifact(
181
204
  params: FirmwareArtifactReaderCloseParams
182
205
  ) throws -> Promise<Void> {
183
- Promise.async {
206
+ settledFirmwareArtifactPromise {
184
207
  try FirmwareArtifactStore.shared.close(readerId: params.readerId)
185
208
  }
186
209
  }
@@ -188,7 +211,7 @@ class ReactNativeRangeDownloader: HybridReactNativeRangeDownloaderSpec {
188
211
  func materializeFirmwareArchive(
189
212
  params: FirmwareArchiveMaterializeParams
190
213
  ) throws -> Promise<FirmwareArchiveMaterializeResult> {
191
- Promise.async {
214
+ settledFirmwareArtifactPromise {
192
215
  let entries = try FirmwareArtifactStore.shared.materializeArchive(
193
216
  leaseRef: params.leaseRef,
194
217
  artifactRef: params.archiveArtifactRef,
@@ -212,7 +235,7 @@ class ReactNativeRangeDownloader: HybridReactNativeRangeDownloaderSpec {
212
235
  func createFirmwareArtifactLease(
213
236
  params: FirmwareArtifactLeaseCreateParams
214
237
  ) throws -> Promise<FirmwareArtifactLease> {
215
- Promise.async {
238
+ settledFirmwareArtifactPromise {
216
239
  FirmwareArtifactLease(
217
240
  leaseRef: try FirmwareArtifactStore.shared.createLease(
218
241
  transactionId: params.transactionId
@@ -224,7 +247,7 @@ class ReactNativeRangeDownloader: HybridReactNativeRangeDownloaderSpec {
224
247
  func retainFirmwareArtifact(
225
248
  params: FirmwareArtifactLeaseRetainParams
226
249
  ) throws -> Promise<Void> {
227
- Promise.async {
250
+ settledFirmwareArtifactPromise {
228
251
  try FirmwareArtifactStore.shared.retain(
229
252
  leaseRef: params.leaseRef,
230
253
  artifactRef: params.artifactRef
@@ -235,7 +258,7 @@ class ReactNativeRangeDownloader: HybridReactNativeRangeDownloaderSpec {
235
258
  func releaseFirmwareArtifactLease(
236
259
  params: FirmwareArtifactLeaseReleaseParams
237
260
  ) throws -> Promise<Void> {
238
- Promise.async {
261
+ settledFirmwareArtifactPromise {
239
262
  try FirmwareArtifactStore.shared.releaseLease(
240
263
  leaseRef: params.leaseRef,
241
264
  disposition: params.disposition
@@ -244,7 +267,7 @@ class ReactNativeRangeDownloader: HybridReactNativeRangeDownloaderSpec {
244
267
  }
245
268
 
246
269
  func sweepFirmwareArtifactOrphans() throws -> Promise<FirmwareArtifactSweepResult> {
247
- Promise.async {
270
+ settledFirmwareArtifactPromise {
248
271
  let result = try FirmwareArtifactStore.shared.sweepOrphans()
249
272
  return FirmwareArtifactSweepResult(
250
273
  deletedFiles: Double(result.deletedFiles),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@onekeyfe/react-native-range-downloader",
3
- "version": "3.0.81-alpha.5",
3
+ "version": "3.0.81-alpha.7",
4
4
  "description": "react-native-range-downloader",
5
5
  "main": "./lib/module/index.js",
6
6
  "types": "./lib/typescript/src/index.d.ts",
@@ -88,7 +88,7 @@
88
88
  "typescript": "^5.9.2"
89
89
  },
90
90
  "peerDependencies": {
91
- "@onekeyfe/react-native-sni-connect": "3.0.81-alpha.5",
91
+ "@onekeyfe/react-native-sni-connect": "3.0.81-alpha.7",
92
92
  "react": "*",
93
93
  "react-native": "*",
94
94
  "react-native-nitro-modules": "0.33.2"