@videojs/html 10.0.0-beta.28 → 10.0.0-beta.29

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 (533) hide show
  1. package/cdn/{adapter-XTen-YVQ.js → adapter-CEnNWvii.js} +17 -4
  2. package/cdn/adapter-CEnNWvii.js.map +1 -0
  3. package/cdn/adapter-DaKW8NzI.js +2 -0
  4. package/cdn/adapter-DaKW8NzI.js.map +1 -0
  5. package/cdn/audio-headless.dev.js +1 -1
  6. package/cdn/audio-headless.js +1 -1
  7. package/cdn/audio-minimal-ui.dev.js +2 -2
  8. package/cdn/audio-minimal-ui.js +1 -1
  9. package/cdn/audio-minimal.dev.js +5 -5
  10. package/cdn/audio-minimal.dev.js.map +1 -1
  11. package/cdn/audio-minimal.js +1 -1
  12. package/cdn/audio-minimal.js.map +1 -1
  13. package/cdn/audio-ui.dev.js +2 -2
  14. package/cdn/audio-ui.js +1 -1
  15. package/cdn/audio.dev.js +5 -5
  16. package/cdn/audio.dev.js.map +1 -1
  17. package/cdn/audio.js +1 -1
  18. package/cdn/audio.js.map +1 -1
  19. package/cdn/background.dev.js +1 -1
  20. package/cdn/background.js +1 -1
  21. package/cdn/background.js.map +1 -1
  22. package/cdn/compounds-C4YYLyL2.js +8 -0
  23. package/cdn/compounds-C4YYLyL2.js.map +1 -0
  24. package/cdn/{compounds-nk9RJtBK.js → compounds-C73u1MeO.js} +63 -59
  25. package/cdn/compounds-C73u1MeO.js.map +1 -0
  26. package/cdn/create-player-BU8LDJDL.js +2 -0
  27. package/cdn/create-player-BU8LDJDL.js.map +1 -0
  28. package/cdn/{create-player-DK9WOywd.js → create-player-Db1CIvlK.js} +58 -46
  29. package/cdn/create-player-Db1CIvlK.js.map +1 -0
  30. package/cdn/{default-BqQDVloS.js → default-A3aM0skz.js} +2 -2
  31. package/cdn/default-A3aM0skz.js.map +1 -0
  32. package/cdn/default-BDyhiTCm.js +2 -0
  33. package/cdn/default-BDyhiTCm.js.map +1 -0
  34. package/cdn/{default-I2LasfxC.js → default-C1_k1NeB.js} +2 -2
  35. package/cdn/default-C1_k1NeB.js.map +1 -0
  36. package/cdn/default-DHrMd4ie.js +2 -0
  37. package/cdn/default-DHrMd4ie.js.map +1 -0
  38. package/cdn/error-surface-BID4D3DW.js +59 -0
  39. package/cdn/error-surface-BID4D3DW.js.map +1 -0
  40. package/cdn/{select-tracks-nRPBa1NC.js → error-surface-D0bo71gD.js} +442 -48
  41. package/cdn/error-surface-D0bo71gD.js.map +1 -0
  42. package/cdn/gesture-element-CeRy1IVs.js +2 -0
  43. package/cdn/gesture-element-CeRy1IVs.js.map +1 -0
  44. package/cdn/{gesture-element-6Ld1YwIL.js → gesture-element-DB67OYCE.js} +3 -3
  45. package/cdn/gesture-element-DB67OYCE.js.map +1 -0
  46. package/cdn/{hls-js-C4P_b2tT.js → hls-js-CiE4wOrG.js} +2 -2
  47. package/cdn/{hls-js-C4P_b2tT.js.map → hls-js-CiE4wOrG.js.map} +1 -1
  48. package/cdn/{hls-js-CATW7NBm.js → hls-js-DBKRCbQm.js} +2 -2
  49. package/cdn/{hls-js-CATW7NBm.js.map → hls-js-DBKRCbQm.js.map} +1 -1
  50. package/cdn/{hls-js-BEuVm0u9.js → hls-js-DX2NGCAr.js} +2 -2
  51. package/cdn/{hls-js-BEuVm0u9.js.map → hls-js-DX2NGCAr.js.map} +1 -1
  52. package/cdn/{hls-js-WCNy9MVh.js → hls-js-JeH8yvsP.js} +2 -2
  53. package/cdn/{hls-js-WCNy9MVh.js.map → hls-js-JeH8yvsP.js.map} +1 -1
  54. package/cdn/i18n-CpBDXf6M.js +2 -0
  55. package/cdn/{i18n-Dc7WM2xd.js.map → i18n-CpBDXf6M.js.map} +1 -1
  56. package/cdn/{i18n-Ch4t6EjV.js → i18n-D0nhPa0m.js} +2 -2
  57. package/cdn/{i18n-Ch4t6EjV.js.map → i18n-D0nhPa0m.js.map} +1 -1
  58. package/cdn/{live-button-element-DaHgnYdw.js → live-button-element-Co8z2LkI.js} +2 -2
  59. package/cdn/{live-button-element-DaHgnYdw.js.map → live-button-element-Co8z2LkI.js.map} +1 -1
  60. package/cdn/{live-button-element-Bae44kBN.js → live-button-element-zE-8uoR2.js} +3 -3
  61. package/cdn/{live-button-element-Bae44kBN.js.map → live-button-element-zE-8uoR2.js.map} +1 -1
  62. package/cdn/live-video-minimal.dev.js +11 -9
  63. package/cdn/live-video-minimal.dev.js.map +1 -1
  64. package/cdn/live-video-minimal.js +1 -1
  65. package/cdn/live-video-minimal.js.map +1 -1
  66. package/cdn/live-video.dev.js +12 -10
  67. package/cdn/live-video.dev.js.map +1 -1
  68. package/cdn/live-video.js +1 -1
  69. package/cdn/live-video.js.map +1 -1
  70. package/cdn/media/hls-audio.dev.js +1 -1
  71. package/cdn/media/hls-audio.js +1 -1
  72. package/cdn/media/hls-background-video.dev.js +1 -1
  73. package/cdn/media/hls-background-video.js +1 -1
  74. package/cdn/media/hls-video.dev.js +1 -1
  75. package/cdn/media/hls-video.js +1 -1
  76. package/cdn/media/mux-audio/hls-js.dev.js +1 -1
  77. package/cdn/media/mux-audio/hls-js.js +1 -1
  78. package/cdn/media/mux-audio/spf.dev.js +2 -2
  79. package/cdn/media/mux-audio/spf.js +1 -1
  80. package/cdn/media/mux-audio.dev.js +1 -1
  81. package/cdn/media/mux-audio.js +1 -1
  82. package/cdn/media/mux-background-video.dev.js +1 -1
  83. package/cdn/media/mux-background-video.js +1 -1
  84. package/cdn/media/mux-data.dev.js +1 -1
  85. package/cdn/media/mux-data.dev.js.map +1 -1
  86. package/cdn/media/mux-data.js +1 -1
  87. package/cdn/media/mux-data.js.map +1 -1
  88. package/cdn/media/mux-video/hls-js.dev.js +1 -1
  89. package/cdn/media/mux-video/hls-js.js +1 -1
  90. package/cdn/media/mux-video/spf.dev.js +2 -2
  91. package/cdn/media/mux-video/spf.js +1 -1
  92. package/cdn/media/mux-video.dev.js +1 -1
  93. package/cdn/media/mux-video.js +1 -1
  94. package/cdn/media/vimeo-video.dev.js +27 -5
  95. package/cdn/media/vimeo-video.dev.js.map +1 -1
  96. package/cdn/media/vimeo-video.js +1 -1
  97. package/cdn/media/vimeo-video.js.map +1 -1
  98. package/cdn/{media-Uxm0d3Vx.js → media-BI8caj07.js} +3 -3
  99. package/cdn/{media-Uxm0d3Vx.js.map → media-BI8caj07.js.map} +1 -1
  100. package/cdn/{media-COIe3uI5.js → media-BNuI0Im7.js} +19 -6
  101. package/cdn/media-BNuI0Im7.js.map +1 -0
  102. package/cdn/media-CQxFuDcv.js +2 -0
  103. package/cdn/{media-CPVSKLdk.js.map → media-CQxFuDcv.js.map} +1 -1
  104. package/cdn/media-D4tG62L5.js +2 -0
  105. package/cdn/{media-BTipOcKo.js.map → media-D4tG62L5.js.map} +1 -1
  106. package/cdn/{media-oa3nyL2o.js → media-DI6DvYm3.js} +3 -3
  107. package/cdn/{media-oa3nyL2o.js.map → media-DI6DvYm3.js.map} +1 -1
  108. package/cdn/media-DU3Xf5XR.js +2 -0
  109. package/cdn/media-DU3Xf5XR.js.map +1 -0
  110. package/cdn/media-mYKOAsk3.js +825 -0
  111. package/cdn/media-mYKOAsk3.js.map +1 -0
  112. package/cdn/media-zReLnePj.js +2 -0
  113. package/cdn/media-zReLnePj.js.map +1 -0
  114. package/cdn/{minimal-DQCLKRyR.js → minimal-3OmH0xQS.js} +2 -2
  115. package/cdn/minimal-3OmH0xQS.js.map +1 -0
  116. package/cdn/{minimal-DLosvq31.js → minimal-6w_Vyyl9.js} +2 -2
  117. package/cdn/minimal-6w_Vyyl9.js.map +1 -0
  118. package/cdn/minimal-BWLTn7oQ.js +2 -0
  119. package/cdn/minimal-BWLTn7oQ.js.map +1 -0
  120. package/cdn/minimal-DIGrklyh.js +2 -0
  121. package/cdn/minimal-DIGrklyh.js.map +1 -0
  122. package/cdn/{minimal-ui-CRKvUmB8.js → minimal-ui-BCIESK8f.js} +8 -8
  123. package/cdn/{minimal-ui-CRKvUmB8.js.map → minimal-ui-BCIESK8f.js.map} +1 -1
  124. package/cdn/minimal-ui-BXrq3z4U.js +2 -0
  125. package/cdn/{minimal-ui-Et2Wcn7r.js.map → minimal-ui-BXrq3z4U.js.map} +1 -1
  126. package/cdn/{minimal-ui-BpHxIo4z.js → minimal-ui-DEalpMk6.js} +4 -4
  127. package/cdn/{minimal-ui-BpHxIo4z.js.map → minimal-ui-DEalpMk6.js.map} +1 -1
  128. package/cdn/{minimal-ui-8iRZf_72.js → minimal-ui-vY3QgohH.js} +2 -2
  129. package/cdn/{minimal-ui-8iRZf_72.js.map → minimal-ui-vY3QgohH.js.map} +1 -1
  130. package/cdn/{player-DM9rUXg-.js → player-B3GlPF90.js} +2 -2
  131. package/cdn/{player-DM9rUXg-.js.map → player-B3GlPF90.js.map} +1 -1
  132. package/cdn/player-CtTC7qa5.js +2 -0
  133. package/cdn/{player-rCFqzWrA.js.map → player-CtTC7qa5.js.map} +1 -1
  134. package/cdn/player-DKkph8UM.js +2 -0
  135. package/cdn/{player-BRQLp5bX.js.map → player-DKkph8UM.js.map} +1 -1
  136. package/cdn/{player-CKTAtwit.js → player-DPDmTRvg.js} +2 -2
  137. package/cdn/{player-CKTAtwit.js.map → player-DPDmTRvg.js.map} +1 -1
  138. package/cdn/player-DrDd7LJi.js +2 -0
  139. package/cdn/{player-BloX4l6F.js.map → player-DrDd7LJi.js.map} +1 -1
  140. package/cdn/{player-B2oraRyD.js → player-L5UpZmT4.js} +2 -2
  141. package/cdn/{player-B2oraRyD.js.map → player-L5UpZmT4.js.map} +1 -1
  142. package/cdn/{poster-element-BGr1VQJB.js → poster-element-B5tdJ2ub.js} +179 -38
  143. package/cdn/poster-element-B5tdJ2ub.js.map +1 -0
  144. package/cdn/poster-element-B8QwXSU_.js +2 -0
  145. package/cdn/poster-element-B8QwXSU_.js.map +1 -0
  146. package/cdn/{error-surface-drmCvBVW.js → relocation-pipelines-Dh8CcgHw.js} +5 -343
  147. package/cdn/relocation-pipelines-Dh8CcgHw.js.map +1 -0
  148. package/cdn/relocation-pipelines-DunE4gcV.js +2 -0
  149. package/cdn/relocation-pipelines-DunE4gcV.js.map +1 -0
  150. package/cdn/{seek-button-element-XMTLIxZj.js → seek-button-element-5co-k0Dx.js} +4 -4
  151. package/cdn/seek-button-element-5co-k0Dx.js.map +1 -0
  152. package/cdn/{seek-button-element-FlgBVoGM.js → seek-button-element-B8TkILg-.js} +2 -2
  153. package/cdn/{seek-button-element-FlgBVoGM.js.map → seek-button-element-B8TkILg-.js.map} +1 -1
  154. package/cdn/shallow-equal-C7S8rj2f.js +16 -0
  155. package/cdn/shallow-equal-C7S8rj2f.js.map +1 -0
  156. package/cdn/shallow-equal-KV1zFqZi.js +2 -0
  157. package/cdn/shallow-equal-KV1zFqZi.js.map +1 -0
  158. package/cdn/{skin-element-DL-Kqa5f.js → skin-element-DrkI8xuM.js} +2 -2
  159. package/cdn/{skin-element-DL-Kqa5f.js.map → skin-element-DrkI8xuM.js.map} +1 -1
  160. package/cdn/{skin-element-DNytI-uu.js → skin-element-DvX6Bxsv.js} +2 -2
  161. package/cdn/{skin-element-DNytI-uu.js.map → skin-element-DvX6Bxsv.js.map} +1 -1
  162. package/cdn/{text-element-DeWBNKXb.js → text-element-BoY6AhMn.js} +2 -2
  163. package/cdn/{text-element-DeWBNKXb.js.map → text-element-BoY6AhMn.js.map} +1 -1
  164. package/cdn/{text-element-D88ArbZz.js → text-element-cg6l21cd.js} +2 -2
  165. package/cdn/{text-element-D88ArbZz.js.map → text-element-cg6l21cd.js.map} +1 -1
  166. package/cdn/time-slider-chapters-element-BfLjdnU4.js +2 -0
  167. package/cdn/time-slider-chapters-element-BfLjdnU4.js.map +1 -0
  168. package/cdn/{time-slider-chapters-element-DJ0abZXI.js → time-slider-chapters-element-CznFQWFm.js} +5 -5
  169. package/cdn/time-slider-chapters-element-CznFQWFm.js.map +1 -0
  170. package/cdn/{ui-BU3_2gDQ.js → ui-BwzqkJNK.js} +7 -7
  171. package/cdn/{ui-BU3_2gDQ.js.map → ui-BwzqkJNK.js.map} +1 -1
  172. package/cdn/ui-DayfItun.js +2 -0
  173. package/cdn/{ui-C0isALTQ.js.map → ui-DayfItun.js.map} +1 -1
  174. package/cdn/ui-PSnD-pv8.js +2 -0
  175. package/cdn/{ui-DVpkE1MN.js.map → ui-PSnD-pv8.js.map} +1 -1
  176. package/cdn/{ui-BsaWWE4y.js → ui-fnKp94a7.js} +9 -9
  177. package/cdn/{ui-BsaWWE4y.js.map → ui-fnKp94a7.js.map} +1 -1
  178. package/cdn/video-headless.dev.js +1 -1
  179. package/cdn/video-headless.js +1 -1
  180. package/cdn/video-minimal-ui.dev.js +2 -2
  181. package/cdn/video-minimal-ui.js +1 -1
  182. package/cdn/video-minimal.dev.js +8 -6
  183. package/cdn/video-minimal.dev.js.map +1 -1
  184. package/cdn/video-minimal.js +1 -1
  185. package/cdn/video-minimal.js.map +1 -1
  186. package/cdn/video-ui.dev.js +2 -2
  187. package/cdn/video-ui.js +1 -1
  188. package/cdn/video.dev.js +9 -7
  189. package/cdn/video.dev.js.map +1 -1
  190. package/cdn/video.js +1 -1
  191. package/cdn/video.js.map +1 -1
  192. package/dist/default/__generated__/skins/default-video/styles/buttons.css +132 -18
  193. package/dist/default/__generated__/skins/default-video/styles/captions.css +22 -0
  194. package/dist/default/__generated__/skins/default-video/styles/container.css +121 -8
  195. package/dist/default/__generated__/skins/default-video/styles/controls.css +436 -21
  196. package/dist/default/__generated__/skins/default-video/styles/dialog.css +169 -0
  197. package/dist/default/__generated__/skins/default-video/styles/indicator.css +459 -0
  198. package/dist/default/__generated__/skins/default-video/styles/menus.css +254 -0
  199. package/dist/default/__generated__/skins/default-video/styles/overlays.css +26 -2
  200. package/dist/default/__generated__/skins/default-video/styles/popups.css +338 -12
  201. package/dist/default/__generated__/skins/default-video/styles/poster.css +4 -4
  202. package/dist/default/__generated__/skins/default-video/styles/sliders.css +355 -31
  203. package/dist/default/__generated__/skins/default-video/styles/styles.css +2455 -216
  204. package/dist/default/__generated__/skins/default-video/styles/theme.css +4 -19
  205. package/dist/default/__generated__/skins/default-video/styles/video.css +29 -0
  206. package/dist/default/__generated__/skins/minimal-video/styles/base.css +25 -0
  207. package/dist/default/__generated__/skins/minimal-video/styles/buttons.css +266 -0
  208. package/dist/default/__generated__/skins/minimal-video/styles/captions.css +22 -0
  209. package/dist/default/__generated__/skins/minimal-video/styles/container.css +158 -0
  210. package/dist/default/__generated__/skins/minimal-video/styles/controls.css +182 -0
  211. package/dist/default/__generated__/skins/minimal-video/styles/dialog.css +77 -0
  212. package/dist/default/__generated__/skins/minimal-video/styles/indicator.css +322 -0
  213. package/dist/default/__generated__/skins/minimal-video/styles/menus.css +254 -0
  214. package/dist/default/__generated__/skins/minimal-video/styles/overlays.css +35 -0
  215. package/dist/default/__generated__/skins/minimal-video/styles/popups.css +371 -0
  216. package/dist/default/__generated__/skins/minimal-video/styles/poster.css +47 -0
  217. package/dist/default/__generated__/skins/minimal-video/styles/sliders.css +436 -0
  218. package/dist/default/__generated__/skins/minimal-video/styles/styles.css +2246 -0
  219. package/dist/default/__generated__/skins/minimal-video/styles/theme.css +7 -0
  220. package/dist/default/__generated__/skins/minimal-video/styles/video.css +29 -0
  221. package/dist/default/_virtual/inline-css_src/define/audio/minimal-skin.js +1 -1
  222. package/dist/default/_virtual/inline-css_src/define/audio/minimal-skin.js.map +1 -1
  223. package/dist/default/_virtual/inline-css_src/define/audio/skin.js +1 -1
  224. package/dist/default/_virtual/inline-css_src/define/audio/skin.js.map +1 -1
  225. package/dist/default/_virtual/inline-css_src/define/live-audio/minimal-skin.js +1 -1
  226. package/dist/default/_virtual/inline-css_src/define/live-audio/minimal-skin.js.map +1 -1
  227. package/dist/default/_virtual/inline-css_src/define/live-audio/skin.js +1 -1
  228. package/dist/default/_virtual/inline-css_src/define/live-audio/skin.js.map +1 -1
  229. package/dist/default/_virtual/inline-css_src/define/live-video/minimal-skin.js +1 -1
  230. package/dist/default/_virtual/inline-css_src/define/live-video/minimal-skin.js.map +1 -1
  231. package/dist/default/_virtual/inline-css_src/define/live-video/skin.js +1 -1
  232. package/dist/default/_virtual/inline-css_src/define/live-video/skin.js.map +1 -1
  233. package/dist/default/_virtual/inline-css_src/define/video/minimal-skin.js +1 -1
  234. package/dist/default/_virtual/inline-css_src/define/video/minimal-skin.js.map +1 -1
  235. package/dist/default/_virtual/inline-css_src/define/video/skin.js +1 -1
  236. package/dist/default/_virtual/inline-css_src/define/video/skin.js.map +1 -1
  237. package/dist/default/define/audio/minimal-skin.css +103 -101
  238. package/dist/default/define/audio/skin.css +68 -69
  239. package/dist/default/define/live-audio/minimal-skin.css +103 -101
  240. package/dist/default/define/live-audio/skin.css +68 -69
  241. package/dist/default/define/live-video/minimal-skin.css +140 -120
  242. package/dist/default/define/live-video/minimal-skin.js +1 -1
  243. package/dist/default/define/live-video/minimal-skin.js.map +1 -1
  244. package/dist/default/define/live-video/minimal-skin.tailwind.js +1 -1
  245. package/dist/default/define/live-video/minimal-skin.tailwind.js.map +1 -1
  246. package/dist/default/define/live-video/skin.css +89 -76
  247. package/dist/default/define/live-video/skin.js +1 -1
  248. package/dist/default/define/live-video/skin.js.map +1 -1
  249. package/dist/default/define/live-video/skin.tailwind.js +1 -1
  250. package/dist/default/define/live-video/skin.tailwind.js.map +1 -1
  251. package/dist/default/define/ui/gesture.js +7 -0
  252. package/dist/default/define/ui/gesture.js.map +1 -0
  253. package/dist/default/define/video/minimal-skin.css +140 -120
  254. package/dist/default/define/video/minimal-skin.js +1 -1
  255. package/dist/default/define/video/minimal-skin.js.map +1 -1
  256. package/dist/default/define/video/minimal-skin.tailwind.js +1 -1
  257. package/dist/default/define/video/minimal-skin.tailwind.js.map +1 -1
  258. package/dist/default/define/video/skin.css +89 -76
  259. package/dist/default/define/video/skin.js +1 -1
  260. package/dist/default/define/video/skin.js.map +1 -1
  261. package/dist/default/define/video/skin.tailwind.js +1 -1
  262. package/dist/default/define/video/skin.tailwind.js.map +1 -1
  263. package/dist/default/icons/dist/element/default/icons.js +1 -1
  264. package/dist/default/icons/dist/element/default/icons.js.map +1 -1
  265. package/dist/default/icons/dist/element/minimal/icons.js +1 -1
  266. package/dist/default/icons/dist/element/minimal/icons.js.map +1 -1
  267. package/dist/default/icons/dist/html/default/airplay-exit.js +1 -1
  268. package/dist/default/icons/dist/html/default/airplay-exit.js.map +1 -1
  269. package/dist/default/icons/dist/html/minimal/airplay-exit.js +1 -1
  270. package/dist/default/icons/dist/html/minimal/airplay-exit.js.map +1 -1
  271. package/dist/default/icons/dist/render/default/index.js +1 -1
  272. package/dist/default/icons/dist/render/default/index.js.map +1 -1
  273. package/dist/default/icons/dist/render/minimal/index.js +1 -1
  274. package/dist/default/icons/dist/render/minimal/index.js.map +1 -1
  275. package/dist/default/media/hls-background-video/media.js +18 -0
  276. package/dist/default/media/hls-background-video/media.js.map +1 -1
  277. package/dist/default/skins/dist/default/default/tailwind/components/button.js +3 -1
  278. package/dist/default/skins/dist/default/default/tailwind/components/button.js.map +1 -1
  279. package/dist/default/skins/dist/default/default/tailwind/components/poster.js +8 -1
  280. package/dist/default/skins/dist/default/default/tailwind/components/poster.js.map +1 -1
  281. package/dist/default/skins/dist/default/default/tailwind/components/slider.js +10 -10
  282. package/dist/default/skins/dist/default/default/tailwind/components/slider.js.map +1 -1
  283. package/dist/default/skins/dist/default/default/tailwind/components/thumbnail.js +1 -1
  284. package/dist/default/skins/dist/default/default/tailwind/components/thumbnail.js.map +1 -1
  285. package/dist/default/skins/dist/default/default/tailwind/video.tailwind.js +2 -2
  286. package/dist/default/skins/dist/default/default/tailwind/video.tailwind.js.map +1 -1
  287. package/dist/default/skins/dist/default/minimal/tailwind/components/poster.js +8 -1
  288. package/dist/default/skins/dist/default/minimal/tailwind/components/poster.js.map +1 -1
  289. package/dist/default/skins/dist/default/minimal/tailwind/components/slider.js +13 -12
  290. package/dist/default/skins/dist/default/minimal/tailwind/components/slider.js.map +1 -1
  291. package/dist/default/skins/dist/default/minimal/tailwind/components/thumbnail.js +1 -1
  292. package/dist/default/skins/dist/default/minimal/tailwind/components/thumbnail.js.map +1 -1
  293. package/dist/default/skins/dist/default/minimal/tailwind/video.tailwind.js +6 -5
  294. package/dist/default/skins/dist/default/minimal/tailwind/video.tailwind.js.map +1 -1
  295. package/dist/default/skins/dist/default/shared/tailwind/icon-state.js +4 -4
  296. package/dist/default/skins/dist/default/shared/tailwind/icon-state.js.map +1 -1
  297. package/dist/default/store/provider-mixin.js +22 -8
  298. package/dist/default/store/provider-mixin.js.map +1 -1
  299. package/dist/default/ui/audio-track-radio-group/audio-track-radio-group-element.js +1 -1
  300. package/dist/default/ui/audio-track-radio-group/audio-track-radio-group-element.js.map +1 -1
  301. package/dist/default/ui/captions-radio-group/captions-radio-group-element.js +1 -1
  302. package/dist/default/ui/captions-radio-group/captions-radio-group-element.js.map +1 -1
  303. package/dist/default/ui/gesture/gesture-element.js.map +1 -1
  304. package/dist/default/ui/hotkey/hotkey-element.js.map +1 -1
  305. package/dist/default/ui/menu/context.js.map +1 -1
  306. package/dist/default/ui/menu/menu-element.js +28 -27
  307. package/dist/default/ui/menu/menu-element.js.map +1 -1
  308. package/dist/default/ui/menu/menu-radio-group-element.js +14 -14
  309. package/dist/default/ui/menu/menu-radio-group-element.js.map +1 -1
  310. package/dist/default/ui/playback-rate-radio-group/playback-rate-radio-group-element.js +1 -1
  311. package/dist/default/ui/playback-rate-radio-group/playback-rate-radio-group-element.js.map +1 -1
  312. package/dist/default/ui/poster/poster-element.js +138 -8
  313. package/dist/default/ui/poster/poster-element.js.map +1 -1
  314. package/dist/default/ui/quality-radio-group/quality-radio-group-element.js +1 -1
  315. package/dist/default/ui/quality-radio-group/quality-radio-group-element.js.map +1 -1
  316. package/dist/default/ui/slider/slider-preview-element.js.map +1 -1
  317. package/dist/dev/__generated__/skins/default-video/styles/buttons.css +132 -18
  318. package/dist/dev/__generated__/skins/default-video/styles/captions.css +22 -0
  319. package/dist/dev/__generated__/skins/default-video/styles/container.css +121 -8
  320. package/dist/dev/__generated__/skins/default-video/styles/controls.css +436 -21
  321. package/dist/dev/__generated__/skins/default-video/styles/dialog.css +169 -0
  322. package/dist/dev/__generated__/skins/default-video/styles/indicator.css +459 -0
  323. package/dist/dev/__generated__/skins/default-video/styles/menus.css +254 -0
  324. package/dist/dev/__generated__/skins/default-video/styles/overlays.css +26 -2
  325. package/dist/dev/__generated__/skins/default-video/styles/popups.css +338 -12
  326. package/dist/dev/__generated__/skins/default-video/styles/poster.css +4 -4
  327. package/dist/dev/__generated__/skins/default-video/styles/sliders.css +355 -31
  328. package/dist/dev/__generated__/skins/default-video/styles/styles.css +2455 -216
  329. package/dist/dev/__generated__/skins/default-video/styles/theme.css +4 -19
  330. package/dist/dev/__generated__/skins/default-video/styles/video.css +29 -0
  331. package/dist/dev/__generated__/skins/minimal-video/styles/base.css +25 -0
  332. package/dist/dev/__generated__/skins/minimal-video/styles/buttons.css +266 -0
  333. package/dist/dev/__generated__/skins/minimal-video/styles/captions.css +22 -0
  334. package/dist/dev/__generated__/skins/minimal-video/styles/container.css +158 -0
  335. package/dist/dev/__generated__/skins/minimal-video/styles/controls.css +182 -0
  336. package/dist/dev/__generated__/skins/minimal-video/styles/dialog.css +77 -0
  337. package/dist/dev/__generated__/skins/minimal-video/styles/indicator.css +322 -0
  338. package/dist/dev/__generated__/skins/minimal-video/styles/menus.css +254 -0
  339. package/dist/dev/__generated__/skins/minimal-video/styles/overlays.css +35 -0
  340. package/dist/dev/__generated__/skins/minimal-video/styles/popups.css +371 -0
  341. package/dist/dev/__generated__/skins/minimal-video/styles/poster.css +47 -0
  342. package/dist/dev/__generated__/skins/minimal-video/styles/sliders.css +436 -0
  343. package/dist/dev/__generated__/skins/minimal-video/styles/styles.css +2246 -0
  344. package/dist/dev/__generated__/skins/minimal-video/styles/theme.css +7 -0
  345. package/dist/dev/__generated__/skins/minimal-video/styles/video.css +29 -0
  346. package/dist/dev/_virtual/inline-css_src/define/audio/minimal-skin.js +1 -1
  347. package/dist/dev/_virtual/inline-css_src/define/audio/minimal-skin.js.map +1 -1
  348. package/dist/dev/_virtual/inline-css_src/define/audio/skin.js +1 -1
  349. package/dist/dev/_virtual/inline-css_src/define/audio/skin.js.map +1 -1
  350. package/dist/dev/_virtual/inline-css_src/define/live-audio/minimal-skin.js +1 -1
  351. package/dist/dev/_virtual/inline-css_src/define/live-audio/minimal-skin.js.map +1 -1
  352. package/dist/dev/_virtual/inline-css_src/define/live-audio/skin.js +1 -1
  353. package/dist/dev/_virtual/inline-css_src/define/live-audio/skin.js.map +1 -1
  354. package/dist/dev/_virtual/inline-css_src/define/live-video/minimal-skin.js +1 -1
  355. package/dist/dev/_virtual/inline-css_src/define/live-video/minimal-skin.js.map +1 -1
  356. package/dist/dev/_virtual/inline-css_src/define/live-video/skin.js +1 -1
  357. package/dist/dev/_virtual/inline-css_src/define/live-video/skin.js.map +1 -1
  358. package/dist/dev/_virtual/inline-css_src/define/video/minimal-skin.js +1 -1
  359. package/dist/dev/_virtual/inline-css_src/define/video/minimal-skin.js.map +1 -1
  360. package/dist/dev/_virtual/inline-css_src/define/video/skin.js +1 -1
  361. package/dist/dev/_virtual/inline-css_src/define/video/skin.js.map +1 -1
  362. package/dist/dev/define/audio/minimal-skin.css +103 -101
  363. package/dist/dev/define/audio/skin.css +68 -69
  364. package/dist/dev/define/live-audio/minimal-skin.css +103 -101
  365. package/dist/dev/define/live-audio/skin.css +68 -69
  366. package/dist/dev/define/live-video/minimal-skin.css +140 -120
  367. package/dist/dev/define/live-video/minimal-skin.d.ts.map +1 -1
  368. package/dist/dev/define/live-video/minimal-skin.js +3 -1
  369. package/dist/dev/define/live-video/minimal-skin.js.map +1 -1
  370. package/dist/dev/define/live-video/minimal-skin.tailwind.d.ts.map +1 -1
  371. package/dist/dev/define/live-video/minimal-skin.tailwind.js +3 -1
  372. package/dist/dev/define/live-video/minimal-skin.tailwind.js.map +1 -1
  373. package/dist/dev/define/live-video/skin.css +89 -76
  374. package/dist/dev/define/live-video/skin.d.ts.map +1 -1
  375. package/dist/dev/define/live-video/skin.js +3 -1
  376. package/dist/dev/define/live-video/skin.js.map +1 -1
  377. package/dist/dev/define/live-video/skin.tailwind.d.ts.map +1 -1
  378. package/dist/dev/define/live-video/skin.tailwind.js +4 -2
  379. package/dist/dev/define/live-video/skin.tailwind.js.map +1 -1
  380. package/dist/dev/define/ui/gesture.d.ts +8 -0
  381. package/dist/dev/define/ui/gesture.d.ts.map +1 -0
  382. package/dist/dev/define/ui/gesture.js +7 -0
  383. package/dist/dev/define/ui/gesture.js.map +1 -0
  384. package/dist/dev/define/video/minimal-skin.css +140 -120
  385. package/dist/dev/define/video/minimal-skin.d.ts.map +1 -1
  386. package/dist/dev/define/video/minimal-skin.js +3 -1
  387. package/dist/dev/define/video/minimal-skin.js.map +1 -1
  388. package/dist/dev/define/video/minimal-skin.tailwind.d.ts.map +1 -1
  389. package/dist/dev/define/video/minimal-skin.tailwind.js +3 -1
  390. package/dist/dev/define/video/minimal-skin.tailwind.js.map +1 -1
  391. package/dist/dev/define/video/skin.css +89 -76
  392. package/dist/dev/define/video/skin.d.ts.map +1 -1
  393. package/dist/dev/define/video/skin.js +3 -1
  394. package/dist/dev/define/video/skin.js.map +1 -1
  395. package/dist/dev/define/video/skin.tailwind.d.ts.map +1 -1
  396. package/dist/dev/define/video/skin.tailwind.js +4 -2
  397. package/dist/dev/define/video/skin.tailwind.js.map +1 -1
  398. package/dist/dev/media/hls-background-video/media.d.ts +16 -0
  399. package/dist/dev/media/hls-background-video/media.d.ts.map +1 -1
  400. package/dist/dev/media/hls-background-video/media.js +18 -0
  401. package/dist/dev/media/hls-background-video/media.js.map +1 -1
  402. package/dist/dev/packages/icons/dist/element/default/icons.js +1 -1
  403. package/dist/dev/packages/icons/dist/element/default/icons.js.map +1 -1
  404. package/dist/dev/packages/icons/dist/element/minimal/icons.js +1 -1
  405. package/dist/dev/packages/icons/dist/element/minimal/icons.js.map +1 -1
  406. package/dist/dev/packages/icons/dist/html/default/airplay-exit.js +1 -1
  407. package/dist/dev/packages/icons/dist/html/default/airplay-exit.js.map +1 -1
  408. package/dist/dev/packages/icons/dist/html/minimal/airplay-exit.js +1 -1
  409. package/dist/dev/packages/icons/dist/html/minimal/airplay-exit.js.map +1 -1
  410. package/dist/dev/packages/icons/dist/render/default/index.js +1 -1
  411. package/dist/dev/packages/icons/dist/render/default/index.js.map +1 -1
  412. package/dist/dev/packages/icons/dist/render/minimal/index.js +1 -1
  413. package/dist/dev/packages/icons/dist/render/minimal/index.js.map +1 -1
  414. package/dist/dev/packages/skins/dist/default/default/tailwind/components/button.js +3 -1
  415. package/dist/dev/packages/skins/dist/default/default/tailwind/components/button.js.map +1 -1
  416. package/dist/dev/packages/skins/dist/default/default/tailwind/components/poster.js +8 -1
  417. package/dist/dev/packages/skins/dist/default/default/tailwind/components/poster.js.map +1 -1
  418. package/dist/dev/packages/skins/dist/default/default/tailwind/components/slider.js +10 -10
  419. package/dist/dev/packages/skins/dist/default/default/tailwind/components/slider.js.map +1 -1
  420. package/dist/dev/packages/skins/dist/default/default/tailwind/components/thumbnail.js +1 -1
  421. package/dist/dev/packages/skins/dist/default/default/tailwind/components/thumbnail.js.map +1 -1
  422. package/dist/dev/packages/skins/dist/default/default/tailwind/video.tailwind.js +2 -2
  423. package/dist/dev/packages/skins/dist/default/default/tailwind/video.tailwind.js.map +1 -1
  424. package/dist/dev/packages/skins/dist/default/minimal/tailwind/components/poster.js +8 -1
  425. package/dist/dev/packages/skins/dist/default/minimal/tailwind/components/poster.js.map +1 -1
  426. package/dist/dev/packages/skins/dist/default/minimal/tailwind/components/slider.js +13 -12
  427. package/dist/dev/packages/skins/dist/default/minimal/tailwind/components/slider.js.map +1 -1
  428. package/dist/dev/packages/skins/dist/default/minimal/tailwind/components/thumbnail.js +1 -1
  429. package/dist/dev/packages/skins/dist/default/minimal/tailwind/components/thumbnail.js.map +1 -1
  430. package/dist/dev/packages/skins/dist/default/minimal/tailwind/video.tailwind.js +6 -5
  431. package/dist/dev/packages/skins/dist/default/minimal/tailwind/video.tailwind.js.map +1 -1
  432. package/dist/dev/packages/skins/dist/default/shared/tailwind/icon-state.js +4 -4
  433. package/dist/dev/packages/skins/dist/default/shared/tailwind/icon-state.js.map +1 -1
  434. package/dist/dev/store/provider-mixin.d.ts.map +1 -1
  435. package/dist/dev/store/provider-mixin.js +24 -8
  436. package/dist/dev/store/provider-mixin.js.map +1 -1
  437. package/dist/dev/store/types.d.ts +2 -2
  438. package/dist/dev/store/types.d.ts.map +1 -1
  439. package/dist/dev/ui/audio-track-radio-group/audio-track-radio-group-element.js +1 -1
  440. package/dist/dev/ui/audio-track-radio-group/audio-track-radio-group-element.js.map +1 -1
  441. package/dist/dev/ui/captions-radio-group/captions-radio-group-element.js +1 -1
  442. package/dist/dev/ui/captions-radio-group/captions-radio-group-element.js.map +1 -1
  443. package/dist/dev/ui/gesture/gesture-element.d.ts +7 -7
  444. package/dist/dev/ui/gesture/gesture-element.d.ts.map +1 -1
  445. package/dist/dev/ui/gesture/gesture-element.js.map +1 -1
  446. package/dist/dev/ui/hotkey/hotkey-element.d.ts +6 -6
  447. package/dist/dev/ui/hotkey/hotkey-element.d.ts.map +1 -1
  448. package/dist/dev/ui/hotkey/hotkey-element.js.map +1 -1
  449. package/dist/dev/ui/menu/context.d.ts +8 -8
  450. package/dist/dev/ui/menu/context.d.ts.map +1 -1
  451. package/dist/dev/ui/menu/context.js.map +1 -1
  452. package/dist/dev/ui/menu/menu-element.d.ts.map +1 -1
  453. package/dist/dev/ui/menu/menu-element.js +28 -27
  454. package/dist/dev/ui/menu/menu-element.js.map +1 -1
  455. package/dist/dev/ui/menu/menu-radio-group-element.d.ts +1 -1
  456. package/dist/dev/ui/menu/menu-radio-group-element.d.ts.map +1 -1
  457. package/dist/dev/ui/menu/menu-radio-group-element.js +14 -14
  458. package/dist/dev/ui/menu/menu-radio-group-element.js.map +1 -1
  459. package/dist/dev/ui/playback-rate-radio-group/playback-rate-radio-group-element.js +1 -1
  460. package/dist/dev/ui/playback-rate-radio-group/playback-rate-radio-group-element.js.map +1 -1
  461. package/dist/dev/ui/poster/poster-element.d.ts +20 -18
  462. package/dist/dev/ui/poster/poster-element.d.ts.map +1 -1
  463. package/dist/dev/ui/poster/poster-element.js +145 -8
  464. package/dist/dev/ui/poster/poster-element.js.map +1 -1
  465. package/dist/dev/ui/quality-radio-group/quality-radio-group-element.js +1 -1
  466. package/dist/dev/ui/quality-radio-group/quality-radio-group-element.js.map +1 -1
  467. package/dist/dev/ui/slider/slider-preview-element.d.ts +2 -2
  468. package/dist/dev/ui/slider/slider-preview-element.d.ts.map +1 -1
  469. package/dist/dev/ui/slider/slider-preview-element.js.map +1 -1
  470. package/docs/README.md +1 -1
  471. package/docs/concepts/skins.md +91 -78
  472. package/docs/how-to/customize-skins.md +411 -377
  473. package/docs/reference/menu.md +3 -19
  474. package/docs/reference/popover.md +2 -2
  475. package/docs/reference/poster.md +211 -21
  476. package/docs/reference/slider.md +1 -1
  477. package/docs/reference/time-slider.md +1 -1
  478. package/docs/reference/tooltip.md +6 -6
  479. package/docs/reference/volume-slider.md +1 -1
  480. package/package.json +14 -9
  481. package/cdn/adapter-Bk03SAxn.js +0 -2
  482. package/cdn/adapter-Bk03SAxn.js.map +0 -1
  483. package/cdn/adapter-XTen-YVQ.js.map +0 -1
  484. package/cdn/compounds-BEO1d3ZM.js +0 -8
  485. package/cdn/compounds-BEO1d3ZM.js.map +0 -1
  486. package/cdn/compounds-nk9RJtBK.js.map +0 -1
  487. package/cdn/create-player-DK9WOywd.js.map +0 -1
  488. package/cdn/create-player-hSdQMP5p.js +0 -2
  489. package/cdn/create-player-hSdQMP5p.js.map +0 -1
  490. package/cdn/default-BqQDVloS.js.map +0 -1
  491. package/cdn/default-CXWVp2oG.js +0 -2
  492. package/cdn/default-CXWVp2oG.js.map +0 -1
  493. package/cdn/default-Dw6cIEqT.js +0 -2
  494. package/cdn/default-Dw6cIEqT.js.map +0 -1
  495. package/cdn/default-I2LasfxC.js.map +0 -1
  496. package/cdn/error-surface-DCT1m2p1.js +0 -2
  497. package/cdn/error-surface-DCT1m2p1.js.map +0 -1
  498. package/cdn/error-surface-drmCvBVW.js.map +0 -1
  499. package/cdn/gesture-element-6Ld1YwIL.js.map +0 -1
  500. package/cdn/gesture-element-BC48ucj9.js +0 -2
  501. package/cdn/gesture-element-BC48ucj9.js.map +0 -1
  502. package/cdn/i18n-Dc7WM2xd.js +0 -2
  503. package/cdn/media-BTipOcKo.js +0 -2
  504. package/cdn/media-Bmablv4g.js +0 -2
  505. package/cdn/media-Bmablv4g.js.map +0 -1
  506. package/cdn/media-COIe3uI5.js.map +0 -1
  507. package/cdn/media-CPVSKLdk.js +0 -2
  508. package/cdn/media-Dq4zmIJa.js +0 -2
  509. package/cdn/media-Dq4zmIJa.js.map +0 -1
  510. package/cdn/media-suYcjCG2.js +0 -445
  511. package/cdn/media-suYcjCG2.js.map +0 -1
  512. package/cdn/minimal-BedCvMBG.js +0 -2
  513. package/cdn/minimal-BedCvMBG.js.map +0 -1
  514. package/cdn/minimal-BoP112ye.js +0 -2
  515. package/cdn/minimal-BoP112ye.js.map +0 -1
  516. package/cdn/minimal-DLosvq31.js.map +0 -1
  517. package/cdn/minimal-DQCLKRyR.js.map +0 -1
  518. package/cdn/minimal-ui-Et2Wcn7r.js +0 -2
  519. package/cdn/player-BRQLp5bX.js +0 -2
  520. package/cdn/player-BloX4l6F.js +0 -2
  521. package/cdn/player-rCFqzWrA.js +0 -2
  522. package/cdn/poster-element-BGr1VQJB.js.map +0 -1
  523. package/cdn/poster-element-DBmgOyep.js +0 -2
  524. package/cdn/poster-element-DBmgOyep.js.map +0 -1
  525. package/cdn/seek-button-element-XMTLIxZj.js.map +0 -1
  526. package/cdn/select-tracks-nRPBa1NC.js.map +0 -1
  527. package/cdn/select-tracks-xV1s28xD.js +0 -59
  528. package/cdn/select-tracks-xV1s28xD.js.map +0 -1
  529. package/cdn/time-slider-chapters-element-DJ0abZXI.js.map +0 -1
  530. package/cdn/time-slider-chapters-element-DW8YyJn8.js +0 -2
  531. package/cdn/time-slider-chapters-element-DW8YyJn8.js.map +0 -1
  532. package/cdn/ui-C0isALTQ.js +0 -2
  533. package/cdn/ui-DVpkE1MN.js +0 -2
