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.
Files changed (467) hide show
  1. package/README.md +4 -0
  2. package/android/build.gradle +70 -25
  3. package/android/local/com/theoplayer/theoplayer-sdk-android/ads-wrapper/4.3.0/ads-wrapper-4.3.0.aar +0 -0
  4. package/android/local/com/theoplayer/theoplayer-sdk-android/ads-wrapper/4.3.0/ads-wrapper-4.3.0.pom +9 -0
  5. package/android/local/com/theoplayer/theoplayer-sdk-android/ads-wrapper/maven-metadata-local.xml +13 -0
  6. package/android/src/main/java/com/theoplayer/PlayerConfigHelper.java +40 -0
  7. package/android/src/main/java/com/theoplayer/ReactTHEOplayerPackage.java +8 -3
  8. package/android/src/main/java/com/theoplayer/ReactTHEOplayerView.java +131 -28
  9. package/android/src/main/java/com/theoplayer/ReactTHEOplayerViewManager.java +14 -1
  10. package/android/src/main/java/com/theoplayer/SourceHelper.java +137 -86
  11. package/android/src/main/java/com/theoplayer/VideoEventEmitter.java +44 -12
  12. package/android/src/main/java/com/theoplayer/abr/ABRConfigurationAdapter.kt +72 -0
  13. package/android/src/main/java/com/theoplayer/ads/AdEventAdapter.java +92 -0
  14. package/android/src/main/java/com/theoplayer/ads/AdInfo.java +168 -0
  15. package/android/src/main/java/com/theoplayer/ads/AdsModule.java +152 -0
  16. package/android/src/main/java/com/theoplayer/drm/ContentProtectionAdapter.kt +143 -0
  17. package/android/src/main/java/com/theoplayer/drm/ContentProtectionModule.kt +269 -0
  18. package/android/src/main/java/com/theoplayer/drm/KeySystemAdapter.kt +22 -0
  19. package/android/src/main/java/com/theoplayer/drm/ProxyContentProtectionIntegration.kt +33 -0
  20. package/android/src/main/java/com/theoplayer/drm/ProxyContentProtectionIntegrationFactory.kt +19 -0
  21. package/android/src/main/java/com/theoplayer/drm/RequestMethodAdapter.kt +28 -0
  22. package/android/src/main/java/com/theoplayer/track/QualityListAdapter.java +54 -0
  23. package/android/src/main/java/com/theoplayer/track/QualityListFilter.java +40 -0
  24. package/android/src/main/java/com/theoplayer/track/TrackListInfo.java +10 -2
  25. package/android/src/main/java/com/theoplayer/util/TypeUtils.kt +17 -0
  26. package/android/src/main/java/com/theoplayer/util/ViewResolver.java +42 -0
  27. package/ios/THEOplayerRCTAdAggregator.swift +158 -0
  28. package/ios/THEOplayerRCTAdsAPI.swift +296 -0
  29. package/ios/THEOplayerRCTBridge.m +65 -0
  30. package/ios/THEOplayerRCTContentProtectionAPI.swift +359 -0
  31. package/ios/THEOplayerRCTContentProtectionAggregator.swift +119 -0
  32. package/ios/THEOplayerRCTDebug.swift +13 -4
  33. package/ios/THEOplayerRCTMetadataAggregator.swift +1 -1
  34. package/ios/THEOplayerRCTNetworkUtils.swift +54 -0
  35. package/ios/THEOplayerRCTProxyContentProtectionIntegration.swift +155 -0
  36. package/ios/THEOplayerRCTProxyContentProtectionIntegrationFactory.swift +32 -0
  37. package/ios/THEOplayerRCTSourceDescriptionBuilder.swift +405 -0
  38. package/ios/THEOplayerRCTTypeUtils.swift +18 -0
  39. package/ios/THEOplayerRCTView.swift +115 -56
  40. package/ios/THEOplayerRCTViewAdEventHandler.swift +238 -0
  41. package/ios/{THEOplayerRCTViewEventHandler.swift → THEOplayerRCTViewMainEventHandler.swift} +8 -120
  42. package/ios/THEOplayerRCTViewTextTrackEventHandler.swift +134 -0
  43. package/ios/Theoplayer-Bridging-Header.h +3 -1
  44. package/ios/custom/Frameworks/ios/put_custom_ios_xcframework_here.txt +2 -0
  45. package/ios/custom/react-native-theoplayer_custom_ios.podspec +36 -0
  46. package/ios/custom/theofeatures.sh +14 -0
  47. package/lib/commonjs/api/THEOplayerView.js.map +1 -1
  48. package/lib/commonjs/api/abr/ABRConfiguration.js +2 -0
  49. package/lib/commonjs/api/abr/ABRConfiguration.js.map +1 -0
  50. package/lib/commonjs/api/abr/barrel.js +19 -0
  51. package/lib/commonjs/api/abr/barrel.js.map +1 -0
  52. package/lib/commonjs/api/ads/Ad.js +6 -0
  53. package/lib/commonjs/api/ads/Ad.js.map +1 -0
  54. package/lib/commonjs/api/ads/AdBreak.js +6 -0
  55. package/lib/commonjs/api/ads/AdBreak.js.map +1 -0
  56. package/lib/commonjs/api/ads/AdsAPI.js +6 -0
  57. package/lib/commonjs/api/ads/AdsAPI.js.map +1 -0
  58. package/lib/commonjs/api/ads/AdsConfiguration.js +6 -0
  59. package/lib/commonjs/api/ads/AdsConfiguration.js.map +1 -0
  60. package/lib/commonjs/api/ads/CompanionAd.js +2 -0
  61. package/lib/commonjs/api/ads/CompanionAd.js.map +1 -0
  62. package/lib/commonjs/api/ads/GoogleDai.js +2 -0
  63. package/lib/commonjs/api/ads/GoogleDai.js.map +1 -0
  64. package/lib/commonjs/api/ads/GoogleImaAd.js +6 -0
  65. package/lib/commonjs/api/ads/GoogleImaAd.js.map +1 -0
  66. package/lib/commonjs/api/ads/GoogleImaConfiguration.js +2 -0
  67. package/lib/commonjs/api/ads/GoogleImaConfiguration.js.map +1 -0
  68. package/lib/commonjs/api/ads/barrel.js +110 -0
  69. package/lib/commonjs/api/ads/barrel.js.map +1 -0
  70. package/lib/commonjs/api/barrel.js +58 -6
  71. package/lib/commonjs/api/barrel.js.map +1 -1
  72. package/lib/commonjs/api/config/PlayerConfiguration.js +4 -0
  73. package/lib/commonjs/api/config/PlayerConfiguration.js.map +1 -1
  74. package/lib/commonjs/api/drm/ContentProtectionAPI.js +6 -0
  75. package/lib/commonjs/api/drm/ContentProtectionAPI.js.map +1 -0
  76. package/lib/commonjs/api/drm/ContentProtectionIntegration.js +6 -0
  77. package/lib/commonjs/api/drm/ContentProtectionIntegration.js.map +1 -0
  78. package/lib/commonjs/api/drm/ContentProtectionIntegrationFactory.js +6 -0
  79. package/lib/commonjs/api/drm/ContentProtectionIntegrationFactory.js.map +1 -0
  80. package/lib/commonjs/api/drm/ContentProtectionRequest.js +2 -0
  81. package/lib/commonjs/api/drm/ContentProtectionRequest.js.map +1 -0
  82. package/lib/commonjs/api/drm/ContentProtectionResponse.js +6 -0
  83. package/lib/commonjs/api/drm/ContentProtectionResponse.js.map +1 -0
  84. package/lib/commonjs/api/drm/barrel.js +71 -0
  85. package/lib/commonjs/api/drm/barrel.js.map +1 -0
  86. package/lib/commonjs/api/event/AdEvent.js +89 -0
  87. package/lib/commonjs/api/event/AdEvent.js.map +1 -0
  88. package/lib/commonjs/api/event/barrel.js +13 -0
  89. package/lib/commonjs/api/event/barrel.js.map +1 -1
  90. package/lib/commonjs/api/source/SourceDescription.js.map +1 -1
  91. package/lib/commonjs/api/source/ads/FreeWheelAdDescription.js +6 -0
  92. package/lib/commonjs/api/source/ads/FreeWheelAdDescription.js.map +1 -0
  93. package/lib/commonjs/api/source/ads/IMAAdDescription.js +6 -0
  94. package/lib/commonjs/api/source/ads/IMAAdDescription.js.map +1 -0
  95. package/lib/commonjs/api/source/ads/SpotXAdDescription.js +6 -0
  96. package/lib/commonjs/api/source/ads/SpotXAdDescription.js.map +1 -0
  97. package/lib/commonjs/api/source/ads/THEOplayerAdDescription.js +6 -0
  98. package/lib/commonjs/api/source/ads/THEOplayerAdDescription.js.map +1 -0
  99. package/lib/commonjs/api/source/ads/barrel.js +84 -0
  100. package/lib/commonjs/api/source/ads/barrel.js.map +1 -0
  101. package/lib/commonjs/api/source/ads/ssai/GoogleDAIConfiguration.js +6 -0
  102. package/lib/commonjs/api/source/ads/ssai/GoogleDAIConfiguration.js.map +1 -0
  103. package/lib/commonjs/api/source/ads/ssai/ImagineServerSideAdInsertionConfiguration.js +6 -0
  104. package/lib/commonjs/api/source/ads/ssai/ImagineServerSideAdInsertionConfiguration.js.map +1 -0
  105. package/lib/commonjs/api/source/ads/ssai/ServerSideAdInsertionConfiguration.js +6 -0
  106. package/lib/commonjs/api/source/ads/ssai/ServerSideAdInsertionConfiguration.js.map +1 -0
  107. package/lib/commonjs/api/source/ads/ssai/YospaceServerSideAdInsertionConfiguration.js +6 -0
  108. package/lib/commonjs/api/source/ads/ssai/YospaceServerSideAdInsertionConfiguration.js.map +1 -0
  109. package/lib/commonjs/api/source/ads/ssai/barrel.js +58 -0
  110. package/lib/commonjs/api/source/ads/ssai/barrel.js.map +1 -0
  111. package/lib/commonjs/api/source/barrel.js +16 -3
  112. package/lib/commonjs/api/source/barrel.js.map +1 -1
  113. package/lib/commonjs/api/source/drm/DRMConfiguration.js.map +1 -1
  114. package/lib/commonjs/api/track/MediaTrack.js +29 -0
  115. package/lib/commonjs/api/track/MediaTrack.js.map +1 -1
  116. package/lib/commonjs/api/utils/TypeUtils.js +62 -0
  117. package/lib/commonjs/api/utils/TypeUtils.js.map +1 -0
  118. package/lib/commonjs/api/utils/barrel.js +19 -0
  119. package/lib/commonjs/api/utils/barrel.js.map +1 -0
  120. package/lib/commonjs/index.js +10 -1
  121. package/lib/commonjs/index.js.map +1 -1
  122. package/lib/commonjs/internal/THEOplayerView.js +42 -3
  123. package/lib/commonjs/internal/THEOplayerView.js.map +1 -1
  124. package/lib/commonjs/internal/THEOplayerView.web.js +41 -2
  125. package/lib/commonjs/internal/THEOplayerView.web.js.map +1 -1
  126. package/lib/commonjs/internal/ads/THEOplayerNativeAdsAPI.js +54 -0
  127. package/lib/commonjs/internal/ads/THEOplayerNativeAdsAPI.js.map +1 -0
  128. package/lib/commonjs/internal/ads/THEOplayerNativeGoogleDAI.js +34 -0
  129. package/lib/commonjs/internal/ads/THEOplayerNativeGoogleDAI.js.map +1 -0
  130. package/lib/commonjs/internal/ads/THEOplayerWebAdsAPI.js +78 -0
  131. package/lib/commonjs/internal/ads/THEOplayerWebAdsAPI.js.map +1 -0
  132. package/lib/commonjs/internal/ads/THEOplayerWebGoogleDAI.js +32 -0
  133. package/lib/commonjs/internal/ads/THEOplayerWebGoogleDAI.js.map +1 -0
  134. package/lib/commonjs/internal/drm/ContentProtectionRegistry.js +214 -0
  135. package/lib/commonjs/internal/drm/ContentProtectionRegistry.js.map +1 -0
  136. package/lib/commonjs/internal/drm/ContentProtectionRegistry.web.js +20 -0
  137. package/lib/commonjs/internal/drm/ContentProtectionRegistry.web.js.map +1 -0
  138. package/lib/commonjs/internal/drm/NativeCertificateRequest.js +41 -0
  139. package/lib/commonjs/internal/drm/NativeCertificateRequest.js.map +1 -0
  140. package/lib/commonjs/internal/drm/NativeCertificateResponse.js +41 -0
  141. package/lib/commonjs/internal/drm/NativeCertificateResponse.js.map +1 -0
  142. package/lib/commonjs/internal/drm/NativeContentProtectionEvent.js +2 -0
  143. package/lib/commonjs/internal/drm/NativeContentProtectionEvent.js.map +1 -0
  144. package/lib/commonjs/internal/drm/NativeLicenseRequest.js +44 -0
  145. package/lib/commonjs/internal/drm/NativeLicenseRequest.js.map +1 -0
  146. package/lib/commonjs/internal/drm/NativeLicenseResponse.js +41 -0
  147. package/lib/commonjs/internal/drm/NativeLicenseResponse.js.map +1 -0
  148. package/lib/commonjs/internal/utils/TypeUtils.js +41 -0
  149. package/lib/commonjs/internal/utils/TypeUtils.js.map +1 -0
  150. package/lib/commonjs/internal/web/TrackUtils.js +19 -0
  151. package/lib/commonjs/internal/web/TrackUtils.js.map +1 -1
  152. package/lib/module/api/THEOplayerView.js.map +1 -1
  153. package/lib/module/api/abr/ABRConfiguration.js +2 -0
  154. package/lib/module/api/abr/ABRConfiguration.js.map +1 -0
  155. package/lib/module/api/abr/barrel.js +2 -0
  156. package/lib/module/api/abr/barrel.js.map +1 -0
  157. package/lib/module/api/ads/Ad.js +2 -0
  158. package/lib/module/api/ads/Ad.js.map +1 -0
  159. package/lib/module/api/ads/AdBreak.js +2 -0
  160. package/lib/module/api/ads/AdBreak.js.map +1 -0
  161. package/lib/module/api/ads/AdsAPI.js +2 -0
  162. package/lib/module/api/ads/AdsAPI.js.map +1 -0
  163. package/lib/module/api/ads/AdsConfiguration.js +2 -0
  164. package/lib/module/api/ads/AdsConfiguration.js.map +1 -0
  165. package/lib/module/api/ads/CompanionAd.js +2 -0
  166. package/lib/module/api/ads/CompanionAd.js.map +1 -0
  167. package/lib/module/api/ads/GoogleDai.js +2 -0
  168. package/lib/module/api/ads/GoogleDai.js.map +1 -0
  169. package/lib/module/api/ads/GoogleImaAd.js +2 -0
  170. package/lib/module/api/ads/GoogleImaAd.js.map +1 -0
  171. package/lib/module/api/ads/GoogleImaConfiguration.js +2 -0
  172. package/lib/module/api/ads/GoogleImaConfiguration.js.map +1 -0
  173. package/lib/module/api/ads/barrel.js +9 -0
  174. package/lib/module/api/ads/barrel.js.map +1 -0
  175. package/lib/module/api/barrel.js +5 -1
  176. package/lib/module/api/barrel.js.map +1 -1
  177. package/lib/module/api/config/PlayerConfiguration.js +1 -1
  178. package/lib/module/api/config/PlayerConfiguration.js.map +1 -1
  179. package/lib/module/api/drm/ContentProtectionAPI.js +2 -0
  180. package/lib/module/api/drm/ContentProtectionAPI.js.map +1 -0
  181. package/lib/module/api/drm/ContentProtectionIntegration.js +2 -0
  182. package/lib/module/api/drm/ContentProtectionIntegration.js.map +1 -0
  183. package/lib/module/api/drm/ContentProtectionIntegrationFactory.js +2 -0
  184. package/lib/module/api/drm/ContentProtectionIntegrationFactory.js.map +1 -0
  185. package/lib/module/api/drm/ContentProtectionRequest.js +2 -0
  186. package/lib/module/api/drm/ContentProtectionRequest.js.map +1 -0
  187. package/lib/module/api/drm/ContentProtectionResponse.js +2 -0
  188. package/lib/module/api/drm/ContentProtectionResponse.js.map +1 -0
  189. package/lib/module/api/drm/barrel.js +6 -0
  190. package/lib/module/api/drm/barrel.js.map +1 -0
  191. package/lib/module/api/event/AdEvent.js +82 -0
  192. package/lib/module/api/event/AdEvent.js.map +1 -0
  193. package/lib/module/api/event/barrel.js +1 -0
  194. package/lib/module/api/event/barrel.js.map +1 -1
  195. package/lib/module/api/source/SourceDescription.js.map +1 -1
  196. package/lib/module/api/source/ads/FreeWheelAdDescription.js +2 -0
  197. package/lib/module/api/source/ads/FreeWheelAdDescription.js.map +1 -0
  198. package/lib/module/api/source/ads/IMAAdDescription.js +2 -0
  199. package/lib/module/api/source/ads/IMAAdDescription.js.map +1 -0
  200. package/lib/module/api/source/ads/SpotXAdDescription.js +2 -0
  201. package/lib/module/api/source/ads/SpotXAdDescription.js.map +1 -0
  202. package/lib/module/api/source/ads/THEOplayerAdDescription.js +2 -0
  203. package/lib/module/api/source/ads/THEOplayerAdDescription.js.map +1 -0
  204. package/lib/module/api/source/ads/barrel.js +7 -0
  205. package/lib/module/api/source/ads/barrel.js.map +1 -0
  206. package/lib/module/api/source/ads/ssai/GoogleDAIConfiguration.js +2 -0
  207. package/lib/module/api/source/ads/ssai/GoogleDAIConfiguration.js.map +1 -0
  208. package/lib/module/api/source/ads/ssai/ImagineServerSideAdInsertionConfiguration.js +2 -0
  209. package/lib/module/api/source/ads/ssai/ImagineServerSideAdInsertionConfiguration.js.map +1 -0
  210. package/lib/module/api/source/ads/ssai/ServerSideAdInsertionConfiguration.js +2 -0
  211. package/lib/module/api/source/ads/ssai/ServerSideAdInsertionConfiguration.js.map +1 -0
  212. package/lib/module/api/source/ads/ssai/YospaceServerSideAdInsertionConfiguration.js +2 -0
  213. package/lib/module/api/source/ads/ssai/YospaceServerSideAdInsertionConfiguration.js.map +1 -0
  214. package/lib/module/api/source/ads/ssai/barrel.js +5 -0
  215. package/lib/module/api/source/ads/ssai/barrel.js.map +1 -0
  216. package/lib/module/api/source/barrel.js +1 -0
  217. package/lib/module/api/source/barrel.js.map +1 -1
  218. package/lib/module/api/source/drm/DRMConfiguration.js.map +1 -1
  219. package/lib/module/api/track/MediaTrack.js +23 -1
  220. package/lib/module/api/track/MediaTrack.js.map +1 -1
  221. package/lib/module/api/utils/TypeUtils.js +36 -0
  222. package/lib/module/api/utils/TypeUtils.js.map +1 -0
  223. package/lib/module/api/utils/barrel.js +2 -0
  224. package/lib/module/api/utils/barrel.js.map +1 -0
  225. package/lib/module/index.js +1 -0
  226. package/lib/module/index.js.map +1 -1
  227. package/lib/module/internal/THEOplayerView.js +40 -3
  228. package/lib/module/internal/THEOplayerView.js.map +1 -1
  229. package/lib/module/internal/THEOplayerView.web.js +42 -4
  230. package/lib/module/internal/THEOplayerView.web.js.map +1 -1
  231. package/lib/module/internal/ads/THEOplayerNativeAdsAPI.js +43 -0
  232. package/lib/module/internal/ads/THEOplayerNativeAdsAPI.js.map +1 -0
  233. package/lib/module/internal/ads/THEOplayerNativeGoogleDAI.js +24 -0
  234. package/lib/module/internal/ads/THEOplayerNativeGoogleDAI.js.map +1 -0
  235. package/lib/module/internal/ads/THEOplayerWebAdsAPI.js +68 -0
  236. package/lib/module/internal/ads/THEOplayerWebAdsAPI.js.map +1 -0
  237. package/lib/module/internal/ads/THEOplayerWebGoogleDAI.js +23 -0
  238. package/lib/module/internal/ads/THEOplayerWebGoogleDAI.js.map +1 -0
  239. package/lib/module/internal/drm/ContentProtectionRegistry.js +188 -0
  240. package/lib/module/internal/drm/ContentProtectionRegistry.js.map +1 -0
  241. package/lib/module/internal/drm/ContentProtectionRegistry.web.js +9 -0
  242. package/lib/module/internal/drm/ContentProtectionRegistry.web.js.map +1 -0
  243. package/lib/module/internal/drm/NativeCertificateRequest.js +31 -0
  244. package/lib/module/internal/drm/NativeCertificateRequest.js.map +1 -0
  245. package/lib/module/internal/drm/NativeCertificateResponse.js +30 -0
  246. package/lib/module/internal/drm/NativeCertificateResponse.js.map +1 -0
  247. package/lib/module/internal/drm/NativeContentProtectionEvent.js +2 -0
  248. package/lib/module/internal/drm/NativeContentProtectionEvent.js.map +1 -0
  249. package/lib/module/internal/drm/NativeLicenseRequest.js +34 -0
  250. package/lib/module/internal/drm/NativeLicenseRequest.js.map +1 -0
  251. package/lib/module/internal/drm/NativeLicenseResponse.js +30 -0
  252. package/lib/module/internal/drm/NativeLicenseResponse.js.map +1 -0
  253. package/lib/module/internal/utils/TypeUtils.js +24 -0
  254. package/lib/module/internal/utils/TypeUtils.js.map +1 -0
  255. package/lib/module/internal/web/TrackUtils.js +15 -0
  256. package/lib/module/internal/web/TrackUtils.js.map +1 -1
  257. package/lib/typescript/lib/commonjs/api/abr/ABRConfiguration.d.ts +0 -0
  258. package/lib/typescript/lib/commonjs/api/abr/barrel.d.ts +1 -0
  259. package/lib/typescript/lib/commonjs/api/ads/Ad.d.ts +1 -0
  260. package/lib/typescript/lib/commonjs/api/ads/AdBreak.d.ts +1 -0
  261. package/lib/typescript/lib/commonjs/api/ads/AdsAPI.d.ts +1 -0
  262. package/lib/typescript/lib/commonjs/api/ads/AdsConfiguration.d.ts +1 -0
  263. package/lib/typescript/lib/commonjs/api/ads/CompanionAd.d.ts +0 -0
  264. package/lib/typescript/lib/commonjs/api/ads/GoogleDai.d.ts +0 -0
  265. package/lib/typescript/lib/commonjs/api/ads/GoogleImaAd.d.ts +1 -0
  266. package/lib/typescript/lib/commonjs/api/ads/GoogleImaConfiguration.d.ts +0 -0
  267. package/lib/typescript/lib/commonjs/api/ads/barrel.d.ts +1 -0
  268. package/lib/typescript/lib/commonjs/api/config/PlayerConfiguration.d.ts +1 -0
  269. package/lib/typescript/lib/commonjs/api/drm/ContentProtectionAPI.d.ts +1 -0
  270. package/lib/typescript/lib/commonjs/api/drm/ContentProtectionIntegration.d.ts +1 -0
  271. package/lib/typescript/lib/commonjs/api/drm/ContentProtectionIntegrationFactory.d.ts +1 -0
  272. package/lib/typescript/lib/commonjs/api/drm/ContentProtectionRequest.d.ts +0 -0
  273. package/lib/typescript/lib/commonjs/api/drm/ContentProtectionResponse.d.ts +1 -0
  274. package/lib/typescript/lib/commonjs/api/drm/barrel.d.ts +1 -0
  275. package/lib/typescript/lib/commonjs/api/event/AdEvent.d.ts +2 -0
  276. package/lib/typescript/lib/commonjs/api/source/ads/FreeWheelAdDescription.d.ts +1 -0
  277. package/lib/typescript/lib/commonjs/api/source/ads/IMAAdDescription.d.ts +1 -0
  278. package/lib/typescript/lib/commonjs/api/source/ads/SpotXAdDescription.d.ts +1 -0
  279. package/lib/typescript/lib/commonjs/api/source/ads/THEOplayerAdDescription.d.ts +1 -0
  280. package/lib/typescript/lib/commonjs/api/source/ads/barrel.d.ts +1 -0
  281. package/lib/typescript/lib/commonjs/api/source/ads/ssai/GoogleDAIConfiguration.d.ts +1 -0
  282. package/lib/typescript/lib/commonjs/api/source/ads/ssai/ImagineServerSideAdInsertionConfiguration.d.ts +1 -0
  283. package/lib/typescript/lib/commonjs/api/source/ads/ssai/ServerSideAdInsertionConfiguration.d.ts +1 -0
  284. package/lib/typescript/lib/commonjs/api/source/ads/ssai/YospaceServerSideAdInsertionConfiguration.d.ts +1 -0
  285. package/lib/typescript/lib/commonjs/api/source/ads/ssai/barrel.d.ts +1 -0
  286. package/lib/typescript/lib/commonjs/api/track/MediaTrack.d.ts +8 -0
  287. package/lib/typescript/lib/commonjs/api/utils/TypeUtils.d.ts +13 -0
  288. package/lib/typescript/lib/commonjs/api/utils/barrel.d.ts +1 -0
  289. package/lib/typescript/lib/commonjs/index.d.ts +2 -0
  290. package/lib/typescript/lib/commonjs/internal/THEOplayerView.d.ts +5 -0
  291. package/lib/typescript/lib/commonjs/internal/THEOplayerView.web.d.ts +4 -0
  292. package/lib/typescript/lib/commonjs/internal/ads/THEOplayerNativeAdsAPI.d.ts +14 -0
  293. package/lib/typescript/lib/commonjs/internal/ads/THEOplayerNativeGoogleDAI.d.ts +9 -0
  294. package/lib/typescript/lib/commonjs/internal/ads/THEOplayerWebAdsAPI.d.ts +14 -0
  295. package/lib/typescript/lib/commonjs/internal/ads/THEOplayerWebGoogleDAI.d.ts +9 -0
  296. package/lib/typescript/lib/commonjs/internal/drm/ContentProtectionRegistry.d.ts +14 -0
  297. package/lib/typescript/lib/commonjs/internal/drm/ContentProtectionRegistry.web.d.ts +5 -0
  298. package/lib/typescript/lib/commonjs/internal/drm/NativeCertificateRequest.d.ts +18 -0
  299. package/lib/typescript/lib/commonjs/internal/drm/NativeCertificateResponse.d.ts +21 -0
  300. package/lib/typescript/lib/commonjs/internal/drm/NativeContentProtectionEvent.d.ts +0 -0
  301. package/lib/typescript/lib/commonjs/internal/drm/NativeLicenseRequest.d.ts +20 -0
  302. package/lib/typescript/lib/commonjs/internal/drm/NativeLicenseResponse.d.ts +22 -0
  303. package/lib/typescript/lib/commonjs/internal/utils/TypeUtils.d.ts +6 -0
  304. package/lib/typescript/lib/commonjs/internal/web/TrackUtils.d.ts +2 -0
  305. package/lib/typescript/lib/module/api/abr/ABRConfiguration.d.ts +0 -0
  306. package/lib/typescript/lib/module/api/abr/barrel.d.ts +1 -0
  307. package/lib/typescript/lib/module/api/ads/Ad.d.ts +1 -0
  308. package/lib/typescript/lib/module/api/ads/AdBreak.d.ts +1 -0
  309. package/lib/typescript/lib/module/api/ads/AdsAPI.d.ts +1 -0
  310. package/lib/typescript/lib/module/api/ads/AdsConfiguration.d.ts +1 -0
  311. package/lib/typescript/lib/module/api/ads/CompanionAd.d.ts +0 -0
  312. package/lib/typescript/lib/module/api/ads/GoogleDai.d.ts +0 -0
  313. package/lib/typescript/lib/module/api/ads/GoogleImaAd.d.ts +1 -0
  314. package/lib/typescript/lib/module/api/ads/GoogleImaConfiguration.d.ts +0 -0
  315. package/lib/typescript/lib/module/api/ads/barrel.d.ts +5 -0
  316. package/lib/typescript/lib/module/api/barrel.d.ts +5 -1
  317. package/lib/typescript/lib/module/api/config/PlayerConfiguration.d.ts +1 -0
  318. package/lib/typescript/lib/module/api/config/barrel.d.ts +1 -1
  319. package/lib/typescript/lib/module/api/drm/ContentProtectionAPI.d.ts +1 -0
  320. package/lib/typescript/lib/module/api/drm/ContentProtectionIntegration.d.ts +1 -0
  321. package/lib/typescript/lib/module/api/drm/ContentProtectionIntegrationFactory.d.ts +1 -0
  322. package/lib/typescript/lib/module/api/drm/ContentProtectionRequest.d.ts +0 -0
  323. package/lib/typescript/lib/module/api/drm/ContentProtectionResponse.d.ts +1 -0
  324. package/lib/typescript/lib/module/api/drm/barrel.d.ts +4 -0
  325. package/lib/typescript/lib/module/api/event/AdEvent.d.ts +1 -0
  326. package/lib/typescript/lib/module/api/event/barrel.d.ts +1 -0
  327. package/lib/typescript/lib/module/api/source/ads/FreeWheelAdDescription.d.ts +1 -0
  328. package/lib/typescript/lib/module/api/source/ads/IMAAdDescription.d.ts +1 -0
  329. package/lib/typescript/lib/module/api/source/ads/SpotXAdDescription.d.ts +1 -0
  330. package/lib/typescript/lib/module/api/source/ads/THEOplayerAdDescription.d.ts +1 -0
  331. package/lib/typescript/lib/module/api/source/ads/barrel.d.ts +5 -0
  332. package/lib/typescript/lib/module/api/source/ads/ssai/GoogleDAIConfiguration.d.ts +1 -0
  333. package/lib/typescript/lib/module/api/source/ads/ssai/ImagineServerSideAdInsertionConfiguration.d.ts +1 -0
  334. package/lib/typescript/lib/module/api/source/ads/ssai/ServerSideAdInsertionConfiguration.d.ts +1 -0
  335. package/lib/typescript/lib/module/api/source/ads/ssai/YospaceServerSideAdInsertionConfiguration.d.ts +1 -0
  336. package/lib/typescript/lib/module/api/source/ads/ssai/barrel.d.ts +4 -0
  337. package/lib/typescript/lib/module/api/source/barrel.d.ts +1 -0
  338. package/lib/typescript/lib/module/api/track/MediaTrack.d.ts +8 -1
  339. package/lib/typescript/lib/module/api/utils/TypeUtils.d.ts +12 -0
  340. package/lib/typescript/lib/module/api/utils/barrel.d.ts +1 -0
  341. package/lib/typescript/lib/module/index.d.ts +1 -0
  342. package/lib/typescript/lib/module/internal/THEOplayerView.d.ts +8 -0
  343. package/lib/typescript/lib/module/internal/THEOplayerView.web.d.ts +4 -0
  344. package/lib/typescript/lib/module/internal/ads/THEOplayerNativeAdsAPI.d.ts +13 -0
  345. package/lib/typescript/lib/module/internal/ads/THEOplayerNativeGoogleDAI.d.ts +8 -0
  346. package/lib/typescript/lib/module/internal/ads/THEOplayerWebAdsAPI.d.ts +13 -0
  347. package/lib/typescript/lib/module/internal/ads/THEOplayerWebGoogleDAI.d.ts +8 -0
  348. package/lib/typescript/lib/module/internal/drm/ContentProtectionRegistry.d.ts +13 -0
  349. package/lib/typescript/lib/module/internal/drm/ContentProtectionRegistry.web.d.ts +4 -0
  350. package/lib/typescript/lib/module/internal/drm/NativeCertificateRequest.d.ts +17 -0
  351. package/lib/typescript/lib/module/internal/drm/NativeCertificateResponse.d.ts +20 -0
  352. package/lib/typescript/lib/module/internal/drm/NativeContentProtectionEvent.d.ts +0 -0
  353. package/lib/typescript/lib/module/internal/drm/NativeLicenseRequest.d.ts +19 -0
  354. package/lib/typescript/lib/module/internal/drm/NativeLicenseResponse.d.ts +21 -0
  355. package/lib/typescript/lib/module/internal/utils/TypeUtils.d.ts +5 -0
  356. package/lib/typescript/lib/module/internal/web/TrackUtils.d.ts +2 -0
  357. package/lib/typescript/src/__tests__/index.test.d.ts +1 -0
  358. package/lib/typescript/src/api/THEOplayerView.d.ts +25 -4
  359. package/lib/typescript/src/api/abr/ABRConfiguration.d.ts +95 -0
  360. package/lib/typescript/src/api/abr/barrel.d.ts +1 -0
  361. package/lib/typescript/src/api/ads/Ad.d.ts +238 -0
  362. package/lib/typescript/src/api/ads/AdBreak.d.ts +39 -0
  363. package/lib/typescript/src/api/ads/AdsAPI.d.ts +46 -0
  364. package/lib/typescript/src/api/ads/AdsConfiguration.d.ts +69 -0
  365. package/lib/typescript/src/api/ads/CompanionAd.d.ts +59 -0
  366. package/lib/typescript/src/api/ads/GoogleDai.d.ts +29 -0
  367. package/lib/typescript/src/api/ads/GoogleImaAd.d.ts +78 -0
  368. package/lib/typescript/src/api/ads/GoogleImaConfiguration.d.ts +13 -0
  369. package/lib/typescript/src/api/ads/barrel.d.ts +8 -0
  370. package/lib/typescript/src/api/barrel.d.ts +5 -1
  371. package/lib/typescript/src/api/config/PlayerConfiguration.d.ts +5 -0
  372. package/lib/typescript/src/api/drm/ContentProtectionAPI.d.ts +5 -0
  373. package/lib/typescript/src/api/drm/ContentProtectionIntegration.d.ts +86 -0
  374. package/lib/typescript/src/api/drm/ContentProtectionIntegrationFactory.d.ts +15 -0
  375. package/lib/typescript/src/api/drm/ContentProtectionRequest.d.ts +56 -0
  376. package/lib/typescript/src/api/drm/ContentProtectionResponse.d.ts +56 -0
  377. package/lib/typescript/src/api/drm/barrel.d.ts +5 -0
  378. package/lib/typescript/src/api/event/AdEvent.d.ts +13 -0
  379. package/lib/typescript/src/api/event/barrel.d.ts +1 -0
  380. package/lib/typescript/src/api/source/SourceDescription.d.ts +8 -0
  381. package/lib/typescript/src/api/source/ads/FreeWheelAdDescription.d.ts +85 -0
  382. package/lib/typescript/src/api/source/ads/IMAAdDescription.d.ts +25 -0
  383. package/lib/typescript/src/api/source/ads/SpotXAdDescription.d.ts +115 -0
  384. package/lib/typescript/src/api/source/ads/THEOplayerAdDescription.d.ts +32 -0
  385. package/lib/typescript/src/api/source/ads/barrel.d.ts +6 -0
  386. package/lib/typescript/src/api/source/ads/ssai/GoogleDAIConfiguration.d.ts +130 -0
  387. package/lib/typescript/src/api/source/ads/ssai/ImagineServerSideAdInsertionConfiguration.d.ts +27 -0
  388. package/lib/typescript/src/api/source/ads/ssai/ServerSideAdInsertionConfiguration.d.ts +26 -0
  389. package/lib/typescript/src/api/source/ads/ssai/YospaceServerSideAdInsertionConfiguration.d.ts +46 -0
  390. package/lib/typescript/src/api/source/ads/ssai/barrel.d.ts +4 -0
  391. package/lib/typescript/src/api/source/barrel.d.ts +1 -0
  392. package/lib/typescript/src/api/source/drm/DRMConfiguration.d.ts +0 -30
  393. package/lib/typescript/src/api/track/MediaTrack.d.ts +5 -2
  394. package/lib/typescript/src/api/utils/TypeUtils.d.ts +20 -0
  395. package/lib/typescript/src/api/utils/barrel.d.ts +1 -0
  396. package/lib/typescript/src/index.d.ts +1 -0
  397. package/lib/typescript/src/internal/THEOplayerView.d.ts +10 -4
  398. package/lib/typescript/src/internal/THEOplayerView.web.d.ts +7 -2
  399. package/lib/typescript/src/internal/ads/THEOplayerNativeAdsAPI.d.ts +17 -0
  400. package/lib/typescript/src/internal/ads/THEOplayerNativeGoogleDAI.d.ts +10 -0
  401. package/lib/typescript/src/internal/ads/THEOplayerWebAdsAPI.d.ts +15 -0
  402. package/lib/typescript/src/internal/ads/THEOplayerWebGoogleDAI.d.ts +10 -0
  403. package/lib/typescript/src/internal/drm/ContentProtectionRegistry.d.ts +19 -0
  404. package/lib/typescript/src/internal/drm/ContentProtectionRegistry.web.d.ts +5 -0
  405. package/lib/typescript/src/internal/drm/NativeCertificateRequest.d.ts +13 -0
  406. package/lib/typescript/src/internal/drm/NativeCertificateResponse.d.ts +18 -0
  407. package/lib/typescript/src/internal/drm/NativeContentProtectionEvent.d.ts +5 -0
  408. package/lib/typescript/src/internal/drm/NativeLicenseRequest.d.ts +14 -0
  409. package/lib/typescript/src/internal/drm/NativeLicenseResponse.d.ts +18 -0
  410. package/lib/typescript/src/internal/utils/TypeUtils.d.ts +5 -0
  411. package/lib/typescript/src/internal/web/TrackUtils.d.ts +3 -1
  412. package/package.json +4 -14
  413. package/src/__tests__/index.test.tsx +1 -0
  414. package/src/api/THEOplayerView.ts +29 -4
  415. package/src/api/abr/ABRConfiguration.ts +103 -0
  416. package/src/api/abr/barrel.ts +1 -0
  417. package/src/api/ads/Ad.ts +267 -0
  418. package/src/api/ads/AdBreak.ts +44 -0
  419. package/src/api/ads/AdsAPI.ts +53 -0
  420. package/src/api/ads/AdsConfiguration.ts +76 -0
  421. package/src/api/ads/CompanionAd.ts +65 -0
  422. package/src/api/ads/GoogleDai.ts +32 -0
  423. package/src/api/ads/GoogleImaAd.ts +86 -0
  424. package/src/api/ads/GoogleImaConfiguration.ts +13 -0
  425. package/src/api/ads/barrel.ts +8 -0
  426. package/src/api/barrel.ts +5 -1
  427. package/src/api/config/PlayerConfiguration.ts +7 -0
  428. package/src/api/drm/ContentProtectionAPI.ts +6 -0
  429. package/src/api/drm/ContentProtectionIntegration.ts +93 -0
  430. package/src/api/drm/ContentProtectionIntegrationFactory.ts +16 -0
  431. package/src/api/drm/ContentProtectionRequest.ts +60 -0
  432. package/src/api/drm/ContentProtectionResponse.ts +62 -0
  433. package/src/api/drm/barrel.ts +5 -0
  434. package/src/api/event/AdEvent.ts +117 -0
  435. package/src/api/event/barrel.ts +1 -0
  436. package/src/api/source/SourceDescription.ts +9 -0
  437. package/src/api/source/ads/FreeWheelAdDescription.ts +97 -0
  438. package/src/api/source/ads/IMAAdDescription.ts +26 -0
  439. package/src/api/source/ads/SpotXAdDescription.ts +126 -0
  440. package/src/api/source/ads/THEOplayerAdDescription.ts +34 -0
  441. package/src/api/source/ads/barrel.ts +6 -0
  442. package/src/api/source/ads/ssai/GoogleDAIConfiguration.ts +145 -0
  443. package/src/api/source/ads/ssai/ImagineServerSideAdInsertionConfiguration.ts +30 -0
  444. package/src/api/source/ads/ssai/ServerSideAdInsertionConfiguration.ts +28 -0
  445. package/src/api/source/ads/ssai/YospaceServerSideAdInsertionConfiguration.ts +51 -0
  446. package/src/api/source/ads/ssai/barrel.ts +4 -0
  447. package/src/api/source/barrel.ts +1 -0
  448. package/src/api/source/drm/DRMConfiguration.ts +0 -35
  449. package/src/api/track/MediaTrack.ts +22 -2
  450. package/src/api/utils/TypeUtils.ts +39 -0
  451. package/src/api/utils/barrel.ts +1 -0
  452. package/src/index.tsx +1 -0
  453. package/src/internal/THEOplayerView.tsx +49 -8
  454. package/src/internal/THEOplayerView.web.tsx +37 -7
  455. package/src/internal/ads/THEOplayerNativeAdsAPI.ts +44 -0
  456. package/src/internal/ads/THEOplayerNativeGoogleDAI.ts +23 -0
  457. package/src/internal/ads/THEOplayerWebAdsAPI.ts +51 -0
  458. package/src/internal/ads/THEOplayerWebGoogleDAI.ts +22 -0
  459. package/src/internal/drm/ContentProtectionRegistry.ts +173 -0
  460. package/src/internal/drm/ContentProtectionRegistry.web.ts +10 -0
  461. package/src/internal/drm/NativeCertificateRequest.ts +41 -0
  462. package/src/internal/drm/NativeCertificateResponse.ts +45 -0
  463. package/src/internal/drm/NativeContentProtectionEvent.ts +5 -0
  464. package/src/internal/drm/NativeLicenseRequest.ts +39 -0
  465. package/src/internal/drm/NativeLicenseResponse.ts +45 -0
  466. package/src/internal/utils/TypeUtils.ts +39 -0
  467. 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 && true
7
+ let DEBUG_THEOPLAYER_EVENTS = DEBUG && false
8
8
 
9
9
  // Debug flag to monitor eventhandler setup and breakdown
10
- let DEBUG_EVENTHANDLER = DEBUG && true
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 && true
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 && true
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 ?? 0
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
+ }