bitmovin-player-react-native 0.44.1-alpha.0 → 1.0.0-alpha.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 (497) hide show
  1. package/.eslintignore +11 -0
  2. package/.eslintrc.js +7 -0
  3. package/.gitattributes +3 -0
  4. package/.prettierignore +11 -0
  5. package/.ruby-version +1 -0
  6. package/.swiftlint.yml +171 -0
  7. package/Brewfile +2 -0
  8. package/CHANGELOG.md +627 -0
  9. package/CONTRIBUTING.md +255 -0
  10. package/TODO.md +0 -0
  11. package/android/.editorconfig +8 -0
  12. package/android/build.gradle +78 -75
  13. package/android/gradle/wrapper/gradle-wrapper.jar +0 -0
  14. package/android/gradle/wrapper/gradle-wrapper.properties +7 -0
  15. package/android/gradle.properties +1 -0
  16. package/android/gradlew +248 -0
  17. package/android/gradlew.bat +92 -0
  18. package/android/ktlint.gradle +31 -0
  19. package/android/src/main/java/com/bitmovin/player/reactnative/ActivityLifecycleListener.kt +51 -0
  20. package/android/src/main/java/com/bitmovin/player/reactnative/BitmovinCastManagerModule.kt +32 -55
  21. package/android/src/main/java/com/bitmovin/player/reactnative/BufferModule.kt +33 -45
  22. package/android/src/main/java/com/bitmovin/player/reactnative/CustomMessageHandlerModule.kt +84 -0
  23. package/android/src/main/java/com/bitmovin/player/reactnative/DebugModule.kt +6 -14
  24. package/android/src/main/java/com/bitmovin/player/reactnative/DecoderConfigModule.kt +89 -44
  25. package/android/src/main/java/com/bitmovin/player/reactnative/DrmModule.kt +80 -99
  26. package/android/src/main/java/com/bitmovin/player/reactnative/EventSubscription.kt +22 -0
  27. package/android/src/main/java/com/bitmovin/player/reactnative/FullscreenHandlerModule.kt +100 -0
  28. package/android/src/main/java/com/bitmovin/player/reactnative/MediaSessionPlaybackManager.kt +5 -5
  29. package/android/src/main/java/com/bitmovin/player/reactnative/NetworkModule.kt +98 -56
  30. package/android/src/main/java/com/bitmovin/player/reactnative/OfflineModule.kt +132 -186
  31. package/android/src/main/java/com/bitmovin/player/reactnative/PlayerAnalyticsModule.kt +37 -36
  32. package/android/src/main/java/com/bitmovin/player/reactnative/PlayerModule.kt +252 -528
  33. package/android/src/main/java/com/bitmovin/player/reactnative/RNPlayerPackage.kt +11 -0
  34. package/android/src/main/java/com/bitmovin/player/reactnative/RNPlayerView.kt +558 -213
  35. package/android/src/main/java/com/bitmovin/player/reactnative/RNPlayerViewManager.kt +99 -286
  36. package/android/src/main/java/com/bitmovin/player/reactnative/ResultWaiter.kt +58 -0
  37. package/android/src/main/java/com/bitmovin/player/reactnative/SourceModule.kt +77 -151
  38. package/android/src/main/java/com/bitmovin/player/reactnative/Types.kt +44 -0
  39. package/android/src/main/java/com/bitmovin/player/reactnative/UuidModule.kt +12 -15
  40. package/android/src/main/java/com/bitmovin/player/reactnative/converter/JsonConverter.kt +296 -456
  41. package/android/src/main/java/com/bitmovin/player/reactnative/extensions/ListExtension.kt +89 -0
  42. package/android/src/main/java/com/bitmovin/player/reactnative/extensions/MapExtension.kt +95 -0
  43. package/android/src/main/java/com/bitmovin/player/reactnative/offline/OfflineContentManagerBridge.kt +20 -52
  44. package/android/src/main/java/com/bitmovin/player/reactnative/ui/CustomMessageHandlerBridge.kt +10 -20
  45. package/android/src/main/java/com/bitmovin/player/reactnative/ui/FullscreenHandlerBridge.kt +4 -9
  46. package/app.plugin.js +21 -0
  47. package/build/BitmovinPlayerReactNative.types.d.ts +18 -0
  48. package/build/BitmovinPlayerReactNative.types.d.ts.map +1 -0
  49. package/build/BitmovinPlayerReactNative.types.js +2 -0
  50. package/build/BitmovinPlayerReactNative.types.js.map +1 -0
  51. package/build/adaptationConfig.d.ts +18 -0
  52. package/build/adaptationConfig.d.ts.map +1 -0
  53. package/build/adaptationConfig.js +2 -0
  54. package/build/adaptationConfig.js.map +1 -0
  55. package/build/advertising.d.ts +175 -0
  56. package/build/advertising.d.ts.map +1 -0
  57. package/build/advertising.js +37 -0
  58. package/build/advertising.js.map +1 -0
  59. package/build/analytics/config.d.ts +194 -0
  60. package/build/analytics/config.d.ts.map +1 -0
  61. package/build/analytics/config.js +2 -0
  62. package/build/analytics/config.js.map +1 -0
  63. package/build/analytics/index.d.ts +3 -0
  64. package/build/analytics/index.d.ts.map +1 -0
  65. package/build/analytics/index.js +3 -0
  66. package/build/analytics/index.js.map +1 -0
  67. package/build/analytics/player.d.ts +24 -0
  68. package/build/analytics/player.d.ts.map +1 -0
  69. package/build/analytics/player.js +30 -0
  70. package/build/analytics/player.js.map +1 -0
  71. package/build/analytics/playerAnalyticsModule.d.ts +13 -0
  72. package/build/analytics/playerAnalyticsModule.d.ts.map +1 -0
  73. package/build/analytics/playerAnalyticsModule.js +3 -0
  74. package/build/analytics/playerAnalyticsModule.js.map +1 -0
  75. package/build/audioSession.d.ts +33 -0
  76. package/build/audioSession.d.ts.map +1 -0
  77. package/build/audioSession.js +21 -0
  78. package/build/audioSession.js.map +1 -0
  79. package/build/audioTrack.d.ts +39 -0
  80. package/build/audioTrack.d.ts.map +1 -0
  81. package/build/audioTrack.js +2 -0
  82. package/build/audioTrack.js.map +1 -0
  83. package/build/bitmovinCastManager.d.ts +58 -0
  84. package/build/bitmovinCastManager.d.ts.map +1 -0
  85. package/build/bitmovinCastManager.js +64 -0
  86. package/build/bitmovinCastManager.js.map +1 -0
  87. package/build/bufferApi.d.ts +85 -0
  88. package/build/bufferApi.d.ts.map +1 -0
  89. package/build/bufferApi.js +60 -0
  90. package/build/bufferApi.js.map +1 -0
  91. package/build/bufferConfig.d.ts +42 -0
  92. package/build/bufferConfig.d.ts.map +1 -0
  93. package/build/bufferConfig.js +2 -0
  94. package/build/bufferConfig.js.map +1 -0
  95. package/build/components/PlayerView/events.d.ts +310 -0
  96. package/build/components/PlayerView/events.d.ts.map +1 -0
  97. package/build/components/PlayerView/events.js +2 -0
  98. package/build/components/PlayerView/events.js.map +1 -0
  99. package/build/components/PlayerView/index.d.ts +10 -0
  100. package/build/components/PlayerView/index.d.ts.map +1 -0
  101. package/build/components/PlayerView/index.js +72 -0
  102. package/build/components/PlayerView/index.js.map +1 -0
  103. package/build/components/PlayerView/native.d.ts +30 -0
  104. package/build/components/PlayerView/native.d.ts.map +1 -0
  105. package/build/components/PlayerView/native.js +6 -0
  106. package/build/components/PlayerView/native.js.map +1 -0
  107. package/build/components/PlayerView/nativeEvents.d.ts +437 -0
  108. package/build/components/PlayerView/nativeEvents.d.ts.map +1 -0
  109. package/build/components/PlayerView/nativeEvents.js +2 -0
  110. package/build/components/PlayerView/nativeEvents.js.map +1 -0
  111. package/build/components/PlayerView/pictureInPictureConfig.d.ts +22 -0
  112. package/build/components/PlayerView/pictureInPictureConfig.d.ts.map +1 -0
  113. package/build/components/PlayerView/pictureInPictureConfig.js +2 -0
  114. package/build/components/PlayerView/pictureInPictureConfig.js.map +1 -0
  115. package/build/components/PlayerView/playerViewConfig.d.ts +111 -0
  116. package/build/components/PlayerView/playerViewConfig.d.ts.map +1 -0
  117. package/build/components/PlayerView/playerViewConfig.js +51 -0
  118. package/build/components/PlayerView/playerViewConfig.js.map +1 -0
  119. package/build/components/PlayerView/properties.d.ts +61 -0
  120. package/build/components/PlayerView/properties.d.ts.map +1 -0
  121. package/build/components/PlayerView/properties.js +2 -0
  122. package/build/components/PlayerView/properties.js.map +1 -0
  123. package/build/components/index.d.ts +5 -0
  124. package/build/components/index.d.ts.map +1 -0
  125. package/build/components/index.js +5 -0
  126. package/build/components/index.js.map +1 -0
  127. package/build/debug.d.ts +46 -0
  128. package/build/debug.d.ts.map +1 -0
  129. package/build/debug.js +52 -0
  130. package/build/debug.js.map +1 -0
  131. package/build/decoder/decoderConfig.d.ts +96 -0
  132. package/build/decoder/decoderConfig.d.ts.map +1 -0
  133. package/build/decoder/decoderConfig.js +6 -0
  134. package/build/decoder/decoderConfig.js.map +1 -0
  135. package/build/decoder/decoderConfigModule.d.ts +14 -0
  136. package/build/decoder/decoderConfigModule.d.ts.map +1 -0
  137. package/build/decoder/decoderConfigModule.js +31 -0
  138. package/build/decoder/decoderConfigModule.js.map +1 -0
  139. package/build/decoder/index.d.ts +26 -0
  140. package/build/decoder/index.d.ts.map +1 -0
  141. package/build/decoder/index.js +50 -0
  142. package/build/decoder/index.js.map +1 -0
  143. package/build/drm/drmModule.d.ts +55 -0
  144. package/build/drm/drmModule.d.ts.map +1 -0
  145. package/build/drm/drmModule.js +3 -0
  146. package/build/drm/drmModule.js.map +1 -0
  147. package/build/drm/fairplayConfig.d.ts +91 -0
  148. package/build/drm/fairplayConfig.d.ts.map +1 -0
  149. package/build/drm/fairplayConfig.js +2 -0
  150. package/build/drm/fairplayConfig.js.map +1 -0
  151. package/build/drm/index.d.ts +112 -0
  152. package/build/drm/index.d.ts.map +1 -0
  153. package/build/drm/index.js +191 -0
  154. package/build/drm/index.js.map +1 -0
  155. package/build/drm/widevineConfig.d.ts +58 -0
  156. package/build/drm/widevineConfig.d.ts.map +1 -0
  157. package/build/drm/widevineConfig.js +2 -0
  158. package/build/drm/widevineConfig.js.map +1 -0
  159. package/build/events.d.ts +692 -0
  160. package/build/events.d.ts.map +1 -0
  161. package/build/events.js +2 -0
  162. package/build/events.js.map +1 -0
  163. package/build/hooks/index.d.ts +2 -0
  164. package/build/hooks/index.d.ts.map +1 -0
  165. package/build/hooks/index.js +2 -0
  166. package/build/hooks/index.js.map +1 -0
  167. package/build/hooks/usePlayer.d.ts +8 -0
  168. package/build/hooks/usePlayer.d.ts.map +1 -0
  169. package/build/hooks/usePlayer.js +10 -0
  170. package/build/hooks/usePlayer.js.map +1 -0
  171. package/build/hooks/useProxy.d.ts +18 -0
  172. package/build/hooks/useProxy.d.ts.map +1 -0
  173. package/build/hooks/useProxy.js +16 -0
  174. package/build/hooks/useProxy.js.map +1 -0
  175. package/build/index.d.ts +32 -0
  176. package/build/index.d.ts.map +1 -0
  177. package/build/index.js +32 -0
  178. package/build/index.js.map +1 -0
  179. package/build/liveConfig.d.ts +13 -0
  180. package/build/liveConfig.d.ts.map +1 -0
  181. package/build/liveConfig.js +2 -0
  182. package/build/liveConfig.js.map +1 -0
  183. package/build/media.d.ts +85 -0
  184. package/build/media.d.ts.map +1 -0
  185. package/build/media.js +2 -0
  186. package/build/media.js.map +1 -0
  187. package/build/mediaControlConfig.d.ts +62 -0
  188. package/build/mediaControlConfig.d.ts.map +1 -0
  189. package/build/mediaControlConfig.js +2 -0
  190. package/build/mediaControlConfig.js.map +1 -0
  191. package/build/mediaTrackRole.d.ts +28 -0
  192. package/build/mediaTrackRole.d.ts.map +1 -0
  193. package/build/mediaTrackRole.js +2 -0
  194. package/build/mediaTrackRole.js.map +1 -0
  195. package/build/modules/AudioSessionModule.d.ts +8 -0
  196. package/build/modules/AudioSessionModule.d.ts.map +1 -0
  197. package/build/modules/AudioSessionModule.js +7 -0
  198. package/build/modules/AudioSessionModule.js.map +1 -0
  199. package/build/modules/BitmovinCastManagerModule.d.ts +11 -0
  200. package/build/modules/BitmovinCastManagerModule.d.ts.map +1 -0
  201. package/build/modules/BitmovinCastManagerModule.js +3 -0
  202. package/build/modules/BitmovinCastManagerModule.js.map +1 -0
  203. package/build/modules/BufferModule.d.ts +16 -0
  204. package/build/modules/BufferModule.d.ts.map +1 -0
  205. package/build/modules/BufferModule.js +3 -0
  206. package/build/modules/BufferModule.js.map +1 -0
  207. package/build/modules/DebugModule.d.ts +8 -0
  208. package/build/modules/DebugModule.d.ts.map +1 -0
  209. package/build/modules/DebugModule.js +3 -0
  210. package/build/modules/DebugModule.js.map +1 -0
  211. package/build/modules/PlayerModule.d.ts +188 -0
  212. package/build/modules/PlayerModule.d.ts.map +1 -0
  213. package/build/modules/PlayerModule.js +3 -0
  214. package/build/modules/PlayerModule.js.map +1 -0
  215. package/build/modules/SourceModule.d.ts +51 -0
  216. package/build/modules/SourceModule.d.ts.map +1 -0
  217. package/build/modules/SourceModule.js +3 -0
  218. package/build/modules/SourceModule.js.map +1 -0
  219. package/build/modules/UuidModule.d.ts +8 -0
  220. package/build/modules/UuidModule.d.ts.map +1 -0
  221. package/build/modules/UuidModule.js +3 -0
  222. package/build/modules/UuidModule.js.map +1 -0
  223. package/build/nativeInstance.d.ts +49 -0
  224. package/build/nativeInstance.d.ts.map +1 -0
  225. package/build/nativeInstance.js +20 -0
  226. package/build/nativeInstance.js.map +1 -0
  227. package/build/network/index.d.ts +50 -0
  228. package/build/network/index.d.ts.map +1 -0
  229. package/build/network/index.js +102 -0
  230. package/build/network/index.js.map +1 -0
  231. package/build/network/networkConfig.d.ts +151 -0
  232. package/build/network/networkConfig.d.ts.map +1 -0
  233. package/build/network/networkConfig.js +21 -0
  234. package/build/network/networkConfig.js.map +1 -0
  235. package/build/network/networkModule.d.ts +29 -0
  236. package/build/network/networkModule.d.ts.map +1 -0
  237. package/build/network/networkModule.js +3 -0
  238. package/build/network/networkModule.js.map +1 -0
  239. package/build/offline/index.d.ts +8 -0
  240. package/build/offline/index.d.ts.map +1 -0
  241. package/build/offline/index.js +8 -0
  242. package/build/offline/index.js.map +1 -0
  243. package/build/offline/offlineContentConfig.d.ts +18 -0
  244. package/build/offline/offlineContentConfig.d.ts.map +1 -0
  245. package/build/offline/offlineContentConfig.js +2 -0
  246. package/build/offline/offlineContentConfig.js.map +1 -0
  247. package/build/offline/offlineContentManager.d.ts +90 -0
  248. package/build/offline/offlineContentManager.d.ts.map +1 -0
  249. package/build/offline/offlineContentManager.js +177 -0
  250. package/build/offline/offlineContentManager.js.map +1 -0
  251. package/build/offline/offlineContentManagerListener.d.ts +174 -0
  252. package/build/offline/offlineContentManagerListener.d.ts.map +1 -0
  253. package/build/offline/offlineContentManagerListener.js +17 -0
  254. package/build/offline/offlineContentManagerListener.js.map +1 -0
  255. package/build/offline/offlineContentOptions.d.ts +29 -0
  256. package/build/offline/offlineContentOptions.d.ts.map +1 -0
  257. package/build/offline/offlineContentOptions.js +2 -0
  258. package/build/offline/offlineContentOptions.js.map +1 -0
  259. package/build/offline/offlineDownloadRequest.d.ts +19 -0
  260. package/build/offline/offlineDownloadRequest.d.ts.map +1 -0
  261. package/build/offline/offlineDownloadRequest.js +2 -0
  262. package/build/offline/offlineDownloadRequest.js.map +1 -0
  263. package/build/offline/offlineModule.d.ts +32 -0
  264. package/build/offline/offlineModule.d.ts.map +1 -0
  265. package/build/offline/offlineModule.js +3 -0
  266. package/build/offline/offlineModule.js.map +1 -0
  267. package/build/offline/offlineSourceOptions.d.ts +12 -0
  268. package/build/offline/offlineSourceOptions.d.ts.map +1 -0
  269. package/build/offline/offlineSourceOptions.js +2 -0
  270. package/build/offline/offlineSourceOptions.js.map +1 -0
  271. package/build/offline/offlineState.d.ts +23 -0
  272. package/build/offline/offlineState.d.ts.map +1 -0
  273. package/build/offline/offlineState.js +24 -0
  274. package/build/offline/offlineState.js.map +1 -0
  275. package/build/playbackConfig.d.ts +88 -0
  276. package/build/playbackConfig.d.ts.map +1 -0
  277. package/build/playbackConfig.js +2 -0
  278. package/build/playbackConfig.js.map +1 -0
  279. package/build/player.d.ts +308 -0
  280. package/build/player.d.ts.map +1 -0
  281. package/build/player.js +445 -0
  282. package/build/player.js.map +1 -0
  283. package/build/playerConfig.d.ts +83 -0
  284. package/build/playerConfig.d.ts.map +1 -0
  285. package/build/playerConfig.js +2 -0
  286. package/build/playerConfig.js.map +1 -0
  287. package/build/remoteControlConfig.d.ts +38 -0
  288. package/build/remoteControlConfig.d.ts.map +1 -0
  289. package/build/remoteControlConfig.js +2 -0
  290. package/build/remoteControlConfig.js.map +1 -0
  291. package/build/source.d.ts +216 -0
  292. package/build/source.d.ts.map +1 -0
  293. package/build/source.js +167 -0
  294. package/build/source.js.map +1 -0
  295. package/build/styleConfig.d.ts +120 -0
  296. package/build/styleConfig.d.ts.map +1 -0
  297. package/build/styleConfig.js +38 -0
  298. package/build/styleConfig.js.map +1 -0
  299. package/build/subtitleFormat.d.ts +27 -0
  300. package/build/subtitleFormat.d.ts.map +1 -0
  301. package/build/subtitleFormat.js +28 -0
  302. package/build/subtitleFormat.js.map +1 -0
  303. package/build/subtitleTrack.d.ts +55 -0
  304. package/build/subtitleTrack.d.ts.map +1 -0
  305. package/build/subtitleTrack.js +2 -0
  306. package/build/subtitleTrack.js.map +1 -0
  307. package/build/thumbnail.d.ts +38 -0
  308. package/build/thumbnail.d.ts.map +1 -0
  309. package/build/thumbnail.js +2 -0
  310. package/build/thumbnail.js.map +1 -0
  311. package/build/tweaksConfig.d.ts +197 -0
  312. package/build/tweaksConfig.d.ts.map +1 -0
  313. package/build/tweaksConfig.js +25 -0
  314. package/build/tweaksConfig.js.map +1 -0
  315. package/build/ui/customMessageHandlerModule.d.ts +27 -0
  316. package/build/ui/customMessageHandlerModule.d.ts.map +1 -0
  317. package/build/ui/customMessageHandlerModule.js +3 -0
  318. package/build/ui/customMessageHandlerModule.js.map +1 -0
  319. package/build/ui/custommessagehandler.d.ts +56 -0
  320. package/build/ui/custommessagehandler.d.ts.map +1 -0
  321. package/build/ui/custommessagehandler.js +54 -0
  322. package/build/ui/custommessagehandler.js.map +1 -0
  323. package/build/ui/custommessagehandlerbridge.d.ts +33 -0
  324. package/build/ui/custommessagehandlerbridge.d.ts.map +1 -0
  325. package/build/ui/custommessagehandlerbridge.js +72 -0
  326. package/build/ui/custommessagehandlerbridge.js.map +1 -0
  327. package/build/ui/custommessagesender.d.ts +5 -0
  328. package/build/ui/custommessagesender.d.ts.map +1 -0
  329. package/build/ui/custommessagesender.js +2 -0
  330. package/build/ui/custommessagesender.js.map +1 -0
  331. package/build/ui/fullscreenHandlerModule.d.ts +20 -0
  332. package/build/ui/fullscreenHandlerModule.d.ts.map +1 -0
  333. package/build/ui/fullscreenHandlerModule.js +3 -0
  334. package/build/ui/fullscreenHandlerModule.js.map +1 -0
  335. package/build/ui/fullscreenhandler.d.ts +18 -0
  336. package/build/ui/fullscreenhandler.d.ts.map +1 -0
  337. package/build/ui/fullscreenhandler.js +2 -0
  338. package/build/ui/fullscreenhandler.js.map +1 -0
  339. package/build/ui/fullscreenhandlerbridge.d.ts +26 -0
  340. package/build/ui/fullscreenhandlerbridge.d.ts.map +1 -0
  341. package/build/ui/fullscreenhandlerbridge.js +67 -0
  342. package/build/ui/fullscreenhandlerbridge.js.map +1 -0
  343. package/build/ui/index.d.ts +3 -0
  344. package/build/ui/index.d.ts.map +1 -0
  345. package/build/ui/index.js +3 -0
  346. package/build/ui/index.js.map +1 -0
  347. package/expo-module.config.json +40 -0
  348. package/ios/AppLifecycleDelegate.swift +25 -0
  349. package/ios/AudioSessionModule.swift +14 -40
  350. package/ios/BitmovinCastManagerModule.swift +30 -69
  351. package/ios/BufferModule.swift +26 -62
  352. package/ios/CustomMessageHandlerBridge.swift +11 -18
  353. package/ios/CustomMessageHandlerModule.swift +61 -63
  354. package/ios/DebugModule.swift +6 -27
  355. package/ios/DrmModule.swift +105 -379
  356. package/ios/Event+JSON.swift +1 -0
  357. package/ios/FullscreenHandlerBridge.swift +12 -5
  358. package/ios/FullscreenHandlerModule.swift +73 -57
  359. package/ios/LockedBox.swift +21 -0
  360. package/ios/ModuleRegistry+Generics.swift +11 -0
  361. package/ios/NetworkModule.swift +78 -82
  362. package/ios/OfflineContentManagerBridge.swift +11 -38
  363. package/ios/OfflineModule.swift +136 -454
  364. package/ios/PlayerAnalyticsModule.swift +24 -52
  365. package/ios/PlayerModule.swift +192 -770
  366. package/ios/RCTConvert+BitmovinPlayer.swift +38 -312
  367. package/ios/RNBitmovinPlayer.h +1 -8
  368. package/ios/RNBitmovinPlayer.podspec +47 -0
  369. package/ios/RNPlayerView.swift +600 -77
  370. package/ios/RNPlayerViewManager.swift +96 -210
  371. package/ios/Registry.swift +2 -2
  372. package/ios/ResultWaiter.swift +66 -0
  373. package/ios/SourceModule.swift +104 -223
  374. package/ios/UuidModule.swift +9 -18
  375. package/package.json +67 -71
  376. package/plugin/build/FeatureFlags.d.ts +24 -0
  377. package/plugin/build/FeatureFlags.js +2 -0
  378. package/plugin/build/index.d.ts +7 -0
  379. package/plugin/build/index.js +10 -0
  380. package/plugin/build/withAppGradleDependencies.d.ts +7 -0
  381. package/plugin/build/withAppGradleDependencies.js +49 -0
  382. package/plugin/build/withBitmovinAndroidConfig.d.ts +7 -0
  383. package/plugin/build/withBitmovinAndroidConfig.js +159 -0
  384. package/plugin/build/withBitmovinConfig.d.ts +7 -0
  385. package/plugin/build/withBitmovinConfig.js +21 -0
  386. package/plugin/build/withBitmovinIosConfig.d.ts +7 -0
  387. package/plugin/build/withBitmovinIosConfig.js +53 -0
  388. package/plugin/src/FeatureFlags.ts +21 -0
  389. package/plugin/src/index.ts +9 -0
  390. package/plugin/src/withAppGradleDependencies.ts +80 -0
  391. package/plugin/src/withBitmovinAndroidConfig.ts +224 -0
  392. package/plugin/src/withBitmovinConfig.ts +24 -0
  393. package/plugin/src/withBitmovinIosConfig.ts +71 -0
  394. package/plugin/tsconfig.json +9 -0
  395. package/plugin/tsconfig.tsbuildinfo +1 -0
  396. package/prettier.config.js +7 -0
  397. package/scripts/format-android.sh +2 -0
  398. package/scripts/format-swift.sh +3 -0
  399. package/scripts/lint-android.sh +2 -0
  400. package/scripts/lint-swift.sh +3 -0
  401. package/scripts/pre-commit.sh +14 -0
  402. package/scripts/setup-hooks.sh +58 -0
  403. package/src/BitmovinPlayerReactNative.types.ts +19 -0
  404. package/src/adaptationConfig.ts +1 -1
  405. package/src/advertising.ts +1 -1
  406. package/src/analytics/config.ts +4 -4
  407. package/src/analytics/player.ts +4 -6
  408. package/src/analytics/playerAnalyticsModule.ts +19 -0
  409. package/src/audioSession.ts +4 -6
  410. package/src/audioTrack.ts +1 -1
  411. package/src/bitmovinCastManager.ts +14 -10
  412. package/src/bufferApi.ts +1 -3
  413. package/src/bufferConfig.ts +2 -2
  414. package/src/components/PlayerView/events.ts +92 -94
  415. package/src/components/PlayerView/index.tsx +109 -159
  416. package/src/components/PlayerView/native.ts +24 -11
  417. package/src/components/PlayerView/nativeEvents.ts +113 -94
  418. package/src/components/PlayerView/pictureInPictureConfig.ts +1 -1
  419. package/src/components/PlayerView/playerViewConfig.ts +4 -8
  420. package/src/components/PlayerView/properties.ts +23 -22
  421. package/src/debug.ts +1 -3
  422. package/src/decoder/decoderConfig.ts +3 -3
  423. package/src/decoder/decoderConfigModule.ts +62 -0
  424. package/src/decoder/index.ts +32 -16
  425. package/src/drm/drmModule.ts +84 -0
  426. package/src/drm/fairplayConfig.ts +1 -1
  427. package/src/drm/index.ts +130 -40
  428. package/src/drm/widevineConfig.ts +5 -5
  429. package/src/events.ts +47 -41
  430. package/src/hooks/useProxy.ts +13 -20
  431. package/src/mediaControlConfig.ts +1 -1
  432. package/src/modules/AudioSessionModule.ts +13 -0
  433. package/src/modules/BitmovinCastManagerModule.ts +14 -0
  434. package/src/modules/BufferModule.ts +18 -0
  435. package/src/modules/DebugModule.ts +9 -0
  436. package/src/modules/PlayerModule.ts +251 -0
  437. package/src/modules/SourceModule.ts +74 -0
  438. package/src/modules/UuidModule.ts +9 -0
  439. package/src/nativeInstance.ts +3 -3
  440. package/src/network/index.ts +42 -15
  441. package/src/network/networkConfig.ts +3 -3
  442. package/src/network/networkModule.ts +51 -0
  443. package/src/offline/offlineContentConfig.ts +1 -1
  444. package/src/offline/offlineContentManager.ts +15 -50
  445. package/src/offline/offlineContentManagerListener.ts +20 -23
  446. package/src/offline/offlineContentOptions.ts +2 -2
  447. package/src/offline/offlineDownloadRequest.ts +1 -1
  448. package/src/offline/offlineModule.ts +46 -0
  449. package/src/offline/offlineSourceOptions.ts +2 -2
  450. package/src/offline/offlineState.ts +1 -1
  451. package/src/playbackConfig.ts +5 -6
  452. package/src/player.ts +53 -48
  453. package/src/source.ts +15 -14
  454. package/src/styleConfig.ts +5 -5
  455. package/src/subtitleFormat.ts +5 -5
  456. package/src/subtitleTrack.ts +1 -1
  457. package/src/tweaksConfig.ts +16 -16
  458. package/src/ui/customMessageHandlerModule.ts +46 -0
  459. package/src/ui/custommessagehandlerbridge.ts +45 -18
  460. package/src/ui/fullscreenHandlerModule.ts +35 -0
  461. package/src/ui/fullscreenhandlerbridge.ts +35 -15
  462. package/tsconfig.json +9 -0
  463. package/typedoc.json +23 -0
  464. package/RNBitmovinPlayer.podspec +0 -26
  465. package/android/src/main/java/com/bitmovin/player/reactnative/BitmovinBaseModule.kt +0 -114
  466. package/android/src/main/java/com/bitmovin/player/reactnative/EventRelay.kt +0 -47
  467. package/android/src/main/java/com/bitmovin/player/reactnative/RNPlayerViewPackage.kt +0 -48
  468. package/android/src/main/java/com/bitmovin/player/reactnative/extensions/ReactContextExtension.kt +0 -24
  469. package/android/src/main/java/com/bitmovin/player/reactnative/extensions/ReadableArray.kt +0 -20
  470. package/android/src/main/java/com/bitmovin/player/reactnative/extensions/ReadableMap.kt +0 -15
  471. package/android/src/main/java/com/bitmovin/player/reactnative/extensions/ReadableMapExtension.kt +0 -57
  472. package/android/src/main/java/com/bitmovin/player/reactnative/extensions/WritableMap.kt +0 -27
  473. package/android/src/main/java/com/bitmovin/player/reactnative/ui/CustomMessageHandlerModule.kt +0 -86
  474. package/android/src/main/java/com/bitmovin/player/reactnative/ui/FullscreenHandlerModule.kt +0 -78
  475. package/ios/AudioSessionModule.m +0 -10
  476. package/ios/BitmovinCastManagerModule.m +0 -14
  477. package/ios/BufferModule.m +0 -8
  478. package/ios/CustomMessageHandlerModule.m +0 -10
  479. package/ios/DebugModule.m +0 -7
  480. package/ios/DrmModule.m +0 -16
  481. package/ios/FullscreenHandlerModule.m +0 -10
  482. package/ios/NetworkModule.m +0 -10
  483. package/ios/OfflineModule.m +0 -19
  484. package/ios/PlayerAnalyticsModule.m +0 -8
  485. package/ios/PlayerModule.m +0 -130
  486. package/ios/PreprocessHttpRequestDelegateBridge.swift +0 -30
  487. package/ios/RCTBridge+Generics.swift +0 -6
  488. package/ios/RNBitmovinPlayer.xcodeproj/project.pbxproj +0 -303
  489. package/ios/RNPlayerView+PlayerListener.swift +0 -229
  490. package/ios/RNPlayerView+UserInterfaceListener.swift +0 -35
  491. package/ios/RNPlayerViewManager.m +0 -79
  492. package/ios/SourceModule.m +0 -42
  493. package/ios/UuidModule.m +0 -9
  494. package/lib/index.d.mts +0 -4303
  495. package/lib/index.d.ts +0 -4303
  496. package/lib/index.js +0 -1895
  497. package/lib/index.mjs +0 -1836
