@onekeyfe/react-native-range-downloader 3.0.67 → 3.0.68

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/README.md +15 -0
  2. package/android/build.gradle +3 -0
  3. package/android/src/main/java/com/margelo/nitro/reactnativerangedownloader/ConcurrentRangeDownloader.kt +179 -11
  4. package/android/src/main/java/com/margelo/nitro/reactnativerangedownloader/RangeDownloadLogic.kt +98 -0
  5. package/android/src/main/java/com/margelo/nitro/reactnativerangedownloader/ReactNativeRangeDownloader.kt +24 -25
  6. package/android/src/test/java/com/margelo/nitro/reactnativerangedownloader/ConcurrentRangeDownloaderOcdsTest.kt +554 -0
  7. package/android/src/test/java/com/margelo/nitro/reactnativerangedownloader/FaultServer.kt +282 -0
  8. package/android/src/test/java/com/margelo/nitro/reactnativerangedownloader/IsPermanentHttpStatusTest.kt +63 -0
  9. package/android/src/test/java/com/margelo/nitro/reactnativerangedownloader/MonotonicProgressGateTest.kt +368 -0
  10. package/android/src/test/java/com/margelo/nitro/reactnativerangedownloader/Ocds416ResumeTest.kt +272 -0
  11. package/android/src/test/java/com/margelo/nitro/reactnativerangedownloader/OcdsBadTotalRejectTest.kt +147 -0
  12. package/android/src/test/java/com/margelo/nitro/reactnativerangedownloader/OcdsMultipartRejectTest.kt +114 -0
  13. package/android/src/test/java/com/margelo/nitro/reactnativerangedownloader/OcdsReadOnlyFsTest.kt +250 -0
  14. package/android/src/test/java/com/margelo/nitro/reactnativerangedownloader/OcdsTransient5xxTest.kt +275 -0
  15. package/android/src/test/java/com/margelo/nitro/reactnativerangedownloader/RangeDownloadLogicTest.kt +124 -0
  16. package/android/src/test/java/com/margelo/nitro/reactnativerangedownloader/RunRegistrySingleFlightTest.kt +217 -0
  17. package/android/src/test/java/com/margelo/nitro/reactnativerangedownloader/SegmentArtifactSweepTest.kt +350 -0
  18. package/android/src/test/java/com/margelo/nitro/reactnativerangedownloader/SmokeTest.kt +65 -0
  19. package/ios/RangeDownloadLogic.swift +187 -0
  20. package/ios/ReactNativeRangeDownloader.swift +669 -133
  21. package/lib/typescript/src/ReactNativeRangeDownloader.nitro.d.ts +7 -1
  22. package/lib/typescript/src/ReactNativeRangeDownloader.nitro.d.ts.map +1 -1
  23. package/nitrogen/generated/android/c++/JHybridReactNativeRangeDownloaderSpec.cpp +4 -0
  24. package/nitrogen/generated/android/c++/JRangeDownloadOutcome.hpp +6 -0
  25. package/nitrogen/generated/android/c++/JRangeDownloadParams.hpp +19 -3
  26. package/nitrogen/generated/android/c++/JRangeDownloadResult.hpp +9 -3
  27. package/nitrogen/generated/android/c++/JRangeFallbackKind.hpp +83 -0
  28. package/nitrogen/generated/android/kotlin/com/margelo/nitro/reactnativerangedownloader/RangeDownloadOutcome.kt +3 -1
  29. package/nitrogen/generated/android/kotlin/com/margelo/nitro/reactnativerangedownloader/RangeDownloadParams.kt +15 -3
  30. package/nitrogen/generated/android/kotlin/com/margelo/nitro/reactnativerangedownloader/RangeDownloadResult.kt +6 -3
  31. package/nitrogen/generated/android/kotlin/com/margelo/nitro/reactnativerangedownloader/RangeFallbackKind.kt +29 -0
  32. package/nitrogen/generated/ios/ReactNativeRangeDownloader-Swift-Cxx-Bridge.hpp +18 -0
  33. package/nitrogen/generated/ios/ReactNativeRangeDownloader-Swift-Cxx-Umbrella.hpp +3 -0
  34. package/nitrogen/generated/ios/c++/HybridReactNativeRangeDownloaderSpecSwift.hpp +3 -0
  35. package/nitrogen/generated/ios/swift/RangeDownloadOutcome.swift +8 -0
  36. package/nitrogen/generated/ios/swift/RangeDownloadParams.swift +93 -1
  37. package/nitrogen/generated/ios/swift/RangeDownloadResult.swift +24 -1
  38. package/nitrogen/generated/ios/swift/RangeFallbackKind.swift +72 -0
  39. package/nitrogen/generated/shared/c++/RangeDownloadOutcome.hpp +9 -1
  40. package/nitrogen/generated/shared/c++/RangeDownloadParams.hpp +18 -2
  41. package/nitrogen/generated/shared/c++/RangeDownloadResult.hpp +9 -2
  42. package/nitrogen/generated/shared/c++/RangeFallbackKind.hpp +108 -0
  43. package/package.json +1 -1
  44. package/src/ReactNativeRangeDownloader.nitro.ts +36 -2