@@ -1 +1 @@
1
- {"version":3,"file":"media-oa3nyL2o.js","names":["deriveState","#config","#engine","#createEngine","#stopLiveSync","#signals","#setDetectedStreamType","#setTargetLiveWindow","#reportDeliveryNotices","#stopErrorSync","#setError","#error","#streamType","#isUserStreamType","#updateStreamType","#targetLiveWindow","#reportedCode","#withSuggestion","#cancelPendingPlay","#preload","#disableRemotePlayback","#loadstartListener","#noticed","#abort","#renditions","#removeVideoTracks","#audioTracks","#removeAudioTracks","#selectRendition","#selectAudio","#destroyed"],"sources":["../../utils/dist/time/sleep.js","../../spf/dist/dev/media/hls/reload-policy.js","../../spf/dist/dev/media/live-window.js","../../spf/dist/dev/playback/primitives/live-window.js","../../spf/dist/dev/media/dom/text/resolve-vtt-segment.js","../../spf/dist/dev/core/actors/create-transition-actor.js","../../spf/dist/dev/playback/actors/dom/text-tracks.js","../../spf/dist/dev/playback/actors/text-track-segment-loader.js","../../spf/dist/dev/playback/behaviors/dom/setup-text-track-actors.js","../../spf/dist/dev/core/tasks/delayed-reschedule.js","../../spf/dist/dev/media/dom/text/text-track-slots.js","../../spf/dist/dev/playback/behaviors/dom/seek-to-live-edge.js","../../spf/dist/dev/playback/behaviors/dom/sync-live-seekable-range.js","../../spf/dist/dev/playback/behaviors/dom/sync-text-tracks.js","../../spf/dist/dev/playback/engines/hls/engine.js","../../spf/dist/dev/playback/adapters/hls-video/adapter.js","../../spf/dist/dev/media/media-tracks/media-tracks.js","../../spf/dist/dev/playback/adapters/hls-video/media-tracks.js","../../spf/dist/dev/playback/adapters/hls-video/media.js"],"sourcesContent":["//#region src/time/sleep.ts\n/**\n* Resolve after `ms` milliseconds. Pass a `signal` to make it cancellable: the\n* timer is cleared and the promise rejects with the signal's reason as soon as\n* the signal aborts (including if it's already aborted).\n*/\nfunction sleep(ms, signal) {\n\treturn new Promise((resolve, reject) => {\n\t\tif (signal?.aborted) {\n\t\t\treject(signal.reason);\n\t\t\treturn;\n\t\t}\n\t\tconst onAbort = () => {\n\t\t\tclearTimeout(timer);\n\t\t\treject(signal?.reason);\n\t\t};\n\t\tconst timer = setTimeout(() => {\n\t\t\tsignal?.removeEventListener(\"abort\", onAbort);\n\t\t\tresolve();\n\t\t}, ms);\n\t\tsignal?.addEventListener(\"abort\", onAbort, { once: true });\n\t});\n}\n//#endregion\nexport { sleep };\n\n//# sourceMappingURL=sleep.js.map","import { getMediaPlaylistMetadata, isResolvedPresentation, isResolvedTrack } from \"../types/index.js\";\nimport { findTrackById } from \"../utils/tracks.js\";\n//#region src/media/hls/reload-policy.ts\n/** Reload cadence when a playlist carries no usable target duration. */\nconst FALLBACK_TARGET_DURATION = 6;\n/**\n* Default `HOLD-BACK` as a multiple of the target duration when the playlist\n* declares none — the HLS spec default (RFC 8216bis `EXT-X-SERVER-CONTROL`).\n*/\nconst HOLD_BACK_TARGET_MULTIPLIER = 3;\n/** Identity of a reload snapshot — window position + length. Changes when the window slid or grew. */\nfunction snapshotSignature(track) {\n\treturn `${getMediaPlaylistMetadata(track)?.mediaSequence ?? 0}:${track.segments.length}`;\n}\nfunction targetDurationOf(track) {\n\treturn getMediaPlaylistMetadata(track)?.targetDuration || FALLBACK_TARGET_DURATION;\n}\n/**\n* Live media-playlist reload cadence, per RFC 8216bis §6.3.4 — a\n* {@link RecurrencePolicy} for a `RecurringRunner` re-resolving the selected\n* track. Structurally matches `RecurrencePolicy<ResolvedTrack>` without\n* importing it (media stays core-free): `current` is the freshly resolved track,\n* `previous` the prior resolved snapshot.\n*\n* - Complete playlist (VoD, or live that hit `#EXT-X-ENDLIST`) → `null`: stop.\n* Keys off `Track.duration` (finite once complete), the single completeness\n* source of truth.\n* - Unchanged window (same media sequence + segment count as `previous`) → poll\n* at half the target duration; a moved/grown window (or the first reload) →\n* full target duration.\n*\n* A failed reload doesn't reach here — the rejection propagates through the\n* `RecurringRunner`; transient-failure recovery belongs at the fetch layer.\n*\n* Returned delays are milliseconds.\n*/\nfunction mediaPlaylistReloadDelay(current, previous) {\n\tif (Number.isFinite(current.duration)) return null;\n\tconst target = targetDurationOf(current);\n\treturn (!previous || snapshotSignature(current) !== snapshotSignature(previous) ? target : target / 2) * 1e3;\n}\n/**\n* Target live latency (seconds) for a resolved track — how far behind the live\n* edge the playhead should sit. Prefers the server's declared\n* `EXT-X-SERVER-CONTROL` `HOLD-BACK`, falling back to\n* {@link HOLD_BACK_TARGET_MULTIPLIER}× the target duration when absent (the\n* spec default). This is the HLS side of the format-neutral\n* `resolveLiveLatency` seam consumed by `seek-to-live-edge`; a DASH engine\n* supplies its own (`suggestedPresentationDelay`).\n*\n* Only `HOLD-BACK` — never `PART-HOLD-BACK`, which assumes partial-segment\n* playback. See {@link MediaPlaylistMetadata.holdBack}.\n*/\nfunction liveLatencyFor(track) {\n\treturn getMediaPlaylistMetadata(track)?.holdBack ?? HOLD_BACK_TARGET_MULTIPLIER * targetDurationOf(track);\n}\n/**\n* Resolve the target live latency for a presentation's timeline-bearing track —\n* the HLS engine injects this as `seekToLiveEdge`'s format-neutral\n* `resolveLiveLatency` seam. `0` when there is no resolved track to read (the\n* behavior then seeks straight to the edge).\n*/\nfunction resolveLiveLatency(presentation, trackId) {\n\tif (!isResolvedPresentation(presentation) || !trackId) return 0;\n\tconst track = findTrackById(presentation, trackId);\n\treturn track && isResolvedTrack(track) ? liveLatencyFor(track) : 0;\n}\n//#endregion\nexport { liveLatencyFor, mediaPlaylistReloadDelay, resolveLiveLatency };\n\n//# sourceMappingURL=reload-policy.js.map","import { isResolvedPresentation, isResolvedTrack } from \"./types/index.js\";\nimport { findTrackById } from \"./utils/tracks.js\";\n//#region src/media/live-window.ts\n/**\n* Derive the live window of the track with the given id — the single source of\n* truth for \"where is live,\" consumed (via `liveWindowFromState`) by the\n* seek-to-live-edge and live-seekable-range behaviors so neither re-derives (or\n* re-presumes) the window shape. Type-agnostic: the caller decides which track\n* bears the timeline (video when present, else audio).\n*\n* The window is a **live read** over the current `segments` array — never\n* stored on the track. The anchor triple is frozen per source; per-segment\n* `startTime` values are re-derived against it on every reload, so the edge\n* here slides while the origin stays fixed (see\n* `internal/design/spf/live-presentation-timeline-model.md`).\n*\n* Returns `null` when there is no live edge to track: an unresolved\n* presentation or track, a track with no segments, or a **complete** playlist\n* (VoD, or live that has ended — a finite `Track.duration`).\n*/\nfunction liveWindowFor(presentation, trackId) {\n\tif (!isResolvedPresentation(presentation) || !trackId) return null;\n\tconst track = findTrackById(presentation, trackId);\n\tif (!track || !isResolvedTrack(track) || track.segments.length === 0) return null;\n\tif (Number.isFinite(track.duration)) return null;\n\tconst { segments } = track;\n\tconst last = segments[segments.length - 1];\n\treturn {\n\t\tstart: segments[0].startTime,\n\t\tend: last.startTime + last.duration\n\t};\n}\n//#endregion\nexport { liveWindowFor };\n\n//# sourceMappingURL=live-window.js.map","import { getTracksByType } from \"../../media/utils/tracks.js\";\nimport { liveWindowFor } from \"../../media/live-window.js\";\n//#region src/playback/primitives/live-window.ts\n/**\n* The id of the timeline-bearing track: the selected video track when present,\n* else the selected audio track. The single pick both the window derivation and\n* the live-latency resolution (`seek-to-live-edge`) share, so they can't drift.\n*/\nfunction liveTrackId(state) {\n\treturn state.selectedVideoTrackId?.get() ?? state.selectedAudioTrackId?.get();\n}\n/**\n* One type's window: the selected track's when it's resolved, else any resolved\n* track of the type. The fallback keeps the window from blinking to `null`\n* mid ABR / user switch — all renditions of a type are time-aligned and share\n* the anchor, so a deselected track's window may trail live by up to one reload\n* during the switch gap (acceptable; the selected track's fresh window resumes\n* the moment it resolves). A null blink would flip `seekToLiveEdge` out of\n* `live` and stall the seekable-range writer.\n*/\nfunction liveWindowForType(presentation, selectedId, type) {\n\tif (!presentation || selectedId === void 0) return null;\n\tconst selected = liveWindowFor(presentation, selectedId);\n\tif (selected) return selected;\n\tfor (const track of getTracksByType(presentation, type)) {\n\t\tconst window = liveWindowFor(presentation, track.id);\n\t\tif (window) return window;\n\t}\n\treturn null;\n}\nfunction liveWindowFromState(state) {\n\tconst presentation = state.presentation.get();\n\tconst video = liveWindowForType(presentation, state.selectedVideoTrackId?.get(), \"video\");\n\tconst audio = liveWindowForType(presentation, state.selectedAudioTrackId?.get(), \"audio\");\n\tif (video && audio) {\n\t\tconst start = Math.max(video.start, audio.start);\n\t\tconst end = Math.min(video.end, audio.end);\n\t\treturn start < end ? {\n\t\t\tstart,\n\t\t\tend\n\t\t} : null;\n\t}\n\treturn video ?? audio;\n}\n/**\n* Resolve the live edge — the window bounds plus the target playhead position —\n* from a behavior's setup arguments. Bundles the window geometry and the\n* format-specific latency policy (`config.resolveLiveLatency`) so the consuming\n* behavior never has to compose them; it just forwards its `{ state, config }`.\n* `null` when there is no live edge (VOD / ended / unresolved).\n*\n* Reads signals lazily — call it inside a reactive context (an effect).\n*/\nfunction getLiveEdge({ state, config }) {\n\tconst window = liveWindowFromState(state);\n\tif (!window) return null;\n\tconst latency = config?.resolveLiveLatency?.(state.presentation.get(), liveTrackId(state)) ?? 0;\n\treturn {\n\t\t...window,\n\t\tliveEdgeStart: Math.max(window.start, window.end - latency)\n\t};\n}\n//#endregion\nexport { getLiveEdge, liveTrackId, liveWindowFromState };\n\n//# sourceMappingURL=live-window.js.map","//#region src/media/dom/text/resolve-vtt-segment.ts\nlet dummyVideo = null;\nfunction ensureDummyVideo() {\n\tif (!dummyVideo) {\n\t\tdummyVideo = document.createElement(\"video\");\n\t\tdummyVideo.muted = true;\n\t\tdummyVideo.preload = \"none\";\n\t\tdummyVideo.style.display = \"none\";\n\t\tdummyVideo.crossOrigin = \"anonymous\";\n\t}\n\treturn dummyVideo;\n}\nfunction resolveVttSegment(url) {\n\tconst video = ensureDummyVideo();\n\tconst track = document.createElement(\"track\");\n\ttrack.kind = \"subtitles\";\n\treturn new Promise((resolve, reject) => {\n\t\tconst onLoad = () => {\n\t\t\tconst cues = [];\n\t\t\tconst textTrack = track.track;\n\t\t\tif (textTrack.cues) for (let i = 0; i < textTrack.cues.length; i++) {\n\t\t\t\tconst cue = textTrack.cues[i];\n\t\t\t\tif (cue) cues.push(cue);\n\t\t\t}\n\t\t\tcleanup();\n\t\t\tresolve(cues);\n\t\t};\n\t\tconst onError = () => {\n\t\t\tcleanup();\n\t\t\treject(/* @__PURE__ */ new Error(`Failed to load VTT segment: ${url}`));\n\t\t};\n\t\tconst cleanup = () => {\n\t\t\ttrack.removeEventListener(\"load\", onLoad);\n\t\t\ttrack.removeEventListener(\"error\", onError);\n\t\t\tvideo.removeChild(track);\n\t\t};\n\t\ttrack.addEventListener(\"load\", onLoad);\n\t\ttrack.addEventListener(\"error\", onError);\n\t\tvideo.appendChild(track);\n\t\ttrack.track.mode = \"hidden\";\n\t\ttrack.src = url;\n\t});\n}\nfunction destroyVttResolver() {\n\tdummyVideo = null;\n}\n//#endregion\nexport { destroyVttResolver, resolveVttSegment };\n\n//# sourceMappingURL=resolve-vtt-segment.js.map","import { untrack, update } from \"../signals/primitives.js\";\nimport { createMachineCore } from \"../machine.js\";\n//#region src/core/actors/create-transition-actor.ts\n/**\n* Creates a reducer-shaped actor from an initial context and a reducer function.\n*\n* The reducer receives the current context and a message and returns the next\n* context. Returning the same reference (by identity) skips the signal update —\n* so early-returning `context` unchanged is both the no-op and the optimization.\n*\n* Side effects (e.g. DOM mutations) may be performed inside the reducer.\n* They run synchronously before the signal is updated.\n*\n* @example\n* const actor = createTransitionActor(\n* { count: 0 },\n* (context, message: { type: 'increment' }) => ({ count: context.count + 1 })\n* );\n*/\nfunction createTransitionActor(initialContext, reducer) {\n\tconst { snapshotSignal, getState, transition } = createMachineCore({\n\t\tvalue: \"active\",\n\t\tcontext: initialContext\n\t});\n\tconst getContext = () => untrack(() => snapshotSignal.get().context);\n\tconst setContext = (context) => update(snapshotSignal, { context });\n\treturn {\n\t\tget snapshot() {\n\t\t\treturn snapshotSignal;\n\t\t},\n\t\tsend(message) {\n\t\t\tif (getState() === \"destroyed\") return;\n\t\t\tconst context = getContext();\n\t\t\tconst newContext = reducer(context, message);\n\t\t\tif (newContext !== context) setContext(newContext);\n\t\t},\n\t\tdestroy() {\n\t\t\tif (getState() === \"destroyed\") return;\n\t\t\ttransition(\"destroyed\");\n\t\t}\n\t};\n}\n//#endregion\nexport { createTransitionActor };\n\n//# sourceMappingURL=create-transition-actor.js.map","import { createTransitionActor } from \"../../../core/actors/create-transition-actor.js\";\n//#region src/playback/actors/dom/text-tracks.ts\nfunction isDuplicateCue(cue, existing) {\n\treturn existing.some((r) => r.startTime === cue.startTime && r.endTime === cue.endTime && r.text === cue.text);\n}\n/** TextTrack actor: wraps all text tracks on a media element, owns cue operations. */\nfunction createTextTracksActor(mediaElement) {\n\treturn createTransitionActor({\n\t\tloaded: {},\n\t\tsegments: {}\n\t}, (context, message) => {\n\t\tif (message.type === \"clear\") return {\n\t\t\tloaded: {},\n\t\t\tsegments: {}\n\t\t};\n\t\tconst { meta, cues } = message;\n\t\tconst { trackId, id: segmentId, startTime, duration } = meta;\n\t\tconst textTrack = Array.from(mediaElement.textTracks).find((t) => t.id === trackId);\n\t\tif (!textTrack) return context;\n\t\tconst existingCues = context.loaded[trackId] ?? [];\n\t\tconst existingSegments = context.segments[trackId] ?? [];\n\t\tconst prunedCues = cues.filter((cue) => !isDuplicateCue(cue, existingCues));\n\t\tconst segmentAlreadyLoaded = existingSegments.some((s) => s.id === segmentId);\n\t\tif (prunedCues.length === 0 && segmentAlreadyLoaded) return context;\n\t\tfor (const cue of prunedCues) textTrack.addCue(cue);\n\t\treturn {\n\t\t\t...context,\n\t\t\tloaded: {\n\t\t\t\t...context.loaded,\n\t\t\t\t[trackId]: [...existingCues, ...prunedCues]\n\t\t\t},\n\t\t\tsegments: segmentAlreadyLoaded ? context.segments : {\n\t\t\t\t...context.segments,\n\t\t\t\t[trackId]: [...existingSegments, {\n\t\t\t\t\tid: segmentId,\n\t\t\t\t\tstartTime,\n\t\t\t\t\tduration\n\t\t\t\t}]\n\t\t\t}\n\t\t};\n\t});\n}\n//#endregion\nexport { createTextTracksActor };\n\n//# sourceMappingURL=text-tracks.js.map","import { peek } from \"../../core/signals/primitives.js\";\nimport { SerialRunner, Task } from \"../../core/tasks/task.js\";\nimport { createMachineActor } from \"../../core/actors/create-machine-actor.js\";\nimport { DEFAULT_FORWARD_BUFFER_CONFIG, getSegmentsToLoad } from \"../../media/buffer/forward-buffer.js\";\nimport { DEFAULT_TEXT_MESSAGE_PIPELINES } from \"../primitives/text-segment-load-pipeline.js\";\n//#region src/playback/actors/text-track-segment-loader.ts\n/**\n* Loads text-track segments for a track and delegates cue management\n* to a TextTracksActor. Mirrors the v/a `SegmentLoaderActor` shape (FSM\n* with `idle` / `loading` and `inFlight*` context for continue-vs-preempt),\n* adapted to text:\n*\n* - No init segment, no flush ops (text cues don't need eviction — they're\n* small and the playhead-relative window is enforced by the runtime).\n* - Single in-flight identity (`inFlightSegmentId`) — text has only the\n* media-segment path, no init-segment path.\n*\n* Planning is done in the load handler on every incoming message:\n* `getSegmentsToLoad` filters to the forward window, then the segments\n* not already in `TextTracksActor`'s context are scheduled. When a new\n* `load` arrives mid-run, the handler replans and either:\n*\n* - **Continues**: the in-flight segment is still in the new plan →\n* `abortPending` only, schedule the rest of the plan (minus the\n* in-flight item, which covers its slot).\n* - **Preempts**: in-flight segment is no longer wanted (track switch,\n* large seek out of window) → `abortAll`, schedule the new plan\n* from scratch.\n*\n* The cue parser is injected so this factory is host-agnostic. A DOM\n* host supplies a VTT parser backed by `<track>`/`TextTrack` APIs; a\n* non-DOM host (worker, test fake, alternate runtime) supplies its own.\n*/\nfunction createTextTrackSegmentLoaderActor(textTracksActor, resolveSegment, config = {}, compositionDeps = {\n\tstate: {},\n\tcontext: {},\n\tconfig: {}\n}) {\n\tconst forwardBufferConfig = {\n\t\t...DEFAULT_FORWARD_BUFFER_CONFIG,\n\t\t...config.forwardBuffer\n\t};\n\tconst deps = {\n\t\tstate: compositionDeps.state,\n\t\tcontext: compositionDeps.context,\n\t\tconfig: {\n\t\t\t...compositionDeps.config,\n\t\t\ttextTracksActor,\n\t\t\tresolveSegment\n\t\t}\n\t};\n\tconst pipeline = (config.messagePipelines ?? DEFAULT_TEXT_MESSAGE_PIPELINES)();\n\t/**\n\t* Translate a load message into an ordered TextLoadTask list based on\n\t* committed actor state. In-flight awareness is handled separately in\n\t* the `loading` state's load handler.\n\t*\n\t* Metadata mode (no `range`) is a no-op for text — text tracks have\n\t* no init-segment concept, so there's nothing to load until a range\n\t* arrives via `'full-range'` dispatch.\n\t*/\n\tconst planTasks = (message) => {\n\t\tconst { track, range } = message;\n\t\tif (!range) return [];\n\t\tconst trackId = track.id;\n\t\tconst bufferedSegments = peek(textTracksActor.snapshot).context.segments[trackId] ?? [];\n\t\treturn getSegmentsToLoad(track.segments, bufferedSegments, range.start, forwardBufferConfig).map((segment) => ({\n\t\t\tsegment,\n\t\t\ttrackId\n\t\t}));\n\t};\n\t/**\n\t* Wraps a TextLoadTask into a Task that runs the op's step pipeline\n\t* (resolve/relocate/dispatch, per the composition's `messagePipelines`).\n\t* Updates `inFlightSegmentId` around the async region so the load handler can\n\t* make accurate continue/preempt decisions, and checks the abort signal before\n\t* each step.\n\t*\n\t* Text degrades gracefully: a step throwing (e.g. a failed segment fetch) is\n\t* logged and swallowed so the runner continues to the next segment — unlike the\n\t* v/a loader, where a failed init must abort the remaining tasks.\n\t*/\n\tconst makeLoadTask = (op, { getContext, setContext }) => {\n\t\treturn new Task(async (signal) => {\n\t\t\tif (signal.aborted) return;\n\t\t\tconst frame = { op };\n\t\t\tsetContext({\n\t\t\t\t...getContext(),\n\t\t\t\tinFlightTrackId: op.trackId,\n\t\t\t\tinFlightSegmentId: op.segment.id\n\t\t\t});\n\t\t\ttry {\n\t\t\t\tfor (const step of pipeline) {\n\t\t\t\t\tif (signal.aborted) return;\n\t\t\t\t\tawait step(frame, signal, deps);\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error(\"Failed to load text-track segment:\", error);\n\t\t\t} finally {\n\t\t\t\tsetContext({\n\t\t\t\t\t...getContext(),\n\t\t\t\t\tinFlightTrackId: null,\n\t\t\t\t\tinFlightSegmentId: null\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t};\n\tconst scheduleAll = (tasks, ctx) => {\n\t\tfor (const op of tasks) ctx.runner.schedule(makeLoadTask(op, ctx)).then(void 0, (e) => {\n\t\t\tif (e instanceof Error && e.name === \"AbortError\") return;\n\t\t\tconsole.error(\"Unexpected error in text-track segment loader:\", e);\n\t\t\tctx.runner.abortPending();\n\t\t});\n\t};\n\treturn createMachineActor({\n\t\trunner: () => new SerialRunner(),\n\t\tinitial: \"idle\",\n\t\tcontext: {\n\t\t\tinFlightTrackId: null,\n\t\t\tinFlightSegmentId: null\n\t\t},\n\t\tstates: {\n\t\t\tidle: { on: { load: (msg, ctx) => {\n\t\t\t\tconst tasks = planTasks(msg);\n\t\t\t\tif (tasks.length === 0) return;\n\t\t\t\tctx.transition(\"loading\");\n\t\t\t\tscheduleAll(tasks, ctx);\n\t\t\t} } },\n\t\t\tloading: {\n\t\t\t\tonSettled: \"idle\",\n\t\t\t\ton: { load: (msg, ctx) => {\n\t\t\t\t\tconst { context, runner } = ctx;\n\t\t\t\t\tconst tasks = planTasks(msg);\n\t\t\t\t\tif (context.inFlightTrackId !== null && context.inFlightSegmentId !== null && tasks.some((t) => t.trackId === context.inFlightTrackId && t.segment.id === context.inFlightSegmentId)) {\n\t\t\t\t\t\trunner.abortPending();\n\t\t\t\t\t\tscheduleAll(tasks.filter((t) => !(t.trackId === context.inFlightTrackId && t.segment.id === context.inFlightSegmentId)), ctx);\n\t\t\t\t\t} else {\n\t\t\t\t\t\trunner.abortAll();\n\t\t\t\t\t\tscheduleAll(tasks, ctx);\n\t\t\t\t\t}\n\t\t\t\t} }\n\t\t\t}\n\t\t}\n\t});\n}\n//#endregion\nexport { createTextTrackSegmentLoaderActor };\n\n//# sourceMappingURL=text-track-segment-loader.js.map","import { effect } from \"../../../core/signals/effect.js\";\nimport { createTextTracksActor } from \"../../actors/dom/text-tracks.js\";\nimport { createTextTrackSegmentLoaderActor } from \"../../actors/text-track-segment-loader.js\";\n//#region src/playback/behaviors/dom/setup-text-track-actors.ts\nfunction setupTextTrackActorsSetup({ state, context, config }) {\n\treturn effect(() => {\n\t\tconst mediaElement = context.mediaElement.get();\n\t\tif (!mediaElement) return;\n\t\tconst textTracksActor = createTextTracksActor(mediaElement);\n\t\tconst textTrackSegmentLoaderActor = createTextTrackSegmentLoaderActor(textTracksActor, config.resolveTextTrackSegment, {\n\t\t\tforwardBuffer: config.forwardBuffer,\n\t\t\tmessagePipelines: config.textMessagePipelines\n\t\t}, {\n\t\t\tstate,\n\t\t\tcontext,\n\t\t\tconfig\n\t\t});\n\t\tcontext.textTracksActor.set(textTracksActor);\n\t\tcontext.textTrackSegmentLoaderActor.set(textTrackSegmentLoaderActor);\n\t\treturn () => {\n\t\t\ttextTracksActor.destroy();\n\t\t\ttextTrackSegmentLoaderActor.destroy();\n\t\t\tcontext.textTracksActor.set(void 0);\n\t\t\tcontext.textTrackSegmentLoaderActor.set(void 0);\n\t\t};\n\t});\n}\nconst setupTextTrackActors = {\n\tstateKeys: [],\n\tcontextKeys: [\n\t\t\"mediaElement\",\n\t\t\"textTracksActor\",\n\t\t\"textTrackSegmentLoaderActor\"\n\t],\n\tsetup: setupTextTrackActorsSetup\n};\n//#endregion\nexport { setupTextTrackActors };\n\n//# sourceMappingURL=setup-text-track-actors.js.map","import { sleep } from \"@videojs/utils/time\";\n//#region src/core/tasks/delayed-reschedule.ts\n/**\n* Build a {@link Reschedule} from a pure cadence function — the common\n* timer-based, *start-anchored* implementation.\n*\n* Invoked concurrently with the run, it observes the result, then waits\n* `cadence(current, previous)` milliseconds **measured from when it was invoked**\n* (≈ the run's start): it subtracts the run's own elapsed time, so consecutive\n* runs begin one cadence apart regardless of how long each run takes (per\n* RFC 8216 §6.3.4's \"measured from the last time the client began loading\"). If\n* the run takes longer than the cadence, the next run starts immediately.\n*\n* A `null` cadence stops the recurrence. A rejected run rejects this reschedule,\n* which the `RecurringRunner` propagates as the recurrence's failure — error\n* recovery (e.g. retrying transient fetch failures) belongs below, at the fetch\n* layer, not in the cadence.\n*/\nfunction delayedReschedule(cadence) {\n\treturn async (task) => {\n\t\tconst startedAt = Date.now();\n\t\tconst ms = cadence(await task.run(), task.previous);\n\t\tif (ms === null) return false;\n\t\tawait sleep(Math.max(0, ms - (Date.now() - startedAt)), task.signal);\n\t\treturn true;\n\t};\n}\n//#endregion\nexport { delayedReschedule };\n\n//# sourceMappingURL=delayed-reschedule.js.map","import { isCaptionOrSubtitleTrack } from \"@videojs/utils/dom\";\n//#region src/media/dom/text/text-track-slots.ts\n/**\n* SPF-owned `<track>` selector. Each slot created by\n* `addSubtitlesTracksToMedia` carries this attribute so reads and removals can\n* filter SPF-owned tracks from host-page-owned ones.\n*/\nconst SPF_TRACK_SELECTOR = \"track[data-src-track]\";\n/**\n* Allocate text-track slots on `mediaElement` for each model track by creating\n* and appending `<track>` children. Marks each element with `data-src-track`\n* so it can be distinguished from `<track>` children the host page added\n* directly — used by `getShowingSubtitlesTrackFromMedia` and\n* `removeAllSubtitlesTracksFromMedia` to scope their reads/removals to\n* SPF-owned slots. The spec has no `removeTextTrack` API, so creating\n* `<track>` elements is the only mechanism for adding *and* removing entries\n* to `mediaElement.textTracks`.\n*/\nfunction addSubtitlesTracksToMedia(mediaElement, modelTextTracks) {\n\tfor (const modelTrack of modelTextTracks) {\n\t\tconst el = document.createElement(\"track\");\n\t\tel.id = modelTrack.id;\n\t\tel.kind = modelTrack.kind;\n\t\tel.label = modelTrack.label;\n\t\tel.toggleAttribute(\"data-src-track\", true);\n\t\tif (modelTrack.language) el.srclang = modelTrack.language;\n\t\tmediaElement.appendChild(el);\n\t}\n}\n/**\n* Return the SPF-owned subtitle/caption `TextTrack` currently in `'showing'`\n* mode, or `undefined` if none. Restricts the search to slots created by\n* `addSubtitlesTracksToMedia` (via the `data-src-track` selector) so a showing\n* track that the host page added directly is ignored — SPF selection only\n* mirrors tracks it owns.\n*/\nfunction getShowingSubtitlesTrackFromMedia(mediaElement) {\n\tconst elements = mediaElement.querySelectorAll(SPF_TRACK_SELECTOR);\n\tfor (const el of elements) {\n\t\tconst track = el.track;\n\t\tif (track.mode === \"showing\" && isCaptionOrSubtitleTrack(track)) return track;\n\t}\n}\n/**\n* Remove every SPF-owned `<track>` child from `mediaElement` (those tagged\n* with `data-src-track` by `addSubtitlesTracksToMedia`). `<track>` elements\n* the host page added directly are left in place.\n*/\nfunction removeAllSubtitlesTracksFromMedia(mediaElement) {\n\tconst elements = mediaElement.querySelectorAll(SPF_TRACK_SELECTOR);\n\tfor (const el of elements) el.remove();\n}\n/**\n* Apply a selection to a `TextTrackList` by setting each subtitle/caption\n* track's `mode` to `'showing'` if its `id` matches `selectedId` and\n* `'disabled'` otherwise. Tracks of other kinds (chapters, metadata,\n* descriptions) are left untouched — they may be owned by the host page.\n*/\nfunction syncTextTrackModes(textTracks, selectedId) {\n\tfor (let i = 0; i < textTracks.length; i++) {\n\t\tconst track = textTracks[i];\n\t\tif (!isCaptionOrSubtitleTrack(track)) continue;\n\t\ttrack.mode = track.id === selectedId ? \"showing\" : \"disabled\";\n\t}\n}\n//#endregion\nexport { addSubtitlesTracksToMedia, getShowingSubtitlesTrackFromMedia, removeAllSubtitlesTracksFromMedia, syncTextTrackModes };\n\n//# sourceMappingURL=text-track-slots.js.map","import { computed, peek } from \"../../../core/signals/primitives.js\";\nimport { createMachineReactor } from \"../../../core/reactors/create-machine-reactor.js\";\nimport { getLiveEdge } from \"../../primitives/live-window.js\";\nimport { listen } from \"@videojs/utils/dom\";\n//#region src/playback/behaviors/dom/seek-to-live-edge.ts\n/**\n* Keep the playhead in the live window, via a two-state reactor gated on the\n* preconditions for \"we know where live is\":\n*\n* - **`inactive`** — no media element, or no live edge (`getLiveEdge` is `null`:\n* VOD, ended, or unresolved). Idle.\n* - **`live`** — preconditions met. `entry` commands `state.startPosition` once\n* to the target live latency behind the edge (clamped to the window start) so\n* playback begins near the edge and the loader dispatches an in-window range;\n* `effects` runs the window-exit guard.\n*\n* A derivable live edge is itself the establishment gate: segment placement is\n* settled at parse time — the reference track's local placement *is* the\n* presentation timeline, and every other track's first parse is held until the\n* anchor is stamped (`resolve-track`'s gate + `establishStartMediaTime`) — so\n* any window derived from resolved segments is already final, with no separate\n* anchor signal to wait on (see\n* `internal/design/spf/live-presentation-timeline-model.md`).\n*\n* The two pieces split along the axis a future DVR / EVENT mode will care about:\n* the **one-time start position** (`entry`) is the *live-specific* behavior — start\n* near the edge on load; a DVR mode makes it conditional (start in place). The\n* **window-exit guard** (`effects`) is the *general windowed-live* behavior —\n* applies to sliding-window live, DVR, and EVENT alike. Because the command is an\n* `entry`, it fires once per entry into `live`; a source change exits to\n* `inactive`, so the next source re-commands (no closure latch to reset). The\n* guard stays a direct seek — it is recurring, while `startPosition` is a\n* self-clearing one-shot.\n*\n* Window-exit guard: while playing (not paused), reposition to the live edge\n* when the playhead has fallen behind the window start — including when a seek\n* to a now-evicted position has stranded the playhead (such a seek can never\n* settle, so we rescue rather than wait on it). Two triggers:\n* the **window-update re-fire** (the guard reads the live edge, so each reload /\n* slide re-runs it — this catches a stall, where `timeupdate` stops but the\n* playlist keeps reloading) and a **`play` listener** for immediate reactivity on\n* resume, since the reload interval can be seconds. `play`, not `playing`: after\n* a long pause the playhead sits behind the window at an unseekable position,\n* where the browser stalls and `playing` never fires; `play` fires on the\n* paused→false transition regardless, so we snap before the stall. In-window\n* pause / DVR scrub-back are left untouched.\n*\n* The latency comes from the injected `resolveLiveLatency` seam (HLS:\n* `HOLD-BACK`), so this behavior carries no delivery-format specifics.\n* `applyStartPosition` performs the seek, gated on `loadedmetadata` — which\n* implies an open MediaSource and hence a declared seekable range (a seek outside\n* `seekable` is clamped) — so this behavior needs no MediaSource precondition of\n* its own.\n*/\n/**\n* Tolerance (seconds) around the window edges before the guard repositions, so\n* boundary / floating-point noise doesn't trigger a spurious seek.\n*/\nconst REPOSITION_TOLERANCE = .1;\n/**\n* `'live'` once the preconditions hold: a media element and a derivable live edge\n* (whose placement is final by construction — see the module docstring).\n* `'inactive'` otherwise.\n*\n* Deliberately narrow: every signal here can flip the reactor out of and back into\n* `live`, re-firing `entry`. Neither blinks mid-source — the edge can't, because\n* `liveWindowForType` falls back to any resolved track of the type — so `entry`\n* fires once per source without a latch, and a live reload (same source, slid\n* window) correctly doesn't re-command.\n*\n* The flip side: the presentation *url* is not part of this state, so replacing one\n* already-resolved live presentation with another would stay in `live` and never\n* command a start position for the new source. Unreachable today — every writer\n* sets `{ url }` (unresolved) or `undefined` first, so a source change always\n* transits `inactive`. Supporting a seeded pre-resolved presentation (via\n* `initialState`) that later changes would mean folding the url in here.\n*/\nfunction deriveState(mediaElement, edge) {\n\treturn mediaElement && edge ? \"live\" : \"inactive\";\n}\nfunction seekToLiveEdgeSetup({ state, context, config }) {\n\tconst derivedStateSignal = computed(() => deriveState(context.mediaElement.get(), getLiveEdge({\n\t\tstate,\n\t\tconfig\n\t})));\n\treturn createMachineReactor({\n\t\tinitial: \"inactive\",\n\t\tmonitor: () => derivedStateSignal.get(),\n\t\tstates: {\n\t\t\tinactive: {},\n\t\t\tlive: {\n\t\t\t\tentry: () => {\n\t\t\t\t\tconst mediaElement = context.mediaElement.get();\n\t\t\t\t\tconst { liveEdgeStart } = getLiveEdge({\n\t\t\t\t\t\tstate,\n\t\t\t\t\t\tconfig\n\t\t\t\t\t});\n\t\t\t\t\tif (mediaElement.currentTime >= liveEdgeStart) return;\n\t\t\t\t\tstate.startPosition.set(liveEdgeStart);\n\t\t\t\t},\n\t\t\t\teffects: () => {\n\t\t\t\t\tconst { start: windowStart, liveEdgeStart } = getLiveEdge({\n\t\t\t\t\t\tstate,\n\t\t\t\t\t\tconfig\n\t\t\t\t\t});\n\t\t\t\t\tconst mediaElement = peek(context.mediaElement);\n\t\t\t\t\tconst reposition = () => {\n\t\t\t\t\t\tif (mediaElement.paused) return;\n\t\t\t\t\t\tif (mediaElement.currentTime < windowStart - REPOSITION_TOLERANCE) mediaElement.currentTime = liveEdgeStart;\n\t\t\t\t\t};\n\t\t\t\t\treposition();\n\t\t\t\t\treturn listen(mediaElement, \"play\", reposition);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n}\n/**\n* Manual `Behavior<>` literal (like `calculatePresentationDuration`): declares\n* only `presentation` + `startPosition` in stateKeys while reading\n* `selectedVideoTrackId` / `selectedAudioTrackId` defensively (contributed by the\n* switch* behaviors), so it composes without a stateKeys/type conflict.\n*/\nconst seekToLiveEdge = {\n\tstateKeys: [\"presentation\", \"startPosition\"],\n\tcontextKeys: [\"mediaElement\"],\n\tsetup: seekToLiveEdgeSetup\n};\n//#endregion\nexport { seekToLiveEdge };\n\n//# sourceMappingURL=seek-to-live-edge.js.map","import { effect } from \"../../../core/signals/effect.js\";\nimport { liveWindowFromState } from \"../../primitives/live-window.js\";\n//#region src/playback/behaviors/dom/sync-live-seekable-range.ts\nfunction syncLiveSeekableRangeSetup({ state, context }) {\n\treturn effect(() => {\n\t\tconst mediaSource = context.mediaSource.get();\n\t\tconst liveWindow = liveWindowFromState(state);\n\t\tif (!mediaSource || !liveWindow) return;\n\t\tmediaSource.setLiveSeekableRange(liveWindow.start, liveWindow.end);\n\t});\n}\n/**\n* Manual `Behavior<>` literal (like `seekToLiveEdge`): declares only\n* `presentation` in stateKeys while reading `selectedVideoTrackId` /\n* `selectedAudioTrackId` defensively (contributed by the switch* behaviors), so\n* it composes without a stateKeys/type conflict.\n*/\nconst syncLiveSeekableRange = {\n\tstateKeys: [\"presentation\"],\n\tcontextKeys: [\"mediaSource\"],\n\tsetup: syncLiveSeekableRangeSetup\n};\n//#endregion\nexport { syncLiveSeekableRange };\n\n//# sourceMappingURL=sync-live-seekable-range.js.map","import { computed, peek } from \"../../../core/signals/primitives.js\";\nimport { defineBehavior } from \"../../../core/composition/create-composition.js\";\nimport { createMachineReactor } from \"../../../core/reactors/create-machine-reactor.js\";\nimport { getTracksByType } from \"../../../media/utils/tracks.js\";\nimport { syncTextTrackModes } from \"../../../media/dom/text/text-track-slots.js\";\nimport { listen } from \"@videojs/utils/dom\";\n//#region src/playback/behaviors/dom/sync-text-tracks.ts\n/**\n* **Own the text-track slots on the host media element, mirroring the SPF\n* model.** When a presentation is resolved and a media element is\n* available, allocate one slot in `mediaElement.textTracks` per model text\n* track — via creating `<track>` children, since that's the only spec\n* mechanism for adding *and* removing entries to `textTracks` (no\n* `removeTextTrack` API exists). Once slots are provisioned, mirror the\n* resolved `selectedTextTrackId` into their `mode`s (one-way: state → DOM),\n* and propagate user-initiated DOM `change` events back to\n* `userTextTrackSelection` — the standing *intent* (a language-based partial,\n* or `'off'`) that `switchTextTrack` resolves into `selectedTextTrackId`. So\n* non-SPF consumers (host-page captions buttons, browser native UI, video.js\n* store) drive selection by expressing intent, not by writing the resolved id.\n*\n* Single-positive-state reactor (`'preconditions-unmet'` ↔ `'sync-active'`):\n* the entry allocates the slots, applies the initial selection, attaches\n* the `change` listener, and opens a brief Chromium settling-window guard —\n* all transition-driven, fire-once on state entry, with paired cleanup on\n* state exit. A single `effects:` mirrors subsequent\n* `selectedTextTrackId` changes into `mode`s; that's the only\n* continuous-reactivity concern.\n*\n* State-exit cleanup also sends a `'clear'` message to the\n* `TextTracksActor` so its cue+segment cache (keyed by trackId) is\n* dropped alongside the DOM `<track>` slots. The actor itself is owned\n* by `setupTextTrackActors` and bound to mediaElement, not presentation,\n* so it survives source resets; clearing its context here keeps the\n* cache consistent with the DOM. Without this, a subsequent\n* presentation reusing a trackId would have `getSegmentsToLoad` treat\n* its segments as already-buffered and skip loading them.\n*\n* Single-writer separation: `selectedTextTrackId` is the resolved *output*\n* owned solely by `switchTextTrack`; this behavior only reads it (to mirror\n* modes). The write path here is `userTextTrackSelection` — the user-intent\n* *input* — so DOM action and the resolver never contend for one slot. The\n* intent isn't cleared on source unload (it's a standing preference, like\n* `userAudioTrackSelection`); `'off'` is written when the user disables all\n* tracks via native UI.\n*\n* Echo guard: `selectedTextTrackId` is exactly the id this behavior last drove\n* into the DOM, so a `change` event still showing it is our own echo (or a\n* resolver-driven correction — e.g. the picked track's CDN failed and the\n* resolver disabled it) and is ignored, never written back as a spurious user\n* action. Only a showing id that *differs* from the resolved id is a real user\n* pick. The settling-window guard additionally swallows Chromium's init-time\n* auto-selection before the resolved selection has settled.\n*/\nfunction deriveState(presentation, mediaElement) {\n\tif (!mediaElement || !presentation) return \"preconditions-unmet\";\n\treturn getTracksByType(presentation, \"text\").length > 0 ? \"sync-active\" : \"preconditions-unmet\";\n}\n/**\n* Map the DOM-showing track back to standing user intent. No showing track is an\n* explicit `'off'`. Otherwise prefer a language-based partial (so the pick\n* persists across source changes); fall back to `{ id }` for a track without a\n* language (precise within a source, just not portable).\n*/\nfunction deriveTextTrackIntent(showingId, modelTextTracks) {\n\tif (!showingId) return \"off\";\n\tconst language = modelTextTracks.find((track) => track.id === showingId)?.language;\n\treturn language ? { language } : { id: showingId };\n}\nfunction syncTextTracksSetup({ state, context, config }) {\n\tconst { addSubtitlesTracksToMedia, getShowingSubtitlesTrackFromMedia, removeAllSubtitlesTracksFromMedia } = config;\n\tconst derivedStateSignal = computed(() => deriveState(state.presentation.get(), context.mediaElement.get()));\n\treturn createMachineReactor({\n\t\tinitial: \"preconditions-unmet\",\n\t\tmonitor: () => derivedStateSignal.get(),\n\t\tstates: {\n\t\t\t\"preconditions-unmet\": {},\n\t\t\t\"sync-active\": {\n\t\t\t\tentry: () => {\n\t\t\t\t\tconst mediaElement = context.mediaElement.get();\n\t\t\t\t\tconst modelTextTracks = getTracksByType(state.presentation.get(), \"text\");\n\t\t\t\t\taddSubtitlesTracksToMedia(mediaElement, modelTextTracks);\n\t\t\t\t\tsyncTextTrackModes(mediaElement.textTracks, state.selectedTextTrackId.get());\n\t\t\t\t\tlet inSettlingWindow = true;\n\t\t\t\t\tconst settlingTimeout = setTimeout(() => {\n\t\t\t\t\t\tinSettlingWindow = false;\n\t\t\t\t\t}, 0);\n\t\t\t\t\tconst onChange = () => {\n\t\t\t\t\t\tif (inSettlingWindow) {\n\t\t\t\t\t\t\tsyncTextTrackModes(mediaElement.textTracks, state.selectedTextTrackId.get());\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst showingId = getShowingSubtitlesTrackFromMedia(mediaElement)?.id || void 0;\n\t\t\t\t\t\tif (showingId === state.selectedTextTrackId.get()) return;\n\t\t\t\t\t\tstate.userTextTrackSelection.set(deriveTextTrackIntent(showingId, modelTextTracks));\n\t\t\t\t\t};\n\t\t\t\t\tconst unlisten = listen(mediaElement.textTracks, \"change\", onChange);\n\t\t\t\t\treturn () => {\n\t\t\t\t\t\tunlisten();\n\t\t\t\t\t\tclearTimeout(settlingTimeout);\n\t\t\t\t\t\tremoveAllSubtitlesTracksFromMedia(mediaElement);\n\t\t\t\t\t\tpeek(context.textTracksActor)?.send({ type: \"clear\" });\n\t\t\t\t\t};\n\t\t\t\t},\n\t\t\t\teffects: () => {\n\t\t\t\t\tsyncTextTrackModes(peek(context.mediaElement).textTracks, state.selectedTextTrackId.get());\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n}\nconst syncTextTracks = defineBehavior({\n\tstateKeys: [\n\t\t\"presentation\",\n\t\t\"selectedTextTrackId\",\n\t\t\"userTextTrackSelection\"\n\t],\n\tcontextKeys: [\"mediaElement\", \"textTracksActor\"],\n\tsetup: syncTextTracksSetup\n});\n//#endregion\nexport { syncTextTracks };\n\n//# sourceMappingURL=sync-text-tracks.js.map","import { createComposition } from \"../../../core/composition/create-composition.js\";\nimport { makeShareSignals } from \"../../../core/composition/share-signals.js\";\nimport { resolveVttSegment } from \"../../../media/dom/text/resolve-vtt-segment.js\";\nimport { loadAudioSegments, loadTextTrackSegments, loadVideoSegments } from \"../../behaviors/dom/load-segments.js\";\nimport { setupTextTrackActors } from \"../../behaviors/dom/setup-text-track-actors.js\";\nimport { trackCurrentTime } from \"../../behaviors/dom/track-current-time.js\";\nimport { trackLoadTriggers } from \"../../behaviors/dom/track-load-triggers.js\";\nimport { deriveSharedMinStartMediaTime, establishStartMediaTime, gateFirstParseOnAnchor } from \"../../behaviors/establish-start-media-time.js\";\nimport { delayedReschedule } from \"../../../core/tasks/delayed-reschedule.js\";\nimport { attachMediaSourceAsSourceElement } from \"../../../media/dom/mse/mediasource-setup.js\";\nimport { canPlayTrack } from \"../../../media/dom/capabilities.js\";\nimport { addSubtitlesTracksToMedia, getShowingSubtitlesTrackFromMedia, removeAllSubtitlesTracksFromMedia } from \"../../../media/dom/text/text-track-slots.js\";\nimport { parseMultivariantPlaylist } from \"../../../media/hls/parse-multivariant.js\";\nimport { mediaPlaylistReloadDelay, resolveLiveLatency } from \"../../../media/hls/reload-policy.js\";\nimport { getResolvedSelectedTrackDuration } from \"../../../media/utils/track-selection.js\";\nimport { calculatePresentationDuration } from \"../../behaviors/calculate-presentation-duration.js\";\nimport { collectErrors } from \"../../behaviors/collect-errors.js\";\nimport { deriveCdnPriority } from \"../../behaviors/derive-cdn-priority.js\";\nimport { setupAirPlay } from \"../../behaviors/dom/airplay.js\";\nimport { applyStartPosition } from \"../../behaviors/dom/apply-start-position.js\";\nimport { endOfStream } from \"../../behaviors/dom/end-of-stream.js\";\nimport { recoverEndStall } from \"../../behaviors/dom/recover-end-stall.js\";\nimport { seekToLiveEdge } from \"../../behaviors/dom/seek-to-live-edge.js\";\nimport { setupAudioBufferActors, setupVideoBufferActors } from \"../../behaviors/dom/setup-buffer-actors.js\";\nimport { setupMediaSource } from \"../../behaviors/dom/setup-mediasource.js\";\nimport { syncLiveSeekableRange } from \"../../behaviors/dom/sync-live-seekable-range.js\";\nimport { syncTextTracks } from \"../../behaviors/dom/sync-text-tracks.js\";\nimport { updateMediaSourceDuration } from \"../../behaviors/dom/update-mediasource-duration.js\";\nimport { resolvePresentation } from \"../../behaviors/resolve-presentation.js\";\nimport { resolveAudioTrack, resolveTextTrack, resolveVideoTrack } from \"../../behaviors/resolve-track.js\";\nimport { setupFailoverMonitor } from \"../../behaviors/setup-failover-monitor.js\";\nimport { syncPreload } from \"../../behaviors/sync-preload.js\";\nimport { switchAudioTrack, switchTextTrack, switchVideoTrack } from \"../../behaviors/track-switching.js\";\nimport { relocatingTextPipelines, relocationPipelinesFor } from \"../../primitives/relocation-pipelines.js\";\nimport { reportUnsupportedTrackConditions } from \"../../primitives/report-track-conditions.js\";\n//#region src/playback/engines/hls/engine.ts\n/**\n* Generic `shareSignals` instantiated against the HLS engine's full state\n* and context — captures composition signal refs into the consumer's\n* `onSignalsReady` callback at setup time, and materializes input slots that no\n* composed behavior produces: `user*TrackSelection` (track-switching only reads\n* them). `failedCdns` is owned by `setupFailoverMonitor`, so it's already\n* materialized and reachable on the `onSignalsReady` refs without being listed\n* here.\n*/\nconst shareSignals = makeShareSignals([\n\t\"userVideoTrackSelection\",\n\t\"userAudioTrackSelection\",\n\t\"userTextTrackSelection\",\n\t\"disableRemotePlayback\"\n]);\n/**\n* Create an HLS playback engine.\n*\n* Composes SPF behaviors into a reactive pipeline for HLS playback over MSE:\n* manifest resolution, track selection, ABR, segment loading, and\n* end-of-stream coordination.\n*\n* @example\n* ```ts\n* let signals: HlsVideoEngineSignals;\n* const engine = createHlsVideoEngine({\n* initialBandwidth: 2_000_000,\n* preferredAudioLanguage: 'en',\n* onSignalsReady: (refs) => {\n* signals = refs;\n* },\n* });\n*\n* signals.context.mediaElement.set(videoEl);\n* signals.state.presentation.set({ url: 'https://example.com/stream.m3u8' });\n*\n* videoEl.play();\n*\n* await engine.destroy();\n* ```\n*/\nfunction createHlsVideoEngine(config = {}) {\n\tconst deriveStartMediaTime = config.deriveStartMediaTime ?? deriveSharedMinStartMediaTime;\n\tconst finalConfig = {\n\t\t...config,\n\t\tderiveStartMediaTime,\n\t\tattachMediaSource: attachMediaSourceAsSourceElement,\n\t\tcanPlayTrack: config.canPlayTrack ?? canPlayTrack,\n\t\treportUnsupportedTrackConditions: config.reportUnsupportedTrackConditions ?? reportUnsupportedTrackConditions,\n\t\tresolveTextTrackSegment: config.resolveTextTrackSegment ?? resolveVttSegment,\n\t\ttextMessagePipelines: relocatingTextPipelines,\n\t\tresolveDuration: config.resolveDuration ?? getResolvedSelectedTrackDuration,\n\t\tparsePresentation: config.parsePresentation ?? parseMultivariantPlaylist,\n\t\taddSubtitlesTracksToMedia: config.addSubtitlesTracksToMedia ?? addSubtitlesTracksToMedia,\n\t\tgetShowingSubtitlesTrackFromMedia: config.getShowingSubtitlesTrackFromMedia ?? getShowingSubtitlesTrackFromMedia,\n\t\tremoveAllSubtitlesTracksFromMedia: config.removeAllSubtitlesTracksFromMedia ?? removeAllSubtitlesTracksFromMedia,\n\t\tvideoMessagePipelines: relocationPipelinesFor(\"video\", deriveStartMediaTime),\n\t\taudioMessagePipelines: relocationPipelinesFor(\"audio\", deriveStartMediaTime),\n\t\tgateFirstParse: gateFirstParseOnAnchor,\n\t\tresolveLiveLatency,\n\t\treschedule: config.reschedule ?? delayedReschedule(mediaPlaylistReloadDelay)\n\t};\n\treturn createComposition([\n\t\tsyncPreload,\n\t\ttrackLoadTriggers,\n\t\tresolvePresentation,\n\t\tderiveCdnPriority,\n\t\tsetupFailoverMonitor,\n\t\tcollectErrors,\n\t\tresolveVideoTrack,\n\t\tresolveAudioTrack,\n\t\tresolveTextTrack,\n\t\tcalculatePresentationDuration,\n\t\tsetupMediaSource,\n\t\tupdateMediaSourceDuration,\n\t\testablishStartMediaTime,\n\t\tsetupVideoBufferActors,\n\t\tsetupAudioBufferActors,\n\t\tsetupAirPlay,\n\t\ttrackCurrentTime,\n\t\tapplyStartPosition,\n\t\tswitchVideoTrack,\n\t\tswitchAudioTrack,\n\t\tswitchTextTrack,\n\t\tloadVideoSegments,\n\t\tloadAudioSegments,\n\t\tsyncLiveSeekableRange,\n\t\tseekToLiveEdge,\n\t\tendOfStream,\n\t\trecoverEndStall,\n\t\tsyncTextTracks,\n\t\tsetupTextTrackActors,\n\t\tloadTextTrackSegments,\n\t\tshareSignals\n\t], {\n\t\tconfig: finalConfig,\n\t\tinitialState: { bandwidthState: {\n\t\t\tfastEstimate: 0,\n\t\t\tfastTotalWeight: 0,\n\t\t\tslowEstimate: 0,\n\t\t\tslowTotalWeight: 0,\n\t\t\tbytesSampled: 0\n\t\t} }\n\t});\n}\n//#endregion\nexport { createHlsVideoEngine };\n\n//# sourceMappingURL=engine.js.map","import { effect } from \"../../../core/signals/effect.js\";\nimport { deriveStreamType, getMediaPlaylistMetadata, isResolvedPresentation, isResolvedTrack } from \"../../../media/types/index.js\";\nimport { findTrackById } from \"../../../media/utils/tracks.js\";\nimport { SVTA_NO_SUPPORTED_AUDIO_TRACK, SVTA_NO_SUPPORTED_VIDEO_TRACK, SVTA_UNSUPPORTED_PLAYBACK_FEATURE } from \"../../../media/errors.js\";\nimport { resolveLiveLatency } from \"../../../media/hls/reload-policy.js\";\nimport { getLiveEdge, liveTrackId } from \"../../primitives/live-window.js\";\nimport { createHlsVideoEngine } from \"../../engines/hls/engine.js\";\nimport { DVR_EXPERIMENTAL_MESSAGE, LOW_LATENCY_UNSUPPORTED_MESSAGE, UNSUPPORTED_PLAYBACK_FEATURE_MESSAGE } from \"../../primitives/error-messages.js\";\nimport { firstFatal, hasUnsupportedFeatureCause, withAlternativeMediaSuggestion } from \"./error-surface.js\";\nimport { MediaStreamTypes } from \"@videojs/media\";\n//#region src/playback/adapters/hls-video/adapter.ts\nconst hlsVideoMediaDefaultProps = {\n\tsrc: \"\",\n\tpreload: \"\",\n\tdisableRemotePlayback: false,\n\tstreamType: MediaStreamTypes.UNKNOWN\n};\n/**\n* `targetLiveWindow` per the media-ui-extensions live-edge proposal: `NaN` for\n* on-demand (or nothing resolved yet), `0` for standard sliding-window live,\n* `Infinity` for DVR (`#EXT-X-PLAYLIST-TYPE:EVENT` — the window grows from the\n* start). Read from the timeline-bearing track's playlist metadata.\n*/\nfunction deriveTargetLiveWindow(presentation, trackId) {\n\tif (!isResolvedPresentation(presentation) || !trackId) return NaN;\n\tconst track = findTrackById(presentation, trackId);\n\tif (!track || !isResolvedTrack(track)) return NaN;\n\tconst metadata = getMediaPlaylistMetadata(track);\n\tif (!metadata) return NaN;\n\tif (metadata.playlistType === \"EVENT\") return Number.POSITIVE_INFINITY;\n\treturn deriveStreamType(metadata) === \"live\" ? 0 : NaN;\n}\n/**\n* Which reported conditions this composition treats as **fatal** — the ones that\n* reach `error` and fire `'error'`. Severity isn't part of an SVTA code\n* (§Approach: \"impact varies with player implementation\"), and here it also\n* varies by composition, so it's decided at this boundary rather than by the\n* reporter.\n*\n* An allow-list, deliberately: only *verdicts* are here. The per-rendition causes\n* `resolve-track` reports (unsupported format, unsupported DRM) stay in the\n* sequence as context — one unplayable rendition doesn't fail the source, and\n* promoting a cause would put a dialog over a mixed source that goes on to play.\n*/\nconst FATAL_SVTA_CODES = /* @__PURE__ */ new Set([SVTA_NO_SUPPORTED_VIDEO_TRACK, SVTA_NO_SUPPORTED_AUDIO_TRACK]);\n/**\n* Mixin that adds SPF playback engine behavior to any base class.\n*\n* Implements the src/play() contract per the WHATWG HTML spec so that SPF can\n* be used anywhere a media element API is expected.\n*\n* A single engine instance is created at construction and recycled across src\n* changes.\n*\n* @fires streamtypechange - Fired when the detected stream type changes. Read `streamType` for the new value.\n* @fires targetlivewindowchange - Fired when the target live window changes. Read `targetLiveWindow` for the new value.\n* @fires error - Fired when a fatal condition is reported. Read `error` for it.\n*\n* @example\n* class HlsVideoMedia extends HlsVideoMediaMixin(HTMLVideoElementHost) {}\n*\n* const media = new HlsVideoMedia();\n* media.attach(document.querySelector('video'));\n* media.src = 'https://stream.mux.com/abc123.m3u8';\n*/\nfunction HlsVideoMediaMixin(BaseClass) {\n\tclass HlsVideoMediaImpl extends BaseClass {\n\t\t/**\n\t\t* A complete sentence naming the Media to reach for when this one can't play\n\t\t* a source — `Try the hls.js-backed Mux media instead: import the hls-js\n\t\t* flavor in place of the spf one.` Appended to the copy this adapter\n\t\t* surfaces, and to the notices it logs. Name the flavor, not an import path:\n\t\t* a Media is reached through several packages, each with its own counterpart.\n\t\t*\n\t\t* Empty here: `hls-video` has no better-equipped sibling to point at.\n\t\t* A Media that does (a Mux Video built on this engine, whose hls.js-backed\n\t\t* counterpart plays MPEG-TS and DRM) overrides this static, and its copy gains\n\t\t* the second sentence with no other change.\n\t\t*/\n\t\tstatic get alternativeMediaSuggestion() {}\n\t\t#engine;\n\t\t#config;\n\t\t#signals;\n\t\t#preload = hlsVideoMediaDefaultProps.preload;\n\t\t#disableRemotePlayback = hlsVideoMediaDefaultProps.disableRemotePlayback;\n\t\t#streamType = hlsVideoMediaDefaultProps.streamType;\n\t\t#isUserStreamType = false;\n\t\t#targetLiveWindow = NaN;\n\t\t#error = null;\n\t\t/**\n\t\t* The *reported* condition currently surfaced, which is what the re-fire\n\t\t* latch keys on. Not `#error.code`: that's the code this adapter chose to\n\t\t* surface, and a later cause can change the choice for a condition already\n\t\t* announced.\n\t\t*/\n\t\t#reportedCode = null;\n\t\t/** Notices already logged for the current source; cleared when it unloads. */\n\t\t#noticed = /* @__PURE__ */ new Set();\n\t\t#stopLiveSync;\n\t\t#stopErrorSync;\n\t\t/** Pending loadstart listener from a deferred play() retry, if any. */\n\t\t#loadstartListener = null;\n\t\tconstructor(...args) {\n\t\t\tsuper(...args);\n\t\t\tconst { config } = args?.[0] ?? {};\n\t\t\tthis.#config = config;\n\t\t\tthis.#engine = this.#createEngine();\n\t\t\tthis.#stopLiveSync = effect(() => {\n\t\t\t\tconst presentation = this.#signals.state.presentation.get();\n\t\t\t\tthis.#setDetectedStreamType(presentation?.streamType ?? MediaStreamTypes.UNKNOWN);\n\t\t\t\tthis.#setTargetLiveWindow(deriveTargetLiveWindow(presentation, liveTrackId(this.#signals.state)));\n\t\t\t\tthis.#reportDeliveryNotices(presentation);\n\t\t\t});\n\t\t\tthis.#stopErrorSync = effect(() => {\n\t\t\t\tconst errors = this.#signals.state.errors.get();\n\t\t\t\tthis.#setError(firstFatal(errors, FATAL_SVTA_CODES), errors);\n\t\t\t});\n\t\t}\n\t\t/**\n\t\t* Underlying playback engine — the low-level SPF reactive composition that\n\t\t* drives playback. An advanced escape hatch for direct engine access;\n\t\t* normal playback is driven through this element's own properties and\n\t\t* methods.\n\t\t*/\n\t\tget engine() {\n\t\t\treturn this.#engine;\n\t\t}\n\t\t/**\n\t\t* The current fatal error, or `null`. Only *fatal* conditions appear here —\n\t\t* the engine reports non-fatal ones too (they stay in `engine.state.errors`),\n\t\t* and promoting them would tell a consumer playback had failed when it\n\t\t* hadn't. Resets per source. Fires `'error'` when set.\n\t\t*/\n\t\tget error() {\n\t\t\treturn this.#error;\n\t\t}\n\t\t/**\n\t\t* The source's stream type — `'live'`, `'on-demand'`, or `'unknown'` until\n\t\t* a media playlist has been parsed. Setting a non-`'unknown'` value pins a\n\t\t* user override (detection stops updating it); setting `'unknown'` reverts\n\t\t* to the engine's detected value.\n\t\t*/\n\t\tget streamType() {\n\t\t\treturn this.#streamType;\n\t\t}\n\t\tset streamType(value) {\n\t\t\tif (value === MediaStreamTypes.UNKNOWN) {\n\t\t\t\tthis.#isUserStreamType = false;\n\t\t\t\tthis.#updateStreamType(this.#signals.state.presentation.get()?.streamType ?? MediaStreamTypes.UNKNOWN);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.#isUserStreamType = true;\n\t\t\tthis.#updateStreamType(value);\n\t\t}\n\t\t/**\n\t\t* Presentation time marking the start of the live-edge window — playback at\n\t\t* `currentTime >= liveEdgeStart` counts as \"at the live edge\" (the same\n\t\t* target the engine's `seekToLiveEdge` seeks to: window end − HOLD-BACK).\n\t\t* `NaN` when the stream isn't live or nothing is resolved yet. Derived at\n\t\t* read time from the engine's live window — no change event; re-read on\n\t\t* `timeupdate`/`progress` (as the store's live feature does).\n\t\t*/\n\t\tget liveEdgeStart() {\n\t\t\treturn getLiveEdge({\n\t\t\t\tstate: this.#signals.state,\n\t\t\t\tconfig: { resolveLiveLatency }\n\t\t\t})?.liveEdgeStart ?? NaN;\n\t\t}\n\t\t/**\n\t\t* The target live window: `NaN` for on-demand (or unknown), `0` for\n\t\t* standard sliding-window live, `Infinity` for DVR\n\t\t* (`#EXT-X-PLAYLIST-TYPE:EVENT`). Fires `targetlivewindowchange` on change.\n\t\t*/\n\t\tget targetLiveWindow() {\n\t\t\treturn this.#targetLiveWindow;\n\t\t}\n\t\t#setDetectedStreamType(value) {\n\t\t\tif (this.#isUserStreamType) return;\n\t\t\tthis.#updateStreamType(value);\n\t\t}\n\t\t#updateStreamType(value) {\n\t\t\tif (this.#streamType === value) return;\n\t\t\tthis.#streamType = value;\n\t\t\tthis.dispatchEvent?.(new Event(\"streamtypechange\"));\n\t\t}\n\t\t#setTargetLiveWindow(value) {\n\t\t\tif (Object.is(this.#targetLiveWindow, value)) return;\n\t\t\tthis.#targetLiveWindow = value;\n\t\t\tthis.dispatchEvent?.(new Event(\"targetlivewindowchange\"));\n\t\t}\n\t\t#setError(reported, errors) {\n\t\t\tif (!reported) {\n\t\t\t\tthis.#error = null;\n\t\t\t\tthis.#reportedCode = null;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (this.#reportedCode === reported.code) return;\n\t\t\tthis.#reportedCode = reported.code;\n\t\t\tconst unsupported = hasUnsupportedFeatureCause(errors);\n\t\t\tif (unsupported) console.error(this.#withSuggestion(UNSUPPORTED_PLAYBACK_FEATURE_MESSAGE), { conditions: errors });\n\t\t\tthis.#error = {\n\t\t\t\tcode: unsupported ? SVTA_UNSUPPORTED_PLAYBACK_FEATURE : reported.code,\n\t\t\t\tmessage: reported.message ?? \"\",\n\t\t\t\t...reported.data === void 0 ? {} : { data: reported.data }\n\t\t\t};\n\t\t\tthis.dispatchEvent?.(new Event(\"error\"));\n\t\t}\n\t\tattach(mediaElement) {\n\t\t\tsuper.attach?.(mediaElement);\n\t\t\tthis.#signals.context.mediaElement.set(mediaElement);\n\t\t}\n\t\tdetach() {\n\t\t\tthis.#cancelPendingPlay();\n\t\t\tthis.#signals.context.mediaElement.set(void 0);\n\t\t\tsuper.detach?.();\n\t\t}\n\t\tdestroy() {\n\t\t\tthis.#cancelPendingPlay();\n\t\t\tthis.#stopLiveSync();\n\t\t\tthis.#stopErrorSync();\n\t\t\tthis.#engine.destroy();\n\t\t}\n\t\t/** Preload type (`'none'` / `'metadata'` / `'auto'`). */\n\t\tget preload() {\n\t\t\treturn this.#preload;\n\t\t}\n\t\tset preload(value) {\n\t\t\tthis.#preload = value;\n\t\t\tif (value) this.#signals.state.preload.set(value);\n\t\t}\n\t\tget disableRemotePlayback() {\n\t\t\treturn this.#disableRemotePlayback;\n\t\t}\n\t\tset disableRemotePlayback(value) {\n\t\t\tthis.#disableRemotePlayback = value;\n\t\t\tthis.#signals.state.disableRemotePlayback.set(value);\n\t\t}\n\t\tget src() {\n\t\t\treturn this.#signals.state.presentation.get()?.url ?? \"\";\n\t\t}\n\t\tset src(value) {\n\t\t\tif (value === this.src) return;\n\t\t\tthis.#cancelPendingPlay();\n\t\t\tthis.#signals.state.presentation.set(value ? { url: value } : void 0);\n\t\t}\n\t\tplay() {\n\t\t\tconst mediaElement = this.#signals.context.mediaElement.get();\n\t\t\tif (!mediaElement) return Promise.reject(/* @__PURE__ */ new Error(\"HlsVideoMediaElement: no media element attached\"));\n\t\t\tthis.#signals.state.loadActivated.set(true);\n\t\t\treturn mediaElement.play().catch((err) => {\n\t\t\t\tif (this.src) return new Promise((resolve, reject) => {\n\t\t\t\t\tconst listener = () => {\n\t\t\t\t\t\tthis.#loadstartListener = null;\n\t\t\t\t\t\tmediaElement.play().then(resolve, reject);\n\t\t\t\t\t};\n\t\t\t\t\tthis.#loadstartListener = listener;\n\t\t\t\t\tmediaElement.addEventListener(\"loadstart\", listener, { once: true });\n\t\t\t\t});\n\t\t\t\tthrow err;\n\t\t\t});\n\t\t}\n\t\t/** `message`, plus the alternative-Media sentence when this class names one. */\n\t\t#withSuggestion(message) {\n\t\t\treturn withAlternativeMediaSuggestion(message, this);\n\t\t}\n\t\t/**\n\t\t* Log what this engine is delivering differently from what the playlist asked\n\t\t* for. Neither condition stops playback, so neither is an error — they go to\n\t\t* the console rather than the error surface.\n\t\t*\n\t\t* Once per source, not per parse: a live playlist reloads every target\n\t\t* duration, and the timeline track re-parses on each one. Keyed on the notice\n\t\t* rather than latched with a boolean so the two are independent, and cleared\n\t\t* when the presentation unresolves so the next source starts quiet.\n\t\t*/\n\t\t#reportDeliveryNotices(presentation) {\n\t\t\tif (!isResolvedPresentation(presentation)) {\n\t\t\t\tthis.#noticed.clear();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst trackId = liveTrackId(this.#signals.state);\n\t\t\tconst track = trackId ? findTrackById(presentation, trackId) : void 0;\n\t\t\tif (!track || !isResolvedTrack(track)) return;\n\t\t\tconst metadata = getMediaPlaylistMetadata(track);\n\t\t\tif (!metadata) return;\n\t\t\tif (metadata.lowLatency && !this.#noticed.has(\"lowLatency\")) {\n\t\t\t\tthis.#noticed.add(\"lowLatency\");\n\t\t\t\tconsole.warn(this.#withSuggestion(LOW_LATENCY_UNSUPPORTED_MESSAGE));\n\t\t\t}\n\t\t\tif (metadata.playlistType === \"EVENT\" && !this.#noticed.has(\"dvr\")) {\n\t\t\t\tthis.#noticed.add(\"dvr\");\n\t\t\t\tconsole.warn(this.#withSuggestion(DVR_EXPERIMENTAL_MESSAGE));\n\t\t\t}\n\t\t}\n\t\t#createEngine() {\n\t\t\treturn createHlsVideoEngine({\n\t\t\t\t...this.#config,\n\t\t\t\tonSignalsReady: (signals) => {\n\t\t\t\t\tthis.#signals = signals;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t\t#cancelPendingPlay() {\n\t\t\tif (!this.#loadstartListener) return;\n\t\t\tthis.#signals.context.mediaElement.get()?.removeEventListener(\"loadstart\", this.#loadstartListener);\n\t\t\tthis.#loadstartListener = null;\n\t\t}\n\t}\n\treturn HlsVideoMediaImpl;\n}\n/** Standalone SPF media adapter with no base class. */\nvar HlsVideoMediaElement = class extends HlsVideoMediaMixin(class {}) {};\n//#endregion\nexport { HlsVideoMediaElement, HlsVideoMediaMixin, hlsVideoMediaDefaultProps };\n\n//# sourceMappingURL=adapter.js.map","import { findTrackById, getTracksByType } from \"../utils/tracks.js\";\n//#region src/media/media-tracks/media-tracks.ts\n/**\n* The distinct video tracks of a presentation, deduped by {@link VideoDedupeKey} (first occurrence wins).\n*\n* Returns `[]` when the presentation is unresolved or has no video tracks.\n*/\nfunction dedupedVideoTracks(presentation) {\n\tif (!presentation) return [];\n\treturn dedupe({\n\t\ttracks: getTracksByType(presentation, \"video\"),\n\t\tkeyFn: toUserVideoTrackSelection\n\t});\n}\n/**\n* The distinct audio tracks of a presentation, deduped by `language` + `name`\n* (first occurrence wins). Returns `[]` when the presentation is unresolved or has no audio tracks.\n*/\nfunction dedupedAudioTracks(presentation) {\n\tif (!presentation) return [];\n\treturn dedupe({\n\t\ttracks: getTracksByType(presentation, \"audio\"),\n\t\tkeyFn: toUserAudioTrackSelection\n\t});\n}\n/**\n* Find a video track by id, searching the same candidate set the engine resolves\n* against ({@link dedupedVideoTracks}'s pre-dedupe source). Returns `undefined`\n* when absent. Maps the engine's resolved `selectedVideoTrackId` back to its\n* properties for `active` reflection — the resolved id may be a per-CDN copy that\n* isn't the representative {@link dedupedVideoTracks} kept.\n*/\nfunction findVideoTrackById(presentation, id) {\n\tif (!presentation || !id) return void 0;\n\tconst track = findTrackById(presentation, id);\n\treturn track?.type === \"video\" ? track : void 0;\n}\n/** Audio counterpart of {@link findVideoTrackById}, for `enabled` reflection. */\nfunction findAudioTrackById(presentation, id) {\n\tif (!presentation || !id) return void 0;\n\tconst track = findTrackById(presentation, id);\n\treturn track?.type === \"audio\" ? track : void 0;\n}\n/**\n* Shallow-equal two key objects by their own properties. Both come from the same\n* key builder, so they carry the same keys — a one-directional scan suffices.\n*/\nfunction sameKey(a, b) {\n\tfor (const attr in a) if (a[attr] !== b[attr]) return false;\n\treturn true;\n}\n/**\n* Dedupe tracks by a key function, keeping the first occurrence of each key.\n* Keys are compared field-by-field ({@link sameKey}).\n*/\nfunction dedupe({ tracks, keyFn }) {\n\tconst seen = [];\n\tconst kept = [];\n\tfor (const track of tracks) {\n\t\tconst key = keyFn(track);\n\t\tif (!key || seen.some((other) => sameKey(other, key))) continue;\n\t\tseen.push(key);\n\t\tkept.push(track);\n\t}\n\treturn kept;\n}\n/**\n* Build a partial video track that can be used as `userVideoTrackSelection`.\n*/\nfunction toUserVideoTrackSelection(rendition) {\n\treturn rendition ? {\n\t\twidth: rendition.width,\n\t\theight: rendition.height,\n\t\tbandwidth: rendition.bandwidth\n\t} : void 0;\n}\n/**\n* Build a partial audio track that can be used as a `userAudioTrackSelection`.\n*/\nfunction toUserAudioTrackSelection(track) {\n\treturn track ? {\n\t\tlanguage: track.language,\n\t\tname: track.name\n\t} : void 0;\n}\n/** Whether two video tracks are the same by dedupe key */\nfunction isSameVideoTrack(a, b) {\n\treturn !!b && a.width === b.width && a.height === b.height && a.bandwidth === b.bandwidth;\n}\n/** Whether two audio tracks are the same by dedupe key */\nfunction isSameAudioTrack(a, b) {\n\treturn !!b && (a.language ?? \"\") === (b.language ?? \"\") && a.name === b.name;\n}\n/** Collapse a rational frame rate (numerator/denominator) to frames per second. */\nconst frameRateToNumber = (frameRate) => {\n\treturn frameRate.frameRateNumerator / (frameRate.frameRateDenominator ?? 1);\n};\n//#endregion\nexport { dedupedAudioTracks, dedupedVideoTracks, findAudioTrackById, findVideoTrackById, frameRateToNumber, isSameAudioTrack, isSameVideoTrack, toUserAudioTrackSelection, toUserVideoTrackSelection };\n\n//# sourceMappingURL=media-tracks.js.map","import { computed, untrack } from \"../../../core/signals/primitives.js\";\nimport { effect } from \"../../../core/signals/effect.js\";\nimport { dedupedAudioTracks, dedupedVideoTracks, findAudioTrackById, findVideoTrackById, frameRateToNumber, isSameAudioTrack, isSameVideoTrack, toUserAudioTrackSelection, toUserVideoTrackSelection } from \"../../../media/media-tracks/media-tracks.js\";\n//#region src/playback/adapters/hls-video/media-tracks.ts\nconst toVideoKey = (rendition) => ({\n\twidth: rendition.width,\n\theight: rendition.height,\n\tbandwidth: rendition.bitrate\n});\nconst toAudioKey = (track) => ({\n\tlanguage: track.language,\n\tname: track.label\n});\n/** Two track lists carry the same set when their id sequences match. */\nconst sameIds = (a, b) => a.length === b.length && a.every((item, i) => item.id === b[i].id);\n/**\n* Projects the SPF engine's presentation onto the media element's\n* `videoRenditions` / `audioTracks` lists, and wires user selection back to the\n* engine's `userVideoTrackSelection` / `userAudioTrackSelection` signals.\n*\n* Requires the media-tracks mixin (track-list infrastructure) earlier in the\n* chain so the host exposes `addVideoTrack`, `videoRenditions`, and friends.\n*/\nfunction HlsVideoMediaMediaTracksMixin(BaseClass) {\n\tclass HlsVideoMediaMediaTracks extends BaseClass {\n\t\t#abort = new AbortController();\n\t\t#destroyed = false;\n\t\t#renditions = [];\n\t\t#audioTracks = [];\n\t\tconstructor(...args) {\n\t\t\tsuper(...args);\n\t\t\tconst { state } = this.engine;\n\t\t\tconst { signal } = this.#abort;\n\t\t\tconst renditionsSignal = computed(() => dedupedVideoTracks(state.presentation.get()), { equals: sameIds });\n\t\t\tconst audioTracksSignal = computed(() => dedupedAudioTracks(state.presentation.get()), { equals: sameIds });\n\t\t\tconst reflectRenditions = () => {\n\t\t\t\tconst renditions = renditionsSignal.get();\n\t\t\t\tthis.#renditions = renditions;\n\t\t\t\tthis.#removeVideoTracks();\n\t\t\t\tif (!renditions.length) return;\n\t\t\t\tconst videoTrack = this.addVideoTrack(\"main\");\n\t\t\t\tvideoTrack.selected = true;\n\t\t\t\tconst resolved = untrack(() => findVideoTrackById(state.presentation.get(), state.selectedVideoTrackId.get()));\n\t\t\t\tfor (const rendition of renditions) {\n\t\t\t\t\tconst domRendition = videoTrack.addRendition(\"\", rendition.width, rendition.height, rendition.codecs.join(\",\"), rendition.bandwidth, rendition.frameRate ? frameRateToNumber(rendition.frameRate) : void 0);\n\t\t\t\t\tdomRendition.id = rendition.id;\n\t\t\t\t\tdomRendition.active = isSameVideoTrack(toVideoKey(domRendition), resolved);\n\t\t\t\t}\n\t\t\t};\n\t\t\tconst reflectSelectedVideo = () => {\n\t\t\t\tconst resolved = findVideoTrackById(state.presentation.get(), state.selectedVideoTrackId.get());\n\t\t\t\tfor (const rendition of this.videoRenditions) rendition.active = isSameVideoTrack(toVideoKey(rendition), resolved);\n\t\t\t};\n\t\t\tconst reflectAudioTracks = () => {\n\t\t\t\tconst tracks = audioTracksSignal.get();\n\t\t\t\tthis.#audioTracks = tracks;\n\t\t\t\tthis.#removeAudioTracks();\n\t\t\t\tif (!tracks.length) return;\n\t\t\t\tconst resolved = untrack(() => findAudioTrackById(state.presentation.get(), state.selectedAudioTrackId.get()));\n\t\t\t\tfor (const track of tracks) {\n\t\t\t\t\tconst domTrack = this.addAudioTrack(track.default ? \"main\" : \"alternative\", track.name, track.language ?? \"\");\n\t\t\t\t\tdomTrack.id = track.id;\n\t\t\t\t\tdomTrack.enabled = isSameAudioTrack(toAudioKey(domTrack), resolved);\n\t\t\t\t}\n\t\t\t};\n\t\t\tconst reflectSelectedAudio = () => {\n\t\t\t\tconst resolved = findAudioTrackById(state.presentation.get(), state.selectedAudioTrackId.get());\n\t\t\t\tfor (const track of this.audioTracks) track.enabled = isSameAudioTrack(toAudioKey(track), resolved);\n\t\t\t};\n\t\t\tconst sourceUrl = computed(() => state.presentation.get()?.url);\n\t\t\tconst resetSelectionOnSourceChange = () => {\n\t\t\t\tsourceUrl.get();\n\t\t\t\tstate.userVideoTrackSelection.set(void 0);\n\t\t\t\tstate.userAudioTrackSelection.set(void 0);\n\t\t\t};\n\t\t\tconst effectCleanups = [\n\t\t\t\teffect(reflectRenditions),\n\t\t\t\teffect(reflectSelectedVideo),\n\t\t\t\teffect(reflectAudioTracks),\n\t\t\t\teffect(reflectSelectedAudio),\n\t\t\t\teffect(resetSelectionOnSourceChange)\n\t\t\t];\n\t\t\tthis.videoRenditions.addEventListener(\"change\", this.#selectRendition, { signal });\n\t\t\tthis.audioTracks.addEventListener(\"change\", this.#selectAudio, { signal });\n\t\t\tsignal.addEventListener(\"abort\", () => effectCleanups.forEach((cleanup) => cleanup()), { once: true });\n\t\t}\n\t\tdestroy() {\n\t\t\tif (this.#destroyed) return;\n\t\t\tthis.#destroyed = true;\n\t\t\tthis.#abort.abort();\n\t\t\tthis.#removeVideoTracks();\n\t\t\tthis.#removeAudioTracks();\n\t\t\tsuper.destroy?.();\n\t\t}\n\t\t#selectRendition = () => {\n\t\t\tconst { userVideoTrackSelection } = this.engine.state;\n\t\t\tconst index = this.videoRenditions.selectedIndex;\n\t\t\tconst domRendition = index < 0 ? void 0 : this.videoRenditions[index];\n\t\t\tconst rendition = this.#renditions.find((candidate) => candidate.id === domRendition?.id);\n\t\t\tuserVideoTrackSelection.set(toUserVideoTrackSelection(rendition));\n\t\t};\n\t\t#selectAudio = () => {\n\t\t\tconst { presentation, selectedAudioTrackId, userAudioTrackSelection } = this.engine.state;\n\t\t\tconst resolved = findAudioTrackById(presentation.get(), selectedAudioTrackId.get());\n\t\t\tconst current = [...this.audioTracks].find((track) => isSameAudioTrack(toAudioKey(track), resolved));\n\t\t\tconst enabled = [...this.audioTracks].filter((track) => track.enabled);\n\t\t\tconst target = enabled.find((track) => track !== current) ?? enabled[0];\n\t\t\tif (!target) return;\n\t\t\tfor (const track of enabled) if (track !== target) track.enabled = false;\n\t\t\tif (target === current) return;\n\t\t\tconst audioTrack = this.#audioTracks.find((candidate) => candidate.id === target.id);\n\t\t\tuserAudioTrackSelection.set(toUserAudioTrackSelection(audioTrack));\n\t\t};\n\t\t#removeVideoTracks() {\n\t\t\tfor (const videoTrack of [...this.videoTracks]) this.removeVideoTrack(videoTrack);\n\t\t}\n\t\t#removeAudioTracks() {\n\t\t\tfor (const audioTrack of [...this.audioTracks]) this.removeAudioTrack(audioTrack);\n\t\t}\n\t}\n\treturn HlsVideoMediaMediaTracks;\n}\n//#endregion\nexport { HlsVideoMediaMediaTracksMixin };\n\n//# sourceMappingURL=media-tracks.js.map","import { HlsVideoMediaMixin } from \"./adapter.js\";\nimport { HlsVideoMediaMediaTracksMixin } from \"./media-tracks.js\";\nimport { HTMLVideoElementHost } from \"@videojs/media/dom/video-host\";\nimport { MediaTracksMixin } from \"@videojs/media/media-tracks\";\n//#region src/playback/adapters/hls-video/media.ts\nconst HlsVideoMediaBase = HlsVideoMediaMediaTracksMixin(MediaTracksMixin(HlsVideoMediaMixin(HTMLVideoElementHost)));\nvar HlsVideoMedia = class extends HlsVideoMediaBase {};\n//#endregion\nexport { HlsVideoMedia };\n\n//# sourceMappingURL=media.js.map"],"mappings":"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"}
1
+ {"version":3,"file":"media-DI6DvYm3.js","names":["deriveState","#config","#engine","#createEngine","#stopLiveSync","#signals","#setDetectedStreamType","#setTargetLiveWindow","#reportDeliveryNotices","#stopErrorSync","#setError","#error","#streamType","#isUserStreamType","#updateStreamType","#targetLiveWindow","#reportedCode","#withSuggestion","#cancelPendingPlay","#preload","#disableRemotePlayback","#loadstartListener","#noticed","#abort","#renditions","#removeVideoTracks","#audioTracks","#removeAudioTracks","#selectRendition","#selectAudio","#destroyed"],"sources":["../../utils/dist/time/sleep.js","../../spf/dist/dev/media/hls/reload-policy.js","../../spf/dist/dev/media/live-window.js","../../spf/dist/dev/playback/primitives/live-window.js","../../spf/dist/dev/media/dom/text/resolve-vtt-segment.js","../../spf/dist/dev/core/actors/create-transition-actor.js","../../spf/dist/dev/playback/actors/dom/text-tracks.js","../../spf/dist/dev/playback/actors/text-track-segment-loader.js","../../spf/dist/dev/playback/behaviors/dom/setup-text-track-actors.js","../../spf/dist/dev/core/tasks/delayed-reschedule.js","../../spf/dist/dev/media/dom/text/text-track-slots.js","../../spf/dist/dev/playback/behaviors/dom/seek-to-live-edge.js","../../spf/dist/dev/playback/behaviors/dom/sync-live-seekable-range.js","../../spf/dist/dev/playback/behaviors/dom/sync-text-tracks.js","../../spf/dist/dev/playback/engines/hls/engine.js","../../spf/dist/dev/playback/adapters/hls-video/adapter.js","../../spf/dist/dev/media/media-tracks/media-tracks.js","../../spf/dist/dev/playback/adapters/hls-video/media-tracks.js","../../spf/dist/dev/playback/adapters/hls-video/media.js"],"sourcesContent":["//#region src/time/sleep.ts\n/**\n* Resolve after `ms` milliseconds. Pass a `signal` to make it cancellable: the\n* timer is cleared and the promise rejects with the signal's reason as soon as\n* the signal aborts (including if it's already aborted).\n*/\nfunction sleep(ms, signal) {\n\treturn new Promise((resolve, reject) => {\n\t\tif (signal?.aborted) {\n\t\t\treject(signal.reason);\n\t\t\treturn;\n\t\t}\n\t\tconst onAbort = () => {\n\t\t\tclearTimeout(timer);\n\t\t\treject(signal?.reason);\n\t\t};\n\t\tconst timer = setTimeout(() => {\n\t\t\tsignal?.removeEventListener(\"abort\", onAbort);\n\t\t\tresolve();\n\t\t}, ms);\n\t\tsignal?.addEventListener(\"abort\", onAbort, { once: true });\n\t});\n}\n//#endregion\nexport { sleep };\n\n//# sourceMappingURL=sleep.js.map","import { getMediaPlaylistMetadata, isResolvedPresentation, isResolvedTrack } from \"../types/index.js\";\nimport { findTrackById } from \"../utils/tracks.js\";\n//#region src/media/hls/reload-policy.ts\n/** Reload cadence when a playlist carries no usable target duration. */\nconst FALLBACK_TARGET_DURATION = 6;\n/**\n* Default `HOLD-BACK` as a multiple of the target duration when the playlist\n* declares none — the HLS spec default (RFC 8216bis `EXT-X-SERVER-CONTROL`).\n*/\nconst HOLD_BACK_TARGET_MULTIPLIER = 3;\n/** Identity of a reload snapshot — window position + length. Changes when the window slid or grew. */\nfunction snapshotSignature(track) {\n\treturn `${getMediaPlaylistMetadata(track)?.mediaSequence ?? 0}:${track.segments.length}`;\n}\nfunction targetDurationOf(track) {\n\treturn getMediaPlaylistMetadata(track)?.targetDuration || FALLBACK_TARGET_DURATION;\n}\n/**\n* Live media-playlist reload cadence, per RFC 8216bis §6.3.4 — a\n* {@link RecurrencePolicy} for a `RecurringRunner` re-resolving the selected\n* track. Structurally matches `RecurrencePolicy<ResolvedTrack>` without\n* importing it (media stays core-free): `current` is the freshly resolved track,\n* `previous` the prior resolved snapshot.\n*\n* - Complete playlist (VoD, or live that hit `#EXT-X-ENDLIST`) → `null`: stop.\n* Keys off `Track.duration` (finite once complete), the single completeness\n* source of truth.\n* - Unchanged window (same media sequence + segment count as `previous`) → poll\n* at half the target duration; a moved/grown window (or the first reload) →\n* full target duration.\n*\n* A failed reload doesn't reach here — the rejection propagates through the\n* `RecurringRunner`; transient-failure recovery belongs at the fetch layer.\n*\n* Returned delays are milliseconds.\n*/\nfunction mediaPlaylistReloadDelay(current, previous) {\n\tif (Number.isFinite(current.duration)) return null;\n\tconst target = targetDurationOf(current);\n\treturn (!previous || snapshotSignature(current) !== snapshotSignature(previous) ? target : target / 2) * 1e3;\n}\n/**\n* Target live latency (seconds) for a resolved track — how far behind the live\n* edge the playhead should sit. Prefers the server's declared\n* `EXT-X-SERVER-CONTROL` `HOLD-BACK`, falling back to\n* {@link HOLD_BACK_TARGET_MULTIPLIER}× the target duration when absent (the\n* spec default). This is the HLS side of the format-neutral\n* `resolveLiveLatency` seam consumed by `seek-to-live-edge`; a DASH engine\n* supplies its own (`suggestedPresentationDelay`).\n*\n* Only `HOLD-BACK` — never `PART-HOLD-BACK`, which assumes partial-segment\n* playback. See {@link MediaPlaylistMetadata.holdBack}.\n*/\nfunction liveLatencyFor(track) {\n\treturn getMediaPlaylistMetadata(track)?.holdBack ?? HOLD_BACK_TARGET_MULTIPLIER * targetDurationOf(track);\n}\n/**\n* Resolve the target live latency for a presentation's timeline-bearing track —\n* the HLS engine injects this as `seekToLiveEdge`'s format-neutral\n* `resolveLiveLatency` seam. `0` when there is no resolved track to read (the\n* behavior then seeks straight to the edge).\n*/\nfunction resolveLiveLatency(presentation, trackId) {\n\tif (!isResolvedPresentation(presentation) || !trackId) return 0;\n\tconst track = findTrackById(presentation, trackId);\n\treturn track && isResolvedTrack(track) ? liveLatencyFor(track) : 0;\n}\n//#endregion\nexport { liveLatencyFor, mediaPlaylistReloadDelay, resolveLiveLatency };\n\n//# sourceMappingURL=reload-policy.js.map","import { isResolvedPresentation, isResolvedTrack } from \"./types/index.js\";\nimport { findTrackById } from \"./utils/tracks.js\";\n//#region src/media/live-window.ts\n/**\n* Derive the live window of the track with the given id — the single source of\n* truth for \"where is live,\" consumed (via `liveWindowFromState`) by the\n* seek-to-live-edge and live-seekable-range behaviors so neither re-derives (or\n* re-presumes) the window shape. Type-agnostic: the caller decides which track\n* bears the timeline (video when present, else audio).\n*\n* The window is a **live read** over the current `segments` array — never\n* stored on the track. The anchor triple is frozen per source; per-segment\n* `startTime` values are re-derived against it on every reload, so the edge\n* here slides while the origin stays fixed (see\n* `internal/design/spf/live-presentation-timeline-model.md`).\n*\n* Returns `null` when there is no live edge to track: an unresolved\n* presentation or track, a track with no segments, or a **complete** playlist\n* (VoD, or live that has ended — a finite `Track.duration`).\n*/\nfunction liveWindowFor(presentation, trackId) {\n\tif (!isResolvedPresentation(presentation) || !trackId) return null;\n\tconst track = findTrackById(presentation, trackId);\n\tif (!track || !isResolvedTrack(track) || track.segments.length === 0) return null;\n\tif (Number.isFinite(track.duration)) return null;\n\tconst { segments } = track;\n\tconst last = segments[segments.length - 1];\n\treturn {\n\t\tstart: segments[0].startTime,\n\t\tend: last.startTime + last.duration\n\t};\n}\n//#endregion\nexport { liveWindowFor };\n\n//# sourceMappingURL=live-window.js.map","import { getTracksByType } from \"../../media/utils/tracks.js\";\nimport { liveWindowFor } from \"../../media/live-window.js\";\n//#region src/playback/primitives/live-window.ts\n/**\n* The id of the timeline-bearing track: the selected video track when present,\n* else the selected audio track. The single pick both the window derivation and\n* the live-latency resolution (`seek-to-live-edge`) share, so they can't drift.\n*/\nfunction liveTrackId(state) {\n\treturn state.selectedVideoTrackId?.get() ?? state.selectedAudioTrackId?.get();\n}\n/**\n* One type's window: the selected track's when it's resolved, else any resolved\n* track of the type. The fallback keeps the window from blinking to `null`\n* mid ABR / user switch — all renditions of a type are time-aligned and share\n* the anchor, so a deselected track's window may trail live by up to one reload\n* during the switch gap (acceptable; the selected track's fresh window resumes\n* the moment it resolves). A null blink would flip `seekToLiveEdge` out of\n* `live` and stall the seekable-range writer.\n*/\nfunction liveWindowForType(presentation, selectedId, type) {\n\tif (!presentation || selectedId === void 0) return null;\n\tconst selected = liveWindowFor(presentation, selectedId);\n\tif (selected) return selected;\n\tfor (const track of getTracksByType(presentation, type)) {\n\t\tconst window = liveWindowFor(presentation, track.id);\n\t\tif (window) return window;\n\t}\n\treturn null;\n}\nfunction liveWindowFromState(state) {\n\tconst presentation = state.presentation.get();\n\tconst video = liveWindowForType(presentation, state.selectedVideoTrackId?.get(), \"video\");\n\tconst audio = liveWindowForType(presentation, state.selectedAudioTrackId?.get(), \"audio\");\n\tif (video && audio) {\n\t\tconst start = Math.max(video.start, audio.start);\n\t\tconst end = Math.min(video.end, audio.end);\n\t\treturn start < end ? {\n\t\t\tstart,\n\t\t\tend\n\t\t} : null;\n\t}\n\treturn video ?? audio;\n}\n/**\n* Resolve the live edge — the window bounds plus the target playhead position —\n* from a behavior's setup arguments. Bundles the window geometry and the\n* format-specific latency policy (`config.resolveLiveLatency`) so the consuming\n* behavior never has to compose them; it just forwards its `{ state, config }`.\n* `null` when there is no live edge (VOD / ended / unresolved).\n*\n* Reads signals lazily — call it inside a reactive context (an effect).\n*/\nfunction getLiveEdge({ state, config }) {\n\tconst window = liveWindowFromState(state);\n\tif (!window) return null;\n\tconst latency = config?.resolveLiveLatency?.(state.presentation.get(), liveTrackId(state)) ?? 0;\n\treturn {\n\t\t...window,\n\t\tliveEdgeStart: Math.max(window.start, window.end - latency)\n\t};\n}\n//#endregion\nexport { getLiveEdge, liveTrackId, liveWindowFromState };\n\n//# sourceMappingURL=live-window.js.map","//#region src/media/dom/text/resolve-vtt-segment.ts\nlet dummyVideo = null;\nfunction ensureDummyVideo() {\n\tif (!dummyVideo) {\n\t\tdummyVideo = document.createElement(\"video\");\n\t\tdummyVideo.muted = true;\n\t\tdummyVideo.preload = \"none\";\n\t\tdummyVideo.style.display = \"none\";\n\t\tdummyVideo.crossOrigin = \"anonymous\";\n\t}\n\treturn dummyVideo;\n}\nfunction resolveVttSegment(url) {\n\tconst video = ensureDummyVideo();\n\tconst track = document.createElement(\"track\");\n\ttrack.kind = \"subtitles\";\n\treturn new Promise((resolve, reject) => {\n\t\tconst onLoad = () => {\n\t\t\tconst cues = [];\n\t\t\tconst textTrack = track.track;\n\t\t\tif (textTrack.cues) for (let i = 0; i < textTrack.cues.length; i++) {\n\t\t\t\tconst cue = textTrack.cues[i];\n\t\t\t\tif (cue) cues.push(cue);\n\t\t\t}\n\t\t\tcleanup();\n\t\t\tresolve(cues);\n\t\t};\n\t\tconst onError = () => {\n\t\t\tcleanup();\n\t\t\treject(/* @__PURE__ */ new Error(`Failed to load VTT segment: ${url}`));\n\t\t};\n\t\tconst cleanup = () => {\n\t\t\ttrack.removeEventListener(\"load\", onLoad);\n\t\t\ttrack.removeEventListener(\"error\", onError);\n\t\t\tvideo.removeChild(track);\n\t\t};\n\t\ttrack.addEventListener(\"load\", onLoad);\n\t\ttrack.addEventListener(\"error\", onError);\n\t\tvideo.appendChild(track);\n\t\ttrack.track.mode = \"hidden\";\n\t\ttrack.src = url;\n\t});\n}\nfunction destroyVttResolver() {\n\tdummyVideo = null;\n}\n//#endregion\nexport { destroyVttResolver, resolveVttSegment };\n\n//# sourceMappingURL=resolve-vtt-segment.js.map","import { untrack, update } from \"../signals/primitives.js\";\nimport { createMachineCore } from \"../machine.js\";\n//#region src/core/actors/create-transition-actor.ts\n/**\n* Creates a reducer-shaped actor from an initial context and a reducer function.\n*\n* The reducer receives the current context and a message and returns the next\n* context. Returning the same reference (by identity) skips the signal update —\n* so early-returning `context` unchanged is both the no-op and the optimization.\n*\n* Side effects (e.g. DOM mutations) may be performed inside the reducer.\n* They run synchronously before the signal is updated.\n*\n* @example\n* const actor = createTransitionActor(\n* { count: 0 },\n* (context, message: { type: 'increment' }) => ({ count: context.count + 1 })\n* );\n*/\nfunction createTransitionActor(initialContext, reducer) {\n\tconst { snapshotSignal, getState, transition } = createMachineCore({\n\t\tvalue: \"active\",\n\t\tcontext: initialContext\n\t});\n\tconst getContext = () => untrack(() => snapshotSignal.get().context);\n\tconst setContext = (context) => update(snapshotSignal, { context });\n\treturn {\n\t\tget snapshot() {\n\t\t\treturn snapshotSignal;\n\t\t},\n\t\tsend(message) {\n\t\t\tif (getState() === \"destroyed\") return;\n\t\t\tconst context = getContext();\n\t\t\tconst newContext = reducer(context, message);\n\t\t\tif (newContext !== context) setContext(newContext);\n\t\t},\n\t\tdestroy() {\n\t\t\tif (getState() === \"destroyed\") return;\n\t\t\ttransition(\"destroyed\");\n\t\t}\n\t};\n}\n//#endregion\nexport { createTransitionActor };\n\n//# sourceMappingURL=create-transition-actor.js.map","import { createTransitionActor } from \"../../../core/actors/create-transition-actor.js\";\n//#region src/playback/actors/dom/text-tracks.ts\nfunction isDuplicateCue(cue, existing) {\n\treturn existing.some((r) => r.startTime === cue.startTime && r.endTime === cue.endTime && r.text === cue.text);\n}\n/** TextTrack actor: wraps all text tracks on a media element, owns cue operations. */\nfunction createTextTracksActor(mediaElement) {\n\treturn createTransitionActor({\n\t\tloaded: {},\n\t\tsegments: {}\n\t}, (context, message) => {\n\t\tif (message.type === \"clear\") return {\n\t\t\tloaded: {},\n\t\t\tsegments: {}\n\t\t};\n\t\tconst { meta, cues } = message;\n\t\tconst { trackId, id: segmentId, startTime, duration } = meta;\n\t\tconst textTrack = Array.from(mediaElement.textTracks).find((t) => t.id === trackId);\n\t\tif (!textTrack) return context;\n\t\tconst existingCues = context.loaded[trackId] ?? [];\n\t\tconst existingSegments = context.segments[trackId] ?? [];\n\t\tconst prunedCues = cues.filter((cue) => !isDuplicateCue(cue, existingCues));\n\t\tconst segmentAlreadyLoaded = existingSegments.some((s) => s.id === segmentId);\n\t\tif (prunedCues.length === 0 && segmentAlreadyLoaded) return context;\n\t\tfor (const cue of prunedCues) textTrack.addCue(cue);\n\t\treturn {\n\t\t\t...context,\n\t\t\tloaded: {\n\t\t\t\t...context.loaded,\n\t\t\t\t[trackId]: [...existingCues, ...prunedCues]\n\t\t\t},\n\t\t\tsegments: segmentAlreadyLoaded ? context.segments : {\n\t\t\t\t...context.segments,\n\t\t\t\t[trackId]: [...existingSegments, {\n\t\t\t\t\tid: segmentId,\n\t\t\t\t\tstartTime,\n\t\t\t\t\tduration\n\t\t\t\t}]\n\t\t\t}\n\t\t};\n\t});\n}\n//#endregion\nexport { createTextTracksActor };\n\n//# sourceMappingURL=text-tracks.js.map","import { peek } from \"../../core/signals/primitives.js\";\nimport { SerialRunner, Task } from \"../../core/tasks/task.js\";\nimport { createMachineActor } from \"../../core/actors/create-machine-actor.js\";\nimport { DEFAULT_FORWARD_BUFFER_CONFIG, getSegmentsToLoad } from \"../../media/buffer/forward-buffer.js\";\nimport { DEFAULT_TEXT_MESSAGE_PIPELINES } from \"../primitives/text-segment-load-pipeline.js\";\n//#region src/playback/actors/text-track-segment-loader.ts\n/**\n* Loads text-track segments for a track and delegates cue management\n* to a TextTracksActor. Mirrors the v/a `SegmentLoaderActor` shape (FSM\n* with `idle` / `loading` and `inFlight*` context for continue-vs-preempt),\n* adapted to text:\n*\n* - No init segment, no flush ops (text cues don't need eviction — they're\n* small and the playhead-relative window is enforced by the runtime).\n* - Single in-flight identity (`inFlightSegmentId`) — text has only the\n* media-segment path, no init-segment path.\n*\n* Planning is done in the load handler on every incoming message:\n* `getSegmentsToLoad` filters to the forward window, then the segments\n* not already in `TextTracksActor`'s context are scheduled. When a new\n* `load` arrives mid-run, the handler replans and either:\n*\n* - **Continues**: the in-flight segment is still in the new plan →\n* `abortPending` only, schedule the rest of the plan (minus the\n* in-flight item, which covers its slot).\n* - **Preempts**: in-flight segment is no longer wanted (track switch,\n* large seek out of window) → `abortAll`, schedule the new plan\n* from scratch.\n*\n* The cue parser is injected so this factory is host-agnostic. A DOM\n* host supplies a VTT parser backed by `<track>`/`TextTrack` APIs; a\n* non-DOM host (worker, test fake, alternate runtime) supplies its own.\n*/\nfunction createTextTrackSegmentLoaderActor(textTracksActor, resolveSegment, config = {}, compositionDeps = {\n\tstate: {},\n\tcontext: {},\n\tconfig: {}\n}) {\n\tconst forwardBufferConfig = {\n\t\t...DEFAULT_FORWARD_BUFFER_CONFIG,\n\t\t...config.forwardBuffer\n\t};\n\tconst deps = {\n\t\tstate: compositionDeps.state,\n\t\tcontext: compositionDeps.context,\n\t\tconfig: {\n\t\t\t...compositionDeps.config,\n\t\t\ttextTracksActor,\n\t\t\tresolveSegment\n\t\t}\n\t};\n\tconst pipeline = (config.messagePipelines ?? DEFAULT_TEXT_MESSAGE_PIPELINES)();\n\t/**\n\t* Translate a load message into an ordered TextLoadTask list based on\n\t* committed actor state. In-flight awareness is handled separately in\n\t* the `loading` state's load handler.\n\t*\n\t* Metadata mode (no `range`) is a no-op for text — text tracks have\n\t* no init-segment concept, so there's nothing to load until a range\n\t* arrives via `'full-range'` dispatch.\n\t*/\n\tconst planTasks = (message) => {\n\t\tconst { track, range } = message;\n\t\tif (!range) return [];\n\t\tconst trackId = track.id;\n\t\tconst bufferedSegments = peek(textTracksActor.snapshot).context.segments[trackId] ?? [];\n\t\treturn getSegmentsToLoad(track.segments, bufferedSegments, range.start, forwardBufferConfig).map((segment) => ({\n\t\t\tsegment,\n\t\t\ttrackId\n\t\t}));\n\t};\n\t/**\n\t* Wraps a TextLoadTask into a Task that runs the op's step pipeline\n\t* (resolve/relocate/dispatch, per the composition's `messagePipelines`).\n\t* Updates `inFlightSegmentId` around the async region so the load handler can\n\t* make accurate continue/preempt decisions, and checks the abort signal before\n\t* each step.\n\t*\n\t* Text degrades gracefully: a step throwing (e.g. a failed segment fetch) is\n\t* logged and swallowed so the runner continues to the next segment — unlike the\n\t* v/a loader, where a failed init must abort the remaining tasks.\n\t*/\n\tconst makeLoadTask = (op, { getContext, setContext }) => {\n\t\treturn new Task(async (signal) => {\n\t\t\tif (signal.aborted) return;\n\t\t\tconst frame = { op };\n\t\t\tsetContext({\n\t\t\t\t...getContext(),\n\t\t\t\tinFlightTrackId: op.trackId,\n\t\t\t\tinFlightSegmentId: op.segment.id\n\t\t\t});\n\t\t\ttry {\n\t\t\t\tfor (const step of pipeline) {\n\t\t\t\t\tif (signal.aborted) return;\n\t\t\t\t\tawait step(frame, signal, deps);\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error(\"Failed to load text-track segment:\", error);\n\t\t\t} finally {\n\t\t\t\tsetContext({\n\t\t\t\t\t...getContext(),\n\t\t\t\t\tinFlightTrackId: null,\n\t\t\t\t\tinFlightSegmentId: null\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t};\n\tconst scheduleAll = (tasks, ctx) => {\n\t\tfor (const op of tasks) ctx.runner.schedule(makeLoadTask(op, ctx)).then(void 0, (e) => {\n\t\t\tif (e instanceof Error && e.name === \"AbortError\") return;\n\t\t\tconsole.error(\"Unexpected error in text-track segment loader:\", e);\n\t\t\tctx.runner.abortPending();\n\t\t});\n\t};\n\treturn createMachineActor({\n\t\trunner: () => new SerialRunner(),\n\t\tinitial: \"idle\",\n\t\tcontext: {\n\t\t\tinFlightTrackId: null,\n\t\t\tinFlightSegmentId: null\n\t\t},\n\t\tstates: {\n\t\t\tidle: { on: { load: (msg, ctx) => {\n\t\t\t\tconst tasks = planTasks(msg);\n\t\t\t\tif (tasks.length === 0) return;\n\t\t\t\tctx.transition(\"loading\");\n\t\t\t\tscheduleAll(tasks, ctx);\n\t\t\t} } },\n\t\t\tloading: {\n\t\t\t\tonSettled: \"idle\",\n\t\t\t\ton: { load: (msg, ctx) => {\n\t\t\t\t\tconst { context, runner } = ctx;\n\t\t\t\t\tconst tasks = planTasks(msg);\n\t\t\t\t\tif (context.inFlightTrackId !== null && context.inFlightSegmentId !== null && tasks.some((t) => t.trackId === context.inFlightTrackId && t.segment.id === context.inFlightSegmentId)) {\n\t\t\t\t\t\trunner.abortPending();\n\t\t\t\t\t\tscheduleAll(tasks.filter((t) => !(t.trackId === context.inFlightTrackId && t.segment.id === context.inFlightSegmentId)), ctx);\n\t\t\t\t\t} else {\n\t\t\t\t\t\trunner.abortAll();\n\t\t\t\t\t\tscheduleAll(tasks, ctx);\n\t\t\t\t\t}\n\t\t\t\t} }\n\t\t\t}\n\t\t}\n\t});\n}\n//#endregion\nexport { createTextTrackSegmentLoaderActor };\n\n//# sourceMappingURL=text-track-segment-loader.js.map","import { effect } from \"../../../core/signals/effect.js\";\nimport { createTextTracksActor } from \"../../actors/dom/text-tracks.js\";\nimport { createTextTrackSegmentLoaderActor } from \"../../actors/text-track-segment-loader.js\";\n//#region src/playback/behaviors/dom/setup-text-track-actors.ts\nfunction setupTextTrackActorsSetup({ state, context, config }) {\n\treturn effect(() => {\n\t\tconst mediaElement = context.mediaElement.get();\n\t\tif (!mediaElement) return;\n\t\tconst textTracksActor = createTextTracksActor(mediaElement);\n\t\tconst textTrackSegmentLoaderActor = createTextTrackSegmentLoaderActor(textTracksActor, config.resolveTextTrackSegment, {\n\t\t\tforwardBuffer: config.forwardBuffer,\n\t\t\tmessagePipelines: config.textMessagePipelines\n\t\t}, {\n\t\t\tstate,\n\t\t\tcontext,\n\t\t\tconfig\n\t\t});\n\t\tcontext.textTracksActor.set(textTracksActor);\n\t\tcontext.textTrackSegmentLoaderActor.set(textTrackSegmentLoaderActor);\n\t\treturn () => {\n\t\t\ttextTracksActor.destroy();\n\t\t\ttextTrackSegmentLoaderActor.destroy();\n\t\t\tcontext.textTracksActor.set(void 0);\n\t\t\tcontext.textTrackSegmentLoaderActor.set(void 0);\n\t\t};\n\t});\n}\nconst setupTextTrackActors = {\n\tstateKeys: [],\n\tcontextKeys: [\n\t\t\"mediaElement\",\n\t\t\"textTracksActor\",\n\t\t\"textTrackSegmentLoaderActor\"\n\t],\n\tsetup: setupTextTrackActorsSetup\n};\n//#endregion\nexport { setupTextTrackActors };\n\n//# sourceMappingURL=setup-text-track-actors.js.map","import { sleep } from \"@videojs/utils/time\";\n//#region src/core/tasks/delayed-reschedule.ts\n/**\n* Build a {@link Reschedule} from a pure cadence function — the common\n* timer-based, *start-anchored* implementation.\n*\n* Invoked concurrently with the run, it observes the result, then waits\n* `cadence(current, previous)` milliseconds **measured from when it was invoked**\n* (≈ the run's start): it subtracts the run's own elapsed time, so consecutive\n* runs begin one cadence apart regardless of how long each run takes (per\n* RFC 8216 §6.3.4's \"measured from the last time the client began loading\"). If\n* the run takes longer than the cadence, the next run starts immediately.\n*\n* A `null` cadence stops the recurrence. A rejected run rejects this reschedule,\n* which the `RecurringRunner` propagates as the recurrence's failure — error\n* recovery (e.g. retrying transient fetch failures) belongs below, at the fetch\n* layer, not in the cadence.\n*/\nfunction delayedReschedule(cadence) {\n\treturn async (task) => {\n\t\tconst startedAt = Date.now();\n\t\tconst ms = cadence(await task.run(), task.previous);\n\t\tif (ms === null) return false;\n\t\tawait sleep(Math.max(0, ms - (Date.now() - startedAt)), task.signal);\n\t\treturn true;\n\t};\n}\n//#endregion\nexport { delayedReschedule };\n\n//# sourceMappingURL=delayed-reschedule.js.map","import { isCaptionOrSubtitleTrack } from \"@videojs/utils/dom\";\n//#region src/media/dom/text/text-track-slots.ts\n/**\n* SPF-owned `<track>` selector. Each slot created by\n* `addSubtitlesTracksToMedia` carries this attribute so reads and removals can\n* filter SPF-owned tracks from host-page-owned ones.\n*/\nconst SPF_TRACK_SELECTOR = \"track[data-src-track]\";\n/**\n* Allocate text-track slots on `mediaElement` for each model track by creating\n* and appending `<track>` children. Marks each element with `data-src-track`\n* so it can be distinguished from `<track>` children the host page added\n* directly — used by `getShowingSubtitlesTrackFromMedia` and\n* `removeAllSubtitlesTracksFromMedia` to scope their reads/removals to\n* SPF-owned slots. The spec has no `removeTextTrack` API, so creating\n* `<track>` elements is the only mechanism for adding *and* removing entries\n* to `mediaElement.textTracks`.\n*/\nfunction addSubtitlesTracksToMedia(mediaElement, modelTextTracks) {\n\tfor (const modelTrack of modelTextTracks) {\n\t\tconst el = document.createElement(\"track\");\n\t\tel.id = modelTrack.id;\n\t\tel.kind = modelTrack.kind;\n\t\tel.label = modelTrack.label;\n\t\tel.toggleAttribute(\"data-src-track\", true);\n\t\tif (modelTrack.language) el.srclang = modelTrack.language;\n\t\tmediaElement.appendChild(el);\n\t}\n}\n/**\n* Return the SPF-owned subtitle/caption `TextTrack` currently in `'showing'`\n* mode, or `undefined` if none. Restricts the search to slots created by\n* `addSubtitlesTracksToMedia` (via the `data-src-track` selector) so a showing\n* track that the host page added directly is ignored — SPF selection only\n* mirrors tracks it owns.\n*/\nfunction getShowingSubtitlesTrackFromMedia(mediaElement) {\n\tconst elements = mediaElement.querySelectorAll(SPF_TRACK_SELECTOR);\n\tfor (const el of elements) {\n\t\tconst track = el.track;\n\t\tif (track.mode === \"showing\" && isCaptionOrSubtitleTrack(track)) return track;\n\t}\n}\n/**\n* Remove every SPF-owned `<track>` child from `mediaElement` (those tagged\n* with `data-src-track` by `addSubtitlesTracksToMedia`). `<track>` elements\n* the host page added directly are left in place.\n*/\nfunction removeAllSubtitlesTracksFromMedia(mediaElement) {\n\tconst elements = mediaElement.querySelectorAll(SPF_TRACK_SELECTOR);\n\tfor (const el of elements) el.remove();\n}\n/**\n* Apply a selection to a `TextTrackList` by setting each subtitle/caption\n* track's `mode` to `'showing'` if its `id` matches `selectedId` and\n* `'disabled'` otherwise. Tracks of other kinds (chapters, metadata,\n* descriptions) are left untouched — they may be owned by the host page.\n*/\nfunction syncTextTrackModes(textTracks, selectedId) {\n\tfor (let i = 0; i < textTracks.length; i++) {\n\t\tconst track = textTracks[i];\n\t\tif (!isCaptionOrSubtitleTrack(track)) continue;\n\t\ttrack.mode = track.id === selectedId ? \"showing\" : \"disabled\";\n\t}\n}\n//#endregion\nexport { addSubtitlesTracksToMedia, getShowingSubtitlesTrackFromMedia, removeAllSubtitlesTracksFromMedia, syncTextTrackModes };\n\n//# sourceMappingURL=text-track-slots.js.map","import { computed, peek } from \"../../../core/signals/primitives.js\";\nimport { createMachineReactor } from \"../../../core/reactors/create-machine-reactor.js\";\nimport { getLiveEdge } from \"../../primitives/live-window.js\";\nimport { listen } from \"@videojs/utils/dom\";\n//#region src/playback/behaviors/dom/seek-to-live-edge.ts\n/**\n* Keep the playhead in the live window, via a two-state reactor gated on the\n* preconditions for \"we know where live is\":\n*\n* - **`inactive`** — no media element, or no live edge (`getLiveEdge` is `null`:\n* VOD, ended, or unresolved). Idle.\n* - **`live`** — preconditions met. `entry` commands `state.startPosition` once\n* to the target live latency behind the edge (clamped to the window start) so\n* playback begins near the edge and the loader dispatches an in-window range;\n* `effects` runs the window-exit guard.\n*\n* A derivable live edge is itself the establishment gate: segment placement is\n* settled at parse time — the reference track's local placement *is* the\n* presentation timeline, and every other track's first parse is held until the\n* anchor is stamped (`resolve-track`'s gate + `establishStartMediaTime`) — so\n* any window derived from resolved segments is already final, with no separate\n* anchor signal to wait on (see\n* `internal/design/spf/live-presentation-timeline-model.md`).\n*\n* The two pieces split along the axis a future DVR / EVENT mode will care about:\n* the **one-time start position** (`entry`) is the *live-specific* behavior — start\n* near the edge on load; a DVR mode makes it conditional (start in place). The\n* **window-exit guard** (`effects`) is the *general windowed-live* behavior —\n* applies to sliding-window live, DVR, and EVENT alike. Because the command is an\n* `entry`, it fires once per entry into `live`; a source change exits to\n* `inactive`, so the next source re-commands (no closure latch to reset). The\n* guard stays a direct seek — it is recurring, while `startPosition` is a\n* self-clearing one-shot.\n*\n* Window-exit guard: while playing (not paused), reposition to the live edge\n* when the playhead has fallen behind the window start — including when a seek\n* to a now-evicted position has stranded the playhead (such a seek can never\n* settle, so we rescue rather than wait on it). Two triggers:\n* the **window-update re-fire** (the guard reads the live edge, so each reload /\n* slide re-runs it — this catches a stall, where `timeupdate` stops but the\n* playlist keeps reloading) and a **`play` listener** for immediate reactivity on\n* resume, since the reload interval can be seconds. `play`, not `playing`: after\n* a long pause the playhead sits behind the window at an unseekable position,\n* where the browser stalls and `playing` never fires; `play` fires on the\n* paused→false transition regardless, so we snap before the stall. In-window\n* pause / DVR scrub-back are left untouched.\n*\n* The latency comes from the injected `resolveLiveLatency` seam (HLS:\n* `HOLD-BACK`), so this behavior carries no delivery-format specifics.\n* `applyStartPosition` performs the seek, gated on `loadedmetadata` — which\n* implies an open MediaSource and hence a declared seekable range (a seek outside\n* `seekable` is clamped) — so this behavior needs no MediaSource precondition of\n* its own.\n*/\n/**\n* Tolerance (seconds) around the window edges before the guard repositions, so\n* boundary / floating-point noise doesn't trigger a spurious seek.\n*/\nconst REPOSITION_TOLERANCE = .1;\n/**\n* `'live'` once the preconditions hold: a media element and a derivable live edge\n* (whose placement is final by construction — see the module docstring).\n* `'inactive'` otherwise.\n*\n* Deliberately narrow: every signal here can flip the reactor out of and back into\n* `live`, re-firing `entry`. Neither blinks mid-source — the edge can't, because\n* `liveWindowForType` falls back to any resolved track of the type — so `entry`\n* fires once per source without a latch, and a live reload (same source, slid\n* window) correctly doesn't re-command.\n*\n* The flip side: the presentation *url* is not part of this state, so replacing one\n* already-resolved live presentation with another would stay in `live` and never\n* command a start position for the new source. Unreachable today — every writer\n* sets `{ url }` (unresolved) or `undefined` first, so a source change always\n* transits `inactive`. Supporting a seeded pre-resolved presentation (via\n* `initialState`) that later changes would mean folding the url in here.\n*/\nfunction deriveState(mediaElement, edge) {\n\treturn mediaElement && edge ? \"live\" : \"inactive\";\n}\nfunction seekToLiveEdgeSetup({ state, context, config }) {\n\tconst derivedStateSignal = computed(() => deriveState(context.mediaElement.get(), getLiveEdge({\n\t\tstate,\n\t\tconfig\n\t})));\n\treturn createMachineReactor({\n\t\tinitial: \"inactive\",\n\t\tmonitor: () => derivedStateSignal.get(),\n\t\tstates: {\n\t\t\tinactive: {},\n\t\t\tlive: {\n\t\t\t\tentry: () => {\n\t\t\t\t\tconst mediaElement = context.mediaElement.get();\n\t\t\t\t\tconst { liveEdgeStart } = getLiveEdge({\n\t\t\t\t\t\tstate,\n\t\t\t\t\t\tconfig\n\t\t\t\t\t});\n\t\t\t\t\tif (mediaElement.currentTime >= liveEdgeStart) return;\n\t\t\t\t\tstate.startPosition.set(liveEdgeStart);\n\t\t\t\t},\n\t\t\t\teffects: () => {\n\t\t\t\t\tconst { start: windowStart, liveEdgeStart } = getLiveEdge({\n\t\t\t\t\t\tstate,\n\t\t\t\t\t\tconfig\n\t\t\t\t\t});\n\t\t\t\t\tconst mediaElement = peek(context.mediaElement);\n\t\t\t\t\tconst reposition = () => {\n\t\t\t\t\t\tif (mediaElement.paused) return;\n\t\t\t\t\t\tif (mediaElement.currentTime < windowStart - REPOSITION_TOLERANCE) mediaElement.currentTime = liveEdgeStart;\n\t\t\t\t\t};\n\t\t\t\t\treposition();\n\t\t\t\t\treturn listen(mediaElement, \"play\", reposition);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n}\n/**\n* Manual `Behavior<>` literal (like `calculatePresentationDuration`): declares\n* only `presentation` + `startPosition` in stateKeys while reading\n* `selectedVideoTrackId` / `selectedAudioTrackId` defensively (contributed by the\n* switch* behaviors), so it composes without a stateKeys/type conflict.\n*/\nconst seekToLiveEdge = {\n\tstateKeys: [\"presentation\", \"startPosition\"],\n\tcontextKeys: [\"mediaElement\"],\n\tsetup: seekToLiveEdgeSetup\n};\n//#endregion\nexport { seekToLiveEdge };\n\n//# sourceMappingURL=seek-to-live-edge.js.map","import { effect } from \"../../../core/signals/effect.js\";\nimport { liveWindowFromState } from \"../../primitives/live-window.js\";\n//#region src/playback/behaviors/dom/sync-live-seekable-range.ts\nfunction syncLiveSeekableRangeSetup({ state, context }) {\n\treturn effect(() => {\n\t\tconst mediaSource = context.mediaSource.get();\n\t\tconst liveWindow = liveWindowFromState(state);\n\t\tif (!mediaSource || !liveWindow) return;\n\t\tmediaSource.setLiveSeekableRange(liveWindow.start, liveWindow.end);\n\t});\n}\n/**\n* Manual `Behavior<>` literal (like `seekToLiveEdge`): declares only\n* `presentation` in stateKeys while reading `selectedVideoTrackId` /\n* `selectedAudioTrackId` defensively (contributed by the switch* behaviors), so\n* it composes without a stateKeys/type conflict.\n*/\nconst syncLiveSeekableRange = {\n\tstateKeys: [\"presentation\"],\n\tcontextKeys: [\"mediaSource\"],\n\tsetup: syncLiveSeekableRangeSetup\n};\n//#endregion\nexport { syncLiveSeekableRange };\n\n//# sourceMappingURL=sync-live-seekable-range.js.map","import { computed, peek } from \"../../../core/signals/primitives.js\";\nimport { defineBehavior } from \"../../../core/composition/create-composition.js\";\nimport { createMachineReactor } from \"../../../core/reactors/create-machine-reactor.js\";\nimport { getTracksByType } from \"../../../media/utils/tracks.js\";\nimport { syncTextTrackModes } from \"../../../media/dom/text/text-track-slots.js\";\nimport { listen } from \"@videojs/utils/dom\";\n//#region src/playback/behaviors/dom/sync-text-tracks.ts\n/**\n* **Own the text-track slots on the host media element, mirroring the SPF\n* model.** When a presentation is resolved and a media element is\n* available, allocate one slot in `mediaElement.textTracks` per model text\n* track — via creating `<track>` children, since that's the only spec\n* mechanism for adding *and* removing entries to `textTracks` (no\n* `removeTextTrack` API exists). Once slots are provisioned, mirror the\n* resolved `selectedTextTrackId` into their `mode`s (one-way: state → DOM),\n* and propagate user-initiated DOM `change` events back to\n* `userTextTrackSelection` — the standing *intent* (a language-based partial,\n* or `'off'`) that `switchTextTrack` resolves into `selectedTextTrackId`. So\n* non-SPF consumers (host-page captions buttons, browser native UI, video.js\n* store) drive selection by expressing intent, not by writing the resolved id.\n*\n* Single-positive-state reactor (`'preconditions-unmet'` ↔ `'sync-active'`):\n* the entry allocates the slots, applies the initial selection, attaches\n* the `change` listener, and opens a brief Chromium settling-window guard —\n* all transition-driven, fire-once on state entry, with paired cleanup on\n* state exit. A single `effects:` mirrors subsequent\n* `selectedTextTrackId` changes into `mode`s; that's the only\n* continuous-reactivity concern.\n*\n* State-exit cleanup also sends a `'clear'` message to the\n* `TextTracksActor` so its cue+segment cache (keyed by trackId) is\n* dropped alongside the DOM `<track>` slots. The actor itself is owned\n* by `setupTextTrackActors` and bound to mediaElement, not presentation,\n* so it survives source resets; clearing its context here keeps the\n* cache consistent with the DOM. Without this, a subsequent\n* presentation reusing a trackId would have `getSegmentsToLoad` treat\n* its segments as already-buffered and skip loading them.\n*\n* Single-writer separation: `selectedTextTrackId` is the resolved *output*\n* owned solely by `switchTextTrack`; this behavior only reads it (to mirror\n* modes). The write path here is `userTextTrackSelection` — the user-intent\n* *input* — so DOM action and the resolver never contend for one slot. The\n* intent isn't cleared on source unload (it's a standing preference, like\n* `userAudioTrackSelection`); `'off'` is written when the user disables all\n* tracks via native UI.\n*\n* Echo guard: `selectedTextTrackId` is exactly the id this behavior last drove\n* into the DOM, so a `change` event still showing it is our own echo (or a\n* resolver-driven correction — e.g. the picked track's CDN failed and the\n* resolver disabled it) and is ignored, never written back as a spurious user\n* action. Only a showing id that *differs* from the resolved id is a real user\n* pick. The settling-window guard additionally swallows Chromium's init-time\n* auto-selection before the resolved selection has settled.\n*/\nfunction deriveState(presentation, mediaElement) {\n\tif (!mediaElement || !presentation) return \"preconditions-unmet\";\n\treturn getTracksByType(presentation, \"text\").length > 0 ? \"sync-active\" : \"preconditions-unmet\";\n}\n/**\n* Map the DOM-showing track back to standing user intent. No showing track is an\n* explicit `'off'`. Otherwise prefer a language-based partial (so the pick\n* persists across source changes); fall back to `{ id }` for a track without a\n* language (precise within a source, just not portable).\n*/\nfunction deriveTextTrackIntent(showingId, modelTextTracks) {\n\tif (!showingId) return \"off\";\n\tconst language = modelTextTracks.find((track) => track.id === showingId)?.language;\n\treturn language ? { language } : { id: showingId };\n}\nfunction syncTextTracksSetup({ state, context, config }) {\n\tconst { addSubtitlesTracksToMedia, getShowingSubtitlesTrackFromMedia, removeAllSubtitlesTracksFromMedia } = config;\n\tconst derivedStateSignal = computed(() => deriveState(state.presentation.get(), context.mediaElement.get()));\n\treturn createMachineReactor({\n\t\tinitial: \"preconditions-unmet\",\n\t\tmonitor: () => derivedStateSignal.get(),\n\t\tstates: {\n\t\t\t\"preconditions-unmet\": {},\n\t\t\t\"sync-active\": {\n\t\t\t\tentry: () => {\n\t\t\t\t\tconst mediaElement = context.mediaElement.get();\n\t\t\t\t\tconst modelTextTracks = getTracksByType(state.presentation.get(), \"text\");\n\t\t\t\t\taddSubtitlesTracksToMedia(mediaElement, modelTextTracks);\n\t\t\t\t\tsyncTextTrackModes(mediaElement.textTracks, state.selectedTextTrackId.get());\n\t\t\t\t\tlet inSettlingWindow = true;\n\t\t\t\t\tconst settlingTimeout = setTimeout(() => {\n\t\t\t\t\t\tinSettlingWindow = false;\n\t\t\t\t\t}, 0);\n\t\t\t\t\tconst onChange = () => {\n\t\t\t\t\t\tif (inSettlingWindow) {\n\t\t\t\t\t\t\tsyncTextTrackModes(mediaElement.textTracks, state.selectedTextTrackId.get());\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst showingId = getShowingSubtitlesTrackFromMedia(mediaElement)?.id || void 0;\n\t\t\t\t\t\tif (showingId === state.selectedTextTrackId.get()) return;\n\t\t\t\t\t\tstate.userTextTrackSelection.set(deriveTextTrackIntent(showingId, modelTextTracks));\n\t\t\t\t\t};\n\t\t\t\t\tconst unlisten = listen(mediaElement.textTracks, \"change\", onChange);\n\t\t\t\t\treturn () => {\n\t\t\t\t\t\tunlisten();\n\t\t\t\t\t\tclearTimeout(settlingTimeout);\n\t\t\t\t\t\tremoveAllSubtitlesTracksFromMedia(mediaElement);\n\t\t\t\t\t\tpeek(context.textTracksActor)?.send({ type: \"clear\" });\n\t\t\t\t\t};\n\t\t\t\t},\n\t\t\t\teffects: () => {\n\t\t\t\t\tsyncTextTrackModes(peek(context.mediaElement).textTracks, state.selectedTextTrackId.get());\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n}\nconst syncTextTracks = defineBehavior({\n\tstateKeys: [\n\t\t\"presentation\",\n\t\t\"selectedTextTrackId\",\n\t\t\"userTextTrackSelection\"\n\t],\n\tcontextKeys: [\"mediaElement\", \"textTracksActor\"],\n\tsetup: syncTextTracksSetup\n});\n//#endregion\nexport { syncTextTracks };\n\n//# sourceMappingURL=sync-text-tracks.js.map","import { createComposition } from \"../../../core/composition/create-composition.js\";\nimport { makeShareSignals } from \"../../../core/composition/share-signals.js\";\nimport { resolveVttSegment } from \"../../../media/dom/text/resolve-vtt-segment.js\";\nimport { loadAudioSegments, loadTextTrackSegments, loadVideoSegments } from \"../../behaviors/dom/load-segments.js\";\nimport { setupTextTrackActors } from \"../../behaviors/dom/setup-text-track-actors.js\";\nimport { trackCurrentTime } from \"../../behaviors/dom/track-current-time.js\";\nimport { trackLoadTriggers } from \"../../behaviors/dom/track-load-triggers.js\";\nimport { deriveSharedMinStartMediaTime, establishStartMediaTime, gateFirstParseOnAnchor } from \"../../behaviors/establish-start-media-time.js\";\nimport { delayedReschedule } from \"../../../core/tasks/delayed-reschedule.js\";\nimport { attachMediaSourceAsSourceElement } from \"../../../media/dom/mse/mediasource-setup.js\";\nimport { canPlayTrack } from \"../../../media/dom/capabilities.js\";\nimport { addSubtitlesTracksToMedia, getShowingSubtitlesTrackFromMedia, removeAllSubtitlesTracksFromMedia } from \"../../../media/dom/text/text-track-slots.js\";\nimport { parseMultivariantPlaylist } from \"../../../media/hls/parse-multivariant.js\";\nimport { mediaPlaylistReloadDelay, resolveLiveLatency } from \"../../../media/hls/reload-policy.js\";\nimport { getResolvedSelectedTrackDuration } from \"../../../media/utils/track-selection.js\";\nimport { calculatePresentationDuration } from \"../../behaviors/calculate-presentation-duration.js\";\nimport { collectErrors } from \"../../behaviors/collect-errors.js\";\nimport { deriveCdnPriority } from \"../../behaviors/derive-cdn-priority.js\";\nimport { setupAirPlay } from \"../../behaviors/dom/airplay.js\";\nimport { applyStartPosition } from \"../../behaviors/dom/apply-start-position.js\";\nimport { endOfStream } from \"../../behaviors/dom/end-of-stream.js\";\nimport { recoverEndStall } from \"../../behaviors/dom/recover-end-stall.js\";\nimport { seekToLiveEdge } from \"../../behaviors/dom/seek-to-live-edge.js\";\nimport { setupAudioBufferActors, setupVideoBufferActors } from \"../../behaviors/dom/setup-buffer-actors.js\";\nimport { setupMediaSource } from \"../../behaviors/dom/setup-mediasource.js\";\nimport { syncLiveSeekableRange } from \"../../behaviors/dom/sync-live-seekable-range.js\";\nimport { syncTextTracks } from \"../../behaviors/dom/sync-text-tracks.js\";\nimport { updateMediaSourceDuration } from \"../../behaviors/dom/update-mediasource-duration.js\";\nimport { resolvePresentation } from \"../../behaviors/resolve-presentation.js\";\nimport { resolveAudioTrack, resolveTextTrack, resolveVideoTrack } from \"../../behaviors/resolve-track.js\";\nimport { setupFailoverMonitor } from \"../../behaviors/setup-failover-monitor.js\";\nimport { syncPreload } from \"../../behaviors/sync-preload.js\";\nimport { switchAudioTrack, switchTextTrack, switchVideoTrack } from \"../../behaviors/track-switching.js\";\nimport { relocatingTextPipelines, relocationPipelinesFor } from \"../../primitives/relocation-pipelines.js\";\nimport { reportUnsupportedTrackConditions } from \"../../primitives/report-track-conditions.js\";\n//#region src/playback/engines/hls/engine.ts\n/**\n* Generic `shareSignals` instantiated against the HLS engine's full state\n* and context — captures composition signal refs into the consumer's\n* `onSignalsReady` callback at setup time, and materializes input slots that no\n* composed behavior produces: `user*TrackSelection` (track-switching only reads\n* them). `failedCdns` is owned by `setupFailoverMonitor`, so it's already\n* materialized and reachable on the `onSignalsReady` refs without being listed\n* here.\n*/\nconst shareSignals = makeShareSignals([\n\t\"userVideoTrackSelection\",\n\t\"userAudioTrackSelection\",\n\t\"userTextTrackSelection\",\n\t\"disableRemotePlayback\"\n]);\n/**\n* Create an HLS playback engine.\n*\n* Composes SPF behaviors into a reactive pipeline for HLS playback over MSE:\n* manifest resolution, track selection, ABR, segment loading, and\n* end-of-stream coordination.\n*\n* @example\n* ```ts\n* let signals: HlsVideoEngineSignals;\n* const engine = createHlsVideoEngine({\n* initialBandwidth: 2_000_000,\n* preferredAudioLanguage: 'en',\n* onSignalsReady: (refs) => {\n* signals = refs;\n* },\n* });\n*\n* signals.context.mediaElement.set(videoEl);\n* signals.state.presentation.set({ url: 'https://example.com/stream.m3u8' });\n*\n* videoEl.play();\n*\n* await engine.destroy();\n* ```\n*/\nfunction createHlsVideoEngine(config = {}) {\n\tconst deriveStartMediaTime = config.deriveStartMediaTime ?? deriveSharedMinStartMediaTime;\n\tconst finalConfig = {\n\t\t...config,\n\t\tderiveStartMediaTime,\n\t\tattachMediaSource: attachMediaSourceAsSourceElement,\n\t\tcanPlayTrack: config.canPlayTrack ?? canPlayTrack,\n\t\treportUnsupportedTrackConditions: config.reportUnsupportedTrackConditions ?? reportUnsupportedTrackConditions,\n\t\tresolveTextTrackSegment: config.resolveTextTrackSegment ?? resolveVttSegment,\n\t\ttextMessagePipelines: relocatingTextPipelines,\n\t\tresolveDuration: config.resolveDuration ?? getResolvedSelectedTrackDuration,\n\t\tparsePresentation: config.parsePresentation ?? parseMultivariantPlaylist,\n\t\taddSubtitlesTracksToMedia: config.addSubtitlesTracksToMedia ?? addSubtitlesTracksToMedia,\n\t\tgetShowingSubtitlesTrackFromMedia: config.getShowingSubtitlesTrackFromMedia ?? getShowingSubtitlesTrackFromMedia,\n\t\tremoveAllSubtitlesTracksFromMedia: config.removeAllSubtitlesTracksFromMedia ?? removeAllSubtitlesTracksFromMedia,\n\t\tvideoMessagePipelines: relocationPipelinesFor(\"video\", deriveStartMediaTime),\n\t\taudioMessagePipelines: relocationPipelinesFor(\"audio\", deriveStartMediaTime),\n\t\tgateFirstParse: gateFirstParseOnAnchor,\n\t\tresolveLiveLatency,\n\t\treschedule: config.reschedule ?? delayedReschedule(mediaPlaylistReloadDelay)\n\t};\n\treturn createComposition([\n\t\tsyncPreload,\n\t\ttrackLoadTriggers,\n\t\tresolvePresentation,\n\t\tderiveCdnPriority,\n\t\tsetupFailoverMonitor,\n\t\tcollectErrors,\n\t\tresolveVideoTrack,\n\t\tresolveAudioTrack,\n\t\tresolveTextTrack,\n\t\tcalculatePresentationDuration,\n\t\tsetupMediaSource,\n\t\tupdateMediaSourceDuration,\n\t\testablishStartMediaTime,\n\t\tsetupVideoBufferActors,\n\t\tsetupAudioBufferActors,\n\t\tsetupAirPlay,\n\t\ttrackCurrentTime,\n\t\tapplyStartPosition,\n\t\tswitchVideoTrack,\n\t\tswitchAudioTrack,\n\t\tswitchTextTrack,\n\t\tloadVideoSegments,\n\t\tloadAudioSegments,\n\t\tsyncLiveSeekableRange,\n\t\tseekToLiveEdge,\n\t\tendOfStream,\n\t\trecoverEndStall,\n\t\tsyncTextTracks,\n\t\tsetupTextTrackActors,\n\t\tloadTextTrackSegments,\n\t\tshareSignals\n\t], {\n\t\tconfig: finalConfig,\n\t\tinitialState: { bandwidthState: {\n\t\t\tfastEstimate: 0,\n\t\t\tfastTotalWeight: 0,\n\t\t\tslowEstimate: 0,\n\t\t\tslowTotalWeight: 0,\n\t\t\tbytesSampled: 0\n\t\t} }\n\t});\n}\n//#endregion\nexport { createHlsVideoEngine };\n\n//# sourceMappingURL=engine.js.map","import { effect } from \"../../../core/signals/effect.js\";\nimport { deriveStreamType, getMediaPlaylistMetadata, isResolvedPresentation, isResolvedTrack } from \"../../../media/types/index.js\";\nimport { findTrackById } from \"../../../media/utils/tracks.js\";\nimport { SVTA_NO_SUPPORTED_AUDIO_TRACK, SVTA_NO_SUPPORTED_VIDEO_TRACK, SVTA_UNSUPPORTED_PLAYBACK_FEATURE } from \"../../../media/errors.js\";\nimport { resolveLiveLatency } from \"../../../media/hls/reload-policy.js\";\nimport { getLiveEdge, liveTrackId } from \"../../primitives/live-window.js\";\nimport { createHlsVideoEngine } from \"../../engines/hls/engine.js\";\nimport { DVR_EXPERIMENTAL_MESSAGE, LOW_LATENCY_UNSUPPORTED_MESSAGE, UNSUPPORTED_PLAYBACK_FEATURE_MESSAGE } from \"../../primitives/error-messages.js\";\nimport { firstFatal, hasUnsupportedFeatureCause, withAlternativeMediaSuggestion } from \"./error-surface.js\";\nimport { MediaStreamTypes } from \"@videojs/media\";\n//#region src/playback/adapters/hls-video/adapter.ts\nconst hlsVideoMediaDefaultProps = {\n\tsrc: \"\",\n\tpreload: \"\",\n\tdisableRemotePlayback: false,\n\tstreamType: MediaStreamTypes.UNKNOWN\n};\n/**\n* `targetLiveWindow` per the media-ui-extensions live-edge proposal: `NaN` for\n* on-demand (or nothing resolved yet), `0` for standard sliding-window live,\n* `Infinity` for DVR (`#EXT-X-PLAYLIST-TYPE:EVENT` — the window grows from the\n* start). Read from the timeline-bearing track's playlist metadata.\n*/\nfunction deriveTargetLiveWindow(presentation, trackId) {\n\tif (!isResolvedPresentation(presentation) || !trackId) return NaN;\n\tconst track = findTrackById(presentation, trackId);\n\tif (!track || !isResolvedTrack(track)) return NaN;\n\tconst metadata = getMediaPlaylistMetadata(track);\n\tif (!metadata) return NaN;\n\tif (metadata.playlistType === \"EVENT\") return Number.POSITIVE_INFINITY;\n\treturn deriveStreamType(metadata) === \"live\" ? 0 : NaN;\n}\n/**\n* Which reported conditions this composition treats as **fatal** — the ones that\n* reach `error` and fire `'error'`. Severity isn't part of an SVTA code\n* (§Approach: \"impact varies with player implementation\"), and here it also\n* varies by composition, so it's decided at this boundary rather than by the\n* reporter.\n*\n* An allow-list, deliberately: only *verdicts* are here. The per-rendition causes\n* `resolve-track` reports (unsupported format, unsupported DRM) stay in the\n* sequence as context — one unplayable rendition doesn't fail the source, and\n* promoting a cause would put a dialog over a mixed source that goes on to play.\n*/\nconst FATAL_SVTA_CODES = /* @__PURE__ */ new Set([SVTA_NO_SUPPORTED_VIDEO_TRACK, SVTA_NO_SUPPORTED_AUDIO_TRACK]);\n/**\n* Mixin that adds SPF playback engine behavior to any base class.\n*\n* Implements the src/play() contract per the WHATWG HTML spec so that SPF can\n* be used anywhere a media element API is expected.\n*\n* A single engine instance is created at construction and recycled across src\n* changes.\n*\n* @fires streamtypechange - Fired when the detected stream type changes. Read `streamType` for the new value.\n* @fires targetlivewindowchange - Fired when the target live window changes. Read `targetLiveWindow` for the new value.\n* @fires error - Fired when a fatal condition is reported. Read `error` for it.\n*\n* @example\n* class HlsVideoMedia extends HlsVideoMediaMixin(HTMLVideoElementHost) {}\n*\n* const media = new HlsVideoMedia();\n* media.attach(document.querySelector('video'));\n* media.src = 'https://stream.mux.com/abc123.m3u8';\n*/\nfunction HlsVideoMediaMixin(BaseClass) {\n\tclass HlsVideoMediaImpl extends BaseClass {\n\t\t/**\n\t\t* A complete sentence naming the Media to reach for when this one can't play\n\t\t* a source — `Try the hls.js-backed Mux media instead: import the hls-js\n\t\t* flavor in place of the spf one.` Appended to the copy this adapter\n\t\t* surfaces, and to the notices it logs. Name the flavor, not an import path:\n\t\t* a Media is reached through several packages, each with its own counterpart.\n\t\t*\n\t\t* Empty here: `hls-video` has no better-equipped sibling to point at.\n\t\t* A Media that does (a Mux Video built on this engine, whose hls.js-backed\n\t\t* counterpart plays MPEG-TS and DRM) overrides this static, and its copy gains\n\t\t* the second sentence with no other change.\n\t\t*/\n\t\tstatic get alternativeMediaSuggestion() {}\n\t\t#engine;\n\t\t#config;\n\t\t#signals;\n\t\t#preload = hlsVideoMediaDefaultProps.preload;\n\t\t#disableRemotePlayback = hlsVideoMediaDefaultProps.disableRemotePlayback;\n\t\t#streamType = hlsVideoMediaDefaultProps.streamType;\n\t\t#isUserStreamType = false;\n\t\t#targetLiveWindow = NaN;\n\t\t#error = null;\n\t\t/**\n\t\t* The *reported* condition currently surfaced, which is what the re-fire\n\t\t* latch keys on. Not `#error.code`: that's the code this adapter chose to\n\t\t* surface, and a later cause can change the choice for a condition already\n\t\t* announced.\n\t\t*/\n\t\t#reportedCode = null;\n\t\t/** Notices already logged for the current source; cleared when it unloads. */\n\t\t#noticed = /* @__PURE__ */ new Set();\n\t\t#stopLiveSync;\n\t\t#stopErrorSync;\n\t\t/** Pending loadstart listener from a deferred play() retry, if any. */\n\t\t#loadstartListener = null;\n\t\tconstructor(...args) {\n\t\t\tsuper(...args);\n\t\t\tconst { config } = args?.[0] ?? {};\n\t\t\tthis.#config = config;\n\t\t\tthis.#engine = this.#createEngine();\n\t\t\tthis.#stopLiveSync = effect(() => {\n\t\t\t\tconst presentation = this.#signals.state.presentation.get();\n\t\t\t\tthis.#setDetectedStreamType(presentation?.streamType ?? MediaStreamTypes.UNKNOWN);\n\t\t\t\tthis.#setTargetLiveWindow(deriveTargetLiveWindow(presentation, liveTrackId(this.#signals.state)));\n\t\t\t\tthis.#reportDeliveryNotices(presentation);\n\t\t\t});\n\t\t\tthis.#stopErrorSync = effect(() => {\n\t\t\t\tconst errors = this.#signals.state.errors.get();\n\t\t\t\tthis.#setError(firstFatal(errors, FATAL_SVTA_CODES), errors);\n\t\t\t});\n\t\t}\n\t\t/**\n\t\t* Underlying playback engine — the low-level SPF reactive composition that\n\t\t* drives playback. An advanced escape hatch for direct engine access;\n\t\t* normal playback is driven through this element's own properties and\n\t\t* methods.\n\t\t*/\n\t\tget engine() {\n\t\t\treturn this.#engine;\n\t\t}\n\t\t/**\n\t\t* The current fatal error, or `null`. Only *fatal* conditions appear here —\n\t\t* the engine reports non-fatal ones too (they stay in `engine.state.errors`),\n\t\t* and promoting them would tell a consumer playback had failed when it\n\t\t* hadn't. Resets per source. Fires `'error'` when set.\n\t\t*/\n\t\tget error() {\n\t\t\treturn this.#error;\n\t\t}\n\t\t/**\n\t\t* The source's stream type — `'live'`, `'on-demand'`, or `'unknown'` until\n\t\t* a media playlist has been parsed. Setting a non-`'unknown'` value pins a\n\t\t* user override (detection stops updating it); setting `'unknown'` reverts\n\t\t* to the engine's detected value.\n\t\t*/\n\t\tget streamType() {\n\t\t\treturn this.#streamType;\n\t\t}\n\t\tset streamType(value) {\n\t\t\tif (value === MediaStreamTypes.UNKNOWN) {\n\t\t\t\tthis.#isUserStreamType = false;\n\t\t\t\tthis.#updateStreamType(this.#signals.state.presentation.get()?.streamType ?? MediaStreamTypes.UNKNOWN);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.#isUserStreamType = true;\n\t\t\tthis.#updateStreamType(value);\n\t\t}\n\t\t/**\n\t\t* Presentation time marking the start of the live-edge window — playback at\n\t\t* `currentTime >= liveEdgeStart` counts as \"at the live edge\" (the same\n\t\t* target the engine's `seekToLiveEdge` seeks to: window end − HOLD-BACK).\n\t\t* `NaN` when the stream isn't live or nothing is resolved yet. Derived at\n\t\t* read time from the engine's live window — no change event; re-read on\n\t\t* `timeupdate`/`progress` (as the store's live feature does).\n\t\t*/\n\t\tget liveEdgeStart() {\n\t\t\treturn getLiveEdge({\n\t\t\t\tstate: this.#signals.state,\n\t\t\t\tconfig: { resolveLiveLatency }\n\t\t\t})?.liveEdgeStart ?? NaN;\n\t\t}\n\t\t/**\n\t\t* The target live window: `NaN` for on-demand (or unknown), `0` for\n\t\t* standard sliding-window live, `Infinity` for DVR\n\t\t* (`#EXT-X-PLAYLIST-TYPE:EVENT`). Fires `targetlivewindowchange` on change.\n\t\t*/\n\t\tget targetLiveWindow() {\n\t\t\treturn this.#targetLiveWindow;\n\t\t}\n\t\t#setDetectedStreamType(value) {\n\t\t\tif (this.#isUserStreamType) return;\n\t\t\tthis.#updateStreamType(value);\n\t\t}\n\t\t#updateStreamType(value) {\n\t\t\tif (this.#streamType === value) return;\n\t\t\tthis.#streamType = value;\n\t\t\tthis.dispatchEvent?.(new Event(\"streamtypechange\"));\n\t\t}\n\t\t#setTargetLiveWindow(value) {\n\t\t\tif (Object.is(this.#targetLiveWindow, value)) return;\n\t\t\tthis.#targetLiveWindow = value;\n\t\t\tthis.dispatchEvent?.(new Event(\"targetlivewindowchange\"));\n\t\t}\n\t\t#setError(reported, errors) {\n\t\t\tif (!reported) {\n\t\t\t\tthis.#error = null;\n\t\t\t\tthis.#reportedCode = null;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (this.#reportedCode === reported.code) return;\n\t\t\tthis.#reportedCode = reported.code;\n\t\t\tconst unsupported = hasUnsupportedFeatureCause(errors);\n\t\t\tif (unsupported) console.error(this.#withSuggestion(UNSUPPORTED_PLAYBACK_FEATURE_MESSAGE), { conditions: errors });\n\t\t\tthis.#error = {\n\t\t\t\tcode: unsupported ? SVTA_UNSUPPORTED_PLAYBACK_FEATURE : reported.code,\n\t\t\t\tmessage: reported.message ?? \"\",\n\t\t\t\t...reported.data === void 0 ? {} : { data: reported.data }\n\t\t\t};\n\t\t\tthis.dispatchEvent?.(new Event(\"error\"));\n\t\t}\n\t\tattach(mediaElement) {\n\t\t\tsuper.attach?.(mediaElement);\n\t\t\tthis.#signals.context.mediaElement.set(mediaElement);\n\t\t}\n\t\tdetach() {\n\t\t\tthis.#cancelPendingPlay();\n\t\t\tthis.#signals.context.mediaElement.set(void 0);\n\t\t\tsuper.detach?.();\n\t\t}\n\t\tdestroy() {\n\t\t\tthis.#cancelPendingPlay();\n\t\t\tthis.#stopLiveSync();\n\t\t\tthis.#stopErrorSync();\n\t\t\tthis.#engine.destroy();\n\t\t}\n\t\t/** Preload type (`'none'` / `'metadata'` / `'auto'`). */\n\t\tget preload() {\n\t\t\treturn this.#preload;\n\t\t}\n\t\tset preload(value) {\n\t\t\tthis.#preload = value;\n\t\t\tif (value) this.#signals.state.preload.set(value);\n\t\t}\n\t\tget disableRemotePlayback() {\n\t\t\treturn this.#disableRemotePlayback;\n\t\t}\n\t\tset disableRemotePlayback(value) {\n\t\t\tthis.#disableRemotePlayback = value;\n\t\t\tthis.#signals.state.disableRemotePlayback.set(value);\n\t\t}\n\t\tget src() {\n\t\t\treturn this.#signals.state.presentation.get()?.url ?? \"\";\n\t\t}\n\t\tset src(value) {\n\t\t\tif (value === this.src) return;\n\t\t\tthis.#cancelPendingPlay();\n\t\t\tthis.#signals.state.presentation.set(value ? { url: value } : void 0);\n\t\t}\n\t\tplay() {\n\t\t\tconst mediaElement = this.#signals.context.mediaElement.get();\n\t\t\tif (!mediaElement) return Promise.reject(/* @__PURE__ */ new Error(\"HlsVideoMediaElement: no media element attached\"));\n\t\t\tthis.#signals.state.loadActivated.set(true);\n\t\t\treturn mediaElement.play().catch((err) => {\n\t\t\t\tif (this.src) return new Promise((resolve, reject) => {\n\t\t\t\t\tconst listener = () => {\n\t\t\t\t\t\tthis.#loadstartListener = null;\n\t\t\t\t\t\tmediaElement.play().then(resolve, reject);\n\t\t\t\t\t};\n\t\t\t\t\tthis.#loadstartListener = listener;\n\t\t\t\t\tmediaElement.addEventListener(\"loadstart\", listener, { once: true });\n\t\t\t\t});\n\t\t\t\tthrow err;\n\t\t\t});\n\t\t}\n\t\t/** `message`, plus the alternative-Media sentence when this class names one. */\n\t\t#withSuggestion(message) {\n\t\t\treturn withAlternativeMediaSuggestion(message, this);\n\t\t}\n\t\t/**\n\t\t* Log what this engine is delivering differently from what the playlist asked\n\t\t* for. Neither condition stops playback, so neither is an error — they go to\n\t\t* the console rather than the error surface.\n\t\t*\n\t\t* Once per source, not per parse: a live playlist reloads every target\n\t\t* duration, and the timeline track re-parses on each one. Keyed on the notice\n\t\t* rather than latched with a boolean so the two are independent, and cleared\n\t\t* when the presentation unresolves so the next source starts quiet.\n\t\t*/\n\t\t#reportDeliveryNotices(presentation) {\n\t\t\tif (!isResolvedPresentation(presentation)) {\n\t\t\t\tthis.#noticed.clear();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst trackId = liveTrackId(this.#signals.state);\n\t\t\tconst track = trackId ? findTrackById(presentation, trackId) : void 0;\n\t\t\tif (!track || !isResolvedTrack(track)) return;\n\t\t\tconst metadata = getMediaPlaylistMetadata(track);\n\t\t\tif (!metadata) return;\n\t\t\tif (metadata.lowLatency && !this.#noticed.has(\"lowLatency\")) {\n\t\t\t\tthis.#noticed.add(\"lowLatency\");\n\t\t\t\tconsole.warn(this.#withSuggestion(LOW_LATENCY_UNSUPPORTED_MESSAGE));\n\t\t\t}\n\t\t\tif (metadata.playlistType === \"EVENT\" && !this.#noticed.has(\"dvr\")) {\n\t\t\t\tthis.#noticed.add(\"dvr\");\n\t\t\t\tconsole.warn(this.#withSuggestion(DVR_EXPERIMENTAL_MESSAGE));\n\t\t\t}\n\t\t}\n\t\t#createEngine() {\n\t\t\treturn createHlsVideoEngine({\n\t\t\t\t...this.#config,\n\t\t\t\tonSignalsReady: (signals) => {\n\t\t\t\t\tthis.#signals = signals;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t\t#cancelPendingPlay() {\n\t\t\tif (!this.#loadstartListener) return;\n\t\t\tthis.#signals.context.mediaElement.get()?.removeEventListener(\"loadstart\", this.#loadstartListener);\n\t\t\tthis.#loadstartListener = null;\n\t\t}\n\t}\n\treturn HlsVideoMediaImpl;\n}\n/** Standalone SPF media adapter with no base class. */\nvar HlsVideoMediaElement = class extends HlsVideoMediaMixin(class {}) {};\n//#endregion\nexport { HlsVideoMediaElement, HlsVideoMediaMixin, hlsVideoMediaDefaultProps };\n\n//# sourceMappingURL=adapter.js.map","import { findTrackById, getTracksByType } from \"../utils/tracks.js\";\n//#region src/media/media-tracks/media-tracks.ts\n/**\n* The distinct video tracks of a presentation, deduped by {@link VideoDedupeKey} (first occurrence wins).\n*\n* Returns `[]` when the presentation is unresolved or has no video tracks.\n*/\nfunction dedupedVideoTracks(presentation) {\n\tif (!presentation) return [];\n\treturn dedupe({\n\t\ttracks: getTracksByType(presentation, \"video\"),\n\t\tkeyFn: toUserVideoTrackSelection\n\t});\n}\n/**\n* The distinct audio tracks of a presentation, deduped by `language` + `name`\n* (first occurrence wins). Returns `[]` when the presentation is unresolved or has no audio tracks.\n*/\nfunction dedupedAudioTracks(presentation) {\n\tif (!presentation) return [];\n\treturn dedupe({\n\t\ttracks: getTracksByType(presentation, \"audio\"),\n\t\tkeyFn: toUserAudioTrackSelection\n\t});\n}\n/**\n* Find a video track by id, searching the same candidate set the engine resolves\n* against ({@link dedupedVideoTracks}'s pre-dedupe source). Returns `undefined`\n* when absent. Maps the engine's resolved `selectedVideoTrackId` back to its\n* properties for `active` reflection — the resolved id may be a per-CDN copy that\n* isn't the representative {@link dedupedVideoTracks} kept.\n*/\nfunction findVideoTrackById(presentation, id) {\n\tif (!presentation || !id) return void 0;\n\tconst track = findTrackById(presentation, id);\n\treturn track?.type === \"video\" ? track : void 0;\n}\n/** Audio counterpart of {@link findVideoTrackById}, for `enabled` reflection. */\nfunction findAudioTrackById(presentation, id) {\n\tif (!presentation || !id) return void 0;\n\tconst track = findTrackById(presentation, id);\n\treturn track?.type === \"audio\" ? track : void 0;\n}\n/**\n* Shallow-equal two key objects by their own properties. Both come from the same\n* key builder, so they carry the same keys — a one-directional scan suffices.\n*/\nfunction sameKey(a, b) {\n\tfor (const attr in a) if (a[attr] !== b[attr]) return false;\n\treturn true;\n}\n/**\n* Dedupe tracks by a key function, keeping the first occurrence of each key.\n* Keys are compared field-by-field ({@link sameKey}).\n*/\nfunction dedupe({ tracks, keyFn }) {\n\tconst seen = [];\n\tconst kept = [];\n\tfor (const track of tracks) {\n\t\tconst key = keyFn(track);\n\t\tif (!key || seen.some((other) => sameKey(other, key))) continue;\n\t\tseen.push(key);\n\t\tkept.push(track);\n\t}\n\treturn kept;\n}\n/**\n* Build a partial video track that can be used as `userVideoTrackSelection`.\n*/\nfunction toUserVideoTrackSelection(rendition) {\n\treturn rendition ? {\n\t\twidth: rendition.width,\n\t\theight: rendition.height,\n\t\tbandwidth: rendition.bandwidth\n\t} : void 0;\n}\n/**\n* Build a partial audio track that can be used as a `userAudioTrackSelection`.\n*/\nfunction toUserAudioTrackSelection(track) {\n\treturn track ? {\n\t\tlanguage: track.language,\n\t\tname: track.name\n\t} : void 0;\n}\n/** Whether two video tracks are the same by dedupe key */\nfunction isSameVideoTrack(a, b) {\n\treturn !!b && a.width === b.width && a.height === b.height && a.bandwidth === b.bandwidth;\n}\n/** Whether two audio tracks are the same by dedupe key */\nfunction isSameAudioTrack(a, b) {\n\treturn !!b && (a.language ?? \"\") === (b.language ?? \"\") && a.name === b.name;\n}\n/** Collapse a rational frame rate (numerator/denominator) to frames per second. */\nconst frameRateToNumber = (frameRate) => {\n\treturn frameRate.frameRateNumerator / (frameRate.frameRateDenominator ?? 1);\n};\n//#endregion\nexport { dedupedAudioTracks, dedupedVideoTracks, findAudioTrackById, findVideoTrackById, frameRateToNumber, isSameAudioTrack, isSameVideoTrack, toUserAudioTrackSelection, toUserVideoTrackSelection };\n\n//# sourceMappingURL=media-tracks.js.map","import { computed, untrack } from \"../../../core/signals/primitives.js\";\nimport { effect } from \"../../../core/signals/effect.js\";\nimport { dedupedAudioTracks, dedupedVideoTracks, findAudioTrackById, findVideoTrackById, frameRateToNumber, isSameAudioTrack, isSameVideoTrack, toUserAudioTrackSelection, toUserVideoTrackSelection } from \"../../../media/media-tracks/media-tracks.js\";\n//#region src/playback/adapters/hls-video/media-tracks.ts\nconst toVideoKey = (rendition) => ({\n\twidth: rendition.width,\n\theight: rendition.height,\n\tbandwidth: rendition.bitrate\n});\nconst toAudioKey = (track) => ({\n\tlanguage: track.language,\n\tname: track.label\n});\n/** Two track lists carry the same set when their id sequences match. */\nconst sameIds = (a, b) => a.length === b.length && a.every((item, i) => item.id === b[i].id);\n/**\n* Projects the SPF engine's presentation onto the media element's\n* `videoRenditions` / `audioTracks` lists, and wires user selection back to the\n* engine's `userVideoTrackSelection` / `userAudioTrackSelection` signals.\n*\n* Requires the media-tracks mixin (track-list infrastructure) earlier in the\n* chain so the host exposes `addVideoTrack`, `videoRenditions`, and friends.\n*/\nfunction HlsVideoMediaMediaTracksMixin(BaseClass) {\n\tclass HlsVideoMediaMediaTracks extends BaseClass {\n\t\t#abort = new AbortController();\n\t\t#destroyed = false;\n\t\t#renditions = [];\n\t\t#audioTracks = [];\n\t\tconstructor(...args) {\n\t\t\tsuper(...args);\n\t\t\tconst { state } = this.engine;\n\t\t\tconst { signal } = this.#abort;\n\t\t\tconst renditionsSignal = computed(() => dedupedVideoTracks(state.presentation.get()), { equals: sameIds });\n\t\t\tconst audioTracksSignal = computed(() => dedupedAudioTracks(state.presentation.get()), { equals: sameIds });\n\t\t\tconst reflectRenditions = () => {\n\t\t\t\tconst renditions = renditionsSignal.get();\n\t\t\t\tthis.#renditions = renditions;\n\t\t\t\tthis.#removeVideoTracks();\n\t\t\t\tif (!renditions.length) return;\n\t\t\t\tconst videoTrack = this.addVideoTrack(\"main\");\n\t\t\t\tvideoTrack.selected = true;\n\t\t\t\tconst resolved = untrack(() => findVideoTrackById(state.presentation.get(), state.selectedVideoTrackId.get()));\n\t\t\t\tfor (const rendition of renditions) {\n\t\t\t\t\tconst domRendition = videoTrack.addRendition(\"\", rendition.width, rendition.height, rendition.codecs.join(\",\"), rendition.bandwidth, rendition.frameRate ? frameRateToNumber(rendition.frameRate) : void 0);\n\t\t\t\t\tdomRendition.id = rendition.id;\n\t\t\t\t\tdomRendition.active = isSameVideoTrack(toVideoKey(domRendition), resolved);\n\t\t\t\t}\n\t\t\t};\n\t\t\tconst reflectSelectedVideo = () => {\n\t\t\t\tconst resolved = findVideoTrackById(state.presentation.get(), state.selectedVideoTrackId.get());\n\t\t\t\tfor (const rendition of this.videoRenditions) rendition.active = isSameVideoTrack(toVideoKey(rendition), resolved);\n\t\t\t};\n\t\t\tconst reflectAudioTracks = () => {\n\t\t\t\tconst tracks = audioTracksSignal.get();\n\t\t\t\tthis.#audioTracks = tracks;\n\t\t\t\tthis.#removeAudioTracks();\n\t\t\t\tif (!tracks.length) return;\n\t\t\t\tconst resolved = untrack(() => findAudioTrackById(state.presentation.get(), state.selectedAudioTrackId.get()));\n\t\t\t\tfor (const track of tracks) {\n\t\t\t\t\tconst domTrack = this.addAudioTrack(track.default ? \"main\" : \"alternative\", track.name, track.language ?? \"\");\n\t\t\t\t\tdomTrack.id = track.id;\n\t\t\t\t\tdomTrack.enabled = isSameAudioTrack(toAudioKey(domTrack), resolved);\n\t\t\t\t}\n\t\t\t};\n\t\t\tconst reflectSelectedAudio = () => {\n\t\t\t\tconst resolved = findAudioTrackById(state.presentation.get(), state.selectedAudioTrackId.get());\n\t\t\t\tfor (const track of this.audioTracks) track.enabled = isSameAudioTrack(toAudioKey(track), resolved);\n\t\t\t};\n\t\t\tconst sourceUrl = computed(() => state.presentation.get()?.url);\n\t\t\tconst resetSelectionOnSourceChange = () => {\n\t\t\t\tsourceUrl.get();\n\t\t\t\tstate.userVideoTrackSelection.set(void 0);\n\t\t\t\tstate.userAudioTrackSelection.set(void 0);\n\t\t\t};\n\t\t\tconst effectCleanups = [\n\t\t\t\teffect(reflectRenditions),\n\t\t\t\teffect(reflectSelectedVideo),\n\t\t\t\teffect(reflectAudioTracks),\n\t\t\t\teffect(reflectSelectedAudio),\n\t\t\t\teffect(resetSelectionOnSourceChange)\n\t\t\t];\n\t\t\tthis.videoRenditions.addEventListener(\"change\", this.#selectRendition, { signal });\n\t\t\tthis.audioTracks.addEventListener(\"change\", this.#selectAudio, { signal });\n\t\t\tsignal.addEventListener(\"abort\", () => effectCleanups.forEach((cleanup) => cleanup()), { once: true });\n\t\t}\n\t\tdestroy() {\n\t\t\tif (this.#destroyed) return;\n\t\t\tthis.#destroyed = true;\n\t\t\tthis.#abort.abort();\n\t\t\tthis.#removeVideoTracks();\n\t\t\tthis.#removeAudioTracks();\n\t\t\tsuper.destroy?.();\n\t\t}\n\t\t#selectRendition = () => {\n\t\t\tconst { userVideoTrackSelection } = this.engine.state;\n\t\t\tconst index = this.videoRenditions.selectedIndex;\n\t\t\tconst domRendition = index < 0 ? void 0 : this.videoRenditions[index];\n\t\t\tconst rendition = this.#renditions.find((candidate) => candidate.id === domRendition?.id);\n\t\t\tuserVideoTrackSelection.set(toUserVideoTrackSelection(rendition));\n\t\t};\n\t\t#selectAudio = () => {\n\t\t\tconst { presentation, selectedAudioTrackId, userAudioTrackSelection } = this.engine.state;\n\t\t\tconst resolved = findAudioTrackById(presentation.get(), selectedAudioTrackId.get());\n\t\t\tconst current = [...this.audioTracks].find((track) => isSameAudioTrack(toAudioKey(track), resolved));\n\t\t\tconst enabled = [...this.audioTracks].filter((track) => track.enabled);\n\t\t\tconst target = enabled.find((track) => track !== current) ?? enabled[0];\n\t\t\tif (!target) return;\n\t\t\tfor (const track of enabled) if (track !== target) track.enabled = false;\n\t\t\tif (target === current) return;\n\t\t\tconst audioTrack = this.#audioTracks.find((candidate) => candidate.id === target.id);\n\t\t\tuserAudioTrackSelection.set(toUserAudioTrackSelection(audioTrack));\n\t\t};\n\t\t#removeVideoTracks() {\n\t\t\tfor (const videoTrack of [...this.videoTracks]) this.removeVideoTrack(videoTrack);\n\t\t}\n\t\t#removeAudioTracks() {\n\t\t\tfor (const audioTrack of [...this.audioTracks]) this.removeAudioTrack(audioTrack);\n\t\t}\n\t}\n\treturn HlsVideoMediaMediaTracks;\n}\n//#endregion\nexport { HlsVideoMediaMediaTracksMixin };\n\n//# sourceMappingURL=media-tracks.js.map","import { HlsVideoMediaMixin } from \"./adapter.js\";\nimport { HlsVideoMediaMediaTracksMixin } from \"./media-tracks.js\";\nimport { HTMLVideoElementHost } from \"@videojs/media/dom/video-host\";\nimport { MediaTracksMixin } from \"@videojs/media/media-tracks\";\n//#region src/playback/adapters/hls-video/media.ts\nconst HlsVideoMediaBase = HlsVideoMediaMediaTracksMixin(MediaTracksMixin(HlsVideoMediaMixin(HTMLVideoElementHost)));\nvar HlsVideoMedia = class extends HlsVideoMediaBase {};\n//#endregion\nexport { HlsVideoMedia };\n\n//# sourceMappingURL=media.js.map"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{t as e}from"./shallow-equal-KV1zFqZi.js";import{t}from"./media-CanBm0Jh.js";import{a as n,i as r,n as i,o as a,r as o,s,t as c}from"./source-BjtVLlkW.js";function l(e){if(!e?.playbackId)return;let{playbackId:t,customDomain:n=c,drm:r}=e,{token:i}=r??{};if(!i||s(i)?.aud!==`d`)return;let a=o({token:i}),l=e=>`https://license.${n}/${e}/${t}${a}`;return{"com.apple.fps":{licenseUrl:l(`license/fairplay`),serverCertificateUrl:l(`appcert/fairplay`)},"com.widevine.alpha":{licenseUrl:l(`license/widevine`)},"com.microsoft.playready":{licenseUrl:l(`license/playready`)}}}const u={src:``,source:null};var d=class extends t{#e=u.source;#t={};get src(){return super.src}set src(e){if(super.src===e)return;let{type:t,preferPlayback:n,engine:r,maxAutoResolution:i,capRenditionToPlayerSize:o,minAutoResolution:s}=this.#e??{},c={...t&&{type:t},...n&&{preferPlayback:n},...r&&{engine:r},...i&&{maxAutoResolution:i},...o!==void 0&&{capRenditionToPlayerSize:o},...s&&{minAutoResolution:s},...a(e)??(e?{src:e}:null)};this.source=Object.keys(c).length>0?c:null}get source(){return this.#e}set source(e){let t=e??null;if(t===this.#e)return;this.#e=t;let r=this.#n();super.source=t&&{...t,src:n(t)??t.src??``,...f(t)},r&&this.dispatchEvent(new Event(`contentdatachange`))}get contentData(){return this.#t}#n(){let t=i(this.#e),n=r(this.#e),a={...t&&{poster:t},...n&&{storyboard:n}};return e(this.#t,a)?!1:(this.#t=a,!0)}};function f(e){let{token:t,...n}=e.drm??{},r={...l(e),...n};return{drm:Object.keys(r).length>0?r:void 0}}export{d as t};
2
+ //# sourceMappingURL=media-DU3Xf5XR.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media-DU3Xf5XR.js","names":["#source","#refreshContentData","#contentData"],"sources":["../../media/dist/default/dom/mux/drm.js","../../media/dist/default/dom/mux/media.js"],"sourcesContent":["import { MUX_VIDEO_DOMAIN, createMuxQuery } from \"./source/source.js\";\nimport { parseJwt } from \"@videojs/utils/jwt\";\n//#region src/dom/mux/drm.ts\n/**\n* Build the license servers a source describes, keyed by EME key system id —\n* `source.drm` as any other source would name it. Mux signs one license token\n* per playback ID and serves every system from a URL derived from it, so\n* `drm.token` is all a caller provides.\n*\n* Returns `undefined` when no license token is present, or when the token is\n* not scoped to DRM — an unsigned license request is always rejected, so there\n* is nothing useful to configure.\n*\n* Separate from `./source` because it is the one part of the Mux source an\n* engine that licenses differently — or, like SPF today, doesn't license at\n* all — has nothing to do with.\n*\n* @internal\n*/\nfunction createMuxDrmSystems(source) {\n\tif (!source?.playbackId) return void 0;\n\tconst { playbackId, customDomain = MUX_VIDEO_DOMAIN, drm } = source;\n\tconst { token } = drm ?? {};\n\tif (!token || parseJwt(token)?.aud !== \"d\") return void 0;\n\tconst query = createMuxQuery({ token });\n\tconst url = (path) => `https://license.${customDomain}/${path}/${playbackId}${query}`;\n\treturn {\n\t\t\"com.apple.fps\": {\n\t\t\tlicenseUrl: url(\"license/fairplay\"),\n\t\t\tserverCertificateUrl: url(\"appcert/fairplay\")\n\t\t},\n\t\t\"com.widevine.alpha\": { licenseUrl: url(\"license/widevine\") },\n\t\t\"com.microsoft.playready\": { licenseUrl: url(\"license/playready\") }\n\t};\n}\n//#endregion\nexport { createMuxDrmSystems };\n\n//# sourceMappingURL=drm.js.map","import { HlsJsMedia } from \"../hls-js/media.js\";\nimport { createMuxPosterURL, createMuxStoryboardURL, createMuxVideoURL, parseMuxVideoURL } from \"./source/source.js\";\nimport { createMuxDrmSystems } from \"./drm.js\";\nimport { shallowEqual } from \"@videojs/utils/object\";\n//#region src/dom/mux/media.ts\nconst muxMediaDefaultProps = {\n\tsrc: \"\",\n\tsource: null\n};\n/**\n* @fires sourcechange - Fired when `source` changes, either directly or by parsing a new `src`. Read `source` for the new value.\n* @fires contentdatachange - Fired when the derived `contentData` changes. Read `contentData` for the new value.\n*/\nvar MuxMedia = class extends HlsJsMedia {\n\t#source = muxMediaDefaultProps.source;\n\t#contentData = {};\n\t/**\n\t* Media source URL. Setting a Mux stream URL\n\t* (`https://stream.mux.com/<playback-id>.m3u8?...`) extracts the playback ID\n\t* and query params into `source`; other URLs are kept as a plain `source.src`.\n\t*\n\t* Only playback options carry over. Mux identity comes from the URL, and the\n\t* signed `poster`, `storyboard`, and `drm` tokens are scoped to a playback ID,\n\t* so carrying them onto a different source would build rejected URLs.\n\t*/\n\tget src() {\n\t\treturn super.src;\n\t}\n\tset src(value) {\n\t\tif (super.src === value) return;\n\t\tconst { type, preferPlayback, engine, maxAutoResolution, capRenditionToPlayerSize, minAutoResolution } = this.#source ?? {};\n\t\tconst source = {\n\t\t\t...type && { type },\n\t\t\t...preferPlayback && { preferPlayback },\n\t\t\t...engine && { engine },\n\t\t\t...maxAutoResolution && { maxAutoResolution },\n\t\t\t...capRenditionToPlayerSize !== void 0 && { capRenditionToPlayerSize },\n\t\t\t...minAutoResolution && { minAutoResolution },\n\t\t\t...parseMuxVideoURL(value) ?? (value ? { src: value } : null)\n\t\t};\n\t\tthis.source = Object.keys(source).length > 0 ? source : null;\n\t}\n\t/**\n\t* Structured Mux source. Setting it derives `src` from the playback ID,\n\t* custom domain, and `playback` params (appended as `snake_case` query\n\t* params). A `playback.token` replaces all other params — signed URLs bake\n\t* them into the token. Engine options live under `engine`.\n\t*\n\t* A `drm.token` fills in `drm` itself: Mux's FairPlay, Widevine, and\n\t* PlayReady license servers for this playback ID, so protected media plays\n\t* whichever path the browser takes. License servers named alongside the token\n\t* win, key by key, for content Mux does not license.\n\t*\n\t* `playback.maxResolution` and `playback.minResolution` are server-side: they\n\t* decide which renditions Mux puts in the manifest at all. The inherited\n\t* `maxAutoResolution` and `minAutoResolution` only look like their pair —\n\t* those are client-side and bound which of the renditions that *do* arrive\n\t* adaptive selection reaches for. The two halves are independent.\n\t*/\n\tget source() {\n\t\treturn this.#source;\n\t}\n\tset source(value) {\n\t\tconst source = value ?? null;\n\t\tif (source === this.#source) return;\n\t\tthis.#source = source;\n\t\tconst contentDataChanged = this.#refreshContentData();\n\t\tsuper.source = source && {\n\t\t\t...source,\n\t\t\tsrc: createMuxVideoURL(source) ?? source.src ?? \"\",\n\t\t\t...withMuxDrm(source)\n\t\t};\n\t\tif (contentDataChanged) this.dispatchEvent(new Event(\"contentdatachange\"));\n\t}\n\t/**\n\t* Image URLs `source` describes rather than plays: `poster` from its `poster`\n\t* params, `storyboard` from its `storyboard` params. A key is absent when the\n\t* URL can't be built — no playback ID, or signed playback without a matching\n\t* image token.\n\t*\n\t* Derived from `source` and nothing else. The same object is handed back\n\t* until one of those URLs changes, and `contentdatachange` announces it when\n\t* it does. Nothing here is applied for you, apart from the thumbnail track\n\t* `<mux-video>` adds from `storyboard` (and drops for live streams).\n\t*/\n\tget contentData() {\n\t\treturn this.#contentData;\n\t}\n\t/** Rebuild the derived bag, reporting whether anything about it changed. */\n\t#refreshContentData() {\n\t\tconst poster = createMuxPosterURL(this.#source);\n\t\tconst storyboard = createMuxStoryboardURL(this.#source);\n\t\tconst next = {\n\t\t\t...poster && { poster },\n\t\t\t...storyboard && { storyboard }\n\t\t};\n\t\tif (shallowEqual(this.#contentData, next)) return false;\n\t\tthis.#contentData = next;\n\t\treturn true;\n\t}\n};\n/**\n* Resolve Mux's DRM authoring input into the license servers the HLS layer\n* licenses from. Which engine ends up playing is decided later, and both read\n* `drm`, so a signed Mux source plays either way.\n*\n* `token` is Mux's own input and stops here — it names no license server, and a\n* key system is what everything downstream expects to find. Servers the caller\n* named win, key by key, so their own licensing replaces the derived URLs.\n*/\nfunction withMuxDrm(source) {\n\tconst { token: _token, ...systems } = source.drm ?? {};\n\tconst drm = {\n\t\t...createMuxDrmSystems(source),\n\t\t...systems\n\t};\n\treturn { drm: Object.keys(drm).length > 0 ? drm : void 0 };\n}\n//#endregion\nexport { MuxMedia, muxMediaDefaultProps };\n\n//# sourceMappingURL=media.js.map"],"mappings":"iKAmBA,SAAS,EAAoB,EAAQ,CACpC,GAAI,CAAC,GAAQ,WAAY,OACzB,GAAM,CAAE,aAAY,eAAe,EAAkB,OAAQ,EACvD,CAAE,SAAU,GAAO,CAAC,EAC1B,GAAI,CAAC,GAAS,EAAS,CAAK,CAAC,EAAE,MAAQ,IAAK,OAC5C,IAAM,EAAQ,EAAe,CAAE,OAAM,CAAC,EAChC,EAAO,GAAS,mBAAmB,EAAa,GAAG,EAAK,GAAG,IAAa,IAC9E,MAAO,CACN,gBAAiB,CAChB,WAAY,EAAI,kBAAkB,EAClC,qBAAsB,EAAI,kBAAkB,CAC7C,EACA,qBAAsB,CAAE,WAAY,EAAI,kBAAkB,CAAE,EAC5D,0BAA2B,CAAE,WAAY,EAAI,mBAAmB,CAAE,CACnE,CACD,CC7BA,MAAM,EAAuB,CAC5B,IAAK,GACL,OAAQ,IACT,EAKA,IAAI,EAAW,cAAc,CAAW,CACvC,GAAU,EAAqB,OAC/B,GAAe,CAAC,EAUhB,IAAI,KAAM,CACT,OAAO,MAAM,GACd,CACA,IAAI,IAAI,EAAO,CACd,GAAI,MAAM,MAAQ,EAAO,OACzB,GAAM,CAAE,OAAM,iBAAgB,SAAQ,oBAAmB,2BAA0B,qBAAsB,KAAKA,IAAW,CAAC,EACpH,EAAS,CACd,GAAG,GAAQ,CAAE,MAAK,EAClB,GAAG,GAAkB,CAAE,gBAAe,EACtC,GAAG,GAAU,CAAE,QAAO,EACtB,GAAG,GAAqB,CAAE,mBAAkB,EAC5C,GAAG,IAA6B,IAAK,IAAK,CAAE,0BAAyB,EACrE,GAAG,GAAqB,CAAE,mBAAkB,EAC5C,GAAG,EAAiB,CAAK,IAAM,EAAQ,CAAE,IAAK,CAAM,EAAI,KACzD,EACA,KAAK,OAAS,OAAO,KAAK,CAAM,CAAC,CAAC,OAAS,EAAI,EAAS,IACzD,CAkBA,IAAI,QAAS,CACZ,OAAO,KAAKA,EACb,CACA,IAAI,OAAO,EAAO,CACjB,IAAM,EAAS,GAAS,KACxB,GAAI,IAAW,KAAKA,GAAS,OAC7B,KAAKA,GAAU,EACf,IAAM,EAAqB,KAAKC,GAAoB,EACpD,MAAM,OAAS,GAAU,CACxB,GAAG,EACH,IAAK,EAAkB,CAAM,GAAK,EAAO,KAAO,GAChD,GAAG,EAAW,CAAM,CACrB,EACI,GAAoB,KAAK,cAAc,IAAI,MAAM,mBAAmB,CAAC,CAC1E,CAYA,IAAI,aAAc,CACjB,OAAO,KAAKC,EACb,CAEA,IAAsB,CACrB,IAAM,EAAS,EAAmB,KAAKF,EAAO,EACxC,EAAa,EAAuB,KAAKA,EAAO,EAChD,EAAO,CACZ,GAAG,GAAU,CAAE,QAAO,EACtB,GAAG,GAAc,CAAE,YAAW,CAC/B,EAGA,OAFI,EAAa,KAAKE,GAAc,CAAI,EAAU,IAClD,KAAKA,GAAe,EACb,GACR,CACD,EAUA,SAAS,EAAW,EAAQ,CAC3B,GAAM,CAAE,MAAO,EAAQ,GAAG,GAAY,EAAO,KAAO,CAAC,EAC/C,EAAM,CACX,GAAG,EAAoB,CAAM,EAC7B,GAAG,CACJ,EACA,MAAO,CAAE,IAAK,OAAO,KAAK,CAAG,CAAC,CAAC,OAAS,EAAI,EAAM,IAAK,EAAE,CAC1D"}