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,1559 +0,0 @@
1
- import getEmeApiImplementation from "../../compat/eme";
2
- import mayMediaElementFailOnUndecipherableData from "../../compat/may_media_element_fail_on_undecipherable_data";
3
- import shouldReloadMediaSourceOnDecipherabilityUpdate from "../../compat/should_reload_media_source_on_decipherability_update";
4
- import { EncryptedMediaError, MediaError, NetworkError, OtherError, SourceBufferError, } from "../../errors";
5
- import features from "../../features";
6
- import log from "../../log";
7
- import { replicateUpdatesOnManifestMetadata, updateDecipherabilityFromKeyIds, updateDecipherabilityFromProtectionData, } from "../../manifest";
8
- import MainMediaSourceInterface from "../../mse/main_media_source_interface";
9
- import arrayFind from "../../utils/array_find";
10
- import assert, { assertUnreachable } from "../../utils/assert";
11
- import idGenerator from "../../utils/id_generator";
12
- import isNullOrUndefined from "../../utils/is_null_or_undefined";
13
- import objectAssign from "../../utils/object_assign";
14
- import SharedReference from "../../utils/reference";
15
- import { RequestError } from "../../utils/request";
16
- import TaskCanceller, { CancellationError } from "../../utils/task_canceller";
17
- import { ContentDecryptorState, getKeySystemConfiguration } from "../decrypt";
18
- import sendMessage from "./send_message";
19
- import { ContentInitializer } from "./types";
20
- import createCorePlaybackObserver from "./utils/create_core_playback_observer";
21
- import { resetMediaElement, disableRemotePlaybackOnManagedMediaSource, } from "./utils/create_media_source";
22
- import getInitialTime from "./utils/get_initial_time";
23
- import getLoadedReference from "./utils/get_loaded_reference";
24
- import performInitialSeekAndPlay from "./utils/initial_seek_and_play";
25
- import RebufferingController from "./utils/rebuffering_controller";
26
- import StreamEventsEmitter from "./utils/stream_events_emitter/stream_events_emitter";
27
- import listenToMediaError from "./utils/throw_on_media_error";
28
- import { updateManifestCodecSupport } from "./utils/update_manifest_codec_support";
29
- const generateContentId = idGenerator();
30
- /**
31
- * @class MultiThreadContentInitializer
32
- */
33
- export default class MultiThreadContentInitializer extends ContentInitializer {
34
- /**
35
- * Create a new `MultiThreadContentInitializer`, associated to the given
36
- * settings.
37
- * @param {Object} settings
38
- */
39
- constructor(settings) {
40
- super();
41
- this._settings = settings;
42
- this._initCanceller = new TaskCanceller();
43
- this._currentMediaSourceCanceller = new TaskCanceller();
44
- this._currentMediaSourceCanceller.linkToSignal(this._initCanceller.signal);
45
- this._currentContentInfo = null;
46
- this._awaitingRequests = {
47
- nextRequestId: 0,
48
- pendingSinkMetrics: new Map(),
49
- pendingThumbnailFetching: new Map(),
50
- };
51
- this._queuedWorkerMessages = null;
52
- }
53
- /**
54
- * Perform non-destructive preparation steps, to prepare a future content.
55
- */
56
- prepare() {
57
- var _a, _b;
58
- if (this._currentContentInfo !== null || this._initCanceller.isUsed()) {
59
- return;
60
- }
61
- const contentId = generateContentId();
62
- const { adaptiveOptions, transportOptions, useMseInWorker, worker } = this._settings;
63
- const { wantedBufferAhead, maxVideoBufferSize, maxBufferAhead, maxBufferBehind } = this._settings.bufferOptions;
64
- const initialVideoBitrate = adaptiveOptions.initialBitrates.video;
65
- const initialAudioBitrate = adaptiveOptions.initialBitrates.audio;
66
- this._currentContentInfo = {
67
- contentId,
68
- contentDecryptor: null,
69
- manifest: null,
70
- mediaSourceInfo: null,
71
- rebufferingController: null,
72
- streamEventsEmitter: null,
73
- initialTime: undefined,
74
- autoPlay: undefined,
75
- initialPlayPerformed: null,
76
- useMseInWorker,
77
- };
78
- sendMessage(worker, {
79
- type: "prepare" /* MainThreadMessageType.PrepareContent */,
80
- value: {
81
- contentId,
82
- cmcd: this._settings.cmcd,
83
- enableRepresentationAvoidance: this._settings.enableRepresentationAvoidance,
84
- url: this._settings.url,
85
- hasText: this._hasTextBufferFeature(),
86
- transportOptions,
87
- initialVideoBitrate,
88
- initialAudioBitrate,
89
- manifestRetryOptions: Object.assign(Object.assign({}, this._settings.manifestRequestSettings), { lowLatencyMode: this._settings.lowLatencyMode }),
90
- segmentRetryOptions: this._settings.segmentRequestOptions,
91
- useMseInWorker,
92
- },
93
- });
94
- this._initCanceller.signal.register(() => {
95
- sendMessage(worker, {
96
- type: "stop" /* MainThreadMessageType.StopContent */,
97
- contentId,
98
- value: null,
99
- });
100
- });
101
- if (this._initCanceller.isUsed()) {
102
- return;
103
- }
104
- this._queuedWorkerMessages = [];
105
- log.debug("Init", "addEventListener prepare buffering worker messages");
106
- const onmessage = (evt) => {
107
- const msgData = evt.data;
108
- const type = msgData.type;
109
- switch (type) {
110
- case "log" /* WorkerMessageType.LogMessage */: {
111
- const formatted = msgData.value.logs.map((l) => {
112
- switch (typeof l) {
113
- case "string":
114
- case "number":
115
- case "boolean":
116
- case "undefined":
117
- return l;
118
- case "object":
119
- if (l === null) {
120
- return null;
121
- }
122
- return formatSentLogObject(l);
123
- default:
124
- assertUnreachable(l);
125
- }
126
- });
127
- switch (msgData.value.logLevel) {
128
- case "NONE":
129
- break;
130
- case "ERROR":
131
- log.error(msgData.value.namespace, ...formatted);
132
- break;
133
- case "WARNING":
134
- log.warn(msgData.value.namespace, ...formatted);
135
- break;
136
- case "INFO":
137
- log.info(msgData.value.namespace, ...formatted);
138
- break;
139
- case "DEBUG":
140
- log.debug(msgData.value.namespace, ...formatted);
141
- break;
142
- default:
143
- assertUnreachable(msgData.value.logLevel);
144
- }
145
- break;
146
- }
147
- default:
148
- if (this._queuedWorkerMessages !== null) {
149
- this._queuedWorkerMessages.push(evt);
150
- }
151
- break;
152
- }
153
- };
154
- this._settings.worker.addEventListener("message", onmessage);
155
- const onmessageerror = (_msg) => {
156
- log.error("Init", "Error when receiving message from worker.");
157
- };
158
- this._settings.worker.addEventListener("messageerror", onmessageerror);
159
- this._initCanceller.signal.register(() => {
160
- log.debug("Init", "removeEventListener prepare for worker message");
161
- this._settings.worker.removeEventListener("message", onmessage);
162
- this._settings.worker.removeEventListener("messageerror", onmessageerror);
163
- });
164
- // Also bind all `SharedReference` objects:
165
- const throttleVideoBitrate = (_a = adaptiveOptions.throttlers.throttleBitrate.video) !== null && _a !== void 0 ? _a : new SharedReference(Infinity);
166
- bindNumberReferencesToWorker(worker, this._initCanceller.signal, [wantedBufferAhead, "wantedBufferAhead"], [maxVideoBufferSize, "maxVideoBufferSize"], [maxBufferAhead, "maxBufferAhead"], [maxBufferBehind, "maxBufferBehind"], [throttleVideoBitrate, "throttleVideoBitrate"]);
167
- const limitVideoResolution = (_b = adaptiveOptions.throttlers.limitResolution.video) !== null && _b !== void 0 ? _b : new SharedReference({
168
- height: undefined,
169
- width: undefined,
170
- pixelRatio: 1,
171
- });
172
- limitVideoResolution.onUpdate((newVal) => {
173
- sendMessage(worker, {
174
- type: "ref-update" /* MainThreadMessageType.ReferenceUpdate */,
175
- value: { name: "limitVideoResolution", newVal },
176
- });
177
- }, { clearSignal: this._initCanceller.signal, emitCurrentValue: true });
178
- }
179
- /**
180
- * Update URL of the Manifest.
181
- * @param {Array.<string>|undefined} urls - URLs to reach that Manifest from
182
- * the most prioritized URL to the least prioritized URL.
183
- * @param {boolean} refreshNow - If `true` the resource in question (e.g.
184
- * DASH's MPD) will be refreshed immediately.
185
- */
186
- updateContentUrls(urls, refreshNow) {
187
- if (this._currentContentInfo === null) {
188
- return;
189
- }
190
- sendMessage(this._settings.worker, {
191
- type: "urls-update" /* MainThreadMessageType.ContentUrlsUpdate */,
192
- contentId: this._currentContentInfo.contentId,
193
- value: { urls, refreshNow },
194
- });
195
- }
196
- /**
197
- * @param {HTMLMediaElement} mediaElement
198
- * @param {Object} playbackObserver
199
- */
200
- start(mediaElement, playbackObserver) {
201
- this.prepare(); // Load Manifest if not already done
202
- if (this._initCanceller.isUsed()) {
203
- return;
204
- }
205
- let textDisplayer = null;
206
- if (this._settings.textTrackOptions.textTrackMode === "html" &&
207
- features.htmlTextDisplayer !== null) {
208
- assert(this._hasTextBufferFeature());
209
- textDisplayer = new features.htmlTextDisplayer(mediaElement, this._settings.textTrackOptions.textTrackElement);
210
- }
211
- else if (features.nativeTextDisplayer !== null) {
212
- assert(this._hasTextBufferFeature());
213
- textDisplayer = new features.nativeTextDisplayer(mediaElement);
214
- }
215
- else {
216
- assert(!this._hasTextBufferFeature());
217
- }
218
- this._initCanceller.signal.register(() => {
219
- textDisplayer === null || textDisplayer === void 0 ? void 0 : textDisplayer.stop();
220
- });
221
- /** Translate errors coming from the media element into RxPlayer errors. */
222
- listenToMediaError(mediaElement, (error) => this._onFatalError(error), this._initCanceller.signal);
223
- /**
224
- * Send content protection initialization data.
225
- * TODO remove and use ContentDecryptor directly when possible.
226
- */
227
- const lastContentProtection = new SharedReference(null);
228
- const mediaSourceStatus = new SharedReference(0 /* MediaSourceInitializationStatus.Nothing */);
229
- const { statusRef: drmInitializationStatus, contentDecryptor } = this._initializeContentDecryption(mediaElement, lastContentProtection, mediaSourceStatus, () => notifyAndStartMediaSourceReload(0, undefined, undefined), this._initCanceller.signal);
230
- const contentInfo = this._currentContentInfo;
231
- if (contentInfo !== null) {
232
- contentInfo.contentDecryptor = contentDecryptor;
233
- }
234
- const playbackStartParams = {
235
- mediaElement,
236
- textDisplayer,
237
- playbackObserver,
238
- drmInitializationStatus,
239
- mediaSourceStatus,
240
- };
241
- mediaSourceStatus.onUpdate((msInitStatus, stopListeningMSStatus) => {
242
- if (msInitStatus === 2 /* MediaSourceInitializationStatus.Attached */) {
243
- stopListeningMSStatus();
244
- this._startPlaybackIfReady(playbackStartParams);
245
- }
246
- }, { clearSignal: this._initCanceller.signal, emitCurrentValue: true });
247
- drmInitializationStatus.onUpdate((initializationStatus, stopListeningDrm) => {
248
- if (initializationStatus.initializationState.type === "initialized") {
249
- stopListeningDrm();
250
- this._startPlaybackIfReady(playbackStartParams);
251
- }
252
- }, { emitCurrentValue: true, clearSignal: this._initCanceller.signal });
253
- /**
254
- * Reset directly (synchronously) the current `MediaSource` and signal to
255
- * the core that we did so.
256
- * @param {number} deltaPosition - Position you want to seek to after
257
- * reloading, as a delta in seconds from the last polled playing position.
258
- * @param {number|undefined} minimumPosition - If set, minimum time bound
259
- * in seconds after `deltaPosition` has been applied.
260
- * @param {number|undefined} maximumPosition - If set, minimum time bound
261
- * in seconds after `deltaPosition` has been applied.
262
- */
263
- const notifyAndStartMediaSourceReload = (deltaPosition, minimumPosition, maximumPosition) => {
264
- const reloadingContentInfo = this._currentContentInfo;
265
- if (reloadingContentInfo === null) {
266
- log.warn("Init", "Asked to reload when no content is loaded.");
267
- return;
268
- }
269
- if (reloadingContentInfo === null ||
270
- reloadingContentInfo.mediaSourceInfo === null) {
271
- log.warn("Init", "Asked to reload when no MediaSource is active.");
272
- return;
273
- }
274
- const mediaSourceId = reloadingContentInfo.mediaSourceInfo.type === "main"
275
- ? reloadingContentInfo.mediaSourceInfo.mediaSource.id
276
- : reloadingContentInfo.mediaSourceInfo.mediaSourceId;
277
- sendMessage(this._settings.worker, {
278
- type: "ms-reload" /* MainThreadMessageType.MediaSourceReload */,
279
- mediaSourceId,
280
- value: null,
281
- });
282
- reloadMediaSource(deltaPosition, minimumPosition, maximumPosition);
283
- };
284
- /**
285
- * Reset directly (synchronously) the current `MediaSource`.
286
- *
287
- * It is assumed that `core` already knows about this action. If not, call
288
- * `notifyAndStartMediaSourceReload` instead.
289
- * @param {number} deltaPosition - Position you want to seek to after
290
- * reloading, as a delta in seconds from the last polled playing position.
291
- * @param {number|undefined} minimumPosition - If set, minimum time bound
292
- * in seconds after `deltaPosition` has been applied.
293
- * @param {number|undefined} maximumPosition - If set, minimum time bound
294
- * in seconds after `deltaPosition` has been applied.
295
- */
296
- const reloadMediaSource = (deltaPosition, minimumPosition, maximumPosition) => {
297
- var _a;
298
- const reloadingContentInfo = this._currentContentInfo;
299
- if (reloadingContentInfo === null) {
300
- log.warn("Init", "Asked to reload when no content is loaded.");
301
- return;
302
- }
303
- const lastObservation = playbackObserver.getReference().getValue();
304
- const currentPosition = lastObservation.position.getWanted();
305
- const isPaused = ((_a = reloadingContentInfo.initialPlayPerformed) === null || _a === void 0 ? void 0 : _a.getValue()) === true ||
306
- reloadingContentInfo.autoPlay === undefined
307
- ? lastObservation.paused
308
- : !reloadingContentInfo.autoPlay;
309
- let position = currentPosition + deltaPosition;
310
- if (minimumPosition !== undefined) {
311
- position = Math.max(minimumPosition, position);
312
- }
313
- if (maximumPosition !== undefined) {
314
- position = Math.min(maximumPosition, position);
315
- }
316
- this._reload(mediaElement, textDisplayer, playbackObserver, mediaSourceStatus, position, !isPaused);
317
- };
318
- const onmessage = (msg) => {
319
- 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;
320
- const msgData = msg.data;
321
- switch (msgData.type) {
322
- case "attach-media-source" /* WorkerMessageType.AttachMediaSource */: {
323
- if (((_a = this._currentContentInfo) === null || _a === void 0 ? void 0 : _a.contentId) !== msgData.contentId) {
324
- return;
325
- }
326
- if (this._currentContentInfo !== null) {
327
- if (((_b = this._currentContentInfo.mediaSourceInfo) === null || _b === void 0 ? void 0 : _b.type) === "main") {
328
- this._currentContentInfo.mediaSourceInfo.mediaSource.dispose();
329
- }
330
- this._currentContentInfo.mediaSourceInfo = {
331
- type: "core",
332
- mediaSourceId: msgData.mediaSourceId,
333
- };
334
- }
335
- const mediaSourceLink = msgData.value;
336
- mediaSourceStatus.onUpdate((currStatus, stopListening) => {
337
- if (currStatus === 1 /* MediaSourceInitializationStatus.AttachNow */) {
338
- stopListening();
339
- log.info("media", "Attaching MediaSource URL to the media element");
340
- if (mediaSourceLink.type === "handle") {
341
- mediaElement.srcObject = mediaSourceLink.value;
342
- this._currentMediaSourceCanceller.signal.register(() => {
343
- mediaElement.srcObject = null;
344
- });
345
- }
346
- else {
347
- mediaElement.src = mediaSourceLink.value;
348
- this._currentMediaSourceCanceller.signal.register(() => {
349
- resetMediaElement(mediaElement, mediaSourceLink.value);
350
- });
351
- }
352
- disableRemotePlaybackOnManagedMediaSource(mediaElement, this._currentMediaSourceCanceller.signal);
353
- mediaSourceStatus.setValue(2 /* MediaSourceInitializationStatus.Attached */);
354
- }
355
- }, { emitCurrentValue: true, clearSignal: this._initCanceller.signal });
356
- break;
357
- }
358
- case "warning" /* WorkerMessageType.Warning */:
359
- if (((_c = this._currentContentInfo) === null || _c === void 0 ? void 0 : _c.contentId) !== msgData.contentId) {
360
- return;
361
- }
362
- this.trigger("warning", formatWorkerError(msgData.value));
363
- break;
364
- case "error" /* WorkerMessageType.Error */:
365
- if (((_d = this._currentContentInfo) === null || _d === void 0 ? void 0 : _d.contentId) !== msgData.contentId) {
366
- return;
367
- }
368
- this._onFatalError(formatWorkerError(msgData.value));
369
- break;
370
- case "create-media-source" /* WorkerMessageType.CreateMediaSource */:
371
- this._onCreateMediaSourceMessage(msgData, mediaElement, mediaSourceStatus, this._settings.worker);
372
- break;
373
- case "add-source-buffer" /* WorkerMessageType.AddSourceBuffer */:
374
- {
375
- if (((_f = (_e = this._currentContentInfo) === null || _e === void 0 ? void 0 : _e.mediaSourceInfo) === null || _f === void 0 ? void 0 : _f.type) !== "main" ||
376
- this._currentContentInfo.mediaSourceInfo.mediaSource.id !==
377
- msgData.mediaSourceId) {
378
- return;
379
- }
380
- const { mediaSource } = this._currentContentInfo.mediaSourceInfo;
381
- mediaSource.addSourceBuffer(msgData.value.sourceBufferType, msgData.value.codec);
382
- }
383
- break;
384
- case "source-buffer-append" /* WorkerMessageType.SourceBufferAppend */:
385
- {
386
- if (((_h = (_g = this._currentContentInfo) === null || _g === void 0 ? void 0 : _g.mediaSourceInfo) === null || _h === void 0 ? void 0 : _h.type) !== "main" ||
387
- this._currentContentInfo.mediaSourceInfo.mediaSource.id !==
388
- msgData.mediaSourceId) {
389
- return;
390
- }
391
- const { mediaSource } = this._currentContentInfo.mediaSourceInfo;
392
- const sourceBuffer = arrayFind(mediaSource.sourceBuffers, (s) => s.type === msgData.sourceBufferType);
393
- if (sourceBuffer === undefined) {
394
- return;
395
- }
396
- sourceBuffer
397
- .appendBuffer(msgData.value.data, msgData.value.params)
398
- .then((buffered) => {
399
- sendMessage(this._settings.worker, {
400
- type: "sb-success" /* MainThreadMessageType.SourceBufferSuccess */,
401
- mediaSourceId: mediaSource.id,
402
- sourceBufferType: sourceBuffer.type,
403
- operationId: msgData.operationId,
404
- value: { buffered },
405
- });
406
- })
407
- .catch((error) => {
408
- sendMessage(this._settings.worker, {
409
- type: "sb-error" /* MainThreadMessageType.SourceBufferError */,
410
- mediaSourceId: mediaSource.id,
411
- sourceBufferType: sourceBuffer.type,
412
- operationId: msgData.operationId,
413
- value: error instanceof CancellationError
414
- ? { errorName: "CancellationError" }
415
- : formatSourceBufferError(error).serialize(),
416
- });
417
- });
418
- }
419
- break;
420
- case "source-buffer-remove" /* WorkerMessageType.SourceBufferRemove */:
421
- {
422
- if (((_k = (_j = this._currentContentInfo) === null || _j === void 0 ? void 0 : _j.mediaSourceInfo) === null || _k === void 0 ? void 0 : _k.type) !== "main" ||
423
- this._currentContentInfo.mediaSourceInfo.mediaSource.id !==
424
- msgData.mediaSourceId) {
425
- return;
426
- }
427
- const { mediaSource } = this._currentContentInfo.mediaSourceInfo;
428
- const sourceBuffer = arrayFind(mediaSource.sourceBuffers, (s) => s.type === msgData.sourceBufferType);
429
- if (sourceBuffer === undefined) {
430
- return;
431
- }
432
- sourceBuffer
433
- .remove(msgData.value.start, msgData.value.end)
434
- .then((buffered) => {
435
- sendMessage(this._settings.worker, {
436
- type: "sb-success" /* MainThreadMessageType.SourceBufferSuccess */,
437
- mediaSourceId: mediaSource.id,
438
- sourceBufferType: sourceBuffer.type,
439
- operationId: msgData.operationId,
440
- value: { buffered },
441
- });
442
- })
443
- .catch((error) => {
444
- sendMessage(this._settings.worker, {
445
- type: "sb-error" /* MainThreadMessageType.SourceBufferError */,
446
- mediaSourceId: mediaSource.id,
447
- sourceBufferType: sourceBuffer.type,
448
- operationId: msgData.operationId,
449
- value: error instanceof CancellationError
450
- ? { errorName: "CancellationError" }
451
- : formatSourceBufferError(error).serialize(),
452
- });
453
- });
454
- }
455
- break;
456
- case "abort-source-buffer" /* WorkerMessageType.AbortSourceBuffer */:
457
- {
458
- if (((_m = (_l = this._currentContentInfo) === null || _l === void 0 ? void 0 : _l.mediaSourceInfo) === null || _m === void 0 ? void 0 : _m.type) !== "main" ||
459
- this._currentContentInfo.mediaSourceInfo.mediaSource.id !==
460
- msgData.mediaSourceId) {
461
- return;
462
- }
463
- const { mediaSource } = this._currentContentInfo.mediaSourceInfo;
464
- const sourceBuffer = arrayFind(mediaSource.sourceBuffers, (s) => s.type === msgData.sourceBufferType);
465
- if (sourceBuffer === undefined) {
466
- return;
467
- }
468
- sourceBuffer.abort();
469
- }
470
- break;
471
- case "update-media-source-duration" /* WorkerMessageType.UpdateMediaSourceDuration */:
472
- {
473
- if (((_p = (_o = this._currentContentInfo) === null || _o === void 0 ? void 0 : _o.mediaSourceInfo) === null || _p === void 0 ? void 0 : _p.type) !== "main" ||
474
- this._currentContentInfo.mediaSourceInfo.mediaSource.id !==
475
- msgData.mediaSourceId) {
476
- return;
477
- }
478
- const { mediaSource } = this._currentContentInfo.mediaSourceInfo;
479
- if ((mediaSource === null || mediaSource === void 0 ? void 0 : mediaSource.id) !== msgData.mediaSourceId) {
480
- return;
481
- }
482
- mediaSource.setDuration(msgData.value.duration, msgData.value.isRealEndKnown);
483
- }
484
- break;
485
- case "stop-media-source-duration" /* WorkerMessageType.InterruptMediaSourceDurationUpdate */:
486
- {
487
- if (((_r = (_q = this._currentContentInfo) === null || _q === void 0 ? void 0 : _q.mediaSourceInfo) === null || _r === void 0 ? void 0 : _r.type) !== "main" ||
488
- this._currentContentInfo.mediaSourceInfo.mediaSource.id !==
489
- msgData.mediaSourceId) {
490
- return;
491
- }
492
- const { mediaSource } = this._currentContentInfo.mediaSourceInfo;
493
- if ((mediaSource === null || mediaSource === void 0 ? void 0 : mediaSource.id) !== msgData.mediaSourceId) {
494
- return;
495
- }
496
- mediaSource.interruptDurationSetting();
497
- }
498
- break;
499
- case "end-of-stream" /* WorkerMessageType.EndOfStream */:
500
- {
501
- if (((_t = (_s = this._currentContentInfo) === null || _s === void 0 ? void 0 : _s.mediaSourceInfo) === null || _t === void 0 ? void 0 : _t.type) !== "main" ||
502
- this._currentContentInfo.mediaSourceInfo.mediaSource.id !==
503
- msgData.mediaSourceId) {
504
- return;
505
- }
506
- const { mediaSource } = this._currentContentInfo.mediaSourceInfo;
507
- mediaSource.maintainEndOfStream();
508
- }
509
- break;
510
- case "stop-end-of-stream" /* WorkerMessageType.InterruptEndOfStream */:
511
- {
512
- if (((_v = (_u = this._currentContentInfo) === null || _u === void 0 ? void 0 : _u.mediaSourceInfo) === null || _v === void 0 ? void 0 : _v.type) !== "main" ||
513
- this._currentContentInfo.mediaSourceInfo.mediaSource.id !==
514
- msgData.mediaSourceId) {
515
- return;
516
- }
517
- const { mediaSource } = this._currentContentInfo.mediaSourceInfo;
518
- mediaSource.stopEndOfStream();
519
- }
520
- break;
521
- case "dispose-media-source" /* WorkerMessageType.DisposeMediaSource */:
522
- {
523
- if (((_x = (_w = this._currentContentInfo) === null || _w === void 0 ? void 0 : _w.mediaSourceInfo) === null || _x === void 0 ? void 0 : _x.type) !== "main" ||
524
- this._currentContentInfo.mediaSourceInfo.mediaSource.id !==
525
- msgData.mediaSourceId) {
526
- return;
527
- }
528
- const { mediaSource } = this._currentContentInfo.mediaSourceInfo;
529
- mediaSource.dispose();
530
- }
531
- break;
532
- case "needs-buffer-flush" /* WorkerMessageType.NeedsBufferFlush */: {
533
- if (((_y = this._currentContentInfo) === null || _y === void 0 ? void 0 : _y.contentId) !== msgData.contentId) {
534
- return;
535
- }
536
- const lastObservation = playbackObserver.getReference().getValue();
537
- const currentTime = lastObservation.position.isAwaitingFuturePosition()
538
- ? lastObservation.position.getWanted()
539
- : mediaElement.currentTime;
540
- const relativeResumingPosition = (_0 = (_z = msgData.value) === null || _z === void 0 ? void 0 : _z.relativeResumingPosition) !== null && _0 !== void 0 ? _0 : 0;
541
- const canBeApproximateSeek = Boolean((_1 = msgData.value) === null || _1 === void 0 ? void 0 : _1.relativePosHasBeenDefaulted);
542
- let wantedSeekingTime;
543
- if (relativeResumingPosition === 0 && canBeApproximateSeek) {
544
- // in case relativeResumingPosition is 0, we still perform
545
- // a tiny seek to be sure that the browser will correclty reload the video.
546
- wantedSeekingTime = currentTime + 0.001;
547
- }
548
- else {
549
- wantedSeekingTime = currentTime + relativeResumingPosition;
550
- }
551
- playbackObserver.setCurrentTime(wantedSeekingTime);
552
- break;
553
- }
554
- case "active-period-changed" /* WorkerMessageType.ActivePeriodChanged */: {
555
- if (((_2 = this._currentContentInfo) === null || _2 === void 0 ? void 0 : _2.contentId) !== msgData.contentId ||
556
- this._currentContentInfo.manifest === null) {
557
- return;
558
- }
559
- const period = arrayFind(this._currentContentInfo.manifest.periods, (p) => p.id === msgData.value.periodId);
560
- if (period !== undefined) {
561
- this.trigger("activePeriodChanged", { period });
562
- }
563
- break;
564
- }
565
- case "adaptation-changed" /* WorkerMessageType.AdaptationChanged */: {
566
- if (((_3 = this._currentContentInfo) === null || _3 === void 0 ? void 0 : _3.contentId) !== msgData.contentId ||
567
- this._currentContentInfo.manifest === null) {
568
- return;
569
- }
570
- const period = arrayFind(this._currentContentInfo.manifest.periods, (p) => p.id === msgData.value.periodId);
571
- if (period === undefined) {
572
- return;
573
- }
574
- if (msgData.value.adaptationId === null) {
575
- this.trigger("adaptationChange", {
576
- period,
577
- adaptation: null,
578
- type: msgData.value.type,
579
- });
580
- return;
581
- }
582
- const adaptations = (_4 = period.adaptations[msgData.value.type]) !== null && _4 !== void 0 ? _4 : [];
583
- const adaptation = arrayFind(adaptations, (a) => a.id === msgData.value.adaptationId);
584
- if (adaptation !== undefined) {
585
- this.trigger("adaptationChange", {
586
- period,
587
- adaptation,
588
- type: msgData.value.type,
589
- });
590
- }
591
- break;
592
- }
593
- case "representation-changed" /* WorkerMessageType.RepresentationChanged */: {
594
- if (((_5 = this._currentContentInfo) === null || _5 === void 0 ? void 0 : _5.contentId) !== msgData.contentId ||
595
- this._currentContentInfo.manifest === null) {
596
- return;
597
- }
598
- const period = arrayFind(this._currentContentInfo.manifest.periods, (p) => p.id === msgData.value.periodId);
599
- if (period === undefined) {
600
- return;
601
- }
602
- if (msgData.value.representationId === null) {
603
- this.trigger("representationChange", {
604
- period,
605
- type: msgData.value.type,
606
- representation: null,
607
- });
608
- return;
609
- }
610
- const adaptations = (_6 = period.adaptations[msgData.value.type]) !== null && _6 !== void 0 ? _6 : [];
611
- const adaptation = arrayFind(adaptations, (a) => a.id === msgData.value.adaptationId);
612
- if (adaptation === undefined) {
613
- return;
614
- }
615
- const representation = arrayFind(adaptation.representations, (r) => r.id === msgData.value.representationId);
616
- if (representation !== undefined) {
617
- this.trigger("representationChange", {
618
- period,
619
- type: msgData.value.type,
620
- representation,
621
- });
622
- }
623
- break;
624
- }
625
- case "encryption-data-encountered" /* WorkerMessageType.EncryptionDataEncountered */:
626
- if (((_7 = this._currentContentInfo) === null || _7 === void 0 ? void 0 : _7.contentId) !== msgData.contentId) {
627
- return;
628
- }
629
- lastContentProtection.setValue(msgData.value);
630
- break;
631
- case "manifest-ready" /* WorkerMessageType.ManifestReady */: {
632
- if (((_8 = this._currentContentInfo) === null || _8 === void 0 ? void 0 : _8.contentId) !== msgData.contentId) {
633
- return;
634
- }
635
- const manifest = msgData.value.manifest;
636
- this._currentContentInfo.manifest = manifest;
637
- this._updateCodecSupport(manifest, mediaElement);
638
- this._startPlaybackIfReady(playbackStartParams);
639
- break;
640
- }
641
- case "manifest-update" /* WorkerMessageType.ManifestUpdate */: {
642
- if (((_9 = this._currentContentInfo) === null || _9 === void 0 ? void 0 : _9.contentId) !== msgData.contentId) {
643
- return;
644
- }
645
- const manifest = (_10 = this._currentContentInfo) === null || _10 === void 0 ? void 0 : _10.manifest;
646
- if (isNullOrUndefined(manifest)) {
647
- log.error("Init", "Manifest update but no Manifest loaded");
648
- return;
649
- }
650
- replicateUpdatesOnManifestMetadata(manifest, msgData.value.manifest, msgData.value.updates);
651
- (_12 = (_11 = this._currentContentInfo) === null || _11 === void 0 ? void 0 : _11.streamEventsEmitter) === null || _12 === void 0 ? void 0 : _12.onManifestUpdate(manifest);
652
- this._updateCodecSupport(manifest, mediaElement);
653
- this.trigger("manifestUpdate", msgData.value.updates);
654
- break;
655
- }
656
- case "update-playback-rate" /* WorkerMessageType.UpdatePlaybackRate */:
657
- if (((_13 = this._currentContentInfo) === null || _13 === void 0 ? void 0 : _13.contentId) !== msgData.contentId) {
658
- return;
659
- }
660
- playbackObserver.setPlaybackRate(msgData.value);
661
- break;
662
- case "bitrate-estimate-change" /* WorkerMessageType.BitrateEstimateChange */:
663
- if (((_14 = this._currentContentInfo) === null || _14 === void 0 ? void 0 : _14.contentId) !== msgData.contentId) {
664
- return;
665
- }
666
- this.trigger("bitrateEstimateChange", {
667
- type: msgData.value.bufferType,
668
- bitrate: msgData.value.bitrate,
669
- });
670
- break;
671
- case "inband-event" /* WorkerMessageType.InbandEvent */:
672
- if (((_15 = this._currentContentInfo) === null || _15 === void 0 ? void 0 : _15.contentId) !== msgData.contentId) {
673
- return;
674
- }
675
- this.trigger("inbandEvents", msgData.value);
676
- break;
677
- case "locked-stream" /* WorkerMessageType.LockedStream */: {
678
- if (((_16 = this._currentContentInfo) === null || _16 === void 0 ? void 0 : _16.contentId) !== msgData.contentId ||
679
- this._currentContentInfo.manifest === null) {
680
- return;
681
- }
682
- const period = arrayFind(this._currentContentInfo.manifest.periods, (p) => p.id === msgData.value.periodId);
683
- if (period === undefined) {
684
- return;
685
- }
686
- (_17 = this._currentContentInfo.rebufferingController) === null || _17 === void 0 ? void 0 : _17.onLockedStream(msgData.value.bufferType, period);
687
- break;
688
- }
689
- case "period-stream-ready" /* WorkerMessageType.PeriodStreamReady */: {
690
- if (((_18 = this._currentContentInfo) === null || _18 === void 0 ? void 0 : _18.contentId) !== msgData.contentId ||
691
- this._currentContentInfo.manifest === null) {
692
- return;
693
- }
694
- const period = arrayFind(this._currentContentInfo.manifest.periods, (p) => p.id === msgData.value.periodId);
695
- if (period === undefined) {
696
- return;
697
- }
698
- const ref = new SharedReference(undefined);
699
- ref.onUpdate((adapChoice) => {
700
- if (this._currentContentInfo === null) {
701
- ref.finish();
702
- return;
703
- }
704
- if (!isNullOrUndefined(adapChoice)) {
705
- adapChoice.representations.onUpdate((repChoice, stopListening) => {
706
- if (this._currentContentInfo === null) {
707
- stopListening();
708
- return;
709
- }
710
- sendMessage(this._settings.worker, {
711
- type: "rep-update" /* MainThreadMessageType.RepresentationUpdate */,
712
- contentId: this._currentContentInfo.contentId,
713
- value: {
714
- periodId: msgData.value.periodId,
715
- adaptationId: adapChoice.adaptationId,
716
- bufferType: msgData.value.bufferType,
717
- choice: repChoice,
718
- },
719
- });
720
- }, { clearSignal: this._initCanceller.signal });
721
- }
722
- sendMessage(this._settings.worker, {
723
- type: "track-update" /* MainThreadMessageType.TrackUpdate */,
724
- contentId: this._currentContentInfo.contentId,
725
- value: {
726
- periodId: msgData.value.periodId,
727
- bufferType: msgData.value.bufferType,
728
- choice: isNullOrUndefined(adapChoice)
729
- ? adapChoice
730
- : {
731
- adaptationId: adapChoice.adaptationId,
732
- switchingMode: adapChoice.switchingMode,
733
- initialRepresentations: adapChoice.representations.getValue(),
734
- relativeResumingPosition: adapChoice.relativeResumingPosition,
735
- },
736
- },
737
- });
738
- }, { clearSignal: this._initCanceller.signal });
739
- this.trigger("periodStreamReady", {
740
- period,
741
- type: msgData.value.bufferType,
742
- adaptationRef: ref,
743
- });
744
- break;
745
- }
746
- case "period-stream-cleared" /* WorkerMessageType.PeriodStreamCleared */: {
747
- if (((_19 = this._currentContentInfo) === null || _19 === void 0 ? void 0 : _19.contentId) !== msgData.contentId ||
748
- this._currentContentInfo.manifest === null) {
749
- return;
750
- }
751
- this.trigger("periodStreamCleared", {
752
- periodId: msgData.value.periodId,
753
- type: msgData.value.bufferType,
754
- });
755
- break;
756
- }
757
- case "discontinuity-update" /* WorkerMessageType.DiscontinuityUpdate */: {
758
- if (((_20 = this._currentContentInfo) === null || _20 === void 0 ? void 0 : _20.contentId) !== msgData.contentId ||
759
- this._currentContentInfo.manifest === null) {
760
- return;
761
- }
762
- const period = arrayFind(this._currentContentInfo.manifest.periods, (p) => p.id === msgData.value.periodId);
763
- if (period === undefined) {
764
- log.warn("Init", "Discontinuity's Period not found", {
765
- periodId: msgData.value.periodId,
766
- });
767
- return;
768
- }
769
- (_21 = this._currentContentInfo.rebufferingController) === null || _21 === void 0 ? void 0 : _21.updateDiscontinuityInfo({
770
- period,
771
- bufferType: msgData.value.bufferType,
772
- discontinuity: msgData.value.discontinuity,
773
- position: msgData.value.position,
774
- });
775
- break;
776
- }
777
- case "push-text-data" /* WorkerMessageType.PushTextData */: {
778
- if (((_22 = this._currentContentInfo) === null || _22 === void 0 ? void 0 : _22.contentId) !== msgData.contentId) {
779
- return;
780
- }
781
- if (textDisplayer === null) {
782
- log.warn("text", "Received AddTextData message but no text displayer exists");
783
- }
784
- else {
785
- try {
786
- const ranges = textDisplayer.pushTextData(msgData.value);
787
- sendMessage(this._settings.worker, {
788
- type: "add-text-success" /* MainThreadMessageType.PushTextDataSuccess */,
789
- contentId: msgData.contentId,
790
- value: { ranges },
791
- });
792
- }
793
- catch (err) {
794
- const message = err instanceof Error ? err.message : "Unknown error";
795
- sendMessage(this._settings.worker, {
796
- type: "push-text-error" /* MainThreadMessageType.PushTextDataError */,
797
- contentId: msgData.contentId,
798
- value: { message },
799
- });
800
- }
801
- }
802
- break;
803
- }
804
- case "remove-text-data" /* WorkerMessageType.RemoveTextData */: {
805
- if (((_23 = this._currentContentInfo) === null || _23 === void 0 ? void 0 : _23.contentId) !== msgData.contentId) {
806
- return;
807
- }
808
- if (textDisplayer === null) {
809
- log.warn("text", "Received RemoveTextData message but no text displayer exists");
810
- }
811
- else {
812
- try {
813
- const ranges = textDisplayer.removeBuffer(msgData.value.start, msgData.value.end);
814
- sendMessage(this._settings.worker, {
815
- type: "remove-text-success" /* MainThreadMessageType.RemoveTextDataSuccess */,
816
- contentId: msgData.contentId,
817
- value: { ranges },
818
- });
819
- }
820
- catch (err) {
821
- const message = err instanceof Error ? err.message : "Unknown error";
822
- sendMessage(this._settings.worker, {
823
- type: "remove-text-error" /* MainThreadMessageType.RemoveTextDataError */,
824
- contentId: msgData.contentId,
825
- value: { message },
826
- });
827
- }
828
- }
829
- break;
830
- }
831
- case "reset-text-displayer" /* WorkerMessageType.ResetTextDisplayer */: {
832
- if (((_24 = this._currentContentInfo) === null || _24 === void 0 ? void 0 : _24.contentId) !== msgData.contentId) {
833
- return;
834
- }
835
- if (textDisplayer === null) {
836
- log.warn("text", "Received ResetTextDisplayer message but no text displayer exists");
837
- }
838
- else {
839
- textDisplayer.reset();
840
- }
841
- break;
842
- }
843
- case "stop-text-displayer" /* WorkerMessageType.StopTextDisplayer */: {
844
- if (((_25 = this._currentContentInfo) === null || _25 === void 0 ? void 0 : _25.contentId) !== msgData.contentId) {
845
- return;
846
- }
847
- if (textDisplayer === null) {
848
- log.warn("text", "Received StopTextDisplayer message but no text displayer exists");
849
- }
850
- else {
851
- textDisplayer.stop();
852
- }
853
- break;
854
- }
855
- case "reloading-media-source" /* WorkerMessageType.ReloadingMediaSource */:
856
- {
857
- if (this._currentContentInfo === null ||
858
- this._currentContentInfo.mediaSourceInfo === null) {
859
- return;
860
- }
861
- const mediaSourceId = this._currentContentInfo.mediaSourceInfo.type === "main"
862
- ? this._currentContentInfo.mediaSourceInfo.mediaSource.id
863
- : this._currentContentInfo.mediaSourceInfo.mediaSourceId;
864
- if (mediaSourceId !== msgData.mediaSourceId) {
865
- return;
866
- }
867
- reloadMediaSource(msgData.value.timeOffset, msgData.value.minimumPosition, msgData.value.maximumPosition);
868
- }
869
- break;
870
- case "needs-decipherability-flush" /* WorkerMessageType.NeedsDecipherabilityFlush */:
871
- {
872
- if (((_26 = this._currentContentInfo) === null || _26 === void 0 ? void 0 : _26.contentId) !== msgData.contentId) {
873
- return;
874
- }
875
- const keySystem = getKeySystemConfiguration(mediaElement);
876
- if (shouldReloadMediaSourceOnDecipherabilityUpdate(keySystem === null || keySystem === void 0 ? void 0 : keySystem[0])) {
877
- notifyAndStartMediaSourceReload(0, undefined, undefined);
878
- }
879
- else {
880
- const lastObservation = playbackObserver.getReference().getValue();
881
- const currentPosition = lastObservation.position.getWanted();
882
- // simple seek close to the current position
883
- // to flush the buffers
884
- if (currentPosition + 0.001 < lastObservation.duration) {
885
- playbackObserver.setCurrentTime(mediaElement.currentTime + 0.001);
886
- }
887
- else {
888
- playbackObserver.setCurrentTime(currentPosition);
889
- }
890
- }
891
- }
892
- break;
893
- case "segment-sink-store-update" /* WorkerMessageType.SegmentSinkStoreUpdate */: {
894
- if (((_27 = this._currentContentInfo) === null || _27 === void 0 ? void 0 : _27.contentId) !== msgData.contentId) {
895
- return;
896
- }
897
- const sinkObj = this._awaitingRequests.pendingSinkMetrics.get(msgData.value.requestId);
898
- if (sinkObj !== undefined) {
899
- sinkObj.resolve(msgData.value.segmentSinkMetrics);
900
- }
901
- else {
902
- log.error("Init", "Failed to send segment sink store update");
903
- }
904
- break;
905
- }
906
- case "init-success" /* WorkerMessageType.InitSuccess */:
907
- case "init-error" /* WorkerMessageType.InitError */:
908
- // Should already be handled by the API
909
- break;
910
- case "log" /* WorkerMessageType.LogMessage */:
911
- // Already handled by prepare's handler
912
- break;
913
- case "thumbnail-response" /* WorkerMessageType.ThumbnailDataResponse */: {
914
- if (((_28 = this._currentContentInfo) === null || _28 === void 0 ? void 0 : _28.contentId) !== msgData.contentId) {
915
- return;
916
- }
917
- const tObj = this._awaitingRequests.pendingThumbnailFetching.get(msgData.value.requestId);
918
- if (tObj !== undefined) {
919
- if (msgData.value.status === "error") {
920
- tObj.reject(formatWorkerError(msgData.value.error));
921
- }
922
- else {
923
- tObj.resolve(msgData.value.data);
924
- }
925
- }
926
- else {
927
- log.error("Init", "Failed to send segment sink store update");
928
- }
929
- break;
930
- }
931
- default:
932
- assertUnreachable(msgData);
933
- }
934
- };
935
- log.debug("Init", "addEventListener for worker message");
936
- if (this._queuedWorkerMessages !== null) {
937
- const bufferedMessages = this._queuedWorkerMessages.slice();
938
- log.debug("Init", "Processing buffered messages", {
939
- ammount: bufferedMessages.length,
940
- });
941
- for (const message of bufferedMessages) {
942
- onmessage(message);
943
- }
944
- this._queuedWorkerMessages = null;
945
- }
946
- this._settings.worker.addEventListener("message", onmessage);
947
- this._initCanceller.signal.register(() => {
948
- log.debug("Init", "removeEventListener for worker message");
949
- this._settings.worker.removeEventListener("message", onmessage);
950
- });
951
- }
952
- dispose() {
953
- var _a;
954
- this._initCanceller.cancel();
955
- if (this._currentContentInfo !== null) {
956
- if (((_a = this._currentContentInfo.mediaSourceInfo) === null || _a === void 0 ? void 0 : _a.type) === "main") {
957
- this._currentContentInfo.mediaSourceInfo.mediaSource.dispose();
958
- }
959
- this._currentContentInfo = null;
960
- }
961
- }
962
- _onFatalError(err) {
963
- if (this._initCanceller.isUsed()) {
964
- return;
965
- }
966
- this._initCanceller.cancel();
967
- this.trigger("error", err);
968
- }
969
- _initializeContentDecryption(mediaElement, lastContentProtection, mediaSourceStatus, reloadMediaSource, cancelSignal) {
970
- var _a;
971
- const { keySystems } = this._settings;
972
- // TODO private?
973
- const createEmeDisabledReference = (errMsg) => {
974
- mediaSourceStatus.setValue(1 /* MediaSourceInitializationStatus.AttachNow */);
975
- lastContentProtection.onUpdate((data, stopListening) => {
976
- if (data === null) {
977
- // initial value
978
- return;
979
- }
980
- stopListening();
981
- const err = new EncryptedMediaError("MEDIA_IS_ENCRYPTED_ERROR", errMsg, {
982
- keyStatuses: undefined,
983
- keySystemConfiguration: undefined,
984
- keySystem: undefined,
985
- });
986
- this._onFatalError(err);
987
- }, { clearSignal: cancelSignal });
988
- const ref = new SharedReference({
989
- initializationState: {
990
- type: "initialized",
991
- value: null,
992
- },
993
- contentDecryptor: null,
994
- drmSystemId: undefined,
995
- });
996
- ref.finish(); // We know that no new value will be triggered
997
- return { statusRef: ref, contentDecryptor: null };
998
- };
999
- if (keySystems.length === 0) {
1000
- return createEmeDisabledReference("No `keySystems` option given.");
1001
- }
1002
- else if (features.decrypt === null) {
1003
- return createEmeDisabledReference("EME feature not activated.");
1004
- }
1005
- const ContentDecryptor = features.decrypt;
1006
- const emeApi = (_a = mediaElement.FORCED_EME_API) !== null && _a !== void 0 ? _a : getEmeApiImplementation("auto");
1007
- if (emeApi === null) {
1008
- return createEmeDisabledReference("EME API not available on the current page.");
1009
- }
1010
- log.debug("Init", "Creating ContentDecryptor");
1011
- const contentDecryptor = new ContentDecryptor(emeApi, mediaElement, keySystems);
1012
- const drmStatusRef = new SharedReference({
1013
- initializationState: { type: "uninitialized", value: null },
1014
- drmSystemId: undefined,
1015
- }, cancelSignal);
1016
- const updateCodecSupportOnStateChange = (state) => {
1017
- var _a;
1018
- if (state > ContentDecryptorState.Initializing) {
1019
- const manifest = (_a = this._currentContentInfo) === null || _a === void 0 ? void 0 : _a.manifest;
1020
- if (isNullOrUndefined(manifest)) {
1021
- return;
1022
- }
1023
- this._updateCodecSupport(manifest, mediaElement);
1024
- contentDecryptor.removeEventListener("stateChange", updateCodecSupportOnStateChange);
1025
- }
1026
- };
1027
- contentDecryptor.addEventListener("stateChange", updateCodecSupportOnStateChange);
1028
- contentDecryptor.addEventListener("keyIdsCompatibilityUpdate", (updates) => {
1029
- if (this._currentContentInfo === null ||
1030
- this._currentContentInfo.manifest === null) {
1031
- return;
1032
- }
1033
- const manUpdates = updateDecipherabilityFromKeyIds(this._currentContentInfo.manifest, updates);
1034
- if (mayMediaElementFailOnUndecipherableData() &&
1035
- manUpdates.some((e) => e.representation.decipherable !== true)) {
1036
- reloadMediaSource();
1037
- }
1038
- else {
1039
- sendMessage(this._settings.worker, {
1040
- type: "decipherability-update" /* MainThreadMessageType.DecipherabilityStatusUpdate */,
1041
- contentId: this._currentContentInfo.contentId,
1042
- value: manUpdates.map((s) => ({
1043
- representationUniqueId: s.representation.uniqueId,
1044
- decipherable: s.representation.decipherable,
1045
- })),
1046
- });
1047
- }
1048
- this.trigger("decipherabilityUpdate", manUpdates);
1049
- });
1050
- contentDecryptor.addEventListener("blackListProtectionData", (protData) => {
1051
- if (this._currentContentInfo === null ||
1052
- this._currentContentInfo.manifest === null) {
1053
- return;
1054
- }
1055
- const manUpdates = updateDecipherabilityFromProtectionData(this._currentContentInfo.manifest, protData);
1056
- if (mayMediaElementFailOnUndecipherableData() &&
1057
- manUpdates.some((e) => e.representation.decipherable !== true)) {
1058
- reloadMediaSource();
1059
- }
1060
- else {
1061
- sendMessage(this._settings.worker, {
1062
- type: "decipherability-update" /* MainThreadMessageType.DecipherabilityStatusUpdate */,
1063
- contentId: this._currentContentInfo.contentId,
1064
- value: manUpdates.map((s) => ({
1065
- representationUniqueId: s.representation.uniqueId,
1066
- decipherable: s.representation.decipherable,
1067
- })),
1068
- });
1069
- }
1070
- this.trigger("decipherabilityUpdate", manUpdates);
1071
- });
1072
- contentDecryptor.addEventListener("stateChange", (state) => {
1073
- if (state === ContentDecryptorState.WaitingForAttachment) {
1074
- mediaSourceStatus.onUpdate((currStatus, stopListening) => {
1075
- if (currStatus === 0 /* MediaSourceInitializationStatus.Nothing */) {
1076
- mediaSourceStatus.setValue(1 /* MediaSourceInitializationStatus.AttachNow */);
1077
- }
1078
- else if (currStatus === 2 /* MediaSourceInitializationStatus.Attached */) {
1079
- stopListening();
1080
- if (state === ContentDecryptorState.WaitingForAttachment) {
1081
- contentDecryptor.attach();
1082
- }
1083
- }
1084
- }, { clearSignal: cancelSignal, emitCurrentValue: true });
1085
- }
1086
- else if (state === ContentDecryptorState.ReadyForContent) {
1087
- drmStatusRef.setValue({
1088
- initializationState: { type: "initialized", value: null },
1089
- drmSystemId: contentDecryptor.systemId,
1090
- });
1091
- contentDecryptor.removeEventListener("stateChange");
1092
- }
1093
- });
1094
- contentDecryptor.addEventListener("error", (error) => {
1095
- this._onFatalError(error);
1096
- });
1097
- contentDecryptor.addEventListener("warning", (error) => {
1098
- this.trigger("warning", error);
1099
- });
1100
- lastContentProtection.onUpdate((data) => {
1101
- if (data === null) {
1102
- return;
1103
- }
1104
- contentDecryptor.onInitializationData(data);
1105
- }, { clearSignal: cancelSignal });
1106
- cancelSignal.register(() => {
1107
- contentDecryptor.dispose();
1108
- });
1109
- return { statusRef: drmStatusRef, contentDecryptor };
1110
- }
1111
- /**
1112
- * Retrieves all unknown codecs from the current manifest, checks these unknown codecs
1113
- * to determine if they are supported, updates the manifest with the support
1114
- * status of these codecs, and forwards the list of supported codecs to the web worker.
1115
- * @param manifest
1116
- */
1117
- _updateCodecSupport(manifest, mediaElement) {
1118
- var _a, _b, _c, _d;
1119
- try {
1120
- const updatedCodecs = 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);
1121
- if (updatedCodecs.length > 0) {
1122
- sendMessage(this._settings.worker, {
1123
- type: "codec-support-update" /* MainThreadMessageType.CodecSupportUpdate */,
1124
- value: updatedCodecs,
1125
- });
1126
- // TODO what if one day the worker updates codec support by itself?
1127
- // We wouldn't know...
1128
- this.trigger("codecSupportUpdate", null);
1129
- }
1130
- }
1131
- catch (err) {
1132
- this._onFatalError(err);
1133
- }
1134
- }
1135
- _hasTextBufferFeature() {
1136
- return ((this._settings.textTrackOptions.textTrackMode === "html" &&
1137
- features.htmlTextDisplayer !== null) ||
1138
- features.nativeTextDisplayer !== null);
1139
- }
1140
- _reload(mediaElement, textDisplayer, playbackObserver, mediaSourceStatus, position, autoPlay) {
1141
- this._currentMediaSourceCanceller.cancel();
1142
- this._currentMediaSourceCanceller = new TaskCanceller();
1143
- this._currentMediaSourceCanceller.linkToSignal(this._initCanceller.signal);
1144
- mediaSourceStatus.setValue(1 /* MediaSourceInitializationStatus.AttachNow */);
1145
- this.trigger("reloadingMediaSource", { position, autoPlay });
1146
- mediaSourceStatus.onUpdate((status, stopListeningMSStatusUpdates) => {
1147
- if (status !== 2 /* MediaSourceInitializationStatus.Attached */) {
1148
- return;
1149
- }
1150
- stopListeningMSStatusUpdates();
1151
- const corePlaybackObserver = this._setUpModulesOnNewMediaSource({
1152
- initialTime: position,
1153
- autoPlay,
1154
- mediaElement,
1155
- textDisplayer,
1156
- playbackObserver,
1157
- }, this._currentMediaSourceCanceller.signal);
1158
- if (!this._currentMediaSourceCanceller.isUsed() &&
1159
- corePlaybackObserver !== null &&
1160
- this._currentContentInfo !== null) {
1161
- const contentId = this._currentContentInfo.contentId;
1162
- corePlaybackObserver.listen((obs) => {
1163
- sendMessage(this._settings.worker, {
1164
- type: "observation" /* MainThreadMessageType.PlaybackObservation */,
1165
- contentId,
1166
- value: objectAssign(obs, {
1167
- position: obs.position.serialize(),
1168
- }),
1169
- });
1170
- }, {
1171
- includeLastObservation: true,
1172
- clearSignal: this._currentMediaSourceCanceller.signal,
1173
- });
1174
- }
1175
- }, {
1176
- clearSignal: this._currentMediaSourceCanceller.signal,
1177
- emitCurrentValue: true,
1178
- });
1179
- }
1180
- /**
1181
- * Start-up modules and mechanisms (initial seek, auto-play etc.) needed each
1182
- * time a content is loaded AND re-loaded on a `HTMLMediaElement`, when the
1183
- * manifest is known.
1184
- *
1185
- * Note that this does not include reacting to incoming worker messages nor
1186
- * sending them, those actions have to be handled separately.
1187
- *
1188
- * @param {Object} parameters
1189
- * @param {Object} cancelSignal
1190
- * @returns {Object|null} - Playback Observer created for this content. `null`
1191
- * only if playback initialization failed (most likely because it has been
1192
- * cancelled).
1193
- */
1194
- _setUpModulesOnNewMediaSource(parameters, cancelSignal) {
1195
- if (cancelSignal.isCancelled()) {
1196
- return null;
1197
- }
1198
- if (this._currentContentInfo === null) {
1199
- log.error("Init", "Setting up modules without a contentId");
1200
- return null;
1201
- }
1202
- if (this._currentContentInfo.manifest === null) {
1203
- log.error("Init", "Setting up modules without a loaded Manifest");
1204
- return null;
1205
- }
1206
- const { manifest, mediaSourceInfo } = this._currentContentInfo;
1207
- const { speed } = this._settings;
1208
- const { initialTime, autoPlay, mediaElement, textDisplayer, playbackObserver } = parameters;
1209
- this._currentContentInfo.initialTime = initialTime;
1210
- this._currentContentInfo.autoPlay = autoPlay;
1211
- const { autoPlayResult, initialPlayPerformed } = performInitialSeekAndPlay({
1212
- mediaElement,
1213
- playbackObserver,
1214
- startTime: initialTime,
1215
- mustAutoPlay: autoPlay,
1216
- onWarning: (err) => this.trigger("warning", err),
1217
- isDirectfile: false,
1218
- }, cancelSignal);
1219
- this._currentContentInfo.initialPlayPerformed = initialPlayPerformed;
1220
- const corePlaybackObserver = createCorePlaybackObserver(playbackObserver, {
1221
- autoPlay,
1222
- initialPlayPerformed,
1223
- manifest,
1224
- mediaSource: (mediaSourceInfo === null || mediaSourceInfo === void 0 ? void 0 : mediaSourceInfo.type) === "main" ? mediaSourceInfo.mediaSource : null,
1225
- speed,
1226
- textDisplayer,
1227
- }, cancelSignal);
1228
- if (cancelSignal.isCancelled()) {
1229
- return null;
1230
- }
1231
- /**
1232
- * Class trying to avoid various stalling situations, emitting "stalled"
1233
- * events when it cannot, as well as "unstalled" events when it get out of one.
1234
- */
1235
- const rebufferingController = new RebufferingController(playbackObserver, manifest, speed);
1236
- rebufferingController.addEventListener("stalled", (evt) => this.trigger("stalled", evt));
1237
- rebufferingController.addEventListener("unstalled", () => this.trigger("unstalled", null));
1238
- rebufferingController.addEventListener("warning", (err) => this.trigger("warning", err));
1239
- cancelSignal.register(() => {
1240
- rebufferingController.destroy();
1241
- });
1242
- rebufferingController.start();
1243
- this._currentContentInfo.rebufferingController = rebufferingController;
1244
- const currentContentInfo = this._currentContentInfo;
1245
- initialPlayPerformed.onUpdate((isPerformed, stopListening) => {
1246
- if (isPerformed) {
1247
- stopListening();
1248
- const streamEventsEmitter = new StreamEventsEmitter(manifest, playbackObserver);
1249
- currentContentInfo.streamEventsEmitter = streamEventsEmitter;
1250
- streamEventsEmitter.addEventListener("event", (payload) => {
1251
- this.trigger("streamEvent", payload);
1252
- }, cancelSignal);
1253
- streamEventsEmitter.addEventListener("eventSkip", (payload) => {
1254
- this.trigger("streamEventSkip", payload);
1255
- }, cancelSignal);
1256
- streamEventsEmitter.start();
1257
- cancelSignal.register(() => {
1258
- streamEventsEmitter.stop();
1259
- });
1260
- }
1261
- }, { clearSignal: cancelSignal, emitCurrentValue: true });
1262
- const _getSegmentSinkMetrics = async () => {
1263
- this._awaitingRequests.nextRequestId++;
1264
- const requestId = this._awaitingRequests.nextRequestId;
1265
- sendMessage(this._settings.worker, {
1266
- type: "pull-segment-sink-store-infos" /* MainThreadMessageType.PullSegmentSinkStoreInfos */,
1267
- value: { requestId },
1268
- });
1269
- return new Promise((resolve, reject) => {
1270
- const rejectFn = (err) => {
1271
- cancelSignal.deregister(rejectFn);
1272
- this._awaitingRequests.pendingSinkMetrics.delete(requestId);
1273
- return reject(err);
1274
- };
1275
- this._awaitingRequests.pendingSinkMetrics.set(requestId, {
1276
- resolve: (value) => {
1277
- cancelSignal.deregister(rejectFn);
1278
- this._awaitingRequests.pendingSinkMetrics.delete(requestId);
1279
- resolve(value);
1280
- },
1281
- });
1282
- cancelSignal.register(rejectFn);
1283
- });
1284
- };
1285
- const _getThumbnailsData = async (periodId, thumbnailTrackId, time) => {
1286
- if (this._currentContentInfo === null) {
1287
- return Promise.reject(new Error("Cannot fetch thumbnails: No content loaded."));
1288
- }
1289
- this._awaitingRequests.nextRequestId++;
1290
- const requestId = this._awaitingRequests.nextRequestId;
1291
- sendMessage(this._settings.worker, {
1292
- type: "thumbnail-request" /* MainThreadMessageType.ThumbnailDataRequest */,
1293
- contentId: this._currentContentInfo.contentId,
1294
- value: { requestId, periodId, thumbnailTrackId, time },
1295
- });
1296
- return new Promise((resolve, reject) => {
1297
- const rejectFn = (err) => {
1298
- cleanUp();
1299
- reject(err);
1300
- };
1301
- const cleanUp = () => {
1302
- cancelSignal.deregister(rejectFn);
1303
- this._awaitingRequests.pendingThumbnailFetching.delete(requestId);
1304
- };
1305
- this._awaitingRequests.pendingThumbnailFetching.set(requestId, {
1306
- resolve: (value) => {
1307
- cleanUp();
1308
- resolve(value);
1309
- },
1310
- reject: (value) => {
1311
- cleanUp();
1312
- reject(value);
1313
- },
1314
- });
1315
- cancelSignal.register(rejectFn);
1316
- });
1317
- };
1318
- /**
1319
- * Emit a "loaded" events once the initial play has been performed and the
1320
- * media can begin playback.
1321
- * Also emits warning events if issues arise when doing so.
1322
- */
1323
- autoPlayResult
1324
- .then(() => {
1325
- getLoadedReference(playbackObserver, false, cancelSignal).onUpdate((isLoaded, stopListening) => {
1326
- if (isLoaded) {
1327
- stopListening();
1328
- this.trigger("loaded", {
1329
- getSegmentSinkMetrics: _getSegmentSinkMetrics,
1330
- getThumbnailData: _getThumbnailsData,
1331
- });
1332
- }
1333
- }, { emitCurrentValue: true, clearSignal: cancelSignal });
1334
- })
1335
- .catch((err) => {
1336
- if (cancelSignal.isCancelled()) {
1337
- return;
1338
- }
1339
- this._onFatalError(err);
1340
- });
1341
- return corePlaybackObserver;
1342
- }
1343
- /**
1344
- * Initialize content playback if and only if those conditions are filled:
1345
- * - The Manifest is fetched and stored in `this._currentContentInfo`.
1346
- * - `drmInitializationStatus` indicates that DRM matters are initialized.
1347
- * - `mediaSourceStatus` indicates that the MediaSource is attached to the
1348
- * `mediaElement`.
1349
- *
1350
- * In other cases, this method will do nothing.
1351
- *
1352
- * To call when any of those conditions might become `true`, to start-up
1353
- * playback.
1354
- *
1355
- * @param {Object} parameters
1356
- * @returns {boolean} - Returns `true` if all conditions where met for
1357
- * playback start.
1358
- */
1359
- _startPlaybackIfReady(parameters) {
1360
- if (this._currentContentInfo === null || this._currentContentInfo.manifest === null) {
1361
- return false;
1362
- }
1363
- const drmInitStatus = parameters.drmInitializationStatus.getValue();
1364
- if (drmInitStatus.initializationState.type !== "initialized") {
1365
- return false;
1366
- }
1367
- const msInitStatus = parameters.mediaSourceStatus.getValue();
1368
- if (msInitStatus !== 2 /* MediaSourceInitializationStatus.Attached */) {
1369
- return false;
1370
- }
1371
- const { contentId, manifest } = this._currentContentInfo;
1372
- log.debug("Init", "Calculating initial time");
1373
- const initialTime = getInitialTime(manifest, this._settings.lowLatencyMode, this._settings.startAt);
1374
- log.debug("Init", "Initial time calculated", { initialTime });
1375
- const { enableFastSwitching, onCodecSwitch } = this._settings.bufferOptions;
1376
- const corePlaybackObserver = this._setUpModulesOnNewMediaSource({
1377
- initialTime,
1378
- autoPlay: this._settings.autoPlay,
1379
- mediaElement: parameters.mediaElement,
1380
- textDisplayer: parameters.textDisplayer,
1381
- playbackObserver: parameters.playbackObserver,
1382
- }, this._currentMediaSourceCanceller.signal);
1383
- if (this._currentMediaSourceCanceller.isUsed() || corePlaybackObserver === null) {
1384
- return true;
1385
- }
1386
- const initialObservation = corePlaybackObserver.getReference().getValue();
1387
- const sentInitialObservation = objectAssign(initialObservation, {
1388
- position: initialObservation.position.serialize(),
1389
- });
1390
- sendMessage(this._settings.worker, {
1391
- type: "start" /* MainThreadMessageType.StartPreparedContent */,
1392
- contentId,
1393
- value: {
1394
- initialTime,
1395
- initialObservation: sentInitialObservation,
1396
- drmSystemId: drmInitStatus.drmSystemId,
1397
- enableFastSwitching,
1398
- onCodecSwitch,
1399
- },
1400
- });
1401
- corePlaybackObserver.listen((obs) => {
1402
- sendMessage(this._settings.worker, {
1403
- type: "observation" /* MainThreadMessageType.PlaybackObservation */,
1404
- contentId,
1405
- value: objectAssign(obs, { position: obs.position.serialize() }),
1406
- });
1407
- }, {
1408
- includeLastObservation: false,
1409
- clearSignal: this._currentMediaSourceCanceller.signal,
1410
- });
1411
- this.trigger("manifestReady", manifest);
1412
- return true;
1413
- }
1414
- /**
1415
- * Handles Worker messages asking to create a MediaSource.
1416
- * @param {Object} msg - The worker's message received.
1417
- * @param {HTMLMediaElement} mediaElement - HTMLMediaElement on which the
1418
- * content plays.
1419
- * @param {Worker} worker - The WebWorker concerned, messages may be sent back
1420
- * to it.
1421
- */
1422
- _onCreateMediaSourceMessage(msg, mediaElement, mediaSourceStatus, worker) {
1423
- var _a;
1424
- if (((_a = this._currentContentInfo) === null || _a === void 0 ? void 0 : _a.contentId) !== msg.contentId) {
1425
- log.info("Init", "Ignoring MediaSource attachment due to wrong `contentId`");
1426
- }
1427
- else {
1428
- const { mediaSourceId } = msg;
1429
- try {
1430
- mediaSourceStatus.onUpdate((currStatus, stopListening) => {
1431
- var _a;
1432
- if (this._currentContentInfo === null) {
1433
- stopListening();
1434
- return;
1435
- }
1436
- if (currStatus === 1 /* MediaSourceInitializationStatus.AttachNow */) {
1437
- stopListening();
1438
- const mediaSource = new MainMediaSourceInterface(mediaSourceId);
1439
- if (((_a = this._currentContentInfo.mediaSourceInfo) === null || _a === void 0 ? void 0 : _a.type) === "main") {
1440
- this._currentContentInfo.mediaSourceInfo.mediaSource.dispose();
1441
- }
1442
- this._currentContentInfo.mediaSourceInfo = {
1443
- type: "main",
1444
- mediaSource,
1445
- };
1446
- mediaSource.addEventListener("mediaSourceOpen", () => {
1447
- sendMessage(worker, {
1448
- type: "media-source-ready-state-change" /* MainThreadMessageType.MediaSourceReadyStateChange */,
1449
- mediaSourceId,
1450
- value: "open",
1451
- });
1452
- });
1453
- mediaSource.addEventListener("mediaSourceEnded", () => {
1454
- sendMessage(worker, {
1455
- type: "media-source-ready-state-change" /* MainThreadMessageType.MediaSourceReadyStateChange */,
1456
- mediaSourceId,
1457
- value: "ended",
1458
- });
1459
- });
1460
- mediaSource.addEventListener("mediaSourceClose", () => {
1461
- sendMessage(worker, {
1462
- type: "media-source-ready-state-change" /* MainThreadMessageType.MediaSourceReadyStateChange */,
1463
- mediaSourceId,
1464
- value: "closed",
1465
- });
1466
- });
1467
- let url = null;
1468
- if (mediaSource.handle.type === "handle") {
1469
- mediaElement.srcObject = mediaSource.handle.value;
1470
- }
1471
- else {
1472
- url = URL.createObjectURL(mediaSource.handle.value);
1473
- mediaElement.src = url;
1474
- }
1475
- this._currentMediaSourceCanceller.signal.register(() => {
1476
- mediaSource.dispose();
1477
- resetMediaElement(mediaElement, url);
1478
- });
1479
- mediaSourceStatus.setValue(2 /* MediaSourceInitializationStatus.Attached */);
1480
- disableRemotePlaybackOnManagedMediaSource(mediaElement, this._currentMediaSourceCanceller.signal);
1481
- }
1482
- }, {
1483
- emitCurrentValue: true,
1484
- clearSignal: this._currentMediaSourceCanceller.signal,
1485
- });
1486
- }
1487
- catch (_err) {
1488
- const error = new OtherError("NONE", "Unknown error when creating the MediaSource");
1489
- this._onFatalError(error);
1490
- }
1491
- }
1492
- }
1493
- }
1494
- function bindNumberReferencesToWorker(worker, cancellationSignal, ...refs) {
1495
- for (const ref of refs) {
1496
- ref[0].onUpdate((newVal) => {
1497
- // NOTE: The TypeScript checks have already been made by this function's
1498
- // overload, but the body here is not aware of that.
1499
- sendMessage(worker, {
1500
- type: "ref-update" /* MainThreadMessageType.ReferenceUpdate */,
1501
- // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-explicit-any
1502
- value: { name: ref[1], newVal: newVal },
1503
- });
1504
- }, { clearSignal: cancellationSignal, emitCurrentValue: true });
1505
- }
1506
- }
1507
- function formatWorkerError(sentError) {
1508
- switch (sentError.name) {
1509
- case "NetworkError":
1510
- return new NetworkError(sentError.code, new RequestError(sentError.baseError.url, sentError.baseError.status, sentError.baseError.type));
1511
- case "MediaError":
1512
- // eslint-disable-next-line
1513
- return new MediaError(sentError.code, sentError.reason, {
1514
- tracks: sentError.tracks,
1515
- });
1516
- case "EncryptedMediaError":
1517
- // We assume that everything have already been checked Worker-side here
1518
- // eslint-disable-next-line @typescript-eslint/no-unsafe-argument
1519
- return new EncryptedMediaError(sentError.code, sentError.reason, {
1520
- keyStatuses: sentError.keyStatuses,
1521
- keySystemConfiguration: sentError.keySystemConfiguration,
1522
- keySystem: sentError.keySystem,
1523
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
1524
- });
1525
- case "OtherError":
1526
- return new OtherError(sentError.code, sentError.reason);
1527
- }
1528
- }
1529
- function formatSourceBufferError(error) {
1530
- if (error instanceof SourceBufferError) {
1531
- return error;
1532
- }
1533
- else if (error instanceof Error) {
1534
- return new SourceBufferError(error.name, error.message, error.name === "QuotaExceededError");
1535
- }
1536
- else {
1537
- return new SourceBufferError("Error", "Unknown SourceBufferError Error", false);
1538
- }
1539
- }
1540
- /**
1541
- * The Core might send back logs. In that situation, the message might be
1542
- * formatted slightly differently to be able to cross threads (so a
1543
- * serializable format has to be sent).
1544
- *
1545
- * This function translates that Core format to what's expected by the
1546
- * logger.
1547
- *
1548
- * @param {*} arg
1549
- * @returns {*}
1550
- */
1551
- function formatSentLogObject(arg) {
1552
- if (typeof arg !== "object") {
1553
- return arg;
1554
- }
1555
- if ((arg === null || arg === void 0 ? void 0 : arg.isSerializedError) === true) {
1556
- return formatWorkerError(arg);
1557
- }
1558
- return arg;
1559
- }