react-native-theoplayer 1.6.0 → 1.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -0
- package/android/build.gradle +70 -25
- package/android/local/com/theoplayer/theoplayer-sdk-android/ads-wrapper/4.3.0/ads-wrapper-4.3.0.aar +0 -0
- package/android/local/com/theoplayer/theoplayer-sdk-android/ads-wrapper/4.3.0/ads-wrapper-4.3.0.pom +9 -0
- package/android/local/com/theoplayer/theoplayer-sdk-android/ads-wrapper/maven-metadata-local.xml +13 -0
- package/android/src/main/java/com/theoplayer/PlayerConfigHelper.java +40 -0
- package/android/src/main/java/com/theoplayer/ReactTHEOplayerPackage.java +8 -3
- package/android/src/main/java/com/theoplayer/ReactTHEOplayerView.java +131 -28
- package/android/src/main/java/com/theoplayer/ReactTHEOplayerViewManager.java +14 -1
- package/android/src/main/java/com/theoplayer/SourceHelper.java +137 -86
- package/android/src/main/java/com/theoplayer/VideoEventEmitter.java +44 -12
- package/android/src/main/java/com/theoplayer/abr/ABRConfigurationAdapter.kt +72 -0
- package/android/src/main/java/com/theoplayer/ads/AdEventAdapter.java +92 -0
- package/android/src/main/java/com/theoplayer/ads/AdInfo.java +168 -0
- package/android/src/main/java/com/theoplayer/ads/AdsModule.java +152 -0
- package/android/src/main/java/com/theoplayer/drm/ContentProtectionAdapter.kt +143 -0
- package/android/src/main/java/com/theoplayer/drm/ContentProtectionModule.kt +269 -0
- package/android/src/main/java/com/theoplayer/drm/KeySystemAdapter.kt +22 -0
- package/android/src/main/java/com/theoplayer/drm/ProxyContentProtectionIntegration.kt +33 -0
- package/android/src/main/java/com/theoplayer/drm/ProxyContentProtectionIntegrationFactory.kt +19 -0
- package/android/src/main/java/com/theoplayer/drm/RequestMethodAdapter.kt +28 -0
- package/android/src/main/java/com/theoplayer/track/QualityListAdapter.java +54 -0
- package/android/src/main/java/com/theoplayer/track/QualityListFilter.java +40 -0
- package/android/src/main/java/com/theoplayer/track/TrackListInfo.java +10 -2
- package/android/src/main/java/com/theoplayer/util/TypeUtils.kt +17 -0
- package/android/src/main/java/com/theoplayer/util/ViewResolver.java +42 -0
- package/ios/THEOplayerRCTAdAggregator.swift +158 -0
- package/ios/THEOplayerRCTAdsAPI.swift +296 -0
- package/ios/THEOplayerRCTBridge.m +65 -0
- package/ios/THEOplayerRCTContentProtectionAPI.swift +359 -0
- package/ios/THEOplayerRCTContentProtectionAggregator.swift +119 -0
- package/ios/THEOplayerRCTDebug.swift +13 -4
- package/ios/THEOplayerRCTMetadataAggregator.swift +1 -1
- package/ios/THEOplayerRCTNetworkUtils.swift +54 -0
- package/ios/THEOplayerRCTProxyContentProtectionIntegration.swift +155 -0
- package/ios/THEOplayerRCTProxyContentProtectionIntegrationFactory.swift +32 -0
- package/ios/THEOplayerRCTSourceDescriptionBuilder.swift +405 -0
- package/ios/THEOplayerRCTTypeUtils.swift +18 -0
- package/ios/THEOplayerRCTView.swift +115 -56
- package/ios/THEOplayerRCTViewAdEventHandler.swift +238 -0
- package/ios/{THEOplayerRCTViewEventHandler.swift → THEOplayerRCTViewMainEventHandler.swift} +8 -120
- package/ios/THEOplayerRCTViewTextTrackEventHandler.swift +134 -0
- package/ios/Theoplayer-Bridging-Header.h +3 -1
- package/ios/custom/Frameworks/ios/put_custom_ios_xcframework_here.txt +2 -0
- package/ios/custom/react-native-theoplayer_custom_ios.podspec +36 -0
- package/ios/custom/theofeatures.sh +14 -0
- package/lib/commonjs/api/THEOplayerView.js.map +1 -1
- package/lib/commonjs/api/abr/ABRConfiguration.js +2 -0
- package/lib/commonjs/api/abr/ABRConfiguration.js.map +1 -0
- package/lib/commonjs/api/abr/barrel.js +19 -0
- package/lib/commonjs/api/abr/barrel.js.map +1 -0
- package/lib/commonjs/api/ads/Ad.js +6 -0
- package/lib/commonjs/api/ads/Ad.js.map +1 -0
- package/lib/commonjs/api/ads/AdBreak.js +6 -0
- package/lib/commonjs/api/ads/AdBreak.js.map +1 -0
- package/lib/commonjs/api/ads/AdsAPI.js +6 -0
- package/lib/commonjs/api/ads/AdsAPI.js.map +1 -0
- package/lib/commonjs/api/ads/AdsConfiguration.js +6 -0
- package/lib/commonjs/api/ads/AdsConfiguration.js.map +1 -0
- package/lib/commonjs/api/ads/CompanionAd.js +2 -0
- package/lib/commonjs/api/ads/CompanionAd.js.map +1 -0
- package/lib/commonjs/api/ads/GoogleDai.js +2 -0
- package/lib/commonjs/api/ads/GoogleDai.js.map +1 -0
- package/lib/commonjs/api/ads/GoogleImaAd.js +6 -0
- package/lib/commonjs/api/ads/GoogleImaAd.js.map +1 -0
- package/lib/commonjs/api/ads/GoogleImaConfiguration.js +2 -0
- package/lib/commonjs/api/ads/GoogleImaConfiguration.js.map +1 -0
- package/lib/commonjs/api/ads/barrel.js +110 -0
- package/lib/commonjs/api/ads/barrel.js.map +1 -0
- package/lib/commonjs/api/barrel.js +58 -6
- package/lib/commonjs/api/barrel.js.map +1 -1
- package/lib/commonjs/api/config/PlayerConfiguration.js +4 -0
- package/lib/commonjs/api/config/PlayerConfiguration.js.map +1 -1
- package/lib/commonjs/api/drm/ContentProtectionAPI.js +6 -0
- package/lib/commonjs/api/drm/ContentProtectionAPI.js.map +1 -0
- package/lib/commonjs/api/drm/ContentProtectionIntegration.js +6 -0
- package/lib/commonjs/api/drm/ContentProtectionIntegration.js.map +1 -0
- package/lib/commonjs/api/drm/ContentProtectionIntegrationFactory.js +6 -0
- package/lib/commonjs/api/drm/ContentProtectionIntegrationFactory.js.map +1 -0
- package/lib/commonjs/api/drm/ContentProtectionRequest.js +2 -0
- package/lib/commonjs/api/drm/ContentProtectionRequest.js.map +1 -0
- package/lib/commonjs/api/drm/ContentProtectionResponse.js +6 -0
- package/lib/commonjs/api/drm/ContentProtectionResponse.js.map +1 -0
- package/lib/commonjs/api/drm/barrel.js +71 -0
- package/lib/commonjs/api/drm/barrel.js.map +1 -0
- package/lib/commonjs/api/event/AdEvent.js +89 -0
- package/lib/commonjs/api/event/AdEvent.js.map +1 -0
- package/lib/commonjs/api/event/barrel.js +13 -0
- package/lib/commonjs/api/event/barrel.js.map +1 -1
- package/lib/commonjs/api/source/SourceDescription.js.map +1 -1
- package/lib/commonjs/api/source/ads/FreeWheelAdDescription.js +6 -0
- package/lib/commonjs/api/source/ads/FreeWheelAdDescription.js.map +1 -0
- package/lib/commonjs/api/source/ads/IMAAdDescription.js +6 -0
- package/lib/commonjs/api/source/ads/IMAAdDescription.js.map +1 -0
- package/lib/commonjs/api/source/ads/SpotXAdDescription.js +6 -0
- package/lib/commonjs/api/source/ads/SpotXAdDescription.js.map +1 -0
- package/lib/commonjs/api/source/ads/THEOplayerAdDescription.js +6 -0
- package/lib/commonjs/api/source/ads/THEOplayerAdDescription.js.map +1 -0
- package/lib/commonjs/api/source/ads/barrel.js +84 -0
- package/lib/commonjs/api/source/ads/barrel.js.map +1 -0
- package/lib/commonjs/api/source/ads/ssai/GoogleDAIConfiguration.js +6 -0
- package/lib/commonjs/api/source/ads/ssai/GoogleDAIConfiguration.js.map +1 -0
- package/lib/commonjs/api/source/ads/ssai/ImagineServerSideAdInsertionConfiguration.js +6 -0
- package/lib/commonjs/api/source/ads/ssai/ImagineServerSideAdInsertionConfiguration.js.map +1 -0
- package/lib/commonjs/api/source/ads/ssai/ServerSideAdInsertionConfiguration.js +6 -0
- package/lib/commonjs/api/source/ads/ssai/ServerSideAdInsertionConfiguration.js.map +1 -0
- package/lib/commonjs/api/source/ads/ssai/YospaceServerSideAdInsertionConfiguration.js +6 -0
- package/lib/commonjs/api/source/ads/ssai/YospaceServerSideAdInsertionConfiguration.js.map +1 -0
- package/lib/commonjs/api/source/ads/ssai/barrel.js +58 -0
- package/lib/commonjs/api/source/ads/ssai/barrel.js.map +1 -0
- package/lib/commonjs/api/source/barrel.js +16 -3
- package/lib/commonjs/api/source/barrel.js.map +1 -1
- package/lib/commonjs/api/source/drm/DRMConfiguration.js.map +1 -1
- package/lib/commonjs/api/track/MediaTrack.js +29 -0
- package/lib/commonjs/api/track/MediaTrack.js.map +1 -1
- package/lib/commonjs/api/utils/TypeUtils.js +62 -0
- package/lib/commonjs/api/utils/TypeUtils.js.map +1 -0
- package/lib/commonjs/api/utils/barrel.js +19 -0
- package/lib/commonjs/api/utils/barrel.js.map +1 -0
- package/lib/commonjs/index.js +10 -1
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/internal/THEOplayerView.js +42 -3
- package/lib/commonjs/internal/THEOplayerView.js.map +1 -1
- package/lib/commonjs/internal/THEOplayerView.web.js +41 -2
- package/lib/commonjs/internal/THEOplayerView.web.js.map +1 -1
- package/lib/commonjs/internal/ads/THEOplayerNativeAdsAPI.js +54 -0
- package/lib/commonjs/internal/ads/THEOplayerNativeAdsAPI.js.map +1 -0
- package/lib/commonjs/internal/ads/THEOplayerNativeGoogleDAI.js +34 -0
- package/lib/commonjs/internal/ads/THEOplayerNativeGoogleDAI.js.map +1 -0
- package/lib/commonjs/internal/ads/THEOplayerWebAdsAPI.js +78 -0
- package/lib/commonjs/internal/ads/THEOplayerWebAdsAPI.js.map +1 -0
- package/lib/commonjs/internal/ads/THEOplayerWebGoogleDAI.js +32 -0
- package/lib/commonjs/internal/ads/THEOplayerWebGoogleDAI.js.map +1 -0
- package/lib/commonjs/internal/drm/ContentProtectionRegistry.js +214 -0
- package/lib/commonjs/internal/drm/ContentProtectionRegistry.js.map +1 -0
- package/lib/commonjs/internal/drm/ContentProtectionRegistry.web.js +20 -0
- package/lib/commonjs/internal/drm/ContentProtectionRegistry.web.js.map +1 -0
- package/lib/commonjs/internal/drm/NativeCertificateRequest.js +41 -0
- package/lib/commonjs/internal/drm/NativeCertificateRequest.js.map +1 -0
- package/lib/commonjs/internal/drm/NativeCertificateResponse.js +41 -0
- package/lib/commonjs/internal/drm/NativeCertificateResponse.js.map +1 -0
- package/lib/commonjs/internal/drm/NativeContentProtectionEvent.js +2 -0
- package/lib/commonjs/internal/drm/NativeContentProtectionEvent.js.map +1 -0
- package/lib/commonjs/internal/drm/NativeLicenseRequest.js +44 -0
- package/lib/commonjs/internal/drm/NativeLicenseRequest.js.map +1 -0
- package/lib/commonjs/internal/drm/NativeLicenseResponse.js +41 -0
- package/lib/commonjs/internal/drm/NativeLicenseResponse.js.map +1 -0
- package/lib/commonjs/internal/utils/TypeUtils.js +41 -0
- package/lib/commonjs/internal/utils/TypeUtils.js.map +1 -0
- package/lib/commonjs/internal/web/TrackUtils.js +19 -0
- package/lib/commonjs/internal/web/TrackUtils.js.map +1 -1
- package/lib/module/api/THEOplayerView.js.map +1 -1
- package/lib/module/api/abr/ABRConfiguration.js +2 -0
- package/lib/module/api/abr/ABRConfiguration.js.map +1 -0
- package/lib/module/api/abr/barrel.js +2 -0
- package/lib/module/api/abr/barrel.js.map +1 -0
- package/lib/module/api/ads/Ad.js +2 -0
- package/lib/module/api/ads/Ad.js.map +1 -0
- package/lib/module/api/ads/AdBreak.js +2 -0
- package/lib/module/api/ads/AdBreak.js.map +1 -0
- package/lib/module/api/ads/AdsAPI.js +2 -0
- package/lib/module/api/ads/AdsAPI.js.map +1 -0
- package/lib/module/api/ads/AdsConfiguration.js +2 -0
- package/lib/module/api/ads/AdsConfiguration.js.map +1 -0
- package/lib/module/api/ads/CompanionAd.js +2 -0
- package/lib/module/api/ads/CompanionAd.js.map +1 -0
- package/lib/module/api/ads/GoogleDai.js +2 -0
- package/lib/module/api/ads/GoogleDai.js.map +1 -0
- package/lib/module/api/ads/GoogleImaAd.js +2 -0
- package/lib/module/api/ads/GoogleImaAd.js.map +1 -0
- package/lib/module/api/ads/GoogleImaConfiguration.js +2 -0
- package/lib/module/api/ads/GoogleImaConfiguration.js.map +1 -0
- package/lib/module/api/ads/barrel.js +9 -0
- package/lib/module/api/ads/barrel.js.map +1 -0
- package/lib/module/api/barrel.js +5 -1
- package/lib/module/api/barrel.js.map +1 -1
- package/lib/module/api/config/PlayerConfiguration.js +1 -1
- package/lib/module/api/config/PlayerConfiguration.js.map +1 -1
- package/lib/module/api/drm/ContentProtectionAPI.js +2 -0
- package/lib/module/api/drm/ContentProtectionAPI.js.map +1 -0
- package/lib/module/api/drm/ContentProtectionIntegration.js +2 -0
- package/lib/module/api/drm/ContentProtectionIntegration.js.map +1 -0
- package/lib/module/api/drm/ContentProtectionIntegrationFactory.js +2 -0
- package/lib/module/api/drm/ContentProtectionIntegrationFactory.js.map +1 -0
- package/lib/module/api/drm/ContentProtectionRequest.js +2 -0
- package/lib/module/api/drm/ContentProtectionRequest.js.map +1 -0
- package/lib/module/api/drm/ContentProtectionResponse.js +2 -0
- package/lib/module/api/drm/ContentProtectionResponse.js.map +1 -0
- package/lib/module/api/drm/barrel.js +6 -0
- package/lib/module/api/drm/barrel.js.map +1 -0
- package/lib/module/api/event/AdEvent.js +82 -0
- package/lib/module/api/event/AdEvent.js.map +1 -0
- package/lib/module/api/event/barrel.js +1 -0
- package/lib/module/api/event/barrel.js.map +1 -1
- package/lib/module/api/source/SourceDescription.js.map +1 -1
- package/lib/module/api/source/ads/FreeWheelAdDescription.js +2 -0
- package/lib/module/api/source/ads/FreeWheelAdDescription.js.map +1 -0
- package/lib/module/api/source/ads/IMAAdDescription.js +2 -0
- package/lib/module/api/source/ads/IMAAdDescription.js.map +1 -0
- package/lib/module/api/source/ads/SpotXAdDescription.js +2 -0
- package/lib/module/api/source/ads/SpotXAdDescription.js.map +1 -0
- package/lib/module/api/source/ads/THEOplayerAdDescription.js +2 -0
- package/lib/module/api/source/ads/THEOplayerAdDescription.js.map +1 -0
- package/lib/module/api/source/ads/barrel.js +7 -0
- package/lib/module/api/source/ads/barrel.js.map +1 -0
- package/lib/module/api/source/ads/ssai/GoogleDAIConfiguration.js +2 -0
- package/lib/module/api/source/ads/ssai/GoogleDAIConfiguration.js.map +1 -0
- package/lib/module/api/source/ads/ssai/ImagineServerSideAdInsertionConfiguration.js +2 -0
- package/lib/module/api/source/ads/ssai/ImagineServerSideAdInsertionConfiguration.js.map +1 -0
- package/lib/module/api/source/ads/ssai/ServerSideAdInsertionConfiguration.js +2 -0
- package/lib/module/api/source/ads/ssai/ServerSideAdInsertionConfiguration.js.map +1 -0
- package/lib/module/api/source/ads/ssai/YospaceServerSideAdInsertionConfiguration.js +2 -0
- package/lib/module/api/source/ads/ssai/YospaceServerSideAdInsertionConfiguration.js.map +1 -0
- package/lib/module/api/source/ads/ssai/barrel.js +5 -0
- package/lib/module/api/source/ads/ssai/barrel.js.map +1 -0
- package/lib/module/api/source/barrel.js +1 -0
- package/lib/module/api/source/barrel.js.map +1 -1
- package/lib/module/api/source/drm/DRMConfiguration.js.map +1 -1
- package/lib/module/api/track/MediaTrack.js +23 -1
- package/lib/module/api/track/MediaTrack.js.map +1 -1
- package/lib/module/api/utils/TypeUtils.js +36 -0
- package/lib/module/api/utils/TypeUtils.js.map +1 -0
- package/lib/module/api/utils/barrel.js +2 -0
- package/lib/module/api/utils/barrel.js.map +1 -0
- package/lib/module/index.js +1 -0
- package/lib/module/index.js.map +1 -1
- package/lib/module/internal/THEOplayerView.js +40 -3
- package/lib/module/internal/THEOplayerView.js.map +1 -1
- package/lib/module/internal/THEOplayerView.web.js +42 -4
- package/lib/module/internal/THEOplayerView.web.js.map +1 -1
- package/lib/module/internal/ads/THEOplayerNativeAdsAPI.js +43 -0
- package/lib/module/internal/ads/THEOplayerNativeAdsAPI.js.map +1 -0
- package/lib/module/internal/ads/THEOplayerNativeGoogleDAI.js +24 -0
- package/lib/module/internal/ads/THEOplayerNativeGoogleDAI.js.map +1 -0
- package/lib/module/internal/ads/THEOplayerWebAdsAPI.js +68 -0
- package/lib/module/internal/ads/THEOplayerWebAdsAPI.js.map +1 -0
- package/lib/module/internal/ads/THEOplayerWebGoogleDAI.js +23 -0
- package/lib/module/internal/ads/THEOplayerWebGoogleDAI.js.map +1 -0
- package/lib/module/internal/drm/ContentProtectionRegistry.js +188 -0
- package/lib/module/internal/drm/ContentProtectionRegistry.js.map +1 -0
- package/lib/module/internal/drm/ContentProtectionRegistry.web.js +9 -0
- package/lib/module/internal/drm/ContentProtectionRegistry.web.js.map +1 -0
- package/lib/module/internal/drm/NativeCertificateRequest.js +31 -0
- package/lib/module/internal/drm/NativeCertificateRequest.js.map +1 -0
- package/lib/module/internal/drm/NativeCertificateResponse.js +30 -0
- package/lib/module/internal/drm/NativeCertificateResponse.js.map +1 -0
- package/lib/module/internal/drm/NativeContentProtectionEvent.js +2 -0
- package/lib/module/internal/drm/NativeContentProtectionEvent.js.map +1 -0
- package/lib/module/internal/drm/NativeLicenseRequest.js +34 -0
- package/lib/module/internal/drm/NativeLicenseRequest.js.map +1 -0
- package/lib/module/internal/drm/NativeLicenseResponse.js +30 -0
- package/lib/module/internal/drm/NativeLicenseResponse.js.map +1 -0
- package/lib/module/internal/utils/TypeUtils.js +24 -0
- package/lib/module/internal/utils/TypeUtils.js.map +1 -0
- package/lib/module/internal/web/TrackUtils.js +15 -0
- package/lib/module/internal/web/TrackUtils.js.map +1 -1
- package/lib/typescript/lib/commonjs/api/abr/ABRConfiguration.d.ts +0 -0
- package/lib/typescript/lib/commonjs/api/abr/barrel.d.ts +1 -0
- package/lib/typescript/lib/commonjs/api/ads/Ad.d.ts +1 -0
- package/lib/typescript/lib/commonjs/api/ads/AdBreak.d.ts +1 -0
- package/lib/typescript/lib/commonjs/api/ads/AdsAPI.d.ts +1 -0
- package/lib/typescript/lib/commonjs/api/ads/AdsConfiguration.d.ts +1 -0
- package/lib/typescript/lib/commonjs/api/ads/CompanionAd.d.ts +0 -0
- package/lib/typescript/lib/commonjs/api/ads/GoogleDai.d.ts +0 -0
- package/lib/typescript/lib/commonjs/api/ads/GoogleImaAd.d.ts +1 -0
- package/lib/typescript/lib/commonjs/api/ads/GoogleImaConfiguration.d.ts +0 -0
- package/lib/typescript/lib/commonjs/api/ads/barrel.d.ts +1 -0
- package/lib/typescript/lib/commonjs/api/config/PlayerConfiguration.d.ts +1 -0
- package/lib/typescript/lib/commonjs/api/drm/ContentProtectionAPI.d.ts +1 -0
- package/lib/typescript/lib/commonjs/api/drm/ContentProtectionIntegration.d.ts +1 -0
- package/lib/typescript/lib/commonjs/api/drm/ContentProtectionIntegrationFactory.d.ts +1 -0
- package/lib/typescript/lib/commonjs/api/drm/ContentProtectionRequest.d.ts +0 -0
- package/lib/typescript/lib/commonjs/api/drm/ContentProtectionResponse.d.ts +1 -0
- package/lib/typescript/lib/commonjs/api/drm/barrel.d.ts +1 -0
- package/lib/typescript/lib/commonjs/api/event/AdEvent.d.ts +2 -0
- package/lib/typescript/lib/commonjs/api/source/ads/FreeWheelAdDescription.d.ts +1 -0
- package/lib/typescript/lib/commonjs/api/source/ads/IMAAdDescription.d.ts +1 -0
- package/lib/typescript/lib/commonjs/api/source/ads/SpotXAdDescription.d.ts +1 -0
- package/lib/typescript/lib/commonjs/api/source/ads/THEOplayerAdDescription.d.ts +1 -0
- package/lib/typescript/lib/commonjs/api/source/ads/barrel.d.ts +1 -0
- package/lib/typescript/lib/commonjs/api/source/ads/ssai/GoogleDAIConfiguration.d.ts +1 -0
- package/lib/typescript/lib/commonjs/api/source/ads/ssai/ImagineServerSideAdInsertionConfiguration.d.ts +1 -0
- package/lib/typescript/lib/commonjs/api/source/ads/ssai/ServerSideAdInsertionConfiguration.d.ts +1 -0
- package/lib/typescript/lib/commonjs/api/source/ads/ssai/YospaceServerSideAdInsertionConfiguration.d.ts +1 -0
- package/lib/typescript/lib/commonjs/api/source/ads/ssai/barrel.d.ts +1 -0
- package/lib/typescript/lib/commonjs/api/track/MediaTrack.d.ts +8 -0
- package/lib/typescript/lib/commonjs/api/utils/TypeUtils.d.ts +13 -0
- package/lib/typescript/lib/commonjs/api/utils/barrel.d.ts +1 -0
- package/lib/typescript/lib/commonjs/index.d.ts +2 -0
- package/lib/typescript/lib/commonjs/internal/THEOplayerView.d.ts +5 -0
- package/lib/typescript/lib/commonjs/internal/THEOplayerView.web.d.ts +4 -0
- package/lib/typescript/lib/commonjs/internal/ads/THEOplayerNativeAdsAPI.d.ts +14 -0
- package/lib/typescript/lib/commonjs/internal/ads/THEOplayerNativeGoogleDAI.d.ts +9 -0
- package/lib/typescript/lib/commonjs/internal/ads/THEOplayerWebAdsAPI.d.ts +14 -0
- package/lib/typescript/lib/commonjs/internal/ads/THEOplayerWebGoogleDAI.d.ts +9 -0
- package/lib/typescript/lib/commonjs/internal/drm/ContentProtectionRegistry.d.ts +14 -0
- package/lib/typescript/lib/commonjs/internal/drm/ContentProtectionRegistry.web.d.ts +5 -0
- package/lib/typescript/lib/commonjs/internal/drm/NativeCertificateRequest.d.ts +18 -0
- package/lib/typescript/lib/commonjs/internal/drm/NativeCertificateResponse.d.ts +21 -0
- package/lib/typescript/lib/commonjs/internal/drm/NativeContentProtectionEvent.d.ts +0 -0
- package/lib/typescript/lib/commonjs/internal/drm/NativeLicenseRequest.d.ts +20 -0
- package/lib/typescript/lib/commonjs/internal/drm/NativeLicenseResponse.d.ts +22 -0
- package/lib/typescript/lib/commonjs/internal/utils/TypeUtils.d.ts +6 -0
- package/lib/typescript/lib/commonjs/internal/web/TrackUtils.d.ts +2 -0
- package/lib/typescript/lib/module/api/abr/ABRConfiguration.d.ts +0 -0
- package/lib/typescript/lib/module/api/abr/barrel.d.ts +1 -0
- package/lib/typescript/lib/module/api/ads/Ad.d.ts +1 -0
- package/lib/typescript/lib/module/api/ads/AdBreak.d.ts +1 -0
- package/lib/typescript/lib/module/api/ads/AdsAPI.d.ts +1 -0
- package/lib/typescript/lib/module/api/ads/AdsConfiguration.d.ts +1 -0
- package/lib/typescript/lib/module/api/ads/CompanionAd.d.ts +0 -0
- package/lib/typescript/lib/module/api/ads/GoogleDai.d.ts +0 -0
- package/lib/typescript/lib/module/api/ads/GoogleImaAd.d.ts +1 -0
- package/lib/typescript/lib/module/api/ads/GoogleImaConfiguration.d.ts +0 -0
- package/lib/typescript/lib/module/api/ads/barrel.d.ts +5 -0
- package/lib/typescript/lib/module/api/barrel.d.ts +5 -1
- package/lib/typescript/lib/module/api/config/PlayerConfiguration.d.ts +1 -0
- package/lib/typescript/lib/module/api/config/barrel.d.ts +1 -1
- package/lib/typescript/lib/module/api/drm/ContentProtectionAPI.d.ts +1 -0
- package/lib/typescript/lib/module/api/drm/ContentProtectionIntegration.d.ts +1 -0
- package/lib/typescript/lib/module/api/drm/ContentProtectionIntegrationFactory.d.ts +1 -0
- package/lib/typescript/lib/module/api/drm/ContentProtectionRequest.d.ts +0 -0
- package/lib/typescript/lib/module/api/drm/ContentProtectionResponse.d.ts +1 -0
- package/lib/typescript/lib/module/api/drm/barrel.d.ts +4 -0
- package/lib/typescript/lib/module/api/event/AdEvent.d.ts +1 -0
- package/lib/typescript/lib/module/api/event/barrel.d.ts +1 -0
- package/lib/typescript/lib/module/api/source/ads/FreeWheelAdDescription.d.ts +1 -0
- package/lib/typescript/lib/module/api/source/ads/IMAAdDescription.d.ts +1 -0
- package/lib/typescript/lib/module/api/source/ads/SpotXAdDescription.d.ts +1 -0
- package/lib/typescript/lib/module/api/source/ads/THEOplayerAdDescription.d.ts +1 -0
- package/lib/typescript/lib/module/api/source/ads/barrel.d.ts +5 -0
- package/lib/typescript/lib/module/api/source/ads/ssai/GoogleDAIConfiguration.d.ts +1 -0
- package/lib/typescript/lib/module/api/source/ads/ssai/ImagineServerSideAdInsertionConfiguration.d.ts +1 -0
- package/lib/typescript/lib/module/api/source/ads/ssai/ServerSideAdInsertionConfiguration.d.ts +1 -0
- package/lib/typescript/lib/module/api/source/ads/ssai/YospaceServerSideAdInsertionConfiguration.d.ts +1 -0
- package/lib/typescript/lib/module/api/source/ads/ssai/barrel.d.ts +4 -0
- package/lib/typescript/lib/module/api/source/barrel.d.ts +1 -0
- package/lib/typescript/lib/module/api/track/MediaTrack.d.ts +8 -1
- package/lib/typescript/lib/module/api/utils/TypeUtils.d.ts +12 -0
- package/lib/typescript/lib/module/api/utils/barrel.d.ts +1 -0
- package/lib/typescript/lib/module/index.d.ts +1 -0
- package/lib/typescript/lib/module/internal/THEOplayerView.d.ts +8 -0
- package/lib/typescript/lib/module/internal/THEOplayerView.web.d.ts +4 -0
- package/lib/typescript/lib/module/internal/ads/THEOplayerNativeAdsAPI.d.ts +13 -0
- package/lib/typescript/lib/module/internal/ads/THEOplayerNativeGoogleDAI.d.ts +8 -0
- package/lib/typescript/lib/module/internal/ads/THEOplayerWebAdsAPI.d.ts +13 -0
- package/lib/typescript/lib/module/internal/ads/THEOplayerWebGoogleDAI.d.ts +8 -0
- package/lib/typescript/lib/module/internal/drm/ContentProtectionRegistry.d.ts +13 -0
- package/lib/typescript/lib/module/internal/drm/ContentProtectionRegistry.web.d.ts +4 -0
- package/lib/typescript/lib/module/internal/drm/NativeCertificateRequest.d.ts +17 -0
- package/lib/typescript/lib/module/internal/drm/NativeCertificateResponse.d.ts +20 -0
- package/lib/typescript/lib/module/internal/drm/NativeContentProtectionEvent.d.ts +0 -0
- package/lib/typescript/lib/module/internal/drm/NativeLicenseRequest.d.ts +19 -0
- package/lib/typescript/lib/module/internal/drm/NativeLicenseResponse.d.ts +21 -0
- package/lib/typescript/lib/module/internal/utils/TypeUtils.d.ts +5 -0
- package/lib/typescript/lib/module/internal/web/TrackUtils.d.ts +2 -0
- package/lib/typescript/src/__tests__/index.test.d.ts +1 -0
- package/lib/typescript/src/api/THEOplayerView.d.ts +25 -4
- package/lib/typescript/src/api/abr/ABRConfiguration.d.ts +95 -0
- package/lib/typescript/src/api/abr/barrel.d.ts +1 -0
- package/lib/typescript/src/api/ads/Ad.d.ts +238 -0
- package/lib/typescript/src/api/ads/AdBreak.d.ts +39 -0
- package/lib/typescript/src/api/ads/AdsAPI.d.ts +46 -0
- package/lib/typescript/src/api/ads/AdsConfiguration.d.ts +69 -0
- package/lib/typescript/src/api/ads/CompanionAd.d.ts +59 -0
- package/lib/typescript/src/api/ads/GoogleDai.d.ts +29 -0
- package/lib/typescript/src/api/ads/GoogleImaAd.d.ts +78 -0
- package/lib/typescript/src/api/ads/GoogleImaConfiguration.d.ts +13 -0
- package/lib/typescript/src/api/ads/barrel.d.ts +8 -0
- package/lib/typescript/src/api/barrel.d.ts +5 -1
- package/lib/typescript/src/api/config/PlayerConfiguration.d.ts +5 -0
- package/lib/typescript/src/api/drm/ContentProtectionAPI.d.ts +5 -0
- package/lib/typescript/src/api/drm/ContentProtectionIntegration.d.ts +86 -0
- package/lib/typescript/src/api/drm/ContentProtectionIntegrationFactory.d.ts +15 -0
- package/lib/typescript/src/api/drm/ContentProtectionRequest.d.ts +56 -0
- package/lib/typescript/src/api/drm/ContentProtectionResponse.d.ts +56 -0
- package/lib/typescript/src/api/drm/barrel.d.ts +5 -0
- package/lib/typescript/src/api/event/AdEvent.d.ts +13 -0
- package/lib/typescript/src/api/event/barrel.d.ts +1 -0
- package/lib/typescript/src/api/source/SourceDescription.d.ts +8 -0
- package/lib/typescript/src/api/source/ads/FreeWheelAdDescription.d.ts +85 -0
- package/lib/typescript/src/api/source/ads/IMAAdDescription.d.ts +25 -0
- package/lib/typescript/src/api/source/ads/SpotXAdDescription.d.ts +115 -0
- package/lib/typescript/src/api/source/ads/THEOplayerAdDescription.d.ts +32 -0
- package/lib/typescript/src/api/source/ads/barrel.d.ts +6 -0
- package/lib/typescript/src/api/source/ads/ssai/GoogleDAIConfiguration.d.ts +130 -0
- package/lib/typescript/src/api/source/ads/ssai/ImagineServerSideAdInsertionConfiguration.d.ts +27 -0
- package/lib/typescript/src/api/source/ads/ssai/ServerSideAdInsertionConfiguration.d.ts +26 -0
- package/lib/typescript/src/api/source/ads/ssai/YospaceServerSideAdInsertionConfiguration.d.ts +46 -0
- package/lib/typescript/src/api/source/ads/ssai/barrel.d.ts +4 -0
- package/lib/typescript/src/api/source/barrel.d.ts +1 -0
- package/lib/typescript/src/api/source/drm/DRMConfiguration.d.ts +0 -30
- package/lib/typescript/src/api/track/MediaTrack.d.ts +5 -2
- package/lib/typescript/src/api/utils/TypeUtils.d.ts +20 -0
- package/lib/typescript/src/api/utils/barrel.d.ts +1 -0
- package/lib/typescript/src/index.d.ts +1 -0
- package/lib/typescript/src/internal/THEOplayerView.d.ts +10 -4
- package/lib/typescript/src/internal/THEOplayerView.web.d.ts +7 -2
- package/lib/typescript/src/internal/ads/THEOplayerNativeAdsAPI.d.ts +17 -0
- package/lib/typescript/src/internal/ads/THEOplayerNativeGoogleDAI.d.ts +10 -0
- package/lib/typescript/src/internal/ads/THEOplayerWebAdsAPI.d.ts +15 -0
- package/lib/typescript/src/internal/ads/THEOplayerWebGoogleDAI.d.ts +10 -0
- package/lib/typescript/src/internal/drm/ContentProtectionRegistry.d.ts +19 -0
- package/lib/typescript/src/internal/drm/ContentProtectionRegistry.web.d.ts +5 -0
- package/lib/typescript/src/internal/drm/NativeCertificateRequest.d.ts +13 -0
- package/lib/typescript/src/internal/drm/NativeCertificateResponse.d.ts +18 -0
- package/lib/typescript/src/internal/drm/NativeContentProtectionEvent.d.ts +5 -0
- package/lib/typescript/src/internal/drm/NativeLicenseRequest.d.ts +14 -0
- package/lib/typescript/src/internal/drm/NativeLicenseResponse.d.ts +18 -0
- package/lib/typescript/src/internal/utils/TypeUtils.d.ts +5 -0
- package/lib/typescript/src/internal/web/TrackUtils.d.ts +3 -1
- package/package.json +4 -14
- package/src/__tests__/index.test.tsx +1 -0
- package/src/api/THEOplayerView.ts +29 -4
- package/src/api/abr/ABRConfiguration.ts +103 -0
- package/src/api/abr/barrel.ts +1 -0
- package/src/api/ads/Ad.ts +267 -0
- package/src/api/ads/AdBreak.ts +44 -0
- package/src/api/ads/AdsAPI.ts +53 -0
- package/src/api/ads/AdsConfiguration.ts +76 -0
- package/src/api/ads/CompanionAd.ts +65 -0
- package/src/api/ads/GoogleDai.ts +32 -0
- package/src/api/ads/GoogleImaAd.ts +86 -0
- package/src/api/ads/GoogleImaConfiguration.ts +13 -0
- package/src/api/ads/barrel.ts +8 -0
- package/src/api/barrel.ts +5 -1
- package/src/api/config/PlayerConfiguration.ts +7 -0
- package/src/api/drm/ContentProtectionAPI.ts +6 -0
- package/src/api/drm/ContentProtectionIntegration.ts +93 -0
- package/src/api/drm/ContentProtectionIntegrationFactory.ts +16 -0
- package/src/api/drm/ContentProtectionRequest.ts +60 -0
- package/src/api/drm/ContentProtectionResponse.ts +62 -0
- package/src/api/drm/barrel.ts +5 -0
- package/src/api/event/AdEvent.ts +117 -0
- package/src/api/event/barrel.ts +1 -0
- package/src/api/source/SourceDescription.ts +9 -0
- package/src/api/source/ads/FreeWheelAdDescription.ts +97 -0
- package/src/api/source/ads/IMAAdDescription.ts +26 -0
- package/src/api/source/ads/SpotXAdDescription.ts +126 -0
- package/src/api/source/ads/THEOplayerAdDescription.ts +34 -0
- package/src/api/source/ads/barrel.ts +6 -0
- package/src/api/source/ads/ssai/GoogleDAIConfiguration.ts +145 -0
- package/src/api/source/ads/ssai/ImagineServerSideAdInsertionConfiguration.ts +30 -0
- package/src/api/source/ads/ssai/ServerSideAdInsertionConfiguration.ts +28 -0
- package/src/api/source/ads/ssai/YospaceServerSideAdInsertionConfiguration.ts +51 -0
- package/src/api/source/ads/ssai/barrel.ts +4 -0
- package/src/api/source/barrel.ts +1 -0
- package/src/api/source/drm/DRMConfiguration.ts +0 -35
- package/src/api/track/MediaTrack.ts +22 -2
- package/src/api/utils/TypeUtils.ts +39 -0
- package/src/api/utils/barrel.ts +1 -0
- package/src/index.tsx +1 -0
- package/src/internal/THEOplayerView.tsx +49 -8
- package/src/internal/THEOplayerView.web.tsx +37 -7
- package/src/internal/ads/THEOplayerNativeAdsAPI.ts +44 -0
- package/src/internal/ads/THEOplayerNativeGoogleDAI.ts +23 -0
- package/src/internal/ads/THEOplayerWebAdsAPI.ts +51 -0
- package/src/internal/ads/THEOplayerWebGoogleDAI.ts +22 -0
- package/src/internal/drm/ContentProtectionRegistry.ts +173 -0
- package/src/internal/drm/ContentProtectionRegistry.web.ts +10 -0
- package/src/internal/drm/NativeCertificateRequest.ts +41 -0
- package/src/internal/drm/NativeCertificateResponse.ts +45 -0
- package/src/internal/drm/NativeContentProtectionEvent.ts +5 -0
- package/src/internal/drm/NativeLicenseRequest.ts +39 -0
- package/src/internal/drm/NativeLicenseResponse.ts +45 -0
- package/src/internal/utils/TypeUtils.ts +39 -0
- package/src/internal/web/TrackUtils.ts +22 -1
|
@@ -0,0 +1,359 @@
|
|
|
1
|
+
//
|
|
2
|
+
// THEOplayerRCTContentProtectionAPI.swift
|
|
3
|
+
// Theoplayer
|
|
4
|
+
//
|
|
5
|
+
// Created by William van Haevre on 09/09/2022.
|
|
6
|
+
// Copyright © 2022 Facebook. All rights reserved.
|
|
7
|
+
//
|
|
8
|
+
|
|
9
|
+
import Foundation
|
|
10
|
+
import UIKit
|
|
11
|
+
import THEOplayerSDK
|
|
12
|
+
|
|
13
|
+
let CPI_EVENT_PROP_REQUEST_ID: String = "requestId"
|
|
14
|
+
let CPI_EVENT_PROP_INTEGRATION_ID: String = "integrationId"
|
|
15
|
+
let CPI_EVENT_PROP_KEYSYSTEM_ID: String = "keySystemId"
|
|
16
|
+
let CPI_EVENT_PROP_DRM_CONFIG: String = "drmConfig"
|
|
17
|
+
let CPI_EVENT_PROP_FAIRPLAY_SKD_URL: String = "fairplaySkdUrl"
|
|
18
|
+
|
|
19
|
+
let CPI_TAG: String = "[ContentProtectionIntegrationAPI]"
|
|
20
|
+
let BRIDGE_REQUEST_TIMEOUT = 10.0
|
|
21
|
+
|
|
22
|
+
@objc(THEOplayerRCTContentProtectionAPI)
|
|
23
|
+
class THEOplayerRCTContentProtectionAPI: RCTEventEmitter {
|
|
24
|
+
|
|
25
|
+
private var buildIntegrationCompletions: [String:(Bool) -> Void] = [:] // [requestId : completion]
|
|
26
|
+
private var certificateRequestCompletions: [String:(Data?, Error?) -> Void] = [:] // [requestId : completion]
|
|
27
|
+
private var certificateResponseCompletions: [String:(Data?, Error?) -> Void] = [:] // [requestId : completion]
|
|
28
|
+
private var licenseRequestCompletions: [String:(Data?, Error?) -> Void] = [:] // [requestId : completion]
|
|
29
|
+
private var licenseResponseCompletions: [String:(Data?, Error?) -> Void] = [:] // [requestId : completion]
|
|
30
|
+
private var extractFairplayCompletions: [String:(String, Error?) -> Void] = [:] // [requestId : completion]
|
|
31
|
+
private var requestTimers: [String:Timer] = [:] // [requestId : Timer]
|
|
32
|
+
private var requestIntegrationIds: [String:String] = [:] // [requestId : integrationId]
|
|
33
|
+
private var requestKeySystemIds: [String:String] = [:] // [requestId : keySystemId]
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
override static func moduleName() -> String! {
|
|
37
|
+
return "ContentProtectionModule"
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
override static func requiresMainQueueSetup() -> Bool {
|
|
41
|
+
return false
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
override func supportedEvents() -> [String]! {
|
|
45
|
+
return ["onBuildIntegration",
|
|
46
|
+
"onCertificateRequest",
|
|
47
|
+
"onCertificateResponse",
|
|
48
|
+
"onLicenseRequest",
|
|
49
|
+
"onLicenseResponse",
|
|
50
|
+
"onExtractFairplayContentId"
|
|
51
|
+
]
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
private func invalidateRequestWithId(_ requestId: String) {
|
|
55
|
+
if let timer = self.requestTimers[requestId] {
|
|
56
|
+
timer.invalidate()
|
|
57
|
+
self.requestTimers.removeValue(forKey: requestId)
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// MARK: Module actions
|
|
62
|
+
func handleBuildIntegration(integrationId: String, keySystemId: String, drmConfig: DRMConfiguration, completion: @escaping (Bool) -> Void) {
|
|
63
|
+
if DEBUG_CONTENT_PROTECTION_API { print(CPI_TAG, "handleBuildIntegration.") }
|
|
64
|
+
let requestId = UUID().uuidString
|
|
65
|
+
self.buildIntegrationCompletions[requestId] = completion
|
|
66
|
+
self.sendEvent(withName: "onBuildIntegration",
|
|
67
|
+
body: THEOplayerRCTContentProtectionAggregator.aggregateDrmConfiguration(integrationId: integrationId,
|
|
68
|
+
keySystemId: keySystemId,
|
|
69
|
+
requestId: requestId,
|
|
70
|
+
drmConfig: drmConfig))
|
|
71
|
+
self.requestTimers[requestId] = Timer.scheduledTimer(withTimeInterval: BRIDGE_REQUEST_TIMEOUT, repeats: false, block: { t in
|
|
72
|
+
if DEBUG_CONTENT_PROTECTION_API { print(CPI_TAG, "Build timeout reached: removing completion for request with Id \(requestId)") }
|
|
73
|
+
self.invalidateRequestWithId(requestId)
|
|
74
|
+
self.buildIntegrationCompletions.removeValue(forKey: requestId)
|
|
75
|
+
})
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
func handleCertificateRequest(integrationId: String, keySystemId: String, certificateRequest: CertificateRequest, completion: @escaping (Data?, Error?) -> Void) {
|
|
79
|
+
if DEBUG_CONTENT_PROTECTION_API { print(CPI_TAG, "handleCertificateRequest.") }
|
|
80
|
+
let requestId = UUID().uuidString
|
|
81
|
+
self.requestIntegrationIds[requestId] = integrationId
|
|
82
|
+
self.requestKeySystemIds[requestId] = keySystemId
|
|
83
|
+
self.certificateRequestCompletions[requestId] = completion
|
|
84
|
+
self.sendEvent(withName: "onCertificateRequest",
|
|
85
|
+
body: THEOplayerRCTContentProtectionAggregator.aggregateCertificateRequest(integrationId: integrationId,
|
|
86
|
+
keySystemId: keySystemId,
|
|
87
|
+
requestId: requestId,
|
|
88
|
+
certificateRequest: certificateRequest))
|
|
89
|
+
self.requestTimers[requestId] = Timer.scheduledTimer(withTimeInterval: BRIDGE_REQUEST_TIMEOUT, repeats: false, block: { t in
|
|
90
|
+
if DEBUG_CONTENT_PROTECTION_API { print(CPI_TAG, "onCertificateRequest timeout reached: removing completion for request with Id \(requestId)") }
|
|
91
|
+
self.invalidateRequestWithId(requestId)
|
|
92
|
+
self.requestIntegrationIds.removeValue(forKey: requestId)
|
|
93
|
+
self.requestKeySystemIds.removeValue(forKey: requestId)
|
|
94
|
+
self.certificateRequestCompletions.removeValue(forKey: requestId)
|
|
95
|
+
})
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
func handleCertificateResponse(integrationId: String, keySystemId: String, certificateResponse: CertificateResponse, completion: @escaping (Data?, Error?) -> Void) {
|
|
99
|
+
if DEBUG_CONTENT_PROTECTION_API { print(CPI_TAG, "handleCertificateResponse.") }
|
|
100
|
+
let requestId = UUID().uuidString
|
|
101
|
+
self.certificateResponseCompletions[requestId] = completion
|
|
102
|
+
self.sendEvent(withName: "onCertificateResponse",
|
|
103
|
+
body: THEOplayerRCTContentProtectionAggregator.aggregateCertificateResponse(integrationId: integrationId,
|
|
104
|
+
keySystemId: keySystemId,
|
|
105
|
+
requestId: requestId,
|
|
106
|
+
certificateResponse: certificateResponse))
|
|
107
|
+
self.requestTimers[requestId] = Timer.scheduledTimer(withTimeInterval: BRIDGE_REQUEST_TIMEOUT, repeats: false, block: { t in
|
|
108
|
+
if DEBUG_CONTENT_PROTECTION_API { print(CPI_TAG, "onCertificateResponse timeout reached: removing completion for request with Id \(requestId)") }
|
|
109
|
+
self.invalidateRequestWithId(requestId)
|
|
110
|
+
self.certificateResponseCompletions.removeValue(forKey: requestId)
|
|
111
|
+
})
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
func handleLicenseRequest(integrationId: String, keySystemId: String, licenseRequest: LicenseRequest, completion: @escaping (Data?, Error?) -> Void) {
|
|
115
|
+
if DEBUG_CONTENT_PROTECTION_API { print(CPI_TAG, "handleLicenseRequest.") }
|
|
116
|
+
let requestId = UUID().uuidString
|
|
117
|
+
self.requestIntegrationIds[requestId] = integrationId
|
|
118
|
+
self.requestKeySystemIds[requestId] = keySystemId
|
|
119
|
+
self.licenseRequestCompletions[requestId] = completion
|
|
120
|
+
self.sendEvent(withName: "onLicenseRequest",
|
|
121
|
+
body: THEOplayerRCTContentProtectionAggregator.aggregateLicenseRequest(integrationId: integrationId,
|
|
122
|
+
keySystemId: keySystemId,
|
|
123
|
+
requestId: requestId,
|
|
124
|
+
licenseRequest: licenseRequest))
|
|
125
|
+
self.requestTimers[requestId] = Timer.scheduledTimer(withTimeInterval: BRIDGE_REQUEST_TIMEOUT, repeats: false, block: { t in
|
|
126
|
+
if DEBUG_CONTENT_PROTECTION_API { print(CPI_TAG, "onLicenseRequest timeout reached: removing completion for request with Id \(requestId)") }
|
|
127
|
+
self.invalidateRequestWithId(requestId)
|
|
128
|
+
self.requestIntegrationIds.removeValue(forKey: requestId)
|
|
129
|
+
self.requestKeySystemIds.removeValue(forKey: requestId)
|
|
130
|
+
self.licenseRequestCompletions.removeValue(forKey: requestId)
|
|
131
|
+
})
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
func handleLicenseResponse(integrationId: String, keySystemId: String, licenseResponse: LicenseResponse, completion: @escaping (Data?, Error?) -> Void) {
|
|
135
|
+
if DEBUG_CONTENT_PROTECTION_API { print(CPI_TAG, "handleLicenseResponse.") }
|
|
136
|
+
let requestId = UUID().uuidString
|
|
137
|
+
self.licenseResponseCompletions[requestId] = completion
|
|
138
|
+
self.sendEvent(withName: "onLicenseResponse",
|
|
139
|
+
body: THEOplayerRCTContentProtectionAggregator.aggregateLicenseResponse(integrationId: integrationId,
|
|
140
|
+
keySystemId: keySystemId,
|
|
141
|
+
requestId: requestId,
|
|
142
|
+
licenseResponse: licenseResponse))
|
|
143
|
+
self.requestTimers[requestId] = Timer.scheduledTimer(withTimeInterval: BRIDGE_REQUEST_TIMEOUT, repeats: false, block: { t in
|
|
144
|
+
if DEBUG_CONTENT_PROTECTION_API { print(CPI_TAG, "onLicenseResponse timeout reached: removing completion for request with Id \(requestId)") }
|
|
145
|
+
self.invalidateRequestWithId(requestId)
|
|
146
|
+
self.licenseResponseCompletions.removeValue(forKey: requestId)
|
|
147
|
+
})
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
func handleExtractFairplayContentId(integrationId: String, keySystemId: String, skdUrl: String, completion: @escaping (String, Error?) -> Void) {
|
|
151
|
+
if DEBUG_CONTENT_PROTECTION_API { print(CPI_TAG, "handleExtractFairplayContentId.") }
|
|
152
|
+
let requestId = UUID().uuidString
|
|
153
|
+
self.extractFairplayCompletions[requestId] = completion
|
|
154
|
+
self.sendEvent(withName: "onExtractFairplayContentId", body: [
|
|
155
|
+
CPI_EVENT_PROP_INTEGRATION_ID: integrationId,
|
|
156
|
+
CPI_EVENT_PROP_KEYSYSTEM_ID: keySystemId,
|
|
157
|
+
CPI_EVENT_PROP_REQUEST_ID: requestId,
|
|
158
|
+
CPI_EVENT_PROP_FAIRPLAY_SKD_URL: skdUrl
|
|
159
|
+
])
|
|
160
|
+
self.requestTimers[requestId] = Timer.scheduledTimer(withTimeInterval: BRIDGE_REQUEST_TIMEOUT, repeats: false, block: { t in
|
|
161
|
+
if DEBUG_CONTENT_PROTECTION_API { print(CPI_TAG, "Fairplay contentId extraction timeout reached: removing completion for request with Id \(requestId)") }
|
|
162
|
+
self.invalidateRequestWithId(requestId)
|
|
163
|
+
self.extractFairplayCompletions.removeValue(forKey: requestId)
|
|
164
|
+
})
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
// MARK: Incoming JS Notifications
|
|
168
|
+
@objc(registerContentProtectionIntegration:keySystemId:)
|
|
169
|
+
func registerContentProtectionIntegration(_ integrationId: String, keySystemId: String) -> Void {
|
|
170
|
+
if keySystemId == "fairplay" {
|
|
171
|
+
if DEBUG_CONTENT_PROTECTION_API { print(CPI_TAG, "Registering ContentProtectionIntegration for \(integrationId) - \(keySystemId)") }
|
|
172
|
+
// Create a proxy factory
|
|
173
|
+
let integrationFactory = THEOplayerRCTProxyContentProtectionIntegrationFactory(contentProtectionAPI: self,
|
|
174
|
+
integrationId: integrationId,
|
|
175
|
+
keySystemId: keySystemId)
|
|
176
|
+
// Register that factory on the THEOplayerSDK:
|
|
177
|
+
let keySystem = self.keySystemFromString(keySystemId)
|
|
178
|
+
THEOplayerSDK.THEOplayer.registerContentProtectionIntegration(integrationId: integrationId,
|
|
179
|
+
keySystem: keySystem,
|
|
180
|
+
integrationFactory: integrationFactory)
|
|
181
|
+
} else {
|
|
182
|
+
if DEBUG_CONTENT_PROTECTION_API { print(CPI_TAG, "Prevented registering ContentProtectionIntegration for \(integrationId) - \(keySystemId)") }
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
@objc(onBuildProcessed:)
|
|
187
|
+
func onBuildProcessed(_ result: NSDictionary) -> Void {
|
|
188
|
+
if DEBUG_CONTENT_PROTECTION_API { print(CPI_TAG, "onBuildProcessed.") }
|
|
189
|
+
if let requestId = result["requestId"] as? String,
|
|
190
|
+
let resultString = result["resultString"] as? String,
|
|
191
|
+
let completion = self.buildIntegrationCompletions.removeValue(forKey: requestId) {
|
|
192
|
+
self.invalidateRequestWithId(requestId)
|
|
193
|
+
completion(resultString == "success")
|
|
194
|
+
} else {
|
|
195
|
+
print(CPI_TAG, "Failed to process buildIntegration result")
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
@objc(onCertificateRequestProcessedAsRequest:)
|
|
200
|
+
func onCertificateRequestProcessedAsRequest(_ result: NSDictionary) -> Void {
|
|
201
|
+
if DEBUG_CONTENT_PROTECTION_API { print(CPI_TAG, "onCertificateRequestProcessedAsRequest.") }
|
|
202
|
+
if let requestId = result["requestId"] as? String,
|
|
203
|
+
let completion = self.certificateRequestCompletions.removeValue(forKey: requestId),
|
|
204
|
+
let integrationId = self.requestIntegrationIds.removeValue(forKey: requestId),
|
|
205
|
+
let keySystemId = self.requestKeySystemIds.removeValue(forKey: requestId),
|
|
206
|
+
let urlString = result["url"] as? String,
|
|
207
|
+
let url = URL(string: urlString),
|
|
208
|
+
let method = result["method"] as? String,
|
|
209
|
+
let headers = result["headers"] as? [String:String] {
|
|
210
|
+
var bodyData: Data?
|
|
211
|
+
if let base64body = result["base64body"] as? String {
|
|
212
|
+
bodyData = Data(base64Encoded: base64body, options: .ignoreUnknownCharacters)
|
|
213
|
+
}
|
|
214
|
+
self.invalidateRequestWithId(requestId)
|
|
215
|
+
THEOplayerRCTNetworkUtils.shared.requestFromUrl(url: url, method: method, body: bodyData, headers: headers) { data, statusCode, responseHeaders, error in
|
|
216
|
+
if let responseError = error {
|
|
217
|
+
print(CPI_TAG, "Certificate request failure: error = \(responseError.localizedDescription)")
|
|
218
|
+
} else if statusCode >= 400 {
|
|
219
|
+
print("Certificate request failure: statusCode = \(statusCode)")
|
|
220
|
+
} else {
|
|
221
|
+
if DEBUG_CONTENT_PROTECTION_API {print(CPI_TAG, "Certificate request success: statusCode = \(statusCode)") }
|
|
222
|
+
let certificateRequest = CertificateRequest(url: urlString, method: method, headers: headers, body: bodyData)
|
|
223
|
+
let certificateResponse = CertificateResponse(certificateRequest: certificateRequest, url: urlString, status: statusCode, statusText: "", headers: responseHeaders, body: data ?? Data())
|
|
224
|
+
self.handleCertificateResponse(integrationId: integrationId, keySystemId: keySystemId, certificateResponse: certificateResponse) { data, error in
|
|
225
|
+
completion(data, error)
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
} else {
|
|
230
|
+
print(CPI_TAG, "Failed to process certificate request as request")
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
@objc(onCertificateRequestProcessedAsCertificate:)
|
|
235
|
+
func onCertificateRequestProcessedAsCertificate(_ result: NSDictionary) -> Void {
|
|
236
|
+
if DEBUG_CONTENT_PROTECTION_API { print(CPI_TAG, "onCertificateRequestProcessedAsCertificate.") }
|
|
237
|
+
if let requestId = result["requestId"] as? String,
|
|
238
|
+
let completion = self.certificateRequestCompletions.removeValue(forKey: requestId) {
|
|
239
|
+
var bodyData = Data()
|
|
240
|
+
if let base64body = result["base64body"] as? String {
|
|
241
|
+
bodyData = Data(base64Encoded: base64body, options: .ignoreUnknownCharacters) ?? Data()
|
|
242
|
+
}
|
|
243
|
+
self.invalidateRequestWithId(requestId)
|
|
244
|
+
completion(bodyData, nil)
|
|
245
|
+
} else {
|
|
246
|
+
print(CPI_TAG, "Failed to process certificate request as certificate")
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
@objc(onCertificateResponseProcessed:)
|
|
251
|
+
func onCertificateResponseProcessed(_ result: NSDictionary) -> Void {
|
|
252
|
+
if DEBUG_CONTENT_PROTECTION_API { print(CPI_TAG, "onCertificateResponseProcessed.") }
|
|
253
|
+
if let requestId = result["requestId"] as? String,
|
|
254
|
+
let completion = self.certificateResponseCompletions.removeValue(forKey: requestId) {
|
|
255
|
+
var bodyData = Data()
|
|
256
|
+
if let base64body = result["base64body"] as? String {
|
|
257
|
+
bodyData = Data(base64Encoded: base64body, options: .ignoreUnknownCharacters) ?? Data()
|
|
258
|
+
}
|
|
259
|
+
self.invalidateRequestWithId(requestId)
|
|
260
|
+
completion(bodyData, nil)
|
|
261
|
+
} else {
|
|
262
|
+
print(CPI_TAG, "Failed to process certificate response")
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
@objc(onLicenseRequestProcessedAsRequest:)
|
|
267
|
+
func onLicenseRequestProcessedAsRequest(_ result: NSDictionary) -> Void {
|
|
268
|
+
if DEBUG_CONTENT_PROTECTION_API { print(CPI_TAG, "onLicenseRequestProcessedAsRequest.") }
|
|
269
|
+
if let requestId = result["requestId"] as? String,
|
|
270
|
+
let completion = self.licenseRequestCompletions.removeValue(forKey: requestId),
|
|
271
|
+
let integrationId = self.requestIntegrationIds.removeValue(forKey: requestId),
|
|
272
|
+
let keySystemId = self.requestKeySystemIds.removeValue(forKey: requestId),
|
|
273
|
+
let urlString = result["url"] as? String,
|
|
274
|
+
let url = URL(string: urlString),
|
|
275
|
+
let method = result["method"] as? String,
|
|
276
|
+
let headers = result["headers"] as? [String:String] {
|
|
277
|
+
var bodyData: Data?
|
|
278
|
+
if let base64body = result["base64body"] as? String {
|
|
279
|
+
bodyData = Data(base64Encoded: base64body, options: .ignoreUnknownCharacters)
|
|
280
|
+
}
|
|
281
|
+
self.invalidateRequestWithId(requestId)
|
|
282
|
+
THEOplayerRCTNetworkUtils.shared.requestFromUrl(url: url, method: method, body: bodyData, headers: headers) { data, statusCode, responseHeaders, error in
|
|
283
|
+
if let responseError = error {
|
|
284
|
+
print(CPI_TAG, "License request failure: error = \(responseError.localizedDescription)")
|
|
285
|
+
} else if statusCode >= 400 {
|
|
286
|
+
print(CPI_TAG, "License request failure: statusCode = \(statusCode)")
|
|
287
|
+
} else {
|
|
288
|
+
if DEBUG_CONTENT_PROTECTION_API {print(CPI_TAG, "License request success: statusCode = \(statusCode)") }
|
|
289
|
+
let licenseRequest = LicenseRequest(url: urlString, method: method, headers: headers, body: bodyData, fairplaySkdUrl: nil, useCredentials: false)
|
|
290
|
+
let licenseResponse = LicenseResponse(licenseRequest: licenseRequest, url: urlString, status: statusCode, statusText: "", headers: responseHeaders, body: data ?? Data())
|
|
291
|
+
self.handleLicenseResponse(integrationId: integrationId, keySystemId: keySystemId, licenseResponse: licenseResponse) { data, error in
|
|
292
|
+
completion(data, error)
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
} else {
|
|
297
|
+
print(CPI_TAG, "Failed to process license request as request")
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
@objc(onLicenseRequestProcessedAsLicense:)
|
|
302
|
+
func onLicenseRequestProcessedAsLicense(_ result: NSDictionary) -> Void {
|
|
303
|
+
if DEBUG_CONTENT_PROTECTION_API { print(CPI_TAG, "onLicenseRequestProcessedAsLicense.") }
|
|
304
|
+
if let requestId = result["requestId"] as? String,
|
|
305
|
+
let completion = self.licenseRequestCompletions.removeValue(forKey: requestId) {
|
|
306
|
+
var bodyData = Data()
|
|
307
|
+
if let base64body = result["base64body"] as? String {
|
|
308
|
+
bodyData = Data(base64Encoded: base64body, options: .ignoreUnknownCharacters) ?? Data()
|
|
309
|
+
}
|
|
310
|
+
self.invalidateRequestWithId(requestId)
|
|
311
|
+
completion(bodyData, nil)
|
|
312
|
+
} else {
|
|
313
|
+
print(CPI_TAG, "Failed to process license request as license")
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
@objc(onLicenseResponseProcessed:)
|
|
318
|
+
func onLicenseResponseProcessed(_ result: NSDictionary) -> Void {
|
|
319
|
+
if DEBUG_CONTENT_PROTECTION_API { print(CPI_TAG, "onLicenseResponseProcessed.") }
|
|
320
|
+
if let requestId = result["requestId"] as? String,
|
|
321
|
+
let completion = self.licenseResponseCompletions.removeValue(forKey: requestId) {
|
|
322
|
+
var bodyData = Data()
|
|
323
|
+
if let base64body = result["base64body"] as? String {
|
|
324
|
+
bodyData = Data(base64Encoded: base64body, options: .ignoreUnknownCharacters) ?? Data()
|
|
325
|
+
}
|
|
326
|
+
self.invalidateRequestWithId(requestId)
|
|
327
|
+
completion(bodyData, nil)
|
|
328
|
+
} else {
|
|
329
|
+
print(CPI_TAG, "Failed to process license response")
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
@objc(onExtractFairplayContentIdProcessed:)
|
|
334
|
+
func onExtractFairplayContentIdProcessed(_ result: NSDictionary) -> Void {
|
|
335
|
+
if DEBUG_CONTENT_PROTECTION_API { print(CPI_TAG, "onExtractFairplayContentIdProcessed.") }
|
|
336
|
+
if let requestId = result["requestId"] as? String,
|
|
337
|
+
let contentId = result["contentId"] as? String,
|
|
338
|
+
let completion = self.extractFairplayCompletions.removeValue(forKey: requestId) {
|
|
339
|
+
self.invalidateRequestWithId(requestId)
|
|
340
|
+
completion(contentId, nil)
|
|
341
|
+
} else {
|
|
342
|
+
print(CPI_TAG, "Failed to process extracted contentId result")
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
// MARK: Helpers
|
|
347
|
+
private func keySystemFromString(_ keySystemIdString: String) -> THEOplayerSDK.KeySystemId {
|
|
348
|
+
switch keySystemIdString.lowercased() {
|
|
349
|
+
case "fairplay":
|
|
350
|
+
return .FAIRPLAY
|
|
351
|
+
case "widevine":
|
|
352
|
+
return .WIDEVINE
|
|
353
|
+
case "playready":
|
|
354
|
+
return .PLAYREADY
|
|
355
|
+
default:
|
|
356
|
+
return .FAIRPLAY // fallback to fairplay on iOS...
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
// THEOplayerRCTContentProtectionAggregator.swift
|
|
2
|
+
|
|
3
|
+
import Foundation
|
|
4
|
+
import THEOplayerSDK
|
|
5
|
+
|
|
6
|
+
let DRM_PROP_INTEGRATION: String = "integration"
|
|
7
|
+
let DRM_PROP_INTEGRATION_ID: String = "integrationId"
|
|
8
|
+
let DRM_PROP_REQUEST_ID: String = "requestId"
|
|
9
|
+
let DRM_PROP_KEYSYSTEM_ID: String = "keySystemId"
|
|
10
|
+
let DRM_PROP_DRM_CONFIG: String = "drmConfig"
|
|
11
|
+
let DRM_PROP_URL: String = "url"
|
|
12
|
+
let DRM_PROP_METHOD: String = "method"
|
|
13
|
+
let DRM_PROP_HEADERS: String = "headers"
|
|
14
|
+
let DRM_PROP_INTEGRATION_PARAMS: String = "integrationParameters"
|
|
15
|
+
let DRM_PROP_FAIRPLAY: String = "fairplay"
|
|
16
|
+
let DRM_PROP_WIDEVINE: String = "widevine"
|
|
17
|
+
let DRM_PROP_LICENSE_URL: String = "licenseAcquisitionURL"
|
|
18
|
+
let DRM_PROP_CERTIFICATE_URL: String = "certificateURL"
|
|
19
|
+
let DRM_PROP_BASE64_BODY: String = "base64body"
|
|
20
|
+
let DRM_PROP_FAIRPLAY_SKD_URL: String = "fairplaySkdUrl"
|
|
21
|
+
let DRM_PROP_STATUS: String = "status"
|
|
22
|
+
let DRM_PROP_STATUS_TEXT: String = "statusText"
|
|
23
|
+
let DRM_PROP_REQUEST: String = "request"
|
|
24
|
+
|
|
25
|
+
let CPI_AGGREGATOR_TAG: String = "[ContentProtectionAggregator]"
|
|
26
|
+
|
|
27
|
+
class THEOplayerRCTContentProtectionAggregator {
|
|
28
|
+
|
|
29
|
+
class func aggregateDrmConfiguration(integrationId: String, keySystemId: String, requestId: String, drmConfig: THEOplayerSDK.DRMConfiguration) -> [String:Any] {
|
|
30
|
+
var aggregatedData: [String:Any] = THEOplayerRCTContentProtectionAggregator.bridgeData(integrationId: integrationId, keySystemId: keySystemId, requestId: requestId)
|
|
31
|
+
|
|
32
|
+
var aggregatedDrmConfig: [String:Any] = [:]
|
|
33
|
+
aggregatedDrmConfig[DRM_PROP_INTEGRATION] = drmConfig.customIntegrationId ?? "unknown"
|
|
34
|
+
aggregatedDrmConfig[DRM_PROP_INTEGRATION_PARAMS] = drmConfig.integrationParameters
|
|
35
|
+
if let multiDrmConfigCollection = drmConfig as? THEOplayerSDK.MultiplatformDRMConfiguration {
|
|
36
|
+
let keySystemConfigurations: THEOplayerSDK.KeySystemConfigurationCollection = multiDrmConfigCollection.keySystemConfigurations
|
|
37
|
+
if let fairplayConfig: THEOplayerSDK.KeySystemConfiguration = keySystemConfigurations.fairplay {
|
|
38
|
+
aggregatedDrmConfig[DRM_PROP_FAIRPLAY] = THEOplayerRCTContentProtectionAggregator.aggregateKeySystemConfiguration(keySystemConfig: fairplayConfig)
|
|
39
|
+
}
|
|
40
|
+
if let widevineConfig: THEOplayerSDK.KeySystemConfiguration = keySystemConfigurations.widevine {
|
|
41
|
+
aggregatedDrmConfig[DRM_PROP_WIDEVINE] = THEOplayerRCTContentProtectionAggregator.aggregateKeySystemConfiguration(keySystemConfig: widevineConfig)
|
|
42
|
+
}
|
|
43
|
+
} else if let fairplayDrmConfig = drmConfig as? THEOplayerSDK.FairPlayDRMConfiguration {
|
|
44
|
+
aggregatedDrmConfig[DRM_PROP_FAIRPLAY] = THEOplayerRCTContentProtectionAggregator.aggregateKeySystemConfiguration(keySystemConfig: fairplayDrmConfig.fairplay)
|
|
45
|
+
}
|
|
46
|
+
aggregatedData[DRM_PROP_DRM_CONFIG] = aggregatedDrmConfig
|
|
47
|
+
return aggregatedData
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
class func aggregateCertificateRequest(integrationId: String, keySystemId: String, requestId: String, certificateRequest: THEOplayerSDK.Request) -> [String:Any] {
|
|
51
|
+
var aggregatedData: [String:Any] = THEOplayerRCTContentProtectionAggregator.bridgeData(integrationId: integrationId, keySystemId: keySystemId, requestId: requestId)
|
|
52
|
+
aggregatedData[DRM_PROP_URL] = certificateRequest.url
|
|
53
|
+
aggregatedData[DRM_PROP_METHOD] = certificateRequest.method
|
|
54
|
+
aggregatedData[DRM_PROP_HEADERS] = certificateRequest.headers
|
|
55
|
+
if let body = certificateRequest.body {
|
|
56
|
+
aggregatedData[DRM_PROP_BASE64_BODY] = body.base64EncodedString()
|
|
57
|
+
}
|
|
58
|
+
return aggregatedData
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
class func aggregateCertificateResponse(integrationId: String, keySystemId: String, requestId: String, certificateResponse: THEOplayerSDK.Response) -> [String:Any] {
|
|
62
|
+
var aggregatedData: [String:Any] = THEOplayerRCTContentProtectionAggregator.bridgeData(integrationId: integrationId, keySystemId: keySystemId, requestId: requestId)
|
|
63
|
+
aggregatedData[DRM_PROP_URL] = certificateResponse.url
|
|
64
|
+
aggregatedData[DRM_PROP_STATUS] = certificateResponse.status
|
|
65
|
+
aggregatedData[DRM_PROP_STATUS_TEXT] = certificateResponse.statusText
|
|
66
|
+
aggregatedData[DRM_PROP_HEADERS] = certificateResponse.headers
|
|
67
|
+
aggregatedData[DRM_PROP_REQUEST] = THEOplayerRCTContentProtectionAggregator.aggregateCertificateRequest(integrationId:integrationId,
|
|
68
|
+
keySystemId:keySystemId,
|
|
69
|
+
requestId: requestId,
|
|
70
|
+
certificateRequest: certificateResponse.request)
|
|
71
|
+
aggregatedData[DRM_PROP_BASE64_BODY] = certificateResponse.body.base64EncodedString()
|
|
72
|
+
return aggregatedData
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
class func aggregateLicenseRequest(integrationId: String, keySystemId: String, requestId: String, licenseRequest: THEOplayerSDK.Request) -> [String:Any] {
|
|
76
|
+
var aggregatedData: [String:Any] = THEOplayerRCTContentProtectionAggregator.bridgeData(integrationId: integrationId, keySystemId: keySystemId, requestId: requestId)
|
|
77
|
+
aggregatedData[DRM_PROP_URL] = licenseRequest.url
|
|
78
|
+
aggregatedData[DRM_PROP_METHOD] = licenseRequest.method
|
|
79
|
+
aggregatedData[DRM_PROP_HEADERS] = licenseRequest.headers
|
|
80
|
+
aggregatedData[DRM_PROP_FAIRPLAY_SKD_URL] = (licenseRequest as? THEOplayerSDK.LicenseRequest)?.fairplaySkdUrl ?? ""
|
|
81
|
+
if let body = licenseRequest.body {
|
|
82
|
+
aggregatedData[DRM_PROP_BASE64_BODY] = body.base64EncodedString()
|
|
83
|
+
}
|
|
84
|
+
return aggregatedData
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
class func aggregateLicenseResponse(integrationId: String, keySystemId: String, requestId: String, licenseResponse: THEOplayerSDK.Response) -> [String:Any] {
|
|
88
|
+
var aggregatedData: [String:Any] = THEOplayerRCTContentProtectionAggregator.bridgeData(integrationId: integrationId, keySystemId: keySystemId, requestId: requestId)
|
|
89
|
+
aggregatedData[DRM_PROP_URL] = licenseResponse.url
|
|
90
|
+
aggregatedData[DRM_PROP_STATUS] = licenseResponse.status
|
|
91
|
+
aggregatedData[DRM_PROP_STATUS_TEXT] = licenseResponse.statusText
|
|
92
|
+
aggregatedData[DRM_PROP_HEADERS] = licenseResponse.headers
|
|
93
|
+
aggregatedData[DRM_PROP_REQUEST] = THEOplayerRCTContentProtectionAggregator.aggregateLicenseRequest(integrationId:integrationId,
|
|
94
|
+
keySystemId:keySystemId,
|
|
95
|
+
requestId: requestId,
|
|
96
|
+
licenseRequest: licenseResponse.request)
|
|
97
|
+
aggregatedData[DRM_PROP_BASE64_BODY] = licenseResponse.body.base64EncodedString()
|
|
98
|
+
return aggregatedData
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
private class func bridgeData(integrationId: String, keySystemId: String, requestId: String) -> [String:Any] {
|
|
102
|
+
var aggregatedData: [String:Any] = [:]
|
|
103
|
+
aggregatedData[DRM_PROP_REQUEST_ID] = requestId
|
|
104
|
+
aggregatedData[DRM_PROP_INTEGRATION_ID] = integrationId
|
|
105
|
+
aggregatedData[DRM_PROP_KEYSYSTEM_ID] = keySystemId
|
|
106
|
+
return aggregatedData
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
private class func aggregateKeySystemConfiguration(keySystemConfig: THEOplayerSDK.KeySystemConfiguration) -> [String:Any] {
|
|
110
|
+
var aggregatedKeySystem: [String:Any] = [:]
|
|
111
|
+
if let licenseURL = keySystemConfig.licenseAcquisitionURL?.absoluteString {
|
|
112
|
+
aggregatedKeySystem[DRM_PROP_LICENSE_URL] = licenseURL
|
|
113
|
+
}
|
|
114
|
+
if let certificateURL = keySystemConfig.certificateURL?.absoluteString {
|
|
115
|
+
aggregatedKeySystem[DRM_PROP_CERTIFICATE_URL] = certificateURL
|
|
116
|
+
}
|
|
117
|
+
return aggregatedKeySystem
|
|
118
|
+
}
|
|
119
|
+
}
|
|
@@ -4,13 +4,22 @@
|
|
|
4
4
|
let DEBUG = false
|
|
5
5
|
|
|
6
6
|
// Debug flag to monitor incoming Theoplayer events
|
|
7
|
-
let DEBUG_THEOPLAYER_EVENTS = DEBUG &&
|
|
7
|
+
let DEBUG_THEOPLAYER_EVENTS = DEBUG && false
|
|
8
8
|
|
|
9
9
|
// Debug flag to monitor eventhandler setup and breakdown
|
|
10
|
-
let DEBUG_EVENTHANDLER = DEBUG &&
|
|
10
|
+
let DEBUG_EVENTHANDLER = DEBUG && false
|
|
11
11
|
|
|
12
12
|
// Debug flag to monitor the interactions for each view with its underlying theoplayer instance
|
|
13
|
-
let DEBUG_THEOPLAYER_INTERACTION = DEBUG &&
|
|
13
|
+
let DEBUG_THEOPLAYER_INTERACTION = DEBUG && false
|
|
14
|
+
|
|
15
|
+
// Debug flag to monitor contentProtection integration handling
|
|
16
|
+
let DEBUG_CONTENT_PROTECTION_API = DEBUG && false
|
|
14
17
|
|
|
15
18
|
// Debug flag to monitor all updates made on bridged properties
|
|
16
|
-
let DEBUG_PROP_UPDATES = DEBUG &&
|
|
19
|
+
let DEBUG_PROP_UPDATES = DEBUG && false
|
|
20
|
+
|
|
21
|
+
// Debug flag to monitor correct SourceDescription buildup
|
|
22
|
+
let DEBUG_SOURCE_DESCRIPTION_BUIDER = DEBUG && false
|
|
23
|
+
|
|
24
|
+
// Debug flag to monitor ads API usage
|
|
25
|
+
let DEBUG_ADS_API = DEBUG && false
|
|
@@ -39,7 +39,7 @@ class THEOplayerRCTMetadataAggregator {
|
|
|
39
39
|
EVENT_PROP_SELECTED_TEXT_TRACK: THEOplayerRCTMetadataAggregator.selectedTextTrack(textTracks: textTracks),
|
|
40
40
|
EVENT_PROP_SELECTED_AUDIO_TRACK: THEOplayerRCTMetadataAggregator.selectedAudioTrack(audioTracks: audioTracks),
|
|
41
41
|
EVENT_PROP_SELECTED_VIDEO_TRACK: THEOplayerRCTMetadataAggregator.selectedVideoTrack(videoTracks: videoTracks),
|
|
42
|
-
EVENT_PROP_DURATION: player.duration ??
|
|
42
|
+
EVENT_PROP_DURATION: THEOplayerRCTTypeUtils.encodeInfNan((player.duration ?? Double.nan) * 1000)
|
|
43
43
|
]
|
|
44
44
|
}
|
|
45
45
|
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
//
|
|
2
|
+
// THEOplayerRCTNetworkUtils.swift
|
|
3
|
+
// Theoplayer
|
|
4
|
+
//
|
|
5
|
+
// Created by William van Haevre on 14/11/2022.
|
|
6
|
+
//
|
|
7
|
+
|
|
8
|
+
import Foundation
|
|
9
|
+
|
|
10
|
+
class THEOplayerRCTNetworkUtils: NSObject, URLSessionDataDelegate {
|
|
11
|
+
// singleton setup
|
|
12
|
+
static let shared = THEOplayerRCTNetworkUtils()
|
|
13
|
+
|
|
14
|
+
private var defaultUrlSession: URLSession!
|
|
15
|
+
private var defaultOperationQueue = OperationQueue()
|
|
16
|
+
|
|
17
|
+
private override init() {
|
|
18
|
+
super.init()
|
|
19
|
+
let defaultConfig: URLSessionConfiguration = URLSessionConfiguration.default
|
|
20
|
+
defaultConfig.networkServiceType = NSURLRequest.NetworkServiceType.default
|
|
21
|
+
self.defaultOperationQueue.maxConcurrentOperationCount = 16
|
|
22
|
+
self.defaultOperationQueue.qualityOfService = .userInteractive
|
|
23
|
+
self.defaultUrlSession = URLSession(configuration: defaultConfig, delegate: nil, delegateQueue: self.defaultOperationQueue)
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
func requestFromUrl(url: URL, method: String, body: Data?, headers: [String:String], completion:((Data?, Int, [String:String], Error?) -> Void)?) {
|
|
27
|
+
var request = URLRequest(url: url)
|
|
28
|
+
request.httpMethod = method
|
|
29
|
+
for (key, value) in headers {
|
|
30
|
+
request.addValue(value, forHTTPHeaderField: key)
|
|
31
|
+
}
|
|
32
|
+
request.httpBody = body
|
|
33
|
+
let task = self.defaultUrlSession.dataTask(with: request) { data, response, error in
|
|
34
|
+
if let error = error {
|
|
35
|
+
print("request Error: \(error.localizedDescription)")
|
|
36
|
+
return
|
|
37
|
+
}
|
|
38
|
+
if let urlResponse = response as? HTTPURLResponse {
|
|
39
|
+
let statusCode = urlResponse.statusCode
|
|
40
|
+
let responseHeaders = urlResponse.allHeaderFields
|
|
41
|
+
var allHeaders: [String:String] = [:]
|
|
42
|
+
for (key, value) in responseHeaders {
|
|
43
|
+
if let headerKey = key as? String,
|
|
44
|
+
let headerValue = value as? String {
|
|
45
|
+
allHeaders[headerKey] = headerValue
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
completion?(data, statusCode, allHeaders, error)
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
// start the task
|
|
52
|
+
task.resume()
|
|
53
|
+
}
|
|
54
|
+
}
|