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
@@ -17,6 +17,7 @@
17
17
  import type { IMediaElement } from "../compat/browser_compatibility_types";
18
18
  import isSeekingApproximate from "../compat/is_seeking_approximate";
19
19
  import config from "../config";
20
+ import ManualTimeRanges from "../core/segment_sinks/implementations/utils/manual_time_ranges";
20
21
  import log from "../log";
21
22
  import getMonotonicTimeStamp from "../utils/monotonic_timestamp";
22
23
  import noop from "../utils/noop";
@@ -68,9 +69,9 @@ const SCANNED_MEDIA_ELEMENTS_EVENTS = [
68
69
  */
69
70
  export default class PlaybackObserver {
70
71
  /** HTMLMediaElement which we want to observe. */
71
- private _mediaElement: IMediaElement;
72
+ private _mediaElementRef: SharedReference<IMediaElement | null>;
72
73
 
73
- /** If `true`, a `MediaSource` object is linked to `_mediaElement`. */
74
+ /** If `true`, a `MediaSource` object is linked to the `HTMLMediaElement`. */
74
75
  private _withMediaSource: boolean;
75
76
 
76
77
  /**
@@ -132,6 +133,8 @@ export default class PlaybackObserver {
132
133
  */
133
134
  private _expectedSeekingPosition: number | null;
134
135
 
136
+ private _observationIntervalId: ReturnType<typeof setInterval> | null;
137
+
135
138
  /**
136
139
  * If `true` seek operations asked through the
137
140
  * `MediaElementPlaybackObserver` will not be performed now but after the
@@ -143,36 +146,64 @@ export default class PlaybackObserver {
143
146
  * Create a new `PlaybackObserver`, which allows to produce new "playback
144
147
  * observations" on various media events and intervals.
145
148
  *
149
+ * Once a `PlaybackObserver` is created, you will want to "attach" the
150
+ * media element to it through the `attachMediaElement` method once that
151
+ * element is ready to play your content.
152
+ *
146
153
  * Note that creating a `PlaybackObserver` lead to the usage of resources,
147
154
  * such as event listeners which will only be freed once the `stop` method is
148
155
  * called.
149
- * @param {HTMLMediaElement} mediaElement
150
156
  * @param {Object} options
151
157
  */
152
- constructor(mediaElement: IMediaElement, options: IPlaybackObserverOptions) {
158
+ constructor(options: IPlaybackObserverOptions) {
153
159
  this._internalSeeksIncoming = [];
154
- this._mediaElement = mediaElement;
160
+ this._mediaElementRef = new SharedReference<IMediaElement | null>(null);
155
161
  this._withMediaSource = options.withMediaSource;
156
162
  this._lowLatencyMode = options.lowLatencyMode;
157
163
  this._canceller = new TaskCanceller();
158
- this._observationRef = this._createSharedReference();
159
164
  this._expectedSeekingPosition = null;
160
165
  this._pendingSeek = null;
161
166
  this._isSeekBlocked = false;
162
-
163
- const onLoadedMetadata = () => {
164
- if (this._pendingSeek !== null && !this._isSeekBlocked) {
165
- const { position: positionToSeekTo, isInternal } = this._pendingSeek;
166
- this._pendingSeek = null;
167
- this._actuallySetCurrentTime(positionToSeekTo, isInternal);
168
- }
169
- };
170
- mediaElement.addEventListener("loadedmetadata", onLoadedMetadata);
167
+ this._observationIntervalId = null;
168
+ this._observationRef = this._createSharedReference();
171
169
  this._canceller.signal.register(() => {
172
- mediaElement.removeEventListener("loadedmetadata", onLoadedMetadata);
170
+ this._mediaElementRef.finish();
173
171
  });
174
172
  }
175
173
 
174
+ /**
175
+ * "Link" the actual `HTMLMediaElement` to this `PlaybackObserver`.
176
+ *
177
+ * This is done in a step separate from the constructor to allow complex
178
+ * situations where you want to inialize the polling logic before the media
179
+ * element is ready to play your content (e.g. when pre-loading the next
180
+ * content).
181
+ *
182
+ * @param {HTMLMediaElement} mediaElement - The `HTMLMediaElement` on which
183
+ * the content plays.
184
+ */
185
+ public attachMediaElement(mediaElement: IMediaElement): void {
186
+ const prevMediaElement = this._mediaElementRef.getValue();
187
+ if (prevMediaElement !== null) {
188
+ throw new Error("A media element was already attached to this PlaybackObserver");
189
+ }
190
+ this._mediaElementRef.setValue(mediaElement);
191
+ if (this._canceller.isUsed()) {
192
+ return;
193
+ }
194
+
195
+ this._registerLoadedMetadataEvent(mediaElement);
196
+ this._restartInterval();
197
+ this._registerMediaElementEvents(mediaElement);
198
+ this._generateObservationForEvent("init");
199
+ if (this._canceller.isUsed()) {
200
+ return;
201
+ }
202
+ if (mediaElement.readyState >= 1) {
203
+ this._onLoadedMetadataEvent();
204
+ }
205
+ }
206
+
176
207
  /**
177
208
  * Stop the `PlaybackObserver` from emitting playback observations and free all
178
209
  * resources reserved to emitting them such as event listeners and intervals.
@@ -192,15 +223,21 @@ export default class PlaybackObserver {
192
223
  * @returns {number}
193
224
  */
194
225
  public getCurrentTime(): number {
195
- return this._mediaElement.currentTime;
226
+ return (
227
+ this._mediaElementRef.getValue()?.currentTime ??
228
+ this._observationRef.getValue().position.getPolled()
229
+ );
196
230
  }
197
231
 
198
232
  /**
199
233
  * Returns the current playback rate advertised by the `HTMLMediaElement`.
200
- * @returns {number}
234
+ * @returns {number|undefined}
201
235
  */
202
236
  public getPlaybackRate(): number {
203
- return this._mediaElement.playbackRate;
237
+ return (
238
+ this._mediaElementRef.getValue()?.playbackRate ??
239
+ this._observationRef.getValue().playbackRate
240
+ );
204
241
  }
205
242
 
206
243
  /**
@@ -208,10 +245,12 @@ export default class PlaybackObserver {
208
245
  *
209
246
  * Use this instead of the same status emitted on an observation when you want
210
247
  * to be sure you're using the current value.
211
- * @returns {boolean}
248
+ * @returns {boolean|undefined}
212
249
  */
213
250
  public getIsPaused(): boolean {
214
- return this._mediaElement.paused;
251
+ return (
252
+ this._mediaElementRef.getValue()?.paused ?? this._observationRef.getValue().paused
253
+ );
215
254
  }
216
255
 
217
256
  /**
@@ -237,10 +276,15 @@ export default class PlaybackObserver {
237
276
  public unblockSeeking(): void {
238
277
  if (this._isSeekBlocked) {
239
278
  this._isSeekBlocked = false;
240
- if (this._pendingSeek !== null && this._mediaElement.readyState >= 1) {
279
+ const mediaElement = this._mediaElementRef.getValue();
280
+ if (
281
+ mediaElement !== null &&
282
+ mediaElement.readyState >= 1 &&
283
+ this._pendingSeek !== null
284
+ ) {
241
285
  const { position: positionToSeekTo, isInternal } = this._pendingSeek;
242
286
  this._pendingSeek = null;
243
- this._actuallySetCurrentTime(positionToSeekTo, isInternal);
287
+ this._actuallySetCurrentTime(mediaElement, positionToSeekTo, isInternal);
244
288
  }
245
289
  }
246
290
  }
@@ -290,31 +334,37 @@ export default class PlaybackObserver {
290
334
  * the user.
291
335
  */
292
336
  public setCurrentTime(time: number, isInternal: boolean = true): void {
293
- if (!this._isSeekBlocked && this._mediaElement.readyState >= 1) {
294
- this._actuallySetCurrentTime(time, isInternal);
337
+ const mediaElement = this._mediaElementRef.getValue();
338
+ if (mediaElement !== null && !this._isSeekBlocked && mediaElement.readyState >= 1) {
339
+ this._actuallySetCurrentTime(mediaElement, time, isInternal);
295
340
  } else {
296
341
  this._pendingSeek = { position: time, isInternal };
297
342
  this._internalSeeksIncoming = [];
298
- if (!this._isSeekBlocked) {
299
- this._generateObservationForEvent("manual");
300
- }
343
+ this._generateObservationForEvent("manual");
301
344
  }
302
345
  }
303
346
 
304
347
  /**
305
- * Update the playback rate of the `HTMLMediaElement`.
348
+ * Update the playback rate of the `HTMLmediaElement`.
306
349
  * @param {number} playbackRate
307
350
  */
308
351
  public setPlaybackRate(playbackRate: number): void {
309
- this._mediaElement.playbackRate = playbackRate;
352
+ const mediaElement = this._mediaElementRef.getValue();
353
+ if (mediaElement === null) {
354
+ return;
355
+ }
356
+ mediaElement.playbackRate = playbackRate;
310
357
  }
311
358
 
312
359
  /**
313
- * Returns the current `readyState` advertised by the `HTMLMediaElement`.
360
+ * Returns the current `readyState` advertised by the `HTMLmediaElement`.
314
361
  * @returns {number}
315
362
  */
316
363
  public getReadyState(): number {
317
- return this._mediaElement.readyState;
364
+ return (
365
+ this._mediaElementRef.getValue()?.readyState ??
366
+ this._observationRef.getValue().readyState
367
+ );
318
368
  }
319
369
 
320
370
  /**
@@ -379,12 +429,16 @@ export default class PlaybackObserver {
379
429
  return generateReadOnlyObserver(this, transform, this._canceller.signal);
380
430
  }
381
431
 
382
- private _actuallySetCurrentTime(time: number, isInternal: boolean): void {
432
+ private _actuallySetCurrentTime(
433
+ mediaElement: IMediaElement,
434
+ time: number,
435
+ isInternal: boolean,
436
+ ): void {
383
437
  log.info("media", "Actually seeking.", { time, isInternal });
384
438
  if (isInternal) {
385
439
  this._internalSeeksIncoming.push(time);
386
440
  }
387
- this._mediaElement.currentTime = time;
441
+ mediaElement.currentTime = time;
388
442
  }
389
443
 
390
444
  /**
@@ -396,51 +450,25 @@ export default class PlaybackObserver {
396
450
  if (this._observationRef !== undefined) {
397
451
  return this._observationRef;
398
452
  }
399
-
400
- const {
401
- SAMPLING_INTERVAL_MEDIASOURCE,
402
- SAMPLING_INTERVAL_LOW_LATENCY,
403
- SAMPLING_INTERVAL_NO_MEDIASOURCE,
404
- } = config.getCurrent();
405
453
  const returnedSharedReference = new SharedReference(
406
454
  this._getCurrentObservation("init"),
407
455
  this._canceller.signal,
408
456
  );
409
457
 
410
- let interval: number;
411
- if (this._lowLatencyMode) {
412
- interval = SAMPLING_INTERVAL_LOW_LATENCY;
413
- } else if (this._withMediaSource) {
414
- interval = SAMPLING_INTERVAL_MEDIASOURCE;
415
- } else {
416
- interval = SAMPLING_INTERVAL_NO_MEDIASOURCE;
417
- }
458
+ this._restartInterval();
418
459
 
419
- const onInterval = () => {
420
- this._generateObservationForEvent("timeupdate");
421
- };
422
- let intervalId = setInterval(onInterval, interval);
423
- SCANNED_MEDIA_ELEMENTS_EVENTS.map((eventName) => {
424
- const onMediaEvent = () => {
425
- restartInterval();
426
- this._generateObservationForEvent(eventName);
427
- };
460
+ const mediaElement = this._mediaElementRef.getValue();
461
+ if (mediaElement !== null) {
462
+ this._registerMediaElementEvents(mediaElement);
463
+ }
428
464
 
429
- this._mediaElement.addEventListener(eventName, onMediaEvent);
430
- this._canceller.signal.register(() => {
431
- this._mediaElement.removeEventListener(eventName, onMediaEvent);
432
- });
433
- });
434
465
  this._canceller.signal.register(() => {
435
- clearInterval(intervalId);
466
+ if (this._observationIntervalId !== null) {
467
+ clearInterval(this._observationIntervalId);
468
+ }
436
469
  returnedSharedReference.finish();
437
470
  });
438
471
  return returnedSharedReference;
439
-
440
- function restartInterval() {
441
- clearInterval(intervalId);
442
- intervalId = setInterval(onInterval, interval);
443
- }
444
472
  }
445
473
 
446
474
  private _getCurrentObservation(
@@ -448,12 +476,13 @@ export default class PlaybackObserver {
448
476
  ): IPlaybackObservation {
449
477
  /** Actual event emitted through an observation. */
450
478
  let tmpEvt: IPlaybackObserverEventType = event;
479
+ const mediaElement = this._mediaElementRef.getValue();
451
480
 
452
481
  // NOTE: `this._observationRef` may be `undefined` because we might here be
453
482
  // called in the constructor when that property is not yet set.
454
483
  const previousObservation =
455
484
  this._observationRef === undefined
456
- ? getInitialObservation(this._mediaElement)
485
+ ? getInitialObservation(mediaElement)
457
486
  : this._observationRef.getValue();
458
487
 
459
488
  /**
@@ -466,7 +495,8 @@ export default class PlaybackObserver {
466
495
  let pendingPosition: number | null = this._pendingSeek?.position ?? null;
467
496
 
468
497
  /** Initially-polled playback observation, before adjustments. */
469
- const mediaTimings = getMediaInfos(this._mediaElement);
498
+ const mediaTimings =
499
+ mediaElement === null ? getEmptyMediaInfo() : getMediaInfos(mediaElement);
470
500
  const { buffered, readyState, position, seeking } = mediaTimings;
471
501
  if (tmpEvt === "seeking") {
472
502
  // We just began seeking.
@@ -622,6 +652,59 @@ export default class PlaybackObserver {
622
652
  }
623
653
  this._observationRef.setValue(newObservation);
624
654
  }
655
+
656
+ private _restartInterval() {
657
+ const {
658
+ SAMPLING_INTERVAL_MEDIASOURCE,
659
+ SAMPLING_INTERVAL_LOW_LATENCY,
660
+ SAMPLING_INTERVAL_NO_MEDIASOURCE,
661
+ } = config.getCurrent();
662
+ let interval: number;
663
+ if (this._lowLatencyMode) {
664
+ interval = SAMPLING_INTERVAL_LOW_LATENCY;
665
+ } else if (this._withMediaSource) {
666
+ interval = SAMPLING_INTERVAL_MEDIASOURCE;
667
+ } else {
668
+ interval = SAMPLING_INTERVAL_NO_MEDIASOURCE;
669
+ }
670
+ if (this._observationIntervalId !== null) {
671
+ clearInterval(this._observationIntervalId);
672
+ }
673
+ this._observationIntervalId = setInterval(
674
+ () => this._generateObservationForEvent("timeupdate"),
675
+ interval,
676
+ );
677
+ }
678
+
679
+ private _registerMediaElementEvents(mediaElement: IMediaElement): void {
680
+ SCANNED_MEDIA_ELEMENTS_EVENTS.map((eventName) => {
681
+ const onMediaEvent = () => {
682
+ this._restartInterval();
683
+ this._generateObservationForEvent(eventName);
684
+ };
685
+ mediaElement.addEventListener(eventName, onMediaEvent);
686
+ this._canceller.signal.register(() => {
687
+ mediaElement.removeEventListener(eventName, onMediaEvent);
688
+ });
689
+ });
690
+ }
691
+
692
+ private _registerLoadedMetadataEvent(mediaElement: IMediaElement): void {
693
+ const loadedmetadataCb = this._onLoadedMetadataEvent.bind(this);
694
+ mediaElement.addEventListener("loadedmetadata", loadedmetadataCb);
695
+ this._canceller.signal.register(() => {
696
+ mediaElement.removeEventListener("loadedmetadata", loadedmetadataCb);
697
+ });
698
+ }
699
+
700
+ private _onLoadedMetadataEvent(): void {
701
+ const mediaElement = this._mediaElementRef.getValue();
702
+ if (mediaElement !== null && this._pendingSeek !== null && !this._isSeekBlocked) {
703
+ const { position: positionToSeekTo, isInternal } = this._pendingSeek;
704
+ this._pendingSeek = null;
705
+ this._actuallySetCurrentTime(mediaElement, positionToSeekTo, isInternal);
706
+ }
707
+ }
625
708
  }
626
709
 
627
710
  /**
@@ -680,9 +763,29 @@ function hasLoadedUntilTheEnd(
680
763
  return currentRange !== null && duration - currentRange.end <= REBUFFERING_GAP[suffix];
681
764
  }
682
765
 
766
+ /**
767
+ * Get polled media metrics for when the `HTMLMediaElement` is not yet "attached"
768
+ * to the `PlaybackObserver`.
769
+ *
770
+ * Those metrics actually corresponds to an idle media element.
771
+ * @returns {Object}
772
+ */
773
+ function getEmptyMediaInfo(): IMediaInfos {
774
+ return {
775
+ buffered: new ManualTimeRanges(),
776
+ position: 0,
777
+ duration: NaN,
778
+ ended: false,
779
+ paused: true,
780
+ playbackRate: 1,
781
+ readyState: 0,
782
+ seeking: false,
783
+ };
784
+ }
785
+
683
786
  /**
684
787
  * Get basic playback information.
685
- * @param {HTMLMediaElement} mediaElement
788
+ * @param {HTMLmediaElement} mediaElement
686
789
  * @returns {Object}
687
790
  */
688
791
  function getMediaInfos(mediaElement: IMediaElement): IMediaInfos {
@@ -985,8 +1088,9 @@ function prettyPrintBuffered(buffered: TimeRanges, currentTime: number): string
985
1088
  * @param {HTMLMediaElement} mediaElement
986
1089
  * @returns {Object}
987
1090
  */
988
- function getInitialObservation(mediaElement: IMediaElement): IPlaybackObservation {
989
- const mediaTimings = getMediaInfos(mediaElement);
1091
+ function getInitialObservation(mediaElement: IMediaElement | null): IPlaybackObservation {
1092
+ const mediaTimings =
1093
+ mediaElement === null ? getEmptyMediaInfo() : getMediaInfos(mediaElement);
990
1094
  return objectAssign(mediaTimings, {
991
1095
  rebuffering: null,
992
1096
  event: "init" as const,
@@ -1,5 +1,5 @@
1
- import type { IUpdatePlaybackRateCoreMessage } from "../core/types";
2
- import { CoreMessageType } from "../core/types";
1
+ import type { IUpdatePlaybackRateWorkerMessage } from "../multithread_types";
2
+ import { WorkerMessageType } from "../multithread_types";
3
3
  import type { ITrackType } from "../public_types";
4
4
  import type { IRange } from "../utils/ranges";
5
5
  import type { IReadOnlySharedReference } from "../utils/reference";
@@ -12,7 +12,7 @@ import type {
12
12
  import generateReadOnlyObserver from "./utils/generate_read_only_observer";
13
13
  import type ObservationPosition from "./utils/observation_position";
14
14
 
15
- export interface ICorePlaybackObservation {
15
+ export interface IWorkerPlaybackObservation {
16
16
  /**
17
17
  * Information on whether the media element was paused at the time of the
18
18
  * Observation.
@@ -73,18 +73,18 @@ export interface IPausedPlaybackObservation {
73
73
  pending: boolean | undefined;
74
74
  }
75
75
 
76
- export default class CorePlaybackObserver
77
- implements IReadOnlyPlaybackObserver<ICorePlaybackObservation>
76
+ export default class WorkerPlaybackObserver
77
+ implements IReadOnlyPlaybackObserver<IWorkerPlaybackObservation>
78
78
  {
79
- private _src: IReadOnlySharedReference<ICorePlaybackObservation>;
79
+ private _src: IReadOnlySharedReference<IWorkerPlaybackObservation>;
80
80
  private _cancelSignal: CancellationSignal;
81
- private _messageSender: (msg: IUpdatePlaybackRateCoreMessage) => void;
81
+ private _messageSender: (msg: IUpdatePlaybackRateWorkerMessage) => void;
82
82
  private _contentId: string;
83
83
 
84
84
  constructor(
85
- src: IReadOnlySharedReference<ICorePlaybackObservation>,
85
+ src: IReadOnlySharedReference<IWorkerPlaybackObservation>,
86
86
  contentId: string,
87
- sendMessage: (msg: IUpdatePlaybackRateCoreMessage) => void,
87
+ sendMessage: (msg: IUpdatePlaybackRateWorkerMessage) => void,
88
88
  cancellationSignal: CancellationSignal,
89
89
  ) {
90
90
  this._src = src;
@@ -105,13 +105,13 @@ export default class CorePlaybackObserver
105
105
  return undefined;
106
106
  }
107
107
 
108
- public getReference(): IReadOnlySharedReference<ICorePlaybackObservation> {
108
+ public getReference(): IReadOnlySharedReference<IWorkerPlaybackObservation> {
109
109
  return this._src;
110
110
  }
111
111
 
112
112
  public setPlaybackRate(playbackRate: number): void {
113
113
  this._messageSender({
114
- type: CoreMessageType.UpdatePlaybackRate,
114
+ type: WorkerMessageType.UpdatePlaybackRate,
115
115
  contentId: this._contentId,
116
116
  value: playbackRate,
117
117
  });
@@ -122,7 +122,7 @@ export default class CorePlaybackObserver
122
122
  }
123
123
 
124
124
  public listen(
125
- cb: (observation: ICorePlaybackObservation, stopListening: () => void) => void,
125
+ cb: (observation: IWorkerPlaybackObservation, stopListening: () => void) => void,
126
126
  params: {
127
127
  includeLastObservation?: boolean | undefined;
128
128
  clearSignal: CancellationSignal;
@@ -140,7 +140,7 @@ export default class CorePlaybackObserver
140
140
 
141
141
  public deriveReadOnlyObserver<TDest>(
142
142
  transform: (
143
- observationRef: IReadOnlySharedReference<ICorePlaybackObservation>,
143
+ observationRef: IReadOnlySharedReference<IWorkerPlaybackObservation>,
144
144
  cancellationSignal: CancellationSignal,
145
145
  ) => IReadOnlySharedReference<TDest>,
146
146
  ): IReadOnlyPlaybackObserver<TDest> {
@@ -19,8 +19,6 @@ import Manifest from "../../manifest/classes";
19
19
  import { getMDAT } from "../../parsers/containers/isobmff";
20
20
  import type { ICdnMetadata } from "../../parsers/manifest";
21
21
  import createSmoothManifestParser from "../../parsers/manifest/smooth";
22
- import globalScope from "../../utils/global_scope";
23
- import isNullOrUndefined from "../../utils/is_null_or_undefined";
24
22
  import request from "../../utils/request";
25
23
  import { strToUtf8, utf8ToStr } from "../../utils/string_parsing";
26
24
  import type { CancellationSignal } from "../../utils/task_canceller";
@@ -71,7 +69,11 @@ export default function (transportOptions: ITransportOptions): ITransportPipelin
71
69
  const url = manifestData.url ?? parserOptions.originalUrl;
72
70
  const { receivedTime: manifestReceivedTime, responseData } = manifestData;
73
71
 
74
- const documentData = getManifestAsString(responseData);
72
+ const documentData =
73
+ typeof responseData === "string"
74
+ ? new DOMParser().parseFromString(responseData, "text/xml")
75
+ : (responseData as Document); // TODO find a way to check if Document?
76
+
75
77
  const parserResult = smoothManifestParser(documentData, url, manifestReceivedTime);
76
78
 
77
79
  const manifest = new Manifest(parserResult, {
@@ -432,25 +434,3 @@ export default function (transportOptions: ITransportOptions): ITransportPipelin
432
434
  },
433
435
  };
434
436
  }
435
-
436
- /**
437
- * Try to convert a Manifest from an unknown format to a JS string format.
438
- *
439
- * Throws if the format cannot be converted.
440
- * @param {*} manifestSrc
441
- * @returns {Array.<Object | string>}
442
- */
443
- function getManifestAsString(manifestSrc: unknown): string {
444
- if (manifestSrc instanceof ArrayBuffer) {
445
- return utf8ToStr(new Uint8Array(manifestSrc));
446
- } else if (typeof manifestSrc === "string") {
447
- return manifestSrc;
448
- } else if (
449
- !isNullOrUndefined(globalScope.Document) &&
450
- manifestSrc instanceof globalScope.Document
451
- ) {
452
- return manifestSrc.documentElement.outerHTML;
453
- } else {
454
- throw new Error("Smooth Manifest Parser: Unrecognized Manifest format");
455
- }
456
- }
@@ -3,74 +3,5 @@
3
3
  * on when running in a multithread mode.
4
4
  */
5
5
 
6
- import initializeCoreEntry from "./core/entry";
7
- import type { ICoreMessage } from "./core/types";
8
- import { CoreMessageType } from "./core/types";
9
- import log from "./experimental/tools/mediaCapabilitiesProber/log";
10
- import features from "./features";
11
- import Manifest from "./manifest/classes";
12
- import DashJsParser from "./parsers/manifest/dash/js-parser";
13
- import DashWasmParser from "./parsers/manifest/dash/wasm-parser";
14
- import createDashPipelines from "./transports/dash";
15
- import globalScope from "./utils/global_scope";
16
-
17
- // Initialize Manually a `DashWasmParser` and add the feature.
18
- // TODO allow worker-side feature-switching? Not sure how
19
- const dashWasmParser = new DashWasmParser();
20
- features.dashParsers.wasm = dashWasmParser;
21
- features.dashParsers.js = DashJsParser;
22
- features.transports.dash = createDashPipelines;
23
-
24
- globalScope.onmessageerror = (_msg: MessageEvent) => {
25
- log.error("Core", "Error when receiving message from main thread.");
26
- };
27
- initializeCoreEntry((handler) => {
28
- onmessage = handler;
29
- }, sendMessage);
30
-
31
- /**
32
- * Perform a `postMessage` to main thread with the given message.
33
- * Arguments follow the `postMessage` API.
34
- * @param {Object} msg
35
- * @param {Array.<Object>} [transferables]
36
- */
37
- function sendMessage(msg: ICoreMessage, transferables?: Transferable[]): void {
38
- updateMessageFormat(msg);
39
- if (msg.type !== CoreMessageType.LogMessage) {
40
- log.debug("M<--C", "Sending message from worker", { name: msg.type });
41
- }
42
- if (transferables === undefined) {
43
- postMessage(msg);
44
- } else {
45
- // TypeScript made a mistake here, and 2busy2fix
46
- (postMessage as (msg: ICoreMessage, transferables: Transferable[]) => void)(
47
- msg,
48
- transferables,
49
- );
50
- }
51
- }
52
-
53
- /**
54
- * Ensure that we're sending data that can be serialized, as this is a
55
- * requirement for the `postMessage` browser API.
56
- *
57
- * If necessary, mutations are done in place.
58
- * @param {Object} msg
59
- */
60
- function updateMessageFormat(msg: ICoreMessage): void {
61
- if (
62
- msg.type === CoreMessageType.ManifestReady ||
63
- msg.type === CoreMessageType.ManifestUpdate
64
- ) {
65
- if (msg.value.manifest instanceof Manifest) {
66
- msg.value.manifest = msg.value.manifest.getMetadataSnapshot();
67
- if (msg.type === CoreMessageType.ManifestUpdate) {
68
- // Remove `periods` key to reduce cost of an unnecessary manifest
69
- // clone.
70
- msg.value.manifest.periods = [];
71
- }
72
- } else {
73
- log.warn("Core", "the Manifest instance should be communicated to `sendMessage`.");
74
- }
75
- }
76
- }
6
+ import initializeWorkerMain from "./core/main/worker";
7
+ initializeWorkerMain();
@@ -1 +0,0 @@
1
- {"version":3,"file":"FreezeResolver.d.ts","sourceRoot":"","sources":["../../../../src/core/entry/FreezeResolver.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAC5E,OAAO,KAAK,EACV,eAAe,EACf,kBAAkB,EAClB,mBAAmB,EACpB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,KAAK,iBAAiB,MAAM,kBAAkB,CAAC;AAiDtD;;;;;;GAMG;AACH,MAAM,WAAW,wCAAwC;IACvD,IAAI,EAAE,uBAAuB,CAAC;IAC9B,qCAAqC;IACrC,KAAK,EAAE,KAAK,CAAC;QACX,UAAU,EAAE,WAAW,CAAC;QACxB,MAAM,EAAE,OAAO,CAAC;QAChB,cAAc,EAAE,eAAe,CAAC;KACjC,CAAC,CAAC;CACJ;AAED;;;;GAIG;AACH,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE;QACL;;;WAGG;QACH,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;CACH;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,QAAQ,CAAC;IACf,KAAK,EAAE,IAAI,CAAC;CACb;AAED,mEAAmE;AACnE,MAAM,MAAM,iBAAiB,GACzB,wCAAwC,GACxC,sBAAsB,GACtB,uBAAuB,CAAC;AAE5B;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,OAAO,OAAO,cAAc;IACjC,qEAAqE;IACrE,OAAO,CAAC,kBAAkB,CAAoB;IAE9C,8EAA8E;IAC9E,OAAO,CAAC,gBAAgB,CAKtB;IAEF;;;;;;OAMG;IACH,OAAO,CAAC,kBAAkB,CAAgB;IAE1C;;;;OAIG;IACH,OAAO,CAAC,iBAAiB,CAKhB;IAET;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,uCAAuC,CAAgB;gBAEnD,iBAAiB,EAAE,iBAAiB;IAWhD;;;;;;;;;;;;OAYG;IACI,gBAAgB,CACrB,WAAW,EAAE,0BAA0B,GACtC,iBAAiB,GAAG,IAAI;IAqF3B;;;;;;;;;;;;;OAaG;IACH,OAAO,CAAC,qCAAqC;IAwD7C;;;;;;;;;OASG;IACH,OAAO,CAAC,2BAA2B;IA0GnC;;;;;;OAMG;IACH,OAAO,CAAC,qBAAqB;CA4C9B;AA4ED,2DAA2D;AAC3D,MAAM,WAAW,0BAA0B;IACzC,uDAAuD;IACvD,UAAU,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,WAAW,EAAE,kBAAkB,GAAG,IAAI,CAAC;IACvC;;;;;;OAMG;IACH,QAAQ,EAAE,eAAe,GAAG,IAAI,CAAC;IACjC;;;;OAIG;IACH,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,QAAQ,EAAE,mBAAmB,CAAC;IAC9B,kEAAkE;IAClE,WAAW,EAAE,OAAO,CAAC;CACtB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"content_preparer.d.ts","sourceRoot":"","sources":["../../../../src/core/entry/content_preparer.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAC;AAC1E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAGhD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAQvD,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAE5D,OAAO,KAAK,EAAE,kCAAkC,EAAE,MAAM,8CAA8C,CAAC;AACvG,OAAO,eAAe,MAAM,SAAS,CAAC;AACtC,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAGnE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0CAA0C,CAAC;AAClF,OAAO,iBAAiB,MAAM,kBAAkB,CAAC;AACjD,OAAO,KAAK,EAAwC,YAAY,EAAE,MAAM,UAAU,CAAC;AAEnF,OAAO,0BAA0B,MAAM,iCAAiC,CAAC;AACzE,OAAO,cAAc,MAAM,kBAAkB,CAAC;AAC9C,OAAO,iBAAiB,MAAM,uBAAuB,CAAC;AAMtD;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,CAAC,OAAO,OAAO,eAAe;IAClC;;;;OAIG;IACH,OAAO,CAAC,eAAe,CAA8B;IACrD;;;OAGG;IACH,OAAO,CAAC,iBAAiB,CAAgB;IACzC;;;;OAIG;IACH,OAAO,CAAC,4BAA4B,CAAgB;IAEpD,uBAAuB;IACvB,OAAO,CAAC,SAAS,CAAU;IAE3B;;;;;;;;OAQG;gBACS,EAAE,QAAQ,EAAE,EAAE;QAAE,QAAQ,EAAE,OAAO,CAAA;KAAE;IAQ/C;;;;;;;;;;;OAWG;IACI,oBAAoB,CACzB,WAAW,EAAE,CAAC,GAAG,EAAE,YAAY,EAAE,aAAa,CAAC,EAAE,YAAY,EAAE,KAAK,IAAI,EACxE,OAAO,EAAE,0BAA0B;IACnC,6DAA6D;IAC7D,UAAU,EAAE,kCAAkC,GAC7C,OAAO,CAAC,SAAS,CAAC;IA2LrB;;;;;OAKG;IACI,iBAAiB,IAAI,oBAAoB,GAAG,IAAI;IAIvD;;;;;;OAMG;IACI,uBAAuB,CAAC,QAAQ,EAAE,wBAAwB,GAAG,IAAI;IAIxE;;;;;;;;OAQG;IACI,iBAAiB,CACtB,WAAW,EAAE,CAAC,GAAG,EAAE,YAAY,EAAE,aAAa,CAAC,EAAE,YAAY,EAAE,KAAK,IAAI,GACvE,OAAO,CAAC,IAAI,CAAC;IA4ChB;;;OAGG;IACI,qBAAqB;CAI7B;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC;;;;OAIG;IACH,SAAS,EAAE,MAAM,CAAC;IAClB;;;;OAIG;IACH,eAAe,EAAE,eAAe,GAAG,IAAI,CAAC;IACxC;;;;OAIG;IACH,6BAA6B,EAAE,OAAO,CAAC;IACvC;;;OAGG;IACH,WAAW,EAAE,qBAAqB,CAAC;IACnC,0DAA0D;IAC1D,eAAe,EAAE,eAAe,CAAC;IACjC;;;;OAIG;IACH,QAAQ,EAAE,SAAS,GAAG,IAAI,CAAC;IAC3B;;;OAGG;IACH,cAAc,EAAE,cAAc,CAAC;IAC/B;;;OAGG;IACH,uBAAuB,EAAE,wBAAwB,CAAC;IAClD;;;OAGG;IACH,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,kEAAkE;IAClE,cAAc,EAAE,0BAA0B,GAAG,IAAI,CAAC;IAClD;;;OAGG;IACH,mBAAmB,EAAE,mBAAmB,CAAC;IACzC,uCAAuC;IACvC,kBAAkB,EAAE,iBAAiB,CAAC;IACtC;;;OAGG;IACH,iBAAiB,EAAE,iBAAiB,CAAC;IACrC;;;;OAIG;IACH,cAAc,EAAE,OAAO,CAAC;CACzB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"content_time_boundaries_observer.d.ts","sourceRoot":"","sources":["../../../../src/core/entry/content_time_boundaries_observer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EACV,sCAAsC,EACtC,WAAW,EACZ,MAAM,kBAAkB,CAAC;AAE1B,OAAO,KAAK,EACV,SAAS,EACT,WAAW,EAEX,OAAO,EACR,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AACzE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,YAAY,MAAM,2BAA2B,CAAC;AAMrD;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,OAAO,OAAO,6BAA8B,SAAQ,YAAY,CAAC,mCAAmC,CAAC;IAC1G,mFAAmF;IACnF,OAAO,CAAC,UAAU,CAAgB;IAElC,oDAAoD;IACpD,OAAO,CAAC,cAAc,CAAuC;IAE7D,2DAA2D;IAC3D,OAAO,CAAC,SAAS,CAAY;IAE7B,uEAAuE;IACvE,OAAO,CAAC,0BAA0B,CAA4B;IAE9D,kEAAkE;IAClE,OAAO,CAAC,eAAe,CAAgB;IAEvC;;;;;OAKG;IACH,OAAO,CAAC,oBAAoB,CAAgB;IAE5C;;;OAGG;gBAED,QAAQ,EAAE,SAAS,EACnB,gBAAgB,EAAE,yBAAyB,CAAC,sCAAsC,CAAC,EACnF,WAAW,EAAE,WAAW,EAAE;IA6D5B;;;;OAIG;IACI,oBAAoB,IAAI,0BAA0B;IAIzD;;;;;;;;;;;;OAYG;IACI,kBAAkB,CACvB,UAAU,EAAE,WAAW,EACvB,MAAM,EAAE,OAAO,EACf,UAAU,EAAE,WAAW,GAAG,IAAI,GAC7B,IAAI;IA+BP;;;;;;;;;OASG;IACI,sBAAsB,CAAC,UAAU,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,GAAG,IAAI;IAI7E;;;;;;;;;OASG;IACI,eAAe,CAAC,UAAU,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,GAAG,IAAI;IAItE;;;;;;;;OAQG;IACI,4BAA4B,CAAC,UAAU,EAAE,WAAW,GAAG,IAAI;IAQlE;;;;;;;;;;OAUG;IACI,0BAA0B,CAAC,UAAU,EAAE,WAAW,GAAG,IAAI;IAQhE;;;OAGG;IACI,OAAO;IAKd,OAAO,CAAC,wBAAwB;IAQhC,OAAO,CAAC,2BAA2B;IAWnC,OAAO,CAAC,mBAAmB;IAkC3B,OAAO,CAAC,mBAAmB;IAU3B,OAAO,CAAC,6BAA6B;IAYrC,OAAO,CAAC,iBAAiB;CAc1B;AAED,MAAM,WAAW,0BAA0B;IACzC;;;;;OAKG;IACH,cAAc,EAAE,MAAM,CAAC;IACvB;;;;;;;;;;OAUG;IACH,KAAK,EAAE,OAAO,CAAC;CAChB;AAED;;;GAGG;AACH,MAAM,WAAW,mCAAmC;IAClD,mDAAmD;IACnD,OAAO,EAAE,YAAY,CAAC;IACtB,0DAA0D;IAC1D,YAAY,EAAE,OAAO,CAAC;IACtB;;;OAGG;IACH,oBAAoB,EAAE,0BAA0B,CAAC;IACjD;;;;;;;;;OASG;IACH,WAAW,EAAE,IAAI,CAAC;IAClB;;;;;;;;;OASG;IACH,YAAY,EAAE,IAAI,CAAC;CACpB;AAgPD,MAAM,MAAM,uCAAuC,GAAG,IAAI,CACxD,sCAAsC,EACtC,UAAU,CACX,CAAC"}
@@ -1,36 +0,0 @@
1
- import type { IMainThreadMessage } from "../../main_thread/types";
2
- import SharedReference from "../../utils/reference";
3
- import type { ICoreMessage, IResolutionInfo } from "../types";
4
- export type IMessageReceiverCallback = (evt: {
5
- data: IMainThreadMessage;
6
- }) => void;
7
- /**
8
- * Initialize a `CoreEntry`, which is the part of the RxPlayer acting as an
9
- * entry point to all its "core" code.
10
- *
11
- * Its role is to receive and react to messages coming from "main thead", which
12
- * may include loading and playing a content, and to send back messages for the main
13
- * thread.
14
- * @param {Function} setMessageReceiver - Declares the function that will
15
- * receive messages coming from the "main thread" part of the RxPlayer logic.
16
- * @param {Function} sendMessage - Function allowing to send messages to the
17
- * "main thread" part of the RxPlayer logic.
18
- */
19
- export default function initializeCoreEntry(setMessageReceiver: (cb: IMessageReceiverCallback) => void, sendMessage: (msg: ICoreMessage, transferables?: Transferable[]) => void): void;
20
- /**
21
- * Collection of so-called "references": values configuring playback that may
22
- * be updated at any time and that the CoreEntry should react on.
23
- */
24
- export interface ICoreReferences {
25
- limitVideoResolution: SharedReference<IResolutionInfo>;
26
- /** Max buffer size after the current position, in seconds (we GC further up). */
27
- maxBufferAhead: SharedReference<number>;
28
- /** Max buffer size before the current position, in seconds (we GC further down). */
29
- maxBufferBehind: SharedReference<number>;
30
- /** Buffer maximum size in kiloBytes at which we stop downloading */
31
- maxVideoBufferSize: SharedReference<number>;
32
- throttleVideoBitrate: SharedReference<number>;
33
- /** Buffer "goal" at which we stop downloading new segments. */
34
- wantedBufferAhead: SharedReference<number>;
35
- }
36
- //# sourceMappingURL=core_entry.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"core_entry.d.ts","sourceRoot":"","sources":["../../../../src/core/entry/core_entry.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAEV,kBAAkB,EAGnB,MAAM,yBAAyB,CAAC;AAajC,OAAO,eAAe,MAAM,uBAAuB,CAAC;AAQpD,OAAO,KAAK,EACV,YAAY,EAEZ,eAAe,EAChB,MAAM,UAAU,CAAC;AAUlB,MAAM,MAAM,wBAAwB,GAAG,CAAC,GAAG,EAAE;IAAE,IAAI,EAAE,kBAAkB,CAAA;CAAE,KAAK,IAAI,CAAC;AAEnF;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,OAAO,UAAU,mBAAmB,CACzC,kBAAkB,EAAE,CAAC,EAAE,EAAE,wBAAwB,KAAK,IAAI,EAC1D,WAAW,EAAE,CAAC,GAAG,EAAE,YAAY,EAAE,aAAa,CAAC,EAAE,YAAY,EAAE,KAAK,IAAI,GACvE,IAAI,CA6YN;AA2vBD;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,oBAAoB,EAAE,eAAe,CAAC,eAAe,CAAC,CAAC;IACvD,iFAAiF;IACjF,cAAc,EAAE,eAAe,CAAC,MAAM,CAAC,CAAC;IACxC,oFAAoF;IACpF,eAAe,EAAE,eAAe,CAAC,MAAM,CAAC,CAAC;IACzC,oEAAoE;IACpE,kBAAkB,EAAE,eAAe,CAAC,MAAM,CAAC,CAAC;IAC5C,oBAAoB,EAAE,eAAe,CAAC,MAAM,CAAC,CAAC;IAC9C,+DAA+D;IAC/D,iBAAiB,EAAE,eAAe,CAAC,MAAM,CAAC,CAAC;CAC5C"}