@onekeyfe/react-native-range-downloader 3.0.81-alpha.8 → 3.0.81
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 +0 -8
- package/android/build.gradle +0 -1
- package/android/src/main/java/com/margelo/nitro/reactnativerangedownloader/ReactNativeRangeDownloader.kt +0 -144
- package/ios/RangeDownloadLogic.swift +0 -120
- package/ios/ReactNativeRangeDownloader.swift +6 -623
- package/lib/module/index.js +1 -2
- package/lib/module/index.js.map +1 -1
- package/lib/typescript/src/ReactNativeRangeDownloader.nitro.d.ts +1 -91
- package/lib/typescript/src/ReactNativeRangeDownloader.nitro.d.ts.map +1 -1
- package/lib/typescript/src/index.d.ts +0 -1
- package/lib/typescript/src/index.d.ts.map +1 -1
- package/nitrogen/generated/android/c++/JDownloadChannel.hpp +0 -3
- package/nitrogen/generated/android/c++/JHybridReactNativeRangeDownloaderSpec.cpp +0 -248
- package/nitrogen/generated/android/c++/JHybridReactNativeRangeDownloaderSpec.hpp +0 -12
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/reactnativerangedownloader/DownloadChannel.kt +1 -2
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/reactnativerangedownloader/HybridReactNativeRangeDownloaderSpec.kt +0 -49
- package/nitrogen/generated/ios/ReactNativeRangeDownloader-Swift-Cxx-Bridge.cpp +0 -48
- package/nitrogen/generated/ios/ReactNativeRangeDownloader-Swift-Cxx-Bridge.hpp +0 -329
- package/nitrogen/generated/ios/ReactNativeRangeDownloader-Swift-Cxx-Umbrella.hpp +0 -53
- package/nitrogen/generated/ios/c++/HybridReactNativeRangeDownloaderSpecSwift.hpp +0 -152
- package/nitrogen/generated/ios/swift/DownloadChannel.swift +0 -4
- package/nitrogen/generated/ios/swift/HybridReactNativeRangeDownloaderSpec.swift +0 -12
- package/nitrogen/generated/ios/swift/HybridReactNativeRangeDownloaderSpec_cxx.swift +0 -221
- package/nitrogen/generated/shared/c++/DownloadChannel.hpp +0 -4
- package/nitrogen/generated/shared/c++/HybridReactNativeRangeDownloaderSpec.cpp +0 -12
- package/nitrogen/generated/shared/c++/HybridReactNativeRangeDownloaderSpec.hpp +0 -58
- package/package.json +2 -4
- package/src/ReactNativeRangeDownloader.nitro.ts +1 -127
- package/src/index.tsx +1 -3
- package/android/src/main/java/com/margelo/nitro/reactnativerangedownloader/FirmwareArchiveRules.kt +0 -284
- package/android/src/main/java/com/margelo/nitro/reactnativerangedownloader/FirmwareArtifactStore.kt +0 -774
- package/android/src/test/java/com/margelo/nitro/reactnativerangedownloader/FirmwareArchiveRulesTest.kt +0 -75
- package/android/src/test/java/com/margelo/nitro/reactnativerangedownloader/FirmwareArtifactDeadlineTest.kt +0 -26
- package/ios/FirmwareArchiveMinizipBridge.h +0 -33
- package/ios/FirmwareArchiveMinizipBridge.mm +0 -213
- package/ios/FirmwareArtifactStore.swift +0 -1445
- package/ios/FirmwareBackgroundSessionEventRouter.swift +0 -17
- package/nitrogen/generated/android/c++/JFirmwareArchiveExpectedEntry.hpp +0 -69
- package/nitrogen/generated/android/c++/JFirmwareArchiveMaterializeParams.hpp +0 -86
- package/nitrogen/generated/android/c++/JFirmwareArchiveMaterializeResult.hpp +0 -80
- package/nitrogen/generated/android/c++/JFirmwareArchiveMaterializedArtifact.hpp +0 -63
- package/nitrogen/generated/android/c++/JFirmwareArtifactCancelParams.hpp +0 -57
- package/nitrogen/generated/android/c++/JFirmwareArtifactCapabilities.hpp +0 -88
- package/nitrogen/generated/android/c++/JFirmwareArtifactDownloadParams.hpp +0 -98
- package/nitrogen/generated/android/c++/JFirmwareArtifactLease.hpp +0 -57
- package/nitrogen/generated/android/c++/JFirmwareArtifactLeaseCreateParams.hpp +0 -57
- package/nitrogen/generated/android/c++/JFirmwareArtifactLeaseReleaseParams.hpp +0 -61
- package/nitrogen/generated/android/c++/JFirmwareArtifactLeaseRetainParams.hpp +0 -61
- package/nitrogen/generated/android/c++/JFirmwareArtifactReaderCloseParams.hpp +0 -57
- package/nitrogen/generated/android/c++/JFirmwareArtifactReaderInfo.hpp +0 -61
- package/nitrogen/generated/android/c++/JFirmwareArtifactReaderReadParams.hpp +0 -65
- package/nitrogen/generated/android/c++/JFirmwareArtifactReceipt.hpp +0 -65
- package/nitrogen/generated/android/c++/JFirmwareArtifactRefParams.hpp +0 -57
- package/nitrogen/generated/android/c++/JFirmwareArtifactSweepResult.hpp +0 -61
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/reactnativerangedownloader/FirmwareArchiveExpectedEntry.kt +0 -47
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/reactnativerangedownloader/FirmwareArchiveMaterializeParams.kt +0 -44
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/reactnativerangedownloader/FirmwareArchiveMaterializeResult.kt +0 -38
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/reactnativerangedownloader/FirmwareArchiveMaterializedArtifact.kt +0 -41
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/reactnativerangedownloader/FirmwareArtifactCancelParams.kt +0 -38
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/reactnativerangedownloader/FirmwareArtifactCapabilities.kt +0 -47
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/reactnativerangedownloader/FirmwareArtifactDownloadParams.kt +0 -68
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/reactnativerangedownloader/FirmwareArtifactLease.kt +0 -38
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/reactnativerangedownloader/FirmwareArtifactLeaseCreateParams.kt +0 -38
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/reactnativerangedownloader/FirmwareArtifactLeaseReleaseParams.kt +0 -41
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/reactnativerangedownloader/FirmwareArtifactLeaseRetainParams.kt +0 -41
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/reactnativerangedownloader/FirmwareArtifactReaderCloseParams.kt +0 -38
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/reactnativerangedownloader/FirmwareArtifactReaderInfo.kt +0 -41
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/reactnativerangedownloader/FirmwareArtifactReaderReadParams.kt +0 -44
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/reactnativerangedownloader/FirmwareArtifactReceipt.kt +0 -44
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/reactnativerangedownloader/FirmwareArtifactRefParams.kt +0 -38
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/reactnativerangedownloader/FirmwareArtifactSweepResult.kt +0 -41
- package/nitrogen/generated/ios/swift/FirmwareArchiveExpectedEntry.swift +0 -69
- package/nitrogen/generated/ios/swift/FirmwareArchiveMaterializeParams.swift +0 -70
- package/nitrogen/generated/ios/swift/FirmwareArchiveMaterializeResult.swift +0 -48
- package/nitrogen/generated/ios/swift/FirmwareArchiveMaterializedArtifact.swift +0 -47
- package/nitrogen/generated/ios/swift/FirmwareArtifactCancelParams.swift +0 -36
- package/nitrogen/generated/ios/swift/FirmwareArtifactCapabilities.swift +0 -81
- package/nitrogen/generated/ios/swift/FirmwareArtifactDownloadParams.swift +0 -177
- package/nitrogen/generated/ios/swift/FirmwareArtifactLease.swift +0 -36
- package/nitrogen/generated/ios/swift/FirmwareArtifactLeaseCreateParams.swift +0 -36
- package/nitrogen/generated/ios/swift/FirmwareArtifactLeaseReleaseParams.swift +0 -47
- package/nitrogen/generated/ios/swift/FirmwareArtifactLeaseRetainParams.swift +0 -47
- package/nitrogen/generated/ios/swift/FirmwareArtifactReaderCloseParams.swift +0 -36
- package/nitrogen/generated/ios/swift/FirmwareArtifactReaderInfo.swift +0 -47
- package/nitrogen/generated/ios/swift/FirmwareArtifactReaderReadParams.swift +0 -58
- package/nitrogen/generated/ios/swift/FirmwareArtifactReceipt.swift +0 -58
- package/nitrogen/generated/ios/swift/FirmwareArtifactRefParams.swift +0 -36
- package/nitrogen/generated/ios/swift/FirmwareArtifactSweepResult.swift +0 -47
- package/nitrogen/generated/ios/swift/Func_void_FirmwareArchiveMaterializeResult.swift +0 -47
- package/nitrogen/generated/ios/swift/Func_void_FirmwareArtifactLease.swift +0 -47
- package/nitrogen/generated/ios/swift/Func_void_FirmwareArtifactReaderInfo.swift +0 -47
- package/nitrogen/generated/ios/swift/Func_void_FirmwareArtifactReceipt.swift +0 -47
- package/nitrogen/generated/ios/swift/Func_void_FirmwareArtifactSweepResult.swift +0 -47
- package/nitrogen/generated/ios/swift/Func_void_std__shared_ptr_ArrayBuffer_.swift +0 -47
- package/nitrogen/generated/shared/c++/FirmwareArchiveExpectedEntry.hpp +0 -87
- package/nitrogen/generated/shared/c++/FirmwareArchiveMaterializeParams.hpp +0 -86
- package/nitrogen/generated/shared/c++/FirmwareArchiveMaterializeResult.hpp +0 -77
- package/nitrogen/generated/shared/c++/FirmwareArchiveMaterializedArtifact.hpp +0 -81
- package/nitrogen/generated/shared/c++/FirmwareArtifactCancelParams.hpp +0 -75
- package/nitrogen/generated/shared/c++/FirmwareArtifactCapabilities.hpp +0 -88
- package/nitrogen/generated/shared/c++/FirmwareArtifactDownloadParams.hpp +0 -116
- package/nitrogen/generated/shared/c++/FirmwareArtifactLease.hpp +0 -75
- package/nitrogen/generated/shared/c++/FirmwareArtifactLeaseCreateParams.hpp +0 -75
- package/nitrogen/generated/shared/c++/FirmwareArtifactLeaseReleaseParams.hpp +0 -79
- package/nitrogen/generated/shared/c++/FirmwareArtifactLeaseRetainParams.hpp +0 -79
- package/nitrogen/generated/shared/c++/FirmwareArtifactReaderCloseParams.hpp +0 -75
- package/nitrogen/generated/shared/c++/FirmwareArtifactReaderInfo.hpp +0 -79
- package/nitrogen/generated/shared/c++/FirmwareArtifactReaderReadParams.hpp +0 -83
- package/nitrogen/generated/shared/c++/FirmwareArtifactReceipt.hpp +0 -83
- package/nitrogen/generated/shared/c++/FirmwareArtifactRefParams.hpp +0 -75
- package/nitrogen/generated/shared/c++/FirmwareArtifactSweepResult.hpp +0 -79
|
@@ -15,7 +15,6 @@ Pod::Spec.new do |s|
|
|
|
15
15
|
|
|
16
16
|
s.source_files = [
|
|
17
17
|
"ios/**/*.{swift}",
|
|
18
|
-
"ios/**/*.{h}",
|
|
19
18
|
"ios/**/*.{m,mm}",
|
|
20
19
|
"cpp/**/*.{hpp,cpp}",
|
|
21
20
|
]
|
|
@@ -23,13 +22,6 @@ Pod::Spec.new do |s|
|
|
|
23
22
|
s.dependency 'React-jsi'
|
|
24
23
|
s.dependency 'React-callinvoker'
|
|
25
24
|
s.dependency 'ReactNativeNativeLogger'
|
|
26
|
-
s.dependency 'SniConnect', package["version"]
|
|
27
|
-
s.public_header_files = "ios/FirmwareArchiveMinizipBridge.h"
|
|
28
|
-
s.pod_target_xcconfig = {
|
|
29
|
-
'HEADER_SEARCH_PATHS' => '"$(PODS_ROOT)/SSZipArchive/SSZipArchive/minizip"',
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
s.dependency 'SSZipArchive', '>= 2.5.4'
|
|
33
25
|
|
|
34
26
|
load 'nitrogen/generated/ios/ReactNativeRangeDownloader+autolinking.rb'
|
|
35
27
|
add_nitrogen_files(s)
|
package/android/build.gradle
CHANGED
|
@@ -127,7 +127,6 @@ dependencies {
|
|
|
127
127
|
implementation project(":react-native-nitro-modules")
|
|
128
128
|
|
|
129
129
|
implementation project(":onekeyfe_react-native-native-logger")
|
|
130
|
-
implementation project(":onekeyfe_react-native-sni-connect")
|
|
131
130
|
|
|
132
131
|
implementation "com.squareup.okhttp3:okhttp:4.12.0"
|
|
133
132
|
|
|
@@ -2,16 +2,12 @@ package com.margelo.nitro.reactnativerangedownloader
|
|
|
2
2
|
|
|
3
3
|
import com.facebook.proguard.annotations.DoNotStrip
|
|
4
4
|
import com.margelo.nitro.NitroModules
|
|
5
|
-
import com.margelo.nitro.core.ArrayBuffer
|
|
6
5
|
import com.margelo.nitro.core.Promise
|
|
7
6
|
import com.margelo.nitro.nativelogger.OneKeyLog
|
|
8
7
|
import java.io.File
|
|
9
8
|
import java.security.MessageDigest
|
|
10
9
|
import java.util.concurrent.CopyOnWriteArrayList
|
|
11
10
|
import java.util.concurrent.atomic.AtomicLong
|
|
12
|
-
import kotlinx.coroutines.CoroutineScope
|
|
13
|
-
import kotlinx.coroutines.Dispatchers
|
|
14
|
-
import kotlinx.coroutines.SupervisorJob
|
|
15
11
|
|
|
16
12
|
// P1: Nitro adapter for the Android concurrent multi-range downloader.
|
|
17
13
|
//
|
|
@@ -37,7 +33,6 @@ class ReactNativeRangeDownloader : HybridReactNativeRangeDownloaderSpec() {
|
|
|
37
33
|
|
|
38
34
|
private val listeners = CopyOnWriteArrayList<Listener>()
|
|
39
35
|
private val nextListenerId = AtomicLong(1)
|
|
40
|
-
private val firmwareArtifactScope = CoroutineScope(SupervisorJob() + Dispatchers.IO)
|
|
41
36
|
|
|
42
37
|
// Active downloads keyed by "channel|taskId" so cancel/discardArtifacts can
|
|
43
38
|
// flip the abort flag + stop the worker pool BEFORE deleting files, instead of
|
|
@@ -270,145 +265,6 @@ class ReactNativeRangeDownloader : HybridReactNativeRangeDownloaderSpec() {
|
|
|
270
265
|
return ctx.cacheDir.absolutePath
|
|
271
266
|
}
|
|
272
267
|
|
|
273
|
-
override fun getFirmwareArtifactCapabilities(): FirmwareArtifactCapabilities {
|
|
274
|
-
return FirmwareArtifactCapabilities(
|
|
275
|
-
firmwareArtifactProtocolVersion = 2.0,
|
|
276
|
-
supportedRouteTypes = arrayOf("domain", "pinnedIp"),
|
|
277
|
-
supportsArchiveMaterialization = true,
|
|
278
|
-
maxReadBytes = FirmwareArtifactStore.MAX_READ_BYTES.toDouble(),
|
|
279
|
-
)
|
|
280
|
-
}
|
|
281
|
-
|
|
282
|
-
override fun downloadFirmwareArtifact(
|
|
283
|
-
params: FirmwareArtifactDownloadParams,
|
|
284
|
-
): Promise<FirmwareArtifactReceipt> {
|
|
285
|
-
return Promise.async(firmwareArtifactScope) {
|
|
286
|
-
val artifact = FirmwareArtifactStore.download(params)
|
|
287
|
-
FirmwareArtifactReceipt(
|
|
288
|
-
artifactRef = artifact.artifactRef,
|
|
289
|
-
size = artifact.size.toDouble(),
|
|
290
|
-
sha256 = artifact.sha256,
|
|
291
|
-
)
|
|
292
|
-
}
|
|
293
|
-
}
|
|
294
|
-
|
|
295
|
-
override fun cancelFirmwareArtifactDownloads(
|
|
296
|
-
params: FirmwareArtifactCancelParams,
|
|
297
|
-
): Promise<Unit> {
|
|
298
|
-
return Promise.async(firmwareArtifactScope) {
|
|
299
|
-
FirmwareArtifactStore.cancelDownloads(params.transactionId)
|
|
300
|
-
}
|
|
301
|
-
}
|
|
302
|
-
|
|
303
|
-
override fun discardFirmwareArtifact(
|
|
304
|
-
params: FirmwareArtifactRefParams,
|
|
305
|
-
): Promise<Unit> {
|
|
306
|
-
return Promise.async(firmwareArtifactScope) {
|
|
307
|
-
FirmwareArtifactStore.discard(params.artifactRef)
|
|
308
|
-
}
|
|
309
|
-
}
|
|
310
|
-
|
|
311
|
-
override fun openFirmwareArtifact(
|
|
312
|
-
params: FirmwareArtifactRefParams,
|
|
313
|
-
): Promise<FirmwareArtifactReaderInfo> {
|
|
314
|
-
return Promise.async(firmwareArtifactScope) {
|
|
315
|
-
val (readerId, size) = FirmwareArtifactStore.open(params.artifactRef)
|
|
316
|
-
FirmwareArtifactReaderInfo(readerId = readerId, size = size.toDouble())
|
|
317
|
-
}
|
|
318
|
-
}
|
|
319
|
-
|
|
320
|
-
override fun readFirmwareArtifact(
|
|
321
|
-
params: FirmwareArtifactReaderReadParams,
|
|
322
|
-
): Promise<ArrayBuffer> {
|
|
323
|
-
return Promise.async(firmwareArtifactScope) {
|
|
324
|
-
require(
|
|
325
|
-
params.offset.isFinite() &&
|
|
326
|
-
params.offset >= 0 &&
|
|
327
|
-
params.offset.toLong().toDouble() == params.offset &&
|
|
328
|
-
params.length.isFinite() &&
|
|
329
|
-
params.length > 0 &&
|
|
330
|
-
params.length.toInt().toDouble() == params.length
|
|
331
|
-
) {
|
|
332
|
-
"Invalid firmware artifact read"
|
|
333
|
-
}
|
|
334
|
-
ArrayBuffer.copy(
|
|
335
|
-
FirmwareArtifactStore.read(
|
|
336
|
-
readerId = params.readerId,
|
|
337
|
-
offset = params.offset.toLong(),
|
|
338
|
-
length = params.length.toInt(),
|
|
339
|
-
),
|
|
340
|
-
)
|
|
341
|
-
}
|
|
342
|
-
}
|
|
343
|
-
|
|
344
|
-
override fun closeFirmwareArtifact(
|
|
345
|
-
params: FirmwareArtifactReaderCloseParams,
|
|
346
|
-
): Promise<Unit> {
|
|
347
|
-
return Promise.async(firmwareArtifactScope) {
|
|
348
|
-
FirmwareArtifactStore.close(params.readerId)
|
|
349
|
-
}
|
|
350
|
-
}
|
|
351
|
-
|
|
352
|
-
override fun materializeFirmwareArchive(
|
|
353
|
-
params: FirmwareArchiveMaterializeParams,
|
|
354
|
-
): Promise<FirmwareArchiveMaterializeResult> {
|
|
355
|
-
return Promise.async(firmwareArtifactScope) {
|
|
356
|
-
val artifacts = FirmwareArtifactStore.materializeArchive(
|
|
357
|
-
params.leaseRef,
|
|
358
|
-
params.archiveArtifactRef,
|
|
359
|
-
params.expectedEntries,
|
|
360
|
-
)
|
|
361
|
-
FirmwareArchiveMaterializeResult(
|
|
362
|
-
artifacts = artifacts.map { entry ->
|
|
363
|
-
FirmwareArchiveMaterializedArtifact(
|
|
364
|
-
entryName = entry.entryName,
|
|
365
|
-
receipt = FirmwareArtifactReceipt(
|
|
366
|
-
artifactRef = entry.artifact.artifactRef,
|
|
367
|
-
size = entry.artifact.size.toDouble(),
|
|
368
|
-
sha256 = entry.artifact.sha256,
|
|
369
|
-
),
|
|
370
|
-
)
|
|
371
|
-
}.toTypedArray(),
|
|
372
|
-
)
|
|
373
|
-
}
|
|
374
|
-
}
|
|
375
|
-
|
|
376
|
-
override fun createFirmwareArtifactLease(
|
|
377
|
-
params: FirmwareArtifactLeaseCreateParams,
|
|
378
|
-
): Promise<FirmwareArtifactLease> {
|
|
379
|
-
return Promise.async(firmwareArtifactScope) {
|
|
380
|
-
FirmwareArtifactLease(
|
|
381
|
-
leaseRef = FirmwareArtifactStore.createLease(params.transactionId),
|
|
382
|
-
)
|
|
383
|
-
}
|
|
384
|
-
}
|
|
385
|
-
|
|
386
|
-
override fun retainFirmwareArtifact(
|
|
387
|
-
params: FirmwareArtifactLeaseRetainParams,
|
|
388
|
-
): Promise<Unit> {
|
|
389
|
-
return Promise.async(firmwareArtifactScope) {
|
|
390
|
-
FirmwareArtifactStore.retain(params.leaseRef, params.artifactRef)
|
|
391
|
-
}
|
|
392
|
-
}
|
|
393
|
-
|
|
394
|
-
override fun releaseFirmwareArtifactLease(
|
|
395
|
-
params: FirmwareArtifactLeaseReleaseParams,
|
|
396
|
-
): Promise<Unit> {
|
|
397
|
-
return Promise.async(firmwareArtifactScope) {
|
|
398
|
-
FirmwareArtifactStore.releaseLease(params.leaseRef, params.disposition)
|
|
399
|
-
}
|
|
400
|
-
}
|
|
401
|
-
|
|
402
|
-
override fun sweepFirmwareArtifactOrphans(): Promise<FirmwareArtifactSweepResult> {
|
|
403
|
-
return Promise.async(firmwareArtifactScope) {
|
|
404
|
-
val (deletedFiles, deletedBytes) = FirmwareArtifactStore.sweepOrphans()
|
|
405
|
-
FirmwareArtifactSweepResult(
|
|
406
|
-
deletedFiles = deletedFiles.toDouble(),
|
|
407
|
-
deletedBytes = deletedBytes.toDouble(),
|
|
408
|
-
)
|
|
409
|
-
}
|
|
410
|
-
}
|
|
411
|
-
|
|
412
268
|
// Broadcast one event to every registered listener. Listeners filter by
|
|
413
269
|
// channel/taskId on their side (shared registry, per the design).
|
|
414
270
|
private fun sendEvent(
|
|
@@ -1,126 +1,6 @@
|
|
|
1
1
|
import Foundation
|
|
2
2
|
import CommonCrypto
|
|
3
3
|
|
|
4
|
-
enum FirmwareArtifactDeadlineError: Error {
|
|
5
|
-
case exceeded
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
enum FirmwareArtifactWallClockDeadline {
|
|
9
|
-
static func run<T>(
|
|
10
|
-
timeoutSeconds: TimeInterval,
|
|
11
|
-
operation: @escaping @Sendable () async throws -> T
|
|
12
|
-
) async throws -> T {
|
|
13
|
-
let timeoutNanoseconds = UInt64(max(0.001, timeoutSeconds) * 1_000_000_000.0)
|
|
14
|
-
return try await withThrowingTaskGroup(of: T.self) { group in
|
|
15
|
-
group.addTask {
|
|
16
|
-
try await operation()
|
|
17
|
-
}
|
|
18
|
-
group.addTask {
|
|
19
|
-
try await Task.sleep(nanoseconds: timeoutNanoseconds)
|
|
20
|
-
throw FirmwareArtifactDeadlineError.exceeded
|
|
21
|
-
}
|
|
22
|
-
defer { group.cancelAll() }
|
|
23
|
-
guard let result = try await group.next() else {
|
|
24
|
-
throw FirmwareArtifactDeadlineError.exceeded
|
|
25
|
-
}
|
|
26
|
-
return result
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
func firmwareArtifactDownloadKey(
|
|
32
|
-
transactionId: String,
|
|
33
|
-
expectedSize: Int64,
|
|
34
|
-
expectedSha256: String
|
|
35
|
-
) -> String {
|
|
36
|
-
"\(transactionId)|\(expectedSize)|\(expectedSha256)"
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
func firmwareArtifactPartialFileName(
|
|
40
|
-
transactionId: String,
|
|
41
|
-
taskId: String,
|
|
42
|
-
expectedSha256: String
|
|
43
|
-
) -> String {
|
|
44
|
-
let transactionData = Data(transactionId.utf8)
|
|
45
|
-
var hash = [UInt8](repeating: 0, count: Int(CC_SHA256_DIGEST_LENGTH))
|
|
46
|
-
transactionData.withUnsafeBytes {
|
|
47
|
-
_ = CC_SHA256($0.baseAddress, CC_LONG(transactionData.count), &hash)
|
|
48
|
-
}
|
|
49
|
-
let transactionToken = hash
|
|
50
|
-
.prefix(8)
|
|
51
|
-
.map { String(format: "%02x", $0) }
|
|
52
|
-
.joined()
|
|
53
|
-
return "\(expectedSha256).\(taskId).\(transactionToken).partial"
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
func firmwareArtifactContentRangeIsValid(
|
|
57
|
-
_ value: String,
|
|
58
|
-
expectedStart: Int64,
|
|
59
|
-
expectedTotal: Int64
|
|
60
|
-
) -> Bool {
|
|
61
|
-
guard value.lowercased().hasPrefix("bytes ") else {
|
|
62
|
-
return false
|
|
63
|
-
}
|
|
64
|
-
guard
|
|
65
|
-
let bounds = RangeDownloadLogic.parseContentRangeBounds(value),
|
|
66
|
-
let total = RangeDownloadLogic.parseContentRangeTotal(value)
|
|
67
|
-
else {
|
|
68
|
-
return false
|
|
69
|
-
}
|
|
70
|
-
return bounds.start == expectedStart &&
|
|
71
|
-
bounds.end >= bounds.start &&
|
|
72
|
-
bounds.end < total &&
|
|
73
|
-
total == expectedTotal
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
func firmwareArtifactResponseFits(
|
|
77
|
-
expectedContentLength: Int64,
|
|
78
|
-
baseOffset: Int64,
|
|
79
|
-
maxBytes: Int64
|
|
80
|
-
) -> Bool {
|
|
81
|
-
guard baseOffset >= 0, baseOffset <= maxBytes else {
|
|
82
|
-
return false
|
|
83
|
-
}
|
|
84
|
-
return expectedContentLength < 0 ||
|
|
85
|
-
expectedContentLength <= maxBytes - baseOffset
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
enum FirmwareBackgroundDownloadError: LocalizedError, CustomStringConvertible {
|
|
89
|
-
case cancelled
|
|
90
|
-
case invalidTask
|
|
91
|
-
case deadlineExceeded
|
|
92
|
-
case redirectRejected
|
|
93
|
-
case responseRejected
|
|
94
|
-
case sizeRejected
|
|
95
|
-
case tlsRejected
|
|
96
|
-
case transferFailed
|
|
97
|
-
|
|
98
|
-
var errorDescription: String? {
|
|
99
|
-
switch self {
|
|
100
|
-
case .cancelled:
|
|
101
|
-
return "ARTIFACT_CANCELLED: firmware background download was cancelled"
|
|
102
|
-
case .invalidTask:
|
|
103
|
-
return "ARTIFACT_PROTOCOL_INVALID: firmware background task is invalid"
|
|
104
|
-
case .deadlineExceeded:
|
|
105
|
-
return "ARTIFACT_DEADLINE_EXCEEDED: firmware download exceeded its deadline"
|
|
106
|
-
case .redirectRejected:
|
|
107
|
-
return "ARTIFACT_REDIRECT_REJECTED: firmware redirect changed canonical identity"
|
|
108
|
-
case .responseRejected:
|
|
109
|
-
return "ARTIFACT_PROTOCOL_INVALID: firmware response is invalid"
|
|
110
|
-
case .sizeRejected:
|
|
111
|
-
return "ARTIFACT_PROTOCOL_INVALID: firmware artifact size is invalid"
|
|
112
|
-
case .tlsRejected:
|
|
113
|
-
return "ARTIFACT_TLS_FAILED: firmware TLS validation failed"
|
|
114
|
-
case .transferFailed:
|
|
115
|
-
return "ARTIFACT_NETWORK_FAILED: firmware background transfer failed"
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
var description: String {
|
|
120
|
-
errorDescription ?? "ARTIFACT_NETWORK_FAILED: firmware background transfer failed"
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
|
|
124
4
|
// MARK: - Dependency-free RangeDownloader logic (OCDS §4 / §5)
|
|
125
5
|
//
|
|
126
6
|
// This file holds the DETERMINISTIC, dependency-light pieces of the range
|