@@ -8,12 +8,18 @@ export interface RangeDownloadParams {
8
8
  expectedSha256?: string;
9
9
  segmentCount?: number;
10
10
  minConcurrentBytes?: number;
11
+ maxSegmentAttempts?: number;
12
+ requestTimeoutSeconds?: number;
13
+ stallTimeoutSeconds?: number;
14
+ overallDeadlineSeconds?: number;
11
15
  }
12
- export type RangeDownloadOutcome = 'completed' | 'fallback';
16
+ export type RangeDownloadOutcome = 'completed' | 'fallbackTransient' | 'fallbackPermanent' | 'fallback';
17
+ export type RangeFallbackKind = 'serverIgnoredRange' | 'rangeUnsupported' | 'authExpired' | 'notFound' | 'redirectRejected' | 'checksumMismatch' | 'multipartOrBadTotal' | 'transientNetwork' | 'throttled' | 'budgetExhausted';
13
18
  export interface RangeDownloadResult {
14
19
  outcome: RangeDownloadOutcome;
15
20
  filePath: string;
16
21
  fallbackReason?: string;
22
+ fallbackKind?: RangeFallbackKind;
17
23
  }
18
24
  export interface RangeDownloadEvent {
19
25
  channel: DownloadChannel;
@@ -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;AAEzD,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,eAAe,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,MAAM,oBAAoB,GAC5B,WAAW,GACX,UAAU,CAAC;AAEf,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,oBAAoB,CAAC;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,eAAe,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,0BACf,SAAQ,YAAY,CAAC;IAAE,GAAG,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,QAAQ,CAAA;CAAE,CAAC;IAIzD,QAAQ,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAMpE,gBAAgB,CACd,OAAO,EAAE,eAAe,EACxB,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,IAAI,CAAC,CAAC;IAKjB,MAAM,CACJ,OAAO,EAAE,eAAe,EACxB,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,IAAI,CAAC,CAAC;IAGjB,mBAAmB,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,IAAI,GAAG,MAAM,CAAC;IAC3E,sBAAsB,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAKzC,eAAe,IAAI,MAAM,CAAC;CAC3B"}
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;AAEzD,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,eAAe,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAI5B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,sBAAsB,CAAC,EAAE,MAAM,CAAC;CACjC;AAWD,MAAM,MAAM,oBAAoB,GAC5B,WAAW,GACX,mBAAmB,GACnB,mBAAmB,GACnB,UAAU,CAAC;AAKf,MAAM,MAAM,iBAAiB,GACzB,oBAAoB,GACpB,kBAAkB,GAClB,aAAa,GACb,UAAU,GACV,kBAAkB,GAClB,kBAAkB,GAClB,qBAAqB,GACrB,kBAAkB,GAClB,WAAW,GACX,iBAAiB,CAAC;AAEtB,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,oBAAoB,CAAC;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,iBAAiB,CAAC;CAClC;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,eAAe,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,0BACf,SAAQ,YAAY,CAAC;IAAE,GAAG,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,QAAQ,CAAA;CAAE,CAAC;IAIzD,QAAQ,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAMpE,gBAAgB,CACd,OAAO,EAAE,eAAe,EACxB,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,IAAI,CAAC,CAAC;IAKjB,MAAM,CACJ,OAAO,EAAE,eAAe,EACxB,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,IAAI,CAAC,CAAC;IAGjB,mBAAmB,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,IAAI,GAAG,MAAM,CAAC;IAC3E,sBAAsB,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAKzC,eAAe,IAAI,MAAM,CAAC;CAC3B"}
@@ -11,6 +11,8 @@
11
11
  namespace margelo::nitro::reactnativerangedownloader { struct RangeDownloadResult; }
12
12
  // Forward declaration of `RangeDownloadOutcome` to properly resolve imports.
13
13
  namespace margelo::nitro::reactnativerangedownloader { enum class RangeDownloadOutcome; }
14
+ // Forward declaration of `RangeFallbackKind` to properly resolve imports.
15
+ namespace margelo::nitro::reactnativerangedownloader { enum class RangeFallbackKind; }
14
16
  // Forward declaration of `RangeDownloadParams` to properly resolve imports.
15
17
  namespace margelo::nitro::reactnativerangedownloader { struct RangeDownloadParams; }
16
18
  // Forward declaration of `DownloadChannel` to properly resolve imports.
@@ -26,6 +28,8 @@ namespace margelo::nitro::reactnativerangedownloader { struct RangeDownloadEvent
26
28
  #include "JRangeDownloadOutcome.hpp"
27
29
  #include <string>
28
30
  #include <optional>
31
+ #include "RangeFallbackKind.hpp"
32
+ #include "JRangeFallbackKind.hpp"
29
33
  #include "RangeDownloadParams.hpp"
30
34
  #include "JRangeDownloadParams.hpp"
31
35
  #include "DownloadChannel.hpp"
@@ -42,11 +42,17 @@ namespace margelo::nitro::reactnativerangedownloader {
42
42
  static jni::alias_ref<JRangeDownloadOutcome> fromCpp(RangeDownloadOutcome value) {
43
43
  static const auto clazz = javaClassStatic();
44
44
  static const auto fieldCOMPLETED = clazz->getStaticField<JRangeDownloadOutcome>("COMPLETED");
45
+ static const auto fieldFALLBACKTRANSIENT = clazz->getStaticField<JRangeDownloadOutcome>("FALLBACKTRANSIENT");
46
+ static const auto fieldFALLBACKPERMANENT = clazz->getStaticField<JRangeDownloadOutcome>("FALLBACKPERMANENT");
45
47
  static const auto fieldFALLBACK = clazz->getStaticField<JRangeDownloadOutcome>("FALLBACK");
46
48
 
47
49
  switch (value) {
48
50
  case RangeDownloadOutcome::COMPLETED:
49
51
  return clazz->getStaticFieldValue(fieldCOMPLETED);
52
+ case RangeDownloadOutcome::FALLBACKTRANSIENT:
53
+ return clazz->getStaticFieldValue(fieldFALLBACKTRANSIENT);
54
+ case RangeDownloadOutcome::FALLBACKPERMANENT:
55
+ return clazz->getStaticFieldValue(fieldFALLBACKPERMANENT);
50
56
  case RangeDownloadOutcome::FALLBACK:
51
57
  return clazz->getStaticFieldValue(fieldFALLBACK);
52
58
  default:
@@ -48,6 +48,14 @@ namespace margelo::nitro::reactnativerangedownloader {
48
48
  jni::local_ref<jni::JDouble> segmentCount = this->getFieldValue(fieldSegmentCount);
49
49
  static const auto fieldMinConcurrentBytes = clazz->getField<jni::JDouble>("minConcurrentBytes");
50
50
  jni::local_ref<jni::JDouble> minConcurrentBytes = this->getFieldValue(fieldMinConcurrentBytes);
51
+ static const auto fieldMaxSegmentAttempts = clazz->getField<jni::JDouble>("maxSegmentAttempts");
52
+ jni::local_ref<jni::JDouble> maxSegmentAttempts = this->getFieldValue(fieldMaxSegmentAttempts);
53
+ static const auto fieldRequestTimeoutSeconds = clazz->getField<jni::JDouble>("requestTimeoutSeconds");
54
+ jni::local_ref<jni::JDouble> requestTimeoutSeconds = this->getFieldValue(fieldRequestTimeoutSeconds);
55
+ static const auto fieldStallTimeoutSeconds = clazz->getField<jni::JDouble>("stallTimeoutSeconds");
56
+ jni::local_ref<jni::JDouble> stallTimeoutSeconds = this->getFieldValue(fieldStallTimeoutSeconds);
57
+ static const auto fieldOverallDeadlineSeconds = clazz->getField<jni::JDouble>("overallDeadlineSeconds");
58
+ jni::local_ref<jni::JDouble> overallDeadlineSeconds = this->getFieldValue(fieldOverallDeadlineSeconds);
51
59
  return RangeDownloadParams(
52
60
  channel->toCpp(),
53
61
  taskId->toStdString(),
@@ -55,7 +63,11 @@ namespace margelo::nitro::reactnativerangedownloader {
55
63
  destFilePath->toStdString(),
56
64
  expectedSha256 != nullptr ? std::make_optional(expectedSha256->toStdString()) : std::nullopt,
57
65
  segmentCount != nullptr ? std::make_optional(segmentCount->value()) : std::nullopt,
58
- minConcurrentBytes != nullptr ? std::make_optional(minConcurrentBytes->value()) : std::nullopt
66
+ minConcurrentBytes != nullptr ? std::make_optional(minConcurrentBytes->value()) : std::nullopt,
67
+ maxSegmentAttempts != nullptr ? std::make_optional(maxSegmentAttempts->value()) : std::nullopt,
68
+ requestTimeoutSeconds != nullptr ? std::make_optional(requestTimeoutSeconds->value()) : std::nullopt,
69
+ stallTimeoutSeconds != nullptr ? std::make_optional(stallTimeoutSeconds->value()) : std::nullopt,
70
+ overallDeadlineSeconds != nullptr ? std::make_optional(overallDeadlineSeconds->value()) : std::nullopt
59
71
  );
60
72
  }
61
73
 
@@ -65,7 +77,7 @@ namespace margelo::nitro::reactnativerangedownloader {
65
77
  */
66
78
  [[maybe_unused]]
67
79
  static jni::local_ref<JRangeDownloadParams::javaobject> fromCpp(const RangeDownloadParams& value) {
68
- using JSignature = JRangeDownloadParams(jni::alias_ref<JDownloadChannel>, jni::alias_ref<jni::JString>, jni::alias_ref<jni::JString>, jni::alias_ref<jni::JString>, jni::alias_ref<jni::JString>, jni::alias_ref<jni::JDouble>, jni::alias_ref<jni::JDouble>);
80
+ using JSignature = JRangeDownloadParams(jni::alias_ref<JDownloadChannel>, jni::alias_ref<jni::JString>, jni::alias_ref<jni::JString>, jni::alias_ref<jni::JString>, jni::alias_ref<jni::JString>, jni::alias_ref<jni::JDouble>, jni::alias_ref<jni::JDouble>, jni::alias_ref<jni::JDouble>, jni::alias_ref<jni::JDouble>, jni::alias_ref<jni::JDouble>, jni::alias_ref<jni::JDouble>);
69
81
  static const auto clazz = javaClassStatic();
70
82
  static const auto create = clazz->getStaticMethod<JSignature>("fromCpp");
71
83
  return create(
@@ -76,7 +88,11 @@ namespace margelo::nitro::reactnativerangedownloader {
76
88
  jni::make_jstring(value.destFilePath),
77
89
  value.expectedSha256.has_value() ? jni::make_jstring(value.expectedSha256.value()) : nullptr,
78
90
  value.segmentCount.has_value() ? jni::JDouble::valueOf(value.segmentCount.value()) : nullptr,
79
- value.minConcurrentBytes.has_value() ? jni::JDouble::valueOf(value.minConcurrentBytes.value()) : nullptr
91
+ value.minConcurrentBytes.has_value() ? jni::JDouble::valueOf(value.minConcurrentBytes.value()) : nullptr,
92
+ value.maxSegmentAttempts.has_value() ? jni::JDouble::valueOf(value.maxSegmentAttempts.value()) : nullptr,
93
+ value.requestTimeoutSeconds.has_value() ? jni::JDouble::valueOf(value.requestTimeoutSeconds.value()) : nullptr,
94
+ value.stallTimeoutSeconds.has_value() ? jni::JDouble::valueOf(value.stallTimeoutSeconds.value()) : nullptr,
95
+ value.overallDeadlineSeconds.has_value() ? jni::JDouble::valueOf(value.overallDeadlineSeconds.value()) : nullptr
80
96
  );
81
97
  }
82
98
  };
@@ -11,7 +11,9 @@
11
11
  #include "RangeDownloadResult.hpp"
12
12
 
13
13
  #include "JRangeDownloadOutcome.hpp"
14
+ #include "JRangeFallbackKind.hpp"
14
15
  #include "RangeDownloadOutcome.hpp"
16
+ #include "RangeFallbackKind.hpp"
15
17
  #include <optional>
16
18
  #include <string>
17
19
 
@@ -40,10 +42,13 @@ namespace margelo::nitro::reactnativerangedownloader {
40
42
  jni::local_ref<jni::JString> filePath = this->getFieldValue(fieldFilePath);
41
43
  static const auto fieldFallbackReason = clazz->getField<jni::JString>("fallbackReason");
42
44
  jni::local_ref<jni::JString> fallbackReason = this->getFieldValue(fieldFallbackReason);
45
+ static const auto fieldFallbackKind = clazz->getField<JRangeFallbackKind>("fallbackKind");
46
+ jni::local_ref<JRangeFallbackKind> fallbackKind = this->getFieldValue(fieldFallbackKind);
43
47
  return RangeDownloadResult(
44
48
  outcome->toCpp(),
45
49
  filePath->toStdString(),
46
- fallbackReason != nullptr ? std::make_optional(fallbackReason->toStdString()) : std::nullopt
50
+ fallbackReason != nullptr ? std::make_optional(fallbackReason->toStdString()) : std::nullopt,
51
+ fallbackKind != nullptr ? std::make_optional(fallbackKind->toCpp()) : std::nullopt
47
52
  );
48
53
  }
49
54
 
@@ -53,14 +58,15 @@ namespace margelo::nitro::reactnativerangedownloader {
53
58
  */
54
59
  [[maybe_unused]]
55
60
  static jni::local_ref<JRangeDownloadResult::javaobject> fromCpp(const RangeDownloadResult& value) {
56
- using JSignature = JRangeDownloadResult(jni::alias_ref<JRangeDownloadOutcome>, jni::alias_ref<jni::JString>, jni::alias_ref<jni::JString>);
61
+ using JSignature = JRangeDownloadResult(jni::alias_ref<JRangeDownloadOutcome>, jni::alias_ref<jni::JString>, jni::alias_ref<jni::JString>, jni::alias_ref<JRangeFallbackKind>);
57
62
  static const auto clazz = javaClassStatic();
58
63
  static const auto create = clazz->getStaticMethod<JSignature>("fromCpp");
59
64
  return create(
60
65
  clazz,
61
66
  JRangeDownloadOutcome::fromCpp(value.outcome),
62
67
  jni::make_jstring(value.filePath),
63
- value.fallbackReason.has_value() ? jni::make_jstring(value.fallbackReason.value()) : nullptr
68
+ value.fallbackReason.has_value() ? jni::make_jstring(value.fallbackReason.value()) : nullptr,
69
+ value.fallbackKind.has_value() ? JRangeFallbackKind::fromCpp(value.fallbackKind.value()) : nullptr
64
70
  );
65
71
  }
66
72
  };
@@ -0,0 +1,83 @@
1
+ ///
2
+ /// JRangeFallbackKind.hpp
3
+ /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
4
+ /// https://github.com/mrousavy/nitro
5
+ /// Copyright © 2026 Marc Rousavy @ Margelo
6
+ ///
7
+
8
+ #pragma once
9
+
10
+ #include <fbjni/fbjni.h>
11
+ #include "RangeFallbackKind.hpp"
12
+
13
+ namespace margelo::nitro::reactnativerangedownloader {
14
+
15
+ using namespace facebook;
16
+
17
+ /**
18
+ * The C++ JNI bridge between the C++ enum "RangeFallbackKind" and the the Kotlin enum "RangeFallbackKind".
19
+ */
20
+ struct JRangeFallbackKind final: public jni::JavaClass<JRangeFallbackKind> {
21
+ public:
22
+ static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/reactnativerangedownloader/RangeFallbackKind;";
23
+
24
+ public:
25
+ /**
26
+ * Convert this Java/Kotlin-based enum to the C++ enum RangeFallbackKind.
27
+ */
28
+ [[maybe_unused]]
29
+ [[nodiscard]]
30
+ RangeFallbackKind toCpp() const {
31
+ static const auto clazz = javaClassStatic();
32
+ static const auto fieldOrdinal = clazz->getField<int>("value");
33
+ int ordinal = this->getFieldValue(fieldOrdinal);
34
+ return static_cast<RangeFallbackKind>(ordinal);
35
+ }
36
+
37
+ public:
38
+ /**
39
+ * Create a Java/Kotlin-based enum with the given C++ enum's value.
40
+ */
41
+ [[maybe_unused]]
42
+ static jni::alias_ref<JRangeFallbackKind> fromCpp(RangeFallbackKind value) {
43
+ static const auto clazz = javaClassStatic();
44
+ static const auto fieldSERVERIGNOREDRANGE = clazz->getStaticField<JRangeFallbackKind>("SERVERIGNOREDRANGE");
45
+ static const auto fieldRANGEUNSUPPORTED = clazz->getStaticField<JRangeFallbackKind>("RANGEUNSUPPORTED");
46
+ static const auto fieldAUTHEXPIRED = clazz->getStaticField<JRangeFallbackKind>("AUTHEXPIRED");
47
+ static const auto fieldNOTFOUND = clazz->getStaticField<JRangeFallbackKind>("NOTFOUND");
48
+ static const auto fieldREDIRECTREJECTED = clazz->getStaticField<JRangeFallbackKind>("REDIRECTREJECTED");
49
+ static const auto fieldCHECKSUMMISMATCH = clazz->getStaticField<JRangeFallbackKind>("CHECKSUMMISMATCH");
50
+ static const auto fieldMULTIPARTORBADTOTAL = clazz->getStaticField<JRangeFallbackKind>("MULTIPARTORBADTOTAL");
51
+ static const auto fieldTRANSIENTNETWORK = clazz->getStaticField<JRangeFallbackKind>("TRANSIENTNETWORK");
52
+ static const auto fieldTHROTTLED = clazz->getStaticField<JRangeFallbackKind>("THROTTLED");
53
+ static const auto fieldBUDGETEXHAUSTED = clazz->getStaticField<JRangeFallbackKind>("BUDGETEXHAUSTED");
54
+
55
+ switch (value) {
56
+ case RangeFallbackKind::SERVERIGNOREDRANGE:
57
+ return clazz->getStaticFieldValue(fieldSERVERIGNOREDRANGE);
58
+ case RangeFallbackKind::RANGEUNSUPPORTED:
59
+ return clazz->getStaticFieldValue(fieldRANGEUNSUPPORTED);
60
+ case RangeFallbackKind::AUTHEXPIRED:
61
+ return clazz->getStaticFieldValue(fieldAUTHEXPIRED);
62
+ case RangeFallbackKind::NOTFOUND:
63
+ return clazz->getStaticFieldValue(fieldNOTFOUND);
64
+ case RangeFallbackKind::REDIRECTREJECTED:
65
+ return clazz->getStaticFieldValue(fieldREDIRECTREJECTED);
66
+ case RangeFallbackKind::CHECKSUMMISMATCH:
67
+ return clazz->getStaticFieldValue(fieldCHECKSUMMISMATCH);
68
+ case RangeFallbackKind::MULTIPARTORBADTOTAL:
69
+ return clazz->getStaticFieldValue(fieldMULTIPARTORBADTOTAL);
70
+ case RangeFallbackKind::TRANSIENTNETWORK:
71
+ return clazz->getStaticFieldValue(fieldTRANSIENTNETWORK);
72
+ case RangeFallbackKind::THROTTLED:
73
+ return clazz->getStaticFieldValue(fieldTHROTTLED);
74
+ case RangeFallbackKind::BUDGETEXHAUSTED:
75
+ return clazz->getStaticFieldValue(fieldBUDGETEXHAUSTED);
76
+ default:
77
+ std::string stringValue = std::to_string(static_cast<int>(value));
78
+ throw std::invalid_argument("Invalid enum value (" + stringValue + "!");
79
+ }
80
+ }
81
+ };
82
+
83
+ } // namespace margelo::nitro::reactnativerangedownloader
@@ -17,5 +17,7 @@ import com.facebook.proguard.annotations.DoNotStrip
17
17
  @Keep
18
18
  enum class RangeDownloadOutcome(@DoNotStrip @Keep val value: Int) {
19
19
  COMPLETED(0),
20
- FALLBACK(1);
20
+ FALLBACKTRANSIENT(1),
21
+ FALLBACKPERMANENT(2),
22
+ FALLBACK(3);
21
23
  }
@@ -37,7 +37,19 @@ data class RangeDownloadParams(
37
37
  val segmentCount: Double?,
38
38
  @DoNotStrip
39
39
  @Keep
40
- val minConcurrentBytes: Double?
40
+ val minConcurrentBytes: Double?,
41
+ @DoNotStrip
42
+ @Keep
43
+ val maxSegmentAttempts: Double?,
44
+ @DoNotStrip
45
+ @Keep
46
+ val requestTimeoutSeconds: Double?,
47
+ @DoNotStrip
48
+ @Keep
49
+ val stallTimeoutSeconds: Double?,
50
+ @DoNotStrip
51
+ @Keep
52
+ val overallDeadlineSeconds: Double?
41
53
  ) {
42
54
  /* primary constructor */
43
55
 
@@ -49,8 +61,8 @@ data class RangeDownloadParams(
49
61
  @Keep
50
62
  @Suppress("unused")
51
63
  @JvmStatic
52
- private fun fromCpp(channel: DownloadChannel, taskId: String, url: String, destFilePath: String, expectedSha256: String?, segmentCount: Double?, minConcurrentBytes: Double?): RangeDownloadParams {
53
- return RangeDownloadParams(channel, taskId, url, destFilePath, expectedSha256, segmentCount, minConcurrentBytes)
64
+ private fun fromCpp(channel: DownloadChannel, taskId: String, url: String, destFilePath: String, expectedSha256: String?, segmentCount: Double?, minConcurrentBytes: Double?, maxSegmentAttempts: Double?, requestTimeoutSeconds: Double?, stallTimeoutSeconds: Double?, overallDeadlineSeconds: Double?): RangeDownloadParams {
65
+ return RangeDownloadParams(channel, taskId, url, destFilePath, expectedSha256, segmentCount, minConcurrentBytes, maxSegmentAttempts, requestTimeoutSeconds, stallTimeoutSeconds, overallDeadlineSeconds)
54
66
  }
55
67
  }
56
68
  }
@@ -25,7 +25,10 @@ data class RangeDownloadResult(
25
25
  val filePath: String,
26
26
  @DoNotStrip
27
27
  @Keep
28
- val fallbackReason: String?
28
+ val fallbackReason: String?,
29
+ @DoNotStrip
30
+ @Keep
31
+ val fallbackKind: RangeFallbackKind?
29
32
  ) {
30
33
  /* primary constructor */
31
34
 
@@ -37,8 +40,8 @@ data class RangeDownloadResult(
37
40
  @Keep
38
41
  @Suppress("unused")
39
42
  @JvmStatic
40
- private fun fromCpp(outcome: RangeDownloadOutcome, filePath: String, fallbackReason: String?): RangeDownloadResult {
41
- return RangeDownloadResult(outcome, filePath, fallbackReason)
43
+ private fun fromCpp(outcome: RangeDownloadOutcome, filePath: String, fallbackReason: String?, fallbackKind: RangeFallbackKind?): RangeDownloadResult {
44
+ return RangeDownloadResult(outcome, filePath, fallbackReason, fallbackKind)
42
45
  }
43
46
  }
44
47
  }
@@ -0,0 +1,29 @@
1
+ ///
2
+ /// RangeFallbackKind.kt
3
+ /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
4
+ /// https://github.com/mrousavy/nitro
5
+ /// Copyright © 2026 Marc Rousavy @ Margelo
6
+ ///
7
+
8
+ package com.margelo.nitro.reactnativerangedownloader
9
+
10
+ import androidx.annotation.Keep
11
+ import com.facebook.proguard.annotations.DoNotStrip
12
+
13
+ /**
14
+ * Represents the JavaScript enum/union "RangeFallbackKind".
15
+ */
16
+ @DoNotStrip
17
+ @Keep
18
+ enum class RangeFallbackKind(@DoNotStrip @Keep val value: Int) {
19
+ SERVERIGNOREDRANGE(0),
20
+ RANGEUNSUPPORTED(1),
21
+ AUTHEXPIRED(2),
22
+ NOTFOUND(3),
23
+ REDIRECTREJECTED(4),
24
+ CHECKSUMMISMATCH(5),
25
+ MULTIPARTORBADTOTAL(6),
26
+ TRANSIENTNETWORK(7),
27
+ THROTTLED(8),
28
+ BUDGETEXHAUSTED(9);
29
+ }
@@ -18,6 +18,8 @@ namespace margelo::nitro::reactnativerangedownloader { struct RangeDownloadEvent
18
18
  namespace margelo::nitro::reactnativerangedownloader { enum class RangeDownloadOutcome; }
19
19
  // Forward declaration of `RangeDownloadResult` to properly resolve imports.
20
20
  namespace margelo::nitro::reactnativerangedownloader { struct RangeDownloadResult; }
21
+ // Forward declaration of `RangeFallbackKind` to properly resolve imports.
22
+ namespace margelo::nitro::reactnativerangedownloader { enum class RangeFallbackKind; }
21
23
 
22
24
  // Forward declarations of Swift defined types
23
25
  // Forward declaration of `HybridReactNativeRangeDownloaderSpec_cxx` to properly resolve imports.
@@ -29,6 +31,7 @@ namespace ReactNativeRangeDownloader { class HybridReactNativeRangeDownloaderSpe
29
31
  #include "RangeDownloadEvent.hpp"
30
32
  #include "RangeDownloadOutcome.hpp"
31
33
  #include "RangeDownloadResult.hpp"
34
+ #include "RangeFallbackKind.hpp"
32
35
  #include <NitroModules/Promise.hpp>
33
36
  #include <NitroModules/PromiseHolder.hpp>
34
37
  #include <NitroModules/Result.hpp>
@@ -59,6 +62,21 @@ namespace margelo::nitro::reactnativerangedownloader::bridge::swift {
59
62
  return *optional;
60
63
  }
61
64
 
65
+ // pragma MARK: std::optional<RangeFallbackKind>
66
+ /**
67
+ * Specialized version of `std::optional<RangeFallbackKind>`.
68
+ */
69
+ using std__optional_RangeFallbackKind_ = std::optional<RangeFallbackKind>;
70
+ inline std::optional<RangeFallbackKind> create_std__optional_RangeFallbackKind_(const RangeFallbackKind& value) noexcept {
71
+ return std::optional<RangeFallbackKind>(value);
72
+ }
73
+ inline bool has_value_std__optional_RangeFallbackKind_(const std::optional<RangeFallbackKind>& optional) noexcept {
74
+ return optional.has_value();
75
+ }
76
+ inline RangeFallbackKind get_std__optional_RangeFallbackKind_(const std::optional<RangeFallbackKind>& optional) noexcept {
77
+ return *optional;
78
+ }
79
+
62
80
  // pragma MARK: std::shared_ptr<Promise<RangeDownloadResult>>
63
81
  /**
64
82
  * Specialized version of `std::shared_ptr<Promise<RangeDownloadResult>>`.
@@ -20,6 +20,8 @@ namespace margelo::nitro::reactnativerangedownloader { enum class RangeDownloadO
20
20
  namespace margelo::nitro::reactnativerangedownloader { struct RangeDownloadParams; }
21
21
  // Forward declaration of `RangeDownloadResult` to properly resolve imports.
22
22
  namespace margelo::nitro::reactnativerangedownloader { struct RangeDownloadResult; }
23
+ // Forward declaration of `RangeFallbackKind` to properly resolve imports.
24
+ namespace margelo::nitro::reactnativerangedownloader { enum class RangeFallbackKind; }
23
25
 
24
26
  // Include C++ defined types
25
27
  #include "DownloadChannel.hpp"
@@ -28,6 +30,7 @@ namespace margelo::nitro::reactnativerangedownloader { struct RangeDownloadResul
28
30
  #include "RangeDownloadOutcome.hpp"
29
31
  #include "RangeDownloadParams.hpp"
30
32
  #include "RangeDownloadResult.hpp"
33
+ #include "RangeFallbackKind.hpp"
31
34
  #include <NitroModules/Promise.hpp>
32
35
  #include <NitroModules/Result.hpp>
33
36
  #include <exception>
@@ -16,6 +16,8 @@ namespace ReactNativeRangeDownloader { class HybridReactNativeRangeDownloaderSpe
16
16
  namespace margelo::nitro::reactnativerangedownloader { struct RangeDownloadResult; }
17
17
  // Forward declaration of `RangeDownloadOutcome` to properly resolve imports.
18
18
  namespace margelo::nitro::reactnativerangedownloader { enum class RangeDownloadOutcome; }
19
+ // Forward declaration of `RangeFallbackKind` to properly resolve imports.
20
+ namespace margelo::nitro::reactnativerangedownloader { enum class RangeFallbackKind; }
19
21
  // Forward declaration of `RangeDownloadParams` to properly resolve imports.
20
22
  namespace margelo::nitro::reactnativerangedownloader { struct RangeDownloadParams; }
21
23
  // Forward declaration of `DownloadChannel` to properly resolve imports.
@@ -28,6 +30,7 @@ namespace margelo::nitro::reactnativerangedownloader { struct RangeDownloadEvent
28
30
  #include "RangeDownloadOutcome.hpp"
29
31
  #include <string>
30
32
  #include <optional>
33
+ #include "RangeFallbackKind.hpp"
31
34
  #include "RangeDownloadParams.hpp"
32
35
  #include "DownloadChannel.hpp"
33
36
  #include "RangeDownloadEvent.hpp"
@@ -19,6 +19,10 @@ public extension RangeDownloadOutcome {
19
19
  switch string {
20
20
  case "completed":
21
21
  self = .completed
22
+ case "fallbackTransient":
23
+ self = .fallbacktransient
24
+ case "fallbackPermanent":
25
+ self = .fallbackpermanent
22
26
  case "fallback":
23
27
  self = .fallback
24
28
  default:
@@ -33,6 +37,10 @@ public extension RangeDownloadOutcome {
33
37
  switch self {
34
38
  case .completed:
35
39
  return "completed"
40
+ case .fallbacktransient:
41
+ return "fallbackTransient"
42
+ case .fallbackpermanent:
43
+ return "fallbackPermanent"
36
44
  case .fallback:
37
45
  return "fallback"
38
46
  }
@@ -19,7 +19,7 @@ public extension RangeDownloadParams {
19
19
  /**
20
20
  * Create a new instance of `RangeDownloadParams`.
21
21
  */
22
- init(channel: DownloadChannel, taskId: String, url: String, destFilePath: String, expectedSha256: String?, segmentCount: Double?, minConcurrentBytes: Double?) {
22
+ init(channel: DownloadChannel, taskId: String, url: String, destFilePath: String, expectedSha256: String?, segmentCount: Double?, minConcurrentBytes: Double?, maxSegmentAttempts: Double?, requestTimeoutSeconds: Double?, stallTimeoutSeconds: Double?, overallDeadlineSeconds: Double?) {
23
23
  self.init(channel, std.string(taskId), std.string(url), std.string(destFilePath), { () -> bridge.std__optional_std__string_ in
24
24
  if let __unwrappedValue = expectedSha256 {
25
25
  return bridge.create_std__optional_std__string_(std.string(__unwrappedValue))
@@ -38,6 +38,30 @@ public extension RangeDownloadParams {
38
38
  } else {
39
39
  return .init()
40
40
  }
41
+ }(), { () -> bridge.std__optional_double_ in
42
+ if let __unwrappedValue = maxSegmentAttempts {
43
+ return bridge.create_std__optional_double_(__unwrappedValue)
44
+ } else {
45
+ return .init()
46
+ }
47
+ }(), { () -> bridge.std__optional_double_ in
48
+ if let __unwrappedValue = requestTimeoutSeconds {
49
+ return bridge.create_std__optional_double_(__unwrappedValue)
50
+ } else {
51
+ return .init()
52
+ }
53
+ }(), { () -> bridge.std__optional_double_ in
54
+ if let __unwrappedValue = stallTimeoutSeconds {
55
+ return bridge.create_std__optional_double_(__unwrappedValue)
56
+ } else {
57
+ return .init()
58
+ }
59
+ }(), { () -> bridge.std__optional_double_ in
60
+ if let __unwrappedValue = overallDeadlineSeconds {
61
+ return bridge.create_std__optional_double_(__unwrappedValue)
62
+ } else {
63
+ return .init()
64
+ }
41
65
  }())
42
66
  }
43
67
 
@@ -142,4 +166,72 @@ public extension RangeDownloadParams {
142
166
  }()
143
167
  }
144
168
  }
169
+
170
+ var maxSegmentAttempts: Double? {
171
+ @inline(__always)
172
+ get {
173
+ return self.__maxSegmentAttempts.value
174
+ }
175
+ @inline(__always)
176
+ set {
177
+ self.__maxSegmentAttempts = { () -> bridge.std__optional_double_ in
178
+ if let __unwrappedValue = newValue {
179
+ return bridge.create_std__optional_double_(__unwrappedValue)
180
+ } else {
181
+ return .init()
182
+ }
183
+ }()
184
+ }
185
+ }
186
+
187
+ var requestTimeoutSeconds: Double? {
188
+ @inline(__always)
189
+ get {
190
+ return self.__requestTimeoutSeconds.value
191
+ }
192
+ @inline(__always)
193
+ set {
194
+ self.__requestTimeoutSeconds = { () -> bridge.std__optional_double_ in
195
+ if let __unwrappedValue = newValue {
196
+ return bridge.create_std__optional_double_(__unwrappedValue)
197
+ } else {
198
+ return .init()
199
+ }
200
+ }()
201
+ }
202
+ }
203
+
204
+ var stallTimeoutSeconds: Double? {
205
+ @inline(__always)
206
+ get {
207
+ return self.__stallTimeoutSeconds.value
208
+ }
209
+ @inline(__always)
210
+ set {
211
+ self.__stallTimeoutSeconds = { () -> bridge.std__optional_double_ in
212
+ if let __unwrappedValue = newValue {
213
+ return bridge.create_std__optional_double_(__unwrappedValue)
214
+ } else {
215
+ return .init()
216
+ }
217
+ }()
218
+ }
219
+ }
220
+
221
+ var overallDeadlineSeconds: Double? {
222
+ @inline(__always)
223
+ get {
224
+ return self.__overallDeadlineSeconds.value
225
+ }
226
+ @inline(__always)
227
+ set {
228
+ self.__overallDeadlineSeconds = { () -> bridge.std__optional_double_ in
229
+ if let __unwrappedValue = newValue {
230
+ return bridge.create_std__optional_double_(__unwrappedValue)
231
+ } else {
232
+ return .init()
233
+ }
234
+ }()
235
+ }
236
+ }
145
237
  }
@@ -19,13 +19,19 @@ public extension RangeDownloadResult {
19
19
  /**
20
20
  * Create a new instance of `RangeDownloadResult`.
21
21
  */
22
- init(outcome: RangeDownloadOutcome, filePath: String, fallbackReason: String?) {
22
+ init(outcome: RangeDownloadOutcome, filePath: String, fallbackReason: String?, fallbackKind: RangeFallbackKind?) {
23
23
  self.init(outcome, std.string(filePath), { () -> bridge.std__optional_std__string_ in
24
24
  if let __unwrappedValue = fallbackReason {
25
25
  return bridge.create_std__optional_std__string_(std.string(__unwrappedValue))
26
26
  } else {
27
27
  return .init()
28
28
  }
29
+ }(), { () -> bridge.std__optional_RangeFallbackKind_ in
30
+ if let __unwrappedValue = fallbackKind {
31
+ return bridge.create_std__optional_RangeFallbackKind_(__unwrappedValue)
32
+ } else {
33
+ return .init()
34
+ }
29
35
  }())
30
36
  }
31
37
 
@@ -74,4 +80,21 @@ public extension RangeDownloadResult {
74
80
  }()
75
81
  }
76
82
  }
83
+
84
+ var fallbackKind: RangeFallbackKind? {
85
+ @inline(__always)
86
+ get {
87
+ return self.__fallbackKind.value
88
+ }
89
+ @inline(__always)
90
+ set {
91
+ self.__fallbackKind = { () -> bridge.std__optional_RangeFallbackKind_ in
92
+ if let __unwrappedValue = newValue {
93
+ return bridge.create_std__optional_RangeFallbackKind_(__unwrappedValue)
94
+ } else {
95
+ return .init()
96
+ }
97
+ }()
98
+ }
99
+ }
77
100
  }