rx-player 4.4.0 → 4.4.1-dev.2025101500

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 (341) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/README.md +52 -113
  3. package/VERSION +1 -1
  4. package/dist/commonjs/__GENERATED_CODE/embedded_worker.d.ts.map +1 -1
  5. package/dist/commonjs/__GENERATED_CODE/embedded_worker.js +1 -1
  6. package/dist/commonjs/core/{main/common → entry}/FreezeResolver.d.ts +3 -3
  7. package/dist/commonjs/core/entry/FreezeResolver.d.ts.map +1 -0
  8. package/dist/commonjs/core/{main/common → entry}/FreezeResolver.js +3 -3
  9. package/dist/{es2017/core/main/worker → commonjs/core/entry}/content_preparer.d.ts +22 -15
  10. package/dist/commonjs/core/entry/content_preparer.d.ts.map +1 -0
  11. package/dist/commonjs/core/{main/worker → entry}/content_preparer.js +62 -64
  12. package/dist/{es2017/core/main/common → commonjs/core/entry}/content_time_boundaries_observer.d.ts +5 -5
  13. package/dist/commonjs/core/entry/content_time_boundaries_observer.d.ts.map +1 -0
  14. package/dist/commonjs/core/{main/common → entry}/content_time_boundaries_observer.js +6 -6
  15. package/dist/commonjs/core/entry/core_entry.d.ts +36 -0
  16. package/dist/commonjs/core/entry/core_entry.d.ts.map +1 -0
  17. package/dist/commonjs/core/{main/worker/worker_main.js → entry/core_entry.js} +192 -153
  18. package/dist/commonjs/core/{main/worker/worker_text_displayer_interface.d.ts → entry/core_text_displayer_interface.d.ts} +11 -11
  19. package/dist/commonjs/core/entry/core_text_displayer_interface.d.ts.map +1 -0
  20. package/dist/commonjs/core/{main/worker/worker_text_displayer_interface.js → entry/core_text_displayer_interface.js} +22 -22
  21. package/dist/commonjs/core/{main/common → entry}/create_content_time_boundaries_observer.d.ts +6 -6
  22. package/dist/commonjs/core/entry/create_content_time_boundaries_observer.d.ts.map +1 -0
  23. package/dist/commonjs/core/{main/common → entry}/create_content_time_boundaries_observer.js +1 -1
  24. package/dist/commonjs/core/{main/common → entry}/get_buffered_data_per_media_buffer.d.ts +4 -4
  25. package/dist/commonjs/core/entry/get_buffered_data_per_media_buffer.d.ts.map +1 -0
  26. package/dist/commonjs/core/{main/common → entry}/get_buffered_data_per_media_buffer.js +1 -1
  27. package/dist/{es2017/core/main/common → commonjs/core/entry}/get_thumbnail_data.d.ts +3 -3
  28. package/dist/commonjs/core/entry/get_thumbnail_data.d.ts.map +1 -0
  29. package/dist/commonjs/core/{main/common → entry}/get_thumbnail_data.js +2 -2
  30. package/dist/commonjs/core/entry/index.d.ts +5 -0
  31. package/dist/commonjs/core/entry/index.d.ts.map +1 -0
  32. package/dist/commonjs/core/entry/index.js +4 -0
  33. package/dist/{es2017/core/main/common → commonjs/core/entry}/synchronize_sinks_on_observation.d.ts +2 -2
  34. package/dist/commonjs/core/entry/synchronize_sinks_on_observation.d.ts.map +1 -0
  35. package/dist/commonjs/core/{main/worker → entry}/track_choice_setter.d.ts +4 -4
  36. package/dist/commonjs/core/entry/track_choice_setter.d.ts.map +1 -0
  37. package/dist/commonjs/core/{main/worker → entry}/track_choice_setter.js +4 -4
  38. package/dist/commonjs/core/entry/utils.d.ts +3 -0
  39. package/dist/commonjs/core/entry/utils.d.ts.map +1 -0
  40. package/dist/commonjs/core/entry/utils.js +11 -0
  41. package/dist/commonjs/core/stream/orchestrator/stream_orchestrator.d.ts.map +1 -1
  42. package/dist/commonjs/core/stream/orchestrator/stream_orchestrator.js +17 -0
  43. package/dist/commonjs/core/types.d.ts +519 -1
  44. package/dist/commonjs/core/types.d.ts.map +1 -1
  45. package/dist/commonjs/core/types.js +1 -0
  46. package/dist/commonjs/experimental/features/local.d.ts.map +1 -1
  47. package/dist/commonjs/experimental/features/local.js +7 -1
  48. package/dist/commonjs/experimental/features/metaplaylist.d.ts.map +1 -1
  49. package/dist/commonjs/experimental/features/metaplaylist.js +7 -1
  50. package/dist/commonjs/experimental/features/multi_thread.d.ts.map +1 -1
  51. package/dist/commonjs/experimental/features/multi_thread.js +6 -2
  52. package/dist/commonjs/features/features_object.js +1 -1
  53. package/dist/commonjs/features/list/dash.d.ts.map +1 -1
  54. package/dist/commonjs/features/list/dash.js +7 -1
  55. package/dist/commonjs/features/list/dash_wasm.d.ts.map +1 -1
  56. package/dist/commonjs/features/list/dash_wasm.js +7 -1
  57. package/dist/commonjs/features/list/media_source_main.d.ts.map +1 -1
  58. package/dist/commonjs/features/list/media_source_main.js +7 -1
  59. package/dist/commonjs/features/list/smooth.d.ts.map +1 -1
  60. package/dist/commonjs/features/list/smooth.js +7 -1
  61. package/dist/commonjs/features/types.d.ts +20 -4
  62. package/dist/commonjs/features/types.d.ts.map +1 -1
  63. package/dist/commonjs/main_thread/api/public_api.d.ts.map +1 -1
  64. package/dist/commonjs/main_thread/api/public_api.js +39 -42
  65. package/dist/commonjs/main_thread/core_interface/base.d.ts +13 -0
  66. package/dist/commonjs/main_thread/core_interface/base.d.ts.map +1 -0
  67. package/dist/commonjs/main_thread/core_interface/base.js +32 -0
  68. package/dist/commonjs/main_thread/core_interface/monothread.d.ts +13 -0
  69. package/dist/commonjs/main_thread/core_interface/monothread.d.ts.map +1 -0
  70. package/dist/commonjs/main_thread/core_interface/monothread.js +56 -0
  71. package/dist/commonjs/main_thread/core_interface/multithread.d.ts +25 -0
  72. package/dist/commonjs/main_thread/core_interface/multithread.d.ts.map +1 -0
  73. package/dist/commonjs/main_thread/core_interface/multithread.js +67 -0
  74. package/dist/commonjs/main_thread/core_interface/types.d.ts +6 -0
  75. package/dist/commonjs/main_thread/core_interface/types.d.ts.map +1 -0
  76. package/dist/commonjs/main_thread/core_interface/types.js +2 -0
  77. package/dist/commonjs/main_thread/init/media_source_content_initializer.d.ts +166 -108
  78. package/dist/commonjs/main_thread/init/media_source_content_initializer.d.ts.map +1 -1
  79. package/dist/commonjs/main_thread/init/media_source_content_initializer.js +1492 -919
  80. package/dist/commonjs/main_thread/init/utils/create_core_playback_observer.d.ts.map +1 -1
  81. package/dist/commonjs/main_thread/init/utils/create_core_playback_observer.js +2 -1
  82. package/dist/commonjs/main_thread/init/utils/update_manifest_codec_support.d.ts +1 -1
  83. package/dist/commonjs/main_thread/init/utils/update_manifest_codec_support.d.ts.map +1 -1
  84. package/dist/commonjs/main_thread/types.d.ts +537 -0
  85. package/dist/commonjs/main_thread/types.d.ts.map +1 -1
  86. package/dist/commonjs/manifest/utils.d.ts.map +1 -1
  87. package/dist/commonjs/manifest/utils.js +18 -4
  88. package/dist/commonjs/mse/worker_media_source_interface.d.ts +2 -2
  89. package/dist/commonjs/mse/worker_media_source_interface.d.ts.map +1 -1
  90. package/dist/commonjs/mse/worker_media_source_interface.js +12 -12
  91. package/dist/commonjs/parsers/manifest/smooth/create_parser.d.ts +1 -1
  92. package/dist/commonjs/parsers/manifest/smooth/create_parser.d.ts.map +1 -1
  93. package/dist/commonjs/parsers/manifest/smooth/create_parser.js +31 -27
  94. package/dist/commonjs/parsers/manifest/smooth/parse_C_nodes.d.ts +3 -2
  95. package/dist/commonjs/parsers/manifest/smooth/parse_C_nodes.d.ts.map +1 -1
  96. package/dist/commonjs/parsers/manifest/smooth/parse_C_nodes.js +16 -7
  97. package/dist/commonjs/parsers/manifest/smooth/parse_protection_node.d.ts +3 -2
  98. package/dist/commonjs/parsers/manifest/smooth/parse_protection_node.d.ts.map +1 -1
  99. package/dist/commonjs/parsers/manifest/smooth/parse_protection_node.js +37 -6
  100. package/dist/commonjs/parsers/manifest/smooth/utils/parseBoolean.d.ts +1 -1
  101. package/dist/commonjs/parsers/manifest/smooth/utils/parseBoolean.d.ts.map +1 -1
  102. package/dist/commonjs/parsers/manifest/smooth/utils/reduceChildren.d.ts +3 -2
  103. package/dist/commonjs/parsers/manifest/smooth/utils/reduceChildren.d.ts.map +1 -1
  104. package/dist/commonjs/parsers/manifest/smooth/utils/reduceChildren.js +28 -5
  105. package/dist/{es2017/playback_observer/worker_playback_observer.d.ts → commonjs/playback_observer/core_playback_observer.d.ts} +8 -8
  106. package/dist/commonjs/playback_observer/core_playback_observer.d.ts.map +1 -0
  107. package/dist/commonjs/playback_observer/{worker_playback_observer.js → core_playback_observer.js} +13 -13
  108. package/dist/commonjs/transports/smooth/pipelines.d.ts.map +1 -1
  109. package/dist/commonjs/transports/smooth/pipelines.js +25 -3
  110. package/dist/commonjs/worker_entry_point.js +62 -2
  111. package/dist/es2017/__GENERATED_CODE/embedded_worker.d.ts.map +1 -1
  112. package/dist/es2017/__GENERATED_CODE/embedded_worker.js +1 -1
  113. package/dist/es2017/core/{main/common → entry}/FreezeResolver.d.ts +3 -3
  114. package/dist/es2017/core/entry/FreezeResolver.d.ts.map +1 -0
  115. package/dist/es2017/core/{main/common → entry}/FreezeResolver.js +3 -3
  116. package/dist/{commonjs/core/main/worker → es2017/core/entry}/content_preparer.d.ts +22 -15
  117. package/dist/es2017/core/entry/content_preparer.d.ts.map +1 -0
  118. package/dist/es2017/core/{main/worker → entry}/content_preparer.js +53 -55
  119. package/dist/{commonjs/core/main/common → es2017/core/entry}/content_time_boundaries_observer.d.ts +5 -5
  120. package/dist/es2017/core/entry/content_time_boundaries_observer.d.ts.map +1 -0
  121. package/dist/es2017/core/{main/common → entry}/content_time_boundaries_observer.js +6 -6
  122. package/dist/es2017/core/entry/core_entry.d.ts +36 -0
  123. package/dist/es2017/core/entry/core_entry.d.ts.map +1 -0
  124. package/dist/es2017/core/{main/worker/worker_main.js → entry/core_entry.js} +153 -114
  125. package/dist/es2017/core/{main/worker/worker_text_displayer_interface.d.ts → entry/core_text_displayer_interface.d.ts} +11 -11
  126. package/dist/es2017/core/entry/core_text_displayer_interface.d.ts.map +1 -0
  127. package/dist/es2017/core/{main/worker/worker_text_displayer_interface.js → entry/core_text_displayer_interface.js} +10 -10
  128. package/dist/es2017/core/{main/common → entry}/create_content_time_boundaries_observer.d.ts +6 -6
  129. package/dist/es2017/core/entry/create_content_time_boundaries_observer.d.ts.map +1 -0
  130. package/dist/es2017/core/{main/common → entry}/create_content_time_boundaries_observer.js +1 -1
  131. package/dist/es2017/core/{main/common → entry}/get_buffered_data_per_media_buffer.d.ts +4 -4
  132. package/dist/es2017/core/entry/get_buffered_data_per_media_buffer.d.ts.map +1 -0
  133. package/dist/es2017/core/{main/common → entry}/get_buffered_data_per_media_buffer.js +1 -1
  134. package/dist/{commonjs/core/main/common → es2017/core/entry}/get_thumbnail_data.d.ts +3 -3
  135. package/dist/es2017/core/entry/get_thumbnail_data.d.ts.map +1 -0
  136. package/dist/es2017/core/{main/common → entry}/get_thumbnail_data.js +2 -2
  137. package/dist/es2017/core/entry/index.d.ts +5 -0
  138. package/dist/es2017/core/entry/index.d.ts.map +1 -0
  139. package/dist/es2017/core/entry/index.js +2 -0
  140. package/dist/{commonjs/core/main/common → es2017/core/entry}/synchronize_sinks_on_observation.d.ts +2 -2
  141. package/dist/es2017/core/entry/synchronize_sinks_on_observation.d.ts.map +1 -0
  142. package/dist/es2017/core/{main/worker → entry}/track_choice_setter.d.ts +4 -4
  143. package/dist/es2017/core/entry/track_choice_setter.d.ts.map +1 -0
  144. package/dist/es2017/core/{main/worker → entry}/track_choice_setter.js +4 -4
  145. package/dist/es2017/core/entry/utils.d.ts +3 -0
  146. package/dist/es2017/core/entry/utils.d.ts.map +1 -0
  147. package/dist/es2017/core/entry/utils.js +8 -0
  148. package/dist/es2017/core/stream/orchestrator/stream_orchestrator.d.ts.map +1 -1
  149. package/dist/es2017/core/stream/orchestrator/stream_orchestrator.js +18 -1
  150. package/dist/es2017/core/types.d.ts +519 -1
  151. package/dist/es2017/core/types.d.ts.map +1 -1
  152. package/dist/es2017/core/types.js +1 -0
  153. package/dist/es2017/experimental/features/local.d.ts.map +1 -1
  154. package/dist/es2017/experimental/features/local.js +7 -1
  155. package/dist/es2017/experimental/features/metaplaylist.d.ts.map +1 -1
  156. package/dist/es2017/experimental/features/metaplaylist.js +7 -1
  157. package/dist/es2017/experimental/features/multi_thread.d.ts.map +1 -1
  158. package/dist/es2017/experimental/features/multi_thread.js +6 -2
  159. package/dist/es2017/features/features_object.js +1 -1
  160. package/dist/es2017/features/list/dash.d.ts.map +1 -1
  161. package/dist/es2017/features/list/dash.js +7 -1
  162. package/dist/es2017/features/list/dash_wasm.d.ts.map +1 -1
  163. package/dist/es2017/features/list/dash_wasm.js +7 -1
  164. package/dist/es2017/features/list/media_source_main.d.ts.map +1 -1
  165. package/dist/es2017/features/list/media_source_main.js +7 -1
  166. package/dist/es2017/features/list/smooth.d.ts.map +1 -1
  167. package/dist/es2017/features/list/smooth.js +7 -1
  168. package/dist/es2017/features/types.d.ts +20 -4
  169. package/dist/es2017/features/types.d.ts.map +1 -1
  170. package/dist/es2017/main_thread/api/public_api.d.ts.map +1 -1
  171. package/dist/es2017/main_thread/api/public_api.js +40 -43
  172. package/dist/es2017/main_thread/core_interface/base.d.ts +13 -0
  173. package/dist/es2017/main_thread/core_interface/base.d.ts.map +1 -0
  174. package/dist/es2017/main_thread/core_interface/base.js +28 -0
  175. package/dist/es2017/main_thread/core_interface/monothread.d.ts +13 -0
  176. package/dist/es2017/main_thread/core_interface/monothread.d.ts.map +1 -0
  177. package/dist/es2017/main_thread/core_interface/monothread.js +32 -0
  178. package/dist/es2017/main_thread/core_interface/multithread.d.ts +25 -0
  179. package/dist/es2017/main_thread/core_interface/multithread.d.ts.map +1 -0
  180. package/dist/es2017/main_thread/core_interface/multithread.js +45 -0
  181. package/dist/es2017/main_thread/core_interface/types.d.ts +6 -0
  182. package/dist/es2017/main_thread/core_interface/types.d.ts.map +1 -0
  183. package/dist/es2017/main_thread/core_interface/types.js +1 -0
  184. package/dist/es2017/main_thread/init/media_source_content_initializer.d.ts +166 -108
  185. package/dist/es2017/main_thread/init/media_source_content_initializer.d.ts.map +1 -1
  186. package/dist/es2017/main_thread/init/media_source_content_initializer.js +1405 -760
  187. package/dist/es2017/main_thread/init/utils/create_core_playback_observer.d.ts.map +1 -1
  188. package/dist/es2017/main_thread/init/utils/create_core_playback_observer.js +2 -1
  189. package/dist/es2017/main_thread/init/utils/update_manifest_codec_support.d.ts +1 -1
  190. package/dist/es2017/main_thread/init/utils/update_manifest_codec_support.d.ts.map +1 -1
  191. package/dist/es2017/main_thread/types.d.ts +537 -0
  192. package/dist/es2017/main_thread/types.d.ts.map +1 -1
  193. package/dist/es2017/manifest/utils.d.ts.map +1 -1
  194. package/dist/es2017/manifest/utils.js +16 -4
  195. package/dist/es2017/mse/worker_media_source_interface.d.ts +2 -2
  196. package/dist/es2017/mse/worker_media_source_interface.d.ts.map +1 -1
  197. package/dist/es2017/mse/worker_media_source_interface.js +12 -12
  198. package/dist/es2017/parsers/manifest/smooth/create_parser.d.ts +1 -1
  199. package/dist/es2017/parsers/manifest/smooth/create_parser.d.ts.map +1 -1
  200. package/dist/es2017/parsers/manifest/smooth/create_parser.js +31 -27
  201. package/dist/es2017/parsers/manifest/smooth/parse_C_nodes.d.ts +3 -2
  202. package/dist/es2017/parsers/manifest/smooth/parse_C_nodes.d.ts.map +1 -1
  203. package/dist/es2017/parsers/manifest/smooth/parse_C_nodes.js +16 -7
  204. package/dist/es2017/parsers/manifest/smooth/parse_protection_node.d.ts +3 -2
  205. package/dist/es2017/parsers/manifest/smooth/parse_protection_node.d.ts.map +1 -1
  206. package/dist/es2017/parsers/manifest/smooth/parse_protection_node.js +15 -6
  207. package/dist/es2017/parsers/manifest/smooth/utils/parseBoolean.d.ts +1 -1
  208. package/dist/es2017/parsers/manifest/smooth/utils/parseBoolean.d.ts.map +1 -1
  209. package/dist/es2017/parsers/manifest/smooth/utils/reduceChildren.d.ts +3 -2
  210. package/dist/es2017/parsers/manifest/smooth/utils/reduceChildren.d.ts.map +1 -1
  211. package/dist/es2017/parsers/manifest/smooth/utils/reduceChildren.js +6 -5
  212. package/dist/{commonjs/playback_observer/worker_playback_observer.d.ts → es2017/playback_observer/core_playback_observer.d.ts} +8 -8
  213. package/dist/es2017/playback_observer/core_playback_observer.d.ts.map +1 -0
  214. package/dist/es2017/playback_observer/{worker_playback_observer.js → core_playback_observer.js} +2 -2
  215. package/dist/es2017/transports/smooth/pipelines.d.ts.map +1 -1
  216. package/dist/es2017/transports/smooth/pipelines.js +25 -3
  217. package/dist/es2017/worker_entry_point.js +62 -2
  218. package/dist/rx-player.js +21882 -19021
  219. package/dist/rx-player.min.js +20 -20
  220. package/dist/worker.js +8 -8
  221. package/package.json +1 -1
  222. package/src/README.md +88 -198
  223. package/src/__GENERATED_CODE/embedded_worker.ts +1 -1
  224. package/src/core/{main/common → entry}/FreezeResolver.ts +7 -7
  225. package/src/core/{main → entry}/README.md +1 -1
  226. package/src/core/{main/worker → entry}/content_preparer.ts +77 -76
  227. package/src/core/{main/common → entry}/content_time_boundaries_observer.ts +10 -10
  228. package/src/core/{main/worker/worker_main.ts → entry/core_entry.ts} +223 -149
  229. package/src/core/{main/worker/worker_text_displayer_interface.ts → entry/core_text_displayer_interface.ts} +26 -26
  230. package/src/core/{main/common → entry}/create_content_time_boundaries_observer.ts +7 -7
  231. package/src/core/{main/common → entry}/get_buffered_data_per_media_buffer.ts +6 -6
  232. package/src/core/{main/common → entry}/get_thumbnail_data.ts +5 -5
  233. package/src/core/entry/index.ts +4 -0
  234. package/src/core/{main/common → entry}/synchronize_sinks_on_observation.ts +2 -2
  235. package/src/core/{main/worker → entry}/track_choice_setter.ts +7 -7
  236. package/src/core/entry/utils.ts +11 -0
  237. package/src/core/stream/orchestrator/stream_orchestrator.ts +26 -1
  238. package/src/core/types.ts +631 -3
  239. package/src/experimental/features/__tests__/local.test.ts +11 -2
  240. package/src/experimental/features/__tests__/metaplaylist.test.ts +11 -2
  241. package/src/experimental/features/__tests__/multi_thread.test.ts +8 -3
  242. package/src/experimental/features/local.ts +7 -1
  243. package/src/experimental/features/metaplaylist.ts +7 -1
  244. package/src/experimental/features/multi_thread.ts +6 -2
  245. package/src/features/features_object.ts +1 -1
  246. package/src/features/list/__tests__/dash.test.ts +12 -3
  247. package/src/features/list/__tests__/smooth.test.ts +11 -2
  248. package/src/features/list/dash.ts +7 -1
  249. package/src/features/list/dash_wasm.ts +7 -1
  250. package/src/features/list/media_source_main.ts +7 -1
  251. package/src/features/list/smooth.ts +7 -1
  252. package/src/features/types.ts +23 -4
  253. package/src/main_thread/README.md +8 -0
  254. package/src/main_thread/api/public_api.ts +46 -48
  255. package/src/main_thread/core_interface/README.md +22 -0
  256. package/src/main_thread/core_interface/base.ts +36 -0
  257. package/src/main_thread/core_interface/monothread.ts +46 -0
  258. package/src/main_thread/core_interface/multithread.ts +49 -0
  259. package/src/main_thread/core_interface/types.ts +5 -0
  260. package/src/main_thread/init/media_source_content_initializer.ts +2034 -1152
  261. package/src/main_thread/init/utils/create_core_playback_observer.ts +2 -1
  262. package/src/main_thread/init/utils/update_manifest_codec_support.ts +1 -1
  263. package/src/main_thread/types.ts +610 -0
  264. package/src/manifest/utils.ts +20 -4
  265. package/src/mse/worker_media_source_interface.ts +35 -35
  266. package/src/parsers/manifest/smooth/create_parser.ts +40 -34
  267. package/src/parsers/manifest/smooth/parse_C_nodes.ts +19 -8
  268. package/src/parsers/manifest/smooth/parse_protection_node.ts +17 -9
  269. package/src/parsers/manifest/smooth/utils/parseBoolean.ts +1 -1
  270. package/src/parsers/manifest/smooth/utils/reduceChildren.ts +10 -7
  271. package/src/playback_observer/{worker_playback_observer.ts → core_playback_observer.ts} +13 -13
  272. package/src/transports/smooth/pipelines.ts +25 -5
  273. package/src/worker_entry_point.ts +71 -2
  274. package/dist/commonjs/core/main/common/FreezeResolver.d.ts.map +0 -1
  275. package/dist/commonjs/core/main/common/content_time_boundaries_observer.d.ts.map +0 -1
  276. package/dist/commonjs/core/main/common/create_content_time_boundaries_observer.d.ts.map +0 -1
  277. package/dist/commonjs/core/main/common/get_buffered_data_per_media_buffer.d.ts.map +0 -1
  278. package/dist/commonjs/core/main/common/get_thumbnail_data.d.ts.map +0 -1
  279. package/dist/commonjs/core/main/common/synchronize_sinks_on_observation.d.ts.map +0 -1
  280. package/dist/commonjs/core/main/worker/content_preparer.d.ts.map +0 -1
  281. package/dist/commonjs/core/main/worker/globals.d.ts +0 -14
  282. package/dist/commonjs/core/main/worker/globals.d.ts.map +0 -1
  283. package/dist/commonjs/core/main/worker/globals.js +0 -26
  284. package/dist/commonjs/core/main/worker/index.d.ts +0 -3
  285. package/dist/commonjs/core/main/worker/index.d.ts.map +0 -1
  286. package/dist/commonjs/core/main/worker/index.js +0 -4
  287. package/dist/commonjs/core/main/worker/send_message.d.ts +0 -4
  288. package/dist/commonjs/core/main/worker/send_message.d.ts.map +0 -1
  289. package/dist/commonjs/core/main/worker/send_message.js +0 -23
  290. package/dist/commonjs/core/main/worker/track_choice_setter.d.ts.map +0 -1
  291. package/dist/commonjs/core/main/worker/worker_main.d.ts +0 -2
  292. package/dist/commonjs/core/main/worker/worker_main.d.ts.map +0 -1
  293. package/dist/commonjs/core/main/worker/worker_text_displayer_interface.d.ts.map +0 -1
  294. package/dist/commonjs/main_thread/init/multi_thread_content_initializer.d.ts +0 -308
  295. package/dist/commonjs/main_thread/init/multi_thread_content_initializer.d.ts.map +0 -1
  296. package/dist/commonjs/main_thread/init/multi_thread_content_initializer.js +0 -1713
  297. package/dist/commonjs/main_thread/init/send_message.d.ts +0 -3
  298. package/dist/commonjs/main_thread/init/send_message.d.ts.map +0 -1
  299. package/dist/commonjs/main_thread/init/send_message.js +0 -13
  300. package/dist/commonjs/multithread_types.d.ts +0 -915
  301. package/dist/commonjs/multithread_types.d.ts.map +0 -1
  302. package/dist/commonjs/multithread_types.js +0 -7
  303. package/dist/commonjs/playback_observer/worker_playback_observer.d.ts.map +0 -1
  304. package/dist/es2017/core/main/common/FreezeResolver.d.ts.map +0 -1
  305. package/dist/es2017/core/main/common/content_time_boundaries_observer.d.ts.map +0 -1
  306. package/dist/es2017/core/main/common/create_content_time_boundaries_observer.d.ts.map +0 -1
  307. package/dist/es2017/core/main/common/get_buffered_data_per_media_buffer.d.ts.map +0 -1
  308. package/dist/es2017/core/main/common/get_thumbnail_data.d.ts.map +0 -1
  309. package/dist/es2017/core/main/common/synchronize_sinks_on_observation.d.ts.map +0 -1
  310. package/dist/es2017/core/main/worker/content_preparer.d.ts.map +0 -1
  311. package/dist/es2017/core/main/worker/globals.d.ts +0 -14
  312. package/dist/es2017/core/main/worker/globals.d.ts.map +0 -1
  313. package/dist/es2017/core/main/worker/globals.js +0 -18
  314. package/dist/es2017/core/main/worker/index.d.ts +0 -3
  315. package/dist/es2017/core/main/worker/index.d.ts.map +0 -1
  316. package/dist/es2017/core/main/worker/index.js +0 -2
  317. package/dist/es2017/core/main/worker/send_message.d.ts +0 -4
  318. package/dist/es2017/core/main/worker/send_message.d.ts.map +0 -1
  319. package/dist/es2017/core/main/worker/send_message.js +0 -19
  320. package/dist/es2017/core/main/worker/track_choice_setter.d.ts.map +0 -1
  321. package/dist/es2017/core/main/worker/worker_main.d.ts +0 -2
  322. package/dist/es2017/core/main/worker/worker_main.d.ts.map +0 -1
  323. package/dist/es2017/core/main/worker/worker_text_displayer_interface.d.ts.map +0 -1
  324. package/dist/es2017/main_thread/init/multi_thread_content_initializer.d.ts +0 -308
  325. package/dist/es2017/main_thread/init/multi_thread_content_initializer.d.ts.map +0 -1
  326. package/dist/es2017/main_thread/init/multi_thread_content_initializer.js +0 -1559
  327. package/dist/es2017/main_thread/init/send_message.d.ts +0 -3
  328. package/dist/es2017/main_thread/init/send_message.d.ts.map +0 -1
  329. package/dist/es2017/main_thread/init/send_message.js +0 -10
  330. package/dist/es2017/multithread_types.d.ts +0 -915
  331. package/dist/es2017/multithread_types.d.ts.map +0 -1
  332. package/dist/es2017/multithread_types.js +0 -6
  333. package/dist/es2017/playback_observer/worker_playback_observer.d.ts.map +0 -1
  334. package/src/core/main/worker/globals.ts +0 -38
  335. package/src/core/main/worker/index.ts +0 -2
  336. package/src/core/main/worker/send_message.ts +0 -28
  337. package/src/main_thread/init/multi_thread_content_initializer.ts +0 -2330
  338. package/src/main_thread/init/send_message.ts +0 -15
  339. package/src/multithread_types.ts +0 -1095
  340. /package/dist/commonjs/core/{main/common → entry}/synchronize_sinks_on_observation.js +0 -0
  341. /package/dist/es2017/core/{main/common → entry}/synchronize_sinks_on_observation.js +0 -0