@@ -6,11 +6,10 @@ import android.content.Intent
6
6
  import android.content.ServiceConnection
7
7
  import android.os.IBinder
8
8
  import com.bitmovin.player.api.Player
9
- import com.bitmovin.player.reactnative.extensions.playerModule
10
9
  import com.bitmovin.player.reactnative.services.MediaSessionPlaybackService
11
- import com.facebook.react.bridge.*
10
+ import expo.modules.kotlin.AppContext
12
11
 
13
- class MediaSessionPlaybackManager(val context: ReactApplicationContext) {
12
+ class MediaSessionPlaybackManager(val appContext: AppContext) {
14
13
  private var serviceBinder: MediaSessionPlaybackService.ServiceBinder? = null
15
14
  private var playerId: NativeId? = null
16
15
  val player: Player?
@@ -33,6 +32,8 @@ class MediaSessionPlaybackManager(val context: ReactApplicationContext) {
33
32
  fun setupMediaSessionPlayback(playerId: NativeId) {
34
33
  this.playerId = playerId
35
34
 
35
+ val context = appContext.reactContext
36
+ ?: throw IllegalStateException("React context is not available")
36
37
  val intent = Intent(context, MediaSessionPlaybackService::class.java)
37
38
  intent.action = Intent.ACTION_MEDIA_BUTTON
38
39
  val connection: ServiceConnection = MediaSessionPlaybackServiceConnection()
@@ -49,7 +50,6 @@ class MediaSessionPlaybackManager(val context: ReactApplicationContext) {
49
50
 
50
51
  private fun getPlayer(
51
52
  nativeId: NativeId? = playerId,
52
- playerModule: PlayerModule? = context.playerModule,
53
- ): Player = nativeId?.let { playerModule?.getPlayerOrNull(nativeId) }
53
+ ): Player = playerId?.let { appContext.registry.getModule<PlayerModule>()?.getPlayerOrNull(it) }
54
54
  ?: throw IllegalArgumentException("Invalid PlayerId $nativeId")
55
55
  }
@@ -3,6 +3,7 @@ package com.bitmovin.player.reactnative
3
3
  import android.util.Log
4
4
  import androidx.concurrent.futures.CallbackToFutureAdapter
5
5
  import androidx.concurrent.futures.CallbackToFutureAdapter.Completer
6
+ import androidx.core.os.bundleOf
6
7
  import com.bitmovin.player.api.network.HttpRequest
7
8
  import com.bitmovin.player.api.network.HttpRequestType
8
9
  import com.bitmovin.player.api.network.HttpResponse
@@ -13,16 +14,17 @@ import com.bitmovin.player.reactnative.converter.toHttpRequest
13
14
  import com.bitmovin.player.reactnative.converter.toHttpResponse
14
15
  import com.bitmovin.player.reactnative.converter.toJson
15
16
  import com.bitmovin.player.reactnative.converter.toNetworkConfig
16
- import com.facebook.react.bridge.*
17
- import com.facebook.react.module.annotations.ReactModule
17
+ import expo.modules.kotlin.Promise
18
+ import expo.modules.kotlin.modules.Module
19
+ import expo.modules.kotlin.modules.ModuleDefinition
18
20
  import java.util.concurrent.ConcurrentHashMap
19
21
  import java.util.concurrent.Future
20
22
 
21
- private const val MODULE_NAME = "NetworkModule"
22
-
23
- @ReactModule(name = MODULE_NAME)
24
- class NetworkModule(context: ReactApplicationContext) : BitmovinBaseModule(context) {
25
-
23
+ /**
24
+ * Expo module for NetworkConfig management with HTTP request/response preprocessing.
25
+ * Handles bidirectional communication between native code and JavaScript for network operations.
26
+ */
27
+ class NetworkModule : Module() {
26
28
  /**
27
29
  * In-memory mapping from `nativeId`s to `NetworkConfig` instances.
28
30
  */
@@ -30,49 +32,84 @@ class NetworkModule(context: ReactApplicationContext) : BitmovinBaseModule(conte
30
32
  private val preprocessHttpRequestCompleters = ConcurrentHashMap<String, Completer<HttpRequest>>()
31
33
  private val preprocessHttpResponseCompleters = ConcurrentHashMap<String, Completer<HttpResponse>>()
32
34
 
33
- override fun getName() = MODULE_NAME
35
+ override fun definition() = ModuleDefinition {
36
+ Name("NetworkModule")
34
37
 
35
- fun getConfig(nativeId: NativeId?): NetworkConfig? = nativeId?.let { networkConfigs[it] }
38
+ OnDestroy {
39
+ networkConfigs.clear()
40
+ preprocessHttpRequestCompleters.clear()
41
+ preprocessHttpResponseCompleters.clear()
42
+ }
36
43
 
37
- @ReactMethod
38
- fun initWithConfig(nativeId: NativeId, config: ReadableMap, promise: Promise) {
39
- promise.unit.resolveOnUiThread {
44
+ Events("onPreprocessHttpRequest", "onPreprocessHttpResponse")
45
+
46
+ AsyncFunction("initializeWithConfig") { nativeId: NativeId, config: Map<String, Any?>, promise: Promise ->
40
47
  if (networkConfigs.containsKey(nativeId)) {
41
- return@resolveOnUiThread
48
+ promise.resolve(null)
49
+ return@AsyncFunction
50
+ }
51
+
52
+ try {
53
+ val networkConfig = config.toNetworkConfig()
54
+ networkConfigs[nativeId] = networkConfig
55
+ initConfigBlocks(nativeId, config)
56
+ promise.resolve(null)
57
+ } catch (e: Exception) {
58
+ promise.reject("NetworkError", "Failed to initialize network config", e)
59
+ }
60
+ }
61
+
62
+ AsyncFunction("destroy") { nativeId: NativeId ->
63
+ networkConfigs.remove(nativeId)
64
+
65
+ // Clean up completion handlers
66
+ preprocessHttpRequestCompleters.keys.filter { it.startsWith(nativeId) }.forEach {
67
+ preprocessHttpRequestCompleters.remove(it)
68
+ }
69
+ preprocessHttpResponseCompleters.keys.filter { it.startsWith(nativeId) }.forEach {
70
+ preprocessHttpResponseCompleters.remove(it)
42
71
  }
43
- val networkConfig = config.toNetworkConfig()
44
- networkConfigs[nativeId] = networkConfig
45
- initConfigBlocks(nativeId, config)
46
72
  }
47
- }
48
73
 
49
- @ReactMethod
50
- fun destroy(nativeId: NativeId) {
51
- networkConfigs.remove(nativeId)
52
- preprocessHttpRequestCompleters.keys.filter { it.startsWith(nativeId) }.forEach {
53
- preprocessHttpRequestCompleters.remove(it)
74
+ AsyncFunction("setPreprocessedHttpRequest") { requestId: String, request: Map<String, Any?> ->
75
+ val completer = preprocessHttpRequestCompleters.remove(requestId)
76
+ if (completer == null) {
77
+ Log.e("NetworkModule", "Completer is null for requestId: $requestId, this can cause stuck network requests")
78
+ return@AsyncFunction
79
+ }
80
+ completer.set(request.toHttpRequest())
54
81
  }
55
- preprocessHttpResponseCompleters.keys.filter { it.startsWith(nativeId) }.forEach {
56
- preprocessHttpResponseCompleters.remove(it)
82
+
83
+ AsyncFunction("setPreprocessedHttpResponse") { responseId: String, response: Map<String, Any?> ->
84
+ preprocessHttpResponseCompleters[responseId]?.set(response.toHttpResponse())
85
+ preprocessHttpResponseCompleters.remove(responseId)
57
86
  }
58
87
  }
59
88
 
60
- private fun initConfigBlocks(nativeId: String, config: ReadableMap) {
61
- initPreprocessHttpRequest(nativeId, networkConfigJson = config)
62
- initPreprocessHttpResponse(nativeId, networkConfigJson = config)
89
+ /**
90
+ * Retrieves the NetworkConfig instance for the given nativeId.
91
+ * This method maintains the same static access pattern as the legacy module.
92
+ */
93
+ fun getConfig(nativeId: NativeId?): NetworkConfig? = nativeId?.let { networkConfigs[it] }
94
+
95
+ private fun initConfigBlocks(nativeId: NativeId, config: Map<String, Any?>) {
96
+ initPreprocessHttpRequest(nativeId, config)
97
+ initPreprocessHttpResponse(nativeId, config)
63
98
  }
64
99
 
65
- private fun initPreprocessHttpRequest(nativeId: NativeId, networkConfigJson: ReadableMap) {
100
+ private fun initPreprocessHttpRequest(nativeId: NativeId, networkConfigJson: Map<String, Any?>) {
66
101
  val networkConfig = getConfig(nativeId) ?: return
67
- if (!networkConfigJson.hasKey("preprocessHttpRequest")) return
102
+ if (!networkConfigJson.containsKey("preprocessHttpRequest")) return
103
+
68
104
  networkConfig.preprocessHttpRequestCallback = PreprocessHttpRequestCallback { type, request ->
69
105
  preprocessHttpRequestFromJS(nativeId, type, request)
70
106
  }
71
107
  }
72
108
 
73
- private fun initPreprocessHttpResponse(nativeId: NativeId, networkConfigJson: ReadableMap) {
109
+ private fun initPreprocessHttpResponse(nativeId: NativeId, networkConfigJson: Map<String, Any?>) {
74
110
  val networkConfig = getConfig(nativeId) ?: return
75
- if (!networkConfigJson.hasKey("preprocessHttpResponse")) return
111
+ if (!networkConfigJson.containsKey("preprocessHttpResponse")) return
112
+
76
113
  networkConfig.preprocessHttpResponseCallback = PreprocessHttpResponseCallback { type, response ->
77
114
  preprocessHttpResponseFromJS(nativeId, type, response)
78
115
  }
@@ -84,25 +121,28 @@ class NetworkModule(context: ReactApplicationContext) : BitmovinBaseModule(conte
84
121
  request: HttpRequest,
85
122
  ): Future<HttpRequest> {
86
123
  val requestId = "$nativeId@${System.identityHashCode(request)}"
87
- val args = Arguments.createArray()
88
- args.pushString(requestId)
89
- args.pushString(type.toJson())
90
- args.pushMap(request.toJson())
124
+ val args = mapOf(
125
+ "requestId" to requestId,
126
+ "type" to type.toJson(),
127
+ "request" to request.toJson(),
128
+ )
91
129
 
92
130
  return CallbackToFutureAdapter.getFuture { completer ->
93
131
  preprocessHttpRequestCompleters[requestId] = completer
94
- context.catalystInstance.callFunction("Network-$nativeId", "onPreprocessHttpRequest", args as NativeArray)
95
- }
96
- }
97
132
 
98
- @ReactMethod
99
- fun setPreprocessedHttpRequest(requestId: String, request: ReadableMap) {
100
- val completer = preprocessHttpRequestCompleters.remove(requestId)
101
- if (completer == null) {
102
- Log.e(MODULE_NAME, "Completer is null for requestId: $requestId, this can cause stuck network requests")
103
- return
133
+ // Send event to TypeScript using Expo module event system
134
+ sendEvent(
135
+ "onPreprocessHttpRequest",
136
+ bundleOf(
137
+ "nativeId" to nativeId,
138
+ "requestId" to requestId,
139
+ "type" to type.toJson(),
140
+ "request" to request.toJson(),
141
+ ),
142
+ )
143
+
144
+ return@getFuture "NetworkModule-preprocessHttpRequest-$requestId"
104
145
  }
105
- completer.set(request.toHttpRequest())
106
146
  }
107
147
 
108
148
  private fun preprocessHttpResponseFromJS(
@@ -111,20 +151,22 @@ class NetworkModule(context: ReactApplicationContext) : BitmovinBaseModule(conte
111
151
  response: HttpResponse,
112
152
  ): Future<HttpResponse> {
113
153
  val responseId = "$nativeId@${System.identityHashCode(response)}"
114
- val args = Arguments.createArray()
115
- args.pushString(responseId)
116
- args.pushString(type.toJson())
117
- args.pushMap(response.toJson())
118
154
 
119
155
  return CallbackToFutureAdapter.getFuture { completer ->
120
156
  preprocessHttpResponseCompleters[responseId] = completer
121
- context.catalystInstance.callFunction("Network-$nativeId", "onPreprocessHttpResponse", args as NativeArray)
122
- }
123
- }
124
157
 
125
- @ReactMethod
126
- fun setPreprocessedHttpResponse(responseId: String, response: ReadableMap) {
127
- preprocessHttpResponseCompleters[responseId]?.set(response.toHttpResponse())
128
- preprocessHttpResponseCompleters.remove(responseId)
158
+ // Send event to TypeScript using Expo module event system
159
+ sendEvent(
160
+ "onPreprocessHttpResponse",
161
+ bundleOf(
162
+ "nativeId" to nativeId,
163
+ "responseId" to responseId,
164
+ "type" to type.toJson(),
165
+ "response" to response.toJson(),
166
+ ),
167
+ )
168
+
169
+ return@getFuture "NetworkModule-preprocessHttpResponse-$responseId"
170
+ }
129
171
  }
130
172
  }
@@ -2,247 +2,193 @@ package com.bitmovin.player.reactnative
2
2
 
3
3
  import com.bitmovin.player.api.offline.options.OfflineOptionEntryState
4
4
  import com.bitmovin.player.reactnative.converter.toSourceConfig
5
- import com.bitmovin.player.reactnative.extensions.drmModule
6
- import com.bitmovin.player.reactnative.extensions.getIntOrNull
7
- import com.bitmovin.player.reactnative.extensions.getStringArray
8
5
  import com.bitmovin.player.reactnative.offline.OfflineContentManagerBridge
9
6
  import com.bitmovin.player.reactnative.offline.OfflineDownloadRequest
10
- import com.facebook.react.bridge.*
11
- import com.facebook.react.module.annotations.ReactModule
7
+ import expo.modules.kotlin.exception.CodedException
8
+ import expo.modules.kotlin.modules.Module
9
+ import expo.modules.kotlin.modules.ModuleDefinition
12
10
  import java.security.InvalidParameterException
13
11
 
14
- private const val OFFLINE_MODULE = "BitmovinOfflineModule"
15
-
16
- @ReactModule(name = OFFLINE_MODULE)
17
- class OfflineModule(context: ReactApplicationContext) : BitmovinBaseModule(context) {
12
+ class OfflineModule : Module() {
18
13
 
19
14
  /**
20
- * In-memory mapping from `nativeId`s to `OfflineManager` instances.
15
+ * In-memory mapping from `nativeId`s to `OfflineContentManagerBridge` instances.
16
+ * This must match the Registry pattern from legacy OfflineModule
21
17
  */
22
18
  private val offlineContentManagerBridges: Registry<OfflineContentManagerBridge> = mutableMapOf()
23
19
 
24
- /**
25
- * JS exported module name.
26
- */
27
- override fun getName() = OFFLINE_MODULE
28
-
29
- /**
30
- * Fetches the `OfflineManager` instance associated with `nativeId` from the internal offline managers.
31
- */
32
- fun getOfflineContentManagerBridgeOrNull(
33
- nativeId: NativeId,
34
- ): OfflineContentManagerBridge? = offlineContentManagerBridges[nativeId]
20
+ override fun definition() = ModuleDefinition {
21
+ Name("OfflineModule")
35
22
 
36
- private fun RejectPromiseOnExceptionBlock.getOfflineContentManagerBridge(
37
- nativeId: NativeId,
38
- ): OfflineContentManagerBridge = offlineContentManagerBridges[nativeId]
39
- ?: throw IllegalArgumentException("No offline content manager bridge for id $nativeId")
23
+ Events("onBitmovinOfflineEvent")
40
24
 
41
- /**
42
- * Callback when a new NativeEventEmitter is created from the Typescript layer.
43
- */
44
- @ReactMethod
45
- fun addListener(eventName: String?) {
46
- // NO-OP
47
- }
25
+ OnCreate {
26
+ // Module initialization
27
+ }
48
28
 
49
- /**
50
- * Callback when a NativeEventEmitter is removed from the Typescript layer.
51
- */
52
- @ReactMethod
53
- fun removeListeners(count: Int?) {
54
- // NO-OP
55
- }
29
+ OnDestroy {
30
+ // Clean up offline content managers
31
+ offlineContentManagerBridges.clear()
32
+ }
56
33
 
57
- /**
58
- * Creates a new `OfflineManager` instance inside the internal offline managers using the provided `config` object.
59
- * @param config `ReadableMap` object received from JS. Should contain a sourceConfig and location.
60
- */
61
- @ReactMethod
62
- fun initWithConfig(nativeId: NativeId, config: ReadableMap?, drmNativeId: NativeId?, promise: Promise) {
63
- promise.unit.resolveOnUiThread {
34
+ AsyncFunction("initializeWithConfig") { nativeId: NativeId, config: Map<String, Any?>?, drmNativeId: NativeId? ->
64
35
  if (offlineContentManagerBridges.containsKey(nativeId)) {
65
- throw InvalidParameterException("content manager bridge id already exists: $nativeId")
36
+ throw OfflineException.ManagerAlreadyExists(nativeId)
66
37
  }
67
- val identifier = config?.getString("identifier")
68
- ?.takeIf { it.isNotEmpty() } ?: throw IllegalArgumentException("invalid identifier")
69
38
 
70
- val sourceConfig = config.getMap("sourceConfig")?.toSourceConfig()
71
- ?: throw IllegalArgumentException("Invalid source config")
39
+ val identifier = config?.get("identifier") as? String
40
+ ?: throw OfflineException.InvalidIdentifier()
41
+
42
+ val sourceConfig = (config["sourceConfig"] as? Map<String, Any?>)?.toSourceConfig()
43
+ ?: throw OfflineException.InvalidSourceConfig()
72
44
 
73
- sourceConfig.drmConfig = context.drmModule?.getConfig(drmNativeId)
45
+ // Get DRM config from DrmModule if available
46
+ sourceConfig.drmConfig = appContext.registry.getModule<DrmModule>()?.getConfig(drmNativeId)
47
+
48
+ val context = appContext.reactContext
49
+ ?: throw InvalidParameterException("ReactApplicationContext is not available")
74
50
 
75
51
  offlineContentManagerBridges[nativeId] = OfflineContentManagerBridge(
76
52
  nativeId,
77
53
  context,
54
+ this@OfflineModule,
78
55
  identifier,
79
56
  sourceConfig,
80
- context.cacheDir.path,
57
+ appContext.cacheDirectory.path,
81
58
  )
82
59
  }
83
- }
84
60
 
85
- @ReactMethod
86
- fun getState(nativeId: NativeId, promise: Promise) {
87
- promise.string.resolveWithBridge(nativeId) {
88
- state.name
61
+ /**
62
+ * Gets the current state of the `OfflineContentManager`
63
+ */
64
+ AsyncFunction("getState") { nativeId: NativeId ->
65
+ getOfflineContentManagerBridge(nativeId).state.name
89
66
  }
90
- }
91
67
 
92
- /**
93
- * Starts the `OfflineContentManager`'s asynchronous process of fetching the `OfflineContentOptions`.
94
- * When the options are loaded a device event will be fired where the event type is `BitmovinOfflineEvent` and the data has an event type of `onOptionsAvailable`.
95
- * @param nativeId Target offline manager.
96
- */
97
- @ReactMethod
98
- fun getOptions(nativeId: NativeId, promise: Promise) {
99
- promise.unit.resolveWithBridge(nativeId) {
100
- getOptions()
68
+ /**
69
+ * Starts the `OfflineContentManager`'s asynchronous process of fetching the `OfflineContentOptions`.
70
+ * When the options are loaded a device event will be fired where the event type is `BitmovinOfflineEvent` * and the data has an event type of `onOptionsAvailable`.
71
+ */
72
+ AsyncFunction("getOptions") { nativeId: NativeId ->
73
+ getOfflineContentManagerBridge(nativeId).getOptions()
101
74
  }
102
- }
103
75
 
104
- /**
105
- * Enqueues downloads according to the `OfflineDownloadRequest`.
106
- * The promise will reject in the event of null or invalid request parameters.
107
- * The promise will reject an `IllegalOperationException` when selecting an `OfflineOptionEntry` to download that is not compatible with the current state.
108
- * @param nativeId Target offline manager.
109
- * @param request `ReadableMap` that contains the `OfflineManager.OfflineOptionType`, id, and `OfflineOptionEntryAction` necessary to set the new action.
110
- */
111
- @ReactMethod
112
- fun download(nativeId: NativeId, request: ReadableMap, promise: Promise) {
113
- promise.unit.resolveWithBridge(nativeId) {
114
- when (state) {
115
- OfflineOptionEntryState.Downloaded -> throw IllegalStateException("Download already completed")
116
- OfflineOptionEntryState.Downloading, OfflineOptionEntryState.Failed -> throw IllegalStateException(
117
- "Download already in progress",
118
- )
119
- OfflineOptionEntryState.Suspended -> throw IllegalStateException("Download is suspended")
76
+ /**
77
+ * Enqueues downloads according to the `OfflineDownloadRequest`.
78
+ * The promise will reject in the event of null or invalid request parameters.
79
+ */
80
+ AsyncFunction("download") { nativeId: NativeId, request: Map<String, Any?> ->
81
+ val bridge = getOfflineContentManagerBridge(nativeId)
82
+
83
+ when (bridge.state) {
84
+ OfflineOptionEntryState.Downloaded -> throw OfflineException.DownloadAlreadyCompleted()
85
+ OfflineOptionEntryState.Downloading, OfflineOptionEntryState.Failed ->
86
+ throw OfflineException.DownloadInProgress()
87
+ OfflineOptionEntryState.Suspended -> throw OfflineException.DownloadSuspended()
120
88
  else -> {}
121
89
  }
122
- val minimumBitRate = request.getIntOrNull("minimumBitrate")?.also {
123
- if (it < 0) throw IllegalArgumentException("Invalid download request")
90
+
91
+ val minimumBitRate = request["minimumBitrate"] as? Int
92
+ if (minimumBitRate != null && minimumBitRate < 0) {
93
+ throw OfflineException.InvalidRequest()
124
94
  }
125
- val audioOptionIds = request.getStringArray("audioOptionIds")?.filterNotNull()
126
- val textOptionIds = request.getStringArray("textOptionIds")?.filterNotNull()
127
95
 
128
- process(OfflineDownloadRequest(minimumBitRate, audioOptionIds, textOptionIds))
96
+ val audioOptionIds = (request["audioOptionIds"] as? List<*>)?.filterIsInstance<String>()
97
+ val textOptionIds = (request["textOptionIds"] as? List<*>)?.filterIsInstance<String>()
98
+
99
+ bridge.process(OfflineDownloadRequest(minimumBitRate, audioOptionIds, textOptionIds))
129
100
  }
130
- }
131
101
 
132
- /**
133
- * Resumes all suspended actions.
134
- * @param nativeId Target offline manager.
135
- */
136
- @ReactMethod
137
- fun resume(nativeId: NativeId, promise: Promise) {
138
- promise.unit.resolveWithBridge(nativeId) {
139
- resume()
102
+ /**
103
+ * Resumes all suspended actions.
104
+ */
105
+ AsyncFunction("resume") { nativeId: NativeId ->
106
+ getOfflineContentManagerBridge(nativeId).resume()
140
107
  }
141
- }
142
108
 
143
- /**
144
- * Suspends all active actions.
145
- * @param nativeId Target offline manager.
146
- */
147
- @ReactMethod
148
- fun suspend(nativeId: NativeId, promise: Promise) {
149
- promise.unit.resolveWithBridge(nativeId) {
150
- suspend()
109
+ /**
110
+ * Suspends all active actions.
111
+ */
112
+ AsyncFunction("suspend") { nativeId: NativeId ->
113
+ getOfflineContentManagerBridge(nativeId).suspend()
151
114
  }
152
- }
153
115
 
154
- /**
155
- * Cancels and deletes the current download.
156
- * @param nativeId Target offline manager.
157
- */
158
- @ReactMethod
159
- fun cancelDownload(nativeId: NativeId, promise: Promise) {
160
- promise.unit.resolveWithBridge(nativeId) {
161
- cancelDownload()
116
+ /**
117
+ * Cancels and deletes the current download.
118
+ */
119
+ AsyncFunction("cancelDownload") { nativeId: NativeId ->
120
+ getOfflineContentManagerBridge(nativeId).cancelDownload()
162
121
  }
163
- }
164
122
 
165
- /**
166
- * Resolve `nativeId`'s current `usedStorage`.
167
- * @param nativeId Target offline manager.
168
- */
169
- @ReactMethod
170
- fun usedStorage(nativeId: NativeId, promise: Promise) {
171
- promise.double.resolveWithBridge(nativeId) {
172
- offlineContentManager.usedStorage.toDouble()
123
+ /**
124
+ * Resolve `nativeId`'s current `usedStorage`.
125
+ */
126
+ AsyncFunction("usedStorage") { nativeId: NativeId ->
127
+ getOfflineContentManagerBridge(nativeId).offlineContentManager.usedStorage.toDouble()
173
128
  }
174
- }
175
129
 
176
- /**
177
- * Deletes everything related to the related content ID.
178
- * @param nativeId Target offline manager.
179
- */
180
- @ReactMethod
181
- fun deleteAll(nativeId: NativeId, promise: Promise) {
182
- promise.unit.resolveWithBridge(nativeId) {
183
- deleteAll()
130
+ /**
131
+ * Deletes everything related to the related content ID.
132
+ */
133
+ AsyncFunction("deleteAll") { nativeId: NativeId ->
134
+ getOfflineContentManagerBridge(nativeId).deleteAll()
184
135
  }
185
- }
186
136
 
187
- /**
188
- * Downloads the offline license.
189
- * When finished successfully a device event will be fired where the event type is `BitmovinOfflineEvent` and the data has an event type of `onDrmLicenseUpdated`.
190
- * Errors are transmitted by a device event will be fired where the event type is `BitmovinOfflineEvent` and the data has an event type of `onError`.
191
- * @param nativeId Target offline manager.
192
- */
193
- @ReactMethod
194
- fun downloadLicense(nativeId: NativeId, promise: Promise) {
195
- promise.unit.resolveWithBridge(nativeId) {
196
- downloadLicense()
137
+ /**
138
+ * Downloads the offline license.
139
+ * When finished successfully a device event will be fired where the event type is `BitmovinOfflineEvent` * and the data has an event type of `onDrmLicenseUpdated`.
140
+ */
141
+ AsyncFunction("downloadLicense") { nativeId: NativeId ->
142
+ getOfflineContentManagerBridge(nativeId).downloadLicense()
197
143
  }
198
- }
199
144
 
200
- /**
201
- * Releases the currently held offline license.
202
- * When finished successfully a device event will be fired where the event type is `BitmovinOfflineEvent` and the data has an event type of `onDrmLicenseUpdated`.
203
- * Errors are transmitted by a device event will be fired where the event type is `BitmovinOfflineEvent` and the data has an event type of `onError`.
204
- * @param nativeId Target offline manager.
205
- */
206
- @ReactMethod
207
- fun releaseLicense(nativeId: NativeId, promise: Promise) {
208
- promise.unit.resolveWithBridge(nativeId) {
209
- releaseLicense()
145
+ /**
146
+ * Releases the currently held offline license.
147
+ * When finished successfully a device event will be fired where the event type is `BitmovinOfflineEvent` * and the data has an event type of `onDrmLicenseUpdated`.
148
+ */
149
+ AsyncFunction("releaseLicense") { nativeId: NativeId ->
150
+ getOfflineContentManagerBridge(nativeId).releaseLicense()
210
151
  }
211
- }
212
152
 
213
- /**
214
- * Renews the already downloaded DRM license.
215
- * When finished successfully a device event will be fired where the event type is `BitmovinOfflineEvent` and the data has an event type of `onDrmLicenseUpdated`.
216
- * Errors are transmitted by a device event will be fired where the event type is `BitmovinOfflineEvent` and the data has an event type of `onError`.
217
- * @param nativeId Target offline manager.
218
- */
219
- @ReactMethod
220
- fun renewOfflineLicense(nativeId: NativeId, promise: Promise) {
221
- promise.unit.resolveWithBridge(nativeId) {
222
- renewOfflineLicense()
153
+ /**
154
+ * Renews the already downloaded DRM license.
155
+ * When finished successfully a device event will be fired where the event type is `BitmovinOfflineEvent` * and the data has an event type of `onDrmLicenseUpdated`.
156
+ */
157
+ AsyncFunction("renewOfflineLicense") { nativeId: NativeId ->
158
+ getOfflineContentManagerBridge(nativeId).renewOfflineLicense()
223
159
  }
224
- }
225
160
 
226
- /**
227
- * Call `.release()` on `nativeId`'s offline manager.
228
- * IMPORTANT: Call this when the component, in which it was created, is destroyed.
229
- * The `OfflineManager` should not be used after calling this method.
230
- * @param nativeId Target player Id.
231
- */
232
- @ReactMethod
233
- fun release(nativeId: NativeId, promise: Promise) {
234
- promise.unit.resolveWithBridge(nativeId) {
235
- release()
161
+ /**
162
+ * Call `.release()` on `nativeId`'s offline manager.
163
+ * IMPORTANT: Call this when the component, in which it was created, is destroyed.
164
+ * The `OfflineManager` should not be used after calling this method.
165
+ */
166
+ AsyncFunction("release") { nativeId: NativeId ->
167
+ val bridge = getOfflineContentManagerBridge(nativeId)
168
+ bridge.release()
236
169
  offlineContentManagerBridges.remove(nativeId)
237
170
  }
238
171
  }
239
172
 
240
- private inline fun <T> TPromise<T>.resolveWithBridge(
241
- nativeId: NativeId,
242
- crossinline block: OfflineContentManagerBridge.() -> T,
243
- ) {
244
- resolveOnCurrentThread {
245
- getOfflineContentManagerBridge(nativeId).block()
246
- }
173
+ /**
174
+ * Helper function to get OfflineContentManagerBridge with proper error handling
175
+ */
176
+ fun getOfflineContentManagerBridge(nativeId: NativeId): OfflineContentManagerBridge {
177
+ return offlineContentManagerBridges[nativeId] ?: throw OfflineException.ManagerNotFound(nativeId)
247
178
  }
248
179
  }
180
+
181
+ // MARK: - Exception Definitions
182
+
183
+ sealed class OfflineException(message: String) : CodedException(message) {
184
+ class ManagerAlreadyExists(nativeId: NativeId) : OfflineException(
185
+ "Content manager bridge id already exists: $nativeId",
186
+ )
187
+ class ManagerNotFound(nativeId: NativeId) : OfflineException("No offline content manager bridge for id $nativeId")
188
+ class InvalidIdentifier : OfflineException("Invalid identifier")
189
+ class InvalidSourceConfig : OfflineException("Invalid source config")
190
+ class InvalidRequest : OfflineException("Invalid download request")
191
+ class DownloadAlreadyCompleted : OfflineException("Download already completed")
192
+ class DownloadInProgress : OfflineException("Download already in progress")
193
+ class DownloadSuspended : OfflineException("Download is suspended")
194
+ }