rx-player 4.4.1-dev.2025101500 → 4.4.1

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