@@ -1,19 +1,4 @@
1
1
  "use strict";
2
- /**
3
- * Copyright 2015 CANAL+ Group
4
- *
5
- * Licensed under the Apache License, Version 2.0 (the "License");
6
- * you may not use this file except in compliance with the License.
7
- * You may obtain a copy of the License at
8
- *
9
- * http://www.apache.org/licenses/LICENSE-2.0
10
- *
11
- * Unless required by applicable law or agreed to in writing, software
12
- * distributed under the License is distributed on an "AS IS" BASIS,
13
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
- * See the License for the specific language governing permissions and
15
- * limitations under the License.
16
- */
17
2
  var __extends = (this && this.__extends) || (function () {
18
3
  var extendStatics = function (d, b) {
19
4
  extendStatics = Object.setPrototypeOf ||
@@ -76,6 +61,31 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
76
61
  if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
77
62
  }
78
63
  };
64
+ var __read = (this && this.__read) || function (o, n) {
65
+ var m = typeof Symbol === "function" && o[Symbol.iterator];
66
+ if (!m) return o;
67
+ var i = m.call(o), r, ar = [], e;
68
+ try {
69
+ while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
70
+ }
71
+ catch (error) { e = { error: error }; }
72
+ finally {
73
+ try {
74
+ if (r && !r.done && (m = i["return"])) m.call(i);
75
+ }
76
+ finally { if (e) throw e.error; }
77
+ }
78
+ return ar;
79
+ };
80
+ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
81
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
82
+ if (ar || !(i in from)) {
83
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
84
+ ar[i] = from[i];
85
+ }
86
+ }
87
+ return to.concat(ar || Array.prototype.slice.call(from));
88
+ };
79
89
  var __values = (this && this.__values) || function(o) {
80
90
  var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
81
91
  if (m) return m.call(o);
@@ -88,29 +98,21 @@ var __values = (this && this.__values) || function(o) {
88
98
  throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
89
99
  };
90
100
  Object.defineProperty(exports, "__esModule", { value: true });
91
- var is_codec_supported_1 = require("../../compat/is_codec_supported");
101
+ var eme_1 = require("../../compat/eme");
92
102
  var may_media_element_fail_on_undecipherable_data_1 = require("../../compat/may_media_element_fail_on_undecipherable_data");
93
103
  var should_reload_media_source_on_decipherability_update_1 = require("../../compat/should_reload_media_source_on_decipherability_update");
94
- var config_1 = require("../../config");
95
- var adaptive_1 = require("../../core/adaptive");
96
- var cmcd_1 = require("../../core/cmcd");
97
- var fetchers_1 = require("../../core/fetchers");
98
- var create_content_time_boundaries_observer_1 = require("../../core/main/common/create_content_time_boundaries_observer");
99
- var FreezeResolver_1 = require("../../core/main/common/FreezeResolver");
100
- var get_thumbnail_data_1 = require("../../core/main/common/get_thumbnail_data");
101
- var synchronize_sinks_on_observation_1 = require("../../core/main/common/synchronize_sinks_on_observation");
102
- var segment_sinks_1 = require("../../core/segment_sinks");
103
- var stream_1 = require("../../core/stream");
104
104
  var errors_1 = require("../../errors");
105
105
  var features_1 = require("../../features");
106
106
  var log_1 = require("../../log");
107
- var are_arrays_of_numbers_equal_1 = require("../../utils/are_arrays_of_numbers_equal");
107
+ var manifest_1 = require("../../manifest");
108
+ var main_media_source_interface_1 = require("../../mse/main_media_source_interface");
109
+ var array_find_1 = require("../../utils/array_find");
108
110
  var assert_1 = require("../../utils/assert");
109
- var create_cancellable_promise_1 = require("../../utils/create_cancellable_promise");
111
+ var id_generator_1 = require("../../utils/id_generator");
110
112
  var is_null_or_undefined_1 = require("../../utils/is_null_or_undefined");
111
- var noop_1 = require("../../utils/noop");
112
113
  var object_assign_1 = require("../../utils/object_assign");
113
- var sync_or_async_1 = require("../../utils/sync_or_async");
114
+ var reference_1 = require("../../utils/reference");
115
+ var request_1 = require("../../utils/request");
114
116
  var task_canceller_1 = require("../../utils/task_canceller");
115
117
  var decrypt_1 = require("../decrypt");
116
118
  var types_1 = require("./types");
@@ -119,20 +121,12 @@ var create_media_source_1 = require("./utils/create_media_source");
119
121
  var get_initial_time_1 = require("./utils/get_initial_time");
120
122
  var get_loaded_reference_1 = require("./utils/get_loaded_reference");
121
123
  var initial_seek_and_play_1 = require("./utils/initial_seek_and_play");
122
- var initialize_content_decryption_1 = require("./utils/initialize_content_decryption");
123
- var main_thread_text_displayer_interface_1 = require("./utils/main_thread_text_displayer_interface");
124
124
  var rebuffering_controller_1 = require("./utils/rebuffering_controller");
125
- var stream_events_emitter_1 = require("./utils/stream_events_emitter");
125
+ var stream_events_emitter_1 = require("./utils/stream_events_emitter/stream_events_emitter");
126
126
  var throw_on_media_error_1 = require("./utils/throw_on_media_error");
127
+ var update_manifest_codec_support_1 = require("./utils/update_manifest_codec_support");
128
+ var generateContentId = (0, id_generator_1.default)();
127
129
  /**
128
- * Allows to load a new content thanks to the MediaSource Extensions (a.k.a. MSE)
129
- * Web APIs.
130
- *
131
- * Through this `ContentInitializer`, a Manifest will be fetched (and depending
132
- * on the situation, refreshed), a `MediaSource` instance will be linked to the
133
- * wanted `HTMLMediaElement` and chunks of media data, called segments, will be
134
- * pushed on buffers associated to this `MediaSource` instance.
135
- *
136
130
  * @class MediaSourceContentInitializer
137
131
  */
138
132
  var MediaSourceContentInitializer = /** @class */ (function (_super) {
@@ -144,58 +138,148 @@ var MediaSourceContentInitializer = /** @class */ (function (_super) {
144
138
  */
145
139
  function MediaSourceContentInitializer(settings) {
146
140
  var _this = _super.call(this) || this;
147
- _this._initSettings = settings;
141
+ _this._settings = settings;
148
142
  _this._initCanceller = new task_canceller_1.default();
149
- _this._manifest = null;
150
- _this._decryptionCapabilities = { status: "uninitialized", value: null };
151
- var urls = settings.url === undefined ? undefined : [settings.url];
152
- _this._cmcdDataBuilder =
153
- settings.cmcd === undefined ? null : new cmcd_1.default(settings.cmcd);
154
- _this._manifestFetcher = new fetchers_1.ManifestFetcher(urls, settings.transport, __assign(__assign({}, settings.manifestRequestSettings), { lowLatencyMode: settings.lowLatencyMode, cmcdDataBuilder: _this._cmcdDataBuilder }));
143
+ _this._currentMediaSourceCanceller = new task_canceller_1.default();
144
+ _this._currentMediaSourceCanceller.linkToSignal(_this._initCanceller.signal);
145
+ _this._currentContentInfo = null;
146
+ _this._awaitingRequests = {
147
+ nextRequestId: 0,
148
+ pendingSinkMetrics: new Map(),
149
+ pendingThumbnailFetching: new Map(),
150
+ };
151
+ _this._queuedCoreMessages = null;
155
152
  return _this;
156
153
  }
157
154
  /**
158
155
  * Perform non-destructive preparation steps, to prepare a future content.
159
- * For now, this mainly mean loading the Manifest document.
160
156
  */
161
157
  MediaSourceContentInitializer.prototype.prepare = function () {
162
158
  var _this = this;
163
- if (this._manifest !== null) {
159
+ var _a, _b;
160
+ if (this._currentContentInfo !== null || this._initCanceller.isUsed()) {
164
161
  return;
165
162
  }
166
- this._manifest = sync_or_async_1.default.createAsync((0, create_cancellable_promise_1.default)(this._initCanceller.signal, function (res, rej) {
167
- _this._manifestFetcher.addEventListener("warning", function (err) {
168
- return _this.trigger("warning", err);
169
- });
170
- _this._manifestFetcher.addEventListener("error", function (err) {
171
- _this.trigger("error", err);
172
- rej(err);
173
- });
174
- _this._manifestFetcher.addEventListener("manifestReady", function (manifest) {
175
- res(manifest);
163
+ var contentId = generateContentId();
164
+ var _c = this._settings, adaptiveOptions = _c.adaptiveOptions, transport = _c.transport, transportOptions = _c.transportOptions, useMseInWorker = _c.useMseInWorker, coreInterface = _c.coreInterface;
165
+ var _d = this._settings.bufferOptions, wantedBufferAhead = _d.wantedBufferAhead, maxVideoBufferSize = _d.maxVideoBufferSize, maxBufferAhead = _d.maxBufferAhead, maxBufferBehind = _d.maxBufferBehind;
166
+ var initialVideoBitrate = adaptiveOptions.initialBitrates.video;
167
+ var initialAudioBitrate = adaptiveOptions.initialBitrates.audio;
168
+ this._currentContentInfo = {
169
+ contentId: contentId,
170
+ contentDecryptor: null,
171
+ manifest: null,
172
+ mediaSourceInfo: null,
173
+ rebufferingController: null,
174
+ streamEventsEmitter: null,
175
+ initialTime: undefined,
176
+ autoPlay: undefined,
177
+ initialPlayPerformed: null,
178
+ useMseInWorker: useMseInWorker,
179
+ };
180
+ coreInterface.sendMessage({
181
+ type: "prepare" /* MainThreadMessageType.PrepareContent */,
182
+ value: {
183
+ contentId: contentId,
184
+ cmcd: this._settings.cmcd,
185
+ enableRepresentationAvoidance: this._settings.enableRepresentationAvoidance,
186
+ url: this._settings.url,
187
+ hasText: this._hasTextBufferFeature(),
188
+ transport: transport,
189
+ transportOptions: transportOptions,
190
+ initialVideoBitrate: initialVideoBitrate,
191
+ initialAudioBitrate: initialAudioBitrate,
192
+ manifestRetryOptions: __assign(__assign({}, this._settings.manifestRequestSettings), { lowLatencyMode: this._settings.lowLatencyMode }),
193
+ segmentRetryOptions: this._settings.segmentRequestOptions,
194
+ useMseInWorker: useMseInWorker,
195
+ },
196
+ });
197
+ this._initCanceller.signal.register(function () {
198
+ coreInterface.sendMessage({
199
+ type: "stop" /* MainThreadMessageType.StopContent */,
200
+ contentId: contentId,
201
+ value: null,
176
202
  });
177
- }));
178
- this._manifestFetcher.start();
203
+ });
204
+ if (this._initCanceller.isUsed()) {
205
+ return;
206
+ }
207
+ this._queuedCoreMessages = [];
208
+ log_1.default.debug("Init", "addEventListener prepare buffering core messages");
209
+ var onmessage = function (msgData) {
210
+ if (msgData.type !== "log" /* CoreMessageType.LogMessage */) {
211
+ log_1.default.debug("Init", "Core message received", msgData.type);
212
+ }
213
+ var type = msgData.type;
214
+ switch (type) {
215
+ case "log" /* CoreMessageType.LogMessage */: {
216
+ var formatted = msgData.value.logs.map(function (l) {
217
+ switch (typeof l) {
218
+ case "string":
219
+ case "number":
220
+ case "boolean":
221
+ case "undefined":
222
+ return l;
223
+ case "object":
224
+ if (l === null) {
225
+ return null;
226
+ }
227
+ return formatSentLogObject(l);
228
+ default:
229
+ (0, assert_1.assertUnreachable)(l);
230
+ }
231
+ });
232
+ switch (msgData.value.logLevel) {
233
+ case "NONE":
234
+ break;
235
+ case "ERROR":
236
+ log_1.default.error.apply(log_1.default, __spreadArray([msgData.value.namespace], __read(formatted), false));
237
+ break;
238
+ case "WARNING":
239
+ log_1.default.warn.apply(log_1.default, __spreadArray([msgData.value.namespace], __read(formatted), false));
240
+ break;
241
+ case "INFO":
242
+ log_1.default.info.apply(log_1.default, __spreadArray([msgData.value.namespace], __read(formatted), false));
243
+ break;
244
+ case "DEBUG":
245
+ log_1.default.debug.apply(log_1.default, __spreadArray([msgData.value.namespace], __read(formatted), false));
246
+ break;
247
+ default:
248
+ (0, assert_1.assertUnreachable)(msgData.value.logLevel);
249
+ }
250
+ break;
251
+ }
252
+ default:
253
+ if (_this._queuedCoreMessages !== null) {
254
+ _this._queuedCoreMessages.push(msgData);
255
+ }
256
+ break;
257
+ }
258
+ };
259
+ this._settings.coreInterface.addMessageListener(onmessage);
260
+ var onmessageerror = function () {
261
+ log_1.default.error("Init", "Error when receiving message from core.");
262
+ };
263
+ this._settings.coreInterface.addErrorListener(onmessageerror);
179
264
  this._initCanceller.signal.register(function () {
180
- _this._manifestFetcher.dispose();
265
+ log_1.default.debug("Init", "removeEventListener prepare for core message");
266
+ _this._settings.coreInterface.removeMessageListener(onmessage);
267
+ _this._settings.coreInterface.removeErrorListener(onmessageerror);
181
268
  });
182
- };
183
- /**
184
- * @param {HTMLMediaElement} mediaElement
185
- * @param {Object} playbackObserver
186
- */
187
- MediaSourceContentInitializer.prototype.start = function (mediaElement, playbackObserver) {
188
- var _this = this;
189
- this.prepare(); // Load Manifest if not already done
190
- /** Translate errors coming from the media element into RxPlayer errors. */
191
- (0, throw_on_media_error_1.default)(mediaElement, function (error) { return _this._onFatalError(error); }, this._initCanceller.signal);
192
- this._setupInitialMediaSourceAndDecryption(mediaElement)
193
- .then(function (initResult) {
194
- return _this._onInitialMediaSourceReady(mediaElement, initResult.mediaSource, playbackObserver, initResult.drmSystemId, initResult.unlinkMediaSource);
195
- })
196
- .catch(function (err) {
197
- _this._onFatalError(err);
269
+ // Also bind all `SharedReference` objects:
270
+ var throttleVideoBitrate = (_a = adaptiveOptions.throttlers.throttleBitrate.video) !== null && _a !== void 0 ? _a : new reference_1.default(Infinity);
271
+ bindNumberReferencesToCore(coreInterface, this._initCanceller.signal, [wantedBufferAhead, "wantedBufferAhead"], [maxVideoBufferSize, "maxVideoBufferSize"], [maxBufferAhead, "maxBufferAhead"], [maxBufferBehind, "maxBufferBehind"], [throttleVideoBitrate, "throttleVideoBitrate"]);
272
+ var limitVideoResolution = (_b = adaptiveOptions.throttlers.limitResolution.video) !== null && _b !== void 0 ? _b : new reference_1.default({
273
+ height: undefined,
274
+ width: undefined,
275
+ pixelRatio: 1,
198
276
  });
277
+ limitVideoResolution.onUpdate(function (newVal) {
278
+ coreInterface.sendMessage({
279
+ type: "ref-update" /* MainThreadMessageType.ReferenceUpdate */,
280
+ value: { name: "limitVideoResolution", newVal: newVal },
281
+ });
282
+ }, { clearSignal: this._initCanceller.signal, emitCurrentValue: true });
199
283
  };
200
284
  /**
201
285
  * Update URL of the Manifest.
@@ -205,664 +289,1069 @@ var MediaSourceContentInitializer = /** @class */ (function (_super) {
205
289
  * DASH's MPD) will be refreshed immediately.
206
290
  */
207
291
  MediaSourceContentInitializer.prototype.updateContentUrls = function (urls, refreshNow) {
208
- this._manifestFetcher.updateContentUrls(urls, refreshNow);
209
- };
210
- /**
211
- * Stop content and free all resources linked to this
212
- * `MediaSourceContentInitializer`.
213
- */
214
- MediaSourceContentInitializer.prototype.dispose = function () {
215
- this._initCanceller.cancel();
216
- };
217
- /**
218
- * Callback called when an error interrupting playback arised.
219
- * @param {*} err
220
- */
221
- MediaSourceContentInitializer.prototype._onFatalError = function (err) {
222
- if (this._initCanceller.isUsed()) {
292
+ if (this._currentContentInfo === null) {
223
293
  return;
224
294
  }
225
- this._initCanceller.cancel();
226
- this.trigger("error", err);
227
- };
228
- /**
229
- * Initialize decryption mechanisms if needed and begin creating and relying
230
- * on the initial `MediaSourceInterface` for this content.
231
- * @param {HTMLMediaElement|null} mediaElement
232
- * @returns {Promise.<Object>}
233
- */
234
- MediaSourceContentInitializer.prototype._setupInitialMediaSourceAndDecryption = function (mediaElement) {
235
- var _this = this;
236
- var initCanceller = this._initCanceller;
237
- return (0, create_cancellable_promise_1.default)(initCanceller.signal, function (resolve) {
238
- var keySystems = _this._initSettings.keySystems;
239
- /** Initialize decryption capabilities. */
240
- var _a = (0, initialize_content_decryption_1.default)(mediaElement, keySystems, {
241
- onWarning: function (err) { return _this.trigger("warning", err); },
242
- onError: function (err) { return _this._onFatalError(err); },
243
- onBlackListProtectionData: function (val) {
244
- // Ugly IIFE workaround to allow async event listener
245
- (function () { return __awaiter(_this, void 0, void 0, function () {
246
- var manifest, _a;
247
- var _b;
248
- return __generator(this, function (_c) {
249
- switch (_c.label) {
250
- case 0:
251
- if (this._manifest === null) {
252
- return [2 /*return*/];
253
- }
254
- if (!((_b = this._manifest.syncValue) !== null && _b !== void 0)) return [3 /*break*/, 1];
255
- _a = _b;
256
- return [3 /*break*/, 3];
257
- case 1: return [4 /*yield*/, this._manifest.getValueAsAsync()];
258
- case 2:
259
- _a = (_c.sent());
260
- _c.label = 3;
261
- case 3:
262
- manifest = _a;
263
- blackListProtectionDataOnManifest(manifest, val);
264
- return [2 /*return*/];
265
- }
266
- });
267
- }); })().catch(noop_1.default);
268
- },
269
- onKeyIdsCompatibilityUpdate: function (updates) {
270
- // Ugly IIFE workaround to allow async event listener
271
- (function () { return __awaiter(_this, void 0, void 0, function () {
272
- var manifest, _a;
273
- var _b;
274
- return __generator(this, function (_c) {
275
- switch (_c.label) {
276
- case 0:
277
- if (this._manifest === null) {
278
- return [2 /*return*/];
279
- }
280
- if (!((_b = this._manifest.syncValue) !== null && _b !== void 0)) return [3 /*break*/, 1];
281
- _a = _b;
282
- return [3 /*break*/, 3];
283
- case 1: return [4 /*yield*/, this._manifest.getValueAsAsync()];
284
- case 2:
285
- _a = (_c.sent());
286
- _c.label = 3;
287
- case 3:
288
- manifest = _a;
289
- updateKeyIdsDecipherabilityOnManifest(manifest, updates.whitelistedKeyIds, updates.blacklistedKeyIds, updates.delistedKeyIds);
290
- return [2 /*return*/];
291
- }
292
- });
293
- }); })().catch(noop_1.default);
294
- },
295
- onCodecSupportUpdate: function () {
296
- var _a, _b;
297
- var syncManifest = (_a = _this._manifest) === null || _a === void 0 ? void 0 : _a.syncValue;
298
- if ((0, is_null_or_undefined_1.default)(syncManifest)) {
299
- // The Manifest is not yet fetched, but we will be able to check
300
- // the codecs once it is the case
301
- (_b = _this._manifest) === null || _b === void 0 ? void 0 : _b.getValueAsAsync().then(function (loadedManifest) {
302
- if (_this._initCanceller.isUsed()) {
303
- return;
304
- }
305
- _this._refreshManifestCodecSupport(loadedManifest, mediaElement);
306
- }, noop_1.default);
307
- }
308
- else {
309
- _this._refreshManifestCodecSupport(syncManifest, mediaElement);
310
- }
311
- },
312
- }, initCanceller.signal), drmInitRef = _a.statusRef, contentDecryptor = _a.contentDecryptor;
313
- if (contentDecryptor.enabled) {
314
- _this._decryptionCapabilities = {
315
- status: "enabled",
316
- value: contentDecryptor.value,
317
- };
318
- }
319
- else {
320
- _this._decryptionCapabilities = {
321
- status: "disabled",
322
- value: contentDecryptor.value,
323
- };
324
- }
325
- drmInitRef.onUpdate(function (drmStatus, stopListeningToDrmUpdates) {
326
- if (drmStatus.initializationState.type === "uninitialized") {
327
- return;
328
- }
329
- stopListeningToDrmUpdates();
330
- var mediaSourceCanceller = new task_canceller_1.default();
331
- mediaSourceCanceller.linkToSignal(initCanceller.signal);
332
- (0, create_media_source_1.default)(mediaElement, mediaSourceCanceller.signal)
333
- .then(function (mediaSource) {
334
- var lastDrmStatus = drmInitRef.getValue();
335
- if (lastDrmStatus.initializationState.type === "awaiting-media-link") {
336
- lastDrmStatus.initializationState.value.isMediaLinked.setValue(true);
337
- drmInitRef.onUpdate(function (newDrmStatus, stopListeningToDrmUpdatesAgain) {
338
- if (newDrmStatus.initializationState.type === "initialized") {
339
- stopListeningToDrmUpdatesAgain();
340
- resolve({
341
- mediaSource: mediaSource,
342
- drmSystemId: newDrmStatus.drmSystemId,
343
- unlinkMediaSource: mediaSourceCanceller,
344
- });
345
- return;
346
- }
347
- }, { emitCurrentValue: true, clearSignal: initCanceller.signal });
348
- }
349
- else if (drmStatus.initializationState.type === "initialized") {
350
- resolve({
351
- mediaSource: mediaSource,
352
- drmSystemId: drmStatus.drmSystemId,
353
- unlinkMediaSource: mediaSourceCanceller,
354
- });
355
- return;
356
- }
357
- })
358
- .catch(function (err) {
359
- if (mediaSourceCanceller.isUsed()) {
360
- return;
361
- }
362
- _this._onFatalError(err);
363
- });
364
- }, { emitCurrentValue: true, clearSignal: initCanceller.signal });
365
- });
366
- };
367
- MediaSourceContentInitializer.prototype._onInitialMediaSourceReady = function (mediaElement, initialMediaSource, playbackObserver, drmSystemId, initialMediaSourceCanceller) {
368
- return __awaiter(this, void 0, void 0, function () {
369
- var _a, adaptiveOptions, autoPlay, bufferOptions, lowLatencyMode, segmentRequestOptions, speed, startAt, textTrackOptions, transport, initCanceller, manifest, _b, _e_1, initialTime, representationEstimator, subBufferOptions, cdnPrioritizer, segmentQueueCreator;
370
- var _this = this;
371
- var _c;
372
- return __generator(this, function (_d) {
373
- switch (_d.label) {
374
- case 0:
375
- _a = this._initSettings, adaptiveOptions = _a.adaptiveOptions, autoPlay = _a.autoPlay, bufferOptions = _a.bufferOptions, lowLatencyMode = _a.lowLatencyMode, segmentRequestOptions = _a.segmentRequestOptions, speed = _a.speed, startAt = _a.startAt, textTrackOptions = _a.textTrackOptions, transport = _a.transport;
376
- initCanceller = this._initCanceller;
377
- (0, assert_1.default)(this._manifest !== null);
378
- _d.label = 1;
379
- case 1:
380
- _d.trys.push([1, 5, , 6]);
381
- if (!((_c = this._manifest.syncValue) !== null && _c !== void 0)) return [3 /*break*/, 2];
382
- _b = _c;
383
- return [3 /*break*/, 4];
384
- case 2: return [4 /*yield*/, this._manifest.getValueAsAsync()];
385
- case 3:
386
- _b = (_d.sent());
387
- _d.label = 4;
388
- case 4:
389
- manifest = _b;
390
- return [3 /*break*/, 6];
391
- case 5:
392
- _e_1 = _d.sent();
393
- return [2 /*return*/]; // The error should already have been processed through an event listener
394
- case 6:
395
- manifest.addEventListener("manifestUpdate", function (updates) {
396
- _this.trigger("manifestUpdate", updates);
397
- _this._refreshManifestCodecSupport(manifest, mediaElement);
398
- }, initCanceller.signal);
399
- manifest.addEventListener("decipherabilityUpdate", function (elts) {
400
- _this.trigger("decipherabilityUpdate", elts);
401
- }, initCanceller.signal);
402
- manifest.addEventListener("supportUpdate", function () {
403
- _this.trigger("codecSupportUpdate", null);
404
- }, initCanceller.signal);
405
- log_1.default.debug("Init", "Calculating initial time");
406
- initialTime = (0, get_initial_time_1.default)(manifest, lowLatencyMode, startAt);
407
- log_1.default.debug("Init", "Initial time calculated", { initialTime: initialTime });
408
- representationEstimator = (0, adaptive_1.default)(adaptiveOptions);
409
- subBufferOptions = (0, object_assign_1.default)({ textTrackOptions: textTrackOptions, drmSystemId: drmSystemId }, bufferOptions);
410
- cdnPrioritizer = new fetchers_1.CdnPrioritizer(initCanceller.signal);
411
- segmentQueueCreator = new fetchers_1.SegmentQueueCreator(transport, cdnPrioritizer, this._cmcdDataBuilder, segmentRequestOptions);
412
- this._refreshManifestCodecSupport(manifest, mediaElement);
413
- this.trigger("manifestReady", manifest);
414
- if (initCanceller.isUsed()) {
415
- return [2 /*return*/];
416
- }
417
- // handle initial load and reloads
418
- this._setupContentWithNewMediaSource({
419
- mediaElement: mediaElement,
420
- playbackObserver: playbackObserver,
421
- mediaSource: initialMediaSource,
422
- initialTime: initialTime,
423
- autoPlay: autoPlay,
424
- manifest: manifest,
425
- representationEstimator: representationEstimator,
426
- cdnPrioritizer: cdnPrioritizer,
427
- segmentQueueCreator: segmentQueueCreator,
428
- speed: speed,
429
- bufferOptions: subBufferOptions,
430
- }, initialMediaSourceCanceller);
431
- return [2 /*return*/];
432
- }
433
- });
295
+ this._settings.coreInterface.sendMessage({
296
+ type: "urls-update" /* MainThreadMessageType.ContentUrlsUpdate */,
297
+ contentId: this._currentContentInfo.contentId,
298
+ value: { urls: urls, refreshNow: refreshNow },
434
299
  });
435
300
  };
436
301
  /**
437
- * Load the content defined by the Manifest in the mediaSource given at the
438
- * given position and playing status.
439
- * This function recursively re-call itself when a MediaSource reload is
440
- * wanted.
441
- * @param {Object} args
442
- * @param {Object} currentCanceller
443
- */
444
- MediaSourceContentInitializer.prototype._setupContentWithNewMediaSource = function (args, currentCanceller) {
445
- this._startLoadingContentOnMediaSource(args, this._createReloadMediaSourceCallback(args, currentCanceller), currentCanceller.signal);
446
- };
447
- /**
448
- * Create `IReloadMediaSourceCallback` allowing to handle reload orders.
449
- * @param {Object} args
450
- * @param {Object} currentCanceller
451
- */
452
- MediaSourceContentInitializer.prototype._createReloadMediaSourceCallback = function (args, currentCanceller) {
453
- var _this = this;
454
- var initCanceller = this._initCanceller;
455
- return function (reloadOrder) {
456
- currentCanceller.cancel();
457
- if (initCanceller.isUsed()) {
458
- return;
459
- }
460
- _this.trigger("reloadingMediaSource", reloadOrder);
461
- if (initCanceller.isUsed()) {
462
- return;
463
- }
464
- var newCanceller = new task_canceller_1.default();
465
- newCanceller.linkToSignal(initCanceller.signal);
466
- (0, create_media_source_1.default)(args.mediaElement, newCanceller.signal)
467
- .then(function (newMediaSource) {
468
- _this._setupContentWithNewMediaSource(__assign(__assign({}, args), { mediaSource: newMediaSource, initialTime: reloadOrder.position, autoPlay: reloadOrder.autoPlay }), newCanceller);
469
- })
470
- .catch(function (err) {
471
- if (newCanceller.isUsed()) {
472
- return;
473
- }
474
- _this._onFatalError(err);
475
- });
476
- };
477
- };
478
- /**
479
- * Buffer the content on the given MediaSource.
480
- * @param {Object} args
481
- * @param {function} onReloadOrder
482
- * @param {Object} cancelSignal
302
+ * @param {HTMLMediaElement} mediaElement
303
+ * @param {Object} playbackObserver
483
304
  */
484
- MediaSourceContentInitializer.prototype._startLoadingContentOnMediaSource = function (args, onReloadOrder, cancelSignal) {
305
+ MediaSourceContentInitializer.prototype.start = function (mediaElement, playbackObserver) {
306
+ var e_1, _a;
485
307
  var _this = this;
486
- var _a, _b;
487
- var autoPlay = args.autoPlay, bufferOptions = args.bufferOptions, initialTime = args.initialTime, manifest = args.manifest, mediaElement = args.mediaElement, mediaSource = args.mediaSource, playbackObserver = args.playbackObserver, representationEstimator = args.representationEstimator, cdnPrioritizer = args.cdnPrioritizer, segmentQueueCreator = args.segmentQueueCreator, speed = args.speed;
488
- var transport = this._initSettings.transport;
489
- var initialPeriod = (_a = manifest.getPeriodForTime(initialTime)) !== null && _a !== void 0 ? _a : manifest.getNextPeriod(initialTime);
490
- if (initialPeriod === undefined) {
491
- var error = new errors_1.MediaError("MEDIA_STARTING_TIME_NOT_FOUND", "Wanted starting time not found in the Manifest.");
492
- return this._onFatalError(error);
308
+ this.prepare(); // Load Manifest if not already done
309
+ if (this._initCanceller.isUsed()) {
310
+ return;
493
311
  }
494
- var textDisplayerInterface = null;
495
- var textDisplayer = createTextDisplayer(mediaElement, this._initSettings.textTrackOptions);
496
- if (textDisplayer !== null) {
497
- var sender_1 = new main_thread_text_displayer_interface_1.default(textDisplayer);
498
- textDisplayerInterface = sender_1;
499
- cancelSignal.register(function () {
500
- sender_1.stop();
501
- textDisplayer === null || textDisplayer === void 0 ? void 0 : textDisplayer.stop();
502
- });
312
+ var textDisplayer = null;
313
+ if (this._settings.textTrackOptions.textTrackMode === "html" &&
314
+ features_1.default.htmlTextDisplayer !== null) {
315
+ (0, assert_1.default)(this._hasTextBufferFeature());
316
+ textDisplayer = new features_1.default.htmlTextDisplayer(mediaElement, this._settings.textTrackOptions.textTrackElement);
503
317
  }
504
- /** Interface to create media buffers. */
505
- var segmentSinksStore = new segment_sinks_1.default(mediaSource, mediaElement.nodeName === "VIDEO", textDisplayerInterface);
506
- cancelSignal.register(function () {
507
- segmentSinksStore.disposeAll();
318
+ else if (features_1.default.nativeTextDisplayer !== null) {
319
+ (0, assert_1.default)(this._hasTextBufferFeature());
320
+ textDisplayer = new features_1.default.nativeTextDisplayer(mediaElement);
321
+ }
322
+ else {
323
+ (0, assert_1.default)(!this._hasTextBufferFeature());
324
+ }
325
+ this._initCanceller.signal.register(function () {
326
+ textDisplayer === null || textDisplayer === void 0 ? void 0 : textDisplayer.stop();
508
327
  });
509
- var _c = (0, initial_seek_and_play_1.default)({
328
+ /** Translate errors coming from the media element into RxPlayer errors. */
329
+ (0, throw_on_media_error_1.default)(mediaElement, function (error) { return _this._onFatalError(error); }, this._initCanceller.signal);
330
+ /**
331
+ * Send content protection initialization data.
332
+ * TODO remove and use ContentDecryptor directly when possible.
333
+ */
334
+ var lastContentProtection = new reference_1.default(null);
335
+ var mediaSourceStatus = new reference_1.default(0 /* MediaSourceInitializationStatus.Nothing */);
336
+ var _b = this._initializeContentDecryption(mediaElement, lastContentProtection, mediaSourceStatus, function () { return notifyAndStartMediaSourceReload(0, undefined, undefined); }, this._initCanceller.signal), drmInitializationStatus = _b.statusRef, contentDecryptor = _b.contentDecryptor;
337
+ var contentInfo = this._currentContentInfo;
338
+ if (contentInfo !== null) {
339
+ contentInfo.contentDecryptor = contentDecryptor;
340
+ }
341
+ var playbackStartParams = {
510
342
  mediaElement: mediaElement,
343
+ textDisplayer: textDisplayer,
511
344
  playbackObserver: playbackObserver,
512
- startTime: initialTime,
513
- mustAutoPlay: autoPlay,
514
- onWarning: function (err) {
515
- _this.trigger("warning", err);
516
- },
517
- isDirectfile: false,
518
- }, cancelSignal), autoPlayResult = _c.autoPlayResult, initialPlayPerformed = _c.initialPlayPerformed;
519
- if (cancelSignal.isCancelled()) {
520
- return;
521
- }
522
- initialPlayPerformed.onUpdate(function (isPerformed, stopListening) {
523
- if (isPerformed) {
524
- stopListening();
525
- var streamEventsEmitter_1 = new stream_events_emitter_1.default(manifest, playbackObserver);
526
- manifest.addEventListener("manifestUpdate", function () {
527
- streamEventsEmitter_1.onManifestUpdate(manifest);
528
- }, cancelSignal);
529
- streamEventsEmitter_1.addEventListener("event", function (payload) {
530
- _this.trigger("streamEvent", payload);
531
- }, cancelSignal);
532
- streamEventsEmitter_1.addEventListener("eventSkip", function (payload) {
533
- _this.trigger("streamEventSkip", payload);
534
- }, cancelSignal);
535
- streamEventsEmitter_1.start();
536
- cancelSignal.register(function () {
537
- streamEventsEmitter_1.stop();
538
- });
345
+ drmInitializationStatus: drmInitializationStatus,
346
+ mediaSourceStatus: mediaSourceStatus,
347
+ };
348
+ mediaSourceStatus.onUpdate(function (msInitStatus, stopListeningMSStatus) {
349
+ if (msInitStatus === 2 /* MediaSourceInitializationStatus.Attached */) {
350
+ stopListeningMSStatus();
351
+ _this._startPlaybackIfReady(playbackStartParams);
539
352
  }
540
- }, { clearSignal: cancelSignal, emitCurrentValue: true });
541
- var coreObserver = (0, create_core_playback_observer_1.default)(playbackObserver, {
542
- autoPlay: autoPlay,
543
- manifest: manifest,
544
- mediaSource: mediaSource,
545
- textDisplayer: textDisplayer,
546
- initialPlayPerformed: initialPlayPerformed,
547
- speed: speed,
548
- }, cancelSignal);
549
- (_b = this._cmcdDataBuilder) === null || _b === void 0 ? void 0 : _b.startMonitoringPlayback(coreObserver);
550
- cancelSignal.register(function () {
551
- var _a;
552
- (_a = _this._cmcdDataBuilder) === null || _a === void 0 ? void 0 : _a.stopMonitoringPlayback();
553
- });
554
- var rebufferingController = this._createRebufferingController(playbackObserver, manifest, speed, cancelSignal);
555
- var freezeResolver = new FreezeResolver_1.default(segmentSinksStore);
556
- if ((0, may_media_element_fail_on_undecipherable_data_1.default)()) {
557
- // On some devices, just reload immediately when data become undecipherable
558
- manifest.addEventListener("decipherabilityUpdate", function (elts) {
559
- if (elts.some(function (e) { return e.representation.decipherable !== true; })) {
560
- reloadMediaSource(0, undefined, undefined);
561
- }
562
- }, cancelSignal);
563
- }
564
- coreObserver.listen(function (observation) {
565
- (0, synchronize_sinks_on_observation_1.default)(observation, segmentSinksStore);
566
- var freezeResolution = freezeResolver.onNewObservation(observation);
567
- if (freezeResolution === null) {
568
- return;
353
+ }, { clearSignal: this._initCanceller.signal, emitCurrentValue: true });
354
+ drmInitializationStatus.onUpdate(function (initializationStatus, stopListeningDrm) {
355
+ if (initializationStatus.initializationState.type === "initialized") {
356
+ stopListeningDrm();
357
+ _this._startPlaybackIfReady(playbackStartParams);
569
358
  }
570
- // TODO: The following method looks generic, we may be able to factorize
571
- // it with other reload handlers after some work.
572
- var triggerReload = function () {
573
- var _a;
574
- var lastObservation = playbackObserver.getReference().getValue();
575
- var position = lastObservation.position.isAwaitingFuturePosition()
576
- ? lastObservation.position.getWanted()
577
- : ((_a = coreObserver.getCurrentTime()) !== null && _a !== void 0 ? _a : lastObservation.position.getPolled());
578
- var autoplay = initialPlayPerformed.getValue()
579
- ? !playbackObserver.getIsPaused()
580
- : autoPlay;
581
- onReloadOrder({ position: position, autoPlay: autoplay });
582
- };
583
- handleFreezeResolution(freezeResolution, {
584
- enableRepresentationAvoidance: _this._initSettings.enableRepresentationAvoidance,
585
- manifest: manifest,
586
- triggerReload: triggerReload,
587
- playbackObserver: playbackObserver,
588
- });
589
- }, { clearSignal: cancelSignal });
590
- var contentTimeBoundariesObserver = (0, create_content_time_boundaries_observer_1.default)(manifest, mediaSource, coreObserver, segmentSinksStore, {
591
- onWarning: function (err) { return _this.trigger("warning", err); },
592
- onPeriodChanged: function (period) {
593
- return _this.trigger("activePeriodChanged", { period: period });
594
- },
595
- }, cancelSignal);
359
+ }, { emitCurrentValue: true, clearSignal: this._initCanceller.signal });
596
360
  /**
597
- * Emit a "loaded" events once the initial play has been performed and the
598
- * media can begin playback.
599
- * Also emits warning events if issues arise when doing so.
361
+ * Reset directly (synchronously) the current `MediaSource` and signal to
362
+ * the core that we did so.
363
+ * @param {number} deltaPosition - Position you want to seek to after
364
+ * reloading, as a delta in seconds from the last polled playing position.
365
+ * @param {number|undefined} minimumPosition - If set, minimum time bound
366
+ * in seconds after `deltaPosition` has been applied.
367
+ * @param {number|undefined} maximumPosition - If set, minimum time bound
368
+ * in seconds after `deltaPosition` has been applied.
600
369
  */
601
- autoPlayResult
602
- .then(function () {
603
- (0, get_loaded_reference_1.default)(playbackObserver, false, cancelSignal).onUpdate(function (isLoaded, stopListening) {
604
- if (isLoaded) {
605
- var fetchThumbnails_1 = (0, fetchers_1.createThumbnailFetcher)(transport.thumbnails, cdnPrioritizer);
606
- stopListening();
607
- _this.trigger("loaded", {
608
- getSegmentSinkMetrics: function () { return __awaiter(_this, void 0, void 0, function () {
609
- return __generator(this, function (_a) {
610
- return [2 /*return*/, new Promise(function (resolve) {
611
- return resolve(segmentSinksStore.getSegmentSinksMetrics());
612
- })];
613
- });
614
- }); },
615
- getThumbnailData: function (periodId, thumbnailTrackId, time) { return __awaiter(_this, void 0, void 0, function () {
616
- return __generator(this, function (_a) {
617
- return [2 /*return*/, (0, get_thumbnail_data_1.default)(fetchThumbnails_1, manifest, periodId, thumbnailTrackId, time)];
618
- });
619
- }); },
620
- });
621
- }
622
- }, { emitCurrentValue: true, clearSignal: cancelSignal });
623
- })
624
- .catch(function (err) {
625
- if (cancelSignal.isCancelled()) {
626
- return; // Current loading cancelled, no need to trigger the error
370
+ var notifyAndStartMediaSourceReload = function (deltaPosition, minimumPosition, maximumPosition) {
371
+ var reloadingContentInfo = _this._currentContentInfo;
372
+ if (reloadingContentInfo === null) {
373
+ log_1.default.warn("Init", "Asked to reload when no content is loaded.");
374
+ return;
627
375
  }
628
- _this._onFatalError(err);
629
- });
630
- // eslint-disable-next-line @typescript-eslint/no-this-alias
631
- var self = this;
632
- (0, stream_1.default)({ manifest: manifest, initialPeriod: initialPeriod }, coreObserver, representationEstimator, segmentSinksStore, segmentQueueCreator, bufferOptions, handleStreamOrchestratorCallbacks(), cancelSignal);
376
+ if (reloadingContentInfo === null ||
377
+ reloadingContentInfo.mediaSourceInfo === null) {
378
+ log_1.default.warn("Init", "Asked to reload when no MediaSource is active.");
379
+ return;
380
+ }
381
+ var mediaSourceId = reloadingContentInfo.mediaSourceInfo.type === "main"
382
+ ? reloadingContentInfo.mediaSourceInfo.mediaSource.id
383
+ : reloadingContentInfo.mediaSourceInfo.mediaSourceId;
384
+ _this._settings.coreInterface.sendMessage({
385
+ type: "ms-reload" /* MainThreadMessageType.MediaSourceReload */,
386
+ mediaSourceId: mediaSourceId,
387
+ value: null,
388
+ });
389
+ reloadMediaSource(deltaPosition, minimumPosition, maximumPosition);
390
+ };
633
391
  /**
634
- * Returns Object handling the callbacks from a `StreamOrchestrator`, which
635
- * are basically how it communicates about events.
636
- * @returns {Object}
392
+ * Reset directly (synchronously) the current `MediaSource`.
393
+ *
394
+ * It is assumed that `core` already knows about this action. If not, call
395
+ * `notifyAndStartMediaSourceReload` instead.
396
+ * @param {number} deltaPosition - Position you want to seek to after
397
+ * reloading, as a delta in seconds from the last polled playing position.
398
+ * @param {number|undefined} minimumPosition - If set, minimum time bound
399
+ * in seconds after `deltaPosition` has been applied.
400
+ * @param {number|undefined} maximumPosition - If set, minimum time bound
401
+ * in seconds after `deltaPosition` has been applied.
637
402
  */
638
- function handleStreamOrchestratorCallbacks() {
639
- return {
640
- needsBufferFlush: function (payload) {
641
- var _a;
642
- var wantedSeekingTime;
643
- var lastObservation = playbackObserver.getReference().getValue();
644
- var currentTime = lastObservation.position.isAwaitingFuturePosition()
645
- ? lastObservation.position.getWanted()
646
- : mediaElement.currentTime;
647
- var relativeResumingPosition = (_a = payload === null || payload === void 0 ? void 0 : payload.relativeResumingPosition) !== null && _a !== void 0 ? _a : 0;
648
- var canBeApproximateSeek = Boolean(payload === null || payload === void 0 ? void 0 : payload.relativePosHasBeenDefaulted);
649
- if (relativeResumingPosition === 0 && canBeApproximateSeek) {
650
- // in case relativeResumingPosition is 0, we still perform
651
- // a tiny seek to be sure that the browser will correclty reload the video.
652
- wantedSeekingTime = currentTime + 0.001;
403
+ var reloadMediaSource = function (deltaPosition, minimumPosition, maximumPosition) {
404
+ var _a;
405
+ var reloadingContentInfo = _this._currentContentInfo;
406
+ if (reloadingContentInfo === null) {
407
+ log_1.default.warn("Init", "Asked to reload when no content is loaded.");
408
+ return;
409
+ }
410
+ var lastObservation = playbackObserver.getReference().getValue();
411
+ var currentPosition = lastObservation.position.getWanted();
412
+ var isPaused = ((_a = reloadingContentInfo.initialPlayPerformed) === null || _a === void 0 ? void 0 : _a.getValue()) === true ||
413
+ reloadingContentInfo.autoPlay === undefined
414
+ ? lastObservation.paused
415
+ : !reloadingContentInfo.autoPlay;
416
+ var position = currentPosition + deltaPosition;
417
+ if (minimumPosition !== undefined) {
418
+ position = Math.max(minimumPosition, position);
419
+ }
420
+ if (maximumPosition !== undefined) {
421
+ position = Math.min(maximumPosition, position);
422
+ }
423
+ _this._reload(mediaElement, textDisplayer, playbackObserver, mediaSourceStatus, position, !isPaused);
424
+ };
425
+ var onmessage = function (msgData) {
426
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28;
427
+ switch (msgData.type) {
428
+ case "attach-media-source" /* CoreMessageType.AttachMediaSource */: {
429
+ if (((_a = _this._currentContentInfo) === null || _a === void 0 ? void 0 : _a.contentId) !== msgData.contentId) {
430
+ return;
653
431
  }
654
- else {
655
- wantedSeekingTime = currentTime + relativeResumingPosition;
432
+ if (_this._currentContentInfo !== null) {
433
+ if (((_b = _this._currentContentInfo.mediaSourceInfo) === null || _b === void 0 ? void 0 : _b.type) === "main") {
434
+ _this._currentContentInfo.mediaSourceInfo.mediaSource.dispose();
435
+ }
436
+ _this._currentContentInfo.mediaSourceInfo = {
437
+ type: "core",
438
+ mediaSourceId: msgData.mediaSourceId,
439
+ };
656
440
  }
657
- playbackObserver.setCurrentTime(wantedSeekingTime);
658
- // Seek again once data begins to be buffered.
659
- // This is sadly necessary on some browsers to avoid decoding
660
- // issues after a flush.
661
- //
662
- // NOTE: there's in theory a potential race condition in the following
663
- // logic as the callback could be called when media data is still
664
- // being removed by the browser - which is an asynchronous process.
665
- // The following condition checking for buffered data could thus lead
666
- // to a false positive where we're actually checking previous data.
667
- // For now, such scenario is avoided by setting the
668
- // `includeLastObservation` option to `false` and calling
669
- // `needsBufferFlush` once MSE media removal operations have been
670
- // explicitely validated by the browser, but that's a complex and easy
671
- // to break system.
672
- playbackObserver.listen(function (obs, stopListening) {
673
- if (
674
- // Data is buffered around the current position
675
- obs.currentRange !== null ||
676
- // Or, for whatever reason, we have no buffer but we're already advancing
677
- obs.position.getPolled() > wantedSeekingTime + 0.1) {
441
+ var mediaSourceLink_1 = msgData.value;
442
+ mediaSourceStatus.onUpdate(function (currStatus, stopListening) {
443
+ if (currStatus === 1 /* MediaSourceInitializationStatus.AttachNow */) {
678
444
  stopListening();
679
- playbackObserver.setCurrentTime(obs.position.getWanted() + 0.001);
445
+ log_1.default.info("media", "Attaching MediaSource URL to the media element");
446
+ if (mediaSourceLink_1.type === "handle") {
447
+ mediaElement.srcObject = mediaSourceLink_1.value;
448
+ _this._currentMediaSourceCanceller.signal.register(function () {
449
+ mediaElement.srcObject = null;
450
+ });
451
+ }
452
+ else {
453
+ mediaElement.src = mediaSourceLink_1.value;
454
+ _this._currentMediaSourceCanceller.signal.register(function () {
455
+ (0, create_media_source_1.resetMediaElement)(mediaElement, mediaSourceLink_1.value);
456
+ });
457
+ }
458
+ (0, create_media_source_1.disableRemotePlaybackOnManagedMediaSource)(mediaElement, _this._currentMediaSourceCanceller.signal);
459
+ mediaSourceStatus.setValue(2 /* MediaSourceInitializationStatus.Attached */);
680
460
  }
681
- }, { includeLastObservation: false, clearSignal: cancelSignal });
682
- },
683
- streamStatusUpdate: function (value) {
684
- // Announce discontinuities if found
685
- var period = value.period, bufferType = value.bufferType, imminentDiscontinuity = value.imminentDiscontinuity, position = value.position;
686
- rebufferingController.updateDiscontinuityInfo({
687
- period: period,
688
- bufferType: bufferType,
689
- discontinuity: imminentDiscontinuity,
690
- position: position,
691
- });
692
- if (cancelSignal.isCancelled()) {
693
- return; // Previous call has stopped streams due to a side-effect
694
- }
695
- // If the status for the last Period indicates that segments are all loaded
696
- // or on the contrary that the loading resumed, announce it to the
697
- // ContentTimeBoundariesObserver.
698
- if (manifest.isLastPeriodKnown &&
699
- value.period.id === manifest.periods[manifest.periods.length - 1].id) {
700
- var hasFinishedLoadingLastPeriod = value.hasFinishedLoading || value.isEmptyStream;
701
- if (hasFinishedLoadingLastPeriod) {
702
- contentTimeBoundariesObserver.onLastSegmentFinishedLoading(value.bufferType);
461
+ }, { emitCurrentValue: true, clearSignal: _this._initCanceller.signal });
462
+ break;
463
+ }
464
+ case "warning" /* CoreMessageType.Warning */:
465
+ if (((_c = _this._currentContentInfo) === null || _c === void 0 ? void 0 : _c.contentId) !== msgData.contentId) {
466
+ return;
467
+ }
468
+ _this.trigger("warning", formatCoreError(msgData.value));
469
+ break;
470
+ case "error" /* CoreMessageType.Error */:
471
+ if (((_d = _this._currentContentInfo) === null || _d === void 0 ? void 0 : _d.contentId) !== msgData.contentId) {
472
+ return;
473
+ }
474
+ _this._onFatalError(formatCoreError(msgData.value));
475
+ break;
476
+ case "create-media-source" /* CoreMessageType.CreateMediaSource */:
477
+ _this._onCreateMediaSourceMessage(msgData, mediaElement, mediaSourceStatus, _this._settings.coreInterface);
478
+ break;
479
+ case "add-source-buffer" /* CoreMessageType.AddSourceBuffer */:
480
+ {
481
+ if (((_f = (_e = _this._currentContentInfo) === null || _e === void 0 ? void 0 : _e.mediaSourceInfo) === null || _f === void 0 ? void 0 : _f.type) !== "main" ||
482
+ _this._currentContentInfo.mediaSourceInfo.mediaSource.id !==
483
+ msgData.mediaSourceId) {
484
+ return;
703
485
  }
704
- else {
705
- contentTimeBoundariesObserver.onLastSegmentLoadingResume(value.bufferType);
486
+ var mediaSource = _this._currentContentInfo.mediaSourceInfo.mediaSource;
487
+ mediaSource.addSourceBuffer(msgData.value.sourceBufferType, msgData.value.codec);
488
+ }
489
+ break;
490
+ case "source-buffer-append" /* CoreMessageType.SourceBufferAppend */:
491
+ {
492
+ if (((_h = (_g = _this._currentContentInfo) === null || _g === void 0 ? void 0 : _g.mediaSourceInfo) === null || _h === void 0 ? void 0 : _h.type) !== "main" ||
493
+ _this._currentContentInfo.mediaSourceInfo.mediaSource.id !==
494
+ msgData.mediaSourceId) {
495
+ return;
706
496
  }
497
+ var mediaSource_1 = _this._currentContentInfo.mediaSourceInfo.mediaSource;
498
+ var sourceBuffer_1 = (0, array_find_1.default)(mediaSource_1.sourceBuffers, function (s) { return s.type === msgData.sourceBufferType; });
499
+ if (sourceBuffer_1 === undefined) {
500
+ return;
501
+ }
502
+ sourceBuffer_1
503
+ .appendBuffer(msgData.value.data, msgData.value.params)
504
+ .then(function (buffered) {
505
+ _this._settings.coreInterface.sendMessage({
506
+ type: "sb-success" /* MainThreadMessageType.SourceBufferSuccess */,
507
+ mediaSourceId: mediaSource_1.id,
508
+ sourceBufferType: sourceBuffer_1.type,
509
+ operationId: msgData.operationId,
510
+ value: { buffered: buffered },
511
+ });
512
+ })
513
+ .catch(function (error) {
514
+ _this._settings.coreInterface.sendMessage({
515
+ type: "sb-error" /* MainThreadMessageType.SourceBufferError */,
516
+ mediaSourceId: mediaSource_1.id,
517
+ sourceBufferType: sourceBuffer_1.type,
518
+ operationId: msgData.operationId,
519
+ value: error instanceof task_canceller_1.CancellationError
520
+ ? { errorName: "CancellationError" }
521
+ : formatSourceBufferError(error).serialize(),
522
+ });
523
+ });
707
524
  }
708
- },
709
- needsManifestRefresh: function () {
710
- return self._manifestFetcher.scheduleManualRefresh({
711
- enablePartialRefresh: true,
712
- canUseUnsafeMode: true,
713
- });
714
- },
715
- manifestMightBeOufOfSync: function () {
716
- var OUT_OF_SYNC_MANIFEST_REFRESH_DELAY = config_1.default.getCurrent().OUT_OF_SYNC_MANIFEST_REFRESH_DELAY;
717
- self._manifestFetcher.scheduleManualRefresh({
718
- enablePartialRefresh: false,
719
- canUseUnsafeMode: false,
720
- delay: OUT_OF_SYNC_MANIFEST_REFRESH_DELAY,
525
+ break;
526
+ case "source-buffer-remove" /* CoreMessageType.SourceBufferRemove */:
527
+ {
528
+ if (((_k = (_j = _this._currentContentInfo) === null || _j === void 0 ? void 0 : _j.mediaSourceInfo) === null || _k === void 0 ? void 0 : _k.type) !== "main" ||
529
+ _this._currentContentInfo.mediaSourceInfo.mediaSource.id !==
530
+ msgData.mediaSourceId) {
531
+ return;
532
+ }
533
+ var mediaSource_2 = _this._currentContentInfo.mediaSourceInfo.mediaSource;
534
+ var sourceBuffer_2 = (0, array_find_1.default)(mediaSource_2.sourceBuffers, function (s) { return s.type === msgData.sourceBufferType; });
535
+ if (sourceBuffer_2 === undefined) {
536
+ return;
537
+ }
538
+ sourceBuffer_2
539
+ .remove(msgData.value.start, msgData.value.end)
540
+ .then(function (buffered) {
541
+ _this._settings.coreInterface.sendMessage({
542
+ type: "sb-success" /* MainThreadMessageType.SourceBufferSuccess */,
543
+ mediaSourceId: mediaSource_2.id,
544
+ sourceBufferType: sourceBuffer_2.type,
545
+ operationId: msgData.operationId,
546
+ value: { buffered: buffered },
547
+ });
548
+ })
549
+ .catch(function (error) {
550
+ _this._settings.coreInterface.sendMessage({
551
+ type: "sb-error" /* MainThreadMessageType.SourceBufferError */,
552
+ mediaSourceId: mediaSource_2.id,
553
+ sourceBufferType: sourceBuffer_2.type,
554
+ operationId: msgData.operationId,
555
+ value: error instanceof task_canceller_1.CancellationError
556
+ ? { errorName: "CancellationError" }
557
+ : formatSourceBufferError(error).serialize(),
558
+ });
559
+ });
560
+ }
561
+ break;
562
+ case "abort-source-buffer" /* CoreMessageType.AbortSourceBuffer */:
563
+ {
564
+ if (((_m = (_l = _this._currentContentInfo) === null || _l === void 0 ? void 0 : _l.mediaSourceInfo) === null || _m === void 0 ? void 0 : _m.type) !== "main" ||
565
+ _this._currentContentInfo.mediaSourceInfo.mediaSource.id !==
566
+ msgData.mediaSourceId) {
567
+ return;
568
+ }
569
+ var mediaSource = _this._currentContentInfo.mediaSourceInfo.mediaSource;
570
+ var sourceBuffer = (0, array_find_1.default)(mediaSource.sourceBuffers, function (s) { return s.type === msgData.sourceBufferType; });
571
+ if (sourceBuffer === undefined) {
572
+ return;
573
+ }
574
+ sourceBuffer.abort();
575
+ }
576
+ break;
577
+ case "update-media-source-duration" /* CoreMessageType.UpdateMediaSourceDuration */:
578
+ {
579
+ if (((_p = (_o = _this._currentContentInfo) === null || _o === void 0 ? void 0 : _o.mediaSourceInfo) === null || _p === void 0 ? void 0 : _p.type) !== "main" ||
580
+ _this._currentContentInfo.mediaSourceInfo.mediaSource.id !==
581
+ msgData.mediaSourceId) {
582
+ return;
583
+ }
584
+ var mediaSource = _this._currentContentInfo.mediaSourceInfo.mediaSource;
585
+ if ((mediaSource === null || mediaSource === void 0 ? void 0 : mediaSource.id) !== msgData.mediaSourceId) {
586
+ return;
587
+ }
588
+ mediaSource.setDuration(msgData.value.duration, msgData.value.isRealEndKnown);
589
+ }
590
+ break;
591
+ case "stop-media-source-duration" /* CoreMessageType.InterruptMediaSourceDurationUpdate */:
592
+ {
593
+ if (((_r = (_q = _this._currentContentInfo) === null || _q === void 0 ? void 0 : _q.mediaSourceInfo) === null || _r === void 0 ? void 0 : _r.type) !== "main" ||
594
+ _this._currentContentInfo.mediaSourceInfo.mediaSource.id !==
595
+ msgData.mediaSourceId) {
596
+ return;
597
+ }
598
+ var mediaSource = _this._currentContentInfo.mediaSourceInfo.mediaSource;
599
+ if ((mediaSource === null || mediaSource === void 0 ? void 0 : mediaSource.id) !== msgData.mediaSourceId) {
600
+ return;
601
+ }
602
+ mediaSource.interruptDurationSetting();
603
+ }
604
+ break;
605
+ case "end-of-stream" /* CoreMessageType.EndOfStream */:
606
+ {
607
+ if (((_t = (_s = _this._currentContentInfo) === null || _s === void 0 ? void 0 : _s.mediaSourceInfo) === null || _t === void 0 ? void 0 : _t.type) !== "main" ||
608
+ _this._currentContentInfo.mediaSourceInfo.mediaSource.id !==
609
+ msgData.mediaSourceId) {
610
+ return;
611
+ }
612
+ var mediaSource = _this._currentContentInfo.mediaSourceInfo.mediaSource;
613
+ mediaSource.maintainEndOfStream();
614
+ }
615
+ break;
616
+ case "stop-end-of-stream" /* CoreMessageType.InterruptEndOfStream */:
617
+ {
618
+ if (((_v = (_u = _this._currentContentInfo) === null || _u === void 0 ? void 0 : _u.mediaSourceInfo) === null || _v === void 0 ? void 0 : _v.type) !== "main" ||
619
+ _this._currentContentInfo.mediaSourceInfo.mediaSource.id !==
620
+ msgData.mediaSourceId) {
621
+ return;
622
+ }
623
+ var mediaSource = _this._currentContentInfo.mediaSourceInfo.mediaSource;
624
+ mediaSource.stopEndOfStream();
625
+ }
626
+ break;
627
+ case "dispose-media-source" /* CoreMessageType.DisposeMediaSource */:
628
+ {
629
+ if (((_x = (_w = _this._currentContentInfo) === null || _w === void 0 ? void 0 : _w.mediaSourceInfo) === null || _x === void 0 ? void 0 : _x.type) !== "main" ||
630
+ _this._currentContentInfo.mediaSourceInfo.mediaSource.id !==
631
+ msgData.mediaSourceId) {
632
+ return;
633
+ }
634
+ var mediaSource = _this._currentContentInfo.mediaSourceInfo.mediaSource;
635
+ mediaSource.dispose();
636
+ }
637
+ break;
638
+ case "needs-buffer-flush" /* CoreMessageType.NeedsBufferFlush */: {
639
+ if (((_y = _this._currentContentInfo) === null || _y === void 0 ? void 0 : _y.contentId) !== msgData.contentId) {
640
+ return;
641
+ }
642
+ var lastObservation = playbackObserver.getReference().getValue();
643
+ var currentTime = lastObservation.position.isAwaitingFuturePosition()
644
+ ? lastObservation.position.getWanted()
645
+ : mediaElement.currentTime;
646
+ var relativeResumingPosition = (_0 = (_z = msgData.value) === null || _z === void 0 ? void 0 : _z.relativeResumingPosition) !== null && _0 !== void 0 ? _0 : 0;
647
+ var canBeApproximateSeek = Boolean((_1 = msgData.value) === null || _1 === void 0 ? void 0 : _1.relativePosHasBeenDefaulted);
648
+ var wantedSeekingTime = void 0;
649
+ if (relativeResumingPosition === 0 && canBeApproximateSeek) {
650
+ // in case relativeResumingPosition is 0, we still perform
651
+ // a tiny seek to be sure that the browser will correclty reload the video.
652
+ wantedSeekingTime = currentTime + 0.001;
653
+ }
654
+ else {
655
+ wantedSeekingTime = currentTime + relativeResumingPosition;
656
+ }
657
+ playbackObserver.setCurrentTime(wantedSeekingTime);
658
+ break;
659
+ }
660
+ case "active-period-changed" /* CoreMessageType.ActivePeriodChanged */: {
661
+ if (((_2 = _this._currentContentInfo) === null || _2 === void 0 ? void 0 : _2.contentId) !== msgData.contentId ||
662
+ _this._currentContentInfo.manifest === null) {
663
+ return;
664
+ }
665
+ var period = (0, array_find_1.default)(_this._currentContentInfo.manifest.periods, function (p) { return p.id === msgData.value.periodId; });
666
+ if (period !== undefined) {
667
+ _this.trigger("activePeriodChanged", { period: period });
668
+ }
669
+ break;
670
+ }
671
+ case "adaptation-changed" /* CoreMessageType.AdaptationChanged */: {
672
+ if (((_3 = _this._currentContentInfo) === null || _3 === void 0 ? void 0 : _3.contentId) !== msgData.contentId ||
673
+ _this._currentContentInfo.manifest === null) {
674
+ return;
675
+ }
676
+ var period = (0, array_find_1.default)(_this._currentContentInfo.manifest.periods, function (p) { return p.id === msgData.value.periodId; });
677
+ if (period === undefined) {
678
+ return;
679
+ }
680
+ if (msgData.value.adaptationId === null) {
681
+ _this.trigger("adaptationChange", {
682
+ period: period,
683
+ adaptation: null,
684
+ type: msgData.value.type,
685
+ });
686
+ return;
687
+ }
688
+ var adaptations = (_4 = period.adaptations[msgData.value.type]) !== null && _4 !== void 0 ? _4 : [];
689
+ var adaptation = (0, array_find_1.default)(adaptations, function (a) { return a.id === msgData.value.adaptationId; });
690
+ if (adaptation !== undefined) {
691
+ _this.trigger("adaptationChange", {
692
+ period: period,
693
+ adaptation: adaptation,
694
+ type: msgData.value.type,
695
+ });
696
+ }
697
+ break;
698
+ }
699
+ case "representation-changed" /* CoreMessageType.RepresentationChanged */: {
700
+ if (((_5 = _this._currentContentInfo) === null || _5 === void 0 ? void 0 : _5.contentId) !== msgData.contentId ||
701
+ _this._currentContentInfo.manifest === null) {
702
+ return;
703
+ }
704
+ var period = (0, array_find_1.default)(_this._currentContentInfo.manifest.periods, function (p) { return p.id === msgData.value.periodId; });
705
+ if (period === undefined) {
706
+ return;
707
+ }
708
+ if (msgData.value.representationId === null) {
709
+ _this.trigger("representationChange", {
710
+ period: period,
711
+ type: msgData.value.type,
712
+ representation: null,
713
+ });
714
+ return;
715
+ }
716
+ var adaptations = (_6 = period.adaptations[msgData.value.type]) !== null && _6 !== void 0 ? _6 : [];
717
+ var adaptation = (0, array_find_1.default)(adaptations, function (a) { return a.id === msgData.value.adaptationId; });
718
+ if (adaptation === undefined) {
719
+ return;
720
+ }
721
+ var representation = (0, array_find_1.default)(adaptation.representations, function (r) { return r.id === msgData.value.representationId; });
722
+ if (representation !== undefined) {
723
+ _this.trigger("representationChange", {
724
+ period: period,
725
+ type: msgData.value.type,
726
+ representation: representation,
727
+ });
728
+ }
729
+ break;
730
+ }
731
+ case "encryption-data-encountered" /* CoreMessageType.EncryptionDataEncountered */:
732
+ if (((_7 = _this._currentContentInfo) === null || _7 === void 0 ? void 0 : _7.contentId) !== msgData.contentId) {
733
+ return;
734
+ }
735
+ lastContentProtection.setValue(msgData.value);
736
+ break;
737
+ case "manifest-ready" /* CoreMessageType.ManifestReady */: {
738
+ if (((_8 = _this._currentContentInfo) === null || _8 === void 0 ? void 0 : _8.contentId) !== msgData.contentId) {
739
+ return;
740
+ }
741
+ var manifest = msgData.value.manifest;
742
+ _this._currentContentInfo.manifest = manifest;
743
+ _this._updateCodecSupport(manifest, mediaElement);
744
+ _this._startPlaybackIfReady(playbackStartParams);
745
+ break;
746
+ }
747
+ case "manifest-update" /* CoreMessageType.ManifestUpdate */: {
748
+ if (((_9 = _this._currentContentInfo) === null || _9 === void 0 ? void 0 : _9.contentId) !== msgData.contentId) {
749
+ return;
750
+ }
751
+ var manifest = (_10 = _this._currentContentInfo) === null || _10 === void 0 ? void 0 : _10.manifest;
752
+ if ((0, is_null_or_undefined_1.default)(manifest)) {
753
+ log_1.default.error("Init", "Manifest update but no Manifest loaded");
754
+ return;
755
+ }
756
+ (0, manifest_1.replicateUpdatesOnManifestMetadata)(manifest, msgData.value.manifest, msgData.value.updates);
757
+ (_12 = (_11 = _this._currentContentInfo) === null || _11 === void 0 ? void 0 : _11.streamEventsEmitter) === null || _12 === void 0 ? void 0 : _12.onManifestUpdate(manifest);
758
+ _this._updateCodecSupport(manifest, mediaElement);
759
+ _this.trigger("manifestUpdate", msgData.value.updates);
760
+ break;
761
+ }
762
+ case "update-playback-rate" /* CoreMessageType.UpdatePlaybackRate */:
763
+ if (((_13 = _this._currentContentInfo) === null || _13 === void 0 ? void 0 : _13.contentId) !== msgData.contentId) {
764
+ return;
765
+ }
766
+ playbackObserver.setPlaybackRate(msgData.value);
767
+ break;
768
+ case "bitrate-estimate-change" /* CoreMessageType.BitrateEstimateChange */:
769
+ if (((_14 = _this._currentContentInfo) === null || _14 === void 0 ? void 0 : _14.contentId) !== msgData.contentId) {
770
+ return;
771
+ }
772
+ _this.trigger("bitrateEstimateChange", {
773
+ type: msgData.value.bufferType,
774
+ bitrate: msgData.value.bitrate,
721
775
  });
722
- },
723
- lockedStream: function (value) {
724
- return rebufferingController.onLockedStream(value.bufferType, value.period);
725
- },
726
- adaptationChange: function (value) {
727
- self.trigger("adaptationChange", value);
728
- if (cancelSignal.isCancelled()) {
729
- return; // Previous call has stopped streams due to a side-effect
776
+ break;
777
+ case "inband-event" /* CoreMessageType.InbandEvent */:
778
+ if (((_15 = _this._currentContentInfo) === null || _15 === void 0 ? void 0 : _15.contentId) !== msgData.contentId) {
779
+ return;
730
780
  }
731
- contentTimeBoundariesObserver.onAdaptationChange(value.type, value.period, value.adaptation);
732
- },
733
- representationChange: function (value) {
734
- self.trigger("representationChange", value);
735
- if (cancelSignal.isCancelled()) {
736
- return; // Previous call has stopped streams due to a side-effect
781
+ _this.trigger("inbandEvents", msgData.value);
782
+ break;
783
+ case "locked-stream" /* CoreMessageType.LockedStream */: {
784
+ if (((_16 = _this._currentContentInfo) === null || _16 === void 0 ? void 0 : _16.contentId) !== msgData.contentId ||
785
+ _this._currentContentInfo.manifest === null) {
786
+ return;
737
787
  }
738
- contentTimeBoundariesObserver.onRepresentationChange(value.type, value.period);
739
- },
740
- inbandEvent: function (value) { return self.trigger("inbandEvents", value); },
741
- warning: function (value) { return self.trigger("warning", value); },
742
- periodStreamReady: function (value) { return self.trigger("periodStreamReady", value); },
743
- periodStreamCleared: function (value) {
744
- contentTimeBoundariesObserver.onPeriodCleared(value.type, value.period);
745
- if (cancelSignal.isCancelled()) {
746
- return; // Previous call has stopped streams due to a side-effect
747
- }
748
- self.trigger("periodStreamCleared", {
749
- type: value.type,
750
- periodId: value.period.id,
788
+ var period = (0, array_find_1.default)(_this._currentContentInfo.manifest.periods, function (p) { return p.id === msgData.value.periodId; });
789
+ if (period === undefined) {
790
+ return;
791
+ }
792
+ (_17 = _this._currentContentInfo.rebufferingController) === null || _17 === void 0 ? void 0 : _17.onLockedStream(msgData.value.bufferType, period);
793
+ break;
794
+ }
795
+ case "period-stream-ready" /* CoreMessageType.PeriodStreamReady */: {
796
+ if (((_18 = _this._currentContentInfo) === null || _18 === void 0 ? void 0 : _18.contentId) !== msgData.contentId ||
797
+ _this._currentContentInfo.manifest === null) {
798
+ return;
799
+ }
800
+ var period = (0, array_find_1.default)(_this._currentContentInfo.manifest.periods, function (p) { return p.id === msgData.value.periodId; });
801
+ if (period === undefined) {
802
+ return;
803
+ }
804
+ var ref_1 = new reference_1.default(undefined);
805
+ ref_1.onUpdate(function (adapChoice) {
806
+ if (_this._currentContentInfo === null) {
807
+ ref_1.finish();
808
+ return;
809
+ }
810
+ if (!(0, is_null_or_undefined_1.default)(adapChoice)) {
811
+ adapChoice.representations.onUpdate(function (repChoice, stopListening) {
812
+ if (_this._currentContentInfo === null) {
813
+ stopListening();
814
+ return;
815
+ }
816
+ _this._settings.coreInterface.sendMessage({
817
+ type: "rep-update" /* MainThreadMessageType.RepresentationUpdate */,
818
+ contentId: _this._currentContentInfo.contentId,
819
+ value: {
820
+ periodId: msgData.value.periodId,
821
+ adaptationId: adapChoice.adaptationId,
822
+ bufferType: msgData.value.bufferType,
823
+ choice: repChoice,
824
+ },
825
+ });
826
+ }, { clearSignal: _this._initCanceller.signal });
827
+ }
828
+ _this._settings.coreInterface.sendMessage({
829
+ type: "track-update" /* MainThreadMessageType.TrackUpdate */,
830
+ contentId: _this._currentContentInfo.contentId,
831
+ value: {
832
+ periodId: msgData.value.periodId,
833
+ bufferType: msgData.value.bufferType,
834
+ choice: (0, is_null_or_undefined_1.default)(adapChoice)
835
+ ? adapChoice
836
+ : {
837
+ adaptationId: adapChoice.adaptationId,
838
+ switchingMode: adapChoice.switchingMode,
839
+ initialRepresentations: adapChoice.representations.getValue(),
840
+ relativeResumingPosition: adapChoice.relativeResumingPosition,
841
+ },
842
+ },
843
+ });
844
+ }, { clearSignal: _this._initCanceller.signal });
845
+ _this.trigger("periodStreamReady", {
846
+ period: period,
847
+ type: msgData.value.bufferType,
848
+ adaptationRef: ref_1,
751
849
  });
752
- },
753
- bitrateEstimateChange: function (value) {
754
- var _a;
755
- (_a = self._cmcdDataBuilder) === null || _a === void 0 ? void 0 : _a.updateThroughput(value.type, value.bitrate);
756
- self.trigger("bitrateEstimateChange", value);
757
- },
758
- needsMediaSourceReload: function (payload) {
759
- reloadMediaSource(payload.timeOffset, payload.minimumPosition, payload.maximumPosition);
760
- },
761
- needsDecipherabilityFlush: function () {
762
- var _a, _b, _c, _d;
763
- var keySystem = (0, decrypt_1.getKeySystemConfiguration)(mediaElement);
764
- if ((0, should_reload_media_source_on_decipherability_update_1.default)(keySystem === null || keySystem === void 0 ? void 0 : keySystem[0])) {
765
- var lastObservation = coreObserver.getReference().getValue();
766
- var position = lastObservation.position.isAwaitingFuturePosition()
767
- ? lastObservation.position.getWanted()
768
- : ((_a = coreObserver.getCurrentTime()) !== null && _a !== void 0 ? _a : lastObservation.position.getPolled());
769
- var isPaused = (_c = (_b = lastObservation.paused.pending) !== null && _b !== void 0 ? _b : coreObserver.getIsPaused()) !== null && _c !== void 0 ? _c : lastObservation.paused.last;
770
- onReloadOrder({ position: position, autoPlay: !isPaused });
850
+ break;
851
+ }
852
+ case "period-stream-cleared" /* CoreMessageType.PeriodStreamCleared */: {
853
+ if (((_19 = _this._currentContentInfo) === null || _19 === void 0 ? void 0 : _19.contentId) !== msgData.contentId ||
854
+ _this._currentContentInfo.manifest === null) {
855
+ return;
856
+ }
857
+ _this.trigger("periodStreamCleared", {
858
+ periodId: msgData.value.periodId,
859
+ type: msgData.value.bufferType,
860
+ });
861
+ break;
862
+ }
863
+ case "discontinuity-update" /* CoreMessageType.DiscontinuityUpdate */: {
864
+ if (((_20 = _this._currentContentInfo) === null || _20 === void 0 ? void 0 : _20.contentId) !== msgData.contentId ||
865
+ _this._currentContentInfo.manifest === null) {
866
+ return;
867
+ }
868
+ var period = (0, array_find_1.default)(_this._currentContentInfo.manifest.periods, function (p) { return p.id === msgData.value.periodId; });
869
+ if (period === undefined) {
870
+ log_1.default.warn("Init", "Discontinuity's Period not found", {
871
+ periodId: msgData.value.periodId,
872
+ });
873
+ return;
874
+ }
875
+ (_21 = _this._currentContentInfo.rebufferingController) === null || _21 === void 0 ? void 0 : _21.updateDiscontinuityInfo({
876
+ period: period,
877
+ bufferType: msgData.value.bufferType,
878
+ discontinuity: msgData.value.discontinuity,
879
+ position: msgData.value.position,
880
+ });
881
+ break;
882
+ }
883
+ case "push-text-data" /* CoreMessageType.PushTextData */: {
884
+ if (((_22 = _this._currentContentInfo) === null || _22 === void 0 ? void 0 : _22.contentId) !== msgData.contentId) {
885
+ return;
886
+ }
887
+ if (textDisplayer === null) {
888
+ log_1.default.warn("text", "Received AddTextData message but no text displayer exists");
771
889
  }
772
890
  else {
773
- var lastObservation = coreObserver.getReference().getValue();
774
- var position = lastObservation.position.isAwaitingFuturePosition()
775
- ? lastObservation.position.getWanted()
776
- : ((_d = coreObserver.getCurrentTime()) !== null && _d !== void 0 ? _d : lastObservation.position.getPolled());
777
- // simple seek close to the current position
778
- // to flush the buffers
779
- if (position + 0.001 < lastObservation.duration) {
780
- playbackObserver.setCurrentTime(mediaElement.currentTime + 0.001);
891
+ try {
892
+ var ranges = textDisplayer.pushTextData(msgData.value);
893
+ _this._settings.coreInterface.sendMessage({
894
+ type: "add-text-success" /* MainThreadMessageType.PushTextDataSuccess */,
895
+ contentId: msgData.contentId,
896
+ value: { ranges: ranges },
897
+ });
781
898
  }
782
- else {
783
- playbackObserver.setCurrentTime(position);
899
+ catch (err) {
900
+ var message = err instanceof Error ? err.message : "Unknown error";
901
+ _this._settings.coreInterface.sendMessage({
902
+ type: "push-text-error" /* MainThreadMessageType.PushTextDataError */,
903
+ contentId: msgData.contentId,
904
+ value: { message: message },
905
+ });
784
906
  }
785
907
  }
786
- },
787
- encryptionDataEncountered: function (value) {
788
- var e_1, _a;
789
- if (self._decryptionCapabilities.status === "disabled") {
790
- self._onFatalError(self._decryptionCapabilities.value);
908
+ break;
909
+ }
910
+ case "remove-text-data" /* CoreMessageType.RemoveTextData */: {
911
+ if (((_23 = _this._currentContentInfo) === null || _23 === void 0 ? void 0 : _23.contentId) !== msgData.contentId) {
791
912
  return;
792
913
  }
793
- else if (self._decryptionCapabilities.status === "uninitialized") {
794
- // Should never happen
795
- log_1.default.error("Init", "received encryption data without known decryption capabilities");
914
+ if (textDisplayer === null) {
915
+ log_1.default.warn("text", "Received RemoveTextData message but no text displayer exists");
916
+ }
917
+ else {
918
+ try {
919
+ var ranges = textDisplayer.removeBuffer(msgData.value.start, msgData.value.end);
920
+ _this._settings.coreInterface.sendMessage({
921
+ type: "remove-text-success" /* MainThreadMessageType.RemoveTextDataSuccess */,
922
+ contentId: msgData.contentId,
923
+ value: { ranges: ranges },
924
+ });
925
+ }
926
+ catch (err) {
927
+ var message = err instanceof Error ? err.message : "Unknown error";
928
+ _this._settings.coreInterface.sendMessage({
929
+ type: "remove-text-error" /* MainThreadMessageType.RemoveTextDataError */,
930
+ contentId: msgData.contentId,
931
+ value: { message: message },
932
+ });
933
+ }
934
+ }
935
+ break;
936
+ }
937
+ case "reset-text-displayer" /* CoreMessageType.ResetTextDisplayer */: {
938
+ if (((_24 = _this._currentContentInfo) === null || _24 === void 0 ? void 0 : _24.contentId) !== msgData.contentId) {
939
+ return;
940
+ }
941
+ if (textDisplayer === null) {
942
+ log_1.default.warn("text", "Received ResetTextDisplayer message but no text displayer exists");
943
+ }
944
+ else {
945
+ textDisplayer.reset();
946
+ }
947
+ break;
948
+ }
949
+ case "stop-text-displayer" /* CoreMessageType.StopTextDisplayer */: {
950
+ if (((_25 = _this._currentContentInfo) === null || _25 === void 0 ? void 0 : _25.contentId) !== msgData.contentId) {
796
951
  return;
797
952
  }
798
- try {
799
- for (var value_1 = __values(value), value_1_1 = value_1.next(); !value_1_1.done; value_1_1 = value_1.next()) {
800
- var protectionData = value_1_1.value;
801
- self._decryptionCapabilities.value.onInitializationData(protectionData);
802
- if (cancelSignal.isCancelled()) {
803
- return; // Previous call has stopped streams due to a side-effect
953
+ if (textDisplayer === null) {
954
+ log_1.default.warn("text", "Received StopTextDisplayer message but no text displayer exists");
955
+ }
956
+ else {
957
+ textDisplayer.stop();
958
+ }
959
+ break;
960
+ }
961
+ case "reloading-media-source" /* CoreMessageType.ReloadingMediaSource */:
962
+ {
963
+ if (_this._currentContentInfo === null ||
964
+ _this._currentContentInfo.mediaSourceInfo === null) {
965
+ return;
966
+ }
967
+ var mediaSourceId = _this._currentContentInfo.mediaSourceInfo.type === "main"
968
+ ? _this._currentContentInfo.mediaSourceInfo.mediaSource.id
969
+ : _this._currentContentInfo.mediaSourceInfo.mediaSourceId;
970
+ if (mediaSourceId !== msgData.mediaSourceId) {
971
+ return;
972
+ }
973
+ reloadMediaSource(msgData.value.timeOffset, msgData.value.minimumPosition, msgData.value.maximumPosition);
974
+ }
975
+ break;
976
+ case "needs-decipherability-flush" /* CoreMessageType.NeedsDecipherabilityFlush */:
977
+ {
978
+ if (((_26 = _this._currentContentInfo) === null || _26 === void 0 ? void 0 : _26.contentId) !== msgData.contentId) {
979
+ return;
980
+ }
981
+ var keySystem = (0, decrypt_1.getKeySystemConfiguration)(mediaElement);
982
+ if ((0, should_reload_media_source_on_decipherability_update_1.default)(keySystem === null || keySystem === void 0 ? void 0 : keySystem[0])) {
983
+ notifyAndStartMediaSourceReload(0, undefined, undefined);
984
+ }
985
+ else {
986
+ var lastObservation = playbackObserver.getReference().getValue();
987
+ var currentPosition = lastObservation.position.getWanted();
988
+ // simple seek close to the current position
989
+ // to flush the buffers
990
+ if (currentPosition + 0.001 < lastObservation.duration) {
991
+ playbackObserver.setCurrentTime(mediaElement.currentTime + 0.001);
992
+ }
993
+ else {
994
+ playbackObserver.setCurrentTime(currentPosition);
804
995
  }
805
996
  }
806
997
  }
807
- catch (e_1_1) { e_1 = { error: e_1_1 }; }
808
- finally {
809
- try {
810
- if (value_1_1 && !value_1_1.done && (_a = value_1.return)) _a.call(value_1);
998
+ break;
999
+ case "segment-sink-store-update" /* CoreMessageType.SegmentSinkStoreUpdate */: {
1000
+ if (((_27 = _this._currentContentInfo) === null || _27 === void 0 ? void 0 : _27.contentId) !== msgData.contentId) {
1001
+ return;
1002
+ }
1003
+ var sinkObj = _this._awaitingRequests.pendingSinkMetrics.get(msgData.value.requestId);
1004
+ if (sinkObj !== undefined) {
1005
+ sinkObj.resolve(msgData.value.segmentSinkMetrics);
1006
+ }
1007
+ else {
1008
+ log_1.default.error("Init", "Failed to send segment sink store update");
1009
+ }
1010
+ break;
1011
+ }
1012
+ case "init-success" /* CoreMessageType.InitSuccess */:
1013
+ case "init-error" /* CoreMessageType.InitError */:
1014
+ // Should already be handled by the API
1015
+ break;
1016
+ case "log" /* CoreMessageType.LogMessage */:
1017
+ // Already handled by prepare's handler
1018
+ break;
1019
+ case "thumbnail-response" /* CoreMessageType.ThumbnailDataResponse */: {
1020
+ if (((_28 = _this._currentContentInfo) === null || _28 === void 0 ? void 0 : _28.contentId) !== msgData.contentId) {
1021
+ return;
1022
+ }
1023
+ var tObj = _this._awaitingRequests.pendingThumbnailFetching.get(msgData.value.requestId);
1024
+ if (tObj !== undefined) {
1025
+ if (msgData.value.status === "error") {
1026
+ tObj.reject(formatCoreError(msgData.value.error));
811
1027
  }
812
- finally { if (e_1) throw e_1.error; }
1028
+ else {
1029
+ tObj.resolve(msgData.value.data);
1030
+ }
1031
+ }
1032
+ else {
1033
+ log_1.default.error("Init", "Failed to send segment sink store update");
813
1034
  }
1035
+ break;
1036
+ }
1037
+ default:
1038
+ (0, assert_1.assertUnreachable)(msgData);
1039
+ }
1040
+ };
1041
+ log_1.default.debug("Init", "addEventListener for core message");
1042
+ if (this._queuedCoreMessages !== null) {
1043
+ var bufferedMessages = this._queuedCoreMessages.slice();
1044
+ log_1.default.debug("Init", "Processing buffered messages", {
1045
+ ammount: bufferedMessages.length,
1046
+ });
1047
+ try {
1048
+ for (var bufferedMessages_1 = __values(bufferedMessages), bufferedMessages_1_1 = bufferedMessages_1.next(); !bufferedMessages_1_1.done; bufferedMessages_1_1 = bufferedMessages_1.next()) {
1049
+ var message = bufferedMessages_1_1.value;
1050
+ onmessage(message);
1051
+ }
1052
+ }
1053
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
1054
+ finally {
1055
+ try {
1056
+ if (bufferedMessages_1_1 && !bufferedMessages_1_1.done && (_a = bufferedMessages_1.return)) _a.call(bufferedMessages_1);
1057
+ }
1058
+ finally { if (e_1) throw e_1.error; }
1059
+ }
1060
+ this._queuedCoreMessages = null;
1061
+ }
1062
+ this._settings.coreInterface.addMessageListener(onmessage);
1063
+ this._initCanceller.signal.register(function () {
1064
+ log_1.default.debug("Init", "removeEventListener for core message");
1065
+ _this._settings.coreInterface.removeMessageListener(onmessage);
1066
+ });
1067
+ };
1068
+ MediaSourceContentInitializer.prototype.dispose = function () {
1069
+ var _a;
1070
+ this._initCanceller.cancel();
1071
+ if (this._currentContentInfo !== null) {
1072
+ if (((_a = this._currentContentInfo.mediaSourceInfo) === null || _a === void 0 ? void 0 : _a.type) === "main") {
1073
+ this._currentContentInfo.mediaSourceInfo.mediaSource.dispose();
1074
+ }
1075
+ this._currentContentInfo = null;
1076
+ }
1077
+ };
1078
+ MediaSourceContentInitializer.prototype._onFatalError = function (err) {
1079
+ if (this._initCanceller.isUsed()) {
1080
+ return;
1081
+ }
1082
+ this._initCanceller.cancel();
1083
+ this.trigger("error", err);
1084
+ };
1085
+ MediaSourceContentInitializer.prototype._initializeContentDecryption = function (mediaElement, lastContentProtection, mediaSourceStatus, reloadMediaSource, cancelSignal) {
1086
+ var _this = this;
1087
+ var _a;
1088
+ var keySystems = this._settings.keySystems;
1089
+ // TODO private?
1090
+ var createEmeDisabledReference = function (errMsg) {
1091
+ mediaSourceStatus.setValue(1 /* MediaSourceInitializationStatus.AttachNow */);
1092
+ lastContentProtection.onUpdate(function (data, stopListening) {
1093
+ if (data === null) {
1094
+ // initial value
1095
+ return;
1096
+ }
1097
+ stopListening();
1098
+ var err = new errors_1.EncryptedMediaError("MEDIA_IS_ENCRYPTED_ERROR", errMsg, {
1099
+ keyStatuses: undefined,
1100
+ keySystemConfiguration: undefined,
1101
+ keySystem: undefined,
1102
+ });
1103
+ _this._onFatalError(err);
1104
+ }, { clearSignal: cancelSignal });
1105
+ var ref = new reference_1.default({
1106
+ initializationState: {
1107
+ type: "initialized",
1108
+ value: null,
814
1109
  },
815
- error: function (err) { return self._onFatalError(err); },
816
- };
1110
+ contentDecryptor: null,
1111
+ drmSystemId: undefined,
1112
+ });
1113
+ ref.finish(); // We know that no new value will be triggered
1114
+ return { statusRef: ref, contentDecryptor: null };
1115
+ };
1116
+ if (keySystems.length === 0) {
1117
+ return createEmeDisabledReference("No `keySystems` option given.");
817
1118
  }
818
- /**
819
- * Callback allowing to reload the current content.
820
- * @param {number} deltaPosition - Position you want to seek to after
821
- * reloading, as a delta in seconds from the last polled playing position.
822
- * @param {number|undefined} minimumPosition - If set, minimum time bound
823
- * in seconds after `deltaPosition` has been applied.
824
- * @param {number|undefined} maximumPosition - If set, minimum time bound
825
- * in seconds after `deltaPosition` has been applied.
826
- */
827
- function reloadMediaSource(deltaPosition, minimumPosition, maximumPosition) {
828
- var _a, _b, _c;
829
- var lastObservation = coreObserver.getReference().getValue();
830
- var currentPosition = lastObservation.position.isAwaitingFuturePosition()
831
- ? lastObservation.position.getWanted()
832
- : ((_a = coreObserver.getCurrentTime()) !== null && _a !== void 0 ? _a : lastObservation.position.getPolled());
833
- var isPaused = (_c = (_b = lastObservation.paused.pending) !== null && _b !== void 0 ? _b : coreObserver.getIsPaused()) !== null && _c !== void 0 ? _c : lastObservation.paused.last;
834
- var position = currentPosition + deltaPosition;
835
- if (minimumPosition !== undefined) {
836
- position = Math.max(minimumPosition, position);
1119
+ else if (features_1.default.decrypt === null) {
1120
+ return createEmeDisabledReference("EME feature not activated.");
1121
+ }
1122
+ var emeApi = (_a = mediaElement.FORCED_EME_API) !== null && _a !== void 0 ? _a : (0, eme_1.default)("auto");
1123
+ if (emeApi === null) {
1124
+ return createEmeDisabledReference("EME API not available on the current page.");
1125
+ }
1126
+ log_1.default.debug("Init", "Creating ContentDecryptor");
1127
+ var ContentDecryptor = features_1.default.decrypt;
1128
+ var contentDecryptor = new ContentDecryptor(emeApi, mediaElement, keySystems);
1129
+ var drmStatusRef = new reference_1.default({
1130
+ initializationState: { type: "uninitialized", value: null },
1131
+ drmSystemId: undefined,
1132
+ }, cancelSignal);
1133
+ var updateCodecSupportOnStateChange = function (state) {
1134
+ var _a;
1135
+ if (state > decrypt_1.ContentDecryptorState.Initializing) {
1136
+ var manifest = (_a = _this._currentContentInfo) === null || _a === void 0 ? void 0 : _a.manifest;
1137
+ if ((0, is_null_or_undefined_1.default)(manifest)) {
1138
+ return;
1139
+ }
1140
+ _this._updateCodecSupport(manifest, mediaElement);
1141
+ contentDecryptor.removeEventListener("stateChange", updateCodecSupportOnStateChange);
837
1142
  }
838
- if (maximumPosition !== undefined) {
839
- position = Math.min(maximumPosition, position);
1143
+ };
1144
+ contentDecryptor.addEventListener("stateChange", updateCodecSupportOnStateChange);
1145
+ contentDecryptor.addEventListener("keyIdsCompatibilityUpdate", function (updates) {
1146
+ if (_this._currentContentInfo === null ||
1147
+ _this._currentContentInfo.manifest === null) {
1148
+ return;
840
1149
  }
841
- onReloadOrder({ position: position, autoPlay: !isPaused });
1150
+ var manUpdates = (0, manifest_1.updateDecipherabilityFromKeyIds)(_this._currentContentInfo.manifest, updates);
1151
+ if ((0, may_media_element_fail_on_undecipherable_data_1.default)() &&
1152
+ manUpdates.some(function (e) { return e.representation.decipherable !== true; })) {
1153
+ reloadMediaSource();
1154
+ }
1155
+ else {
1156
+ _this._settings.coreInterface.sendMessage({
1157
+ type: "decipherability-update" /* MainThreadMessageType.DecipherabilityStatusUpdate */,
1158
+ contentId: _this._currentContentInfo.contentId,
1159
+ value: manUpdates.map(function (s) { return ({
1160
+ representationUniqueId: s.representation.uniqueId,
1161
+ decipherable: s.representation.decipherable,
1162
+ }); }),
1163
+ });
1164
+ }
1165
+ _this.trigger("decipherabilityUpdate", manUpdates);
1166
+ });
1167
+ contentDecryptor.addEventListener("blackListProtectionData", function (protData) {
1168
+ if (_this._currentContentInfo === null ||
1169
+ _this._currentContentInfo.manifest === null) {
1170
+ return;
1171
+ }
1172
+ var manUpdates = (0, manifest_1.updateDecipherabilityFromProtectionData)(_this._currentContentInfo.manifest, protData);
1173
+ if ((0, may_media_element_fail_on_undecipherable_data_1.default)() &&
1174
+ manUpdates.some(function (e) { return e.representation.decipherable !== true; })) {
1175
+ reloadMediaSource();
1176
+ }
1177
+ else {
1178
+ _this._settings.coreInterface.sendMessage({
1179
+ type: "decipherability-update" /* MainThreadMessageType.DecipherabilityStatusUpdate */,
1180
+ contentId: _this._currentContentInfo.contentId,
1181
+ value: manUpdates.map(function (s) { return ({
1182
+ representationUniqueId: s.representation.uniqueId,
1183
+ decipherable: s.representation.decipherable,
1184
+ }); }),
1185
+ });
1186
+ }
1187
+ _this.trigger("decipherabilityUpdate", manUpdates);
1188
+ });
1189
+ contentDecryptor.addEventListener("stateChange", function (state) {
1190
+ if (state === decrypt_1.ContentDecryptorState.WaitingForAttachment) {
1191
+ mediaSourceStatus.onUpdate(function (currStatus, stopListening) {
1192
+ if (currStatus === 0 /* MediaSourceInitializationStatus.Nothing */) {
1193
+ mediaSourceStatus.setValue(1 /* MediaSourceInitializationStatus.AttachNow */);
1194
+ }
1195
+ else if (currStatus === 2 /* MediaSourceInitializationStatus.Attached */) {
1196
+ stopListening();
1197
+ if (state === decrypt_1.ContentDecryptorState.WaitingForAttachment) {
1198
+ contentDecryptor.attach();
1199
+ }
1200
+ }
1201
+ }, { clearSignal: cancelSignal, emitCurrentValue: true });
1202
+ }
1203
+ else if (state === decrypt_1.ContentDecryptorState.ReadyForContent) {
1204
+ drmStatusRef.setValue({
1205
+ initializationState: { type: "initialized", value: null },
1206
+ drmSystemId: contentDecryptor.systemId,
1207
+ });
1208
+ contentDecryptor.removeEventListener("stateChange");
1209
+ }
1210
+ });
1211
+ contentDecryptor.addEventListener("error", function (error) {
1212
+ _this._onFatalError(error);
1213
+ });
1214
+ contentDecryptor.addEventListener("warning", function (error) {
1215
+ _this.trigger("warning", error);
1216
+ });
1217
+ lastContentProtection.onUpdate(function (data) {
1218
+ if (data === null) {
1219
+ return;
1220
+ }
1221
+ contentDecryptor.onInitializationData(data);
1222
+ }, { clearSignal: cancelSignal });
1223
+ cancelSignal.register(function () {
1224
+ contentDecryptor.dispose();
1225
+ });
1226
+ return { statusRef: drmStatusRef, contentDecryptor: contentDecryptor };
1227
+ };
1228
+ /**
1229
+ * Retrieves all unknown codecs from the current manifest, checks these unknown codecs
1230
+ * to determine if they are supported, updates the manifest with the support
1231
+ * status of these codecs, and forwards the list of supported codecs to core.
1232
+ * @param manifest
1233
+ */
1234
+ MediaSourceContentInitializer.prototype._updateCodecSupport = function (manifest, mediaElement) {
1235
+ var _a, _b, _c, _d;
1236
+ try {
1237
+ var updatedCodecs = (0, update_manifest_codec_support_1.updateManifestCodecSupport)(manifest, (_b = (_a = this._currentContentInfo) === null || _a === void 0 ? void 0 : _a.contentDecryptor) !== null && _b !== void 0 ? _b : null, mediaElement, (_d = (_c = this._currentContentInfo) === null || _c === void 0 ? void 0 : _c.useMseInWorker) !== null && _d !== void 0 ? _d : false);
1238
+ if (updatedCodecs.length > 0) {
1239
+ this._settings.coreInterface.sendMessage({
1240
+ type: "codec-support-update" /* MainThreadMessageType.CodecSupportUpdate */,
1241
+ value: updatedCodecs,
1242
+ });
1243
+ // TODO what if one day the core updates codec support by itself?
1244
+ // We wouldn't know...
1245
+ this.trigger("codecSupportUpdate", null);
1246
+ }
1247
+ }
1248
+ catch (err) {
1249
+ this._onFatalError(err);
842
1250
  }
843
1251
  };
1252
+ MediaSourceContentInitializer.prototype._hasTextBufferFeature = function () {
1253
+ return ((this._settings.textTrackOptions.textTrackMode === "html" &&
1254
+ features_1.default.htmlTextDisplayer !== null) ||
1255
+ features_1.default.nativeTextDisplayer !== null);
1256
+ };
1257
+ MediaSourceContentInitializer.prototype._reload = function (mediaElement, textDisplayer, playbackObserver, mediaSourceStatus, position, autoPlay) {
1258
+ var _this = this;
1259
+ this._currentMediaSourceCanceller.cancel();
1260
+ this._currentMediaSourceCanceller = new task_canceller_1.default();
1261
+ this._currentMediaSourceCanceller.linkToSignal(this._initCanceller.signal);
1262
+ mediaSourceStatus.setValue(1 /* MediaSourceInitializationStatus.AttachNow */);
1263
+ this.trigger("reloadingMediaSource", { position: position, autoPlay: autoPlay });
1264
+ mediaSourceStatus.onUpdate(function (status, stopListeningMSStatusUpdates) {
1265
+ if (status !== 2 /* MediaSourceInitializationStatus.Attached */) {
1266
+ return;
1267
+ }
1268
+ stopListeningMSStatusUpdates();
1269
+ var corePlaybackObserver = _this._setUpModulesOnNewMediaSource({
1270
+ initialTime: position,
1271
+ autoPlay: autoPlay,
1272
+ mediaElement: mediaElement,
1273
+ textDisplayer: textDisplayer,
1274
+ playbackObserver: playbackObserver,
1275
+ }, _this._currentMediaSourceCanceller.signal);
1276
+ if (!_this._currentMediaSourceCanceller.isUsed() &&
1277
+ corePlaybackObserver !== null &&
1278
+ _this._currentContentInfo !== null) {
1279
+ var contentId_1 = _this._currentContentInfo.contentId;
1280
+ corePlaybackObserver.listen(function (obs) {
1281
+ _this._settings.coreInterface.sendMessage({
1282
+ type: "observation" /* MainThreadMessageType.PlaybackObservation */,
1283
+ contentId: contentId_1,
1284
+ value: (0, object_assign_1.default)(obs, {
1285
+ position: obs.position.serialize(),
1286
+ }),
1287
+ });
1288
+ }, {
1289
+ includeLastObservation: true,
1290
+ clearSignal: _this._currentMediaSourceCanceller.signal,
1291
+ });
1292
+ }
1293
+ }, {
1294
+ clearSignal: this._currentMediaSourceCanceller.signal,
1295
+ emitCurrentValue: true,
1296
+ });
1297
+ };
844
1298
  /**
845
- * Creates a `RebufferingController`, a class trying to avoid various stalling
846
- * situations (such as rebuffering periods), and returns it.
1299
+ * Start-up modules and mechanisms (initial seek, auto-play etc.) needed each
1300
+ * time a content is loaded AND re-loaded on a `HTMLMediaElement`, when the
1301
+ * manifest is known.
847
1302
  *
848
- * Various methods from that class need then to be called at various events
849
- * (see `RebufferingController` definition).
1303
+ * Note that this does not include reacting to incoming core messages nor
1304
+ * sending them, those actions have to be handled separately.
850
1305
  *
851
- * This function also handles the `RebufferingController`'s events:
852
- * - emit "stalled" events when stalling situations cannot be prevented,
853
- * - emit "unstalled" events when we could get out of one,
854
- * - emit "warning" on various rebuffering-related minor issues
855
- * like discontinuity skipping.
856
- * @param {Object} playbackObserver
857
- * @param {Object} manifest
858
- * @param {Object} speed
1306
+ * @param {Object} parameters
859
1307
  * @param {Object} cancelSignal
860
- * @returns {Object}
1308
+ * @returns {Object|null} - Playback Observer created for this content. `null`
1309
+ * only if playback initialization failed (most likely because it has been
1310
+ * cancelled).
861
1311
  */
862
- MediaSourceContentInitializer.prototype._createRebufferingController = function (playbackObserver, manifest, speed, cancelSignal) {
1312
+ MediaSourceContentInitializer.prototype._setUpModulesOnNewMediaSource = function (parameters, cancelSignal) {
863
1313
  var _this = this;
1314
+ if (cancelSignal.isCancelled()) {
1315
+ return null;
1316
+ }
1317
+ if (this._currentContentInfo === null) {
1318
+ log_1.default.error("Init", "Setting up modules without a contentId");
1319
+ return null;
1320
+ }
1321
+ if (this._currentContentInfo.manifest === null) {
1322
+ log_1.default.error("Init", "Setting up modules without a loaded Manifest");
1323
+ return null;
1324
+ }
1325
+ var _a = this._currentContentInfo, manifest = _a.manifest, mediaSourceInfo = _a.mediaSourceInfo;
1326
+ var speed = this._settings.speed;
1327
+ var initialTime = parameters.initialTime, autoPlay = parameters.autoPlay, mediaElement = parameters.mediaElement, textDisplayer = parameters.textDisplayer, playbackObserver = parameters.playbackObserver;
1328
+ this._currentContentInfo.initialTime = initialTime;
1329
+ this._currentContentInfo.autoPlay = autoPlay;
1330
+ var _b = (0, initial_seek_and_play_1.default)({
1331
+ mediaElement: mediaElement,
1332
+ playbackObserver: playbackObserver,
1333
+ startTime: initialTime,
1334
+ mustAutoPlay: autoPlay,
1335
+ onWarning: function (err) { return _this.trigger("warning", err); },
1336
+ isDirectfile: false,
1337
+ }, cancelSignal), autoPlayResult = _b.autoPlayResult, initialPlayPerformed = _b.initialPlayPerformed;
1338
+ this._currentContentInfo.initialPlayPerformed = initialPlayPerformed;
1339
+ var corePlaybackObserver = (0, create_core_playback_observer_1.default)(playbackObserver, {
1340
+ autoPlay: autoPlay,
1341
+ initialPlayPerformed: initialPlayPerformed,
1342
+ manifest: manifest,
1343
+ mediaSource: (mediaSourceInfo === null || mediaSourceInfo === void 0 ? void 0 : mediaSourceInfo.type) === "main" ? mediaSourceInfo.mediaSource : null,
1344
+ speed: speed,
1345
+ textDisplayer: textDisplayer,
1346
+ }, cancelSignal);
1347
+ if (cancelSignal.isCancelled()) {
1348
+ return null;
1349
+ }
1350
+ /**
1351
+ * Class trying to avoid various stalling situations, emitting "stalled"
1352
+ * events when it cannot, as well as "unstalled" events when it get out of one.
1353
+ */
864
1354
  var rebufferingController = new rebuffering_controller_1.default(playbackObserver, manifest, speed);
865
- // Bubble-up events
866
1355
  rebufferingController.addEventListener("stalled", function (evt) {
867
1356
  return _this.trigger("stalled", evt);
868
1357
  });
@@ -872,271 +1361,355 @@ var MediaSourceContentInitializer = /** @class */ (function (_super) {
872
1361
  rebufferingController.addEventListener("warning", function (err) {
873
1362
  return _this.trigger("warning", err);
874
1363
  });
875
- cancelSignal.register(function () { return rebufferingController.destroy(); });
1364
+ cancelSignal.register(function () {
1365
+ rebufferingController.destroy();
1366
+ });
876
1367
  rebufferingController.start();
877
- return rebufferingController;
878
- };
879
- /**
880
- * Evaluates a list of codecs to determine their support status.
881
- *
882
- * @param {Array} codecsToCheck - The list of codecs to check.
883
- * @returns {Array} - The list of evaluated codecs with their support status updated.
884
- */
885
- MediaSourceContentInitializer.prototype.getCodecsSupportInfo = function (codecsToCheck, mediaElement) {
886
- var _this = this;
887
- var codecsSupportInfo = codecsToCheck.map(function (codecToCheck) {
888
- var _a;
889
- var inputCodec = "".concat(codecToCheck.mimeType, ";codecs=\"").concat(codecToCheck.codec, "\"");
890
- var isSupported = (0, is_codec_supported_1.default)(mediaElement, inputCodec);
891
- if (!isSupported) {
892
- return {
893
- mimeType: codecToCheck.mimeType,
894
- codec: codecToCheck.codec,
895
- supported: false,
896
- supportedIfEncrypted: false,
897
- };
898
- }
899
- /**
900
- * `true` if the codec is supported when encrypted, `false` if it is not
901
- * supported, or `undefined` if we cannot obtain that information.
902
- */
903
- var supportedIfEncrypted;
904
- if (_this._decryptionCapabilities.status === "uninitialized") {
905
- supportedIfEncrypted = undefined;
906
- }
907
- else if (_this._decryptionCapabilities.status === "disabled") {
908
- // It's ambiguous here, but let's say that no ContentDecryptor means that
909
- // the codec is supported by it.
910
- supportedIfEncrypted = true;
1368
+ this._currentContentInfo.rebufferingController = rebufferingController;
1369
+ var currentContentInfo = this._currentContentInfo;
1370
+ initialPlayPerformed.onUpdate(function (isPerformed, stopListening) {
1371
+ if (isPerformed) {
1372
+ stopListening();
1373
+ var streamEventsEmitter_1 = new stream_events_emitter_1.default(manifest, playbackObserver);
1374
+ currentContentInfo.streamEventsEmitter = streamEventsEmitter_1;
1375
+ streamEventsEmitter_1.addEventListener("event", function (payload) {
1376
+ _this.trigger("streamEvent", payload);
1377
+ }, cancelSignal);
1378
+ streamEventsEmitter_1.addEventListener("eventSkip", function (payload) {
1379
+ _this.trigger("streamEventSkip", payload);
1380
+ }, cancelSignal);
1381
+ streamEventsEmitter_1.start();
1382
+ cancelSignal.register(function () {
1383
+ streamEventsEmitter_1.stop();
1384
+ });
911
1385
  }
912
- else {
913
- var contentDecryptor = _this._decryptionCapabilities.value;
914
- if (contentDecryptor.getState() !== decrypt_1.ContentDecryptorState.Initializing) {
915
- // No information is available regarding the support status.
916
- // Defaulting to assume the codec is supported.
917
- supportedIfEncrypted =
918
- (_a = contentDecryptor.isCodecSupported(codecToCheck.mimeType, codecToCheck.codec)) !== null && _a !== void 0 ? _a : true;
1386
+ }, { clearSignal: cancelSignal, emitCurrentValue: true });
1387
+ var _getSegmentSinkMetrics = function () { return __awaiter(_this, void 0, void 0, function () {
1388
+ var requestId;
1389
+ var _this = this;
1390
+ return __generator(this, function (_a) {
1391
+ this._awaitingRequests.nextRequestId++;
1392
+ requestId = this._awaitingRequests.nextRequestId;
1393
+ this._settings.coreInterface.sendMessage({
1394
+ type: "pull-segment-sink-store-infos" /* MainThreadMessageType.PullSegmentSinkStoreInfos */,
1395
+ value: { requestId: requestId },
1396
+ });
1397
+ return [2 /*return*/, new Promise(function (resolve, reject) {
1398
+ var rejectFn = function (err) {
1399
+ cancelSignal.deregister(rejectFn);
1400
+ _this._awaitingRequests.pendingSinkMetrics.delete(requestId);
1401
+ return reject(err);
1402
+ };
1403
+ _this._awaitingRequests.pendingSinkMetrics.set(requestId, {
1404
+ resolve: function (value) {
1405
+ cancelSignal.deregister(rejectFn);
1406
+ _this._awaitingRequests.pendingSinkMetrics.delete(requestId);
1407
+ resolve(value);
1408
+ },
1409
+ });
1410
+ cancelSignal.register(rejectFn);
1411
+ })];
1412
+ });
1413
+ }); };
1414
+ var _getThumbnailsData = function (periodId, thumbnailTrackId, time) { return __awaiter(_this, void 0, void 0, function () {
1415
+ var requestId;
1416
+ var _this = this;
1417
+ return __generator(this, function (_a) {
1418
+ if (this._currentContentInfo === null) {
1419
+ return [2 /*return*/, Promise.reject(new Error("Cannot fetch thumbnails: No content loaded."))];
1420
+ }
1421
+ this._awaitingRequests.nextRequestId++;
1422
+ requestId = this._awaitingRequests.nextRequestId;
1423
+ this._settings.coreInterface.sendMessage({
1424
+ type: "thumbnail-request" /* MainThreadMessageType.ThumbnailDataRequest */,
1425
+ contentId: this._currentContentInfo.contentId,
1426
+ value: { requestId: requestId, periodId: periodId, thumbnailTrackId: thumbnailTrackId, time: time },
1427
+ });
1428
+ return [2 /*return*/, new Promise(function (resolve, reject) {
1429
+ var rejectFn = function (err) {
1430
+ cleanUp();
1431
+ reject(err);
1432
+ };
1433
+ var cleanUp = function () {
1434
+ cancelSignal.deregister(rejectFn);
1435
+ _this._awaitingRequests.pendingThumbnailFetching.delete(requestId);
1436
+ };
1437
+ _this._awaitingRequests.pendingThumbnailFetching.set(requestId, {
1438
+ resolve: function (value) {
1439
+ cleanUp();
1440
+ resolve(value);
1441
+ },
1442
+ reject: function (value) {
1443
+ cleanUp();
1444
+ reject(value);
1445
+ },
1446
+ });
1447
+ cancelSignal.register(rejectFn);
1448
+ })];
1449
+ });
1450
+ }); };
1451
+ /**
1452
+ * Emit a "loaded" events once the initial play has been performed and the
1453
+ * media can begin playback.
1454
+ * Also emits warning events if issues arise when doing so.
1455
+ */
1456
+ autoPlayResult
1457
+ .then(function () {
1458
+ (0, get_loaded_reference_1.default)(playbackObserver, false, cancelSignal).onUpdate(function (isLoaded, stopListening) {
1459
+ if (isLoaded) {
1460
+ stopListening();
1461
+ _this.trigger("loaded", {
1462
+ getSegmentSinkMetrics: _getSegmentSinkMetrics,
1463
+ getThumbnailData: _getThumbnailsData,
1464
+ });
919
1465
  }
1466
+ }, { emitCurrentValue: true, clearSignal: cancelSignal });
1467
+ })
1468
+ .catch(function (err) {
1469
+ if (cancelSignal.isCancelled()) {
1470
+ return;
920
1471
  }
921
- return {
922
- mimeType: codecToCheck.mimeType,
923
- codec: codecToCheck.codec,
924
- supported: isSupported,
925
- supportedIfEncrypted: supportedIfEncrypted,
926
- };
1472
+ _this._onFatalError(err);
927
1473
  });
928
- return codecsSupportInfo;
1474
+ return corePlaybackObserver;
929
1475
  };
930
1476
  /**
931
- * Update the support status of all Representations in the Manifest.
1477
+ * Initialize content playback if and only if those conditions are filled:
1478
+ * - The Manifest is fetched and stored in `this._currentContentInfo`.
1479
+ * - `drmInitializationStatus` indicates that DRM matters are initialized.
1480
+ * - `mediaSourceStatus` indicates that the MediaSource is attached to the
1481
+ * `mediaElement`.
1482
+ *
1483
+ * In other cases, this method will do nothing.
1484
+ *
1485
+ * To call when any of those conditions might become `true`, to start-up
1486
+ * playback.
932
1487
  *
933
- * To call anytime either the Manifest is linked to new codecs or new means
934
- * to test for codec support are available.
935
- * @param {Object} manifest
1488
+ * @param {Object} parameters
1489
+ * @returns {boolean} - Returns `true` if all conditions where met for
1490
+ * playback start.
936
1491
  */
937
- MediaSourceContentInitializer.prototype._refreshManifestCodecSupport = function (manifest, mediaElement) {
938
- var codecsToTest = manifest.getCodecsWithUnknownSupport();
939
- var codecsSupportInfo = this.getCodecsSupportInfo(codecsToTest, mediaElement);
940
- if (codecsSupportInfo.length > 0) {
941
- try {
942
- manifest.updateCodecSupport(codecsSupportInfo);
943
- }
944
- catch (err) {
945
- this._onFatalError(err);
946
- }
1492
+ MediaSourceContentInitializer.prototype._startPlaybackIfReady = function (parameters) {
1493
+ var _this = this;
1494
+ if (this._currentContentInfo === null || this._currentContentInfo.manifest === null) {
1495
+ return false;
1496
+ }
1497
+ var drmInitStatus = parameters.drmInitializationStatus.getValue();
1498
+ if (drmInitStatus.initializationState.type !== "initialized") {
1499
+ return false;
1500
+ }
1501
+ var msInitStatus = parameters.mediaSourceStatus.getValue();
1502
+ if (msInitStatus !== 2 /* MediaSourceInitializationStatus.Attached */) {
1503
+ return false;
1504
+ }
1505
+ var _a = this._currentContentInfo, contentId = _a.contentId, manifest = _a.manifest;
1506
+ log_1.default.debug("Init", "Calculating initial time");
1507
+ var initialTime = (0, get_initial_time_1.default)(manifest, this._settings.lowLatencyMode, this._settings.startAt);
1508
+ log_1.default.debug("Init", "Initial time calculated", { initialTime: initialTime });
1509
+ var _b = this._settings.bufferOptions, enableFastSwitching = _b.enableFastSwitching, onCodecSwitch = _b.onCodecSwitch;
1510
+ var corePlaybackObserver = this._setUpModulesOnNewMediaSource({
1511
+ initialTime: initialTime,
1512
+ autoPlay: this._settings.autoPlay,
1513
+ mediaElement: parameters.mediaElement,
1514
+ textDisplayer: parameters.textDisplayer,
1515
+ playbackObserver: parameters.playbackObserver,
1516
+ }, this._currentMediaSourceCanceller.signal);
1517
+ if (this._currentMediaSourceCanceller.isUsed() || corePlaybackObserver === null) {
1518
+ return true;
947
1519
  }
1520
+ var initialObservation = corePlaybackObserver.getReference().getValue();
1521
+ var sentInitialObservation = (0, object_assign_1.default)(initialObservation, {
1522
+ position: initialObservation.position.serialize(),
1523
+ });
1524
+ this._settings.coreInterface.sendMessage({
1525
+ type: "start" /* MainThreadMessageType.StartPreparedContent */,
1526
+ contentId: contentId,
1527
+ value: {
1528
+ initialTime: initialTime,
1529
+ initialObservation: sentInitialObservation,
1530
+ drmSystemId: drmInitStatus.drmSystemId,
1531
+ enableFastSwitching: enableFastSwitching,
1532
+ onCodecSwitch: onCodecSwitch,
1533
+ },
1534
+ });
1535
+ corePlaybackObserver.listen(function (obs) {
1536
+ _this._settings.coreInterface.sendMessage({
1537
+ type: "observation" /* MainThreadMessageType.PlaybackObservation */,
1538
+ contentId: contentId,
1539
+ value: (0, object_assign_1.default)(obs, { position: obs.position.serialize() }),
1540
+ });
1541
+ }, {
1542
+ includeLastObservation: false,
1543
+ clearSignal: this._currentMediaSourceCanceller.signal,
1544
+ });
1545
+ this.trigger("manifestReady", manifest);
1546
+ return true;
948
1547
  };
949
- return MediaSourceContentInitializer;
950
- }(types_1.ContentInitializer));
951
- exports.default = MediaSourceContentInitializer;
952
- function createTextDisplayer(mediaElement, textTrackOptions) {
953
- if (textTrackOptions.textTrackMode === "html" && features_1.default.htmlTextDisplayer !== null) {
954
- return new features_1.default.htmlTextDisplayer(mediaElement, textTrackOptions.textTrackElement);
955
- }
956
- else if (features_1.default.nativeTextDisplayer !== null) {
957
- return new features_1.default.nativeTextDisplayer(mediaElement);
958
- }
959
- return null;
960
- }
961
- /**
962
- * Change the decipherability of Representations which have their key id in one
963
- * of the given Arrays:
964
- *
965
- * - Those who have a key id listed in `whitelistedKeyIds` will have their
966
- * decipherability updated to `true`
967
- *
968
- * - Those who have a key id listed in `blacklistedKeyIds` will have their
969
- * decipherability updated to `false`
970
- *
971
- * - Those who have a key id listed in `delistedKeyIds` will have their
972
- * decipherability updated to `undefined`.
973
- *
974
- * @param {Object} manifest
975
- * @param {Array.<Uint8Array>} whitelistedKeyIds
976
- * @param {Array.<Uint8Array>} blacklistedKeyIds
977
- * @param {Array.<Uint8Array>} delistedKeyIds
978
- */
979
- function updateKeyIdsDecipherabilityOnManifest(manifest, whitelistedKeyIds, blacklistedKeyIds, delistedKeyIds) {
980
- manifest.updateRepresentationsDeciperability(function (ctx) {
981
- var e_2, _a, e_3, _b, e_4, _c, e_5, _d;
982
- var representation = ctx.representation;
983
- if (representation.contentProtections === undefined) {
984
- return representation.decipherable;
1548
+ /**
1549
+ * Handles core messages asking to create a MediaSource.
1550
+ * @param {Object} msg - The core's message received.
1551
+ * @param {HTMLMediaElement} mediaElement - HTMLMediaElement on which the
1552
+ * content plays.
1553
+ * @param {Object} coreInterface - The interface to the core.
1554
+ */
1555
+ MediaSourceContentInitializer.prototype._onCreateMediaSourceMessage = function (msg, mediaElement, mediaSourceStatus, coreInterface) {
1556
+ var _this = this;
1557
+ var _a;
1558
+ if (((_a = this._currentContentInfo) === null || _a === void 0 ? void 0 : _a.contentId) !== msg.contentId) {
1559
+ log_1.default.info("Init", "Ignoring MediaSource attachment due to wrong `contentId`");
985
1560
  }
986
- var contentKIDs = representation.contentProtections.keyIds;
987
- if (contentKIDs !== undefined) {
1561
+ else {
1562
+ var mediaSourceId_1 = msg.mediaSourceId;
988
1563
  try {
989
- for (var contentKIDs_1 = __values(contentKIDs), contentKIDs_1_1 = contentKIDs_1.next(); !contentKIDs_1_1.done; contentKIDs_1_1 = contentKIDs_1.next()) {
990
- var elt = contentKIDs_1_1.value;
991
- try {
992
- for (var blacklistedKeyIds_1 = (e_3 = void 0, __values(blacklistedKeyIds)), blacklistedKeyIds_1_1 = blacklistedKeyIds_1.next(); !blacklistedKeyIds_1_1.done; blacklistedKeyIds_1_1 = blacklistedKeyIds_1.next()) {
993
- var blacklistedKeyId = blacklistedKeyIds_1_1.value;
994
- if ((0, are_arrays_of_numbers_equal_1.default)(blacklistedKeyId, elt)) {
995
- return false;
996
- }
997
- }
998
- }
999
- catch (e_3_1) { e_3 = { error: e_3_1 }; }
1000
- finally {
1001
- try {
1002
- if (blacklistedKeyIds_1_1 && !blacklistedKeyIds_1_1.done && (_b = blacklistedKeyIds_1.return)) _b.call(blacklistedKeyIds_1);
1003
- }
1004
- finally { if (e_3) throw e_3.error; }
1005
- }
1006
- try {
1007
- for (var whitelistedKeyIds_1 = (e_4 = void 0, __values(whitelistedKeyIds)), whitelistedKeyIds_1_1 = whitelistedKeyIds_1.next(); !whitelistedKeyIds_1_1.done; whitelistedKeyIds_1_1 = whitelistedKeyIds_1.next()) {
1008
- var whitelistedKeyId = whitelistedKeyIds_1_1.value;
1009
- if ((0, are_arrays_of_numbers_equal_1.default)(whitelistedKeyId, elt)) {
1010
- return true;
1011
- }
1012
- }
1564
+ mediaSourceStatus.onUpdate(function (currStatus, stopListening) {
1565
+ var _a;
1566
+ if (_this._currentContentInfo === null) {
1567
+ stopListening();
1568
+ return;
1013
1569
  }
1014
- catch (e_4_1) { e_4 = { error: e_4_1 }; }
1015
- finally {
1016
- try {
1017
- if (whitelistedKeyIds_1_1 && !whitelistedKeyIds_1_1.done && (_c = whitelistedKeyIds_1.return)) _c.call(whitelistedKeyIds_1);
1570
+ if (currStatus === 1 /* MediaSourceInitializationStatus.AttachNow */) {
1571
+ stopListening();
1572
+ var mediaSource_3 = new main_media_source_interface_1.default(mediaSourceId_1, "FORCED_MEDIA_SOURCE" in mediaElement
1573
+ ? mediaElement.FORCED_MEDIA_SOURCE
1574
+ : undefined);
1575
+ if (((_a = _this._currentContentInfo.mediaSourceInfo) === null || _a === void 0 ? void 0 : _a.type) === "main") {
1576
+ _this._currentContentInfo.mediaSourceInfo.mediaSource.dispose();
1018
1577
  }
1019
- finally { if (e_4) throw e_4.error; }
1020
- }
1021
- try {
1022
- for (var delistedKeyIds_1 = (e_5 = void 0, __values(delistedKeyIds)), delistedKeyIds_1_1 = delistedKeyIds_1.next(); !delistedKeyIds_1_1.done; delistedKeyIds_1_1 = delistedKeyIds_1.next()) {
1023
- var delistedKeyId = delistedKeyIds_1_1.value;
1024
- if ((0, are_arrays_of_numbers_equal_1.default)(delistedKeyId, elt)) {
1025
- return undefined;
1026
- }
1578
+ _this._currentContentInfo.mediaSourceInfo = {
1579
+ type: "main",
1580
+ mediaSource: mediaSource_3,
1581
+ };
1582
+ mediaSource_3.addEventListener("mediaSourceOpen", function () {
1583
+ coreInterface.sendMessage({
1584
+ type: "media-source-ready-state-change" /* MainThreadMessageType.MediaSourceReadyStateChange */,
1585
+ mediaSourceId: mediaSourceId_1,
1586
+ value: "open",
1587
+ });
1588
+ });
1589
+ mediaSource_3.addEventListener("mediaSourceEnded", function () {
1590
+ coreInterface.sendMessage({
1591
+ type: "media-source-ready-state-change" /* MainThreadMessageType.MediaSourceReadyStateChange */,
1592
+ mediaSourceId: mediaSourceId_1,
1593
+ value: "ended",
1594
+ });
1595
+ });
1596
+ mediaSource_3.addEventListener("mediaSourceClose", function () {
1597
+ coreInterface.sendMessage({
1598
+ type: "media-source-ready-state-change" /* MainThreadMessageType.MediaSourceReadyStateChange */,
1599
+ mediaSourceId: mediaSourceId_1,
1600
+ value: "closed",
1601
+ });
1602
+ });
1603
+ var url_1 = null;
1604
+ if (mediaSource_3.handle.type === "handle") {
1605
+ mediaElement.srcObject = mediaSource_3.handle.value;
1027
1606
  }
1028
- }
1029
- catch (e_5_1) { e_5 = { error: e_5_1 }; }
1030
- finally {
1031
- try {
1032
- if (delistedKeyIds_1_1 && !delistedKeyIds_1_1.done && (_d = delistedKeyIds_1.return)) _d.call(delistedKeyIds_1);
1607
+ else {
1608
+ url_1 = URL.createObjectURL(mediaSource_3.handle.value);
1609
+ mediaElement.src = url_1;
1033
1610
  }
1034
- finally { if (e_5) throw e_5.error; }
1611
+ _this._currentMediaSourceCanceller.signal.register(function () {
1612
+ mediaSource_3.dispose();
1613
+ (0, create_media_source_1.resetMediaElement)(mediaElement, url_1);
1614
+ });
1615
+ mediaSourceStatus.setValue(2 /* MediaSourceInitializationStatus.Attached */);
1616
+ (0, create_media_source_1.disableRemotePlaybackOnManagedMediaSource)(mediaElement, _this._currentMediaSourceCanceller.signal);
1035
1617
  }
1036
- }
1618
+ }, {
1619
+ emitCurrentValue: true,
1620
+ clearSignal: this._currentMediaSourceCanceller.signal,
1621
+ });
1037
1622
  }
1038
- catch (e_2_1) { e_2 = { error: e_2_1 }; }
1039
- finally {
1040
- try {
1041
- if (contentKIDs_1_1 && !contentKIDs_1_1.done && (_a = contentKIDs_1.return)) _a.call(contentKIDs_1);
1042
- }
1043
- finally { if (e_2) throw e_2.error; }
1623
+ catch (_err) {
1624
+ var error = new errors_1.OtherError("NONE", "Unknown error when creating the MediaSource");
1625
+ this._onFatalError(error);
1044
1626
  }
1045
1627
  }
1046
- return representation.decipherable;
1047
- });
1048
- }
1049
- /**
1050
- * Update decipherability to `false` to any Representation which is linked to
1051
- * the given initialization data.
1052
- * @param {Object} manifest
1053
- * @param {Object} initData
1054
- */
1055
- function blackListProtectionDataOnManifest(manifest, initData) {
1056
- manifest.updateRepresentationsDeciperability(function (ctx) {
1057
- var e_6, _a;
1058
- var _b, _c;
1059
- var rep = ctx.representation;
1060
- if (rep.decipherable === false) {
1061
- return false;
1628
+ };
1629
+ return MediaSourceContentInitializer;
1630
+ }(types_1.ContentInitializer));
1631
+ exports.default = MediaSourceContentInitializer;
1632
+ function bindNumberReferencesToCore(coreInterface, cancellationSignal) {
1633
+ var e_2, _a;
1634
+ var refs = [];
1635
+ for (var _i = 2; _i < arguments.length; _i++) {
1636
+ refs[_i - 2] = arguments[_i];
1637
+ }
1638
+ var _loop_1 = function (ref) {
1639
+ ref[0].onUpdate(function (newVal) {
1640
+ // NOTE: The TypeScript checks have already been made by this function's
1641
+ // overload, but the body here is not aware of that.
1642
+ coreInterface.sendMessage({
1643
+ type: "ref-update" /* MainThreadMessageType.ReferenceUpdate */,
1644
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-explicit-any
1645
+ value: { name: ref[1], newVal: newVal },
1646
+ });
1647
+ }, { clearSignal: cancellationSignal, emitCurrentValue: true });
1648
+ };
1649
+ try {
1650
+ for (var refs_1 = __values(refs), refs_1_1 = refs_1.next(); !refs_1_1.done; refs_1_1 = refs_1.next()) {
1651
+ var ref = refs_1_1.value;
1652
+ _loop_1(ref);
1062
1653
  }
1063
- var segmentProtections = (_c = (_b = rep.contentProtections) === null || _b === void 0 ? void 0 : _b.initData) !== null && _c !== void 0 ? _c : [];
1064
- var _loop_1 = function (protection) {
1065
- if (initData.type === undefined || protection.type === initData.type) {
1066
- var containedInitData = initData.values
1067
- .getFormattedValues()
1068
- .every(function (undecipherableVal) {
1069
- return protection.values.some(function (currVal) {
1070
- return ((undecipherableVal.systemId === undefined ||
1071
- currVal.systemId === undecipherableVal.systemId) &&
1072
- (0, are_arrays_of_numbers_equal_1.default)(currVal.data, undecipherableVal.data));
1073
- });
1074
- });
1075
- if (containedInitData) {
1076
- return { value: false };
1077
- }
1078
- }
1079
- };
1654
+ }
1655
+ catch (e_2_1) { e_2 = { error: e_2_1 }; }
1656
+ finally {
1080
1657
  try {
1081
- for (var segmentProtections_1 = __values(segmentProtections), segmentProtections_1_1 = segmentProtections_1.next(); !segmentProtections_1_1.done; segmentProtections_1_1 = segmentProtections_1.next()) {
1082
- var protection = segmentProtections_1_1.value;
1083
- var state_1 = _loop_1(protection);
1084
- if (typeof state_1 === "object")
1085
- return state_1.value;
1086
- }
1658
+ if (refs_1_1 && !refs_1_1.done && (_a = refs_1.return)) _a.call(refs_1);
1087
1659
  }
1088
- catch (e_6_1) { e_6 = { error: e_6_1 }; }
1089
- finally {
1090
- try {
1091
- if (segmentProtections_1_1 && !segmentProtections_1_1.done && (_a = segmentProtections_1.return)) _a.call(segmentProtections_1);
1092
- }
1093
- finally { if (e_6) throw e_6.error; }
1094
- }
1095
- return rep.decipherable;
1096
- });
1660
+ finally { if (e_2) throw e_2.error; }
1661
+ }
1662
+ }
1663
+ function formatCoreError(sentError) {
1664
+ switch (sentError.name) {
1665
+ case "NetworkError":
1666
+ return new errors_1.NetworkError(sentError.code, new request_1.RequestError(sentError.baseError.url, sentError.baseError.status, sentError.baseError.type));
1667
+ case "MediaError":
1668
+ // eslint-disable-next-line
1669
+ return new errors_1.MediaError(sentError.code, sentError.reason, {
1670
+ tracks: sentError.tracks,
1671
+ });
1672
+ case "EncryptedMediaError":
1673
+ // We assume that everything have already been checked Worker-side here
1674
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-argument
1675
+ return new errors_1.EncryptedMediaError(sentError.code, sentError.reason, {
1676
+ keyStatuses: sentError.keyStatuses,
1677
+ keySystemConfiguration: sentError.keySystemConfiguration,
1678
+ keySystem: sentError.keySystem,
1679
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
1680
+ });
1681
+ case "OtherError":
1682
+ return new errors_1.OtherError(sentError.code, sentError.reason);
1683
+ }
1684
+ }
1685
+ function formatSourceBufferError(error) {
1686
+ if (error instanceof errors_1.SourceBufferError) {
1687
+ return error;
1688
+ }
1689
+ else if (error instanceof Error) {
1690
+ return new errors_1.SourceBufferError(error.name, error.message, error.name === "QuotaExceededError");
1691
+ }
1692
+ else {
1693
+ return new errors_1.SourceBufferError("Error", "Unknown SourceBufferError Error", false);
1694
+ }
1097
1695
  }
1098
1696
  /**
1099
- * Handle accordingly an `IFreezeResolution` object.
1100
- * @param {Object|null} freezeResolution - The `IFreezeResolution` suggested.
1101
- * @param {Object} param - Parameters that might be needed to implement the
1102
- * resolution.
1103
- * @param {Object} param.manifest - The current content's Manifest object.
1104
- * @param {Object} param.playbackObserver - Object regularly emitting playback
1105
- * conditions.
1106
- * @param {Function} param.triggerReload - Function to call if we need to ask
1107
- * for a "MediaSource reload".
1108
- * @param {Boolean} param.enableRepresentationAvoidance - If `true`, this
1109
- * function is authorized to mark `Representation` as "to avoid" if the
1110
- * `IFreezeResolution` object suggest it.
1697
+ * The Core might send back logs. In that situation, the message might be
1698
+ * formatted slightly differently to be able to cross threads (so a
1699
+ * serializable format has to be sent).
1700
+ *
1701
+ * This function translates that Core format to what's expected by the
1702
+ * logger.
1703
+ *
1704
+ * @param {*} arg
1705
+ * @returns {*}
1111
1706
  */
1112
- function handleFreezeResolution(freezeResolution, _a) {
1113
- var playbackObserver = _a.playbackObserver, enableRepresentationAvoidance = _a.enableRepresentationAvoidance, manifest = _a.manifest, triggerReload = _a.triggerReload;
1114
- switch (freezeResolution.type) {
1115
- case "reload": {
1116
- log_1.default.info("Init", "Planning reload due to freeze");
1117
- triggerReload();
1118
- break;
1119
- }
1120
- case "flush": {
1121
- log_1.default.info("Init", "Flushing buffer due to freeze");
1122
- var observation = playbackObserver.getReference().getValue();
1123
- var currentTime = observation.position.isAwaitingFuturePosition()
1124
- ? observation.position.getWanted()
1125
- : playbackObserver.getCurrentTime();
1126
- var relativeResumingPosition = freezeResolution.value.relativeSeek;
1127
- var wantedSeekingTime = currentTime + relativeResumingPosition;
1128
- playbackObserver.setCurrentTime(wantedSeekingTime);
1129
- break;
1130
- }
1131
- case "avoid-representations": {
1132
- var contents = freezeResolution.value;
1133
- if (enableRepresentationAvoidance) {
1134
- manifest.addRepresentationsToAvoid(contents);
1135
- }
1136
- triggerReload();
1137
- break;
1138
- }
1139
- default:
1140
- (0, assert_1.assertUnreachable)(freezeResolution);
1707
+ function formatSentLogObject(arg) {
1708
+ if (typeof arg !== "object") {
1709
+ return arg;
1710
+ }
1711
+ if ((arg === null || arg === void 0 ? void 0 : arg.isSerializedError) === true) {
1712
+ return formatCoreError(arg);
1141
1713
  }
1714
+ return arg;
1142
1715
  }