From cf179637093792d85f57109908fda8b6f877689a Mon Sep 17 00:00:00 2001 From: Krzysztof Moch Date: Sat, 18 Jan 2025 23:14:20 +0100 Subject: [PATCH] chore: bump nitro version --- bun.lockb | Bin 604818 -> 608466 bytes example/ios/Podfile | 1 + example/ios/Podfile.lock | 259 +++++++++++------- example/package.json | 2 +- .../android/NitroVideo+autolinking.cmake | 5 +- .../android/NitroVideo+autolinking.gradle | 2 +- .../generated/android/NitroVideoOnLoad.cpp | 6 +- .../generated/android/NitroVideoOnLoad.hpp | 2 +- .../c++/JHybridVideoPlayerFactorySpec.cpp | 2 +- .../c++/JHybridVideoPlayerFactorySpec.hpp | 2 +- .../JHybridVideoPlayerSourceFactorySpec.cpp | 2 +- .../JHybridVideoPlayerSourceFactorySpec.hpp | 2 +- .../c++/JHybridVideoPlayerSourceSpec.cpp | 34 ++- .../c++/JHybridVideoPlayerSourceSpec.hpp | 5 +- .../android/c++/JHybridVideoPlayerSpec.cpp | 46 +++- .../android/c++/JHybridVideoPlayerSpec.hpp | 7 +- ...JHybridVideoViewViewManagerFactorySpec.cpp | 2 +- ...JHybridVideoViewViewManagerFactorySpec.hpp | 2 +- .../c++/JHybridVideoViewViewManagerSpec.cpp | 2 +- .../c++/JHybridVideoViewViewManagerSpec.hpp | 2 +- .../android/c++/JVideoInformation.hpp | 82 ++++++ .../android/c++/JVideoOrientation.hpp | 71 +++++ .../video/HybridVideoPlayerFactorySpec.kt | 8 +- .../HybridVideoPlayerSourceFactorySpec.kt | 8 +- .../video/HybridVideoPlayerSourceSpec.kt | 16 +- .../nitro/video/HybridVideoPlayerSpec.kt | 28 +- .../HybridVideoViewViewManagerFactorySpec.kt | 8 +- .../video/HybridVideoViewViewManagerSpec.kt | 8 +- .../margelo/nitro/video/VideoInformation.kt | 33 +++ .../margelo/nitro/video/VideoOrientation.kt | 29 ++ .../generated/ios/NitroVideo+autolinking.rb | 2 +- .../ios/NitroVideo-Swift-Cxx-Bridge.cpp | 75 +++-- .../ios/NitroVideo-Swift-Cxx-Bridge.hpp | 205 +++++++++++++- .../ios/NitroVideo-Swift-Cxx-Umbrella.hpp | 38 ++- .../generated/ios/NitroVideoAutolinking.mm | 2 +- .../generated/ios/NitroVideoAutolinking.swift | 23 +- .../c++/HybridVideoPlayerFactorySpecSwift.cpp | 2 +- .../c++/HybridVideoPlayerFactorySpecSwift.hpp | 30 +- ...ybridVideoPlayerSourceFactorySpecSwift.cpp | 2 +- ...ybridVideoPlayerSourceFactorySpecSwift.hpp | 30 +- .../c++/HybridVideoPlayerSourceSpecSwift.cpp | 2 +- .../c++/HybridVideoPlayerSourceSpecSwift.hpp | 44 +-- .../ios/c++/HybridVideoPlayerSpecSwift.cpp | 2 +- .../ios/c++/HybridVideoPlayerSpecSwift.hpp | 58 ++-- ...idVideoViewViewManagerFactorySpecSwift.cpp | 2 +- ...idVideoViewViewManagerFactorySpecSwift.hpp | 30 +- .../HybridVideoViewViewManagerSpecSwift.cpp | 2 +- .../HybridVideoViewViewManagerSpecSwift.hpp | 24 +- nitrogen/generated/ios/swift/Func_void.swift | 46 ++++ .../swift/Func_void_VideoInformation.swift | 46 ++++ .../swift/Func_void_std__exception_ptr.swift | 46 ++++ .../swift/HybridVideoPlayerFactorySpec.swift | 55 ++-- ...=> HybridVideoPlayerFactorySpec_cxx.swift} | 98 +++---- .../HybridVideoPlayerSourceFactorySpec.swift | 55 ++-- ...ybridVideoPlayerSourceFactorySpecCxx.swift | 115 -------- ...bridVideoPlayerSourceFactorySpec_cxx.swift | 117 ++++++++ .../swift/HybridVideoPlayerSourceSpec.swift | 55 ++-- .../HybridVideoPlayerSourceSpecCxx.swift | 111 -------- .../HybridVideoPlayerSourceSpec_cxx.swift | 126 +++++++++ .../ios/swift/HybridVideoPlayerSpec.swift | 65 +++-- .../ios/swift/HybridVideoPlayerSpecCxx.swift | 168 ------------ .../ios/swift/HybridVideoPlayerSpec_cxx.swift | 203 ++++++++++++++ ...ybridVideoViewViewManagerFactorySpec.swift | 55 ++-- ...idVideoViewViewManagerFactorySpecCxx.swift | 115 -------- ...dVideoViewViewManagerFactorySpec_cxx.swift | 117 ++++++++ .../HybridVideoViewViewManagerSpec.swift | 55 ++-- ... HybridVideoViewViewManagerSpec_cxx.swift} | 87 +++--- .../ios/swift/VideoInformation.swift | 112 ++++++++ .../ios/swift/VideoOrientation.swift | 56 ++++ .../c++/HybridVideoPlayerFactorySpec.cpp | 2 +- .../c++/HybridVideoPlayerFactorySpec.hpp | 2 +- .../HybridVideoPlayerSourceFactorySpec.cpp | 2 +- .../HybridVideoPlayerSourceFactorySpec.hpp | 2 +- .../c++/HybridVideoPlayerSourceSpec.cpp | 4 +- .../c++/HybridVideoPlayerSourceSpec.hpp | 10 +- .../shared/c++/HybridVideoPlayerSpec.cpp | 7 +- .../shared/c++/HybridVideoPlayerSpec.hpp | 8 +- .../HybridVideoViewViewManagerFactorySpec.cpp | 2 +- .../HybridVideoViewViewManagerFactorySpec.hpp | 2 +- .../c++/HybridVideoViewViewManagerSpec.cpp | 2 +- .../c++/HybridVideoViewViewManagerSpec.hpp | 2 +- .../generated/shared/c++/VideoInformation.hpp | 97 +++++++ .../generated/shared/c++/VideoOrientation.hpp | 94 +++++++ package.json | 2 +- 84 files changed, 2301 insertions(+), 1089 deletions(-) create mode 100644 nitrogen/generated/android/c++/JVideoInformation.hpp create mode 100644 nitrogen/generated/android/c++/JVideoOrientation.hpp create mode 100644 nitrogen/generated/android/kotlin/com/margelo/nitro/video/VideoInformation.kt create mode 100644 nitrogen/generated/android/kotlin/com/margelo/nitro/video/VideoOrientation.kt create mode 100644 nitrogen/generated/ios/swift/Func_void.swift create mode 100644 nitrogen/generated/ios/swift/Func_void_VideoInformation.swift create mode 100644 nitrogen/generated/ios/swift/Func_void_std__exception_ptr.swift rename nitrogen/generated/ios/swift/{HybridVideoPlayerFactorySpecCxx.swift => HybridVideoPlayerFactorySpec_cxx.swift} (50%) delete mode 100644 nitrogen/generated/ios/swift/HybridVideoPlayerSourceFactorySpecCxx.swift create mode 100644 nitrogen/generated/ios/swift/HybridVideoPlayerSourceFactorySpec_cxx.swift delete mode 100644 nitrogen/generated/ios/swift/HybridVideoPlayerSourceSpecCxx.swift create mode 100644 nitrogen/generated/ios/swift/HybridVideoPlayerSourceSpec_cxx.swift delete mode 100644 nitrogen/generated/ios/swift/HybridVideoPlayerSpecCxx.swift create mode 100644 nitrogen/generated/ios/swift/HybridVideoPlayerSpec_cxx.swift delete mode 100644 nitrogen/generated/ios/swift/HybridVideoViewViewManagerFactorySpecCxx.swift create mode 100644 nitrogen/generated/ios/swift/HybridVideoViewViewManagerFactorySpec_cxx.swift rename nitrogen/generated/ios/swift/{HybridVideoViewViewManagerSpecCxx.swift => HybridVideoViewViewManagerSpec_cxx.swift} (62%) create mode 100644 nitrogen/generated/ios/swift/VideoInformation.swift create mode 100644 nitrogen/generated/ios/swift/VideoOrientation.swift create mode 100644 nitrogen/generated/shared/c++/VideoInformation.hpp create mode 100644 nitrogen/generated/shared/c++/VideoOrientation.hpp diff --git a/bun.lockb b/bun.lockb index 0b21c3abc2423bff2c9748ac666a9e0f380be419..f40ccda952a8264addababbf40027a35ccdebd42 100755 GIT binary patch delta 145996 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 b0kj@K`71QzEj4JSr>1{fRip>L`j!6=TSGdJ delta 143146 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
  • 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 diff --git a/example/ios/Podfile b/example/ios/Podfile index 9627c8c4..be09bf15 100644 --- a/example/ios/Podfile +++ b/example/ios/Podfile @@ -5,6 +5,7 @@ ws_dir = ws_dir.parent until require "#{ws_dir}/node_modules/react-native-test-app/test_app.rb" ENV['RCT_NEW_ARCH_ENABLED'] = '1' +ENV["USE_HERMES"] = '1' Pod::UI.puts "Building with RCT_NEW_ARCH_ENABLED = #{ENV['RCT_NEW_ARCH_ENABLED']}..." diff --git a/example/ios/Podfile.lock b/example/ios/Podfile.lock index 3f55fede..a431e651 100644 --- a/example/ios/Podfile.lock +++ b/example/ios/Podfile.lock @@ -4,12 +4,17 @@ PODS: - FBLazyVector (0.75.3) - fmt (9.1.0) - glog (0.3.5) - - NitroModules (0.17.0): + - hermes-engine (0.75.3): + - hermes-engine/Pre-built (= 0.75.3) + - hermes-engine/Pre-built (0.75.3) + - NitroModules (0.21.0): - DoubleConversion - glog + - hermes-engine - RCT-Folly (= 2024.01.01.00) - RCTRequired - RCTTypeSafety + - React-callinvoker - React-Core - React-debug - React-Fabric @@ -28,6 +33,7 @@ PODS: - NitroVideo (7.0.0-dev): - DoubleConversion - glog + - hermes-engine - NitroModules - RCT-Folly (= 2024.01.01.00) - RCTRequired @@ -38,7 +44,6 @@ PODS: - React-featureflags - React-graphics - React-ImageManager - - React-jsi - React-NativeModulesApple - React-RCTFabric - React-rendererdebug @@ -85,12 +90,13 @@ PODS: - React-callinvoker (0.75.3) - React-Core (0.75.3): - glog + - hermes-engine - RCT-Folly (= 2024.01.01.00) - RCTDeprecation - React-Core/Default (= 0.75.3) - React-cxxreact - React-featureflags - - React-jsc + - React-hermes - React-jsi - React-jsiexecutor - React-jsinspector @@ -101,12 +107,13 @@ PODS: - Yoga - React-Core/CoreModulesHeaders (0.75.3): - glog + - hermes-engine - RCT-Folly (= 2024.01.01.00) - RCTDeprecation - React-Core/Default - React-cxxreact - React-featureflags - - React-jsc + - React-hermes - React-jsi - React-jsiexecutor - React-jsinspector @@ -117,11 +124,12 @@ PODS: - Yoga - React-Core/Default (0.75.3): - glog + - hermes-engine - RCT-Folly (= 2024.01.01.00) - RCTDeprecation - React-cxxreact - React-featureflags - - React-jsc + - React-hermes - React-jsi - React-jsiexecutor - React-jsinspector @@ -132,13 +140,14 @@ PODS: - Yoga - React-Core/DevSupport (0.75.3): - glog + - hermes-engine - RCT-Folly (= 2024.01.01.00) - RCTDeprecation - React-Core/Default (= 0.75.3) - React-Core/RCTWebSocket (= 0.75.3) - React-cxxreact - React-featureflags - - React-jsc + - React-hermes - React-jsi - React-jsiexecutor - React-jsinspector @@ -149,12 +158,13 @@ PODS: - Yoga - React-Core/RCTActionSheetHeaders (0.75.3): - glog + - hermes-engine - RCT-Folly (= 2024.01.01.00) - RCTDeprecation - React-Core/Default - React-cxxreact - React-featureflags - - React-jsc + - React-hermes - React-jsi - React-jsiexecutor - React-jsinspector @@ -165,12 +175,13 @@ PODS: - Yoga - React-Core/RCTAnimationHeaders (0.75.3): - glog + - hermes-engine - RCT-Folly (= 2024.01.01.00) - RCTDeprecation - React-Core/Default - React-cxxreact - React-featureflags - - React-jsc + - React-hermes - React-jsi - React-jsiexecutor - React-jsinspector @@ -181,12 +192,13 @@ PODS: - Yoga - React-Core/RCTBlobHeaders (0.75.3): - glog + - hermes-engine - RCT-Folly (= 2024.01.01.00) - RCTDeprecation - React-Core/Default - React-cxxreact - React-featureflags - - React-jsc + - React-hermes - React-jsi - React-jsiexecutor - React-jsinspector @@ -197,12 +209,13 @@ PODS: - Yoga - React-Core/RCTImageHeaders (0.75.3): - glog + - hermes-engine - RCT-Folly (= 2024.01.01.00) - RCTDeprecation - React-Core/Default - React-cxxreact - React-featureflags - - React-jsc + - React-hermes - React-jsi - React-jsiexecutor - React-jsinspector @@ -213,12 +226,13 @@ PODS: - Yoga - React-Core/RCTLinkingHeaders (0.75.3): - glog + - hermes-engine - RCT-Folly (= 2024.01.01.00) - RCTDeprecation - React-Core/Default - React-cxxreact - React-featureflags - - React-jsc + - React-hermes - React-jsi - React-jsiexecutor - React-jsinspector @@ -229,12 +243,13 @@ PODS: - Yoga - React-Core/RCTNetworkHeaders (0.75.3): - glog + - hermes-engine - RCT-Folly (= 2024.01.01.00) - RCTDeprecation - React-Core/Default - React-cxxreact - React-featureflags - - React-jsc + - React-hermes - React-jsi - React-jsiexecutor - React-jsinspector @@ -245,12 +260,13 @@ PODS: - Yoga - React-Core/RCTSettingsHeaders (0.75.3): - glog + - hermes-engine - RCT-Folly (= 2024.01.01.00) - RCTDeprecation - React-Core/Default - React-cxxreact - React-featureflags - - React-jsc + - React-hermes - React-jsi - React-jsiexecutor - React-jsinspector @@ -261,12 +277,13 @@ PODS: - Yoga - React-Core/RCTTextHeaders (0.75.3): - glog + - hermes-engine - RCT-Folly (= 2024.01.01.00) - RCTDeprecation - React-Core/Default - React-cxxreact - React-featureflags - - React-jsc + - React-hermes - React-jsi - React-jsiexecutor - React-jsinspector @@ -277,12 +294,13 @@ PODS: - Yoga - React-Core/RCTVibrationHeaders (0.75.3): - glog + - hermes-engine - RCT-Folly (= 2024.01.01.00) - RCTDeprecation - React-Core/Default - React-cxxreact - React-featureflags - - React-jsc + - React-hermes - React-jsi - React-jsiexecutor - React-jsinspector @@ -293,12 +311,13 @@ PODS: - Yoga - React-Core/RCTWebSocket (0.75.3): - glog + - hermes-engine - RCT-Folly (= 2024.01.01.00) - RCTDeprecation - React-Core/Default (= 0.75.3) - React-cxxreact - React-featureflags - - React-jsc + - React-hermes - React-jsi - React-jsiexecutor - React-jsinspector @@ -326,6 +345,7 @@ PODS: - DoubleConversion - fmt (= 9.1.0) - glog + - hermes-engine - RCT-Folly (= 2024.01.01.00) - React-callinvoker (= 0.75.3) - React-debug (= 0.75.3) @@ -338,6 +358,7 @@ PODS: - React-defaultsnativemodule (0.75.3): - DoubleConversion - glog + - hermes-engine - RCT-Folly (= 2024.01.01.00) - RCTRequired - RCTTypeSafety @@ -350,7 +371,6 @@ PODS: - React-graphics - React-idlecallbacksnativemodule - React-ImageManager - - React-jsi - React-microtasksnativemodule - React-NativeModulesApple - React-RCTFabric @@ -363,6 +383,7 @@ PODS: - React-domnativemodule (0.75.3): - DoubleConversion - glog + - hermes-engine - RCT-Folly (= 2024.01.01.00) - RCTRequired - RCTTypeSafety @@ -373,7 +394,6 @@ PODS: - React-featureflags - React-graphics - React-ImageManager - - React-jsi - React-NativeModulesApple - React-RCTFabric - React-rendererdebug @@ -386,6 +406,7 @@ PODS: - DoubleConversion - fmt (= 9.1.0) - glog + - hermes-engine - RCT-Folly/Fabric (= 2024.01.01.00) - RCTRequired - RCTTypeSafety @@ -409,7 +430,6 @@ PODS: - React-Fabric/uimanager (= 0.75.3) - React-featureflags - React-graphics - - React-jsc - React-jsi - React-jsiexecutor - React-logger @@ -421,6 +441,7 @@ PODS: - DoubleConversion - fmt (= 9.1.0) - glog + - hermes-engine - RCT-Folly/Fabric (= 2024.01.01.00) - RCTRequired - RCTTypeSafety @@ -429,7 +450,6 @@ PODS: - React-debug - React-featureflags - React-graphics - - React-jsc - React-jsi - React-jsiexecutor - React-logger @@ -441,6 +461,7 @@ PODS: - DoubleConversion - fmt (= 9.1.0) - glog + - hermes-engine - RCT-Folly/Fabric (= 2024.01.01.00) - RCTRequired - RCTTypeSafety @@ -449,7 +470,6 @@ PODS: - React-debug - React-featureflags - React-graphics - - React-jsc - React-jsi - React-jsiexecutor - React-logger @@ -461,6 +481,7 @@ PODS: - DoubleConversion - fmt (= 9.1.0) - glog + - hermes-engine - RCT-Folly/Fabric (= 2024.01.01.00) - RCTRequired - RCTTypeSafety @@ -469,7 +490,6 @@ PODS: - React-debug - React-featureflags - React-graphics - - React-jsc - React-jsi - React-jsiexecutor - React-logger @@ -481,6 +501,7 @@ PODS: - DoubleConversion - fmt (= 9.1.0) - glog + - hermes-engine - RCT-Folly/Fabric (= 2024.01.01.00) - RCTRequired - RCTTypeSafety @@ -489,7 +510,6 @@ PODS: - React-debug - React-featureflags - React-graphics - - React-jsc - React-jsi - React-jsiexecutor - React-logger @@ -501,6 +521,7 @@ PODS: - DoubleConversion - fmt (= 9.1.0) - glog + - hermes-engine - RCT-Folly/Fabric (= 2024.01.01.00) - RCTRequired - RCTTypeSafety @@ -512,7 +533,6 @@ PODS: - React-Fabric/components/view (= 0.75.3) - React-featureflags - React-graphics - - React-jsc - React-jsi - React-jsiexecutor - React-logger @@ -524,6 +544,7 @@ PODS: - DoubleConversion - fmt (= 9.1.0) - glog + - hermes-engine - RCT-Folly/Fabric (= 2024.01.01.00) - RCTRequired - RCTTypeSafety @@ -532,7 +553,6 @@ PODS: - React-debug - React-featureflags - React-graphics - - React-jsc - React-jsi - React-jsiexecutor - React-logger @@ -544,6 +564,7 @@ PODS: - DoubleConversion - fmt (= 9.1.0) - glog + - hermes-engine - RCT-Folly/Fabric (= 2024.01.01.00) - RCTRequired - RCTTypeSafety @@ -552,7 +573,6 @@ PODS: - React-debug - React-featureflags - React-graphics - - React-jsc - React-jsi - React-jsiexecutor - React-logger @@ -564,6 +584,7 @@ PODS: - DoubleConversion - fmt (= 9.1.0) - glog + - hermes-engine - RCT-Folly/Fabric (= 2024.01.01.00) - RCTRequired - RCTTypeSafety @@ -572,7 +593,6 @@ PODS: - React-debug - React-featureflags - React-graphics - - React-jsc - React-jsi - React-jsiexecutor - React-logger @@ -585,6 +605,7 @@ PODS: - DoubleConversion - fmt (= 9.1.0) - glog + - hermes-engine - RCT-Folly/Fabric (= 2024.01.01.00) - RCTRequired - RCTTypeSafety @@ -593,7 +614,6 @@ PODS: - React-debug - React-featureflags - React-graphics - - React-jsc - React-jsi - React-jsiexecutor - React-logger @@ -605,6 +625,7 @@ PODS: - DoubleConversion - fmt (= 9.1.0) - glog + - hermes-engine - RCT-Folly/Fabric (= 2024.01.01.00) - RCTRequired - RCTTypeSafety @@ -613,7 +634,6 @@ PODS: - React-debug - React-featureflags - React-graphics - - React-jsc - React-jsi - React-jsiexecutor - React-logger @@ -625,6 +645,7 @@ PODS: - DoubleConversion - fmt (= 9.1.0) - glog + - hermes-engine - RCT-Folly/Fabric (= 2024.01.01.00) - RCTRequired - RCTTypeSafety @@ -633,7 +654,6 @@ PODS: - React-debug - React-featureflags - React-graphics - - React-jsc - React-jsi - React-jsiexecutor - React-logger @@ -645,6 +665,7 @@ PODS: - DoubleConversion - fmt (= 9.1.0) - glog + - hermes-engine - RCT-Folly/Fabric (= 2024.01.01.00) - RCTRequired - RCTTypeSafety @@ -653,7 +674,6 @@ PODS: - React-debug - React-featureflags - React-graphics - - React-jsc - React-jsi - React-jsiexecutor - React-logger @@ -665,6 +685,7 @@ PODS: - DoubleConversion - fmt (= 9.1.0) - glog + - hermes-engine - RCT-Folly/Fabric (= 2024.01.01.00) - RCTRequired - RCTTypeSafety @@ -673,7 +694,6 @@ PODS: - React-debug - React-featureflags - React-graphics - - React-jsc - React-jsi - React-jsiexecutor - React-logger @@ -685,6 +705,7 @@ PODS: - DoubleConversion - fmt (= 9.1.0) - glog + - hermes-engine - RCT-Folly/Fabric (= 2024.01.01.00) - RCTRequired - RCTTypeSafety @@ -694,7 +715,6 @@ PODS: - React-Fabric/observers/events (= 0.75.3) - React-featureflags - React-graphics - - React-jsc - React-jsi - React-jsiexecutor - React-logger @@ -706,6 +726,7 @@ PODS: - DoubleConversion - fmt (= 9.1.0) - glog + - hermes-engine - RCT-Folly/Fabric (= 2024.01.01.00) - RCTRequired - RCTTypeSafety @@ -714,7 +735,6 @@ PODS: - React-debug - React-featureflags - React-graphics - - React-jsc - React-jsi - React-jsiexecutor - React-logger @@ -726,6 +746,7 @@ PODS: - DoubleConversion - fmt (= 9.1.0) - glog + - hermes-engine - RCT-Folly/Fabric (= 2024.01.01.00) - RCTRequired - RCTTypeSafety @@ -735,7 +756,6 @@ PODS: - React-Fabric/observers/events - React-featureflags - React-graphics - - React-jsc - React-jsi - React-jsiexecutor - React-logger @@ -748,6 +768,7 @@ PODS: - DoubleConversion - fmt (= 9.1.0) - glog + - hermes-engine - RCT-Folly/Fabric (= 2024.01.01.00) - RCTRequired - RCTTypeSafety @@ -756,7 +777,6 @@ PODS: - React-debug - React-featureflags - React-graphics - - React-jsc - React-jsi - React-jsiexecutor - React-logger @@ -768,6 +788,7 @@ PODS: - DoubleConversion - fmt (= 9.1.0) - glog + - hermes-engine - RCT-Folly/Fabric (= 2024.01.01.00) - RCTRequired - RCTTypeSafety @@ -776,7 +797,6 @@ PODS: - React-debug - React-featureflags - React-graphics - - React-jsc - React-jsi - React-jsiexecutor - React-logger @@ -788,6 +808,7 @@ PODS: - DoubleConversion - fmt (= 9.1.0) - glog + - hermes-engine - RCT-Folly/Fabric (= 2024.01.01.00) - RCTRequired - RCTTypeSafety @@ -797,7 +818,6 @@ PODS: - React-Fabric/uimanager/consistency (= 0.75.3) - React-featureflags - React-graphics - - React-jsc - React-jsi - React-jsiexecutor - React-logger @@ -810,6 +830,7 @@ PODS: - DoubleConversion - fmt (= 9.1.0) - glog + - hermes-engine - RCT-Folly/Fabric (= 2024.01.01.00) - RCTRequired - RCTTypeSafety @@ -818,7 +839,6 @@ PODS: - React-debug - React-featureflags - React-graphics - - React-jsc - React-jsi - React-jsiexecutor - React-logger @@ -831,6 +851,7 @@ PODS: - DoubleConversion - fmt (= 9.1.0) - glog + - hermes-engine - RCT-Folly/Fabric (= 2024.01.01.00) - RCTRequired - RCTTypeSafety @@ -842,7 +863,6 @@ PODS: - React-FabricComponents/textlayoutmanager (= 0.75.3) - React-featureflags - React-graphics - - React-jsc - React-jsi - React-jsiexecutor - React-logger @@ -856,6 +876,7 @@ PODS: - DoubleConversion - fmt (= 9.1.0) - glog + - hermes-engine - RCT-Folly/Fabric (= 2024.01.01.00) - RCTRequired - RCTTypeSafety @@ -874,7 +895,6 @@ PODS: - React-FabricComponents/components/unimplementedview (= 0.75.3) - React-featureflags - React-graphics - - React-jsc - React-jsi - React-jsiexecutor - React-logger @@ -888,6 +908,7 @@ PODS: - DoubleConversion - fmt (= 9.1.0) - glog + - hermes-engine - RCT-Folly/Fabric (= 2024.01.01.00) - RCTRequired - RCTTypeSafety @@ -897,7 +918,6 @@ PODS: - React-Fabric - React-featureflags - React-graphics - - React-jsc - React-jsi - React-jsiexecutor - React-logger @@ -911,6 +931,7 @@ PODS: - DoubleConversion - fmt (= 9.1.0) - glog + - hermes-engine - RCT-Folly/Fabric (= 2024.01.01.00) - RCTRequired - RCTTypeSafety @@ -920,7 +941,6 @@ PODS: - React-Fabric - React-featureflags - React-graphics - - React-jsc - React-jsi - React-jsiexecutor - React-logger @@ -934,6 +954,7 @@ PODS: - DoubleConversion - fmt (= 9.1.0) - glog + - hermes-engine - RCT-Folly/Fabric (= 2024.01.01.00) - RCTRequired - RCTTypeSafety @@ -943,7 +964,6 @@ PODS: - React-Fabric - React-featureflags - React-graphics - - React-jsc - React-jsi - React-jsiexecutor - React-logger @@ -957,6 +977,7 @@ PODS: - DoubleConversion - fmt (= 9.1.0) - glog + - hermes-engine - RCT-Folly/Fabric (= 2024.01.01.00) - RCTRequired - RCTTypeSafety @@ -966,7 +987,6 @@ PODS: - React-Fabric - React-featureflags - React-graphics - - React-jsc - React-jsi - React-jsiexecutor - React-logger @@ -980,6 +1000,7 @@ PODS: - DoubleConversion - fmt (= 9.1.0) - glog + - hermes-engine - RCT-Folly/Fabric (= 2024.01.01.00) - RCTRequired - RCTTypeSafety @@ -989,7 +1010,6 @@ PODS: - React-Fabric - React-featureflags - React-graphics - - React-jsc - React-jsi - React-jsiexecutor - React-logger @@ -1003,6 +1023,7 @@ PODS: - DoubleConversion - fmt (= 9.1.0) - glog + - hermes-engine - RCT-Folly/Fabric (= 2024.01.01.00) - RCTRequired - RCTTypeSafety @@ -1012,7 +1033,6 @@ PODS: - React-Fabric - React-featureflags - React-graphics - - React-jsc - React-jsi - React-jsiexecutor - React-logger @@ -1026,6 +1046,7 @@ PODS: - DoubleConversion - fmt (= 9.1.0) - glog + - hermes-engine - RCT-Folly/Fabric (= 2024.01.01.00) - RCTRequired - RCTTypeSafety @@ -1035,7 +1056,6 @@ PODS: - React-Fabric - React-featureflags - React-graphics - - React-jsc - React-jsi - React-jsiexecutor - React-logger @@ -1049,6 +1069,7 @@ PODS: - DoubleConversion - fmt (= 9.1.0) - glog + - hermes-engine - RCT-Folly/Fabric (= 2024.01.01.00) - RCTRequired - RCTTypeSafety @@ -1058,7 +1079,6 @@ PODS: - React-Fabric - React-featureflags - React-graphics - - React-jsc - React-jsi - React-jsiexecutor - React-logger @@ -1072,6 +1092,7 @@ PODS: - DoubleConversion - fmt (= 9.1.0) - glog + - hermes-engine - RCT-Folly/Fabric (= 2024.01.01.00) - RCTRequired - RCTTypeSafety @@ -1081,7 +1102,6 @@ PODS: - React-Fabric - React-featureflags - React-graphics - - React-jsc - React-jsi - React-jsiexecutor - React-logger @@ -1095,6 +1115,7 @@ PODS: - DoubleConversion - fmt (= 9.1.0) - glog + - hermes-engine - RCT-Folly/Fabric (= 2024.01.01.00) - RCTRequired - RCTTypeSafety @@ -1104,7 +1125,6 @@ PODS: - React-Fabric - React-featureflags - React-graphics - - React-jsc - React-jsi - React-jsiexecutor - React-logger @@ -1118,13 +1138,13 @@ PODS: - DoubleConversion - fmt (= 9.1.0) - glog + - hermes-engine - RCT-Folly/Fabric (= 2024.01.01.00) - RCTRequired (= 0.75.3) - RCTTypeSafety (= 0.75.3) - React-Fabric - React-graphics - React-ImageManager - - React-jsc - React-jsi - React-jsiexecutor (= 0.75.3) - React-logger @@ -1136,6 +1156,7 @@ PODS: - React-featureflagsnativemodule (0.75.3): - DoubleConversion - glog + - hermes-engine - RCT-Folly (= 2024.01.01.00) - RCTRequired - RCTTypeSafety @@ -1145,7 +1166,6 @@ PODS: - React-featureflags - React-graphics - React-ImageManager - - React-jsi - React-NativeModulesApple - React-RCTFabric - React-rendererdebug @@ -1162,9 +1182,22 @@ PODS: - React-jsi - React-jsiexecutor - React-utils + - React-hermes (0.75.3): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - hermes-engine + - RCT-Folly (= 2024.01.01.00) + - React-cxxreact (= 0.75.3) + - React-jsi + - React-jsiexecutor (= 0.75.3) + - React-jsinspector + - React-perflogger (= 0.75.3) + - React-runtimeexecutor - React-idlecallbacksnativemodule (0.75.3): - DoubleConversion - glog + - hermes-engine - RCT-Folly (= 2024.01.01.00) - RCTRequired - RCTTypeSafety @@ -1174,7 +1207,6 @@ PODS: - React-featureflags - React-graphics - React-ImageManager - - React-jsi - React-NativeModulesApple - React-RCTFabric - React-rendererdebug @@ -1193,11 +1225,6 @@ PODS: - React-graphics - React-rendererdebug - React-utils - - React-jsc (0.75.3): - - React-jsc/Fabric (= 0.75.3) - - React-jsi (= 0.75.3) - - React-jsc/Fabric (0.75.3): - - React-jsi (= 0.75.3) - React-jserrorhandler (0.75.3): - RCT-Folly/Fabric (= 2024.01.01.00) - React-debug @@ -1207,11 +1234,13 @@ PODS: - DoubleConversion - fmt (= 9.1.0) - glog + - hermes-engine - RCT-Folly (= 2024.01.01.00) - React-jsiexecutor (0.75.3): - DoubleConversion - fmt (= 9.1.0) - glog + - hermes-engine - RCT-Folly (= 2024.01.01.00) - React-cxxreact (= 0.75.3) - React-jsi (= 0.75.3) @@ -1220,6 +1249,7 @@ PODS: - React-jsinspector (0.75.3): - DoubleConversion - glog + - hermes-engine - RCT-Folly (= 2024.01.01.00) - React-featureflags - React-jsi @@ -1234,6 +1264,7 @@ PODS: - React-microtasksnativemodule (0.75.3): - DoubleConversion - glog + - hermes-engine - RCT-Folly (= 2024.01.01.00) - RCTRequired - RCTTypeSafety @@ -1243,7 +1274,6 @@ PODS: - React-featureflags - React-graphics - React-ImageManager - - React-jsi - React-NativeModulesApple - React-RCTFabric - React-rendererdebug @@ -1255,10 +1285,10 @@ PODS: - React-nativeconfig (0.75.3) - React-NativeModulesApple (0.75.3): - glog + - hermes-engine - React-callinvoker - React-Core - React-cxxreact - - React-jsc - React-jsi - React-jsinspector - React-runtimeexecutor @@ -1289,7 +1319,7 @@ PODS: - React-Fabric - React-featureflags - React-graphics - - React-jsc + - React-hermes - React-nativeconfig - React-NativeModulesApple - React-RCTFabric @@ -1298,6 +1328,7 @@ PODS: - React-rendererdebug - React-RuntimeApple - React-RuntimeCore + - React-RuntimeHermes - React-runtimescheduler - React-utils - ReactCodegen @@ -1305,6 +1336,7 @@ PODS: - React-RCTBlob (0.75.3): - DoubleConversion - fmt (= 9.1.0) + - hermes-engine - RCT-Folly (= 2024.01.01.00) - React-Core/RCTBlobHeaders - React-Core/RCTWebSocket @@ -1316,6 +1348,7 @@ PODS: - ReactCommon - React-RCTFabric (0.75.3): - glog + - hermes-engine - RCT-Folly/Fabric (= 2024.01.01.00) - React-Core - React-debug @@ -1325,7 +1358,6 @@ PODS: - React-featureflags - React-graphics - React-ImageManager - - React-jsc - React-jsi - React-jsinspector - React-nativeconfig @@ -1387,12 +1419,12 @@ PODS: - React-debug - React-rncore (0.75.3) - React-RuntimeApple (0.75.3): + - hermes-engine - RCT-Folly/Fabric (= 2024.01.01.00) - React-callinvoker - React-Core/Default - React-CoreModules - React-cxxreact - - React-jsc - React-jserrorhandler - React-jsi - React-jsiexecutor @@ -1402,14 +1434,15 @@ PODS: - React-RCTFabric - React-RuntimeCore - React-runtimeexecutor + - React-RuntimeHermes - React-runtimescheduler - React-utils - React-RuntimeCore (0.75.3): - glog + - hermes-engine - RCT-Folly/Fabric (= 2024.01.01.00) - React-cxxreact - React-featureflags - - React-jsc - React-jserrorhandler - React-jsi - React-jsiexecutor @@ -1419,14 +1452,25 @@ PODS: - React-utils - React-runtimeexecutor (0.75.3): - React-jsi (= 0.75.3) + - React-RuntimeHermes (0.75.3): + - hermes-engine + - RCT-Folly/Fabric (= 2024.01.01.00) + - React-featureflags + - React-hermes + - React-jsi + - React-jsinspector + - React-jsitracing + - React-nativeconfig + - React-RuntimeCore + - React-utils - React-runtimescheduler (0.75.3): - glog + - hermes-engine - RCT-Folly (= 2024.01.01.00) - React-callinvoker - React-cxxreact - React-debug - React-featureflags - - React-jsc - React-jsi - React-rendererconsistency - React-rendererdebug @@ -1434,13 +1478,14 @@ PODS: - React-utils - React-utils (0.75.3): - glog + - hermes-engine - RCT-Folly (= 2024.01.01.00) - React-debug - - React-jsc - React-jsi (= 0.75.3) - ReactCodegen (0.75.3): - DoubleConversion - glog + - hermes-engine - RCT-Folly - RCTRequired - RCTTypeSafety @@ -1450,7 +1495,6 @@ PODS: - React-FabricImage - React-featureflags - React-graphics - - React-jsc - React-jsi - React-jsiexecutor - React-NativeModulesApple @@ -1464,6 +1508,7 @@ PODS: - DoubleConversion - fmt (= 9.1.0) - glog + - hermes-engine - RCT-Folly (= 2024.01.01.00) - React-callinvoker (= 0.75.3) - React-cxxreact (= 0.75.3) @@ -1476,6 +1521,7 @@ PODS: - DoubleConversion - fmt (= 9.1.0) - glog + - hermes-engine - RCT-Folly (= 2024.01.01.00) - React-callinvoker (= 0.75.3) - React-cxxreact (= 0.75.3) @@ -1486,6 +1532,7 @@ PODS: - DoubleConversion - fmt (= 9.1.0) - glog + - hermes-engine - RCT-Folly (= 2024.01.01.00) - React-callinvoker (= 0.75.3) - React-cxxreact (= 0.75.3) @@ -1495,9 +1542,10 @@ PODS: - React-logger (= 0.75.3) - React-perflogger (= 0.75.3) - React-utils (= 0.75.3) - - ReactNativeHost (0.5.1): + - ReactNativeHost (0.5.2): - DoubleConversion - glog + - hermes-engine - RCT-Folly (= 2024.01.01.00) - RCTRequired - RCTTypeSafety @@ -1508,7 +1556,6 @@ PODS: - React-featureflags - React-graphics - React-ImageManager - - React-jsi - React-NativeModulesApple - React-RCTAppDelegate - React-RCTFabric @@ -1531,6 +1578,7 @@ DEPENDENCIES: - FBLazyVector (from `../node_modules/react-native/Libraries/FBLazyVector`) - fmt (from `../node_modules/react-native/third-party-podspecs/fmt.podspec`) - glog (from `../node_modules/react-native/third-party-podspecs/glog.podspec`) + - hermes-engine (from `../node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec`) - NitroModules (from `../../node_modules/react-native-nitro-modules`) - NitroVideo (from `../..`) - RCT-Folly (from `../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec`) @@ -1553,10 +1601,9 @@ DEPENDENCIES: - React-featureflags (from `../node_modules/react-native/ReactCommon/react/featureflags`) - React-featureflagsnativemodule (from `../node_modules/react-native/ReactCommon/react/nativemodule/featureflags`) - React-graphics (from `../node_modules/react-native/ReactCommon/react/renderer/graphics`) + - React-hermes (from `../node_modules/react-native/ReactCommon/hermes`) - React-idlecallbacksnativemodule (from `../node_modules/react-native/ReactCommon/react/nativemodule/idlecallbacks`) - React-ImageManager (from `../node_modules/react-native/ReactCommon/react/renderer/imagemanager/platform/ios`) - - React-jsc (from `../node_modules/react-native/ReactCommon/jsc`) - - React-jsc/Fabric (from `../node_modules/react-native/ReactCommon/jsc`) - React-jserrorhandler (from `../node_modules/react-native/ReactCommon/jserrorhandler`) - React-jsi (from `../node_modules/react-native/ReactCommon/jsi`) - React-jsiexecutor (from `../node_modules/react-native/ReactCommon/jsiexecutor`) @@ -1586,6 +1633,7 @@ DEPENDENCIES: - React-RuntimeApple (from `../node_modules/react-native/ReactCommon/react/runtime/platform/ios`) - React-RuntimeCore (from `../node_modules/react-native/ReactCommon/react/runtime`) - React-runtimeexecutor (from `../node_modules/react-native/ReactCommon/runtimeexecutor`) + - React-RuntimeHermes (from `../node_modules/react-native/ReactCommon/react/runtime`) - React-runtimescheduler (from `../node_modules/react-native/ReactCommon/react/renderer/runtimescheduler`) - React-utils (from `../node_modules/react-native/ReactCommon/react/utils`) - ReactCodegen (from `build/generated/ios`) @@ -1610,6 +1658,9 @@ EXTERNAL SOURCES: :podspec: "../node_modules/react-native/third-party-podspecs/fmt.podspec" glog: :podspec: "../node_modules/react-native/third-party-podspecs/glog.podspec" + hermes-engine: + :podspec: "../node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec" + :tag: hermes-2024-08-15-RNv0.75.1-4b3bf912cc0f705b51b71ce1a5b8bd79b93a451b NitroModules: :path: "../../node_modules/react-native-nitro-modules" NitroVideo: @@ -1650,12 +1701,12 @@ EXTERNAL SOURCES: :path: "../node_modules/react-native/ReactCommon/react/nativemodule/featureflags" React-graphics: :path: "../node_modules/react-native/ReactCommon/react/renderer/graphics" + React-hermes: + :path: "../node_modules/react-native/ReactCommon/hermes" React-idlecallbacksnativemodule: :path: "../node_modules/react-native/ReactCommon/react/nativemodule/idlecallbacks" React-ImageManager: :path: "../node_modules/react-native/ReactCommon/react/renderer/imagemanager/platform/ios" - React-jsc: - :path: "../node_modules/react-native/ReactCommon/jsc" React-jserrorhandler: :path: "../node_modules/react-native/ReactCommon/jserrorhandler" React-jsi: @@ -1714,6 +1765,8 @@ EXTERNAL SOURCES: :path: "../node_modules/react-native/ReactCommon/react/runtime" React-runtimeexecutor: :path: "../node_modules/react-native/ReactCommon/runtimeexecutor" + React-RuntimeHermes: + :path: "../node_modules/react-native/ReactCommon/react/runtime" React-runtimescheduler: :path: "../node_modules/react-native/ReactCommon/react/renderer/runtimescheduler" React-utils: @@ -1737,46 +1790,47 @@ SPEC CHECKSUMS: FBLazyVector: 7b438dceb9f904bd85ca3c31d64cce32a035472b fmt: 4c2741a687cc09f0634a2e2c72a838b99f1ff120 glog: 69ef571f3de08433d766d614c73a9838a06bf7eb - NitroModules: 61cb3152e6e9fc1a5e2a710d07a87ba919d9927c - NitroVideo: f7eedff882912134106584f67ae85fc6cb812b07 + hermes-engine: 8d2103d6c0176779aea4e25df6bb1410f9946680 + NitroModules: 44bd2e68289a596ccf76e4698044c9110e3f358e + NitroVideo: 0585be23041b1aaad26bf88d10ae4a495125c611 RCT-Folly: 34124ae2e667a0e5f0ea378db071d27548124321 RCTDeprecation: 4191f6e64b72d9743f6fe1a8a16e89e868f5e9e7 RCTRequired: 9bb589570f2bb3abc6518761e3fd1ad9b7f7f06c RCTTypeSafety: 1c1a8741c86df0a0ac1a99cf3fb0e29eedbc2c88 React: b6810a201ee11e69ae8bfd4eb4aaab86610600bf React-callinvoker: d6c7898b63e6a2d37bc308f17c05be0ba3630b10 - React-Core: f7b62828aca95a54f0a2dc56b7162348513a43c0 + React-Core: 411ef2293ba0c9147e04ee89324bc1575b38a089 React-CoreModules: 30c44229d249317498dac4a984925c56e06f61c2 - React-cxxreact: 15841cbdf0ac85c9ea6f70cc418b75541a6ee031 + React-cxxreact: 1ba92740ea3ed5be86898dec22f6548aa843da16 React-debug: fd0ed8ecd5f8a23c7daf5ceaca8aa722a4d083fd - React-defaultsnativemodule: df50d96e3e7fdcb5b9bbc60e18a43d95dc4bbe0d - React-domnativemodule: 04bd7a7adf6e1d2ecd3f5f6ffb83bacc10951c36 - React-Fabric: e12790561050e447e16964c8e285e7cd77bc8272 - React-FabricComponents: eaeb8db285343a6ba39357a0496f59f33cda2279 - React-FabricImage: 7036c311ed8e32612790603adaa7dd5d7313d0a4 + React-defaultsnativemodule: b013b8fc528e0830c0397250bd565e54c6eb3b90 + React-domnativemodule: 1e0a9cdd989be6905ff5867ab4b060e3be3900e4 + React-Fabric: da5caca65022dcbbb95d12cebcde7770fdd44ff0 + React-FabricComponents: 19e0eb8be8d8f2afa1a921705a87d8818eba14cf + React-FabricImage: 50df9e6aace1781cf23e130171631d7674b4072c React-featureflags: cf78861db9318ae29982fa8953c92d31b276c9ac - React-featureflagsnativemodule: 752c70163fef657b0453ed85419ee0cad60a4b5a + React-featureflagsnativemodule: 8a6f72b439f2f48d80d0d52f4a2d30769fdd4727 React-graphics: 7ed2dc99f706228448b870882729a8303343b5a5 - React-idlecallbacksnativemodule: 3ecc99fdc2bd3603f01851cda748fa2382d3aea4 + React-hermes: 167b427c2106b92ac47add9b35ca024d42453518 + React-idlecallbacksnativemodule: 26d5b4ce0389063f9659e8ebe6a14f87e7affdfb React-ImageManager: 9970421c57b6458d3a4d6ce319c9067217c4882f - React-jsc: 92ac98e0e03ee54fdaa4ac3936285a4fdb166fab React-jserrorhandler: 6764a4b7abd617332fb0935c9ba63a6369207a15 - React-jsi: 1d8843070910da8209a3df4266c7fbf5fbd169fd - React-jsiexecutor: 66953803059745021c67d0476e77a86f8fb5cdb4 - React-jsinspector: b3c78200e89e71bf3d64e3531bca6423222be808 + React-jsi: 7713fae6d70c49a1b1b12d7e65ca62a50cd820d2 + React-jsiexecutor: 67260e3eb3d1f3d3fd41ff15e89ce4027ae9c36a + React-jsinspector: a0f1febb0bcf5770ff135444a6afee7520ee42f7 React-jsitracing: bf77e00063522e4fd6d84fa129f0caaf360d275e React-logger: 7e56c9eceafd7f45e98c16cb42ff3c9966c67119 React-Mapbuffer: e68dd904f0f3a84dd35989288ed3bcf5e37f9737 - React-microtasksnativemodule: a750218bbaf400d850e5649a1c97d71c40060047 + React-microtasksnativemodule: 2b22a88c8abe1a90aca1804e55717190d3a26cee React-nativeconfig: 4a9543185905fe41014c06776bf126083795aed9 - React-NativeModulesApple: 8dfea6320633f58ffa78c0db2218cbd142dfeb6f + React-NativeModulesApple: f6b6dc0998c945dd113858f1fc12e5e5f0da0990 React-perflogger: 3bbb82f18e9ac29a1a6931568e99d6305ef4403b React-performancetimeline: 05c0372923c2f3a9e8a5ae954258f0436003bffb React-RCTActionSheet: cb2b38a53d03ec22f1159c89667b86c2c490d92d React-RCTAnimation: c8be4f58eabb487d6346247ee8e7bac434737ed7 - React-RCTAppDelegate: 391de59ae7ff1274eb8f82bf67b83061cd95f83f - React-RCTBlob: 04e23eb34ee06009523e3e89583338dc0e3601f8 - React-RCTFabric: 43dd5c0d58deba4910b199220e751ba957b8c37b + React-RCTAppDelegate: 357634ff6819214e37538458053213fccc940967 + React-RCTBlob: 7a64271f64a60390a2e73edecaca2735be8044ff + React-RCTFabric: dcdea7c1ff2fa7ec2875a855f8e6ce228950884d React-RCTImage: 4fb571875362a78ccc01aded76b94a71ae466b8b React-RCTLinking: e825182eaf7f4047f6bb11bb6cd2ae5858008e66 React-RCTNetwork: 0e07b83395b6ff5016f7cea4ac99426a893a1438 @@ -1786,19 +1840,20 @@ SPEC CHECKSUMS: React-rendererconsistency: 993f54bb0df644df2922cd87ea55238d510d992b React-rendererdebug: 9cd1f3e6d12c1d9b99fce6ceb373495b29b3d9ee React-rncore: 1df26fe0ae861c599f9f2896f45e8834ef4b85f9 - React-RuntimeApple: e7d1644c53adaa4252185caa2049feb94a12847f - React-RuntimeCore: 1a39b968cf1d1e30a70d0ede2db1b89a43513f65 + React-RuntimeApple: 5fb9053ae46ec14407f24547afd903ec8f0c0b9a + React-RuntimeCore: f6af8417106c1ce5b494edd99e86b0d0069ad6c3 React-runtimeexecutor: 9a668b94ad5d93755443311715bd57680330286a - React-runtimescheduler: 474215f76370292085bcf201bd642ff13ba7d5d2 - React-utils: 671c039d72cdff9bb1715934d62cea6c59de06c6 - ReactCodegen: cdeb16519d53f09350a9fc7eb5708c6322c38676 - ReactCommon: 96b80a9a46e9e7aaf77ec132cd0be6a34b323e9a - ReactNativeHost: 4c9aef6f7cd8d7862a53988f392a89513972440d + React-RuntimeHermes: 6c6053fb5aca5558b071cfbce2868ca50a3b8fc7 + React-runtimescheduler: 5d1a32712d441c38e6d5815069e1810d38ed26f7 + React-utils: 3c815e7d3abb801930a3df2db870c92855429fea + ReactCodegen: 3d11bcf0cac47a77042a3476a1c2f7058bfd6880 + ReactCommon: c65f7049a542669dcc7bff6b7a8071a039c7d0dd + ReactNativeHost: cb1087cdb3d3ff0aaf3be12e68b64d92ef1ad3ed ReactTestApp-DevSupport: 52ac76197e5accf579592aa3b9aa07fd0766f211 ReactTestApp-Resources: 7db90c026cccdf40cfa495705ad436ccc4d64154 SocketRocket: abac6f5de4d4d62d24e11868d7a2f427e0ef940d Yoga: 4ef80d96a5534f0e01b3055f17d1e19a9fc61b63 -PODFILE CHECKSUM: e5a04e20d0f0f1f4e56349821526c34e42621202 +PODFILE CHECKSUM: 9c78b2d298a46aa6402ccd6c090b0f9ad8c9de81 COCOAPODS: 1.16.2 diff --git a/example/package.json b/example/package.json index c4394b1b..e0cc2403 100644 --- a/example/package.json +++ b/example/package.json @@ -21,7 +21,7 @@ "react": "18.3.1", "react-native": "0.75.3", "react-native-windows": "^0.75.0", - "react-native-nitro-modules": ">=0.15.0" + "react-native-nitro-modules": ">=0.21.0" }, "devDependencies": { "@babel/core": "^7.20.0", diff --git a/nitrogen/generated/android/NitroVideo+autolinking.cmake b/nitrogen/generated/android/NitroVideo+autolinking.cmake index 215c1cff..b6fdde5a 100644 --- a/nitrogen/generated/android/NitroVideo+autolinking.cmake +++ b/nitrogen/generated/android/NitroVideo+autolinking.cmake @@ -2,7 +2,7 @@ # NitroVideo+autolinking.cmake # This file was generated by nitrogen. DO NOT MODIFY THIS FILE. # https://github.com/mrousavy/nitro -# Copyright © 2024 Marc Rousavy @ Margelo +# Copyright © 2025 Marc Rousavy @ Margelo # # This is a CMake file that adds all files generated by Nitrogen @@ -42,6 +42,9 @@ target_sources( ../nitrogen/generated/android/c++/JHybridVideoViewViewManagerFactorySpec.cpp ) +# Define a flag to check if we are building properly +add_definitions(-DBUILDING_NITROVIDEO_WITH_GENERATED_CMAKE_PROJECT) + # Add all libraries required by the generated specs find_package(fbjni REQUIRED) # <-- Used for communication between Java <-> C++ find_package(ReactAndroid REQUIRED) # <-- Used to set up React Native bindings (e.g. CallInvoker/TurboModule) diff --git a/nitrogen/generated/android/NitroVideo+autolinking.gradle b/nitrogen/generated/android/NitroVideo+autolinking.gradle index f31b14c3..5f9f3d99 100644 --- a/nitrogen/generated/android/NitroVideo+autolinking.gradle +++ b/nitrogen/generated/android/NitroVideo+autolinking.gradle @@ -2,7 +2,7 @@ /// NitroVideo+autolinking.gradle /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro -/// Copyright © 2024 Marc Rousavy @ Margelo +/// Copyright © 2025 Marc Rousavy @ Margelo /// /// This is a Gradle file that adds all files generated by Nitrogen diff --git a/nitrogen/generated/android/NitroVideoOnLoad.cpp b/nitrogen/generated/android/NitroVideoOnLoad.cpp index 3a9bcf6e..1ac32b5a 100644 --- a/nitrogen/generated/android/NitroVideoOnLoad.cpp +++ b/nitrogen/generated/android/NitroVideoOnLoad.cpp @@ -2,9 +2,13 @@ /// NitroVideoOnLoad.cpp /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro -/// Copyright © 2024 Marc Rousavy @ Margelo +/// Copyright © 2025 Marc Rousavy @ Margelo /// +#ifndef BUILDING_NITROVIDEO_WITH_GENERATED_CMAKE_PROJECT +#error NitroVideoOnLoad.cpp is not being built with the autogenerated CMakeLists.txt project. Is a different CMakeLists.txt building this? +#endif + #include "NitroVideoOnLoad.hpp" #include diff --git a/nitrogen/generated/android/NitroVideoOnLoad.hpp b/nitrogen/generated/android/NitroVideoOnLoad.hpp index 8825e9f7..111fb967 100644 --- a/nitrogen/generated/android/NitroVideoOnLoad.hpp +++ b/nitrogen/generated/android/NitroVideoOnLoad.hpp @@ -2,7 +2,7 @@ /// NitroVideoOnLoad.hpp /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro -/// Copyright © 2024 Marc Rousavy @ Margelo +/// Copyright © 2025 Marc Rousavy @ Margelo /// #include diff --git a/nitrogen/generated/android/c++/JHybridVideoPlayerFactorySpec.cpp b/nitrogen/generated/android/c++/JHybridVideoPlayerFactorySpec.cpp index f8741087..eaa44dd2 100644 --- a/nitrogen/generated/android/c++/JHybridVideoPlayerFactorySpec.cpp +++ b/nitrogen/generated/android/c++/JHybridVideoPlayerFactorySpec.cpp @@ -2,7 +2,7 @@ /// JHybridVideoPlayerFactorySpec.cpp /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro -/// Copyright © 2024 Marc Rousavy @ Margelo +/// Copyright © 2025 Marc Rousavy @ Margelo /// #include "JHybridVideoPlayerFactorySpec.hpp" diff --git a/nitrogen/generated/android/c++/JHybridVideoPlayerFactorySpec.hpp b/nitrogen/generated/android/c++/JHybridVideoPlayerFactorySpec.hpp index 31cc8149..33d3a024 100644 --- a/nitrogen/generated/android/c++/JHybridVideoPlayerFactorySpec.hpp +++ b/nitrogen/generated/android/c++/JHybridVideoPlayerFactorySpec.hpp @@ -2,7 +2,7 @@ /// HybridVideoPlayerFactorySpec.hpp /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro -/// Copyright © 2024 Marc Rousavy @ Margelo +/// Copyright © 2025 Marc Rousavy @ Margelo /// #pragma once diff --git a/nitrogen/generated/android/c++/JHybridVideoPlayerSourceFactorySpec.cpp b/nitrogen/generated/android/c++/JHybridVideoPlayerSourceFactorySpec.cpp index 27aad81c..a6c29cdb 100644 --- a/nitrogen/generated/android/c++/JHybridVideoPlayerSourceFactorySpec.cpp +++ b/nitrogen/generated/android/c++/JHybridVideoPlayerSourceFactorySpec.cpp @@ -2,7 +2,7 @@ /// JHybridVideoPlayerSourceFactorySpec.cpp /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro -/// Copyright © 2024 Marc Rousavy @ Margelo +/// Copyright © 2025 Marc Rousavy @ Margelo /// #include "JHybridVideoPlayerSourceFactorySpec.hpp" diff --git a/nitrogen/generated/android/c++/JHybridVideoPlayerSourceFactorySpec.hpp b/nitrogen/generated/android/c++/JHybridVideoPlayerSourceFactorySpec.hpp index c93a7ff5..044b39f6 100644 --- a/nitrogen/generated/android/c++/JHybridVideoPlayerSourceFactorySpec.hpp +++ b/nitrogen/generated/android/c++/JHybridVideoPlayerSourceFactorySpec.hpp @@ -2,7 +2,7 @@ /// HybridVideoPlayerSourceFactorySpec.hpp /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro -/// Copyright © 2024 Marc Rousavy @ Margelo +/// Copyright © 2025 Marc Rousavy @ Margelo /// #pragma once diff --git a/nitrogen/generated/android/c++/JHybridVideoPlayerSourceSpec.cpp b/nitrogen/generated/android/c++/JHybridVideoPlayerSourceSpec.cpp index 275f89f9..aa938999 100644 --- a/nitrogen/generated/android/c++/JHybridVideoPlayerSourceSpec.cpp +++ b/nitrogen/generated/android/c++/JHybridVideoPlayerSourceSpec.cpp @@ -2,14 +2,23 @@ /// JHybridVideoPlayerSourceSpec.cpp /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro -/// Copyright © 2024 Marc Rousavy @ Margelo +/// Copyright © 2025 Marc Rousavy @ Margelo /// #include "JHybridVideoPlayerSourceSpec.hpp" - +// Forward declaration of `VideoInformation` to properly resolve imports. +namespace margelo::nitro::video { struct VideoInformation; } +// Forward declaration of `VideoOrientation` to properly resolve imports. +namespace margelo::nitro::video { enum class VideoOrientation; } #include +#include +#include "VideoInformation.hpp" +#include +#include "JVideoInformation.hpp" +#include "VideoOrientation.hpp" +#include "JVideoOrientation.hpp" namespace margelo::nitro::video { @@ -34,12 +43,23 @@ namespace margelo::nitro::video { auto __result = method(_javaPart); return __result->toStdString(); } - void JHybridVideoPlayerSourceSpec::setUri(const std::string& uri) { - static const auto method = _javaPart->getClass()->getMethod /* uri */)>("setUri"); - method(_javaPart, jni::make_jstring(uri)); - } // Methods - + std::shared_ptr> JHybridVideoPlayerSourceSpec::getAssetInformationAsync() { + static const auto method = _javaPart->getClass()->getMethod()>("getAssetInformationAsync"); + auto __result = method(_javaPart); + return [&]() { + auto __promise = Promise::create(); + __result->cthis()->addOnResolvedListener([=](const jni::alias_ref& __boxedResult) { + auto __result = jni::static_ref_cast(__boxedResult); + __promise->resolve(__result->toCpp()); + }); + __result->cthis()->addOnRejectedListener([=](const jni::alias_ref& __throwable) { + jni::JniException __jniError(__throwable); + __promise->reject(std::make_exception_ptr(__jniError)); + }); + return __promise; + }(); + } } // namespace margelo::nitro::video diff --git a/nitrogen/generated/android/c++/JHybridVideoPlayerSourceSpec.hpp b/nitrogen/generated/android/c++/JHybridVideoPlayerSourceSpec.hpp index 51d95f97..71efe369 100644 --- a/nitrogen/generated/android/c++/JHybridVideoPlayerSourceSpec.hpp +++ b/nitrogen/generated/android/c++/JHybridVideoPlayerSourceSpec.hpp @@ -2,7 +2,7 @@ /// HybridVideoPlayerSourceSpec.hpp /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro -/// Copyright © 2024 Marc Rousavy @ Margelo +/// Copyright © 2025 Marc Rousavy @ Margelo /// #pragma once @@ -48,11 +48,10 @@ namespace margelo::nitro::video { public: // Properties std::string getUri() override; - void setUri(const std::string& uri) override; public: // Methods - + std::shared_ptr> getAssetInformationAsync() override; private: friend HybridBase; diff --git a/nitrogen/generated/android/c++/JHybridVideoPlayerSpec.cpp b/nitrogen/generated/android/c++/JHybridVideoPlayerSpec.cpp index b36058aa..e895b46f 100644 --- a/nitrogen/generated/android/c++/JHybridVideoPlayerSpec.cpp +++ b/nitrogen/generated/android/c++/JHybridVideoPlayerSpec.cpp @@ -2,7 +2,7 @@ /// JHybridVideoPlayerSpec.cpp /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro -/// Copyright © 2024 Marc Rousavy @ Margelo +/// Copyright © 2025 Marc Rousavy @ Margelo /// #include "JHybridVideoPlayerSpec.hpp" @@ -14,6 +14,8 @@ namespace margelo::nitro::video { class HybridVideoPlayerSourceSpec; } #include "HybridVideoPlayerSourceSpec.hpp" #include "JHybridVideoPlayerSourceSpec.hpp" #include +#include +#include namespace margelo::nitro::video { @@ -38,9 +40,10 @@ namespace margelo::nitro::video { auto __result = method(_javaPart); return JNISharedPtr::make_shared_from_jni(jni::make_global(__result)); } - void JHybridVideoPlayerSpec::setSource(const std::shared_ptr& source) { - static const auto method = _javaPart->getClass()->getMethod /* source */)>("setSource"); - method(_javaPart, std::dynamic_pointer_cast(source)->getJavaPart()); + double JHybridVideoPlayerSpec::getDuration() { + static const auto method = _javaPart->getClass()->getMethod("getDuration"); + auto __result = method(_javaPart); + return __result; } double JHybridVideoPlayerSpec::getVolume() { static const auto method = _javaPart->getClass()->getMethod("getVolume"); @@ -60,13 +63,23 @@ namespace margelo::nitro::video { static const auto method = _javaPart->getClass()->getMethod("setCurrentTime"); method(_javaPart, currentTime); } - double JHybridVideoPlayerSpec::getDuration() { - static const auto method = _javaPart->getClass()->getMethod("getDuration"); - auto __result = method(_javaPart); - return __result; - } // Methods + std::shared_ptr> JHybridVideoPlayerSpec::preload() { + static const auto method = _javaPart->getClass()->getMethod()>("preload"); + auto __result = method(_javaPart); + return [&]() { + auto __promise = Promise::create(); + __result->cthis()->addOnResolvedListener([=](const jni::alias_ref& /* unit */) { + __promise->resolve(); + }); + __result->cthis()->addOnRejectedListener([=](const jni::alias_ref& __throwable) { + jni::JniException __jniError(__throwable); + __promise->reject(std::make_exception_ptr(__jniError)); + }); + return __promise; + }(); + } void JHybridVideoPlayerSpec::play() { static const auto method = _javaPart->getClass()->getMethod("play"); method(_javaPart); @@ -75,5 +88,20 @@ namespace margelo::nitro::video { static const auto method = _javaPart->getClass()->getMethod("pause"); method(_javaPart); } + std::shared_ptr> JHybridVideoPlayerSpec::replaceSourceAsync(const std::shared_ptr& source) { + static const auto method = _javaPart->getClass()->getMethod(jni::alias_ref /* source */)>("replaceSourceAsync"); + auto __result = method(_javaPart, std::dynamic_pointer_cast(source)->getJavaPart()); + return [&]() { + auto __promise = Promise::create(); + __result->cthis()->addOnResolvedListener([=](const jni::alias_ref& /* unit */) { + __promise->resolve(); + }); + __result->cthis()->addOnRejectedListener([=](const jni::alias_ref& __throwable) { + jni::JniException __jniError(__throwable); + __promise->reject(std::make_exception_ptr(__jniError)); + }); + return __promise; + }(); + } } // namespace margelo::nitro::video diff --git a/nitrogen/generated/android/c++/JHybridVideoPlayerSpec.hpp b/nitrogen/generated/android/c++/JHybridVideoPlayerSpec.hpp index 63c83355..d263089b 100644 --- a/nitrogen/generated/android/c++/JHybridVideoPlayerSpec.hpp +++ b/nitrogen/generated/android/c++/JHybridVideoPlayerSpec.hpp @@ -2,7 +2,7 @@ /// HybridVideoPlayerSpec.hpp /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro -/// Copyright © 2024 Marc Rousavy @ Margelo +/// Copyright © 2025 Marc Rousavy @ Margelo /// #pragma once @@ -48,17 +48,18 @@ namespace margelo::nitro::video { public: // Properties std::shared_ptr getSource() override; - void setSource(const std::shared_ptr& source) override; + double getDuration() override; double getVolume() override; void setVolume(double volume) override; double getCurrentTime() override; void setCurrentTime(double currentTime) override; - double getDuration() override; public: // Methods + std::shared_ptr> preload() override; void play() override; void pause() override; + std::shared_ptr> replaceSourceAsync(const std::shared_ptr& source) override; private: friend HybridBase; diff --git a/nitrogen/generated/android/c++/JHybridVideoViewViewManagerFactorySpec.cpp b/nitrogen/generated/android/c++/JHybridVideoViewViewManagerFactorySpec.cpp index 2781c0d9..d0d587f9 100644 --- a/nitrogen/generated/android/c++/JHybridVideoViewViewManagerFactorySpec.cpp +++ b/nitrogen/generated/android/c++/JHybridVideoViewViewManagerFactorySpec.cpp @@ -2,7 +2,7 @@ /// JHybridVideoViewViewManagerFactorySpec.cpp /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro -/// Copyright © 2024 Marc Rousavy @ Margelo +/// Copyright © 2025 Marc Rousavy @ Margelo /// #include "JHybridVideoViewViewManagerFactorySpec.hpp" diff --git a/nitrogen/generated/android/c++/JHybridVideoViewViewManagerFactorySpec.hpp b/nitrogen/generated/android/c++/JHybridVideoViewViewManagerFactorySpec.hpp index 491d813b..8cf1eed0 100644 --- a/nitrogen/generated/android/c++/JHybridVideoViewViewManagerFactorySpec.hpp +++ b/nitrogen/generated/android/c++/JHybridVideoViewViewManagerFactorySpec.hpp @@ -2,7 +2,7 @@ /// HybridVideoViewViewManagerFactorySpec.hpp /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro -/// Copyright © 2024 Marc Rousavy @ Margelo +/// Copyright © 2025 Marc Rousavy @ Margelo /// #pragma once diff --git a/nitrogen/generated/android/c++/JHybridVideoViewViewManagerSpec.cpp b/nitrogen/generated/android/c++/JHybridVideoViewViewManagerSpec.cpp index cea03d2e..dd61fdde 100644 --- a/nitrogen/generated/android/c++/JHybridVideoViewViewManagerSpec.cpp +++ b/nitrogen/generated/android/c++/JHybridVideoViewViewManagerSpec.cpp @@ -2,7 +2,7 @@ /// JHybridVideoViewViewManagerSpec.cpp /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro -/// Copyright © 2024 Marc Rousavy @ Margelo +/// Copyright © 2025 Marc Rousavy @ Margelo /// #include "JHybridVideoViewViewManagerSpec.hpp" diff --git a/nitrogen/generated/android/c++/JHybridVideoViewViewManagerSpec.hpp b/nitrogen/generated/android/c++/JHybridVideoViewViewManagerSpec.hpp index 7938eb22..a46eb2b7 100644 --- a/nitrogen/generated/android/c++/JHybridVideoViewViewManagerSpec.hpp +++ b/nitrogen/generated/android/c++/JHybridVideoViewViewManagerSpec.hpp @@ -2,7 +2,7 @@ /// HybridVideoViewViewManagerSpec.hpp /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro -/// Copyright © 2024 Marc Rousavy @ Margelo +/// Copyright © 2025 Marc Rousavy @ Margelo /// #pragma once diff --git a/nitrogen/generated/android/c++/JVideoInformation.hpp b/nitrogen/generated/android/c++/JVideoInformation.hpp new file mode 100644 index 00000000..370f1169 --- /dev/null +++ b/nitrogen/generated/android/c++/JVideoInformation.hpp @@ -0,0 +1,82 @@ +/// +/// JVideoInformation.hpp +/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. +/// https://github.com/mrousavy/nitro +/// Copyright © 2025 Marc Rousavy @ Margelo +/// + +#pragma once + +#include +#include "VideoInformation.hpp" + +#include "JVideoOrientation.hpp" +#include "VideoOrientation.hpp" + +namespace margelo::nitro::video { + + using namespace facebook; + + /** + * The C++ JNI bridge between the C++ struct "VideoInformation" and the the Kotlin data class "VideoInformation". + */ + struct JVideoInformation final: public jni::JavaClass { + public: + static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/video/VideoInformation;"; + + public: + /** + * Convert this Java/Kotlin-based struct to the C++ struct VideoInformation by copying all values to C++. + */ + [[maybe_unused]] + [[nodiscard]] + VideoInformation toCpp() const { + static const auto clazz = javaClassStatic(); + static const auto fieldBitrate = clazz->getField("bitrate"); + double bitrate = this->getFieldValue(fieldBitrate); + static const auto fieldWidth = clazz->getField("width"); + double width = this->getFieldValue(fieldWidth); + static const auto fieldHeight = clazz->getField("height"); + double height = this->getFieldValue(fieldHeight); + static const auto fieldDuration = clazz->getField("duration"); + int64_t duration = this->getFieldValue(fieldDuration); + static const auto fieldFileSize = clazz->getField("fileSize"); + int64_t fileSize = this->getFieldValue(fieldFileSize); + static const auto fieldIsHDR = clazz->getField("isHDR"); + jboolean isHDR = this->getFieldValue(fieldIsHDR); + static const auto fieldIsLive = clazz->getField("isLive"); + jboolean isLive = this->getFieldValue(fieldIsLive); + static const auto fieldOrientation = clazz->getField("orientation"); + jni::local_ref orientation = this->getFieldValue(fieldOrientation); + return VideoInformation( + bitrate, + width, + height, + duration, + fileSize, + static_cast(isHDR), + static_cast(isLive), + orientation->toCpp() + ); + } + + public: + /** + * Create a Java/Kotlin-based struct by copying all values from the given C++ struct to Java. + */ + [[maybe_unused]] + static jni::local_ref fromCpp(const VideoInformation& value) { + return newInstance( + value.bitrate, + value.width, + value.height, + value.duration, + value.fileSize, + value.isHDR, + value.isLive, + JVideoOrientation::fromCpp(value.orientation) + ); + } + }; + +} // namespace margelo::nitro::video diff --git a/nitrogen/generated/android/c++/JVideoOrientation.hpp b/nitrogen/generated/android/c++/JVideoOrientation.hpp new file mode 100644 index 00000000..96fd8499 --- /dev/null +++ b/nitrogen/generated/android/c++/JVideoOrientation.hpp @@ -0,0 +1,71 @@ +/// +/// JVideoOrientation.hpp +/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. +/// https://github.com/mrousavy/nitro +/// Copyright © 2025 Marc Rousavy @ Margelo +/// + +#pragma once + +#include +#include "VideoOrientation.hpp" + +namespace margelo::nitro::video { + + using namespace facebook; + + /** + * The C++ JNI bridge between the C++ enum "VideoOrientation" and the the Kotlin enum "VideoOrientation". + */ + struct JVideoOrientation final: public jni::JavaClass { + public: + static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/video/VideoOrientation;"; + + public: + /** + * Convert this Java/Kotlin-based enum to the C++ enum VideoOrientation. + */ + [[maybe_unused]] + [[nodiscard]] + VideoOrientation toCpp() const { + static const auto clazz = javaClassStatic(); + static const auto fieldOrdinal = clazz->getField("_ordinal"); + int ordinal = this->getFieldValue(fieldOrdinal); + return static_cast(ordinal); + } + + public: + /** + * Create a Java/Kotlin-based enum with the given C++ enum's value. + */ + [[maybe_unused]] + static jni::alias_ref fromCpp(VideoOrientation value) { + static const auto clazz = javaClassStatic(); + static const auto fieldPORTRAIT = clazz->getStaticField("PORTRAIT"); + static const auto fieldLANDSCAPE = clazz->getStaticField("LANDSCAPE"); + static const auto fieldPORTRAIT_UPSIDE_DOWN = clazz->getStaticField("PORTRAIT_UPSIDE_DOWN"); + static const auto fieldLANDSCAPE_LEFT = clazz->getStaticField("LANDSCAPE_LEFT"); + static const auto fieldLANDSCAPE_RIGHT = clazz->getStaticField("LANDSCAPE_RIGHT"); + static const auto fieldUNKNOWN = clazz->getStaticField("UNKNOWN"); + + switch (value) { + case VideoOrientation::PORTRAIT: + return clazz->getStaticFieldValue(fieldPORTRAIT); + case VideoOrientation::LANDSCAPE: + return clazz->getStaticFieldValue(fieldLANDSCAPE); + case VideoOrientation::PORTRAIT_UPSIDE_DOWN: + return clazz->getStaticFieldValue(fieldPORTRAIT_UPSIDE_DOWN); + case VideoOrientation::LANDSCAPE_LEFT: + return clazz->getStaticFieldValue(fieldLANDSCAPE_LEFT); + case VideoOrientation::LANDSCAPE_RIGHT: + return clazz->getStaticFieldValue(fieldLANDSCAPE_RIGHT); + case VideoOrientation::UNKNOWN: + return clazz->getStaticFieldValue(fieldUNKNOWN); + default: + std::string stringValue = std::to_string(static_cast(value)); + throw std::invalid_argument("Invalid enum value (" + stringValue + "!"); + } + } + }; + +} // namespace margelo::nitro::video diff --git a/nitrogen/generated/android/kotlin/com/margelo/nitro/video/HybridVideoPlayerFactorySpec.kt b/nitrogen/generated/android/kotlin/com/margelo/nitro/video/HybridVideoPlayerFactorySpec.kt index 019d87fa..91f33a9f 100644 --- a/nitrogen/generated/android/kotlin/com/margelo/nitro/video/HybridVideoPlayerFactorySpec.kt +++ b/nitrogen/generated/android/kotlin/com/margelo/nitro/video/HybridVideoPlayerFactorySpec.kt @@ -2,7 +2,7 @@ /// HybridVideoPlayerFactorySpec.kt /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro -/// Copyright © 2024 Marc Rousavy @ Margelo +/// Copyright © 2025 Marc Rousavy @ Margelo /// package com.margelo.nitro.video @@ -19,7 +19,11 @@ import com.margelo.nitro.core.* */ @DoNotStrip @Keep -@Suppress("RedundantSuppression", "KotlinJniMissingFunction", "PropertyName", "RedundantUnitReturnType", "unused") +@Suppress( + "KotlinJniMissingFunction", "unused", + "RedundantSuppression", "RedundantUnitReturnType", "SimpleRedundantLet", + "LocalVariableName", "PropertyName", "PrivatePropertyName", "FunctionName" +) abstract class HybridVideoPlayerFactorySpec: HybridObject() { @DoNotStrip private var mHybridData: HybridData = initHybrid() diff --git a/nitrogen/generated/android/kotlin/com/margelo/nitro/video/HybridVideoPlayerSourceFactorySpec.kt b/nitrogen/generated/android/kotlin/com/margelo/nitro/video/HybridVideoPlayerSourceFactorySpec.kt index d51e8546..c56b0a9c 100644 --- a/nitrogen/generated/android/kotlin/com/margelo/nitro/video/HybridVideoPlayerSourceFactorySpec.kt +++ b/nitrogen/generated/android/kotlin/com/margelo/nitro/video/HybridVideoPlayerSourceFactorySpec.kt @@ -2,7 +2,7 @@ /// HybridVideoPlayerSourceFactorySpec.kt /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro -/// Copyright © 2024 Marc Rousavy @ Margelo +/// Copyright © 2025 Marc Rousavy @ Margelo /// package com.margelo.nitro.video @@ -19,7 +19,11 @@ import com.margelo.nitro.core.* */ @DoNotStrip @Keep -@Suppress("RedundantSuppression", "KotlinJniMissingFunction", "PropertyName", "RedundantUnitReturnType", "unused") +@Suppress( + "KotlinJniMissingFunction", "unused", + "RedundantSuppression", "RedundantUnitReturnType", "SimpleRedundantLet", + "LocalVariableName", "PropertyName", "PrivatePropertyName", "FunctionName" +) abstract class HybridVideoPlayerSourceFactorySpec: HybridObject() { @DoNotStrip private var mHybridData: HybridData = initHybrid() diff --git a/nitrogen/generated/android/kotlin/com/margelo/nitro/video/HybridVideoPlayerSourceSpec.kt b/nitrogen/generated/android/kotlin/com/margelo/nitro/video/HybridVideoPlayerSourceSpec.kt index a657eb96..01e74c31 100644 --- a/nitrogen/generated/android/kotlin/com/margelo/nitro/video/HybridVideoPlayerSourceSpec.kt +++ b/nitrogen/generated/android/kotlin/com/margelo/nitro/video/HybridVideoPlayerSourceSpec.kt @@ -2,7 +2,7 @@ /// HybridVideoPlayerSourceSpec.kt /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro -/// Copyright © 2024 Marc Rousavy @ Margelo +/// Copyright © 2025 Marc Rousavy @ Margelo /// package com.margelo.nitro.video @@ -19,7 +19,11 @@ import com.margelo.nitro.core.* */ @DoNotStrip @Keep -@Suppress("RedundantSuppression", "KotlinJniMissingFunction", "PropertyName", "RedundantUnitReturnType", "unused") +@Suppress( + "KotlinJniMissingFunction", "unused", + "RedundantSuppression", "RedundantUnitReturnType", "SimpleRedundantLet", + "LocalVariableName", "PropertyName", "PrivatePropertyName", "FunctionName" +) abstract class HybridVideoPlayerSourceSpec: HybridObject() { @DoNotStrip private var mHybridData: HybridData = initHybrid() @@ -40,12 +44,12 @@ abstract class HybridVideoPlayerSourceSpec: HybridObject() { // Properties @get:DoNotStrip @get:Keep - @set:DoNotStrip - @set:Keep - abstract var uri: String + abstract val uri: String // Methods - + @DoNotStrip + @Keep + abstract fun getAssetInformationAsync(): Promise private external fun initHybrid(): HybridData diff --git a/nitrogen/generated/android/kotlin/com/margelo/nitro/video/HybridVideoPlayerSpec.kt b/nitrogen/generated/android/kotlin/com/margelo/nitro/video/HybridVideoPlayerSpec.kt index eec23b27..1c68c4d9 100644 --- a/nitrogen/generated/android/kotlin/com/margelo/nitro/video/HybridVideoPlayerSpec.kt +++ b/nitrogen/generated/android/kotlin/com/margelo/nitro/video/HybridVideoPlayerSpec.kt @@ -2,7 +2,7 @@ /// HybridVideoPlayerSpec.kt /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro -/// Copyright © 2024 Marc Rousavy @ Margelo +/// Copyright © 2025 Marc Rousavy @ Margelo /// package com.margelo.nitro.video @@ -19,7 +19,11 @@ import com.margelo.nitro.core.* */ @DoNotStrip @Keep -@Suppress("RedundantSuppression", "KotlinJniMissingFunction", "PropertyName", "RedundantUnitReturnType", "unused") +@Suppress( + "KotlinJniMissingFunction", "unused", + "RedundantSuppression", "RedundantUnitReturnType", "SimpleRedundantLet", + "LocalVariableName", "PropertyName", "PrivatePropertyName", "FunctionName" +) abstract class HybridVideoPlayerSpec: HybridObject() { @DoNotStrip private var mHybridData: HybridData = initHybrid() @@ -40,9 +44,11 @@ abstract class HybridVideoPlayerSpec: HybridObject() { // Properties @get:DoNotStrip @get:Keep - @set:DoNotStrip - @set:Keep - abstract var source: HybridVideoPlayerSourceSpec + abstract val source: HybridVideoPlayerSourceSpec + + @get:DoNotStrip + @get:Keep + abstract val duration: Double @get:DoNotStrip @get:Keep @@ -55,12 +61,12 @@ abstract class HybridVideoPlayerSpec: HybridObject() { @set:DoNotStrip @set:Keep abstract var currentTime: Double - - @get:DoNotStrip - @get:Keep - abstract val duration: Double // Methods + @DoNotStrip + @Keep + abstract fun preload(): Promise + @DoNotStrip @Keep abstract fun play(): Unit @@ -68,6 +74,10 @@ abstract class HybridVideoPlayerSpec: HybridObject() { @DoNotStrip @Keep abstract fun pause(): Unit + + @DoNotStrip + @Keep + abstract fun replaceSourceAsync(source: HybridVideoPlayerSourceSpec): Promise private external fun initHybrid(): HybridData diff --git a/nitrogen/generated/android/kotlin/com/margelo/nitro/video/HybridVideoViewViewManagerFactorySpec.kt b/nitrogen/generated/android/kotlin/com/margelo/nitro/video/HybridVideoViewViewManagerFactorySpec.kt index ab4e841c..98789630 100644 --- a/nitrogen/generated/android/kotlin/com/margelo/nitro/video/HybridVideoViewViewManagerFactorySpec.kt +++ b/nitrogen/generated/android/kotlin/com/margelo/nitro/video/HybridVideoViewViewManagerFactorySpec.kt @@ -2,7 +2,7 @@ /// HybridVideoViewViewManagerFactorySpec.kt /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro -/// Copyright © 2024 Marc Rousavy @ Margelo +/// Copyright © 2025 Marc Rousavy @ Margelo /// package com.margelo.nitro.video @@ -19,7 +19,11 @@ import com.margelo.nitro.core.* */ @DoNotStrip @Keep -@Suppress("RedundantSuppression", "KotlinJniMissingFunction", "PropertyName", "RedundantUnitReturnType", "unused") +@Suppress( + "KotlinJniMissingFunction", "unused", + "RedundantSuppression", "RedundantUnitReturnType", "SimpleRedundantLet", + "LocalVariableName", "PropertyName", "PrivatePropertyName", "FunctionName" +) abstract class HybridVideoViewViewManagerFactorySpec: HybridObject() { @DoNotStrip private var mHybridData: HybridData = initHybrid() diff --git a/nitrogen/generated/android/kotlin/com/margelo/nitro/video/HybridVideoViewViewManagerSpec.kt b/nitrogen/generated/android/kotlin/com/margelo/nitro/video/HybridVideoViewViewManagerSpec.kt index 9836e2ac..203a3127 100644 --- a/nitrogen/generated/android/kotlin/com/margelo/nitro/video/HybridVideoViewViewManagerSpec.kt +++ b/nitrogen/generated/android/kotlin/com/margelo/nitro/video/HybridVideoViewViewManagerSpec.kt @@ -2,7 +2,7 @@ /// HybridVideoViewViewManagerSpec.kt /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro -/// Copyright © 2024 Marc Rousavy @ Margelo +/// Copyright © 2025 Marc Rousavy @ Margelo /// package com.margelo.nitro.video @@ -19,7 +19,11 @@ import com.margelo.nitro.core.* */ @DoNotStrip @Keep -@Suppress("RedundantSuppression", "KotlinJniMissingFunction", "PropertyName", "RedundantUnitReturnType", "unused") +@Suppress( + "KotlinJniMissingFunction", "unused", + "RedundantSuppression", "RedundantUnitReturnType", "SimpleRedundantLet", + "LocalVariableName", "PropertyName", "PrivatePropertyName", "FunctionName" +) abstract class HybridVideoViewViewManagerSpec: HybridObject() { @DoNotStrip private var mHybridData: HybridData = initHybrid() diff --git a/nitrogen/generated/android/kotlin/com/margelo/nitro/video/VideoInformation.kt b/nitrogen/generated/android/kotlin/com/margelo/nitro/video/VideoInformation.kt new file mode 100644 index 00000000..3a6d9763 --- /dev/null +++ b/nitrogen/generated/android/kotlin/com/margelo/nitro/video/VideoInformation.kt @@ -0,0 +1,33 @@ +/// +/// VideoInformation.kt +/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. +/// https://github.com/mrousavy/nitro +/// Copyright © 2025 Marc Rousavy @ Margelo +/// + +package com.margelo.nitro.video + +import androidx.annotation.Keep +import com.facebook.proguard.annotations.DoNotStrip +import com.margelo.nitro.core.* + +/** + * Represents the JavaScript object/struct "VideoInformation". + */ +@DoNotStrip +@Keep +data class VideoInformation + @DoNotStrip + @Keep + constructor( + val bitrate: Double, + val width: Double, + val height: Double, + val duration: Long, + val fileSize: Long, + val isHDR: Boolean, + val isLive: Boolean, + val orientation: VideoOrientation + ) { + /* main constructor */ +} diff --git a/nitrogen/generated/android/kotlin/com/margelo/nitro/video/VideoOrientation.kt b/nitrogen/generated/android/kotlin/com/margelo/nitro/video/VideoOrientation.kt new file mode 100644 index 00000000..e2e784e7 --- /dev/null +++ b/nitrogen/generated/android/kotlin/com/margelo/nitro/video/VideoOrientation.kt @@ -0,0 +1,29 @@ +/// +/// VideoOrientation.kt +/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. +/// https://github.com/mrousavy/nitro +/// Copyright © 2025 Marc Rousavy @ Margelo +/// + +package com.margelo.nitro.video + +import androidx.annotation.Keep +import com.facebook.proguard.annotations.DoNotStrip + +/** + * Represents the JavaScript enum/union "VideoOrientation". + */ +@DoNotStrip +@Keep +enum class VideoOrientation { + PORTRAIT, + LANDSCAPE, + PORTRAIT_UPSIDE_DOWN, + LANDSCAPE_LEFT, + LANDSCAPE_RIGHT, + UNKNOWN; + + @DoNotStrip + @Keep + private val _ordinal = ordinal +} diff --git a/nitrogen/generated/ios/NitroVideo+autolinking.rb b/nitrogen/generated/ios/NitroVideo+autolinking.rb index a2386ca4..eb954e94 100644 --- a/nitrogen/generated/ios/NitroVideo+autolinking.rb +++ b/nitrogen/generated/ios/NitroVideo+autolinking.rb @@ -2,7 +2,7 @@ # NitroVideo+autolinking.rb # This file was generated by nitrogen. DO NOT MODIFY THIS FILE. # https://github.com/mrousavy/nitro -# Copyright © 2024 Marc Rousavy @ Margelo +# Copyright © 2025 Marc Rousavy @ Margelo # # This is a Ruby script that adds all files generated by Nitrogen diff --git a/nitrogen/generated/ios/NitroVideo-Swift-Cxx-Bridge.cpp b/nitrogen/generated/ios/NitroVideo-Swift-Cxx-Bridge.cpp index 074ff22b..4432ea35 100644 --- a/nitrogen/generated/ios/NitroVideo-Swift-Cxx-Bridge.cpp +++ b/nitrogen/generated/ios/NitroVideo-Swift-Cxx-Bridge.cpp @@ -2,7 +2,7 @@ /// NitroVideo-Swift-Cxx-Bridge.cpp /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro -/// Copyright © 2024 Marc Rousavy @ Margelo +/// Copyright © 2025 Marc Rousavy @ Margelo /// #include "NitroVideo-Swift-Cxx-Bridge.hpp" @@ -15,14 +15,13 @@ #include "HybridVideoViewViewManagerFactorySpecSwift.hpp" #include "HybridVideoViewViewManagerSpecSwift.hpp" #include "NitroVideo-Swift-Cxx-Umbrella.hpp" -#include namespace margelo::nitro::video::bridge::swift { // pragma MARK: std::shared_ptr std::shared_ptr create_std__shared_ptr_margelo__nitro__video__HybridVideoPlayerSourceSpec_(void* _Nonnull swiftUnsafePointer) { - NitroVideo::HybridVideoPlayerSourceSpecCxx swiftPart = NitroVideo::HybridVideoPlayerSourceSpecCxxUnsafe::fromUnsafe(swiftUnsafePointer); - return HybridContext::getOrCreate(swiftPart); + NitroVideo::HybridVideoPlayerSourceSpec_cxx swiftPart = NitroVideo::HybridVideoPlayerSourceSpec_cxx::fromUnsafe(swiftUnsafePointer); + return std::make_shared(swiftPart); } void* _Nonnull get_std__shared_ptr_margelo__nitro__video__HybridVideoPlayerSourceSpec_(std__shared_ptr_margelo__nitro__video__HybridVideoPlayerSourceSpec_ cppType) { std::shared_ptr swiftWrapper = std::dynamic_pointer_cast(cppType); @@ -31,14 +30,30 @@ namespace margelo::nitro::video::bridge::swift { throw std::runtime_error("Class \"HybridVideoPlayerSourceSpec\" is not implemented in Swift!"); } #endif - NitroVideo::HybridVideoPlayerSourceSpecCxx swiftPart = swiftWrapper->getSwiftPart(); - return NitroVideo::HybridVideoPlayerSourceSpecCxxUnsafe::toUnsafe(swiftPart); + NitroVideo::HybridVideoPlayerSourceSpec_cxx swiftPart = swiftWrapper->getSwiftPart(); + return swiftPart.toUnsafe(); + } + + // pragma MARK: std::function + Func_void create_Func_void(void* _Nonnull swiftClosureWrapper) { + auto swiftClosure = NitroVideo::Func_void::fromUnsafe(swiftClosureWrapper); + return [swiftClosure = std::move(swiftClosure)]() mutable -> void { + swiftClosure.call(); + }; + } + + // pragma MARK: std::function + Func_void_std__exception_ptr create_Func_void_std__exception_ptr(void* _Nonnull swiftClosureWrapper) { + auto swiftClosure = NitroVideo::Func_void_std__exception_ptr::fromUnsafe(swiftClosureWrapper); + return [swiftClosure = std::move(swiftClosure)](const std::exception_ptr& error) mutable -> void { + swiftClosure.call(error); + }; } // pragma MARK: std::shared_ptr std::shared_ptr create_std__shared_ptr_margelo__nitro__video__HybridVideoPlayerSpec_(void* _Nonnull swiftUnsafePointer) { - NitroVideo::HybridVideoPlayerSpecCxx swiftPart = NitroVideo::HybridVideoPlayerSpecCxxUnsafe::fromUnsafe(swiftUnsafePointer); - return HybridContext::getOrCreate(swiftPart); + NitroVideo::HybridVideoPlayerSpec_cxx swiftPart = NitroVideo::HybridVideoPlayerSpec_cxx::fromUnsafe(swiftUnsafePointer); + return std::make_shared(swiftPart); } void* _Nonnull get_std__shared_ptr_margelo__nitro__video__HybridVideoPlayerSpec_(std__shared_ptr_margelo__nitro__video__HybridVideoPlayerSpec_ cppType) { std::shared_ptr swiftWrapper = std::dynamic_pointer_cast(cppType); @@ -47,14 +62,14 @@ namespace margelo::nitro::video::bridge::swift { throw std::runtime_error("Class \"HybridVideoPlayerSpec\" is not implemented in Swift!"); } #endif - NitroVideo::HybridVideoPlayerSpecCxx swiftPart = swiftWrapper->getSwiftPart(); - return NitroVideo::HybridVideoPlayerSpecCxxUnsafe::toUnsafe(swiftPart); + NitroVideo::HybridVideoPlayerSpec_cxx swiftPart = swiftWrapper->getSwiftPart(); + return swiftPart.toUnsafe(); } // pragma MARK: std::shared_ptr std::shared_ptr create_std__shared_ptr_margelo__nitro__video__HybridVideoPlayerFactorySpec_(void* _Nonnull swiftUnsafePointer) { - NitroVideo::HybridVideoPlayerFactorySpecCxx swiftPart = NitroVideo::HybridVideoPlayerFactorySpecCxxUnsafe::fromUnsafe(swiftUnsafePointer); - return HybridContext::getOrCreate(swiftPart); + NitroVideo::HybridVideoPlayerFactorySpec_cxx swiftPart = NitroVideo::HybridVideoPlayerFactorySpec_cxx::fromUnsafe(swiftUnsafePointer); + return std::make_shared(swiftPart); } void* _Nonnull get_std__shared_ptr_margelo__nitro__video__HybridVideoPlayerFactorySpec_(std__shared_ptr_margelo__nitro__video__HybridVideoPlayerFactorySpec_ cppType) { std::shared_ptr swiftWrapper = std::dynamic_pointer_cast(cppType); @@ -63,14 +78,22 @@ namespace margelo::nitro::video::bridge::swift { throw std::runtime_error("Class \"HybridVideoPlayerFactorySpec\" is not implemented in Swift!"); } #endif - NitroVideo::HybridVideoPlayerFactorySpecCxx swiftPart = swiftWrapper->getSwiftPart(); - return NitroVideo::HybridVideoPlayerFactorySpecCxxUnsafe::toUnsafe(swiftPart); + NitroVideo::HybridVideoPlayerFactorySpec_cxx swiftPart = swiftWrapper->getSwiftPart(); + return swiftPart.toUnsafe(); + } + + // pragma MARK: std::function + Func_void_VideoInformation create_Func_void_VideoInformation(void* _Nonnull swiftClosureWrapper) { + auto swiftClosure = NitroVideo::Func_void_VideoInformation::fromUnsafe(swiftClosureWrapper); + return [swiftClosure = std::move(swiftClosure)](const VideoInformation& result) mutable -> void { + swiftClosure.call(result); + }; } // pragma MARK: std::shared_ptr std::shared_ptr create_std__shared_ptr_margelo__nitro__video__HybridVideoPlayerSourceFactorySpec_(void* _Nonnull swiftUnsafePointer) { - NitroVideo::HybridVideoPlayerSourceFactorySpecCxx swiftPart = NitroVideo::HybridVideoPlayerSourceFactorySpecCxxUnsafe::fromUnsafe(swiftUnsafePointer); - return HybridContext::getOrCreate(swiftPart); + NitroVideo::HybridVideoPlayerSourceFactorySpec_cxx swiftPart = NitroVideo::HybridVideoPlayerSourceFactorySpec_cxx::fromUnsafe(swiftUnsafePointer); + return std::make_shared(swiftPart); } void* _Nonnull get_std__shared_ptr_margelo__nitro__video__HybridVideoPlayerSourceFactorySpec_(std__shared_ptr_margelo__nitro__video__HybridVideoPlayerSourceFactorySpec_ cppType) { std::shared_ptr swiftWrapper = std::dynamic_pointer_cast(cppType); @@ -79,14 +102,14 @@ namespace margelo::nitro::video::bridge::swift { throw std::runtime_error("Class \"HybridVideoPlayerSourceFactorySpec\" is not implemented in Swift!"); } #endif - NitroVideo::HybridVideoPlayerSourceFactorySpecCxx swiftPart = swiftWrapper->getSwiftPart(); - return NitroVideo::HybridVideoPlayerSourceFactorySpecCxxUnsafe::toUnsafe(swiftPart); + NitroVideo::HybridVideoPlayerSourceFactorySpec_cxx swiftPart = swiftWrapper->getSwiftPart(); + return swiftPart.toUnsafe(); } // pragma MARK: std::shared_ptr std::shared_ptr create_std__shared_ptr_margelo__nitro__video__HybridVideoViewViewManagerSpec_(void* _Nonnull swiftUnsafePointer) { - NitroVideo::HybridVideoViewViewManagerSpecCxx swiftPart = NitroVideo::HybridVideoViewViewManagerSpecCxxUnsafe::fromUnsafe(swiftUnsafePointer); - return HybridContext::getOrCreate(swiftPart); + NitroVideo::HybridVideoViewViewManagerSpec_cxx swiftPart = NitroVideo::HybridVideoViewViewManagerSpec_cxx::fromUnsafe(swiftUnsafePointer); + return std::make_shared(swiftPart); } void* _Nonnull get_std__shared_ptr_margelo__nitro__video__HybridVideoViewViewManagerSpec_(std__shared_ptr_margelo__nitro__video__HybridVideoViewViewManagerSpec_ cppType) { std::shared_ptr swiftWrapper = std::dynamic_pointer_cast(cppType); @@ -95,14 +118,14 @@ namespace margelo::nitro::video::bridge::swift { throw std::runtime_error("Class \"HybridVideoViewViewManagerSpec\" is not implemented in Swift!"); } #endif - NitroVideo::HybridVideoViewViewManagerSpecCxx swiftPart = swiftWrapper->getSwiftPart(); - return NitroVideo::HybridVideoViewViewManagerSpecCxxUnsafe::toUnsafe(swiftPart); + NitroVideo::HybridVideoViewViewManagerSpec_cxx swiftPart = swiftWrapper->getSwiftPart(); + return swiftPart.toUnsafe(); } // pragma MARK: std::shared_ptr std::shared_ptr create_std__shared_ptr_margelo__nitro__video__HybridVideoViewViewManagerFactorySpec_(void* _Nonnull swiftUnsafePointer) { - NitroVideo::HybridVideoViewViewManagerFactorySpecCxx swiftPart = NitroVideo::HybridVideoViewViewManagerFactorySpecCxxUnsafe::fromUnsafe(swiftUnsafePointer); - return HybridContext::getOrCreate(swiftPart); + NitroVideo::HybridVideoViewViewManagerFactorySpec_cxx swiftPart = NitroVideo::HybridVideoViewViewManagerFactorySpec_cxx::fromUnsafe(swiftUnsafePointer); + return std::make_shared(swiftPart); } void* _Nonnull get_std__shared_ptr_margelo__nitro__video__HybridVideoViewViewManagerFactorySpec_(std__shared_ptr_margelo__nitro__video__HybridVideoViewViewManagerFactorySpec_ cppType) { std::shared_ptr swiftWrapper = std::dynamic_pointer_cast(cppType); @@ -111,8 +134,8 @@ namespace margelo::nitro::video::bridge::swift { throw std::runtime_error("Class \"HybridVideoViewViewManagerFactorySpec\" is not implemented in Swift!"); } #endif - NitroVideo::HybridVideoViewViewManagerFactorySpecCxx swiftPart = swiftWrapper->getSwiftPart(); - return NitroVideo::HybridVideoViewViewManagerFactorySpecCxxUnsafe::toUnsafe(swiftPart); + NitroVideo::HybridVideoViewViewManagerFactorySpec_cxx swiftPart = swiftWrapper->getSwiftPart(); + return swiftPart.toUnsafe(); } } // namespace margelo::nitro::video::bridge::swift diff --git a/nitrogen/generated/ios/NitroVideo-Swift-Cxx-Bridge.hpp b/nitrogen/generated/ios/NitroVideo-Swift-Cxx-Bridge.hpp index 32b12d87..43175a6d 100644 --- a/nitrogen/generated/ios/NitroVideo-Swift-Cxx-Bridge.hpp +++ b/nitrogen/generated/ios/NitroVideo-Swift-Cxx-Bridge.hpp @@ -2,7 +2,7 @@ /// NitroVideo-Swift-Cxx-Bridge.hpp /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro -/// Copyright © 2024 Marc Rousavy @ Margelo +/// Copyright © 2025 Marc Rousavy @ Margelo /// #pragma once @@ -20,20 +20,24 @@ namespace margelo::nitro::video { class HybridVideoPlayerSpec; } namespace margelo::nitro::video { class HybridVideoViewViewManagerFactorySpec; } // Forward declaration of `HybridVideoViewViewManagerSpec` to properly resolve imports. namespace margelo::nitro::video { class HybridVideoViewViewManagerSpec; } +// Forward declaration of `VideoInformation` to properly resolve imports. +namespace margelo::nitro::video { struct VideoInformation; } +// Forward declaration of `VideoOrientation` to properly resolve imports. +namespace margelo::nitro::video { enum class VideoOrientation; } // Forward declarations of Swift defined types -// Forward declaration of `HybridVideoPlayerFactorySpecCxx` to properly resolve imports. -namespace NitroVideo { class HybridVideoPlayerFactorySpecCxx; } -// Forward declaration of `HybridVideoPlayerSourceFactorySpecCxx` to properly resolve imports. -namespace NitroVideo { class HybridVideoPlayerSourceFactorySpecCxx; } -// Forward declaration of `HybridVideoPlayerSourceSpecCxx` to properly resolve imports. -namespace NitroVideo { class HybridVideoPlayerSourceSpecCxx; } -// Forward declaration of `HybridVideoPlayerSpecCxx` to properly resolve imports. -namespace NitroVideo { class HybridVideoPlayerSpecCxx; } -// Forward declaration of `HybridVideoViewViewManagerFactorySpecCxx` to properly resolve imports. -namespace NitroVideo { class HybridVideoViewViewManagerFactorySpecCxx; } -// Forward declaration of `HybridVideoViewViewManagerSpecCxx` to properly resolve imports. -namespace NitroVideo { class HybridVideoViewViewManagerSpecCxx; } +// Forward declaration of `HybridVideoPlayerFactorySpec_cxx` to properly resolve imports. +namespace NitroVideo { class HybridVideoPlayerFactorySpec_cxx; } +// Forward declaration of `HybridVideoPlayerSourceFactorySpec_cxx` to properly resolve imports. +namespace NitroVideo { class HybridVideoPlayerSourceFactorySpec_cxx; } +// Forward declaration of `HybridVideoPlayerSourceSpec_cxx` to properly resolve imports. +namespace NitroVideo { class HybridVideoPlayerSourceSpec_cxx; } +// Forward declaration of `HybridVideoPlayerSpec_cxx` to properly resolve imports. +namespace NitroVideo { class HybridVideoPlayerSpec_cxx; } +// Forward declaration of `HybridVideoViewViewManagerFactorySpec_cxx` to properly resolve imports. +namespace NitroVideo { class HybridVideoViewViewManagerFactorySpec_cxx; } +// Forward declaration of `HybridVideoViewViewManagerSpec_cxx` to properly resolve imports. +namespace NitroVideo { class HybridVideoViewViewManagerSpec_cxx; } // Include C++ defined types #include "HybridVideoPlayerFactorySpec.hpp" @@ -42,6 +46,13 @@ namespace NitroVideo { class HybridVideoViewViewManagerSpecCxx; } #include "HybridVideoPlayerSpec.hpp" #include "HybridVideoViewViewManagerFactorySpec.hpp" #include "HybridVideoViewViewManagerSpec.hpp" +#include "VideoInformation.hpp" +#include "VideoOrientation.hpp" +#include +#include +#include +#include +#include #include #include @@ -59,6 +70,66 @@ namespace margelo::nitro::video::bridge::swift { std::shared_ptr create_std__shared_ptr_margelo__nitro__video__HybridVideoPlayerSourceSpec_(void* _Nonnull swiftUnsafePointer); void* _Nonnull get_std__shared_ptr_margelo__nitro__video__HybridVideoPlayerSourceSpec_(std__shared_ptr_margelo__nitro__video__HybridVideoPlayerSourceSpec_ cppType); + // pragma MARK: std::weak_ptr + using std__weak_ptr_margelo__nitro__video__HybridVideoPlayerSourceSpec_ = std::weak_ptr; + inline std__weak_ptr_margelo__nitro__video__HybridVideoPlayerSourceSpec_ weakify_std__shared_ptr_margelo__nitro__video__HybridVideoPlayerSourceSpec_(const std::shared_ptr& strong) { return strong; } + + // pragma MARK: std::shared_ptr> + /** + * Specialized version of `std::shared_ptr>`. + */ + using std__shared_ptr_Promise_void__ = std::shared_ptr>; + inline std::shared_ptr> create_std__shared_ptr_Promise_void__() { + return Promise::create(); + } + inline PromiseHolder wrap_std__shared_ptr_Promise_void__(std::shared_ptr> promise) { + return PromiseHolder(std::move(promise)); + } + + // pragma MARK: std::function + /** + * Specialized version of `std::function`. + */ + using Func_void = std::function; + /** + * Wrapper class for a `std::function`, this can be used from Swift. + */ + class Func_void_Wrapper final { + public: + explicit Func_void_Wrapper(std::function&& func): _function(std::make_shared>(std::move(func))) {} + inline void call() const { + _function->operator()(); + } + private: + std::shared_ptr> _function; + }; + Func_void create_Func_void(void* _Nonnull swiftClosureWrapper); + inline Func_void_Wrapper wrap_Func_void(Func_void value) { + return Func_void_Wrapper(std::move(value)); + } + + // pragma MARK: std::function + /** + * Specialized version of `std::function`. + */ + using Func_void_std__exception_ptr = std::function; + /** + * Wrapper class for a `std::function`, this can be used from Swift. + */ + class Func_void_std__exception_ptr_Wrapper final { + public: + explicit Func_void_std__exception_ptr_Wrapper(std::function&& func): _function(std::make_shared>(std::move(func))) {} + inline void call(std::exception_ptr error) const { + _function->operator()(error); + } + private: + std::shared_ptr> _function; + }; + Func_void_std__exception_ptr create_Func_void_std__exception_ptr(void* _Nonnull swiftClosureWrapper); + inline Func_void_std__exception_ptr_Wrapper wrap_Func_void_std__exception_ptr(Func_void_std__exception_ptr value) { + return Func_void_std__exception_ptr_Wrapper(std::move(value)); + } + // pragma MARK: std::shared_ptr /** * Specialized version of `std::shared_ptr`. @@ -67,6 +138,28 @@ namespace margelo::nitro::video::bridge::swift { std::shared_ptr create_std__shared_ptr_margelo__nitro__video__HybridVideoPlayerSpec_(void* _Nonnull swiftUnsafePointer); void* _Nonnull get_std__shared_ptr_margelo__nitro__video__HybridVideoPlayerSpec_(std__shared_ptr_margelo__nitro__video__HybridVideoPlayerSpec_ cppType); + // pragma MARK: std::weak_ptr + using std__weak_ptr_margelo__nitro__video__HybridVideoPlayerSpec_ = std::weak_ptr; + inline std__weak_ptr_margelo__nitro__video__HybridVideoPlayerSpec_ weakify_std__shared_ptr_margelo__nitro__video__HybridVideoPlayerSpec_(const std::shared_ptr& strong) { return strong; } + + // pragma MARK: Result>> + using Result_std__shared_ptr_Promise_void___ = Result>>; + inline Result_std__shared_ptr_Promise_void___ create_Result_std__shared_ptr_Promise_void___(const std::shared_ptr>& value) { + return Result>>::withValue(value); + } + inline Result_std__shared_ptr_Promise_void___ create_Result_std__shared_ptr_Promise_void___(const std::exception_ptr& error) { + return Result>>::withError(error); + } + + // pragma MARK: Result + using Result_void_ = Result; + inline Result_void_ create_Result_void_() { + return Result::withValue(); + } + inline Result_void_ create_Result_void_(const std::exception_ptr& error) { + return Result::withError(error); + } + // pragma MARK: std::shared_ptr /** * Specialized version of `std::shared_ptr`. @@ -75,6 +168,62 @@ namespace margelo::nitro::video::bridge::swift { std::shared_ptr create_std__shared_ptr_margelo__nitro__video__HybridVideoPlayerFactorySpec_(void* _Nonnull swiftUnsafePointer); void* _Nonnull get_std__shared_ptr_margelo__nitro__video__HybridVideoPlayerFactorySpec_(std__shared_ptr_margelo__nitro__video__HybridVideoPlayerFactorySpec_ cppType); + // pragma MARK: std::weak_ptr + using std__weak_ptr_margelo__nitro__video__HybridVideoPlayerFactorySpec_ = std::weak_ptr; + inline std__weak_ptr_margelo__nitro__video__HybridVideoPlayerFactorySpec_ weakify_std__shared_ptr_margelo__nitro__video__HybridVideoPlayerFactorySpec_(const std::shared_ptr& strong) { return strong; } + + // pragma MARK: Result> + using Result_std__shared_ptr_margelo__nitro__video__HybridVideoPlayerSpec__ = Result>; + inline Result_std__shared_ptr_margelo__nitro__video__HybridVideoPlayerSpec__ create_Result_std__shared_ptr_margelo__nitro__video__HybridVideoPlayerSpec__(const std::shared_ptr& value) { + return Result>::withValue(value); + } + inline Result_std__shared_ptr_margelo__nitro__video__HybridVideoPlayerSpec__ create_Result_std__shared_ptr_margelo__nitro__video__HybridVideoPlayerSpec__(const std::exception_ptr& error) { + return Result>::withError(error); + } + + // pragma MARK: std::shared_ptr> + /** + * Specialized version of `std::shared_ptr>`. + */ + using std__shared_ptr_Promise_VideoInformation__ = std::shared_ptr>; + inline std::shared_ptr> create_std__shared_ptr_Promise_VideoInformation__() { + return Promise::create(); + } + inline PromiseHolder wrap_std__shared_ptr_Promise_VideoInformation__(std::shared_ptr> promise) { + return PromiseHolder(std::move(promise)); + } + + // pragma MARK: std::function + /** + * Specialized version of `std::function`. + */ + using Func_void_VideoInformation = std::function; + /** + * Wrapper class for a `std::function`, this can be used from Swift. + */ + class Func_void_VideoInformation_Wrapper final { + public: + explicit Func_void_VideoInformation_Wrapper(std::function&& func): _function(std::make_shared>(std::move(func))) {} + inline void call(VideoInformation result) const { + _function->operator()(result); + } + private: + std::shared_ptr> _function; + }; + Func_void_VideoInformation create_Func_void_VideoInformation(void* _Nonnull swiftClosureWrapper); + inline Func_void_VideoInformation_Wrapper wrap_Func_void_VideoInformation(Func_void_VideoInformation value) { + return Func_void_VideoInformation_Wrapper(std::move(value)); + } + + // pragma MARK: Result>> + using Result_std__shared_ptr_Promise_VideoInformation___ = Result>>; + inline Result_std__shared_ptr_Promise_VideoInformation___ create_Result_std__shared_ptr_Promise_VideoInformation___(const std::shared_ptr>& value) { + return Result>>::withValue(value); + } + inline Result_std__shared_ptr_Promise_VideoInformation___ create_Result_std__shared_ptr_Promise_VideoInformation___(const std::exception_ptr& error) { + return Result>>::withError(error); + } + // pragma MARK: std::shared_ptr /** * Specialized version of `std::shared_ptr`. @@ -83,6 +232,19 @@ namespace margelo::nitro::video::bridge::swift { std::shared_ptr create_std__shared_ptr_margelo__nitro__video__HybridVideoPlayerSourceFactorySpec_(void* _Nonnull swiftUnsafePointer); void* _Nonnull get_std__shared_ptr_margelo__nitro__video__HybridVideoPlayerSourceFactorySpec_(std__shared_ptr_margelo__nitro__video__HybridVideoPlayerSourceFactorySpec_ cppType); + // pragma MARK: std::weak_ptr + using std__weak_ptr_margelo__nitro__video__HybridVideoPlayerSourceFactorySpec_ = std::weak_ptr; + inline std__weak_ptr_margelo__nitro__video__HybridVideoPlayerSourceFactorySpec_ weakify_std__shared_ptr_margelo__nitro__video__HybridVideoPlayerSourceFactorySpec_(const std::shared_ptr& strong) { return strong; } + + // pragma MARK: Result> + using Result_std__shared_ptr_margelo__nitro__video__HybridVideoPlayerSourceSpec__ = Result>; + inline Result_std__shared_ptr_margelo__nitro__video__HybridVideoPlayerSourceSpec__ create_Result_std__shared_ptr_margelo__nitro__video__HybridVideoPlayerSourceSpec__(const std::shared_ptr& value) { + return Result>::withValue(value); + } + inline Result_std__shared_ptr_margelo__nitro__video__HybridVideoPlayerSourceSpec__ create_Result_std__shared_ptr_margelo__nitro__video__HybridVideoPlayerSourceSpec__(const std::exception_ptr& error) { + return Result>::withError(error); + } + // pragma MARK: std::optional> /** * Specialized version of `std::optional>`. @@ -100,6 +262,10 @@ namespace margelo::nitro::video::bridge::swift { std::shared_ptr create_std__shared_ptr_margelo__nitro__video__HybridVideoViewViewManagerSpec_(void* _Nonnull swiftUnsafePointer); void* _Nonnull get_std__shared_ptr_margelo__nitro__video__HybridVideoViewViewManagerSpec_(std__shared_ptr_margelo__nitro__video__HybridVideoViewViewManagerSpec_ cppType); + // pragma MARK: std::weak_ptr + using std__weak_ptr_margelo__nitro__video__HybridVideoViewViewManagerSpec_ = std::weak_ptr; + inline std__weak_ptr_margelo__nitro__video__HybridVideoViewViewManagerSpec_ weakify_std__shared_ptr_margelo__nitro__video__HybridVideoViewViewManagerSpec_(const std::shared_ptr& strong) { return strong; } + // pragma MARK: std::shared_ptr /** * Specialized version of `std::shared_ptr`. @@ -107,5 +273,18 @@ namespace margelo::nitro::video::bridge::swift { using std__shared_ptr_margelo__nitro__video__HybridVideoViewViewManagerFactorySpec_ = std::shared_ptr; std::shared_ptr create_std__shared_ptr_margelo__nitro__video__HybridVideoViewViewManagerFactorySpec_(void* _Nonnull swiftUnsafePointer); void* _Nonnull get_std__shared_ptr_margelo__nitro__video__HybridVideoViewViewManagerFactorySpec_(std__shared_ptr_margelo__nitro__video__HybridVideoViewViewManagerFactorySpec_ cppType); + + // pragma MARK: std::weak_ptr + using std__weak_ptr_margelo__nitro__video__HybridVideoViewViewManagerFactorySpec_ = std::weak_ptr; + inline std__weak_ptr_margelo__nitro__video__HybridVideoViewViewManagerFactorySpec_ weakify_std__shared_ptr_margelo__nitro__video__HybridVideoViewViewManagerFactorySpec_(const std::shared_ptr& strong) { return strong; } + + // pragma MARK: Result> + using Result_std__shared_ptr_margelo__nitro__video__HybridVideoViewViewManagerSpec__ = Result>; + inline Result_std__shared_ptr_margelo__nitro__video__HybridVideoViewViewManagerSpec__ create_Result_std__shared_ptr_margelo__nitro__video__HybridVideoViewViewManagerSpec__(const std::shared_ptr& value) { + return Result>::withValue(value); + } + inline Result_std__shared_ptr_margelo__nitro__video__HybridVideoViewViewManagerSpec__ create_Result_std__shared_ptr_margelo__nitro__video__HybridVideoViewViewManagerSpec__(const std::exception_ptr& error) { + return Result>::withError(error); + } } // namespace margelo::nitro::video::bridge::swift diff --git a/nitrogen/generated/ios/NitroVideo-Swift-Cxx-Umbrella.hpp b/nitrogen/generated/ios/NitroVideo-Swift-Cxx-Umbrella.hpp index 6d47e4c2..148e6170 100644 --- a/nitrogen/generated/ios/NitroVideo-Swift-Cxx-Umbrella.hpp +++ b/nitrogen/generated/ios/NitroVideo-Swift-Cxx-Umbrella.hpp @@ -2,7 +2,7 @@ /// NitroVideo-Swift-Cxx-Umbrella.hpp /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro -/// Copyright © 2024 Marc Rousavy @ Margelo +/// Copyright © 2025 Marc Rousavy @ Margelo /// #pragma once @@ -20,6 +20,10 @@ namespace margelo::nitro::video { class HybridVideoPlayerSpec; } namespace margelo::nitro::video { class HybridVideoViewViewManagerFactorySpec; } // Forward declaration of `HybridVideoViewViewManagerSpec` to properly resolve imports. namespace margelo::nitro::video { class HybridVideoViewViewManagerSpec; } +// Forward declaration of `VideoInformation` to properly resolve imports. +namespace margelo::nitro::video { struct VideoInformation; } +// Forward declaration of `VideoOrientation` to properly resolve imports. +namespace margelo::nitro::video { enum class VideoOrientation; } // Include C++ defined types #include "HybridVideoPlayerFactorySpec.hpp" @@ -28,6 +32,11 @@ namespace margelo::nitro::video { class HybridVideoViewViewManagerSpec; } #include "HybridVideoPlayerSpec.hpp" #include "HybridVideoViewViewManagerFactorySpec.hpp" #include "HybridVideoViewViewManagerSpec.hpp" +#include "VideoInformation.hpp" +#include "VideoOrientation.hpp" +#include +#include +#include #include #include #include @@ -42,24 +51,27 @@ namespace margelo::nitro::video { class HybridVideoViewViewManagerSpec; } #include // Forward declarations of Swift defined types -// Forward declaration of `HybridVideoPlayerFactorySpecCxx` to properly resolve imports. -namespace NitroVideo { class HybridVideoPlayerFactorySpecCxx; } -// Forward declaration of `HybridVideoPlayerSourceFactorySpecCxx` to properly resolve imports. -namespace NitroVideo { class HybridVideoPlayerSourceFactorySpecCxx; } -// Forward declaration of `HybridVideoPlayerSourceSpecCxx` to properly resolve imports. -namespace NitroVideo { class HybridVideoPlayerSourceSpecCxx; } -// Forward declaration of `HybridVideoPlayerSpecCxx` to properly resolve imports. -namespace NitroVideo { class HybridVideoPlayerSpecCxx; } -// Forward declaration of `HybridVideoViewViewManagerFactorySpecCxx` to properly resolve imports. -namespace NitroVideo { class HybridVideoViewViewManagerFactorySpecCxx; } -// Forward declaration of `HybridVideoViewViewManagerSpecCxx` to properly resolve imports. -namespace NitroVideo { class HybridVideoViewViewManagerSpecCxx; } +// Forward declaration of `HybridVideoPlayerFactorySpec_cxx` to properly resolve imports. +namespace NitroVideo { class HybridVideoPlayerFactorySpec_cxx; } +// Forward declaration of `HybridVideoPlayerSourceFactorySpec_cxx` to properly resolve imports. +namespace NitroVideo { class HybridVideoPlayerSourceFactorySpec_cxx; } +// Forward declaration of `HybridVideoPlayerSourceSpec_cxx` to properly resolve imports. +namespace NitroVideo { class HybridVideoPlayerSourceSpec_cxx; } +// Forward declaration of `HybridVideoPlayerSpec_cxx` to properly resolve imports. +namespace NitroVideo { class HybridVideoPlayerSpec_cxx; } +// Forward declaration of `HybridVideoViewViewManagerFactorySpec_cxx` to properly resolve imports. +namespace NitroVideo { class HybridVideoViewViewManagerFactorySpec_cxx; } +// Forward declaration of `HybridVideoViewViewManagerSpec_cxx` to properly resolve imports. +namespace NitroVideo { class HybridVideoViewViewManagerSpec_cxx; } // Include Swift defined types #if __has_include("NitroVideo-Swift.h") // This header is generated by Xcode/Swift on every app build. // If it cannot be found, make sure the Swift module's name (= podspec name) is actually "NitroVideo". #include "NitroVideo-Swift.h" +// Same as above, but used when building with frameworks (`use_frameworks`) +#elif __has_include() +#include #else #error NitroVideo's autogenerated Swift header cannot be found! Make sure the Swift module's name (= podspec name) is actually "NitroVideo", and try building the app first. #endif diff --git a/nitrogen/generated/ios/NitroVideoAutolinking.mm b/nitrogen/generated/ios/NitroVideoAutolinking.mm index 0aa9f142..35dfd8cc 100644 --- a/nitrogen/generated/ios/NitroVideoAutolinking.mm +++ b/nitrogen/generated/ios/NitroVideoAutolinking.mm @@ -2,7 +2,7 @@ /// NitroVideoAutolinking.mm /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro -/// Copyright © 2024 Marc Rousavy @ Margelo +/// Copyright © 2025 Marc Rousavy @ Margelo /// #import diff --git a/nitrogen/generated/ios/NitroVideoAutolinking.swift b/nitrogen/generated/ios/NitroVideoAutolinking.swift index 1d542747..77754e09 100644 --- a/nitrogen/generated/ios/NitroVideoAutolinking.swift +++ b/nitrogen/generated/ios/NitroVideoAutolinking.swift @@ -2,7 +2,7 @@ /// NitroVideoAutolinking.swift /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro -/// Copyright © 2024 Marc Rousavy @ Margelo +/// Copyright © 2025 Marc Rousavy @ Margelo /// public final class NitroVideoAutolinking { @@ -10,7 +10,7 @@ public final class NitroVideoAutolinking { /** * Creates an instance of a Swift class that implements `HybridVideoPlayerFactorySpec`, - * and wraps it in a Swift class that can directly interop with C++ (`HybridVideoPlayerFactorySpecCxx`) + * and wraps it in a Swift class that can directly interop with C++ (`HybridVideoPlayerFactorySpec_cxx`) * * This is generated by Nitrogen and will initialize the class specified * in the `"autolinking"` property of `nitro.json` (in this case, `HybridVideoPlayerFactory`). @@ -18,15 +18,14 @@ public final class NitroVideoAutolinking { public static func createVideoPlayerFactory() -> bridge.std__shared_ptr_margelo__nitro__video__HybridVideoPlayerFactorySpec_ { let hybridObject = HybridVideoPlayerFactory() return { () -> bridge.std__shared_ptr_margelo__nitro__video__HybridVideoPlayerFactorySpec_ in - let __cxxWrapped = HybridVideoPlayerFactorySpecCxx(hybridObject) - let __pointer = HybridVideoPlayerFactorySpecCxxUnsafe.toUnsafe(__cxxWrapped) - return bridge.create_std__shared_ptr_margelo__nitro__video__HybridVideoPlayerFactorySpec_(__pointer) + let __cxxWrapped = hybridObject.getCxxWrapper() + return __cxxWrapped.getCxxPart() }() } /** * Creates an instance of a Swift class that implements `HybridVideoPlayerSourceFactorySpec`, - * and wraps it in a Swift class that can directly interop with C++ (`HybridVideoPlayerSourceFactorySpecCxx`) + * and wraps it in a Swift class that can directly interop with C++ (`HybridVideoPlayerSourceFactorySpec_cxx`) * * This is generated by Nitrogen and will initialize the class specified * in the `"autolinking"` property of `nitro.json` (in this case, `HybridVideoPlayerSourceFactory`). @@ -34,15 +33,14 @@ public final class NitroVideoAutolinking { public static func createVideoPlayerSourceFactory() -> bridge.std__shared_ptr_margelo__nitro__video__HybridVideoPlayerSourceFactorySpec_ { let hybridObject = HybridVideoPlayerSourceFactory() return { () -> bridge.std__shared_ptr_margelo__nitro__video__HybridVideoPlayerSourceFactorySpec_ in - let __cxxWrapped = HybridVideoPlayerSourceFactorySpecCxx(hybridObject) - let __pointer = HybridVideoPlayerSourceFactorySpecCxxUnsafe.toUnsafe(__cxxWrapped) - return bridge.create_std__shared_ptr_margelo__nitro__video__HybridVideoPlayerSourceFactorySpec_(__pointer) + let __cxxWrapped = hybridObject.getCxxWrapper() + return __cxxWrapped.getCxxPart() }() } /** * Creates an instance of a Swift class that implements `HybridVideoViewViewManagerFactorySpec`, - * and wraps it in a Swift class that can directly interop with C++ (`HybridVideoViewViewManagerFactorySpecCxx`) + * and wraps it in a Swift class that can directly interop with C++ (`HybridVideoViewViewManagerFactorySpec_cxx`) * * This is generated by Nitrogen and will initialize the class specified * in the `"autolinking"` property of `nitro.json` (in this case, `HybridVideoViewViewManagerFactory`). @@ -50,9 +48,8 @@ public final class NitroVideoAutolinking { public static func createVideoViewViewManagerFactory() -> bridge.std__shared_ptr_margelo__nitro__video__HybridVideoViewViewManagerFactorySpec_ { let hybridObject = HybridVideoViewViewManagerFactory() return { () -> bridge.std__shared_ptr_margelo__nitro__video__HybridVideoViewViewManagerFactorySpec_ in - let __cxxWrapped = HybridVideoViewViewManagerFactorySpecCxx(hybridObject) - let __pointer = HybridVideoViewViewManagerFactorySpecCxxUnsafe.toUnsafe(__cxxWrapped) - return bridge.create_std__shared_ptr_margelo__nitro__video__HybridVideoViewViewManagerFactorySpec_(__pointer) + let __cxxWrapped = hybridObject.getCxxWrapper() + return __cxxWrapped.getCxxPart() }() } } diff --git a/nitrogen/generated/ios/c++/HybridVideoPlayerFactorySpecSwift.cpp b/nitrogen/generated/ios/c++/HybridVideoPlayerFactorySpecSwift.cpp index 636ffaff..2cbf600f 100644 --- a/nitrogen/generated/ios/c++/HybridVideoPlayerFactorySpecSwift.cpp +++ b/nitrogen/generated/ios/c++/HybridVideoPlayerFactorySpecSwift.cpp @@ -2,7 +2,7 @@ /// HybridVideoPlayerFactorySpecSwift.cpp /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro -/// Copyright © 2024 Marc Rousavy @ Margelo +/// Copyright © 2025 Marc Rousavy @ Margelo /// #include "HybridVideoPlayerFactorySpecSwift.hpp" diff --git a/nitrogen/generated/ios/c++/HybridVideoPlayerFactorySpecSwift.hpp b/nitrogen/generated/ios/c++/HybridVideoPlayerFactorySpecSwift.hpp index aa470a3f..3ca6be0b 100644 --- a/nitrogen/generated/ios/c++/HybridVideoPlayerFactorySpecSwift.hpp +++ b/nitrogen/generated/ios/c++/HybridVideoPlayerFactorySpecSwift.hpp @@ -2,15 +2,15 @@ /// HybridVideoPlayerFactorySpecSwift.hpp /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro -/// Copyright © 2024 Marc Rousavy @ Margelo +/// Copyright © 2025 Marc Rousavy @ Margelo /// #pragma once #include "HybridVideoPlayerFactorySpec.hpp" -// Forward declaration of `HybridVideoPlayerFactorySpecCxx` to properly resolve imports. -namespace NitroVideo { class HybridVideoPlayerFactorySpecCxx; } +// Forward declaration of `HybridVideoPlayerFactorySpec_cxx` to properly resolve imports. +namespace NitroVideo { class HybridVideoPlayerFactorySpec_cxx; } // Forward declaration of `HybridVideoPlayerSpec` to properly resolve imports. namespace margelo::nitro::video { class HybridVideoPlayerSpec; } @@ -21,36 +21,30 @@ namespace margelo::nitro::video { class HybridVideoPlayerSourceSpec; } #include "HybridVideoPlayerSpec.hpp" #include "HybridVideoPlayerSourceSpec.hpp" -#if __has_include() -#include -#else -#error NitroModules cannot be found! Are you sure you installed NitroModules properly? -#endif - #include "NitroVideo-Swift-Cxx-Umbrella.hpp" namespace margelo::nitro::video { /** - * The C++ part of HybridVideoPlayerFactorySpecCxx.swift. + * The C++ part of HybridVideoPlayerFactorySpec_cxx.swift. * - * HybridVideoPlayerFactorySpecSwift (C++) accesses HybridVideoPlayerFactorySpecCxx (Swift), and might + * HybridVideoPlayerFactorySpecSwift (C++) accesses HybridVideoPlayerFactorySpec_cxx (Swift), and might * contain some additional bridging code for C++ <> Swift interop. * * Since this obviously introduces an overhead, I hope at some point in - * the future, HybridVideoPlayerFactorySpecCxx can directly inherit from the C++ class HybridVideoPlayerFactorySpec + * the future, HybridVideoPlayerFactorySpec_cxx can directly inherit from the C++ class HybridVideoPlayerFactorySpec * to simplify the whole structure and memory management. */ class HybridVideoPlayerFactorySpecSwift: public virtual HybridVideoPlayerFactorySpec { public: // Constructor from a Swift instance - explicit HybridVideoPlayerFactorySpecSwift(const NitroVideo::HybridVideoPlayerFactorySpecCxx& swiftPart): + explicit HybridVideoPlayerFactorySpecSwift(const NitroVideo::HybridVideoPlayerFactorySpec_cxx& swiftPart): HybridObject(HybridVideoPlayerFactorySpec::TAG), _swiftPart(swiftPart) { } public: // Get the Swift part - inline NitroVideo::HybridVideoPlayerFactorySpecCxx getSwiftPart() noexcept { return _swiftPart; } + inline NitroVideo::HybridVideoPlayerFactorySpec_cxx getSwiftPart() noexcept { return _swiftPart; } public: // Get memory pressure @@ -66,11 +60,15 @@ namespace margelo::nitro::video { // Methods inline std::shared_ptr createPlayer(const std::shared_ptr& source) override { auto __result = _swiftPart.createPlayer(source); - return __result; + if (__result.hasError()) [[unlikely]] { + std::rethrow_exception(__result.error()); + } + auto __value = std::move(__result.value()); + return __value; } private: - NitroVideo::HybridVideoPlayerFactorySpecCxx _swiftPart; + NitroVideo::HybridVideoPlayerFactorySpec_cxx _swiftPart; }; } // namespace margelo::nitro::video diff --git a/nitrogen/generated/ios/c++/HybridVideoPlayerSourceFactorySpecSwift.cpp b/nitrogen/generated/ios/c++/HybridVideoPlayerSourceFactorySpecSwift.cpp index 17c628bd..4329f288 100644 --- a/nitrogen/generated/ios/c++/HybridVideoPlayerSourceFactorySpecSwift.cpp +++ b/nitrogen/generated/ios/c++/HybridVideoPlayerSourceFactorySpecSwift.cpp @@ -2,7 +2,7 @@ /// HybridVideoPlayerSourceFactorySpecSwift.cpp /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro -/// Copyright © 2024 Marc Rousavy @ Margelo +/// Copyright © 2025 Marc Rousavy @ Margelo /// #include "HybridVideoPlayerSourceFactorySpecSwift.hpp" diff --git a/nitrogen/generated/ios/c++/HybridVideoPlayerSourceFactorySpecSwift.hpp b/nitrogen/generated/ios/c++/HybridVideoPlayerSourceFactorySpecSwift.hpp index 83f25b36..8359cb09 100644 --- a/nitrogen/generated/ios/c++/HybridVideoPlayerSourceFactorySpecSwift.hpp +++ b/nitrogen/generated/ios/c++/HybridVideoPlayerSourceFactorySpecSwift.hpp @@ -2,15 +2,15 @@ /// HybridVideoPlayerSourceFactorySpecSwift.hpp /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro -/// Copyright © 2024 Marc Rousavy @ Margelo +/// Copyright © 2025 Marc Rousavy @ Margelo /// #pragma once #include "HybridVideoPlayerSourceFactorySpec.hpp" -// Forward declaration of `HybridVideoPlayerSourceFactorySpecCxx` to properly resolve imports. -namespace NitroVideo { class HybridVideoPlayerSourceFactorySpecCxx; } +// Forward declaration of `HybridVideoPlayerSourceFactorySpec_cxx` to properly resolve imports. +namespace NitroVideo { class HybridVideoPlayerSourceFactorySpec_cxx; } // Forward declaration of `HybridVideoPlayerSourceSpec` to properly resolve imports. namespace margelo::nitro::video { class HybridVideoPlayerSourceSpec; } @@ -19,36 +19,30 @@ namespace margelo::nitro::video { class HybridVideoPlayerSourceSpec; } #include "HybridVideoPlayerSourceSpec.hpp" #include -#if __has_include() -#include -#else -#error NitroModules cannot be found! Are you sure you installed NitroModules properly? -#endif - #include "NitroVideo-Swift-Cxx-Umbrella.hpp" namespace margelo::nitro::video { /** - * The C++ part of HybridVideoPlayerSourceFactorySpecCxx.swift. + * The C++ part of HybridVideoPlayerSourceFactorySpec_cxx.swift. * - * HybridVideoPlayerSourceFactorySpecSwift (C++) accesses HybridVideoPlayerSourceFactorySpecCxx (Swift), and might + * HybridVideoPlayerSourceFactorySpecSwift (C++) accesses HybridVideoPlayerSourceFactorySpec_cxx (Swift), and might * contain some additional bridging code for C++ <> Swift interop. * * Since this obviously introduces an overhead, I hope at some point in - * the future, HybridVideoPlayerSourceFactorySpecCxx can directly inherit from the C++ class HybridVideoPlayerSourceFactorySpec + * the future, HybridVideoPlayerSourceFactorySpec_cxx can directly inherit from the C++ class HybridVideoPlayerSourceFactorySpec * to simplify the whole structure and memory management. */ class HybridVideoPlayerSourceFactorySpecSwift: public virtual HybridVideoPlayerSourceFactorySpec { public: // Constructor from a Swift instance - explicit HybridVideoPlayerSourceFactorySpecSwift(const NitroVideo::HybridVideoPlayerSourceFactorySpecCxx& swiftPart): + explicit HybridVideoPlayerSourceFactorySpecSwift(const NitroVideo::HybridVideoPlayerSourceFactorySpec_cxx& swiftPart): HybridObject(HybridVideoPlayerSourceFactorySpec::TAG), _swiftPart(swiftPart) { } public: // Get the Swift part - inline NitroVideo::HybridVideoPlayerSourceFactorySpecCxx getSwiftPart() noexcept { return _swiftPart; } + inline NitroVideo::HybridVideoPlayerSourceFactorySpec_cxx getSwiftPart() noexcept { return _swiftPart; } public: // Get memory pressure @@ -64,11 +58,15 @@ namespace margelo::nitro::video { // Methods inline std::shared_ptr fromUri(const std::string& uri) override { auto __result = _swiftPart.fromUri(uri); - return __result; + if (__result.hasError()) [[unlikely]] { + std::rethrow_exception(__result.error()); + } + auto __value = std::move(__result.value()); + return __value; } private: - NitroVideo::HybridVideoPlayerSourceFactorySpecCxx _swiftPart; + NitroVideo::HybridVideoPlayerSourceFactorySpec_cxx _swiftPart; }; } // namespace margelo::nitro::video diff --git a/nitrogen/generated/ios/c++/HybridVideoPlayerSourceSpecSwift.cpp b/nitrogen/generated/ios/c++/HybridVideoPlayerSourceSpecSwift.cpp index 02587097..484ce67b 100644 --- a/nitrogen/generated/ios/c++/HybridVideoPlayerSourceSpecSwift.cpp +++ b/nitrogen/generated/ios/c++/HybridVideoPlayerSourceSpecSwift.cpp @@ -2,7 +2,7 @@ /// HybridVideoPlayerSourceSpecSwift.cpp /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro -/// Copyright © 2024 Marc Rousavy @ Margelo +/// Copyright © 2025 Marc Rousavy @ Margelo /// #include "HybridVideoPlayerSourceSpecSwift.hpp" diff --git a/nitrogen/generated/ios/c++/HybridVideoPlayerSourceSpecSwift.hpp b/nitrogen/generated/ios/c++/HybridVideoPlayerSourceSpecSwift.hpp index 9a64ccf3..ccca1059 100644 --- a/nitrogen/generated/ios/c++/HybridVideoPlayerSourceSpecSwift.hpp +++ b/nitrogen/generated/ios/c++/HybridVideoPlayerSourceSpecSwift.hpp @@ -2,50 +2,50 @@ /// HybridVideoPlayerSourceSpecSwift.hpp /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro -/// Copyright © 2024 Marc Rousavy @ Margelo +/// Copyright © 2025 Marc Rousavy @ Margelo /// #pragma once #include "HybridVideoPlayerSourceSpec.hpp" -// Forward declaration of `HybridVideoPlayerSourceSpecCxx` to properly resolve imports. -namespace NitroVideo { class HybridVideoPlayerSourceSpecCxx; } - +// Forward declaration of `HybridVideoPlayerSourceSpec_cxx` to properly resolve imports. +namespace NitroVideo { class HybridVideoPlayerSourceSpec_cxx; } +// Forward declaration of `VideoInformation` to properly resolve imports. +namespace margelo::nitro::video { struct VideoInformation; } +// Forward declaration of `VideoOrientation` to properly resolve imports. +namespace margelo::nitro::video { enum class VideoOrientation; } #include - -#if __has_include() -#include -#else -#error NitroModules cannot be found! Are you sure you installed NitroModules properly? -#endif +#include +#include "VideoInformation.hpp" +#include "VideoOrientation.hpp" #include "NitroVideo-Swift-Cxx-Umbrella.hpp" namespace margelo::nitro::video { /** - * The C++ part of HybridVideoPlayerSourceSpecCxx.swift. + * The C++ part of HybridVideoPlayerSourceSpec_cxx.swift. * - * HybridVideoPlayerSourceSpecSwift (C++) accesses HybridVideoPlayerSourceSpecCxx (Swift), and might + * HybridVideoPlayerSourceSpecSwift (C++) accesses HybridVideoPlayerSourceSpec_cxx (Swift), and might * contain some additional bridging code for C++ <> Swift interop. * * Since this obviously introduces an overhead, I hope at some point in - * the future, HybridVideoPlayerSourceSpecCxx can directly inherit from the C++ class HybridVideoPlayerSourceSpec + * the future, HybridVideoPlayerSourceSpec_cxx can directly inherit from the C++ class HybridVideoPlayerSourceSpec * to simplify the whole structure and memory management. */ class HybridVideoPlayerSourceSpecSwift: public virtual HybridVideoPlayerSourceSpec { public: // Constructor from a Swift instance - explicit HybridVideoPlayerSourceSpecSwift(const NitroVideo::HybridVideoPlayerSourceSpecCxx& swiftPart): + explicit HybridVideoPlayerSourceSpecSwift(const NitroVideo::HybridVideoPlayerSourceSpec_cxx& swiftPart): HybridObject(HybridVideoPlayerSourceSpec::TAG), _swiftPart(swiftPart) { } public: // Get the Swift part - inline NitroVideo::HybridVideoPlayerSourceSpecCxx getSwiftPart() noexcept { return _swiftPart; } + inline NitroVideo::HybridVideoPlayerSourceSpec_cxx getSwiftPart() noexcept { return _swiftPart; } public: // Get memory pressure @@ -59,16 +59,20 @@ namespace margelo::nitro::video { auto __result = _swiftPart.getUri(); return __result; } - inline void setUri(const std::string& uri) noexcept override { - _swiftPart.setUri(uri); - } public: // Methods - + inline std::shared_ptr> getAssetInformationAsync() override { + auto __result = _swiftPart.getAssetInformationAsync(); + if (__result.hasError()) [[unlikely]] { + std::rethrow_exception(__result.error()); + } + auto __value = std::move(__result.value()); + return __value; + } private: - NitroVideo::HybridVideoPlayerSourceSpecCxx _swiftPart; + NitroVideo::HybridVideoPlayerSourceSpec_cxx _swiftPart; }; } // namespace margelo::nitro::video diff --git a/nitrogen/generated/ios/c++/HybridVideoPlayerSpecSwift.cpp b/nitrogen/generated/ios/c++/HybridVideoPlayerSpecSwift.cpp index 51fe35a0..90a4cbd0 100644 --- a/nitrogen/generated/ios/c++/HybridVideoPlayerSpecSwift.cpp +++ b/nitrogen/generated/ios/c++/HybridVideoPlayerSpecSwift.cpp @@ -2,7 +2,7 @@ /// HybridVideoPlayerSpecSwift.cpp /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro -/// Copyright © 2024 Marc Rousavy @ Margelo +/// Copyright © 2025 Marc Rousavy @ Margelo /// #include "HybridVideoPlayerSpecSwift.hpp" diff --git a/nitrogen/generated/ios/c++/HybridVideoPlayerSpecSwift.hpp b/nitrogen/generated/ios/c++/HybridVideoPlayerSpecSwift.hpp index eb37db93..d58685e6 100644 --- a/nitrogen/generated/ios/c++/HybridVideoPlayerSpecSwift.hpp +++ b/nitrogen/generated/ios/c++/HybridVideoPlayerSpecSwift.hpp @@ -2,52 +2,47 @@ /// HybridVideoPlayerSpecSwift.hpp /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro -/// Copyright © 2024 Marc Rousavy @ Margelo +/// Copyright © 2025 Marc Rousavy @ Margelo /// #pragma once #include "HybridVideoPlayerSpec.hpp" -// Forward declaration of `HybridVideoPlayerSpecCxx` to properly resolve imports. -namespace NitroVideo { class HybridVideoPlayerSpecCxx; } +// Forward declaration of `HybridVideoPlayerSpec_cxx` to properly resolve imports. +namespace NitroVideo { class HybridVideoPlayerSpec_cxx; } // Forward declaration of `HybridVideoPlayerSourceSpec` to properly resolve imports. namespace margelo::nitro::video { class HybridVideoPlayerSourceSpec; } #include #include "HybridVideoPlayerSourceSpec.hpp" - -#if __has_include() -#include -#else -#error NitroModules cannot be found! Are you sure you installed NitroModules properly? -#endif +#include #include "NitroVideo-Swift-Cxx-Umbrella.hpp" namespace margelo::nitro::video { /** - * The C++ part of HybridVideoPlayerSpecCxx.swift. + * The C++ part of HybridVideoPlayerSpec_cxx.swift. * - * HybridVideoPlayerSpecSwift (C++) accesses HybridVideoPlayerSpecCxx (Swift), and might + * HybridVideoPlayerSpecSwift (C++) accesses HybridVideoPlayerSpec_cxx (Swift), and might * contain some additional bridging code for C++ <> Swift interop. * * Since this obviously introduces an overhead, I hope at some point in - * the future, HybridVideoPlayerSpecCxx can directly inherit from the C++ class HybridVideoPlayerSpec + * the future, HybridVideoPlayerSpec_cxx can directly inherit from the C++ class HybridVideoPlayerSpec * to simplify the whole structure and memory management. */ class HybridVideoPlayerSpecSwift: public virtual HybridVideoPlayerSpec { public: // Constructor from a Swift instance - explicit HybridVideoPlayerSpecSwift(const NitroVideo::HybridVideoPlayerSpecCxx& swiftPart): + explicit HybridVideoPlayerSpecSwift(const NitroVideo::HybridVideoPlayerSpec_cxx& swiftPart): HybridObject(HybridVideoPlayerSpec::TAG), _swiftPart(swiftPart) { } public: // Get the Swift part - inline NitroVideo::HybridVideoPlayerSpecCxx getSwiftPart() noexcept { return _swiftPart; } + inline NitroVideo::HybridVideoPlayerSpec_cxx getSwiftPart() noexcept { return _swiftPart; } public: // Get memory pressure @@ -61,8 +56,8 @@ namespace margelo::nitro::video { auto __result = _swiftPart.getSource(); return __result; } - inline void setSource(const std::shared_ptr& source) noexcept override { - _swiftPart.setSource(source); + inline double getDuration() noexcept override { + return _swiftPart.getDuration(); } inline double getVolume() noexcept override { return _swiftPart.getVolume(); @@ -76,21 +71,40 @@ namespace margelo::nitro::video { inline void setCurrentTime(double currentTime) noexcept override { _swiftPart.setCurrentTime(std::forward(currentTime)); } - inline double getDuration() noexcept override { - return _swiftPart.getDuration(); - } public: // Methods + inline std::shared_ptr> preload() override { + auto __result = _swiftPart.preload(); + if (__result.hasError()) [[unlikely]] { + std::rethrow_exception(__result.error()); + } + auto __value = std::move(__result.value()); + return __value; + } inline void play() override { - _swiftPart.play(); + auto __result = _swiftPart.play(); + if (__result.hasError()) [[unlikely]] { + std::rethrow_exception(__result.error()); + } } inline void pause() override { - _swiftPart.pause(); + auto __result = _swiftPart.pause(); + if (__result.hasError()) [[unlikely]] { + std::rethrow_exception(__result.error()); + } + } + inline std::shared_ptr> replaceSourceAsync(const std::shared_ptr& source) override { + auto __result = _swiftPart.replaceSourceAsync(source); + if (__result.hasError()) [[unlikely]] { + std::rethrow_exception(__result.error()); + } + auto __value = std::move(__result.value()); + return __value; } private: - NitroVideo::HybridVideoPlayerSpecCxx _swiftPart; + NitroVideo::HybridVideoPlayerSpec_cxx _swiftPart; }; } // namespace margelo::nitro::video diff --git a/nitrogen/generated/ios/c++/HybridVideoViewViewManagerFactorySpecSwift.cpp b/nitrogen/generated/ios/c++/HybridVideoViewViewManagerFactorySpecSwift.cpp index b29d329d..4e0fa316 100644 --- a/nitrogen/generated/ios/c++/HybridVideoViewViewManagerFactorySpecSwift.cpp +++ b/nitrogen/generated/ios/c++/HybridVideoViewViewManagerFactorySpecSwift.cpp @@ -2,7 +2,7 @@ /// HybridVideoViewViewManagerFactorySpecSwift.cpp /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro -/// Copyright © 2024 Marc Rousavy @ Margelo +/// Copyright © 2025 Marc Rousavy @ Margelo /// #include "HybridVideoViewViewManagerFactorySpecSwift.hpp" diff --git a/nitrogen/generated/ios/c++/HybridVideoViewViewManagerFactorySpecSwift.hpp b/nitrogen/generated/ios/c++/HybridVideoViewViewManagerFactorySpecSwift.hpp index bc5bb29e..a68cf012 100644 --- a/nitrogen/generated/ios/c++/HybridVideoViewViewManagerFactorySpecSwift.hpp +++ b/nitrogen/generated/ios/c++/HybridVideoViewViewManagerFactorySpecSwift.hpp @@ -2,15 +2,15 @@ /// HybridVideoViewViewManagerFactorySpecSwift.hpp /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro -/// Copyright © 2024 Marc Rousavy @ Margelo +/// Copyright © 2025 Marc Rousavy @ Margelo /// #pragma once #include "HybridVideoViewViewManagerFactorySpec.hpp" -// Forward declaration of `HybridVideoViewViewManagerFactorySpecCxx` to properly resolve imports. -namespace NitroVideo { class HybridVideoViewViewManagerFactorySpecCxx; } +// Forward declaration of `HybridVideoViewViewManagerFactorySpec_cxx` to properly resolve imports. +namespace NitroVideo { class HybridVideoViewViewManagerFactorySpec_cxx; } // Forward declaration of `HybridVideoViewViewManagerSpec` to properly resolve imports. namespace margelo::nitro::video { class HybridVideoViewViewManagerSpec; } @@ -18,36 +18,30 @@ namespace margelo::nitro::video { class HybridVideoViewViewManagerSpec; } #include #include "HybridVideoViewViewManagerSpec.hpp" -#if __has_include() -#include -#else -#error NitroModules cannot be found! Are you sure you installed NitroModules properly? -#endif - #include "NitroVideo-Swift-Cxx-Umbrella.hpp" namespace margelo::nitro::video { /** - * The C++ part of HybridVideoViewViewManagerFactorySpecCxx.swift. + * The C++ part of HybridVideoViewViewManagerFactorySpec_cxx.swift. * - * HybridVideoViewViewManagerFactorySpecSwift (C++) accesses HybridVideoViewViewManagerFactorySpecCxx (Swift), and might + * HybridVideoViewViewManagerFactorySpecSwift (C++) accesses HybridVideoViewViewManagerFactorySpec_cxx (Swift), and might * contain some additional bridging code for C++ <> Swift interop. * * Since this obviously introduces an overhead, I hope at some point in - * the future, HybridVideoViewViewManagerFactorySpecCxx can directly inherit from the C++ class HybridVideoViewViewManagerFactorySpec + * the future, HybridVideoViewViewManagerFactorySpec_cxx can directly inherit from the C++ class HybridVideoViewViewManagerFactorySpec * to simplify the whole structure and memory management. */ class HybridVideoViewViewManagerFactorySpecSwift: public virtual HybridVideoViewViewManagerFactorySpec { public: // Constructor from a Swift instance - explicit HybridVideoViewViewManagerFactorySpecSwift(const NitroVideo::HybridVideoViewViewManagerFactorySpecCxx& swiftPart): + explicit HybridVideoViewViewManagerFactorySpecSwift(const NitroVideo::HybridVideoViewViewManagerFactorySpec_cxx& swiftPart): HybridObject(HybridVideoViewViewManagerFactorySpec::TAG), _swiftPart(swiftPart) { } public: // Get the Swift part - inline NitroVideo::HybridVideoViewViewManagerFactorySpecCxx getSwiftPart() noexcept { return _swiftPart; } + inline NitroVideo::HybridVideoViewViewManagerFactorySpec_cxx getSwiftPart() noexcept { return _swiftPart; } public: // Get memory pressure @@ -63,11 +57,15 @@ namespace margelo::nitro::video { // Methods inline std::shared_ptr createViewManager(double nitroId) override { auto __result = _swiftPart.createViewManager(std::forward(nitroId)); - return __result; + if (__result.hasError()) [[unlikely]] { + std::rethrow_exception(__result.error()); + } + auto __value = std::move(__result.value()); + return __value; } private: - NitroVideo::HybridVideoViewViewManagerFactorySpecCxx _swiftPart; + NitroVideo::HybridVideoViewViewManagerFactorySpec_cxx _swiftPart; }; } // namespace margelo::nitro::video diff --git a/nitrogen/generated/ios/c++/HybridVideoViewViewManagerSpecSwift.cpp b/nitrogen/generated/ios/c++/HybridVideoViewViewManagerSpecSwift.cpp index d0b1d6fe..e004cc59 100644 --- a/nitrogen/generated/ios/c++/HybridVideoViewViewManagerSpecSwift.cpp +++ b/nitrogen/generated/ios/c++/HybridVideoViewViewManagerSpecSwift.cpp @@ -2,7 +2,7 @@ /// HybridVideoViewViewManagerSpecSwift.cpp /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro -/// Copyright © 2024 Marc Rousavy @ Margelo +/// Copyright © 2025 Marc Rousavy @ Margelo /// #include "HybridVideoViewViewManagerSpecSwift.hpp" diff --git a/nitrogen/generated/ios/c++/HybridVideoViewViewManagerSpecSwift.hpp b/nitrogen/generated/ios/c++/HybridVideoViewViewManagerSpecSwift.hpp index c3312f22..68810981 100644 --- a/nitrogen/generated/ios/c++/HybridVideoViewViewManagerSpecSwift.hpp +++ b/nitrogen/generated/ios/c++/HybridVideoViewViewManagerSpecSwift.hpp @@ -2,15 +2,15 @@ /// HybridVideoViewViewManagerSpecSwift.hpp /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro -/// Copyright © 2024 Marc Rousavy @ Margelo +/// Copyright © 2025 Marc Rousavy @ Margelo /// #pragma once #include "HybridVideoViewViewManagerSpec.hpp" -// Forward declaration of `HybridVideoViewViewManagerSpecCxx` to properly resolve imports. -namespace NitroVideo { class HybridVideoViewViewManagerSpecCxx; } +// Forward declaration of `HybridVideoViewViewManagerSpec_cxx` to properly resolve imports. +namespace NitroVideo { class HybridVideoViewViewManagerSpec_cxx; } // Forward declaration of `HybridVideoPlayerSpec` to properly resolve imports. namespace margelo::nitro::video { class HybridVideoPlayerSpec; } @@ -19,36 +19,30 @@ namespace margelo::nitro::video { class HybridVideoPlayerSpec; } #include #include "HybridVideoPlayerSpec.hpp" -#if __has_include() -#include -#else -#error NitroModules cannot be found! Are you sure you installed NitroModules properly? -#endif - #include "NitroVideo-Swift-Cxx-Umbrella.hpp" namespace margelo::nitro::video { /** - * The C++ part of HybridVideoViewViewManagerSpecCxx.swift. + * The C++ part of HybridVideoViewViewManagerSpec_cxx.swift. * - * HybridVideoViewViewManagerSpecSwift (C++) accesses HybridVideoViewViewManagerSpecCxx (Swift), and might + * HybridVideoViewViewManagerSpecSwift (C++) accesses HybridVideoViewViewManagerSpec_cxx (Swift), and might * contain some additional bridging code for C++ <> Swift interop. * * Since this obviously introduces an overhead, I hope at some point in - * the future, HybridVideoViewViewManagerSpecCxx can directly inherit from the C++ class HybridVideoViewViewManagerSpec + * the future, HybridVideoViewViewManagerSpec_cxx can directly inherit from the C++ class HybridVideoViewViewManagerSpec * to simplify the whole structure and memory management. */ class HybridVideoViewViewManagerSpecSwift: public virtual HybridVideoViewViewManagerSpec { public: // Constructor from a Swift instance - explicit HybridVideoViewViewManagerSpecSwift(const NitroVideo::HybridVideoViewViewManagerSpecCxx& swiftPart): + explicit HybridVideoViewViewManagerSpecSwift(const NitroVideo::HybridVideoViewViewManagerSpec_cxx& swiftPart): HybridObject(HybridVideoViewViewManagerSpec::TAG), _swiftPart(swiftPart) { } public: // Get the Swift part - inline NitroVideo::HybridVideoViewViewManagerSpecCxx getSwiftPart() noexcept { return _swiftPart; } + inline NitroVideo::HybridVideoViewViewManagerSpec_cxx getSwiftPart() noexcept { return _swiftPart; } public: // Get memory pressure @@ -71,7 +65,7 @@ namespace margelo::nitro::video { private: - NitroVideo::HybridVideoViewViewManagerSpecCxx _swiftPart; + NitroVideo::HybridVideoViewViewManagerSpec_cxx _swiftPart; }; } // namespace margelo::nitro::video diff --git a/nitrogen/generated/ios/swift/Func_void.swift b/nitrogen/generated/ios/swift/Func_void.swift new file mode 100644 index 00000000..f1976e1f --- /dev/null +++ b/nitrogen/generated/ios/swift/Func_void.swift @@ -0,0 +1,46 @@ +/// +/// Func_void.swift +/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. +/// https://github.com/mrousavy/nitro +/// Copyright © 2025 Marc Rousavy @ Margelo +/// + +import NitroModules + +/** + * Wraps a Swift `() -> Void` as a class. + * This class can be used from C++, e.g. to wrap the Swift closure as a `std::function`. + */ +public final class Func_void { + public typealias bridge = margelo.nitro.video.bridge.swift + + private let closure: () -> Void + + public init(_ closure: @escaping () -> Void) { + self.closure = closure + } + + @inline(__always) + public func call() -> Void { + self.closure() + } + + /** + * Casts this instance to a retained unsafe raw pointer. + * This acquires one additional strong reference on the object! + */ + @inline(__always) + public func toUnsafe() -> UnsafeMutableRawPointer { + return Unmanaged.passRetained(self).toOpaque() + } + + /** + * Casts an unsafe pointer to a `Func_void`. + * The pointer has to be a retained opaque `Unmanaged`. + * This removes one strong reference from the object! + */ + @inline(__always) + public static func fromUnsafe(_ pointer: UnsafeMutableRawPointer) -> Func_void { + return Unmanaged.fromOpaque(pointer).takeRetainedValue() + } +} diff --git a/nitrogen/generated/ios/swift/Func_void_VideoInformation.swift b/nitrogen/generated/ios/swift/Func_void_VideoInformation.swift new file mode 100644 index 00000000..46eacb09 --- /dev/null +++ b/nitrogen/generated/ios/swift/Func_void_VideoInformation.swift @@ -0,0 +1,46 @@ +/// +/// Func_void_VideoInformation.swift +/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. +/// https://github.com/mrousavy/nitro +/// Copyright © 2025 Marc Rousavy @ Margelo +/// + +import NitroModules + +/** + * Wraps a Swift `(_ value: VideoInformation) -> Void` as a class. + * This class can be used from C++, e.g. to wrap the Swift closure as a `std::function`. + */ +public final class Func_void_VideoInformation { + public typealias bridge = margelo.nitro.video.bridge.swift + + private let closure: (_ value: VideoInformation) -> Void + + public init(_ closure: @escaping (_ value: VideoInformation) -> Void) { + self.closure = closure + } + + @inline(__always) + public func call(value: VideoInformation) -> Void { + self.closure(value) + } + + /** + * Casts this instance to a retained unsafe raw pointer. + * This acquires one additional strong reference on the object! + */ + @inline(__always) + public func toUnsafe() -> UnsafeMutableRawPointer { + return Unmanaged.passRetained(self).toOpaque() + } + + /** + * Casts an unsafe pointer to a `Func_void_VideoInformation`. + * The pointer has to be a retained opaque `Unmanaged`. + * This removes one strong reference from the object! + */ + @inline(__always) + public static func fromUnsafe(_ pointer: UnsafeMutableRawPointer) -> Func_void_VideoInformation { + return Unmanaged.fromOpaque(pointer).takeRetainedValue() + } +} diff --git a/nitrogen/generated/ios/swift/Func_void_std__exception_ptr.swift b/nitrogen/generated/ios/swift/Func_void_std__exception_ptr.swift new file mode 100644 index 00000000..5af7c948 --- /dev/null +++ b/nitrogen/generated/ios/swift/Func_void_std__exception_ptr.swift @@ -0,0 +1,46 @@ +/// +/// Func_void_std__exception_ptr.swift +/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. +/// https://github.com/mrousavy/nitro +/// Copyright © 2025 Marc Rousavy @ Margelo +/// + +import NitroModules + +/** + * Wraps a Swift `(_ error: Error) -> Void` as a class. + * This class can be used from C++, e.g. to wrap the Swift closure as a `std::function`. + */ +public final class Func_void_std__exception_ptr { + public typealias bridge = margelo.nitro.video.bridge.swift + + private let closure: (_ error: Error) -> Void + + public init(_ closure: @escaping (_ error: Error) -> Void) { + self.closure = closure + } + + @inline(__always) + public func call(error: std.exception_ptr) -> Void { + self.closure(RuntimeError.from(cppError: error)) + } + + /** + * Casts this instance to a retained unsafe raw pointer. + * This acquires one additional strong reference on the object! + */ + @inline(__always) + public func toUnsafe() -> UnsafeMutableRawPointer { + return Unmanaged.passRetained(self).toOpaque() + } + + /** + * Casts an unsafe pointer to a `Func_void_std__exception_ptr`. + * The pointer has to be a retained opaque `Unmanaged`. + * This removes one strong reference from the object! + */ + @inline(__always) + public static func fromUnsafe(_ pointer: UnsafeMutableRawPointer) -> Func_void_std__exception_ptr { + return Unmanaged.fromOpaque(pointer).takeRetainedValue() + } +} diff --git a/nitrogen/generated/ios/swift/HybridVideoPlayerFactorySpec.swift b/nitrogen/generated/ios/swift/HybridVideoPlayerFactorySpec.swift index 914582de..cd7e842b 100644 --- a/nitrogen/generated/ios/swift/HybridVideoPlayerFactorySpec.swift +++ b/nitrogen/generated/ios/swift/HybridVideoPlayerFactorySpec.swift @@ -2,35 +2,48 @@ /// HybridVideoPlayerFactorySpec.swift /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro -/// Copyright © 2024 Marc Rousavy @ Margelo +/// Copyright © 2025 Marc Rousavy @ Margelo /// import Foundation import NitroModules -/** - * A Swift protocol representing the VideoPlayerFactory HybridObject. - * Implement this protocol to create Swift-based instances of VideoPlayerFactory. - * - * When implementing this protocol, make sure to initialize `hybridContext` - example: - * ``` - * public class HybridVideoPlayerFactory : HybridVideoPlayerFactorySpec { - * // Initialize HybridContext - * var hybridContext = margelo.nitro.HybridContext() - * - * // Return size of the instance to inform JS GC about memory pressure - * var memorySize: Int { - * return getSizeOf(self) - * } - * - * // ... - * } - * ``` - */ -public protocol HybridVideoPlayerFactorySpec: AnyObject, HybridObjectSpec { +/// See ``HybridVideoPlayerFactorySpec`` +public protocol HybridVideoPlayerFactorySpec_protocol: AnyObject { // Properties // Methods func createPlayer(source: (any HybridVideoPlayerSourceSpec)) throws -> (any HybridVideoPlayerSpec) } + +/// See ``HybridVideoPlayerFactorySpec`` +public class HybridVideoPlayerFactorySpec_base: HybridObjectSpec { + private weak var cxxWrapper: HybridVideoPlayerFactorySpec_cxx? = nil + public func getCxxWrapper() -> HybridVideoPlayerFactorySpec_cxx { + #if DEBUG + guard self is HybridVideoPlayerFactorySpec else { + fatalError("`self` is not a `HybridVideoPlayerFactorySpec`! Did you accidentally inherit from `HybridVideoPlayerFactorySpec_base` instead of `HybridVideoPlayerFactorySpec`?") + } + #endif + if let cxxWrapper = self.cxxWrapper { + return cxxWrapper + } else { + let cxxWrapper = HybridVideoPlayerFactorySpec_cxx(self as! HybridVideoPlayerFactorySpec) + self.cxxWrapper = cxxWrapper + return cxxWrapper + } + } + public var memorySize: Int { return 0 } +} + +/** + * A Swift base-protocol representing the VideoPlayerFactory HybridObject. + * Implement this protocol to create Swift-based instances of VideoPlayerFactory. + * ```swift + * class HybridVideoPlayerFactory : HybridVideoPlayerFactorySpec { + * // ... + * } + * ``` + */ +public typealias HybridVideoPlayerFactorySpec = HybridVideoPlayerFactorySpec_protocol & HybridVideoPlayerFactorySpec_base diff --git a/nitrogen/generated/ios/swift/HybridVideoPlayerFactorySpecCxx.swift b/nitrogen/generated/ios/swift/HybridVideoPlayerFactorySpec_cxx.swift similarity index 50% rename from nitrogen/generated/ios/swift/HybridVideoPlayerFactorySpecCxx.swift rename to nitrogen/generated/ios/swift/HybridVideoPlayerFactorySpec_cxx.swift index 6dea81a2..c6f2bbed 100644 --- a/nitrogen/generated/ios/swift/HybridVideoPlayerFactorySpecCxx.swift +++ b/nitrogen/generated/ios/swift/HybridVideoPlayerFactorySpec_cxx.swift @@ -1,37 +1,13 @@ /// -/// HybridVideoPlayerFactorySpecCxx.swift +/// HybridVideoPlayerFactorySpec_cxx.swift /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro -/// Copyright © 2024 Marc Rousavy @ Margelo +/// Copyright © 2025 Marc Rousavy @ Margelo /// import Foundation import NitroModules -/** - * Helper class for converting instances of `HybridVideoPlayerFactorySpecCxx` from- and to unsafe pointers. - * This is useful to pass Swift classes to C++, without having to strongly type the C++ function signature. - * The actual Swift type can be included in the .cpp file, without having to forward-declare anything in .hpp. - */ -public final class HybridVideoPlayerFactorySpecCxxUnsafe { - /** - * Casts a `HybridVideoPlayerFactorySpecCxx` instance to a retained unsafe raw pointer. - * This acquires one additional strong reference on the object! - */ - public static func toUnsafe(_ instance: HybridVideoPlayerFactorySpecCxx) -> UnsafeMutableRawPointer { - return Unmanaged.passRetained(instance).toOpaque() - } - - /** - * Casts an unsafe pointer to a `HybridVideoPlayerFactorySpecCxx`. - * The pointer has to be a retained opaque `Unmanaged`. - * This removes one strong reference from the object! - */ - public static func fromUnsafe(_ pointer: UnsafeMutableRawPointer) -> HybridVideoPlayerFactorySpecCxx { - return Unmanaged.fromOpaque(pointer).takeRetainedValue() - } -} - /** * A class implementation that bridges HybridVideoPlayerFactorySpec over to C++. * In C++, we cannot use Swift protocols - so we need to wrap it in a class to make it strongly defined. @@ -41,7 +17,7 @@ public final class HybridVideoPlayerFactorySpecCxxUnsafe { * - Other HybridObjects need to be wrapped/unwrapped from the Swift TCxx wrapper * - Throwing methods need to be wrapped with a Result type, as exceptions cannot be propagated to C++ */ -public class HybridVideoPlayerFactorySpecCxx { +public class HybridVideoPlayerFactorySpec_cxx { /** * The Swift <> C++ bridge's namespace (`margelo::nitro::video::bridge::swift`) * from `NitroVideo-Swift-Cxx-Bridge.hpp`. @@ -55,11 +31,17 @@ public class HybridVideoPlayerFactorySpecCxx { private var __implementation: any HybridVideoPlayerFactorySpec /** - * Create a new `HybridVideoPlayerFactorySpecCxx` that wraps the given `HybridVideoPlayerFactorySpec`. + * Holds a weak pointer to the C++ class that wraps the Swift class. + */ + private var __cxxPart: bridge.std__weak_ptr_margelo__nitro__video__HybridVideoPlayerFactorySpec_ + + /** + * Create a new `HybridVideoPlayerFactorySpec_cxx` that wraps the given `HybridVideoPlayerFactorySpec`. * All properties and methods bridge to C++ types. */ - public init(_ implementation: some HybridVideoPlayerFactorySpec) { + public init(_ implementation: any HybridVideoPlayerFactorySpec) { self.__implementation = implementation + self.__cxxPart = .init() /* no base class */ } @@ -72,26 +54,46 @@ public class HybridVideoPlayerFactorySpecCxx { } /** - * Contains a (weak) reference to the C++ HybridObject to cache it. + * Casts this instance to a retained unsafe raw pointer. + * This acquires one additional strong reference on the object! */ - public var hybridContext: margelo.nitro.HybridContext { - @inline(__always) - get { - return self.__implementation.hybridContext - } - @inline(__always) - set { - self.__implementation.hybridContext = newValue + public func toUnsafe() -> UnsafeMutableRawPointer { + return Unmanaged.passRetained(self).toOpaque() + } + + /** + * Casts an unsafe pointer to a `HybridVideoPlayerFactorySpec_cxx`. + * The pointer has to be a retained opaque `Unmanaged`. + * This removes one strong reference from the object! + */ + public class func fromUnsafe(_ pointer: UnsafeMutableRawPointer) -> HybridVideoPlayerFactorySpec_cxx { + return Unmanaged.fromOpaque(pointer).takeRetainedValue() + } + + /** + * Gets (or creates) the C++ part of this Hybrid Object. + * The C++ part is a `std::shared_ptr`. + */ + public func getCxxPart() -> bridge.std__shared_ptr_margelo__nitro__video__HybridVideoPlayerFactorySpec_ { + let cachedCxxPart = self.__cxxPart.lock() + if cachedCxxPart.__convertToBool() { + return cachedCxxPart + } else { + let newCxxPart = bridge.create_std__shared_ptr_margelo__nitro__video__HybridVideoPlayerFactorySpec_(self.toUnsafe()) + __cxxPart = bridge.weakify_std__shared_ptr_margelo__nitro__video__HybridVideoPlayerFactorySpec_(newCxxPart) + return newCxxPart } } + + /** * Get the memory size of the Swift class (plus size of any other allocations) * so the JS VM can properly track it and garbage-collect the JS object if needed. */ @inline(__always) public var memorySize: Int { - return self.__implementation.memorySize + return MemoryHelper.getSizeOf(self.__implementation) + self.__implementation.memorySize } // Properties @@ -99,21 +101,21 @@ public class HybridVideoPlayerFactorySpecCxx { // Methods @inline(__always) - public func createPlayer(source: bridge.std__shared_ptr_margelo__nitro__video__HybridVideoPlayerSourceSpec_) -> bridge.std__shared_ptr_margelo__nitro__video__HybridVideoPlayerSpec_ { + public func createPlayer(source: bridge.std__shared_ptr_margelo__nitro__video__HybridVideoPlayerSourceSpec_) -> bridge.Result_std__shared_ptr_margelo__nitro__video__HybridVideoPlayerSpec__ { do { let __result = try self.__implementation.createPlayer(source: { () -> HybridVideoPlayerSourceSpec in let __unsafePointer = bridge.get_std__shared_ptr_margelo__nitro__video__HybridVideoPlayerSourceSpec_(source) - let __instance = HybridVideoPlayerSourceSpecCxxUnsafe.fromUnsafe(__unsafePointer) + let __instance = HybridVideoPlayerSourceSpec_cxx.fromUnsafe(__unsafePointer) return __instance.getHybridVideoPlayerSourceSpec() }()) - return { () -> bridge.std__shared_ptr_margelo__nitro__video__HybridVideoPlayerSpec_ in - let __cxxWrapped = HybridVideoPlayerSpecCxx(__result) - let __pointer = HybridVideoPlayerSpecCxxUnsafe.toUnsafe(__cxxWrapped) - return bridge.create_std__shared_ptr_margelo__nitro__video__HybridVideoPlayerSpec_(__pointer) + let __resultCpp = { () -> bridge.std__shared_ptr_margelo__nitro__video__HybridVideoPlayerSpec_ in + let __cxxWrapped = __result.getCxxWrapper() + return __cxxWrapped.getCxxPart() }() - } catch { - let __message = "\(error.localizedDescription)" - fatalError("Swift errors can currently not be propagated to C++! See https://github.com/swiftlang/swift/issues/75290 (Error: \(__message))") + return bridge.create_Result_std__shared_ptr_margelo__nitro__video__HybridVideoPlayerSpec__(__resultCpp) + } catch (let __error) { + let __exceptionPtr = __error.toCpp() + return bridge.create_Result_std__shared_ptr_margelo__nitro__video__HybridVideoPlayerSpec__(__exceptionPtr) } } } diff --git a/nitrogen/generated/ios/swift/HybridVideoPlayerSourceFactorySpec.swift b/nitrogen/generated/ios/swift/HybridVideoPlayerSourceFactorySpec.swift index cda73c55..3360096d 100644 --- a/nitrogen/generated/ios/swift/HybridVideoPlayerSourceFactorySpec.swift +++ b/nitrogen/generated/ios/swift/HybridVideoPlayerSourceFactorySpec.swift @@ -2,35 +2,48 @@ /// HybridVideoPlayerSourceFactorySpec.swift /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro -/// Copyright © 2024 Marc Rousavy @ Margelo +/// Copyright © 2025 Marc Rousavy @ Margelo /// import Foundation import NitroModules -/** - * A Swift protocol representing the VideoPlayerSourceFactory HybridObject. - * Implement this protocol to create Swift-based instances of VideoPlayerSourceFactory. - * - * When implementing this protocol, make sure to initialize `hybridContext` - example: - * ``` - * public class HybridVideoPlayerSourceFactory : HybridVideoPlayerSourceFactorySpec { - * // Initialize HybridContext - * var hybridContext = margelo.nitro.HybridContext() - * - * // Return size of the instance to inform JS GC about memory pressure - * var memorySize: Int { - * return getSizeOf(self) - * } - * - * // ... - * } - * ``` - */ -public protocol HybridVideoPlayerSourceFactorySpec: AnyObject, HybridObjectSpec { +/// See ``HybridVideoPlayerSourceFactorySpec`` +public protocol HybridVideoPlayerSourceFactorySpec_protocol: AnyObject { // Properties // Methods func fromUri(uri: String) throws -> (any HybridVideoPlayerSourceSpec) } + +/// See ``HybridVideoPlayerSourceFactorySpec`` +public class HybridVideoPlayerSourceFactorySpec_base: HybridObjectSpec { + private weak var cxxWrapper: HybridVideoPlayerSourceFactorySpec_cxx? = nil + public func getCxxWrapper() -> HybridVideoPlayerSourceFactorySpec_cxx { + #if DEBUG + guard self is HybridVideoPlayerSourceFactorySpec else { + fatalError("`self` is not a `HybridVideoPlayerSourceFactorySpec`! Did you accidentally inherit from `HybridVideoPlayerSourceFactorySpec_base` instead of `HybridVideoPlayerSourceFactorySpec`?") + } + #endif + if let cxxWrapper = self.cxxWrapper { + return cxxWrapper + } else { + let cxxWrapper = HybridVideoPlayerSourceFactorySpec_cxx(self as! HybridVideoPlayerSourceFactorySpec) + self.cxxWrapper = cxxWrapper + return cxxWrapper + } + } + public var memorySize: Int { return 0 } +} + +/** + * A Swift base-protocol representing the VideoPlayerSourceFactory HybridObject. + * Implement this protocol to create Swift-based instances of VideoPlayerSourceFactory. + * ```swift + * class HybridVideoPlayerSourceFactory : HybridVideoPlayerSourceFactorySpec { + * // ... + * } + * ``` + */ +public typealias HybridVideoPlayerSourceFactorySpec = HybridVideoPlayerSourceFactorySpec_protocol & HybridVideoPlayerSourceFactorySpec_base diff --git a/nitrogen/generated/ios/swift/HybridVideoPlayerSourceFactorySpecCxx.swift b/nitrogen/generated/ios/swift/HybridVideoPlayerSourceFactorySpecCxx.swift deleted file mode 100644 index 28a8e799..00000000 --- a/nitrogen/generated/ios/swift/HybridVideoPlayerSourceFactorySpecCxx.swift +++ /dev/null @@ -1,115 +0,0 @@ -/// -/// HybridVideoPlayerSourceFactorySpecCxx.swift -/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. -/// https://github.com/mrousavy/nitro -/// Copyright © 2024 Marc Rousavy @ Margelo -/// - -import Foundation -import NitroModules - -/** - * Helper class for converting instances of `HybridVideoPlayerSourceFactorySpecCxx` from- and to unsafe pointers. - * This is useful to pass Swift classes to C++, without having to strongly type the C++ function signature. - * The actual Swift type can be included in the .cpp file, without having to forward-declare anything in .hpp. - */ -public final class HybridVideoPlayerSourceFactorySpecCxxUnsafe { - /** - * Casts a `HybridVideoPlayerSourceFactorySpecCxx` instance to a retained unsafe raw pointer. - * This acquires one additional strong reference on the object! - */ - public static func toUnsafe(_ instance: HybridVideoPlayerSourceFactorySpecCxx) -> UnsafeMutableRawPointer { - return Unmanaged.passRetained(instance).toOpaque() - } - - /** - * Casts an unsafe pointer to a `HybridVideoPlayerSourceFactorySpecCxx`. - * The pointer has to be a retained opaque `Unmanaged`. - * This removes one strong reference from the object! - */ - public static func fromUnsafe(_ pointer: UnsafeMutableRawPointer) -> HybridVideoPlayerSourceFactorySpecCxx { - return Unmanaged.fromOpaque(pointer).takeRetainedValue() - } -} - -/** - * A class implementation that bridges HybridVideoPlayerSourceFactorySpec over to C++. - * In C++, we cannot use Swift protocols - so we need to wrap it in a class to make it strongly defined. - * - * Also, some Swift types need to be bridged with special handling: - * - Enums need to be wrapped in Structs, otherwise they cannot be accessed bi-directionally (Swift bug: https://github.com/swiftlang/swift/issues/75330) - * - Other HybridObjects need to be wrapped/unwrapped from the Swift TCxx wrapper - * - Throwing methods need to be wrapped with a Result type, as exceptions cannot be propagated to C++ - */ -public class HybridVideoPlayerSourceFactorySpecCxx { - /** - * The Swift <> C++ bridge's namespace (`margelo::nitro::video::bridge::swift`) - * from `NitroVideo-Swift-Cxx-Bridge.hpp`. - * This contains specialized C++ templates, and C++ helper functions that can be accessed from Swift. - */ - public typealias bridge = margelo.nitro.video.bridge.swift - - /** - * Holds an instance of the `HybridVideoPlayerSourceFactorySpec` Swift protocol. - */ - private var __implementation: any HybridVideoPlayerSourceFactorySpec - - /** - * Create a new `HybridVideoPlayerSourceFactorySpecCxx` that wraps the given `HybridVideoPlayerSourceFactorySpec`. - * All properties and methods bridge to C++ types. - */ - public init(_ implementation: some HybridVideoPlayerSourceFactorySpec) { - self.__implementation = implementation - /* no base class */ - } - - /** - * Get the actual `HybridVideoPlayerSourceFactorySpec` instance this class wraps. - */ - @inline(__always) - public func getHybridVideoPlayerSourceFactorySpec() -> any HybridVideoPlayerSourceFactorySpec { - return __implementation - } - - /** - * Contains a (weak) reference to the C++ HybridObject to cache it. - */ - public var hybridContext: margelo.nitro.HybridContext { - @inline(__always) - get { - return self.__implementation.hybridContext - } - @inline(__always) - set { - self.__implementation.hybridContext = newValue - } - } - - /** - * Get the memory size of the Swift class (plus size of any other allocations) - * so the JS VM can properly track it and garbage-collect the JS object if needed. - */ - @inline(__always) - public var memorySize: Int { - return self.__implementation.memorySize - } - - // Properties - - - // Methods - @inline(__always) - public func fromUri(uri: std.string) -> bridge.std__shared_ptr_margelo__nitro__video__HybridVideoPlayerSourceSpec_ { - do { - let __result = try self.__implementation.fromUri(uri: String(uri)) - return { () -> bridge.std__shared_ptr_margelo__nitro__video__HybridVideoPlayerSourceSpec_ in - let __cxxWrapped = HybridVideoPlayerSourceSpecCxx(__result) - let __pointer = HybridVideoPlayerSourceSpecCxxUnsafe.toUnsafe(__cxxWrapped) - return bridge.create_std__shared_ptr_margelo__nitro__video__HybridVideoPlayerSourceSpec_(__pointer) - }() - } catch { - let __message = "\(error.localizedDescription)" - fatalError("Swift errors can currently not be propagated to C++! See https://github.com/swiftlang/swift/issues/75290 (Error: \(__message))") - } - } -} diff --git a/nitrogen/generated/ios/swift/HybridVideoPlayerSourceFactorySpec_cxx.swift b/nitrogen/generated/ios/swift/HybridVideoPlayerSourceFactorySpec_cxx.swift new file mode 100644 index 00000000..622ebfca --- /dev/null +++ b/nitrogen/generated/ios/swift/HybridVideoPlayerSourceFactorySpec_cxx.swift @@ -0,0 +1,117 @@ +/// +/// HybridVideoPlayerSourceFactorySpec_cxx.swift +/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. +/// https://github.com/mrousavy/nitro +/// Copyright © 2025 Marc Rousavy @ Margelo +/// + +import Foundation +import NitroModules + +/** + * A class implementation that bridges HybridVideoPlayerSourceFactorySpec over to C++. + * In C++, we cannot use Swift protocols - so we need to wrap it in a class to make it strongly defined. + * + * Also, some Swift types need to be bridged with special handling: + * - Enums need to be wrapped in Structs, otherwise they cannot be accessed bi-directionally (Swift bug: https://github.com/swiftlang/swift/issues/75330) + * - Other HybridObjects need to be wrapped/unwrapped from the Swift TCxx wrapper + * - Throwing methods need to be wrapped with a Result type, as exceptions cannot be propagated to C++ + */ +public class HybridVideoPlayerSourceFactorySpec_cxx { + /** + * The Swift <> C++ bridge's namespace (`margelo::nitro::video::bridge::swift`) + * from `NitroVideo-Swift-Cxx-Bridge.hpp`. + * This contains specialized C++ templates, and C++ helper functions that can be accessed from Swift. + */ + public typealias bridge = margelo.nitro.video.bridge.swift + + /** + * Holds an instance of the `HybridVideoPlayerSourceFactorySpec` Swift protocol. + */ + private var __implementation: any HybridVideoPlayerSourceFactorySpec + + /** + * Holds a weak pointer to the C++ class that wraps the Swift class. + */ + private var __cxxPart: bridge.std__weak_ptr_margelo__nitro__video__HybridVideoPlayerSourceFactorySpec_ + + /** + * Create a new `HybridVideoPlayerSourceFactorySpec_cxx` that wraps the given `HybridVideoPlayerSourceFactorySpec`. + * All properties and methods bridge to C++ types. + */ + public init(_ implementation: any HybridVideoPlayerSourceFactorySpec) { + self.__implementation = implementation + self.__cxxPart = .init() + /* no base class */ + } + + /** + * Get the actual `HybridVideoPlayerSourceFactorySpec` instance this class wraps. + */ + @inline(__always) + public func getHybridVideoPlayerSourceFactorySpec() -> any HybridVideoPlayerSourceFactorySpec { + return __implementation + } + + /** + * Casts this instance to a retained unsafe raw pointer. + * This acquires one additional strong reference on the object! + */ + public func toUnsafe() -> UnsafeMutableRawPointer { + return Unmanaged.passRetained(self).toOpaque() + } + + /** + * Casts an unsafe pointer to a `HybridVideoPlayerSourceFactorySpec_cxx`. + * The pointer has to be a retained opaque `Unmanaged`. + * This removes one strong reference from the object! + */ + public class func fromUnsafe(_ pointer: UnsafeMutableRawPointer) -> HybridVideoPlayerSourceFactorySpec_cxx { + return Unmanaged.fromOpaque(pointer).takeRetainedValue() + } + + /** + * Gets (or creates) the C++ part of this Hybrid Object. + * The C++ part is a `std::shared_ptr`. + */ + public func getCxxPart() -> bridge.std__shared_ptr_margelo__nitro__video__HybridVideoPlayerSourceFactorySpec_ { + let cachedCxxPart = self.__cxxPart.lock() + if cachedCxxPart.__convertToBool() { + return cachedCxxPart + } else { + let newCxxPart = bridge.create_std__shared_ptr_margelo__nitro__video__HybridVideoPlayerSourceFactorySpec_(self.toUnsafe()) + __cxxPart = bridge.weakify_std__shared_ptr_margelo__nitro__video__HybridVideoPlayerSourceFactorySpec_(newCxxPart) + return newCxxPart + } + } + + + + /** + * Get the memory size of the Swift class (plus size of any other allocations) + * so the JS VM can properly track it and garbage-collect the JS object if needed. + */ + @inline(__always) + public var memorySize: Int { + return MemoryHelper.getSizeOf(self.__implementation) + self.__implementation.memorySize + } + + // Properties + + + // Methods + @inline(__always) + public func fromUri(uri: std.string) -> bridge.Result_std__shared_ptr_margelo__nitro__video__HybridVideoPlayerSourceSpec__ { + do { + let __result = try self.__implementation.fromUri(uri: String(uri)) + let __resultCpp = { () -> bridge.std__shared_ptr_margelo__nitro__video__HybridVideoPlayerSourceSpec_ in + let __cxxWrapped = __result.getCxxWrapper() + return __cxxWrapped.getCxxPart() + }() + return bridge.create_Result_std__shared_ptr_margelo__nitro__video__HybridVideoPlayerSourceSpec__(__resultCpp) + } catch (let __error) { + let __exceptionPtr = __error.toCpp() + return bridge.create_Result_std__shared_ptr_margelo__nitro__video__HybridVideoPlayerSourceSpec__(__exceptionPtr) + } + } +} diff --git a/nitrogen/generated/ios/swift/HybridVideoPlayerSourceSpec.swift b/nitrogen/generated/ios/swift/HybridVideoPlayerSourceSpec.swift index cb406534..dd616fb8 100644 --- a/nitrogen/generated/ios/swift/HybridVideoPlayerSourceSpec.swift +++ b/nitrogen/generated/ios/swift/HybridVideoPlayerSourceSpec.swift @@ -2,35 +2,48 @@ /// HybridVideoPlayerSourceSpec.swift /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro -/// Copyright © 2024 Marc Rousavy @ Margelo +/// Copyright © 2025 Marc Rousavy @ Margelo /// import Foundation import NitroModules +/// See ``HybridVideoPlayerSourceSpec`` +public protocol HybridVideoPlayerSourceSpec_protocol: AnyObject { + // Properties + var uri: String { get } + + // Methods + func getAssetInformationAsync() throws -> Promise +} + +/// See ``HybridVideoPlayerSourceSpec`` +public class HybridVideoPlayerSourceSpec_base: HybridObjectSpec { + private weak var cxxWrapper: HybridVideoPlayerSourceSpec_cxx? = nil + public func getCxxWrapper() -> HybridVideoPlayerSourceSpec_cxx { + #if DEBUG + guard self is HybridVideoPlayerSourceSpec else { + fatalError("`self` is not a `HybridVideoPlayerSourceSpec`! Did you accidentally inherit from `HybridVideoPlayerSourceSpec_base` instead of `HybridVideoPlayerSourceSpec`?") + } + #endif + if let cxxWrapper = self.cxxWrapper { + return cxxWrapper + } else { + let cxxWrapper = HybridVideoPlayerSourceSpec_cxx(self as! HybridVideoPlayerSourceSpec) + self.cxxWrapper = cxxWrapper + return cxxWrapper + } + } + public var memorySize: Int { return 0 } +} + /** - * A Swift protocol representing the VideoPlayerSource HybridObject. + * A Swift base-protocol representing the VideoPlayerSource HybridObject. * Implement this protocol to create Swift-based instances of VideoPlayerSource. - * - * When implementing this protocol, make sure to initialize `hybridContext` - example: - * ``` - * public class HybridVideoPlayerSource : HybridVideoPlayerSourceSpec { - * // Initialize HybridContext - * var hybridContext = margelo.nitro.HybridContext() - * - * // Return size of the instance to inform JS GC about memory pressure - * var memorySize: Int { - * return getSizeOf(self) - * } - * + * ```swift + * class HybridVideoPlayerSource : HybridVideoPlayerSourceSpec { * // ... * } * ``` */ -public protocol HybridVideoPlayerSourceSpec: AnyObject, HybridObjectSpec { - // Properties - var uri: String { get set } - - // Methods - -} +public typealias HybridVideoPlayerSourceSpec = HybridVideoPlayerSourceSpec_protocol & HybridVideoPlayerSourceSpec_base diff --git a/nitrogen/generated/ios/swift/HybridVideoPlayerSourceSpecCxx.swift b/nitrogen/generated/ios/swift/HybridVideoPlayerSourceSpecCxx.swift deleted file mode 100644 index 8ada42e8..00000000 --- a/nitrogen/generated/ios/swift/HybridVideoPlayerSourceSpecCxx.swift +++ /dev/null @@ -1,111 +0,0 @@ -/// -/// HybridVideoPlayerSourceSpecCxx.swift -/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. -/// https://github.com/mrousavy/nitro -/// Copyright © 2024 Marc Rousavy @ Margelo -/// - -import Foundation -import NitroModules - -/** - * Helper class for converting instances of `HybridVideoPlayerSourceSpecCxx` from- and to unsafe pointers. - * This is useful to pass Swift classes to C++, without having to strongly type the C++ function signature. - * The actual Swift type can be included in the .cpp file, without having to forward-declare anything in .hpp. - */ -public final class HybridVideoPlayerSourceSpecCxxUnsafe { - /** - * Casts a `HybridVideoPlayerSourceSpecCxx` instance to a retained unsafe raw pointer. - * This acquires one additional strong reference on the object! - */ - public static func toUnsafe(_ instance: HybridVideoPlayerSourceSpecCxx) -> UnsafeMutableRawPointer { - return Unmanaged.passRetained(instance).toOpaque() - } - - /** - * Casts an unsafe pointer to a `HybridVideoPlayerSourceSpecCxx`. - * The pointer has to be a retained opaque `Unmanaged`. - * This removes one strong reference from the object! - */ - public static func fromUnsafe(_ pointer: UnsafeMutableRawPointer) -> HybridVideoPlayerSourceSpecCxx { - return Unmanaged.fromOpaque(pointer).takeRetainedValue() - } -} - -/** - * A class implementation that bridges HybridVideoPlayerSourceSpec over to C++. - * In C++, we cannot use Swift protocols - so we need to wrap it in a class to make it strongly defined. - * - * Also, some Swift types need to be bridged with special handling: - * - Enums need to be wrapped in Structs, otherwise they cannot be accessed bi-directionally (Swift bug: https://github.com/swiftlang/swift/issues/75330) - * - Other HybridObjects need to be wrapped/unwrapped from the Swift TCxx wrapper - * - Throwing methods need to be wrapped with a Result type, as exceptions cannot be propagated to C++ - */ -public class HybridVideoPlayerSourceSpecCxx { - /** - * The Swift <> C++ bridge's namespace (`margelo::nitro::video::bridge::swift`) - * from `NitroVideo-Swift-Cxx-Bridge.hpp`. - * This contains specialized C++ templates, and C++ helper functions that can be accessed from Swift. - */ - public typealias bridge = margelo.nitro.video.bridge.swift - - /** - * Holds an instance of the `HybridVideoPlayerSourceSpec` Swift protocol. - */ - private var __implementation: any HybridVideoPlayerSourceSpec - - /** - * Create a new `HybridVideoPlayerSourceSpecCxx` that wraps the given `HybridVideoPlayerSourceSpec`. - * All properties and methods bridge to C++ types. - */ - public init(_ implementation: some HybridVideoPlayerSourceSpec) { - self.__implementation = implementation - /* no base class */ - } - - /** - * Get the actual `HybridVideoPlayerSourceSpec` instance this class wraps. - */ - @inline(__always) - public func getHybridVideoPlayerSourceSpec() -> any HybridVideoPlayerSourceSpec { - return __implementation - } - - /** - * Contains a (weak) reference to the C++ HybridObject to cache it. - */ - public var hybridContext: margelo.nitro.HybridContext { - @inline(__always) - get { - return self.__implementation.hybridContext - } - @inline(__always) - set { - self.__implementation.hybridContext = newValue - } - } - - /** - * Get the memory size of the Swift class (plus size of any other allocations) - * so the JS VM can properly track it and garbage-collect the JS object if needed. - */ - @inline(__always) - public var memorySize: Int { - return self.__implementation.memorySize - } - - // Properties - public var uri: std.string { - @inline(__always) - get { - return std.string(self.__implementation.uri) - } - @inline(__always) - set { - self.__implementation.uri = String(newValue) - } - } - - // Methods - -} diff --git a/nitrogen/generated/ios/swift/HybridVideoPlayerSourceSpec_cxx.swift b/nitrogen/generated/ios/swift/HybridVideoPlayerSourceSpec_cxx.swift new file mode 100644 index 00000000..39805baf --- /dev/null +++ b/nitrogen/generated/ios/swift/HybridVideoPlayerSourceSpec_cxx.swift @@ -0,0 +1,126 @@ +/// +/// HybridVideoPlayerSourceSpec_cxx.swift +/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. +/// https://github.com/mrousavy/nitro +/// Copyright © 2025 Marc Rousavy @ Margelo +/// + +import Foundation +import NitroModules + +/** + * A class implementation that bridges HybridVideoPlayerSourceSpec over to C++. + * In C++, we cannot use Swift protocols - so we need to wrap it in a class to make it strongly defined. + * + * Also, some Swift types need to be bridged with special handling: + * - Enums need to be wrapped in Structs, otherwise they cannot be accessed bi-directionally (Swift bug: https://github.com/swiftlang/swift/issues/75330) + * - Other HybridObjects need to be wrapped/unwrapped from the Swift TCxx wrapper + * - Throwing methods need to be wrapped with a Result type, as exceptions cannot be propagated to C++ + */ +public class HybridVideoPlayerSourceSpec_cxx { + /** + * The Swift <> C++ bridge's namespace (`margelo::nitro::video::bridge::swift`) + * from `NitroVideo-Swift-Cxx-Bridge.hpp`. + * This contains specialized C++ templates, and C++ helper functions that can be accessed from Swift. + */ + public typealias bridge = margelo.nitro.video.bridge.swift + + /** + * Holds an instance of the `HybridVideoPlayerSourceSpec` Swift protocol. + */ + private var __implementation: any HybridVideoPlayerSourceSpec + + /** + * Holds a weak pointer to the C++ class that wraps the Swift class. + */ + private var __cxxPart: bridge.std__weak_ptr_margelo__nitro__video__HybridVideoPlayerSourceSpec_ + + /** + * Create a new `HybridVideoPlayerSourceSpec_cxx` that wraps the given `HybridVideoPlayerSourceSpec`. + * All properties and methods bridge to C++ types. + */ + public init(_ implementation: any HybridVideoPlayerSourceSpec) { + self.__implementation = implementation + self.__cxxPart = .init() + /* no base class */ + } + + /** + * Get the actual `HybridVideoPlayerSourceSpec` instance this class wraps. + */ + @inline(__always) + public func getHybridVideoPlayerSourceSpec() -> any HybridVideoPlayerSourceSpec { + return __implementation + } + + /** + * Casts this instance to a retained unsafe raw pointer. + * This acquires one additional strong reference on the object! + */ + public func toUnsafe() -> UnsafeMutableRawPointer { + return Unmanaged.passRetained(self).toOpaque() + } + + /** + * Casts an unsafe pointer to a `HybridVideoPlayerSourceSpec_cxx`. + * The pointer has to be a retained opaque `Unmanaged`. + * This removes one strong reference from the object! + */ + public class func fromUnsafe(_ pointer: UnsafeMutableRawPointer) -> HybridVideoPlayerSourceSpec_cxx { + return Unmanaged.fromOpaque(pointer).takeRetainedValue() + } + + /** + * Gets (or creates) the C++ part of this Hybrid Object. + * The C++ part is a `std::shared_ptr`. + */ + public func getCxxPart() -> bridge.std__shared_ptr_margelo__nitro__video__HybridVideoPlayerSourceSpec_ { + let cachedCxxPart = self.__cxxPart.lock() + if cachedCxxPart.__convertToBool() { + return cachedCxxPart + } else { + let newCxxPart = bridge.create_std__shared_ptr_margelo__nitro__video__HybridVideoPlayerSourceSpec_(self.toUnsafe()) + __cxxPart = bridge.weakify_std__shared_ptr_margelo__nitro__video__HybridVideoPlayerSourceSpec_(newCxxPart) + return newCxxPart + } + } + + + + /** + * Get the memory size of the Swift class (plus size of any other allocations) + * so the JS VM can properly track it and garbage-collect the JS object if needed. + */ + @inline(__always) + public var memorySize: Int { + return MemoryHelper.getSizeOf(self.__implementation) + self.__implementation.memorySize + } + + // Properties + public var uri: std.string { + @inline(__always) + get { + return std.string(self.__implementation.uri) + } + } + + // Methods + @inline(__always) + public func getAssetInformationAsync() -> bridge.Result_std__shared_ptr_Promise_VideoInformation___ { + do { + let __result = try self.__implementation.getAssetInformationAsync() + let __resultCpp = { () -> bridge.std__shared_ptr_Promise_VideoInformation__ in + let __promise = bridge.create_std__shared_ptr_Promise_VideoInformation__() + let __promiseHolder = bridge.wrap_std__shared_ptr_Promise_VideoInformation__(__promise) + __result + .then({ __result in __promiseHolder.resolve(__result) }) + .catch({ __error in __promiseHolder.reject(__error.toCpp()) }) + return __promise + }() + return bridge.create_Result_std__shared_ptr_Promise_VideoInformation___(__resultCpp) + } catch (let __error) { + let __exceptionPtr = __error.toCpp() + return bridge.create_Result_std__shared_ptr_Promise_VideoInformation___(__exceptionPtr) + } + } +} diff --git a/nitrogen/generated/ios/swift/HybridVideoPlayerSpec.swift b/nitrogen/generated/ios/swift/HybridVideoPlayerSpec.swift index 6f96201a..a5ca550b 100644 --- a/nitrogen/generated/ios/swift/HybridVideoPlayerSpec.swift +++ b/nitrogen/generated/ios/swift/HybridVideoPlayerSpec.swift @@ -2,39 +2,54 @@ /// HybridVideoPlayerSpec.swift /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro -/// Copyright © 2024 Marc Rousavy @ Margelo +/// Copyright © 2025 Marc Rousavy @ Margelo /// import Foundation import NitroModules +/// See ``HybridVideoPlayerSpec`` +public protocol HybridVideoPlayerSpec_protocol: AnyObject { + // Properties + var source: (any HybridVideoPlayerSourceSpec) { get } + var duration: Double { get } + var volume: Double { get set } + var currentTime: Double { get set } + + // Methods + func preload() throws -> Promise + func play() throws -> Void + func pause() throws -> Void + func replaceSourceAsync(source: (any HybridVideoPlayerSourceSpec)) throws -> Promise +} + +/// See ``HybridVideoPlayerSpec`` +public class HybridVideoPlayerSpec_base: HybridObjectSpec { + private weak var cxxWrapper: HybridVideoPlayerSpec_cxx? = nil + public func getCxxWrapper() -> HybridVideoPlayerSpec_cxx { + #if DEBUG + guard self is HybridVideoPlayerSpec else { + fatalError("`self` is not a `HybridVideoPlayerSpec`! Did you accidentally inherit from `HybridVideoPlayerSpec_base` instead of `HybridVideoPlayerSpec`?") + } + #endif + if let cxxWrapper = self.cxxWrapper { + return cxxWrapper + } else { + let cxxWrapper = HybridVideoPlayerSpec_cxx(self as! HybridVideoPlayerSpec) + self.cxxWrapper = cxxWrapper + return cxxWrapper + } + } + public var memorySize: Int { return 0 } +} + /** - * A Swift protocol representing the VideoPlayer HybridObject. + * A Swift base-protocol representing the VideoPlayer HybridObject. * Implement this protocol to create Swift-based instances of VideoPlayer. - * - * When implementing this protocol, make sure to initialize `hybridContext` - example: - * ``` - * public class HybridVideoPlayer : HybridVideoPlayerSpec { - * // Initialize HybridContext - * var hybridContext = margelo.nitro.HybridContext() - * - * // Return size of the instance to inform JS GC about memory pressure - * var memorySize: Int { - * return getSizeOf(self) - * } - * + * ```swift + * class HybridVideoPlayer : HybridVideoPlayerSpec { * // ... * } * ``` */ -public protocol HybridVideoPlayerSpec: AnyObject, HybridObjectSpec { - // Properties - var source: (any HybridVideoPlayerSourceSpec) { get set } - var volume: Double { get set } - var currentTime: Double { get set } - var duration: Double { get } - - // Methods - func play() throws -> Void - func pause() throws -> Void -} +public typealias HybridVideoPlayerSpec = HybridVideoPlayerSpec_protocol & HybridVideoPlayerSpec_base diff --git a/nitrogen/generated/ios/swift/HybridVideoPlayerSpecCxx.swift b/nitrogen/generated/ios/swift/HybridVideoPlayerSpecCxx.swift deleted file mode 100644 index 89ffef87..00000000 --- a/nitrogen/generated/ios/swift/HybridVideoPlayerSpecCxx.swift +++ /dev/null @@ -1,168 +0,0 @@ -/// -/// HybridVideoPlayerSpecCxx.swift -/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. -/// https://github.com/mrousavy/nitro -/// Copyright © 2024 Marc Rousavy @ Margelo -/// - -import Foundation -import NitroModules - -/** - * Helper class for converting instances of `HybridVideoPlayerSpecCxx` from- and to unsafe pointers. - * This is useful to pass Swift classes to C++, without having to strongly type the C++ function signature. - * The actual Swift type can be included in the .cpp file, without having to forward-declare anything in .hpp. - */ -public final class HybridVideoPlayerSpecCxxUnsafe { - /** - * Casts a `HybridVideoPlayerSpecCxx` instance to a retained unsafe raw pointer. - * This acquires one additional strong reference on the object! - */ - public static func toUnsafe(_ instance: HybridVideoPlayerSpecCxx) -> UnsafeMutableRawPointer { - return Unmanaged.passRetained(instance).toOpaque() - } - - /** - * Casts an unsafe pointer to a `HybridVideoPlayerSpecCxx`. - * The pointer has to be a retained opaque `Unmanaged`. - * This removes one strong reference from the object! - */ - public static func fromUnsafe(_ pointer: UnsafeMutableRawPointer) -> HybridVideoPlayerSpecCxx { - return Unmanaged.fromOpaque(pointer).takeRetainedValue() - } -} - -/** - * A class implementation that bridges HybridVideoPlayerSpec over to C++. - * In C++, we cannot use Swift protocols - so we need to wrap it in a class to make it strongly defined. - * - * Also, some Swift types need to be bridged with special handling: - * - Enums need to be wrapped in Structs, otherwise they cannot be accessed bi-directionally (Swift bug: https://github.com/swiftlang/swift/issues/75330) - * - Other HybridObjects need to be wrapped/unwrapped from the Swift TCxx wrapper - * - Throwing methods need to be wrapped with a Result type, as exceptions cannot be propagated to C++ - */ -public class HybridVideoPlayerSpecCxx { - /** - * The Swift <> C++ bridge's namespace (`margelo::nitro::video::bridge::swift`) - * from `NitroVideo-Swift-Cxx-Bridge.hpp`. - * This contains specialized C++ templates, and C++ helper functions that can be accessed from Swift. - */ - public typealias bridge = margelo.nitro.video.bridge.swift - - /** - * Holds an instance of the `HybridVideoPlayerSpec` Swift protocol. - */ - private var __implementation: any HybridVideoPlayerSpec - - /** - * Create a new `HybridVideoPlayerSpecCxx` that wraps the given `HybridVideoPlayerSpec`. - * All properties and methods bridge to C++ types. - */ - public init(_ implementation: some HybridVideoPlayerSpec) { - self.__implementation = implementation - /* no base class */ - } - - /** - * Get the actual `HybridVideoPlayerSpec` instance this class wraps. - */ - @inline(__always) - public func getHybridVideoPlayerSpec() -> any HybridVideoPlayerSpec { - return __implementation - } - - /** - * Contains a (weak) reference to the C++ HybridObject to cache it. - */ - public var hybridContext: margelo.nitro.HybridContext { - @inline(__always) - get { - return self.__implementation.hybridContext - } - @inline(__always) - set { - self.__implementation.hybridContext = newValue - } - } - - /** - * Get the memory size of the Swift class (plus size of any other allocations) - * so the JS VM can properly track it and garbage-collect the JS object if needed. - */ - @inline(__always) - public var memorySize: Int { - return self.__implementation.memorySize - } - - // Properties - public var source: bridge.std__shared_ptr_margelo__nitro__video__HybridVideoPlayerSourceSpec_ { - @inline(__always) - get { - return { () -> bridge.std__shared_ptr_margelo__nitro__video__HybridVideoPlayerSourceSpec_ in - let __cxxWrapped = HybridVideoPlayerSourceSpecCxx(self.__implementation.source) - let __pointer = HybridVideoPlayerSourceSpecCxxUnsafe.toUnsafe(__cxxWrapped) - return bridge.create_std__shared_ptr_margelo__nitro__video__HybridVideoPlayerSourceSpec_(__pointer) - }() - } - @inline(__always) - set { - self.__implementation.source = { () -> HybridVideoPlayerSourceSpec in - let __unsafePointer = bridge.get_std__shared_ptr_margelo__nitro__video__HybridVideoPlayerSourceSpec_(newValue) - let __instance = HybridVideoPlayerSourceSpecCxxUnsafe.fromUnsafe(__unsafePointer) - return __instance.getHybridVideoPlayerSourceSpec() - }() - } - } - - public var volume: Double { - @inline(__always) - get { - return self.__implementation.volume - } - @inline(__always) - set { - self.__implementation.volume = newValue - } - } - - public var currentTime: Double { - @inline(__always) - get { - return self.__implementation.currentTime - } - @inline(__always) - set { - self.__implementation.currentTime = newValue - } - } - - public var duration: Double { - @inline(__always) - get { - return self.__implementation.duration - } - } - - // Methods - @inline(__always) - public func play() -> Void { - do { - try self.__implementation.play() - return - } catch { - let __message = "\(error.localizedDescription)" - fatalError("Swift errors can currently not be propagated to C++! See https://github.com/swiftlang/swift/issues/75290 (Error: \(__message))") - } - } - - @inline(__always) - public func pause() -> Void { - do { - try self.__implementation.pause() - return - } catch { - let __message = "\(error.localizedDescription)" - fatalError("Swift errors can currently not be propagated to C++! See https://github.com/swiftlang/swift/issues/75290 (Error: \(__message))") - } - } -} diff --git a/nitrogen/generated/ios/swift/HybridVideoPlayerSpec_cxx.swift b/nitrogen/generated/ios/swift/HybridVideoPlayerSpec_cxx.swift new file mode 100644 index 00000000..8fdea936 --- /dev/null +++ b/nitrogen/generated/ios/swift/HybridVideoPlayerSpec_cxx.swift @@ -0,0 +1,203 @@ +/// +/// HybridVideoPlayerSpec_cxx.swift +/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. +/// https://github.com/mrousavy/nitro +/// Copyright © 2025 Marc Rousavy @ Margelo +/// + +import Foundation +import NitroModules + +/** + * A class implementation that bridges HybridVideoPlayerSpec over to C++. + * In C++, we cannot use Swift protocols - so we need to wrap it in a class to make it strongly defined. + * + * Also, some Swift types need to be bridged with special handling: + * - Enums need to be wrapped in Structs, otherwise they cannot be accessed bi-directionally (Swift bug: https://github.com/swiftlang/swift/issues/75330) + * - Other HybridObjects need to be wrapped/unwrapped from the Swift TCxx wrapper + * - Throwing methods need to be wrapped with a Result type, as exceptions cannot be propagated to C++ + */ +public class HybridVideoPlayerSpec_cxx { + /** + * The Swift <> C++ bridge's namespace (`margelo::nitro::video::bridge::swift`) + * from `NitroVideo-Swift-Cxx-Bridge.hpp`. + * This contains specialized C++ templates, and C++ helper functions that can be accessed from Swift. + */ + public typealias bridge = margelo.nitro.video.bridge.swift + + /** + * Holds an instance of the `HybridVideoPlayerSpec` Swift protocol. + */ + private var __implementation: any HybridVideoPlayerSpec + + /** + * Holds a weak pointer to the C++ class that wraps the Swift class. + */ + private var __cxxPart: bridge.std__weak_ptr_margelo__nitro__video__HybridVideoPlayerSpec_ + + /** + * Create a new `HybridVideoPlayerSpec_cxx` that wraps the given `HybridVideoPlayerSpec`. + * All properties and methods bridge to C++ types. + */ + public init(_ implementation: any HybridVideoPlayerSpec) { + self.__implementation = implementation + self.__cxxPart = .init() + /* no base class */ + } + + /** + * Get the actual `HybridVideoPlayerSpec` instance this class wraps. + */ + @inline(__always) + public func getHybridVideoPlayerSpec() -> any HybridVideoPlayerSpec { + return __implementation + } + + /** + * Casts this instance to a retained unsafe raw pointer. + * This acquires one additional strong reference on the object! + */ + public func toUnsafe() -> UnsafeMutableRawPointer { + return Unmanaged.passRetained(self).toOpaque() + } + + /** + * Casts an unsafe pointer to a `HybridVideoPlayerSpec_cxx`. + * The pointer has to be a retained opaque `Unmanaged`. + * This removes one strong reference from the object! + */ + public class func fromUnsafe(_ pointer: UnsafeMutableRawPointer) -> HybridVideoPlayerSpec_cxx { + return Unmanaged.fromOpaque(pointer).takeRetainedValue() + } + + /** + * Gets (or creates) the C++ part of this Hybrid Object. + * The C++ part is a `std::shared_ptr`. + */ + public func getCxxPart() -> bridge.std__shared_ptr_margelo__nitro__video__HybridVideoPlayerSpec_ { + let cachedCxxPart = self.__cxxPart.lock() + if cachedCxxPart.__convertToBool() { + return cachedCxxPart + } else { + let newCxxPart = bridge.create_std__shared_ptr_margelo__nitro__video__HybridVideoPlayerSpec_(self.toUnsafe()) + __cxxPart = bridge.weakify_std__shared_ptr_margelo__nitro__video__HybridVideoPlayerSpec_(newCxxPart) + return newCxxPart + } + } + + + + /** + * Get the memory size of the Swift class (plus size of any other allocations) + * so the JS VM can properly track it and garbage-collect the JS object if needed. + */ + @inline(__always) + public var memorySize: Int { + return MemoryHelper.getSizeOf(self.__implementation) + self.__implementation.memorySize + } + + // Properties + public var source: bridge.std__shared_ptr_margelo__nitro__video__HybridVideoPlayerSourceSpec_ { + @inline(__always) + get { + return { () -> bridge.std__shared_ptr_margelo__nitro__video__HybridVideoPlayerSourceSpec_ in + let __cxxWrapped = self.__implementation.source.getCxxWrapper() + return __cxxWrapped.getCxxPart() + }() + } + } + + public var duration: Double { + @inline(__always) + get { + return self.__implementation.duration + } + } + + public var volume: Double { + @inline(__always) + get { + return self.__implementation.volume + } + @inline(__always) + set { + self.__implementation.volume = newValue + } + } + + public var currentTime: Double { + @inline(__always) + get { + return self.__implementation.currentTime + } + @inline(__always) + set { + self.__implementation.currentTime = newValue + } + } + + // Methods + @inline(__always) + public func preload() -> bridge.Result_std__shared_ptr_Promise_void___ { + do { + let __result = try self.__implementation.preload() + let __resultCpp = { () -> bridge.std__shared_ptr_Promise_void__ in + let __promise = bridge.create_std__shared_ptr_Promise_void__() + let __promiseHolder = bridge.wrap_std__shared_ptr_Promise_void__(__promise) + __result + .then({ __result in __promiseHolder.resolve() }) + .catch({ __error in __promiseHolder.reject(__error.toCpp()) }) + return __promise + }() + return bridge.create_Result_std__shared_ptr_Promise_void___(__resultCpp) + } catch (let __error) { + let __exceptionPtr = __error.toCpp() + return bridge.create_Result_std__shared_ptr_Promise_void___(__exceptionPtr) + } + } + + @inline(__always) + public func play() -> bridge.Result_void_ { + do { + try self.__implementation.play() + return bridge.create_Result_void_() + } catch (let __error) { + let __exceptionPtr = __error.toCpp() + return bridge.create_Result_void_(__exceptionPtr) + } + } + + @inline(__always) + public func pause() -> bridge.Result_void_ { + do { + try self.__implementation.pause() + return bridge.create_Result_void_() + } catch (let __error) { + let __exceptionPtr = __error.toCpp() + return bridge.create_Result_void_(__exceptionPtr) + } + } + + @inline(__always) + public func replaceSourceAsync(source: bridge.std__shared_ptr_margelo__nitro__video__HybridVideoPlayerSourceSpec_) -> bridge.Result_std__shared_ptr_Promise_void___ { + do { + let __result = try self.__implementation.replaceSourceAsync(source: { () -> HybridVideoPlayerSourceSpec in + let __unsafePointer = bridge.get_std__shared_ptr_margelo__nitro__video__HybridVideoPlayerSourceSpec_(source) + let __instance = HybridVideoPlayerSourceSpec_cxx.fromUnsafe(__unsafePointer) + return __instance.getHybridVideoPlayerSourceSpec() + }()) + let __resultCpp = { () -> bridge.std__shared_ptr_Promise_void__ in + let __promise = bridge.create_std__shared_ptr_Promise_void__() + let __promiseHolder = bridge.wrap_std__shared_ptr_Promise_void__(__promise) + __result + .then({ __result in __promiseHolder.resolve() }) + .catch({ __error in __promiseHolder.reject(__error.toCpp()) }) + return __promise + }() + return bridge.create_Result_std__shared_ptr_Promise_void___(__resultCpp) + } catch (let __error) { + let __exceptionPtr = __error.toCpp() + return bridge.create_Result_std__shared_ptr_Promise_void___(__exceptionPtr) + } + } +} diff --git a/nitrogen/generated/ios/swift/HybridVideoViewViewManagerFactorySpec.swift b/nitrogen/generated/ios/swift/HybridVideoViewViewManagerFactorySpec.swift index 0bde2537..aa702947 100644 --- a/nitrogen/generated/ios/swift/HybridVideoViewViewManagerFactorySpec.swift +++ b/nitrogen/generated/ios/swift/HybridVideoViewViewManagerFactorySpec.swift @@ -2,35 +2,48 @@ /// HybridVideoViewViewManagerFactorySpec.swift /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro -/// Copyright © 2024 Marc Rousavy @ Margelo +/// Copyright © 2025 Marc Rousavy @ Margelo /// import Foundation import NitroModules -/** - * A Swift protocol representing the VideoViewViewManagerFactory HybridObject. - * Implement this protocol to create Swift-based instances of VideoViewViewManagerFactory. - * - * When implementing this protocol, make sure to initialize `hybridContext` - example: - * ``` - * public class HybridVideoViewViewManagerFactory : HybridVideoViewViewManagerFactorySpec { - * // Initialize HybridContext - * var hybridContext = margelo.nitro.HybridContext() - * - * // Return size of the instance to inform JS GC about memory pressure - * var memorySize: Int { - * return getSizeOf(self) - * } - * - * // ... - * } - * ``` - */ -public protocol HybridVideoViewViewManagerFactorySpec: AnyObject, HybridObjectSpec { +/// See ``HybridVideoViewViewManagerFactorySpec`` +public protocol HybridVideoViewViewManagerFactorySpec_protocol: AnyObject { // Properties // Methods func createViewManager(nitroId: Double) throws -> (any HybridVideoViewViewManagerSpec) } + +/// See ``HybridVideoViewViewManagerFactorySpec`` +public class HybridVideoViewViewManagerFactorySpec_base: HybridObjectSpec { + private weak var cxxWrapper: HybridVideoViewViewManagerFactorySpec_cxx? = nil + public func getCxxWrapper() -> HybridVideoViewViewManagerFactorySpec_cxx { + #if DEBUG + guard self is HybridVideoViewViewManagerFactorySpec else { + fatalError("`self` is not a `HybridVideoViewViewManagerFactorySpec`! Did you accidentally inherit from `HybridVideoViewViewManagerFactorySpec_base` instead of `HybridVideoViewViewManagerFactorySpec`?") + } + #endif + if let cxxWrapper = self.cxxWrapper { + return cxxWrapper + } else { + let cxxWrapper = HybridVideoViewViewManagerFactorySpec_cxx(self as! HybridVideoViewViewManagerFactorySpec) + self.cxxWrapper = cxxWrapper + return cxxWrapper + } + } + public var memorySize: Int { return 0 } +} + +/** + * A Swift base-protocol representing the VideoViewViewManagerFactory HybridObject. + * Implement this protocol to create Swift-based instances of VideoViewViewManagerFactory. + * ```swift + * class HybridVideoViewViewManagerFactory : HybridVideoViewViewManagerFactorySpec { + * // ... + * } + * ``` + */ +public typealias HybridVideoViewViewManagerFactorySpec = HybridVideoViewViewManagerFactorySpec_protocol & HybridVideoViewViewManagerFactorySpec_base diff --git a/nitrogen/generated/ios/swift/HybridVideoViewViewManagerFactorySpecCxx.swift b/nitrogen/generated/ios/swift/HybridVideoViewViewManagerFactorySpecCxx.swift deleted file mode 100644 index d1a0e982..00000000 --- a/nitrogen/generated/ios/swift/HybridVideoViewViewManagerFactorySpecCxx.swift +++ /dev/null @@ -1,115 +0,0 @@ -/// -/// HybridVideoViewViewManagerFactorySpecCxx.swift -/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. -/// https://github.com/mrousavy/nitro -/// Copyright © 2024 Marc Rousavy @ Margelo -/// - -import Foundation -import NitroModules - -/** - * Helper class for converting instances of `HybridVideoViewViewManagerFactorySpecCxx` from- and to unsafe pointers. - * This is useful to pass Swift classes to C++, without having to strongly type the C++ function signature. - * The actual Swift type can be included in the .cpp file, without having to forward-declare anything in .hpp. - */ -public final class HybridVideoViewViewManagerFactorySpecCxxUnsafe { - /** - * Casts a `HybridVideoViewViewManagerFactorySpecCxx` instance to a retained unsafe raw pointer. - * This acquires one additional strong reference on the object! - */ - public static func toUnsafe(_ instance: HybridVideoViewViewManagerFactorySpecCxx) -> UnsafeMutableRawPointer { - return Unmanaged.passRetained(instance).toOpaque() - } - - /** - * Casts an unsafe pointer to a `HybridVideoViewViewManagerFactorySpecCxx`. - * The pointer has to be a retained opaque `Unmanaged`. - * This removes one strong reference from the object! - */ - public static func fromUnsafe(_ pointer: UnsafeMutableRawPointer) -> HybridVideoViewViewManagerFactorySpecCxx { - return Unmanaged.fromOpaque(pointer).takeRetainedValue() - } -} - -/** - * A class implementation that bridges HybridVideoViewViewManagerFactorySpec over to C++. - * In C++, we cannot use Swift protocols - so we need to wrap it in a class to make it strongly defined. - * - * Also, some Swift types need to be bridged with special handling: - * - Enums need to be wrapped in Structs, otherwise they cannot be accessed bi-directionally (Swift bug: https://github.com/swiftlang/swift/issues/75330) - * - Other HybridObjects need to be wrapped/unwrapped from the Swift TCxx wrapper - * - Throwing methods need to be wrapped with a Result type, as exceptions cannot be propagated to C++ - */ -public class HybridVideoViewViewManagerFactorySpecCxx { - /** - * The Swift <> C++ bridge's namespace (`margelo::nitro::video::bridge::swift`) - * from `NitroVideo-Swift-Cxx-Bridge.hpp`. - * This contains specialized C++ templates, and C++ helper functions that can be accessed from Swift. - */ - public typealias bridge = margelo.nitro.video.bridge.swift - - /** - * Holds an instance of the `HybridVideoViewViewManagerFactorySpec` Swift protocol. - */ - private var __implementation: any HybridVideoViewViewManagerFactorySpec - - /** - * Create a new `HybridVideoViewViewManagerFactorySpecCxx` that wraps the given `HybridVideoViewViewManagerFactorySpec`. - * All properties and methods bridge to C++ types. - */ - public init(_ implementation: some HybridVideoViewViewManagerFactorySpec) { - self.__implementation = implementation - /* no base class */ - } - - /** - * Get the actual `HybridVideoViewViewManagerFactorySpec` instance this class wraps. - */ - @inline(__always) - public func getHybridVideoViewViewManagerFactorySpec() -> any HybridVideoViewViewManagerFactorySpec { - return __implementation - } - - /** - * Contains a (weak) reference to the C++ HybridObject to cache it. - */ - public var hybridContext: margelo.nitro.HybridContext { - @inline(__always) - get { - return self.__implementation.hybridContext - } - @inline(__always) - set { - self.__implementation.hybridContext = newValue - } - } - - /** - * Get the memory size of the Swift class (plus size of any other allocations) - * so the JS VM can properly track it and garbage-collect the JS object if needed. - */ - @inline(__always) - public var memorySize: Int { - return self.__implementation.memorySize - } - - // Properties - - - // Methods - @inline(__always) - public func createViewManager(nitroId: Double) -> bridge.std__shared_ptr_margelo__nitro__video__HybridVideoViewViewManagerSpec_ { - do { - let __result = try self.__implementation.createViewManager(nitroId: nitroId) - return { () -> bridge.std__shared_ptr_margelo__nitro__video__HybridVideoViewViewManagerSpec_ in - let __cxxWrapped = HybridVideoViewViewManagerSpecCxx(__result) - let __pointer = HybridVideoViewViewManagerSpecCxxUnsafe.toUnsafe(__cxxWrapped) - return bridge.create_std__shared_ptr_margelo__nitro__video__HybridVideoViewViewManagerSpec_(__pointer) - }() - } catch { - let __message = "\(error.localizedDescription)" - fatalError("Swift errors can currently not be propagated to C++! See https://github.com/swiftlang/swift/issues/75290 (Error: \(__message))") - } - } -} diff --git a/nitrogen/generated/ios/swift/HybridVideoViewViewManagerFactorySpec_cxx.swift b/nitrogen/generated/ios/swift/HybridVideoViewViewManagerFactorySpec_cxx.swift new file mode 100644 index 00000000..c6cc356f --- /dev/null +++ b/nitrogen/generated/ios/swift/HybridVideoViewViewManagerFactorySpec_cxx.swift @@ -0,0 +1,117 @@ +/// +/// HybridVideoViewViewManagerFactorySpec_cxx.swift +/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. +/// https://github.com/mrousavy/nitro +/// Copyright © 2025 Marc Rousavy @ Margelo +/// + +import Foundation +import NitroModules + +/** + * A class implementation that bridges HybridVideoViewViewManagerFactorySpec over to C++. + * In C++, we cannot use Swift protocols - so we need to wrap it in a class to make it strongly defined. + * + * Also, some Swift types need to be bridged with special handling: + * - Enums need to be wrapped in Structs, otherwise they cannot be accessed bi-directionally (Swift bug: https://github.com/swiftlang/swift/issues/75330) + * - Other HybridObjects need to be wrapped/unwrapped from the Swift TCxx wrapper + * - Throwing methods need to be wrapped with a Result type, as exceptions cannot be propagated to C++ + */ +public class HybridVideoViewViewManagerFactorySpec_cxx { + /** + * The Swift <> C++ bridge's namespace (`margelo::nitro::video::bridge::swift`) + * from `NitroVideo-Swift-Cxx-Bridge.hpp`. + * This contains specialized C++ templates, and C++ helper functions that can be accessed from Swift. + */ + public typealias bridge = margelo.nitro.video.bridge.swift + + /** + * Holds an instance of the `HybridVideoViewViewManagerFactorySpec` Swift protocol. + */ + private var __implementation: any HybridVideoViewViewManagerFactorySpec + + /** + * Holds a weak pointer to the C++ class that wraps the Swift class. + */ + private var __cxxPart: bridge.std__weak_ptr_margelo__nitro__video__HybridVideoViewViewManagerFactorySpec_ + + /** + * Create a new `HybridVideoViewViewManagerFactorySpec_cxx` that wraps the given `HybridVideoViewViewManagerFactorySpec`. + * All properties and methods bridge to C++ types. + */ + public init(_ implementation: any HybridVideoViewViewManagerFactorySpec) { + self.__implementation = implementation + self.__cxxPart = .init() + /* no base class */ + } + + /** + * Get the actual `HybridVideoViewViewManagerFactorySpec` instance this class wraps. + */ + @inline(__always) + public func getHybridVideoViewViewManagerFactorySpec() -> any HybridVideoViewViewManagerFactorySpec { + return __implementation + } + + /** + * Casts this instance to a retained unsafe raw pointer. + * This acquires one additional strong reference on the object! + */ + public func toUnsafe() -> UnsafeMutableRawPointer { + return Unmanaged.passRetained(self).toOpaque() + } + + /** + * Casts an unsafe pointer to a `HybridVideoViewViewManagerFactorySpec_cxx`. + * The pointer has to be a retained opaque `Unmanaged`. + * This removes one strong reference from the object! + */ + public class func fromUnsafe(_ pointer: UnsafeMutableRawPointer) -> HybridVideoViewViewManagerFactorySpec_cxx { + return Unmanaged.fromOpaque(pointer).takeRetainedValue() + } + + /** + * Gets (or creates) the C++ part of this Hybrid Object. + * The C++ part is a `std::shared_ptr`. + */ + public func getCxxPart() -> bridge.std__shared_ptr_margelo__nitro__video__HybridVideoViewViewManagerFactorySpec_ { + let cachedCxxPart = self.__cxxPart.lock() + if cachedCxxPart.__convertToBool() { + return cachedCxxPart + } else { + let newCxxPart = bridge.create_std__shared_ptr_margelo__nitro__video__HybridVideoViewViewManagerFactorySpec_(self.toUnsafe()) + __cxxPart = bridge.weakify_std__shared_ptr_margelo__nitro__video__HybridVideoViewViewManagerFactorySpec_(newCxxPart) + return newCxxPart + } + } + + + + /** + * Get the memory size of the Swift class (plus size of any other allocations) + * so the JS VM can properly track it and garbage-collect the JS object if needed. + */ + @inline(__always) + public var memorySize: Int { + return MemoryHelper.getSizeOf(self.__implementation) + self.__implementation.memorySize + } + + // Properties + + + // Methods + @inline(__always) + public func createViewManager(nitroId: Double) -> bridge.Result_std__shared_ptr_margelo__nitro__video__HybridVideoViewViewManagerSpec__ { + do { + let __result = try self.__implementation.createViewManager(nitroId: nitroId) + let __resultCpp = { () -> bridge.std__shared_ptr_margelo__nitro__video__HybridVideoViewViewManagerSpec_ in + let __cxxWrapped = __result.getCxxWrapper() + return __cxxWrapped.getCxxPart() + }() + return bridge.create_Result_std__shared_ptr_margelo__nitro__video__HybridVideoViewViewManagerSpec__(__resultCpp) + } catch (let __error) { + let __exceptionPtr = __error.toCpp() + return bridge.create_Result_std__shared_ptr_margelo__nitro__video__HybridVideoViewViewManagerSpec__(__exceptionPtr) + } + } +} diff --git a/nitrogen/generated/ios/swift/HybridVideoViewViewManagerSpec.swift b/nitrogen/generated/ios/swift/HybridVideoViewViewManagerSpec.swift index 447561e0..5cc88eed 100644 --- a/nitrogen/generated/ios/swift/HybridVideoViewViewManagerSpec.swift +++ b/nitrogen/generated/ios/swift/HybridVideoViewViewManagerSpec.swift @@ -2,35 +2,48 @@ /// HybridVideoViewViewManagerSpec.swift /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro -/// Copyright © 2024 Marc Rousavy @ Margelo +/// Copyright © 2025 Marc Rousavy @ Margelo /// import Foundation import NitroModules -/** - * A Swift protocol representing the VideoViewViewManager HybridObject. - * Implement this protocol to create Swift-based instances of VideoViewViewManager. - * - * When implementing this protocol, make sure to initialize `hybridContext` - example: - * ``` - * public class HybridVideoViewViewManager : HybridVideoViewViewManagerSpec { - * // Initialize HybridContext - * var hybridContext = margelo.nitro.HybridContext() - * - * // Return size of the instance to inform JS GC about memory pressure - * var memorySize: Int { - * return getSizeOf(self) - * } - * - * // ... - * } - * ``` - */ -public protocol HybridVideoViewViewManagerSpec: AnyObject, HybridObjectSpec { +/// See ``HybridVideoViewViewManagerSpec`` +public protocol HybridVideoViewViewManagerSpec_protocol: AnyObject { // Properties var player: (any HybridVideoPlayerSpec)? { get set } // Methods } + +/// See ``HybridVideoViewViewManagerSpec`` +public class HybridVideoViewViewManagerSpec_base: HybridObjectSpec { + private weak var cxxWrapper: HybridVideoViewViewManagerSpec_cxx? = nil + public func getCxxWrapper() -> HybridVideoViewViewManagerSpec_cxx { + #if DEBUG + guard self is HybridVideoViewViewManagerSpec else { + fatalError("`self` is not a `HybridVideoViewViewManagerSpec`! Did you accidentally inherit from `HybridVideoViewViewManagerSpec_base` instead of `HybridVideoViewViewManagerSpec`?") + } + #endif + if let cxxWrapper = self.cxxWrapper { + return cxxWrapper + } else { + let cxxWrapper = HybridVideoViewViewManagerSpec_cxx(self as! HybridVideoViewViewManagerSpec) + self.cxxWrapper = cxxWrapper + return cxxWrapper + } + } + public var memorySize: Int { return 0 } +} + +/** + * A Swift base-protocol representing the VideoViewViewManager HybridObject. + * Implement this protocol to create Swift-based instances of VideoViewViewManager. + * ```swift + * class HybridVideoViewViewManager : HybridVideoViewViewManagerSpec { + * // ... + * } + * ``` + */ +public typealias HybridVideoViewViewManagerSpec = HybridVideoViewViewManagerSpec_protocol & HybridVideoViewViewManagerSpec_base diff --git a/nitrogen/generated/ios/swift/HybridVideoViewViewManagerSpecCxx.swift b/nitrogen/generated/ios/swift/HybridVideoViewViewManagerSpec_cxx.swift similarity index 62% rename from nitrogen/generated/ios/swift/HybridVideoViewViewManagerSpecCxx.swift rename to nitrogen/generated/ios/swift/HybridVideoViewViewManagerSpec_cxx.swift index 65436b20..2148707b 100644 --- a/nitrogen/generated/ios/swift/HybridVideoViewViewManagerSpecCxx.swift +++ b/nitrogen/generated/ios/swift/HybridVideoViewViewManagerSpec_cxx.swift @@ -1,37 +1,13 @@ /// -/// HybridVideoViewViewManagerSpecCxx.swift +/// HybridVideoViewViewManagerSpec_cxx.swift /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro -/// Copyright © 2024 Marc Rousavy @ Margelo +/// Copyright © 2025 Marc Rousavy @ Margelo /// import Foundation import NitroModules -/** - * Helper class for converting instances of `HybridVideoViewViewManagerSpecCxx` from- and to unsafe pointers. - * This is useful to pass Swift classes to C++, without having to strongly type the C++ function signature. - * The actual Swift type can be included in the .cpp file, without having to forward-declare anything in .hpp. - */ -public final class HybridVideoViewViewManagerSpecCxxUnsafe { - /** - * Casts a `HybridVideoViewViewManagerSpecCxx` instance to a retained unsafe raw pointer. - * This acquires one additional strong reference on the object! - */ - public static func toUnsafe(_ instance: HybridVideoViewViewManagerSpecCxx) -> UnsafeMutableRawPointer { - return Unmanaged.passRetained(instance).toOpaque() - } - - /** - * Casts an unsafe pointer to a `HybridVideoViewViewManagerSpecCxx`. - * The pointer has to be a retained opaque `Unmanaged`. - * This removes one strong reference from the object! - */ - public static func fromUnsafe(_ pointer: UnsafeMutableRawPointer) -> HybridVideoViewViewManagerSpecCxx { - return Unmanaged.fromOpaque(pointer).takeRetainedValue() - } -} - /** * A class implementation that bridges HybridVideoViewViewManagerSpec over to C++. * In C++, we cannot use Swift protocols - so we need to wrap it in a class to make it strongly defined. @@ -41,7 +17,7 @@ public final class HybridVideoViewViewManagerSpecCxxUnsafe { * - Other HybridObjects need to be wrapped/unwrapped from the Swift TCxx wrapper * - Throwing methods need to be wrapped with a Result type, as exceptions cannot be propagated to C++ */ -public class HybridVideoViewViewManagerSpecCxx { +public class HybridVideoViewViewManagerSpec_cxx { /** * The Swift <> C++ bridge's namespace (`margelo::nitro::video::bridge::swift`) * from `NitroVideo-Swift-Cxx-Bridge.hpp`. @@ -55,11 +31,17 @@ public class HybridVideoViewViewManagerSpecCxx { private var __implementation: any HybridVideoViewViewManagerSpec /** - * Create a new `HybridVideoViewViewManagerSpecCxx` that wraps the given `HybridVideoViewViewManagerSpec`. + * Holds a weak pointer to the C++ class that wraps the Swift class. + */ + private var __cxxPart: bridge.std__weak_ptr_margelo__nitro__video__HybridVideoViewViewManagerSpec_ + + /** + * Create a new `HybridVideoViewViewManagerSpec_cxx` that wraps the given `HybridVideoViewViewManagerSpec`. * All properties and methods bridge to C++ types. */ - public init(_ implementation: some HybridVideoViewViewManagerSpec) { + public init(_ implementation: any HybridVideoViewViewManagerSpec) { self.__implementation = implementation + self.__cxxPart = .init() /* no base class */ } @@ -72,26 +54,46 @@ public class HybridVideoViewViewManagerSpecCxx { } /** - * Contains a (weak) reference to the C++ HybridObject to cache it. + * Casts this instance to a retained unsafe raw pointer. + * This acquires one additional strong reference on the object! */ - public var hybridContext: margelo.nitro.HybridContext { - @inline(__always) - get { - return self.__implementation.hybridContext - } - @inline(__always) - set { - self.__implementation.hybridContext = newValue + public func toUnsafe() -> UnsafeMutableRawPointer { + return Unmanaged.passRetained(self).toOpaque() + } + + /** + * Casts an unsafe pointer to a `HybridVideoViewViewManagerSpec_cxx`. + * The pointer has to be a retained opaque `Unmanaged`. + * This removes one strong reference from the object! + */ + public class func fromUnsafe(_ pointer: UnsafeMutableRawPointer) -> HybridVideoViewViewManagerSpec_cxx { + return Unmanaged.fromOpaque(pointer).takeRetainedValue() + } + + /** + * Gets (or creates) the C++ part of this Hybrid Object. + * The C++ part is a `std::shared_ptr`. + */ + public func getCxxPart() -> bridge.std__shared_ptr_margelo__nitro__video__HybridVideoViewViewManagerSpec_ { + let cachedCxxPart = self.__cxxPart.lock() + if cachedCxxPart.__convertToBool() { + return cachedCxxPart + } else { + let newCxxPart = bridge.create_std__shared_ptr_margelo__nitro__video__HybridVideoViewViewManagerSpec_(self.toUnsafe()) + __cxxPart = bridge.weakify_std__shared_ptr_margelo__nitro__video__HybridVideoViewViewManagerSpec_(newCxxPart) + return newCxxPart } } + + /** * Get the memory size of the Swift class (plus size of any other allocations) * so the JS VM can properly track it and garbage-collect the JS object if needed. */ @inline(__always) public var memorySize: Int { - return self.__implementation.memorySize + return MemoryHelper.getSizeOf(self.__implementation) + self.__implementation.memorySize } // Properties @@ -101,9 +103,8 @@ public class HybridVideoViewViewManagerSpecCxx { return { () -> bridge.std__optional_std__shared_ptr_margelo__nitro__video__HybridVideoPlayerSpec__ in if let __unwrappedValue = self.__implementation.player { return bridge.create_std__optional_std__shared_ptr_margelo__nitro__video__HybridVideoPlayerSpec__({ () -> bridge.std__shared_ptr_margelo__nitro__video__HybridVideoPlayerSpec_ in - let __cxxWrapped = HybridVideoPlayerSpecCxx(__unwrappedValue) - let __pointer = HybridVideoPlayerSpecCxxUnsafe.toUnsafe(__cxxWrapped) - return bridge.create_std__shared_ptr_margelo__nitro__video__HybridVideoPlayerSpec_(__pointer) + let __cxxWrapped = __unwrappedValue.getCxxWrapper() + return __cxxWrapped.getCxxPart() }()) } else { return .init() @@ -116,7 +117,7 @@ public class HybridVideoViewViewManagerSpecCxx { if let __unwrapped = newValue.value { return { () -> HybridVideoPlayerSpec in let __unsafePointer = bridge.get_std__shared_ptr_margelo__nitro__video__HybridVideoPlayerSpec_(__unwrapped) - let __instance = HybridVideoPlayerSpecCxxUnsafe.fromUnsafe(__unsafePointer) + let __instance = HybridVideoPlayerSpec_cxx.fromUnsafe(__unsafePointer) return __instance.getHybridVideoPlayerSpec() }() } else { diff --git a/nitrogen/generated/ios/swift/VideoInformation.swift b/nitrogen/generated/ios/swift/VideoInformation.swift new file mode 100644 index 00000000..0d01a50a --- /dev/null +++ b/nitrogen/generated/ios/swift/VideoInformation.swift @@ -0,0 +1,112 @@ +/// +/// VideoInformation.swift +/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. +/// https://github.com/mrousavy/nitro +/// Copyright © 2025 Marc Rousavy @ Margelo +/// + +import NitroModules + +/** + * Represents an instance of `VideoInformation`, backed by a C++ struct. + */ +public typealias VideoInformation = margelo.nitro.video.VideoInformation + +public extension VideoInformation { + private typealias bridge = margelo.nitro.video.bridge.swift + + /** + * Create a new instance of `VideoInformation`. + */ + init(bitrate: Double, width: Double, height: Double, duration: Int64, fileSize: Int64, isHDR: Bool, isLive: Bool, orientation: VideoOrientation) { + self.init(bitrate, width, height, duration, fileSize, isHDR, isLive, orientation) + } + + var bitrate: Double { + @inline(__always) + get { + return self.__bitrate + } + @inline(__always) + set { + self.__bitrate = newValue + } + } + + var width: Double { + @inline(__always) + get { + return self.__width + } + @inline(__always) + set { + self.__width = newValue + } + } + + var height: Double { + @inline(__always) + get { + return self.__height + } + @inline(__always) + set { + self.__height = newValue + } + } + + var duration: Int64 { + @inline(__always) + get { + return self.__duration + } + @inline(__always) + set { + self.__duration = newValue + } + } + + var fileSize: Int64 { + @inline(__always) + get { + return self.__fileSize + } + @inline(__always) + set { + self.__fileSize = newValue + } + } + + var isHDR: Bool { + @inline(__always) + get { + return self.__isHDR + } + @inline(__always) + set { + self.__isHDR = newValue + } + } + + var isLive: Bool { + @inline(__always) + get { + return self.__isLive + } + @inline(__always) + set { + self.__isLive = newValue + } + } + + var orientation: VideoOrientation { + @inline(__always) + get { + return self.__orientation + } + @inline(__always) + set { + self.__orientation = newValue + } + } +} diff --git a/nitrogen/generated/ios/swift/VideoOrientation.swift b/nitrogen/generated/ios/swift/VideoOrientation.swift new file mode 100644 index 00000000..37f0affd --- /dev/null +++ b/nitrogen/generated/ios/swift/VideoOrientation.swift @@ -0,0 +1,56 @@ +/// +/// VideoOrientation.swift +/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. +/// https://github.com/mrousavy/nitro +/// Copyright © 2025 Marc Rousavy @ Margelo +/// + +/** + * Represents the JS union `VideoOrientation`, backed by a C++ enum. + */ +public typealias VideoOrientation = margelo.nitro.video.VideoOrientation + +public extension VideoOrientation { + /** + * Get a VideoOrientation for the given String value, or + * return `nil` if the given value was invalid/unknown. + */ + init?(fromString string: String) { + switch string { + case "portrait": + self = .portrait + case "landscape": + self = .landscape + case "portrait-upside-down": + self = .portraitUpsideDown + case "landscape-left": + self = .landscapeLeft + case "landscape-right": + self = .landscapeRight + case "unknown": + self = .unknown + default: + return nil + } + } + + /** + * Get the String value this VideoOrientation represents. + */ + var stringValue: String { + switch self { + case .portrait: + return "portrait" + case .landscape: + return "landscape" + case .portraitUpsideDown: + return "portrait-upside-down" + case .landscapeLeft: + return "landscape-left" + case .landscapeRight: + return "landscape-right" + case .unknown: + return "unknown" + } + } +} diff --git a/nitrogen/generated/shared/c++/HybridVideoPlayerFactorySpec.cpp b/nitrogen/generated/shared/c++/HybridVideoPlayerFactorySpec.cpp index 92dc6075..2c384f8c 100644 --- a/nitrogen/generated/shared/c++/HybridVideoPlayerFactorySpec.cpp +++ b/nitrogen/generated/shared/c++/HybridVideoPlayerFactorySpec.cpp @@ -2,7 +2,7 @@ /// HybridVideoPlayerFactorySpec.cpp /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro -/// Copyright © 2024 Marc Rousavy @ Margelo +/// Copyright © 2025 Marc Rousavy @ Margelo /// #include "HybridVideoPlayerFactorySpec.hpp" diff --git a/nitrogen/generated/shared/c++/HybridVideoPlayerFactorySpec.hpp b/nitrogen/generated/shared/c++/HybridVideoPlayerFactorySpec.hpp index fe779ff2..1236a0c9 100644 --- a/nitrogen/generated/shared/c++/HybridVideoPlayerFactorySpec.hpp +++ b/nitrogen/generated/shared/c++/HybridVideoPlayerFactorySpec.hpp @@ -2,7 +2,7 @@ /// HybridVideoPlayerFactorySpec.hpp /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro -/// Copyright © 2024 Marc Rousavy @ Margelo +/// Copyright © 2025 Marc Rousavy @ Margelo /// #pragma once diff --git a/nitrogen/generated/shared/c++/HybridVideoPlayerSourceFactorySpec.cpp b/nitrogen/generated/shared/c++/HybridVideoPlayerSourceFactorySpec.cpp index 452bdcf5..deaf3b9d 100644 --- a/nitrogen/generated/shared/c++/HybridVideoPlayerSourceFactorySpec.cpp +++ b/nitrogen/generated/shared/c++/HybridVideoPlayerSourceFactorySpec.cpp @@ -2,7 +2,7 @@ /// HybridVideoPlayerSourceFactorySpec.cpp /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro -/// Copyright © 2024 Marc Rousavy @ Margelo +/// Copyright © 2025 Marc Rousavy @ Margelo /// #include "HybridVideoPlayerSourceFactorySpec.hpp" diff --git a/nitrogen/generated/shared/c++/HybridVideoPlayerSourceFactorySpec.hpp b/nitrogen/generated/shared/c++/HybridVideoPlayerSourceFactorySpec.hpp index c5cbbfed..7ed3c1f0 100644 --- a/nitrogen/generated/shared/c++/HybridVideoPlayerSourceFactorySpec.hpp +++ b/nitrogen/generated/shared/c++/HybridVideoPlayerSourceFactorySpec.hpp @@ -2,7 +2,7 @@ /// HybridVideoPlayerSourceFactorySpec.hpp /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro -/// Copyright © 2024 Marc Rousavy @ Margelo +/// Copyright © 2025 Marc Rousavy @ Margelo /// #pragma once diff --git a/nitrogen/generated/shared/c++/HybridVideoPlayerSourceSpec.cpp b/nitrogen/generated/shared/c++/HybridVideoPlayerSourceSpec.cpp index 7e47efb0..c22f752b 100644 --- a/nitrogen/generated/shared/c++/HybridVideoPlayerSourceSpec.cpp +++ b/nitrogen/generated/shared/c++/HybridVideoPlayerSourceSpec.cpp @@ -2,7 +2,7 @@ /// HybridVideoPlayerSourceSpec.cpp /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro -/// Copyright © 2024 Marc Rousavy @ Margelo +/// Copyright © 2025 Marc Rousavy @ Margelo /// #include "HybridVideoPlayerSourceSpec.hpp" @@ -15,7 +15,7 @@ namespace margelo::nitro::video { // load custom methods/properties registerHybrids(this, [](Prototype& prototype) { prototype.registerHybridGetter("uri", &HybridVideoPlayerSourceSpec::getUri); - prototype.registerHybridSetter("uri", &HybridVideoPlayerSourceSpec::setUri); + prototype.registerHybridMethod("getAssetInformationAsync", &HybridVideoPlayerSourceSpec::getAssetInformationAsync); }); } diff --git a/nitrogen/generated/shared/c++/HybridVideoPlayerSourceSpec.hpp b/nitrogen/generated/shared/c++/HybridVideoPlayerSourceSpec.hpp index 7deabb26..c65aa778 100644 --- a/nitrogen/generated/shared/c++/HybridVideoPlayerSourceSpec.hpp +++ b/nitrogen/generated/shared/c++/HybridVideoPlayerSourceSpec.hpp @@ -2,7 +2,7 @@ /// HybridVideoPlayerSourceSpec.hpp /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro -/// Copyright © 2024 Marc Rousavy @ Margelo +/// Copyright © 2025 Marc Rousavy @ Margelo /// #pragma once @@ -13,9 +13,12 @@ #error NitroModules cannot be found! Are you sure you installed NitroModules properly? #endif - +// Forward declaration of `VideoInformation` to properly resolve imports. +namespace margelo::nitro::video { struct VideoInformation; } #include +#include +#include "VideoInformation.hpp" namespace margelo::nitro::video { @@ -45,11 +48,10 @@ namespace margelo::nitro::video { public: // Properties virtual std::string getUri() = 0; - virtual void setUri(const std::string& uri) = 0; public: // Methods - + virtual std::shared_ptr> getAssetInformationAsync() = 0; protected: // Hybrid Setup diff --git a/nitrogen/generated/shared/c++/HybridVideoPlayerSpec.cpp b/nitrogen/generated/shared/c++/HybridVideoPlayerSpec.cpp index bb78d4b1..746a18c9 100644 --- a/nitrogen/generated/shared/c++/HybridVideoPlayerSpec.cpp +++ b/nitrogen/generated/shared/c++/HybridVideoPlayerSpec.cpp @@ -2,7 +2,7 @@ /// HybridVideoPlayerSpec.cpp /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro -/// Copyright © 2024 Marc Rousavy @ Margelo +/// Copyright © 2025 Marc Rousavy @ Margelo /// #include "HybridVideoPlayerSpec.hpp" @@ -15,14 +15,15 @@ namespace margelo::nitro::video { // load custom methods/properties registerHybrids(this, [](Prototype& prototype) { prototype.registerHybridGetter("source", &HybridVideoPlayerSpec::getSource); - prototype.registerHybridSetter("source", &HybridVideoPlayerSpec::setSource); + prototype.registerHybridGetter("duration", &HybridVideoPlayerSpec::getDuration); prototype.registerHybridGetter("volume", &HybridVideoPlayerSpec::getVolume); prototype.registerHybridSetter("volume", &HybridVideoPlayerSpec::setVolume); prototype.registerHybridGetter("currentTime", &HybridVideoPlayerSpec::getCurrentTime); prototype.registerHybridSetter("currentTime", &HybridVideoPlayerSpec::setCurrentTime); - prototype.registerHybridGetter("duration", &HybridVideoPlayerSpec::getDuration); + prototype.registerHybridMethod("preload", &HybridVideoPlayerSpec::preload); prototype.registerHybridMethod("play", &HybridVideoPlayerSpec::play); prototype.registerHybridMethod("pause", &HybridVideoPlayerSpec::pause); + prototype.registerHybridMethod("replaceSourceAsync", &HybridVideoPlayerSpec::replaceSourceAsync); }); } diff --git a/nitrogen/generated/shared/c++/HybridVideoPlayerSpec.hpp b/nitrogen/generated/shared/c++/HybridVideoPlayerSpec.hpp index 705ee3b8..97a30a22 100644 --- a/nitrogen/generated/shared/c++/HybridVideoPlayerSpec.hpp +++ b/nitrogen/generated/shared/c++/HybridVideoPlayerSpec.hpp @@ -2,7 +2,7 @@ /// HybridVideoPlayerSpec.hpp /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro -/// Copyright © 2024 Marc Rousavy @ Margelo +/// Copyright © 2025 Marc Rousavy @ Margelo /// #pragma once @@ -18,6 +18,7 @@ namespace margelo::nitro::video { class HybridVideoPlayerSourceSpec; } #include #include "HybridVideoPlayerSourceSpec.hpp" +#include namespace margelo::nitro::video { @@ -47,17 +48,18 @@ namespace margelo::nitro::video { public: // Properties virtual std::shared_ptr getSource() = 0; - virtual void setSource(const std::shared_ptr& source) = 0; + virtual double getDuration() = 0; virtual double getVolume() = 0; virtual void setVolume(double volume) = 0; virtual double getCurrentTime() = 0; virtual void setCurrentTime(double currentTime) = 0; - virtual double getDuration() = 0; public: // Methods + virtual std::shared_ptr> preload() = 0; virtual void play() = 0; virtual void pause() = 0; + virtual std::shared_ptr> replaceSourceAsync(const std::shared_ptr& source) = 0; protected: // Hybrid Setup diff --git a/nitrogen/generated/shared/c++/HybridVideoViewViewManagerFactorySpec.cpp b/nitrogen/generated/shared/c++/HybridVideoViewViewManagerFactorySpec.cpp index 23d50684..2b6be369 100644 --- a/nitrogen/generated/shared/c++/HybridVideoViewViewManagerFactorySpec.cpp +++ b/nitrogen/generated/shared/c++/HybridVideoViewViewManagerFactorySpec.cpp @@ -2,7 +2,7 @@ /// HybridVideoViewViewManagerFactorySpec.cpp /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro -/// Copyright © 2024 Marc Rousavy @ Margelo +/// Copyright © 2025 Marc Rousavy @ Margelo /// #include "HybridVideoViewViewManagerFactorySpec.hpp" diff --git a/nitrogen/generated/shared/c++/HybridVideoViewViewManagerFactorySpec.hpp b/nitrogen/generated/shared/c++/HybridVideoViewViewManagerFactorySpec.hpp index ad326507..24ae9678 100644 --- a/nitrogen/generated/shared/c++/HybridVideoViewViewManagerFactorySpec.hpp +++ b/nitrogen/generated/shared/c++/HybridVideoViewViewManagerFactorySpec.hpp @@ -2,7 +2,7 @@ /// HybridVideoViewViewManagerFactorySpec.hpp /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro -/// Copyright © 2024 Marc Rousavy @ Margelo +/// Copyright © 2025 Marc Rousavy @ Margelo /// #pragma once diff --git a/nitrogen/generated/shared/c++/HybridVideoViewViewManagerSpec.cpp b/nitrogen/generated/shared/c++/HybridVideoViewViewManagerSpec.cpp index 76a7b273..46cf7397 100644 --- a/nitrogen/generated/shared/c++/HybridVideoViewViewManagerSpec.cpp +++ b/nitrogen/generated/shared/c++/HybridVideoViewViewManagerSpec.cpp @@ -2,7 +2,7 @@ /// HybridVideoViewViewManagerSpec.cpp /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro -/// Copyright © 2024 Marc Rousavy @ Margelo +/// Copyright © 2025 Marc Rousavy @ Margelo /// #include "HybridVideoViewViewManagerSpec.hpp" diff --git a/nitrogen/generated/shared/c++/HybridVideoViewViewManagerSpec.hpp b/nitrogen/generated/shared/c++/HybridVideoViewViewManagerSpec.hpp index decc492c..00550f1d 100644 --- a/nitrogen/generated/shared/c++/HybridVideoViewViewManagerSpec.hpp +++ b/nitrogen/generated/shared/c++/HybridVideoViewViewManagerSpec.hpp @@ -2,7 +2,7 @@ /// HybridVideoViewViewManagerSpec.hpp /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro -/// Copyright © 2024 Marc Rousavy @ Margelo +/// Copyright © 2025 Marc Rousavy @ Margelo /// #pragma once diff --git a/nitrogen/generated/shared/c++/VideoInformation.hpp b/nitrogen/generated/shared/c++/VideoInformation.hpp new file mode 100644 index 00000000..83e3e78f --- /dev/null +++ b/nitrogen/generated/shared/c++/VideoInformation.hpp @@ -0,0 +1,97 @@ +/// +/// VideoInformation.hpp +/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. +/// https://github.com/mrousavy/nitro +/// Copyright © 2025 Marc Rousavy @ Margelo +/// + +#pragma once + +#if __has_include() +#include +#else +#error NitroModules cannot be found! Are you sure you installed NitroModules properly? +#endif +#if __has_include() +#include +#else +#error NitroModules cannot be found! Are you sure you installed NitroModules properly? +#endif + +// Forward declaration of `VideoOrientation` to properly resolve imports. +namespace margelo::nitro::video { enum class VideoOrientation; } + +#include "VideoOrientation.hpp" + +namespace margelo::nitro::video { + + /** + * A struct which can be represented as a JavaScript object (VideoInformation). + */ + struct VideoInformation { + public: + double bitrate SWIFT_PRIVATE; + double width SWIFT_PRIVATE; + double height SWIFT_PRIVATE; + int64_t duration SWIFT_PRIVATE; + int64_t fileSize SWIFT_PRIVATE; + bool isHDR SWIFT_PRIVATE; + bool isLive SWIFT_PRIVATE; + VideoOrientation orientation SWIFT_PRIVATE; + + public: + explicit VideoInformation(double bitrate, double width, double height, int64_t duration, int64_t fileSize, bool isHDR, bool isLive, VideoOrientation orientation): bitrate(bitrate), width(width), height(height), duration(duration), fileSize(fileSize), isHDR(isHDR), isLive(isLive), orientation(orientation) {} + }; + +} // namespace margelo::nitro::video + +namespace margelo::nitro { + + using namespace margelo::nitro::video; + + // C++ VideoInformation <> JS VideoInformation (object) + template <> + struct JSIConverter { + static inline VideoInformation fromJSI(jsi::Runtime& runtime, const jsi::Value& arg) { + jsi::Object obj = arg.asObject(runtime); + return VideoInformation( + JSIConverter::fromJSI(runtime, obj.getProperty(runtime, "bitrate")), + JSIConverter::fromJSI(runtime, obj.getProperty(runtime, "width")), + JSIConverter::fromJSI(runtime, obj.getProperty(runtime, "height")), + JSIConverter::fromJSI(runtime, obj.getProperty(runtime, "duration")), + JSIConverter::fromJSI(runtime, obj.getProperty(runtime, "fileSize")), + JSIConverter::fromJSI(runtime, obj.getProperty(runtime, "isHDR")), + JSIConverter::fromJSI(runtime, obj.getProperty(runtime, "isLive")), + JSIConverter::fromJSI(runtime, obj.getProperty(runtime, "orientation")) + ); + } + static inline jsi::Value toJSI(jsi::Runtime& runtime, const VideoInformation& arg) { + jsi::Object obj(runtime); + obj.setProperty(runtime, "bitrate", JSIConverter::toJSI(runtime, arg.bitrate)); + obj.setProperty(runtime, "width", JSIConverter::toJSI(runtime, arg.width)); + obj.setProperty(runtime, "height", JSIConverter::toJSI(runtime, arg.height)); + obj.setProperty(runtime, "duration", JSIConverter::toJSI(runtime, arg.duration)); + obj.setProperty(runtime, "fileSize", JSIConverter::toJSI(runtime, arg.fileSize)); + obj.setProperty(runtime, "isHDR", JSIConverter::toJSI(runtime, arg.isHDR)); + obj.setProperty(runtime, "isLive", JSIConverter::toJSI(runtime, arg.isLive)); + obj.setProperty(runtime, "orientation", JSIConverter::toJSI(runtime, arg.orientation)); + return obj; + } + static inline bool canConvert(jsi::Runtime& runtime, const jsi::Value& value) { + if (!value.isObject()) { + return false; + } + jsi::Object obj = value.getObject(runtime); + if (!JSIConverter::canConvert(runtime, obj.getProperty(runtime, "bitrate"))) return false; + if (!JSIConverter::canConvert(runtime, obj.getProperty(runtime, "width"))) return false; + if (!JSIConverter::canConvert(runtime, obj.getProperty(runtime, "height"))) return false; + if (!JSIConverter::canConvert(runtime, obj.getProperty(runtime, "duration"))) return false; + if (!JSIConverter::canConvert(runtime, obj.getProperty(runtime, "fileSize"))) return false; + if (!JSIConverter::canConvert(runtime, obj.getProperty(runtime, "isHDR"))) return false; + if (!JSIConverter::canConvert(runtime, obj.getProperty(runtime, "isLive"))) return false; + if (!JSIConverter::canConvert(runtime, obj.getProperty(runtime, "orientation"))) return false; + return true; + } + }; + +} // namespace margelo::nitro diff --git a/nitrogen/generated/shared/c++/VideoOrientation.hpp b/nitrogen/generated/shared/c++/VideoOrientation.hpp new file mode 100644 index 00000000..3d4f16b8 --- /dev/null +++ b/nitrogen/generated/shared/c++/VideoOrientation.hpp @@ -0,0 +1,94 @@ +/// +/// VideoOrientation.hpp +/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. +/// https://github.com/mrousavy/nitro +/// Copyright © 2025 Marc Rousavy @ Margelo +/// + +#pragma once + +#if __has_include() +#include +#else +#error NitroModules cannot be found! Are you sure you installed NitroModules properly? +#endif +#if __has_include() +#include +#else +#error NitroModules cannot be found! Are you sure you installed NitroModules properly? +#endif +#if __has_include() +#include +#else +#error NitroModules cannot be found! Are you sure you installed NitroModules properly? +#endif + +namespace margelo::nitro::video { + + /** + * An enum which can be represented as a JavaScript union (VideoOrientation). + */ + enum class VideoOrientation { + PORTRAIT SWIFT_NAME(portrait) = 0, + LANDSCAPE SWIFT_NAME(landscape) = 1, + PORTRAIT_UPSIDE_DOWN SWIFT_NAME(portraitUpsideDown) = 2, + LANDSCAPE_LEFT SWIFT_NAME(landscapeLeft) = 3, + LANDSCAPE_RIGHT SWIFT_NAME(landscapeRight) = 4, + UNKNOWN SWIFT_NAME(unknown) = 5, + } CLOSED_ENUM; + +} // namespace margelo::nitro::video + +namespace margelo::nitro { + + using namespace margelo::nitro::video; + + // C++ VideoOrientation <> JS VideoOrientation (union) + template <> + struct JSIConverter { + static inline VideoOrientation fromJSI(jsi::Runtime& runtime, const jsi::Value& arg) { + std::string unionValue = JSIConverter::fromJSI(runtime, arg); + switch (hashString(unionValue.c_str(), unionValue.size())) { + case hashString("portrait"): return VideoOrientation::PORTRAIT; + case hashString("landscape"): return VideoOrientation::LANDSCAPE; + case hashString("portrait-upside-down"): return VideoOrientation::PORTRAIT_UPSIDE_DOWN; + case hashString("landscape-left"): return VideoOrientation::LANDSCAPE_LEFT; + case hashString("landscape-right"): return VideoOrientation::LANDSCAPE_RIGHT; + case hashString("unknown"): return VideoOrientation::UNKNOWN; + default: [[unlikely]] + throw std::invalid_argument("Cannot convert \"" + unionValue + "\" to enum VideoOrientation - invalid value!"); + } + } + static inline jsi::Value toJSI(jsi::Runtime& runtime, VideoOrientation arg) { + switch (arg) { + case VideoOrientation::PORTRAIT: return JSIConverter::toJSI(runtime, "portrait"); + case VideoOrientation::LANDSCAPE: return JSIConverter::toJSI(runtime, "landscape"); + case VideoOrientation::PORTRAIT_UPSIDE_DOWN: return JSIConverter::toJSI(runtime, "portrait-upside-down"); + case VideoOrientation::LANDSCAPE_LEFT: return JSIConverter::toJSI(runtime, "landscape-left"); + case VideoOrientation::LANDSCAPE_RIGHT: return JSIConverter::toJSI(runtime, "landscape-right"); + case VideoOrientation::UNKNOWN: return JSIConverter::toJSI(runtime, "unknown"); + default: [[unlikely]] + throw std::invalid_argument("Cannot convert VideoOrientation to JS - invalid value: " + + std::to_string(static_cast(arg)) + "!"); + } + } + static inline bool canConvert(jsi::Runtime& runtime, const jsi::Value& value) { + if (!value.isString()) { + return false; + } + std::string unionValue = JSIConverter::fromJSI(runtime, value); + switch (hashString(unionValue.c_str(), unionValue.size())) { + case hashString("portrait"): + case hashString("landscape"): + case hashString("portrait-upside-down"): + case hashString("landscape-left"): + case hashString("landscape-right"): + case hashString("unknown"): + return true; + default: + return false; + } + } + }; + +} // namespace margelo::nitro diff --git a/package.json b/package.json index f1760529..c66de0e6 100644 --- a/package.json +++ b/package.json @@ -95,7 +95,7 @@ "peerDependencies": { "react": "*", "react-native": "*", - "react-native-nitro-modules": ">=0.15.0" + "react-native-nitro-modules": ">=0.21.0" }, "workspaces": [ "example"