diff --git a/CHANGELOG.md b/CHANGELOG.md index dc8bacbe4..e3933e3c2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,12 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.1.0/) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). +## [Unreleased] + +### Added + +- Added the `Metrics` API, accessible through `player.metrics`, with `currentBandwidthEstimate` returning the player's estimated available bandwidth in bits per second. On iOS/tvOS this value is only reported for THEOlive/HESP streams. + ## [11.6.0] ### Added diff --git a/README.md b/README.md index 0c2105a9d..d7b960f11 100644 --- a/README.md +++ b/README.md @@ -188,6 +188,7 @@ This section gives an overview of features, limitations and known issues: - [Fullscreen presentation](./doc/fullscreen.md) - [Media Control](./doc/mediacontrol.md) - [Media Caching](./doc/media-caching.md) +- [Metrics](./doc/metrics.md) - [Migrating to THEOplayer 9.x](./doc/migrating-to-react-native-theoplayer-9.md) - [Migrating to THEOplayer 10.x🔥](./doc/migrating-to-react-native-theoplayer-10.md) - [Millicast](./doc/millicast.md) diff --git a/android/src/main/java/com/theoplayer/ReactTHEOplayerPackage.kt b/android/src/main/java/com/theoplayer/ReactTHEOplayerPackage.kt index c7e9f9191..84b014b6a 100644 --- a/android/src/main/java/com/theoplayer/ReactTHEOplayerPackage.kt +++ b/android/src/main/java/com/theoplayer/ReactTHEOplayerPackage.kt @@ -11,6 +11,7 @@ import com.theoplayer.drm.ContentProtectionModule import com.theoplayer.cast.CastModule import com.theoplayer.broadcast.EventBroadcastModule import com.theoplayer.media.MediaControlModule +import com.theoplayer.metrics.MetricsModule import com.theoplayer.player.PlayerModule import com.theoplayer.theolive.THEOliveModule import com.theoplayer.theoads.THEOadsModule @@ -28,6 +29,7 @@ class ReactTHEOplayerPackage : BaseReactPackage() { THEOliveModule.NAME -> THEOliveModule(reactContext) THEOadsModule.NAME -> THEOadsModule(reactContext) MediaControlModule.NAME -> MediaControlModule(reactContext) + MetricsModule.NAME -> MetricsModule(reactContext) else -> null } } @@ -48,6 +50,7 @@ class ReactTHEOplayerPackage : BaseReactPackage() { THEOliveModule.NAME to THEOliveModule.INFO, THEOadsModule.NAME to THEOadsModule.INFO, MediaControlModule.NAME to MediaControlModule.INFO, + MetricsModule.NAME to MetricsModule.INFO, ) } } diff --git a/android/src/main/java/com/theoplayer/metrics/MetricsModule.kt b/android/src/main/java/com/theoplayer/metrics/MetricsModule.kt new file mode 100644 index 000000000..a9e85f140 --- /dev/null +++ b/android/src/main/java/com/theoplayer/metrics/MetricsModule.kt @@ -0,0 +1,37 @@ +package com.theoplayer.metrics + +import com.facebook.react.bridge.* +import com.facebook.react.module.annotations.ReactModule +import com.facebook.react.module.model.ReactModuleInfo +import com.theoplayer.ReactTHEOplayerView +import com.theoplayer.util.ViewResolver + +@Suppress("unused") +@ReactModule(name = MetricsModule.NAME) +class MetricsModule(context: ReactApplicationContext) : ReactContextBaseJavaModule(context) { + companion object { + const val NAME = "THEORCTMetricsModule" + val INFO = ReactModuleInfo( + name = NAME, + className = NAME, + canOverrideExistingModule = false, + needsEagerInit = false, + isCxxModule = false, + isTurboModule = false, + ) + } + + private val viewResolver: ViewResolver = ViewResolver(context) + + override fun getName(): String { + return NAME + } + + // The bandwidth, in bits per second, that the player estimates is currently available. + @ReactMethod + fun currentBandwidthEstimate(tag: Int, promise: Promise) { + viewResolver.resolveViewByTag(tag) { view: ReactTHEOplayerView? -> + promise.resolve(view?.player?.metrics?.currentBandwidthEstimate ?: 0.0) + } + } +} diff --git a/doc/metrics.md b/doc/metrics.md new file mode 100644 index 000000000..9a248e25c --- /dev/null +++ b/doc/metrics.md @@ -0,0 +1,45 @@ +# Metrics + +## Overview + +The [Metrics API](../src/api/metrics/MetricsAPI.ts) exposes playback metrics gathered by the player. It is available on the [THEOplayer API](../src/api/player/THEOplayer.ts) through `player.metrics`. + +Metrics are **poll-based**: there is no change event, so you read a value on demand (for example on an interval, or piggy-backing on an existing event such as a time update). + +## Current bandwidth estimate + +`player.metrics.currentBandwidthEstimate()` returns the bandwidth, in **bits per second**, that the player estimates is currently available. This is the value the player uses to make adaptive bitrate (ABR) decisions. + +```tsx +const onPlayerReady = (player: THEOplayer) => { + // Poll the estimate every second. + setInterval(async () => { + const bps = await player.metrics.currentBandwidthEstimate(); + console.log(`Estimated bandwidth: ${bps} bps`); + }, 1000); +}; + + +``` + +> **Note:** A value of `0` means the estimate is **not available yet** (e.g. before playback, after a reset, +> or on a platform/source that does not populate it — see below). It does **not** mean the available +> bandwidth is literally zero. + +## Platform specifics + +The access path (`player.metrics.currentBandwidthEstimate()`, in bits/s) is identical on every platform, +but the *behaviour* is not uniform: + +| Platform | Populated for | Value when unsupported | +|-----------|--------------------------------------------|--------------------------------------------------------| +| Android | All streams, via the Media3/ExoPlayer estimate (HLS, DASH, SmoothStreaming, progressive) | `0.0` when no playback backend is attached | +| Web | All streams driven by THEOplayer's MSE/ABR pipeline (HLS, DASH, HESP) | `0` during native HTML5 playback | +| iOS/tvOS | THEOlive/HESP streams **only** in practice | `0` for regular `AVPlayer` playback (HLS, MP4) | + +- On **iOS/tvOS** the value is only meaningful for THEOlive/HESP sources. For ordinary HLS/MP4 played it stays `0`. +- On **Android** and **Web** the estimate is reported for regular adaptive streams as well; it is not + HESP-specific. diff --git a/example/ios/Podfile.lock b/example/ios/Podfile.lock index f6c3eb430..e9ced27b5 100644 --- a/example/ios/Podfile.lock +++ b/example/ios/Podfile.lock @@ -1,41 +1,41 @@ PODS: - DSFRegex (3.3.1) - - FBLazyVector (0.84.1-0) + - FBLazyVector (0.86.2-0) - google-cast-sdk-dynamic-xcframework (4.8.3) - GoogleAds-IMA-iOS-SDK (3.32.0) - GoogleAds-IMA-tvOS-SDK (4.17.0) - - hermes-engine (250829098.0.9): - - hermes-engine/Pre-built (= 250829098.0.9) - - hermes-engine/Pre-built (250829098.0.9) + - hermes-engine (250829098.0.16): + - hermes-engine/Pre-built (= 250829098.0.16) + - hermes-engine/Pre-built (250829098.0.16) - MillicastSDK (2.6.0) - PromisesObjC (2.4.1) - - RCTDeprecation (0.84.1-0) - - RCTRequired (0.84.1-0) - - RCTSwiftUI (0.84.1-0) - - RCTSwiftUIWrapper (0.84.1-0): + - RCTDeprecation (0.86.2-0) + - RCTRequired (0.86.2-0) + - RCTSwiftUI (0.86.2-0) + - RCTSwiftUIWrapper (0.86.2-0): - RCTSwiftUI - - RCTTypeSafety (0.84.1-0): - - FBLazyVector (= 0.84.1-0) - - RCTRequired (= 0.84.1-0) - - React-Core (= 0.84.1-0) - - React (0.84.1-0): - - React-Core (= 0.84.1-0) - - React-Core/DevSupport (= 0.84.1-0) - - React-Core/RCTWebSocket (= 0.84.1-0) - - React-RCTActionSheet (= 0.84.1-0) - - React-RCTAnimation (= 0.84.1-0) - - React-RCTBlob (= 0.84.1-0) - - React-RCTImage (= 0.84.1-0) - - React-RCTLinking (= 0.84.1-0) - - React-RCTNetwork (= 0.84.1-0) - - React-RCTSettings (= 0.84.1-0) - - React-RCTText (= 0.84.1-0) - - React-callinvoker (0.84.1-0) - - React-Core (0.84.1-0): + - RCTTypeSafety (0.86.2-0): + - FBLazyVector (= 0.86.2-0) + - RCTRequired (= 0.86.2-0) + - React-Core (= 0.86.2-0) + - React (0.86.2-0): + - React-Core (= 0.86.2-0) + - React-Core/DevSupport (= 0.86.2-0) + - React-Core/RCTWebSocket (= 0.86.2-0) + - React-RCTActionSheet (= 0.86.2-0) + - React-RCTAnimation (= 0.86.2-0) + - React-RCTBlob (= 0.86.2-0) + - React-RCTImage (= 0.86.2-0) + - React-RCTLinking (= 0.86.2-0) + - React-RCTNetwork (= 0.86.2-0) + - React-RCTSettings (= 0.86.2-0) + - React-RCTText (= 0.86.2-0) + - React-callinvoker (0.86.2-0) + - React-Core (0.86.2-0): - hermes-engine - RCTDeprecation - React-Core-prebuilt - - React-Core/Default (= 0.84.1-0) + - React-Core/Default (= 0.86.2-0) - React-cxxreact - React-featureflags - React-hermes @@ -50,9 +50,9 @@ PODS: - React-utils - ReactNativeDependencies - Yoga - - React-Core-prebuilt (0.84.1-0): + - React-Core-prebuilt (0.86.2-0): - ReactNativeDependencies - - React-Core/CoreModulesHeaders (0.84.1-0): + - React-Core/CoreModulesHeaders (0.86.2-0): - hermes-engine - RCTDeprecation - React-Core-prebuilt @@ -71,7 +71,7 @@ PODS: - React-utils - ReactNativeDependencies - Yoga - - React-Core/Default (0.84.1-0): + - React-Core/Default (0.86.2-0): - hermes-engine - RCTDeprecation - React-Core-prebuilt @@ -89,12 +89,12 @@ PODS: - React-utils - ReactNativeDependencies - Yoga - - React-Core/DevSupport (0.84.1-0): + - React-Core/DevSupport (0.86.2-0): - hermes-engine - RCTDeprecation - React-Core-prebuilt - - React-Core/Default (= 0.84.1-0) - - React-Core/RCTWebSocket (= 0.84.1-0) + - React-Core/Default (= 0.86.2-0) + - React-Core/RCTWebSocket (= 0.86.2-0) - React-cxxreact - React-featureflags - React-hermes @@ -109,7 +109,7 @@ PODS: - React-utils - ReactNativeDependencies - Yoga - - React-Core/RCTActionSheetHeaders (0.84.1-0): + - React-Core/RCTActionSheetHeaders (0.86.2-0): - hermes-engine - RCTDeprecation - React-Core-prebuilt @@ -128,7 +128,7 @@ PODS: - React-utils - ReactNativeDependencies - Yoga - - React-Core/RCTAnimationHeaders (0.84.1-0): + - React-Core/RCTAnimationHeaders (0.86.2-0): - hermes-engine - RCTDeprecation - React-Core-prebuilt @@ -147,7 +147,7 @@ PODS: - React-utils - ReactNativeDependencies - Yoga - - React-Core/RCTBlobHeaders (0.84.1-0): + - React-Core/RCTBlobHeaders (0.86.2-0): - hermes-engine - RCTDeprecation - React-Core-prebuilt @@ -166,7 +166,7 @@ PODS: - React-utils - ReactNativeDependencies - Yoga - - React-Core/RCTImageHeaders (0.84.1-0): + - React-Core/RCTImageHeaders (0.86.2-0): - hermes-engine - RCTDeprecation - React-Core-prebuilt @@ -185,7 +185,7 @@ PODS: - React-utils - ReactNativeDependencies - Yoga - - React-Core/RCTLinkingHeaders (0.84.1-0): + - React-Core/RCTLinkingHeaders (0.86.2-0): - hermes-engine - RCTDeprecation - React-Core-prebuilt @@ -204,7 +204,7 @@ PODS: - React-utils - ReactNativeDependencies - Yoga - - React-Core/RCTNetworkHeaders (0.84.1-0): + - React-Core/RCTNetworkHeaders (0.86.2-0): - hermes-engine - RCTDeprecation - React-Core-prebuilt @@ -223,7 +223,7 @@ PODS: - React-utils - ReactNativeDependencies - Yoga - - React-Core/RCTSettingsHeaders (0.84.1-0): + - React-Core/RCTSettingsHeaders (0.86.2-0): - hermes-engine - RCTDeprecation - React-Core-prebuilt @@ -242,7 +242,7 @@ PODS: - React-utils - ReactNativeDependencies - Yoga - - React-Core/RCTTextHeaders (0.84.1-0): + - React-Core/RCTTextHeaders (0.86.2-0): - hermes-engine - RCTDeprecation - React-Core-prebuilt @@ -261,7 +261,7 @@ PODS: - React-utils - ReactNativeDependencies - Yoga - - React-Core/RCTVibrationHeaders (0.84.1-0): + - React-Core/RCTVibrationHeaders (0.86.2-0): - hermes-engine - RCTDeprecation - React-Core-prebuilt @@ -280,11 +280,11 @@ PODS: - React-utils - ReactNativeDependencies - Yoga - - React-Core/RCTWebSocket (0.84.1-0): + - React-Core/RCTWebSocket (0.86.2-0): - hermes-engine - RCTDeprecation - React-Core-prebuilt - - React-Core/Default (= 0.84.1-0) + - React-Core/Default (= 0.86.2-0) - React-cxxreact - React-featureflags - React-hermes @@ -299,43 +299,47 @@ PODS: - React-utils - ReactNativeDependencies - Yoga - - React-CoreModules (0.84.1-0): - - RCTTypeSafety (= 0.84.1-0) + - React-CoreModules (0.86.2-0): + - RCTTypeSafety (= 0.86.2-0) - React-Core-prebuilt - - React-Core/CoreModulesHeaders (= 0.84.1-0) + - React-Core/CoreModulesHeaders (= 0.86.2-0) - React-debug - - React-jsi (= 0.84.1-0) + - React-featureflags + - React-jsi (= 0.86.2-0) - React-jsinspector - React-jsinspectorcdp - React-jsinspectortracing - React-NativeModulesApple - React-RCTBlob - React-RCTFBReactNativeSpec - - React-RCTImage (= 0.84.1-0) + - React-RCTImage (= 0.86.2-0) - React-runtimeexecutor - React-utils - ReactCommon - ReactNativeDependencies - - React-cxxreact (0.84.1-0): + - React-cxxreact (0.86.2-0): - hermes-engine - - React-callinvoker (= 0.84.1-0) + - React-callinvoker (= 0.86.2-0) - React-Core-prebuilt - - React-debug (= 0.84.1-0) - - React-jsi (= 0.84.1-0) + - React-debug (= 0.86.2-0) + - React-jsi (= 0.86.2-0) - React-jsinspector - React-jsinspectorcdp - React-jsinspectortracing - - React-logger (= 0.84.1-0) - - React-perflogger (= 0.84.1-0) + - React-logger (= 0.86.2-0) + - React-perflogger (= 0.86.2-0) - React-runtimeexecutor - - React-timing (= 0.84.1-0) + - React-timing (= 0.86.2-0) - React-utils - ReactNativeDependencies - - React-debug (0.84.1-0) - - React-defaultsnativemodule (0.84.1-0): + - React-debug (0.86.2-0): + - React-debug/redbox (= 0.86.2-0) + - React-debug/redbox (0.86.2-0) + - React-defaultsnativemodule (0.86.2-0): - hermes-engine - React-Core-prebuilt - React-domnativemodule + - React-Fabric/animated - React-featureflags - React-featureflagsnativemodule - React-idlecallbacksnativemodule @@ -343,11 +347,13 @@ PODS: - React-jsi - React-jsiexecutor - React-microtasksnativemodule + - React-mutationobservernativemodule - React-RCTFBReactNativeSpec + - React-viewtransitionnativemodule - React-webperformancenativemodule - ReactNativeDependencies - Yoga - - React-domnativemodule (0.84.1-0): + - React-domnativemodule (0.86.2-0): - hermes-engine - React-Core-prebuilt - React-Fabric @@ -361,7 +367,7 @@ PODS: - ReactCommon/turbomodule/core - ReactNativeDependencies - Yoga - - React-Fabric (0.84.1-0): + - React-Fabric (0.86.2-0): - hermes-engine - RCTRequired - RCTTypeSafety @@ -369,25 +375,25 @@ PODS: - React-Core-prebuilt - React-cxxreact - React-debug - - React-Fabric/animated (= 0.84.1-0) - - React-Fabric/animationbackend (= 0.84.1-0) - - React-Fabric/animations (= 0.84.1-0) - - React-Fabric/attributedstring (= 0.84.1-0) - - React-Fabric/bridging (= 0.84.1-0) - - React-Fabric/componentregistry (= 0.84.1-0) - - React-Fabric/componentregistrynative (= 0.84.1-0) - - React-Fabric/components (= 0.84.1-0) - - React-Fabric/consistency (= 0.84.1-0) - - React-Fabric/core (= 0.84.1-0) - - React-Fabric/dom (= 0.84.1-0) - - React-Fabric/imagemanager (= 0.84.1-0) - - React-Fabric/leakchecker (= 0.84.1-0) - - React-Fabric/mounting (= 0.84.1-0) - - React-Fabric/observers (= 0.84.1-0) - - React-Fabric/scheduler (= 0.84.1-0) - - React-Fabric/telemetry (= 0.84.1-0) - - React-Fabric/templateprocessor (= 0.84.1-0) - - React-Fabric/uimanager (= 0.84.1-0) + - React-Fabric/animated (= 0.86.2-0) + - React-Fabric/animationbackend (= 0.86.2-0) + - React-Fabric/animations (= 0.86.2-0) + - React-Fabric/attributedstring (= 0.86.2-0) + - React-Fabric/bridging (= 0.86.2-0) + - React-Fabric/componentregistry (= 0.86.2-0) + - React-Fabric/componentregistrynative (= 0.86.2-0) + - React-Fabric/components (= 0.86.2-0) + - React-Fabric/consistency (= 0.86.2-0) + - React-Fabric/core (= 0.86.2-0) + - React-Fabric/dom (= 0.86.2-0) + - React-Fabric/imagemanager (= 0.86.2-0) + - React-Fabric/leakchecker (= 0.86.2-0) + - React-Fabric/mounting (= 0.86.2-0) + - React-Fabric/observers (= 0.86.2-0) + - React-Fabric/scheduler (= 0.86.2-0) + - React-Fabric/telemetry (= 0.86.2-0) + - React-Fabric/uimanager (= 0.86.2-0) + - React-Fabric/viewtransition (= 0.86.2-0) - React-featureflags - React-graphics - React-jsi @@ -399,7 +405,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - ReactNativeDependencies - - React-Fabric/animated (0.84.1-0): + - React-Fabric/animated (0.86.2-0): - hermes-engine - RCTRequired - RCTTypeSafety @@ -407,6 +413,7 @@ PODS: - React-Core-prebuilt - React-cxxreact - React-debug + - React-Fabric/animationbackend - React-featureflags - React-graphics - React-jsi @@ -418,7 +425,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - ReactNativeDependencies - - React-Fabric/animationbackend (0.84.1-0): + - React-Fabric/animationbackend (0.86.2-0): - hermes-engine - RCTRequired - RCTTypeSafety @@ -437,7 +444,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - ReactNativeDependencies - - React-Fabric/animations (0.84.1-0): + - React-Fabric/animations (0.86.2-0): - hermes-engine - RCTRequired - RCTTypeSafety @@ -456,7 +463,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - ReactNativeDependencies - - React-Fabric/attributedstring (0.84.1-0): + - React-Fabric/attributedstring (0.86.2-0): - hermes-engine - RCTRequired - RCTTypeSafety @@ -475,7 +482,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - ReactNativeDependencies - - React-Fabric/bridging (0.84.1-0): + - React-Fabric/bridging (0.86.2-0): - hermes-engine - RCTRequired - RCTTypeSafety @@ -494,7 +501,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - ReactNativeDependencies - - React-Fabric/componentregistry (0.84.1-0): + - React-Fabric/componentregistry (0.86.2-0): - hermes-engine - RCTRequired - RCTTypeSafety @@ -513,7 +520,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - ReactNativeDependencies - - React-Fabric/componentregistrynative (0.84.1-0): + - React-Fabric/componentregistrynative (0.86.2-0): - hermes-engine - RCTRequired - RCTTypeSafety @@ -532,7 +539,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - ReactNativeDependencies - - React-Fabric/components (0.84.1-0): + - React-Fabric/components (0.86.2-0): - hermes-engine - RCTRequired - RCTTypeSafety @@ -540,10 +547,10 @@ PODS: - React-Core-prebuilt - React-cxxreact - React-debug - - React-Fabric/components/legacyviewmanagerinterop (= 0.84.1-0) - - React-Fabric/components/root (= 0.84.1-0) - - React-Fabric/components/scrollview (= 0.84.1-0) - - React-Fabric/components/view (= 0.84.1-0) + - React-Fabric/components/legacyviewmanagerinterop (= 0.86.2-0) + - React-Fabric/components/root (= 0.86.2-0) + - React-Fabric/components/scrollview (= 0.86.2-0) + - React-Fabric/components/view (= 0.86.2-0) - React-featureflags - React-graphics - React-jsi @@ -555,7 +562,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - ReactNativeDependencies - - React-Fabric/components/legacyviewmanagerinterop (0.84.1-0): + - React-Fabric/components/legacyviewmanagerinterop (0.86.2-0): - hermes-engine - RCTRequired - RCTTypeSafety @@ -574,7 +581,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - ReactNativeDependencies - - React-Fabric/components/root (0.84.1-0): + - React-Fabric/components/root (0.86.2-0): - hermes-engine - RCTRequired - RCTTypeSafety @@ -593,7 +600,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - ReactNativeDependencies - - React-Fabric/components/scrollview (0.84.1-0): + - React-Fabric/components/scrollview (0.86.2-0): - hermes-engine - RCTRequired - RCTTypeSafety @@ -612,7 +619,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - ReactNativeDependencies - - React-Fabric/components/view (0.84.1-0): + - React-Fabric/components/view (0.86.2-0): - hermes-engine - RCTRequired - RCTTypeSafety @@ -633,7 +640,7 @@ PODS: - ReactCommon/turbomodule/core - ReactNativeDependencies - Yoga - - React-Fabric/consistency (0.84.1-0): + - React-Fabric/consistency (0.86.2-0): - hermes-engine - RCTRequired - RCTTypeSafety @@ -652,7 +659,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - ReactNativeDependencies - - React-Fabric/core (0.84.1-0): + - React-Fabric/core (0.86.2-0): - hermes-engine - RCTRequired - RCTTypeSafety @@ -671,7 +678,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - ReactNativeDependencies - - React-Fabric/dom (0.84.1-0): + - React-Fabric/dom (0.86.2-0): - hermes-engine - RCTRequired - RCTTypeSafety @@ -690,7 +697,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - ReactNativeDependencies - - React-Fabric/imagemanager (0.84.1-0): + - React-Fabric/imagemanager (0.86.2-0): - hermes-engine - RCTRequired - RCTTypeSafety @@ -709,7 +716,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - ReactNativeDependencies - - React-Fabric/leakchecker (0.84.1-0): + - React-Fabric/leakchecker (0.86.2-0): - hermes-engine - RCTRequired - RCTTypeSafety @@ -728,7 +735,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - ReactNativeDependencies - - React-Fabric/mounting (0.84.1-0): + - React-Fabric/mounting (0.86.2-0): - hermes-engine - RCTRequired - RCTTypeSafety @@ -740,6 +747,7 @@ PODS: - React-graphics - React-jsi - React-jsiexecutor + - React-jsinspectortracing - React-logger - React-rendererdebug - React-runtimeexecutor @@ -747,7 +755,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - ReactNativeDependencies - - React-Fabric/observers (0.84.1-0): + - React-Fabric/observers (0.86.2-0): - hermes-engine - RCTRequired - RCTTypeSafety @@ -755,8 +763,9 @@ PODS: - React-Core-prebuilt - React-cxxreact - React-debug - - React-Fabric/observers/events (= 0.84.1-0) - - React-Fabric/observers/intersection (= 0.84.1-0) + - React-Fabric/observers/events (= 0.86.2-0) + - React-Fabric/observers/intersection (= 0.86.2-0) + - React-Fabric/observers/mutation (= 0.86.2-0) - React-featureflags - React-graphics - React-jsi @@ -768,7 +777,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - ReactNativeDependencies - - React-Fabric/observers/events (0.84.1-0): + - React-Fabric/observers/events (0.86.2-0): - hermes-engine - RCTRequired - RCTTypeSafety @@ -787,7 +796,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - ReactNativeDependencies - - React-Fabric/observers/intersection (0.84.1-0): + - React-Fabric/observers/intersection (0.86.2-0): - hermes-engine - RCTRequired - RCTTypeSafety @@ -806,7 +815,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - ReactNativeDependencies - - React-Fabric/scheduler (0.84.1-0): + - React-Fabric/observers/mutation (0.86.2-0): - hermes-engine - RCTRequired - RCTTypeSafety @@ -814,21 +823,18 @@ PODS: - React-Core-prebuilt - React-cxxreact - React-debug - - React-Fabric/observers/events - React-featureflags - React-graphics - React-jsi - React-jsiexecutor - React-logger - - React-performancecdpmetrics - - React-performancetimeline - React-rendererdebug - React-runtimeexecutor - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - ReactNativeDependencies - - React-Fabric/telemetry (0.84.1-0): + - React-Fabric/scheduler (0.86.2-0): - hermes-engine - RCTRequired - RCTTypeSafety @@ -836,18 +842,23 @@ PODS: - React-Core-prebuilt - React-cxxreact - React-debug + - React-Fabric/animationbackend + - React-Fabric/observers/events + - React-Fabric/viewtransition - React-featureflags - React-graphics - React-jsi - React-jsiexecutor - React-logger + - React-performancecdpmetrics + - React-performancetimeline - React-rendererdebug - React-runtimeexecutor - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - ReactNativeDependencies - - React-Fabric/templateprocessor (0.84.1-0): + - React-Fabric/telemetry (0.86.2-0): - hermes-engine - RCTRequired - RCTTypeSafety @@ -866,7 +877,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - ReactNativeDependencies - - React-Fabric/uimanager (0.84.1-0): + - React-Fabric/uimanager (0.86.2-0): - hermes-engine - RCTRequired - RCTTypeSafety @@ -874,7 +885,7 @@ PODS: - React-Core-prebuilt - React-cxxreact - React-debug - - React-Fabric/uimanager/consistency (= 0.84.1-0) + - React-Fabric/uimanager/consistency (= 0.86.2-0) - React-featureflags - React-graphics - React-jsi @@ -887,7 +898,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - ReactNativeDependencies - - React-Fabric/uimanager/consistency (0.84.1-0): + - React-Fabric/uimanager/consistency (0.86.2-0): - hermes-engine - RCTRequired - RCTTypeSafety @@ -907,7 +918,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - ReactNativeDependencies - - React-FabricComponents (0.84.1-0): + - React-Fabric/viewtransition (0.86.2-0): - hermes-engine - RCTRequired - RCTTypeSafety @@ -915,22 +926,18 @@ PODS: - React-Core-prebuilt - React-cxxreact - React-debug - - React-Fabric - - React-FabricComponents/components (= 0.84.1-0) - - React-FabricComponents/textlayoutmanager (= 0.84.1-0) - React-featureflags - React-graphics - React-jsi - React-jsiexecutor - React-logger - - React-RCTFBReactNativeSpec - React-rendererdebug + - React-runtimeexecutor - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - ReactNativeDependencies - - Yoga - - React-FabricComponents/components (0.84.1-0): + - React-FabricComponents (0.86.2-0): - hermes-engine - RCTRequired - RCTTypeSafety @@ -939,18 +946,8 @@ PODS: - React-cxxreact - React-debug - React-Fabric - - React-FabricComponents/components/inputaccessory (= 0.84.1-0) - - React-FabricComponents/components/iostextinput (= 0.84.1-0) - - React-FabricComponents/components/modal (= 0.84.1-0) - - React-FabricComponents/components/rncore (= 0.84.1-0) - - React-FabricComponents/components/safeareaview (= 0.84.1-0) - - React-FabricComponents/components/scrollview (= 0.84.1-0) - - React-FabricComponents/components/switch (= 0.84.1-0) - - React-FabricComponents/components/text (= 0.84.1-0) - - React-FabricComponents/components/textinput (= 0.84.1-0) - - React-FabricComponents/components/unimplementedview (= 0.84.1-0) - - React-FabricComponents/components/virtualview (= 0.84.1-0) - - React-FabricComponents/components/virtualviewexperimental (= 0.84.1-0) + - React-FabricComponents/components (= 0.86.2-0) + - React-FabricComponents/textlayoutmanager (= 0.86.2-0) - React-featureflags - React-graphics - React-jsi @@ -963,7 +960,7 @@ PODS: - ReactCommon/turbomodule/core - ReactNativeDependencies - Yoga - - React-FabricComponents/components/inputaccessory (0.84.1-0): + - React-FabricComponents/components (0.86.2-0): - hermes-engine - RCTRequired - RCTTypeSafety @@ -972,6 +969,17 @@ PODS: - React-cxxreact - React-debug - React-Fabric + - React-FabricComponents/components/inputaccessory (= 0.86.2-0) + - React-FabricComponents/components/iostextinput (= 0.86.2-0) + - React-FabricComponents/components/modal (= 0.86.2-0) + - React-FabricComponents/components/rncore (= 0.86.2-0) + - React-FabricComponents/components/safeareaview (= 0.86.2-0) + - React-FabricComponents/components/scrollview (= 0.86.2-0) + - React-FabricComponents/components/switch (= 0.86.2-0) + - React-FabricComponents/components/text (= 0.86.2-0) + - React-FabricComponents/components/textinput (= 0.86.2-0) + - React-FabricComponents/components/unimplementedview (= 0.86.2-0) + - React-FabricComponents/components/virtualview (= 0.86.2-0) - React-featureflags - React-graphics - React-jsi @@ -984,7 +992,7 @@ PODS: - ReactCommon/turbomodule/core - ReactNativeDependencies - Yoga - - React-FabricComponents/components/iostextinput (0.84.1-0): + - React-FabricComponents/components/inputaccessory (0.86.2-0): - hermes-engine - RCTRequired - RCTTypeSafety @@ -1005,7 +1013,7 @@ PODS: - ReactCommon/turbomodule/core - ReactNativeDependencies - Yoga - - React-FabricComponents/components/modal (0.84.1-0): + - React-FabricComponents/components/iostextinput (0.86.2-0): - hermes-engine - RCTRequired - RCTTypeSafety @@ -1026,7 +1034,7 @@ PODS: - ReactCommon/turbomodule/core - ReactNativeDependencies - Yoga - - React-FabricComponents/components/rncore (0.84.1-0): + - React-FabricComponents/components/modal (0.86.2-0): - hermes-engine - RCTRequired - RCTTypeSafety @@ -1047,7 +1055,7 @@ PODS: - ReactCommon/turbomodule/core - ReactNativeDependencies - Yoga - - React-FabricComponents/components/safeareaview (0.84.1-0): + - React-FabricComponents/components/rncore (0.86.2-0): - hermes-engine - RCTRequired - RCTTypeSafety @@ -1068,7 +1076,7 @@ PODS: - ReactCommon/turbomodule/core - ReactNativeDependencies - Yoga - - React-FabricComponents/components/scrollview (0.84.1-0): + - React-FabricComponents/components/safeareaview (0.86.2-0): - hermes-engine - RCTRequired - RCTTypeSafety @@ -1089,7 +1097,7 @@ PODS: - ReactCommon/turbomodule/core - ReactNativeDependencies - Yoga - - React-FabricComponents/components/switch (0.84.1-0): + - React-FabricComponents/components/scrollview (0.86.2-0): - hermes-engine - RCTRequired - RCTTypeSafety @@ -1110,7 +1118,7 @@ PODS: - ReactCommon/turbomodule/core - ReactNativeDependencies - Yoga - - React-FabricComponents/components/text (0.84.1-0): + - React-FabricComponents/components/switch (0.86.2-0): - hermes-engine - RCTRequired - RCTTypeSafety @@ -1131,7 +1139,7 @@ PODS: - ReactCommon/turbomodule/core - ReactNativeDependencies - Yoga - - React-FabricComponents/components/textinput (0.84.1-0): + - React-FabricComponents/components/text (0.86.2-0): - hermes-engine - RCTRequired - RCTTypeSafety @@ -1152,7 +1160,7 @@ PODS: - ReactCommon/turbomodule/core - ReactNativeDependencies - Yoga - - React-FabricComponents/components/unimplementedview (0.84.1-0): + - React-FabricComponents/components/textinput (0.86.2-0): - hermes-engine - RCTRequired - RCTTypeSafety @@ -1173,7 +1181,7 @@ PODS: - ReactCommon/turbomodule/core - ReactNativeDependencies - Yoga - - React-FabricComponents/components/virtualview (0.84.1-0): + - React-FabricComponents/components/unimplementedview (0.86.2-0): - hermes-engine - RCTRequired - RCTTypeSafety @@ -1194,7 +1202,7 @@ PODS: - ReactCommon/turbomodule/core - ReactNativeDependencies - Yoga - - React-FabricComponents/components/virtualviewexperimental (0.84.1-0): + - React-FabricComponents/components/virtualview (0.86.2-0): - hermes-engine - RCTRequired - RCTTypeSafety @@ -1215,7 +1223,7 @@ PODS: - ReactCommon/turbomodule/core - ReactNativeDependencies - Yoga - - React-FabricComponents/textlayoutmanager (0.84.1-0): + - React-FabricComponents/textlayoutmanager (0.86.2-0): - hermes-engine - RCTRequired - RCTTypeSafety @@ -1236,27 +1244,27 @@ PODS: - ReactCommon/turbomodule/core - ReactNativeDependencies - Yoga - - React-FabricImage (0.84.1-0): + - React-FabricImage (0.86.2-0): - hermes-engine - - RCTRequired (= 0.84.1-0) - - RCTTypeSafety (= 0.84.1-0) + - RCTRequired (= 0.86.2-0) + - RCTTypeSafety (= 0.86.2-0) - React-Core-prebuilt - React-Fabric - React-featureflags - React-graphics - React-ImageManager - React-jsi - - React-jsiexecutor (= 0.84.1-0) + - React-jsiexecutor (= 0.86.2-0) - React-logger - React-rendererdebug - React-utils - ReactCommon - ReactNativeDependencies - Yoga - - React-featureflags (0.84.1-0): + - React-featureflags (0.86.2-0): - React-Core-prebuilt - ReactNativeDependencies - - React-featureflagsnativemodule (0.84.1-0): + - React-featureflagsnativemodule (0.86.2-0): - hermes-engine - React-Core-prebuilt - React-featureflags @@ -1265,28 +1273,30 @@ PODS: - React-RCTFBReactNativeSpec - ReactCommon/turbomodule/core - ReactNativeDependencies - - React-graphics (0.84.1-0): + - React-graphics (0.86.2-0): - hermes-engine - React-Core-prebuilt + - React-featureflags - React-jsi - React-jsiexecutor + - React-rendererdebug - React-utils - ReactNativeDependencies - - React-hermes (0.84.1-0): + - React-hermes (0.86.2-0): - hermes-engine - React-Core-prebuilt - - React-cxxreact (= 0.84.1-0) + - React-cxxreact (= 0.86.2-0) - React-jsi - - React-jsiexecutor (= 0.84.1-0) + - React-jsiexecutor (= 0.86.2-0) - React-jsinspector - React-jsinspectorcdp - React-jsinspectortracing - React-jsitooling - React-oscompat - - React-perflogger (= 0.84.1-0) + - React-perflogger (= 0.86.2-0) - React-runtimeexecutor - ReactNativeDependencies - - React-idlecallbacksnativemodule (0.84.1-0): + - React-idlecallbacksnativemodule (0.86.2-0): - hermes-engine - React-Core-prebuilt - React-jsi @@ -1296,7 +1306,7 @@ PODS: - React-runtimescheduler - ReactCommon/turbomodule/core - ReactNativeDependencies - - React-ImageManager (0.84.1-0): + - React-ImageManager (0.86.2-0): - React-Core-prebuilt - React-Core/Default - React-debug @@ -1305,7 +1315,7 @@ PODS: - React-rendererdebug - React-utils - ReactNativeDependencies - - React-intersectionobservernativemodule (0.84.1-0): + - React-intersectionobservernativemodule (0.86.2-0): - hermes-engine - React-Core-prebuilt - React-cxxreact @@ -1320,7 +1330,7 @@ PODS: - ReactCommon/turbomodule/core - ReactNativeDependencies - Yoga - - React-jserrorhandler (0.84.1-0): + - React-jserrorhandler (0.86.2-0): - hermes-engine - React-Core-prebuilt - React-cxxreact @@ -1329,11 +1339,11 @@ PODS: - React-jsi - ReactCommon/turbomodule/bridging - ReactNativeDependencies - - React-jsi (0.84.1-0): + - React-jsi (0.86.2-0): - hermes-engine - React-Core-prebuilt - ReactNativeDependencies - - React-jsiexecutor (0.84.1-0): + - React-jsiexecutor (0.86.2-0): - hermes-engine - React-Core-prebuilt - React-cxxreact @@ -1348,7 +1358,7 @@ PODS: - React-runtimeexecutor - React-utils - ReactNativeDependencies - - React-jsinspector (0.84.1-0): + - React-jsinspector (0.86.2-0): - hermes-engine - React-Core-prebuilt - React-featureflags @@ -1357,47 +1367,48 @@ PODS: - React-jsinspectornetwork - React-jsinspectortracing - React-oscompat - - React-perflogger (= 0.84.1-0) + - React-perflogger (= 0.86.2-0) - React-runtimeexecutor - React-utils - ReactNativeDependencies - - React-jsinspectorcdp (0.84.1-0): + - React-jsinspectorcdp (0.86.2-0): - React-Core-prebuilt - ReactNativeDependencies - - React-jsinspectornetwork (0.84.1-0): + - React-jsinspectornetwork (0.86.2-0): - React-Core-prebuilt - React-jsinspectorcdp - ReactNativeDependencies - - React-jsinspectortracing (0.84.1-0): + - React-jsinspectortracing (0.86.2-0): - hermes-engine - React-Core-prebuilt - React-jsi - React-jsinspectornetwork - React-oscompat - React-timing + - React-utils - ReactNativeDependencies - - React-jsitooling (0.84.1-0): + - React-jsitooling (0.86.2-0): - hermes-engine - React-Core-prebuilt - - React-cxxreact (= 0.84.1-0) + - React-cxxreact (= 0.86.2-0) - React-debug - - React-jsi (= 0.84.1-0) + - React-jsi (= 0.86.2-0) - React-jsinspector - React-jsinspectorcdp - React-jsinspectortracing - React-runtimeexecutor - React-utils - ReactNativeDependencies - - React-jsitracing (0.84.1-0): + - React-jsitracing (0.86.2-0): - React-jsi - - React-logger (0.84.1-0): + - React-logger (0.86.2-0): - React-Core-prebuilt - ReactNativeDependencies - - React-Mapbuffer (0.84.1-0): + - React-Mapbuffer (0.86.2-0): - React-Core-prebuilt - React-debug - ReactNativeDependencies - - React-microtasksnativemodule (0.84.1-0): + - React-microtasksnativemodule (0.86.2-0): - hermes-engine - React-Core-prebuilt - React-jsi @@ -1405,6 +1416,21 @@ PODS: - React-RCTFBReactNativeSpec - ReactCommon/turbomodule/core - ReactNativeDependencies + - React-mutationobservernativemodule (0.86.2-0): + - hermes-engine + - React-Core-prebuilt + - React-cxxreact + - React-Fabric + - React-Fabric/bridging + - React-Fabric/observers/mutation + - React-featureflags + - React-jsi + - React-jsiexecutor + - React-RCTFBReactNativeSpec + - React-runtimeexecutor + - ReactCommon/turbomodule/core + - ReactNativeDependencies + - Yoga - react-native-google-cast (4.6.2): - React - react-native-google-cast/GuestMode (= 4.6.2) @@ -1493,7 +1519,7 @@ PODS: - THEOplayer-Integration-THEOads (~> 11.4) - THEOplayer-Integration-THEOlive (~> 11.4) - THEOplayerSDK-core (~> 11.4) - - React-NativeModulesApple (0.84.1-0): + - React-NativeModulesApple (0.86.2-0): - hermes-engine - React-callinvoker - React-Core @@ -1508,18 +1534,18 @@ PODS: - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - ReactNativeDependencies - - React-networking (0.84.1-0): + - React-networking (0.86.2-0): - React-Core-prebuilt - React-jsinspectornetwork - React-jsinspectortracing - React-performancetimeline - React-timing - ReactNativeDependencies - - React-oscompat (0.84.1-0) - - React-perflogger (0.84.1-0): + - React-oscompat (0.86.2-0) + - React-perflogger (0.86.2-0): - React-Core-prebuilt - ReactNativeDependencies - - React-performancecdpmetrics (0.84.1-0): + - React-performancecdpmetrics (0.86.2-0): - hermes-engine - React-Core-prebuilt - React-jsi @@ -1527,7 +1553,7 @@ PODS: - React-runtimeexecutor - React-timing - ReactNativeDependencies - - React-performancetimeline (0.84.1-0): + - React-performancetimeline (0.86.2-0): - React-Core-prebuilt - React-featureflags - React-jsinspector @@ -1535,9 +1561,9 @@ PODS: - React-perflogger - React-timing - ReactNativeDependencies - - React-RCTActionSheet (0.84.1-0): - - React-Core/RCTActionSheetHeaders (= 0.84.1-0) - - React-RCTAnimation (0.84.1-0): + - React-RCTActionSheet (0.86.2-0): + - React-Core/RCTActionSheetHeaders (= 0.86.2-0) + - React-RCTAnimation (0.86.2-0): - RCTTypeSafety - React-Core-prebuilt - React-Core/RCTAnimationHeaders @@ -1548,7 +1574,7 @@ PODS: - React-RCTFBReactNativeSpec - ReactCommon - ReactNativeDependencies - - React-RCTAppDelegate (0.84.1-0): + - React-RCTAppDelegate (0.86.2-0): - hermes-engine - RCTRequired - RCTTypeSafety @@ -1576,7 +1602,7 @@ PODS: - React-utils - ReactCommon - ReactNativeDependencies - - React-RCTBlob (0.84.1-0): + - React-RCTBlob (0.86.2-0): - hermes-engine - React-Core-prebuilt - React-Core/RCTBlobHeaders @@ -1589,7 +1615,7 @@ PODS: - React-RCTNetwork - ReactCommon - ReactNativeDependencies - - React-RCTFabric (0.84.1-0): + - React-RCTFabric (0.86.2-0): - hermes-engine - RCTSwiftUIWrapper - React-Core @@ -1620,7 +1646,7 @@ PODS: - React-utils - ReactNativeDependencies - Yoga - - React-RCTFBReactNativeSpec (0.84.1-0): + - React-RCTFBReactNativeSpec (0.86.2-0): - hermes-engine - RCTRequired - RCTTypeSafety @@ -1628,10 +1654,10 @@ PODS: - React-Core-prebuilt - React-jsi - React-NativeModulesApple - - React-RCTFBReactNativeSpec/components (= 0.84.1-0) + - React-RCTFBReactNativeSpec/components (= 0.86.2-0) - ReactCommon - ReactNativeDependencies - - React-RCTFBReactNativeSpec/components (0.84.1-0): + - React-RCTFBReactNativeSpec/components (0.86.2-0): - hermes-engine - RCTRequired - RCTTypeSafety @@ -1648,7 +1674,7 @@ PODS: - ReactCommon - ReactNativeDependencies - Yoga - - React-RCTImage (0.84.1-0): + - React-RCTImage (0.86.2-0): - RCTTypeSafety - React-Core-prebuilt - React-Core/RCTImageHeaders @@ -1658,14 +1684,14 @@ PODS: - React-RCTNetwork - ReactCommon - ReactNativeDependencies - - React-RCTLinking (0.84.1-0): - - React-Core/RCTLinkingHeaders (= 0.84.1-0) - - React-jsi (= 0.84.1-0) + - React-RCTLinking (0.86.2-0): + - React-Core/RCTLinkingHeaders (= 0.86.2-0) + - React-jsi (= 0.86.2-0) - React-NativeModulesApple - React-RCTFBReactNativeSpec - ReactCommon - - ReactCommon/turbomodule/core (= 0.84.1-0) - - React-RCTNetwork (0.84.1-0): + - ReactCommon/turbomodule/core (= 0.86.2-0) + - React-RCTNetwork (0.86.2-0): - RCTTypeSafety - React-Core-prebuilt - React-Core/RCTNetworkHeaders @@ -1679,7 +1705,7 @@ PODS: - React-RCTFBReactNativeSpec - ReactCommon - ReactNativeDependencies - - React-RCTRuntime (0.84.1-0): + - React-RCTRuntime (0.86.2-0): - hermes-engine - React-Core - React-Core-prebuilt @@ -1695,7 +1721,7 @@ PODS: - React-RuntimeHermes - React-utils - ReactNativeDependencies - - React-RCTSettings (0.84.1-0): + - React-RCTSettings (0.86.2-0): - RCTTypeSafety - React-Core-prebuilt - React-Core/RCTSettingsHeaders @@ -1704,10 +1730,10 @@ PODS: - React-RCTFBReactNativeSpec - ReactCommon - ReactNativeDependencies - - React-RCTText (0.84.1-0): - - React-Core/RCTTextHeaders (= 0.84.1-0) + - React-RCTText (0.86.2-0): + - React-Core/RCTTextHeaders (= 0.86.2-0) - Yoga - - React-RCTVibration (0.84.1-0): + - React-RCTVibration (0.86.2-0): - React-Core-prebuilt - React-Core/RCTVibrationHeaders - React-jsi @@ -1715,15 +1741,15 @@ PODS: - React-RCTFBReactNativeSpec - ReactCommon - ReactNativeDependencies - - React-rendererconsistency (0.84.1-0) - - React-renderercss (0.84.1-0): + - React-rendererconsistency (0.86.2-0) + - React-renderercss (0.86.2-0): - React-debug - React-utils - - React-rendererdebug (0.84.1-0): + - React-rendererdebug (0.86.2-0): - React-Core-prebuilt - React-debug - ReactNativeDependencies - - React-RuntimeApple (0.84.1-0): + - React-RuntimeApple (0.86.2-0): - hermes-engine - React-callinvoker - React-Core-prebuilt @@ -1746,7 +1772,7 @@ PODS: - React-runtimescheduler - React-utils - ReactNativeDependencies - - React-RuntimeCore (0.84.1-0): + - React-RuntimeCore (0.86.2-0): - hermes-engine - React-Core-prebuilt - React-cxxreact @@ -1762,14 +1788,14 @@ PODS: - React-runtimescheduler - React-utils - ReactNativeDependencies - - React-runtimeexecutor (0.84.1-0): + - React-runtimeexecutor (0.86.2-0): - React-Core-prebuilt - React-debug - React-featureflags - - React-jsi (= 0.84.1-0) + - React-jsi (= 0.86.2-0) - React-utils - ReactNativeDependencies - - React-RuntimeHermes (0.84.1-0): + - React-RuntimeHermes (0.86.2-0): - hermes-engine - React-Core-prebuilt - React-featureflags @@ -1784,7 +1810,7 @@ PODS: - React-runtimeexecutor - React-utils - ReactNativeDependencies - - React-runtimescheduler (0.84.1-0): + - React-runtimescheduler (0.86.2-0): - hermes-engine - React-callinvoker - React-Core-prebuilt @@ -1800,15 +1826,27 @@ PODS: - React-timing - React-utils - ReactNativeDependencies - - React-timing (0.84.1-0): + - React-timing (0.86.2-0): - React-debug - - React-utils (0.84.1-0): + - React-utils (0.86.2-0): - hermes-engine - React-Core-prebuilt - React-debug - - React-jsi (= 0.84.1-0) + - React-jsi (= 0.86.2-0) - ReactNativeDependencies - - React-webperformancenativemodule (0.84.1-0): + - React-viewtransitionnativemodule (0.86.2-0): + - hermes-engine + - React-Core-prebuilt + - React-Fabric + - React-Fabric/bridging + - React-jsi + - React-jsiexecutor + - React-RCTFBReactNativeSpec + - React-runtimeexecutor + - ReactCommon/turbomodule/core + - ReactNativeDependencies + - Yoga + - React-webperformancenativemodule (0.86.2-0): - hermes-engine - React-Core-prebuilt - React-cxxreact @@ -1819,9 +1857,9 @@ PODS: - React-runtimeexecutor - ReactCommon/turbomodule/core - ReactNativeDependencies - - ReactAppDependencyProvider (0.84.1-0): + - ReactAppDependencyProvider (0.86.2-0): - ReactCodegen - - ReactCodegen (0.84.1-0): + - ReactCodegen (0.86.2-0): - hermes-engine - RCTRequired - RCTTypeSafety @@ -1841,44 +1879,44 @@ PODS: - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - ReactNativeDependencies - - ReactCommon (0.84.1-0): + - ReactCommon (0.86.2-0): - React-Core-prebuilt - - ReactCommon/turbomodule (= 0.84.1-0) + - ReactCommon/turbomodule (= 0.86.2-0) - ReactNativeDependencies - - ReactCommon/turbomodule (0.84.1-0): + - ReactCommon/turbomodule (0.86.2-0): - hermes-engine - - React-callinvoker (= 0.84.1-0) + - React-callinvoker (= 0.86.2-0) - React-Core-prebuilt - - React-cxxreact (= 0.84.1-0) - - React-jsi (= 0.84.1-0) - - React-logger (= 0.84.1-0) - - React-perflogger (= 0.84.1-0) - - ReactCommon/turbomodule/bridging (= 0.84.1-0) - - ReactCommon/turbomodule/core (= 0.84.1-0) + - React-cxxreact (= 0.86.2-0) + - React-jsi (= 0.86.2-0) + - React-logger (= 0.86.2-0) + - React-perflogger (= 0.86.2-0) + - ReactCommon/turbomodule/bridging (= 0.86.2-0) + - ReactCommon/turbomodule/core (= 0.86.2-0) - ReactNativeDependencies - - ReactCommon/turbomodule/bridging (0.84.1-0): + - ReactCommon/turbomodule/bridging (0.86.2-0): - hermes-engine - - React-callinvoker (= 0.84.1-0) + - React-callinvoker (= 0.86.2-0) - React-Core-prebuilt - - React-cxxreact (= 0.84.1-0) - - React-jsi (= 0.84.1-0) - - React-logger (= 0.84.1-0) - - React-perflogger (= 0.84.1-0) + - React-cxxreact (= 0.86.2-0) + - React-jsi (= 0.86.2-0) + - React-logger (= 0.86.2-0) + - React-perflogger (= 0.86.2-0) - ReactNativeDependencies - - ReactCommon/turbomodule/core (0.84.1-0): + - ReactCommon/turbomodule/core (0.86.2-0): - hermes-engine - - React-callinvoker (= 0.84.1-0) + - React-callinvoker (= 0.86.2-0) - React-Core-prebuilt - - React-cxxreact (= 0.84.1-0) - - React-debug (= 0.84.1-0) - - React-featureflags (= 0.84.1-0) - - React-jsi (= 0.84.1-0) - - React-logger (= 0.84.1-0) - - React-perflogger (= 0.84.1-0) - - React-utils (= 0.84.1-0) + - React-cxxreact (= 0.86.2-0) + - React-debug (= 0.86.2-0) + - React-featureflags (= 0.86.2-0) + - React-jsi (= 0.86.2-0) + - React-logger (= 0.86.2-0) + - React-perflogger (= 0.86.2-0) + - React-utils (= 0.86.2-0) - ReactNativeDependencies - - ReactNativeDependencies (0.84.1) - - RNSVG (15.15.1): + - ReactNativeDependencies (0.86.2) + - RNSVG (15.15.5): - hermes-engine - RCTRequired - RCTTypeSafety @@ -1899,9 +1937,9 @@ PODS: - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - ReactNativeDependencies - - RNSVG/common (= 15.15.1) + - RNSVG/common (= 15.15.5) - Yoga - - RNSVG/common (15.15.1): + - RNSVG/common (15.15.5): - hermes-engine - RCTRequired - RCTTypeSafety @@ -2004,6 +2042,7 @@ DEPENDENCIES: - React-logger (from `../node_modules/react-native/ReactCommon/logger`) - React-Mapbuffer (from `../node_modules/react-native/ReactCommon`) - React-microtasksnativemodule (from `../node_modules/react-native/ReactCommon/react/nativemodule/microtasks`) + - React-mutationobservernativemodule (from `../node_modules/react-native/ReactCommon/react/nativemodule/mutationobserver`) - react-native-google-cast (from `https://github.com/Danesz/react-native-google-cast.git`, branch `feature/guestmode_apple_silicon`) - react-native-safe-area-context (from `../node_modules/react-native-safe-area-context`) - react-native-theoplayer (from `../node_modules/react-native-theoplayer`) @@ -2036,6 +2075,7 @@ DEPENDENCIES: - React-runtimescheduler (from `../node_modules/react-native/ReactCommon/react/renderer/runtimescheduler`) - React-timing (from `../node_modules/react-native/ReactCommon/react/timing`) - React-utils (from `../node_modules/react-native/ReactCommon/react/utils`) + - React-viewtransitionnativemodule (from `../node_modules/react-native/ReactCommon/react/nativemodule/viewtransition`) - React-webperformancenativemodule (from `../node_modules/react-native/ReactCommon/react/nativemodule/webperformance`) - ReactAppDependencyProvider (from `build/generated/ios/ReactAppDependencyProvider`) - ReactCodegen (from `build/generated/ios/ReactCodegen`) @@ -2068,7 +2108,7 @@ EXTERNAL SOURCES: :path: "../node_modules/react-native/Libraries/FBLazyVector" hermes-engine: :podspec: "../node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec" - :tag: hermes-v250829098.0.9 + :tag: hermes-v250829098.0.16 RCTDeprecation: :path: "../node_modules/react-native/ReactApple/Libraries/RCTFoundation/RCTDeprecation" RCTRequired: @@ -2141,6 +2181,8 @@ EXTERNAL SOURCES: :path: "../node_modules/react-native/ReactCommon" React-microtasksnativemodule: :path: "../node_modules/react-native/ReactCommon/react/nativemodule/microtasks" + React-mutationobservernativemodule: + :path: "../node_modules/react-native/ReactCommon/react/nativemodule/mutationobserver" react-native-google-cast: :branch: feature/guestmode_apple_silicon :git: https://github.com/Danesz/react-native-google-cast.git @@ -2206,6 +2248,8 @@ EXTERNAL SOURCES: :path: "../node_modules/react-native/ReactCommon/react/timing" React-utils: :path: "../node_modules/react-native/ReactCommon/react/utils" + React-viewtransitionnativemodule: + :path: "../node_modules/react-native/ReactCommon/react/nativemodule/viewtransition" React-webperformancenativemodule: :path: "../node_modules/react-native/ReactCommon/react/nativemodule/webperformance" ReactAppDependencyProvider: @@ -2228,49 +2272,50 @@ CHECKOUT OPTIONS: SPEC CHECKSUMS: DSFRegex: 8493187c71ac199695245eb9ec98bad4f87a2f0b - FBLazyVector: a3651a4af13997df8df1bcd5af1cc7507d51dc7b + FBLazyVector: 248c4d075c21685bbf8d27048857a926974d174c google-cast-sdk-dynamic-xcframework: d4dd8d548462f2a4874515fee68c17805d44be42 GoogleAds-IMA-iOS-SDK: b1b1e3b8f486cfb7c7a669a58a5380421f3bcaab GoogleAds-IMA-tvOS-SDK: e43d2ddd224b04b910e42aeb5655380af56976eb - hermes-engine: 76cc5f7b150dc2db4b5d7f680e27fecbe8f3e320 + hermes-engine: 97ab49025c72c59ff6d9a806dc1db6ff5ecc9703 MillicastSDK: 690470f2108b5d67288babbebbee36c2cf196b4b PromisesObjC: 752c3227f599e3467650e47ea36f433eeb10c273 - RCTDeprecation: e1d3de84bd12761f1a42ae433c805c84ce3e1447 - RCTRequired: 5f75a4215a8c9551b303a95b0394968ae7490f18 - RCTSwiftUI: 6cfd2a6b1506648cd96493d252069bd1b49bdea4 - RCTSwiftUIWrapper: f6548795d01dcd21dae60f7de099c93169934913 - RCTTypeSafety: b8b083a6cb2cdc8d3bd38b4a309d93c98ba72326 - React: b785d635f91eb1df402a0dbc0305546f139c8048 - React-callinvoker: 3e490bb38efd7cef31c17154d33d3cc294db880b - React-Core: 0f42a57b76d338e36bd865f4376fd5d1a0f8d713 - React-Core-prebuilt: d2742d070425dcaf24ae76659a57faa3947963d0 - React-CoreModules: f491cab4017c2a0c4bf5b5b87e9941885fe4066a - React-cxxreact: 0304849cb02fbc7c8c0138fc6f59e914d04687e6 - React-debug: a26fb9a83e45de87601236175f68e3f3b92ab8ac - React-defaultsnativemodule: f89927303c7639108f229f0a6f0736012bd3158b - React-domnativemodule: 2943c7bb903ff2c987137bdbe350d79013c4ea53 - React-Fabric: d019bcde72ff88a26b4d62be86f608226c9b2fbd - React-FabricComponents: 4294e4f24921177c94538dbd0a8277e4f9af2f96 - React-FabricImage: 6013e09c69bf1f0b50889ca972ebece8f7a5deb0 - React-featureflags: 0664a78f044ca1a691db055cf7ab70b7f3ed82ae - React-featureflagsnativemodule: fb38fb7ced6909730e28f65a8bbae826d21f7d32 - React-graphics: 97881247bbef2e073abc3fe35f7e5b568637a752 - React-hermes: 50269e9916329f5075b5c626c1ea958c2178fb82 - React-idlecallbacksnativemodule: e48515b976b02aba5f3daf07f25ef6483167bb46 - React-ImageManager: 0b738549adf81a0820b34491ddb878ec5314f3eb - React-intersectionobservernativemodule: 0d2d4b5456b43deda300e37e9c6b6e179cda2484 - React-jserrorhandler: 0d90aee43a20ca50b857795a73a1e73eba8ed2b3 - React-jsi: 8069f33d57103c9d10cac33be126a5e2ba6370c6 - React-jsiexecutor: e99be7b26dc6a2429ea40e7df90b2c8d2405effd - React-jsinspector: 464b96182be223e81393bc9c448c2535dd6ef738 - React-jsinspectorcdp: aebf443a8f97d0fe62ccfb8b6778aa36ad31b79b - React-jsinspectornetwork: 7179b9e5158f2d7c64e740e0fa78f148ae0ade54 - React-jsinspectortracing: 0945286464741f26f5d92c39c651ca4bb3b2729a - React-jsitooling: 1ce3f4a47a73c6d2a15e2bd029834a2280ed3810 - React-jsitracing: fe5db5818d1aeae7a0e3520f77a0b516f0a4d2b0 - React-logger: be828b65e76567b9afe9985294862f367ed9c782 - React-Mapbuffer: 295dbd7da3a50e3c06f0ba802e21deed12b4574e - React-microtasksnativemodule: eb714fe3d21e607954699ad1dc20dc11c0221bc8 + RCTDeprecation: 707417941c54d790c0c1b5b650c16328a1e8cedc + RCTRequired: 4ee045f5a742778c45c940e11e9c17d2cf1ffb08 + RCTSwiftUI: 65e640ba61a2eacda4d1e35b0a97c9653977748b + RCTSwiftUIWrapper: f6d13c277aec753564139841cb5c324ba34f8260 + RCTTypeSafety: 8a55410a27cf2cb702b8d49e25f4096f67896f03 + React: ae0c6b319bef01fdfd8101a8d9cf79270b78dcba + React-callinvoker: 531e2e2ece5317920574224906b2bac70d30a398 + React-Core: 5429c697212e99acbe4a668d0a48b8cc08f53826 + React-Core-prebuilt: 48452694ccb24d2756c3d761e29938fa8e97685b + React-CoreModules: 08f856b550dae54d959a721ec3bf391ee948af6b + React-cxxreact: 67c95453489e737cc08f2463e901c9fc50e1a0d1 + React-debug: 13023e5fced6b8091f987b3c9d813dd262b57fd6 + React-defaultsnativemodule: 770aa3f5a215d63730cc7ed2e91c392dd20cf6c5 + React-domnativemodule: e25f6afea9df3676c349bc50270c6df6733a3b93 + React-Fabric: 2f670ba7131aa902a9e51c744aeedb011e84a8b2 + React-FabricComponents: 52fe21b6080dfb1ab31de49dd73ae6ecf99b627a + React-FabricImage: a63c3d333418d0ab1991c727005225ae68cd5618 + React-featureflags: 09bfae808bb34cf85a267ec3bc1ca99ffb0f1c2f + React-featureflagsnativemodule: 2e17293004fe31e4425f42c2aa2baf8e80bfddee + React-graphics: 8aa19609e46de0c6053bf9514c5f4a24988d1c90 + React-hermes: f9b6a443cf655824d65b40cec9194387eef0f961 + React-idlecallbacksnativemodule: 1bfbae6c534fcf2bdf098a908c0c584dc9e825f8 + React-ImageManager: b80805beb40ce97cd3eb576296c066fb10b51b58 + React-intersectionobservernativemodule: 32dadcbcf151c3052b9cfda4142d8d2adb3df502 + React-jserrorhandler: 995e6fc61ecc9d89d6776cafe72a97b51ffa9d0d + React-jsi: 0968f306c9ae85e54568d0b1cfe0b9049b3486bb + React-jsiexecutor: 53baeca1e93b1bbe5bd3bb54cec9110f309875ad + React-jsinspector: ab68beb339868d364add404bdf0ff1ee54491b08 + React-jsinspectorcdp: 9de1265018687a49badec6bf6ccff4fdd66c57e2 + React-jsinspectornetwork: bfd4085f01d287096dc9793d35f5c2ffb58519c6 + React-jsinspectortracing: 47116a0dbbdf84dd265be9dd3ec229c49c108789 + React-jsitooling: 35a7317c155e842e982e81651f52c8c329919bef + React-jsitracing: db128c1138491c5d68e6b771ecc63dde51cc789d + React-logger: 05d38b40f40094dec7638e3da35f83ecfc71132c + React-Mapbuffer: 4fa63fbb61a449ed38e64ae8ed6edebb3946ea12 + React-microtasksnativemodule: 1a40a09131bfd44259fbf792034270b56a4cd587 + React-mutationobservernativemodule: 36e092b963f4811880d00c5b1b8c8c7b92c9b965 react-native-google-cast: d7bdfd1a0eeba84afde03b9722351ec29543e74c react-native-safe-area-context: 53f796cb6c814661bbe99fbdfd0585d07b996cdd react-native-theoplayer: 06cf4fd677b0fcf025d3d4d23089a57a4a2f39c9 @@ -2319,7 +2364,7 @@ SPEC CHECKSUMS: THEOplayer-Integration-THEOlive: a9b5b338ebb82205fe85df44621641e7656a5587 THEOplayerSDK-core: b4486670f269a4b89a75bdff79d58d4641750145 TinyCSV: fd6228edbcf1c07466ac34b76dac5e052143eaba - Yoga: e2029bb72b7cb951e09aa1ee1316c9f5f28409da + Yoga: c152491a69e81ff3279fec4ce614628e3bc6af8e PODFILE CHECKSUM: 6b3681d74f386cbfb1fd986b29a1faacdcd0dce5 diff --git a/example/ios/ReactNativeTHEOplayer.xcodeproj/project.pbxproj b/example/ios/ReactNativeTHEOplayer.xcodeproj/project.pbxproj index 2b49e7e8d..a18bae5ee 100644 --- a/example/ios/ReactNativeTHEOplayer.xcodeproj/project.pbxproj +++ b/example/ios/ReactNativeTHEOplayer.xcodeproj/project.pbxproj @@ -372,6 +372,7 @@ "${PODS_CONFIGURATION_BUILD_DIR}/RNSVG-tvOS/RNSVGFilters.bundle", "${PODS_CONFIGURATION_BUILD_DIR}/React-Core-tvOS/React-Core_privacy.bundle", "${PODS_CONFIGURATION_BUILD_DIR}/React-cxxreact-tvOS/React-cxxreact_privacy.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/React-timing-tvOS/React-timing_privacy.bundle", "${PODS_ROOT}/../../node_modules/react-native-theoplayer/ios/style.css", ); name = "[CP] Copy Pods Resources"; @@ -379,6 +380,7 @@ "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/RNSVGFilters.bundle", "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/React-Core_privacy.bundle", "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/React-cxxreact_privacy.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/React-timing_privacy.bundle", "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/style.css", ); runOnlyForDeploymentPostprocessing = 0; @@ -397,6 +399,7 @@ "${PODS_CONFIGURATION_BUILD_DIR}/RNSVG-iOS/RNSVGFilters.bundle", "${PODS_CONFIGURATION_BUILD_DIR}/React-Core-iOS/React-Core_privacy.bundle", "${PODS_CONFIGURATION_BUILD_DIR}/React-cxxreact-iOS/React-cxxreact_privacy.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/React-timing-iOS/React-timing_privacy.bundle", "${PODS_ROOT}/../../node_modules/react-native-theoplayer/ios/style.css", ); name = "[CP] Copy Pods Resources"; @@ -405,6 +408,7 @@ "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/RNSVGFilters.bundle", "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/React-Core_privacy.bundle", "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/React-cxxreact_privacy.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/React-timing_privacy.bundle", "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/style.css", ); runOnlyForDeploymentPostprocessing = 0; @@ -704,6 +708,7 @@ "-DRCT_REMOVE_LEGACY_ARCH=1", ); OTHER_LDFLAGS = "$(inherited)"; + PODFILE_DIR = "$(SRCROOT)"; REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native"; SDKROOT = iphoneos; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) DEBUG"; @@ -780,6 +785,7 @@ "-DRCT_REMOVE_LEGACY_ARCH=1", ); OTHER_LDFLAGS = "$(inherited)"; + PODFILE_DIR = "$(SRCROOT)"; REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native"; SDKROOT = iphoneos; SWIFT_COMPILATION_MODE = wholemodule; diff --git a/ios/THEOplayerRCTBridge.m b/ios/THEOplayerRCTBridge.m index 228057343..78a8992ed 100644 --- a/ios/THEOplayerRCTBridge.m +++ b/ios/THEOplayerRCTBridge.m @@ -183,6 +183,18 @@ @interface RCT_EXTERN_REMAP_MODULE(THEORCTAdsModule, THEOplayerRCTAdsAPI, NSObje @end +// ---------------------------------------------------------------------------- +// Metrics Module +// ---------------------------------------------------------------------------- + +@interface RCT_EXTERN_REMAP_MODULE(THEORCTMetricsModule, THEOplayerRCTMetricsAPI, NSObject) + +RCT_EXTERN_METHOD(currentBandwidthEstimate:(nonnull NSNumber *)node + resolver:(RCTPromiseResolveBlock)resolve + rejecter:(RCTPromiseRejectBlock)reject) + +@end + // ---------------------------------------------------------------------------- // ContentProtection Module // ---------------------------------------------------------------------------- diff --git a/ios/metrics/THEOplayerRCTMetricsAPI.swift b/ios/metrics/THEOplayerRCTMetricsAPI.swift new file mode 100644 index 000000000..ece004a0c --- /dev/null +++ b/ios/metrics/THEOplayerRCTMetricsAPI.swift @@ -0,0 +1,31 @@ +// +// THEOplayerRCTMetricsAPI.swift +// Theoplayer +// +import Foundation +import UIKit + +@objc(THEOplayerRCTMetricsAPI) +class THEOplayerRCTMetricsAPI: NSObject, RCTBridgeModule { + @objc var bridge: RCTBridge! + + static func moduleName() -> String! { + return "THEORCTMetricsModule" + } + + static func requiresMainQueueSetup() -> Bool { + return false + } + + @objc(currentBandwidthEstimate:resolver:rejecter:) + func currentBandwidthEstimate(_ node: NSNumber, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) -> Void { + withViewAndPlayer(node) { _, player in + resolve(player.metrics.currentBandwidthEstimate) + } onFailure: { + // Resolve 0 (rather than rejecting) when the view/player cannot be resolved, + // so callers polling on an interval do not receive unhandled rejections. + // This matches the documented contract and the Android/Web behaviour. + resolve(0.0) + } + } +} diff --git a/react-native-theoplayer.podspec b/react-native-theoplayer.podspec index 4f315e60c..09a84ae6d 100644 --- a/react-native-theoplayer.podspec +++ b/react-native-theoplayer.podspec @@ -35,7 +35,7 @@ Pod::Spec.new do |s| s.platforms = { :ios => "15.0", :tvos => "15.0" } s.source = { :git => "https://www.theoplayer.com/.git", :tag => "#{s.version}" } - s.source_files = 'ios/*.{h,m,swift}', 'ios/ads/*.swift', 'ios/casting/*.swift', 'ios/contentprotection/*.swift', 'ios/pip/*.swift', 'ios/backgroundAudio/*.swift', 'ios/cache/*.swift', 'ios/sideloadedMetadata/*.swift', 'ios/eventBroadcasting/*.swift' , 'ios/ui/*.swift', 'ios/presentationMode/*.swift', 'ios/viewController/*.swift', 'ios/THEOlive/*.swift', 'ios/THEOads/*.swift', 'ios/millicast/*.swift', 'ios/cmcd/*.swift', 'ios/mediaControl/*.swift' + s.source_files = 'ios/*.{h,m,swift}', 'ios/ads/*.swift', 'ios/casting/*.swift', 'ios/contentprotection/*.swift', 'ios/pip/*.swift', 'ios/backgroundAudio/*.swift', 'ios/cache/*.swift', 'ios/sideloadedMetadata/*.swift', 'ios/eventBroadcasting/*.swift' , 'ios/ui/*.swift', 'ios/presentationMode/*.swift', 'ios/viewController/*.swift', 'ios/THEOlive/*.swift', 'ios/THEOads/*.swift', 'ios/millicast/*.swift', 'ios/cmcd/*.swift', 'ios/mediaControl/*.swift', 'ios/metrics/*.swift' s.resources = ['ios/*.css'] # ReactNative Dependency @@ -43,31 +43,31 @@ Pod::Spec.new do |s| # THEOplayer Dependency puts "Adding THEOplayerSDK-core" - s.dependency "THEOplayerSDK-core", "~> 11.4" + s.dependency "THEOplayerSDK-core", "~> 11.8" # THEOlive Dependency puts "Adding THEOplayer-Integration-THEOlive" - s.dependency "THEOplayer-Integration-THEOlive", "~> 11.4" + s.dependency "THEOplayer-Integration-THEOlive", "~> 11.8" # Feature based integration dependencies if theofeatures.include?("GOOGLE_IMA") puts "Adding THEOplayer-Integration-GoogleIMA" - s.dependency "THEOplayer-Integration-GoogleIMA", "~> 11.4" + s.dependency "THEOplayer-Integration-GoogleIMA", "~> 11.8" end if theofeatures.include?("CHROMECAST") puts "Adding THEOplayer-Integration-GoogleCast" - s.ios.dependency "THEOplayer-Integration-GoogleCast", "~> 11.4" + s.ios.dependency "THEOplayer-Integration-GoogleCast", "~> 11.8" end if theofeatures.include?("THEO_ADS") puts "Adding THEOplayer-Integration-THEOads" - s.dependency "THEOplayer-Integration-THEOads", "~> 11.4" + s.dependency "THEOplayer-Integration-THEOads", "~> 11.8" end if theofeatures.include?("MILLICAST") puts "Adding THEOplayer-Integration-Millicast" - s.dependency "THEOplayer-Integration-Millicast", "~> 11.4" + s.dependency "THEOplayer-Integration-Millicast", "~> 11.8" end # Feature based connector dependencies diff --git a/src/api/barrel.ts b/src/api/barrel.ts index e031b4eeb..a61b31460 100644 --- a/src/api/barrel.ts +++ b/src/api/barrel.ts @@ -10,6 +10,7 @@ export * from './config/barrel'; export * from './error/barrel'; export * from './event/barrel'; export * from './media/barrel'; +export * from './metrics/barrel'; export * from './millicast/barrel'; export * from './drm/barrel'; export * from './source/barrel'; diff --git a/src/api/metrics/MetricsAPI.ts b/src/api/metrics/MetricsAPI.ts new file mode 100644 index 000000000..6c82ae422 --- /dev/null +++ b/src/api/metrics/MetricsAPI.ts @@ -0,0 +1,20 @@ +/** + * The API for player metrics. + * + * @category Player + * @public + */ +export interface MetricsAPI { + /** + * The bandwidth, in bits per second, that the player estimates is currently available. + * This is the value used to make adaptive bitrate (ABR) decisions. + * + * @remarks + *
- This value is poll-based: read it on demand, as there is no change event. + *
- Resolves to `0` when no estimate is available yet (e.g. before playback or after a reset). + * A value of `0` means "not available/estimated", not literally zero bandwidth. + *
- On Android and Web the estimate is reported for regular adaptive streams (HLS, DASH, ...). + *
- On iOS/tvOS the estimate is only populated for THEOlive/HESP streams; it stays `0` for other playback (HLS, MP4). + */ + currentBandwidthEstimate(): Promise; +} diff --git a/src/api/metrics/barrel.ts b/src/api/metrics/barrel.ts new file mode 100644 index 000000000..6114d12c5 --- /dev/null +++ b/src/api/metrics/barrel.ts @@ -0,0 +1 @@ +export * from './MetricsAPI'; diff --git a/src/api/player/THEOplayer.ts b/src/api/player/THEOplayer.ts index b996f997b..641c686a3 100644 --- a/src/api/player/THEOplayer.ts +++ b/src/api/player/THEOplayer.ts @@ -16,6 +16,7 @@ import type { EventBroadcastAPI } from '../broadcast/EventBroadcastAPI'; import { TheoAdsAPI } from '../theoads/TheoAdsAPI'; import { TheoLiveAPI } from '../theolive/TheoLiveAPI'; import { MediaControlAPI } from '../media/MediaControlAPI'; +import type { MetricsAPI } from '../metrics/MetricsAPI'; export type PreloadType = 'none' | 'metadata' | 'auto' | ''; @@ -293,4 +294,9 @@ export interface THEOplayer extends EventDispatcher { * The API for media controls. */ readonly mediaControl?: MediaControlAPI; + + /** + * The API for player metrics. + */ + readonly metrics: MetricsAPI; } diff --git a/src/internal/adapter/THEOplayerAdapter.ts b/src/internal/adapter/THEOplayerAdapter.ts index 0ff5287a4..9fb88c6ad 100644 --- a/src/internal/adapter/THEOplayerAdapter.ts +++ b/src/internal/adapter/THEOplayerAdapter.ts @@ -18,6 +18,7 @@ import { MediaTrackEventType, MediaTrackListEvent, MediaTrackType, + MetricsAPI, NativeHandleType, PiPConfiguration, PlayerEventMap, @@ -54,6 +55,7 @@ import { DefaultNativePlayerState } from './DefaultNativePlayerState'; import { THEOAdsNativeAdapter } from './theoads/THEOAdsNativeAdapter'; import { TheoLiveNativeAdapter } from './theolive/TheoLiveNativeAdapter'; import { MediaControlNativeAdapter } from './media/MediaControlNativeAdapter'; +import { MetricsAdapter } from './metrics/MetricsAdapter'; const NativePlayerModule = NativeModules.THEORCTPlayerModule; @@ -67,6 +69,7 @@ export class THEOplayerAdapter extends DefaultEventDispatcher im private readonly _textTrackStyleAdapter: TextTrackStyleAdapter; private readonly _theoliveAdapter: TheoLiveNativeAdapter; private readonly _mediaControlAdapter: MediaControlNativeAdapter; + private readonly _metricsAdapter: MetricsAdapter; private _externalEventRouter: EventBroadcastAPI | undefined = undefined; private _playerVersion!: PlayerVersion; @@ -81,6 +84,7 @@ export class THEOplayerAdapter extends DefaultEventDispatcher im this._textTrackStyleAdapter = new TextTrackStyleAdapter(this._view); this._theoliveAdapter = new TheoLiveNativeAdapter(this._view); this._mediaControlAdapter = new MediaControlNativeAdapter(this); + this._metricsAdapter = new MetricsAdapter(this._view); this.addEventListeners(); } @@ -252,6 +256,10 @@ export class THEOplayerAdapter extends DefaultEventDispatcher im return this._mediaControlAdapter; } + get metrics(): MetricsAPI { + return this._metricsAdapter; + } + set autoplay(autoplay: boolean) { this._state.autoplay = autoplay; NativePlayerModule.setAutoplay(this._view.nativeHandle, autoplay); diff --git a/src/internal/adapter/THEOplayerWebAdapter.ts b/src/internal/adapter/THEOplayerWebAdapter.ts index 4b7e136de..5d93974e2 100644 --- a/src/internal/adapter/THEOplayerWebAdapter.ts +++ b/src/internal/adapter/THEOplayerWebAdapter.ts @@ -9,6 +9,7 @@ import { EventBroadcastAPI, MediaControlAPI, MediaTrack, + MetricsAPI, NativeHandleType, PlayerConfiguration, PlayerEventMap, @@ -39,6 +40,7 @@ import { DefaultTextTrackState } from './DefaultTextTrackState'; import { THEOAdsWebAdapter } from './theoads/THEOAdsWebAdapter'; import { CMCDConnector, Configuration, createCMCDConnector, TransmissionMode } from '@theoplayer/cmcd-connector-web'; import { TheoLiveWebAdapter } from './theolive/TheoLiveWebAdapter'; +import { THEOplayerWebMetricsAdapter } from './metrics/THEOplayerWebMetricsAdapter'; const defaultBackgroundAudioConfiguration: BackgroundAudioConfiguration = { enabled: false, @@ -55,6 +57,7 @@ export class THEOplayerWebAdapter extends DefaultEventDispatcher private readonly _textTrackState: TextTrackState; private readonly _presentationModeManager: WebPresentationModeManager; private readonly _theoliveAdapter: TheoLiveWebAdapter; + private readonly _metricsAdapter: THEOplayerWebMetricsAdapter; private _player: NativeChromelessPlayer | undefined; private _eventForwarder: WebEventForwarder | undefined; private readonly _mediaSession: WebMediaSession; @@ -73,6 +76,7 @@ export class THEOplayerWebAdapter extends DefaultEventDispatcher this._castAdapter = new THEOplayerWebCastAdapter(this._player); this._theoAdsAdapter = new THEOAdsWebAdapter(this._player); this._theoliveAdapter = new TheoLiveWebAdapter(this._player); + this._metricsAdapter = new THEOplayerWebMetricsAdapter(this._player); this._textTrackState = new DefaultTextTrackState(this); this._eventForwarder = new WebEventForwarder(this._player, this); this._presentationModeManager = new WebPresentationModeManager(this._player, this); @@ -88,6 +92,10 @@ export class THEOplayerWebAdapter extends DefaultEventDispatcher return this._mediaSession.mediaControlAdapter; } + get metrics(): MetricsAPI { + return this._metricsAdapter; + } + get abr(): ABRConfiguration | undefined { return this._player?.abr as ABRConfiguration | undefined; } diff --git a/src/internal/adapter/metrics/MetricsAdapter.ts b/src/internal/adapter/metrics/MetricsAdapter.ts new file mode 100644 index 000000000..6029ce3cd --- /dev/null +++ b/src/internal/adapter/metrics/MetricsAdapter.ts @@ -0,0 +1,12 @@ +import type { MetricsAPI, THEOplayerView } from 'react-native-theoplayer'; +import { NativeModules } from 'react-native'; + +const NativeMetricsModule = NativeModules.THEORCTMetricsModule; + +export class MetricsAdapter implements MetricsAPI { + constructor(private readonly _view: THEOplayerView) {} + + currentBandwidthEstimate(): Promise { + return NativeMetricsModule.currentBandwidthEstimate(this._view.nativeHandle); + } +} diff --git a/src/internal/adapter/metrics/THEOplayerWebMetricsAdapter.ts b/src/internal/adapter/metrics/THEOplayerWebMetricsAdapter.ts new file mode 100644 index 000000000..109affd5a --- /dev/null +++ b/src/internal/adapter/metrics/THEOplayerWebMetricsAdapter.ts @@ -0,0 +1,14 @@ +import type { MetricsAPI } from 'react-native-theoplayer'; +import type { ChromelessPlayer } from 'theoplayer'; + +export class THEOplayerWebMetricsAdapter implements MetricsAPI { + private readonly _player: ChromelessPlayer; + + constructor(player: ChromelessPlayer) { + this._player = player; + } + + currentBandwidthEstimate(): Promise { + return Promise.resolve(this._player.metrics?.currentBandwidthEstimate ?? 0); + } +}