@videojs/spf 10.0.0-beta.23 → 10.0.0-beta.25

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 (516) hide show
  1. package/dist/default/background-video.js +3 -0
  2. package/dist/{dev/core → default/core/actors}/create-machine-actor.js +3 -3
  3. package/dist/default/core/actors/create-machine-actor.js.map +1 -0
  4. package/dist/default/core/{create-transition-actor.js → actors/create-transition-actor.js} +3 -3
  5. package/dist/default/core/actors/create-transition-actor.js.map +1 -0
  6. package/dist/default/core/composition/create-composition.js +85 -0
  7. package/dist/default/core/composition/create-composition.js.map +1 -0
  8. package/dist/default/core/composition/share-signals.js +39 -0
  9. package/dist/default/core/composition/share-signals.js.map +1 -0
  10. package/dist/{dev/core → default/core/reactors}/create-machine-reactor.js +4 -4
  11. package/dist/default/core/reactors/create-machine-reactor.js.map +1 -0
  12. package/dist/default/core/signals/primitives.js +33 -11
  13. package/dist/default/core/signals/primitives.js.map +1 -1
  14. package/dist/default/core/{task.js → tasks/task.js} +2 -2
  15. package/dist/default/core/tasks/task.js.map +1 -0
  16. package/dist/default/dom.js +9 -10
  17. package/dist/default/hls.js +5 -0
  18. package/dist/default/index.js +12 -3
  19. package/dist/default/index.js.map +1 -1
  20. package/dist/default/media/abr/quality-selection.js +21 -0
  21. package/dist/default/media/abr/quality-selection.js.map +1 -0
  22. package/dist/default/{core → media}/buffer/back-buffer.js +2 -2
  23. package/dist/default/media/buffer/back-buffer.js.map +1 -0
  24. package/dist/{dev/core → default/media}/buffer/forward-buffer.js +14 -2
  25. package/dist/default/media/buffer/forward-buffer.js.map +1 -0
  26. package/dist/default/media/dom/capabilities.js +70 -0
  27. package/dist/default/media/dom/capabilities.js.map +1 -0
  28. package/dist/{dev/dom/media → default/media/dom/mse}/append-segment.js +1 -1
  29. package/dist/default/media/dom/mse/append-segment.js.map +1 -0
  30. package/dist/default/{dom/media → media/dom/mse}/buffer-flusher.js +1 -1
  31. package/dist/default/media/dom/mse/buffer-flusher.js.map +1 -0
  32. package/dist/default/media/dom/mse/duration.js +78 -0
  33. package/dist/default/media/dom/mse/duration.js.map +1 -0
  34. package/dist/default/media/dom/mse/end-of-stream.js +20 -0
  35. package/dist/default/media/dom/mse/end-of-stream.js.map +1 -0
  36. package/dist/default/{dom/media → media/dom/mse}/mediasource-setup.js +63 -18
  37. package/dist/default/media/dom/mse/mediasource-setup.js.map +1 -0
  38. package/dist/default/{dom/text/parse-vtt-segment.js → media/dom/text/resolve-vtt-segment.js} +5 -5
  39. package/dist/default/media/dom/text/resolve-vtt-segment.js.map +1 -0
  40. package/dist/default/media/dom/text/text-track-slots.js +69 -0
  41. package/dist/default/media/dom/text/text-track-slots.js.map +1 -0
  42. package/dist/{dev/core → default/media}/hls/parse-attributes.js +17 -3
  43. package/dist/default/media/hls/parse-attributes.js.map +1 -0
  44. package/dist/{dev/core → default/media}/hls/parse-media-playlist.js +25 -2
  45. package/dist/default/media/hls/parse-media-playlist.js.map +1 -0
  46. package/dist/{dev/core → default/media}/hls/parse-multivariant.js +17 -8
  47. package/dist/default/media/hls/parse-multivariant.js.map +1 -0
  48. package/dist/default/{core → media}/hls/resolve-url.js +1 -1
  49. package/dist/default/media/hls/resolve-url.js.map +1 -0
  50. package/dist/default/media/primitives/select-tracks.js +130 -0
  51. package/dist/default/media/primitives/select-tracks.js.map +1 -0
  52. package/dist/default/media/types/index.js +36 -0
  53. package/dist/default/media/types/index.js.map +1 -0
  54. package/dist/default/media/utils/cdn.js +56 -0
  55. package/dist/default/media/utils/cdn.js.map +1 -0
  56. package/dist/default/media/utils/preload.js +22 -0
  57. package/dist/default/media/utils/preload.js.map +1 -0
  58. package/dist/default/media/utils/track-selection.js +47 -0
  59. package/dist/default/media/utils/track-selection.js.map +1 -0
  60. package/dist/default/media/utils/tracks.js +130 -0
  61. package/dist/default/media/utils/tracks.js.map +1 -0
  62. package/dist/default/{core/abr → network}/bandwidth-estimator.js +6 -5
  63. package/dist/default/network/bandwidth-estimator.js.map +1 -0
  64. package/dist/{dev/dom → default}/network/chunked-stream-iterable.js +1 -1
  65. package/dist/default/network/chunked-stream-iterable.js.map +1 -0
  66. package/dist/{dev/core/abr → default/network}/ewma.js +1 -1
  67. package/dist/default/network/ewma.js.map +1 -0
  68. package/dist/default/network/fetch.js +115 -0
  69. package/dist/default/network/fetch.js.map +1 -0
  70. package/dist/default/{dom/features/segment-loader-actor.js → playback/actors/dom/segment-loader.js} +63 -23
  71. package/dist/default/playback/actors/dom/segment-loader.js.map +1 -0
  72. package/dist/default/{dom/media/source-buffer-actor.js → playback/actors/dom/source-buffer.js} +10 -9
  73. package/dist/default/playback/actors/dom/source-buffer.js.map +1 -0
  74. package/dist/{dev/dom/features/text-tracks-actor.js → default/playback/actors/dom/text-tracks.js} +7 -3
  75. package/dist/default/playback/actors/dom/text-tracks.js.map +1 -0
  76. package/dist/default/playback/actors/text-track-segment-loader.js +135 -0
  77. package/dist/default/playback/actors/text-track-segment-loader.js.map +1 -0
  78. package/dist/default/playback/behaviors/calculate-presentation-duration.js +36 -0
  79. package/dist/default/playback/behaviors/calculate-presentation-duration.js.map +1 -0
  80. package/dist/default/playback/behaviors/derive-cdn-priority.js +68 -0
  81. package/dist/default/playback/behaviors/derive-cdn-priority.js.map +1 -0
  82. package/dist/default/playback/behaviors/dom/end-of-stream.js +90 -0
  83. package/dist/default/playback/behaviors/dom/end-of-stream.js.map +1 -0
  84. package/dist/default/playback/behaviors/dom/load-segments.js +177 -0
  85. package/dist/default/playback/behaviors/dom/load-segments.js.map +1 -0
  86. package/dist/default/playback/behaviors/dom/setup-buffer-actors.js +192 -0
  87. package/dist/default/playback/behaviors/dom/setup-buffer-actors.js.map +1 -0
  88. package/dist/default/playback/behaviors/dom/setup-mediasource.js +89 -0
  89. package/dist/default/playback/behaviors/dom/setup-mediasource.js.map +1 -0
  90. package/dist/default/playback/behaviors/dom/setup-text-track-actors.js +54 -0
  91. package/dist/default/playback/behaviors/dom/setup-text-track-actors.js.map +1 -0
  92. package/dist/default/playback/behaviors/dom/sync-text-tracks.js +124 -0
  93. package/dist/default/playback/behaviors/dom/sync-text-tracks.js.map +1 -0
  94. package/dist/default/playback/behaviors/dom/track-current-time.js +52 -0
  95. package/dist/default/playback/behaviors/dom/track-current-time.js.map +1 -0
  96. package/dist/default/playback/behaviors/dom/track-load-triggers.js +94 -0
  97. package/dist/default/playback/behaviors/dom/track-load-triggers.js.map +1 -0
  98. package/dist/default/playback/behaviors/dom/track-playback-rate.js +37 -0
  99. package/dist/default/playback/behaviors/dom/track-playback-rate.js.map +1 -0
  100. package/dist/default/playback/behaviors/dom/update-mediasource-duration.js +90 -0
  101. package/dist/default/playback/behaviors/dom/update-mediasource-duration.js.map +1 -0
  102. package/dist/default/playback/behaviors/resolve-presentation.js +85 -0
  103. package/dist/default/playback/behaviors/resolve-presentation.js.map +1 -0
  104. package/dist/default/playback/behaviors/resolve-track.js +120 -0
  105. package/dist/default/playback/behaviors/resolve-track.js.map +1 -0
  106. package/dist/default/playback/behaviors/select-tracks.js +101 -0
  107. package/dist/default/playback/behaviors/select-tracks.js.map +1 -0
  108. package/dist/default/playback/behaviors/setup-failover-monitor.js +66 -0
  109. package/dist/default/playback/behaviors/setup-failover-monitor.js.map +1 -0
  110. package/dist/default/playback/behaviors/sync-preload.js +59 -0
  111. package/dist/default/playback/behaviors/sync-preload.js.map +1 -0
  112. package/dist/default/playback/behaviors/track-switching.js +341 -0
  113. package/dist/default/playback/behaviors/track-switching.js.map +1 -0
  114. package/dist/default/playback/engines/background-video/adapter.js +158 -0
  115. package/dist/default/playback/engines/background-video/adapter.js.map +1 -0
  116. package/dist/default/playback/engines/background-video/engine.js +75 -0
  117. package/dist/default/playback/engines/background-video/engine.js.map +1 -0
  118. package/dist/default/playback/engines/hls/adapter-audio-only.js +119 -0
  119. package/dist/default/playback/engines/hls/adapter-audio-only.js.map +1 -0
  120. package/dist/default/{dom/playback-engine → playback/engines/hls}/adapter.js +40 -26
  121. package/dist/default/playback/engines/hls/adapter.js.map +1 -0
  122. package/dist/default/playback/engines/hls/engine-audio-only.js +80 -0
  123. package/dist/default/playback/engines/hls/engine-audio-only.js.map +1 -0
  124. package/dist/default/playback/engines/hls/engine.js +115 -0
  125. package/dist/default/playback/engines/hls/engine.js.map +1 -0
  126. package/dist/default/playback/primitives/failover-fetch.js +42 -0
  127. package/dist/default/playback/primitives/failover-fetch.js.map +1 -0
  128. package/dist/default/playback/primitives/track-types.js +61 -0
  129. package/dist/default/playback/primitives/track-types.js.map +1 -0
  130. package/dist/dev/background-video.d.ts +3 -0
  131. package/dist/dev/background-video.js +3 -0
  132. package/dist/dev/core/{actor.d.ts → actors/actor.d.ts} +2 -2
  133. package/dist/dev/core/actors/actor.d.ts.map +1 -0
  134. package/dist/dev/core/actors/create-machine-actor.d.ts +125 -0
  135. package/dist/dev/core/actors/create-machine-actor.d.ts.map +1 -0
  136. package/dist/{default/core → dev/core/actors}/create-machine-actor.js +3 -3
  137. package/dist/dev/core/actors/create-machine-actor.js.map +1 -0
  138. package/dist/dev/core/actors/create-transition-actor.d.ts +42 -0
  139. package/dist/dev/core/actors/create-transition-actor.d.ts.map +1 -0
  140. package/dist/dev/core/{create-transition-actor.js → actors/create-transition-actor.js} +3 -3
  141. package/dist/dev/core/actors/create-transition-actor.js.map +1 -0
  142. package/dist/dev/core/composition/create-composition.d.ts +274 -0
  143. package/dist/dev/core/composition/create-composition.d.ts.map +1 -0
  144. package/dist/dev/core/composition/create-composition.js +85 -0
  145. package/dist/dev/core/composition/create-composition.js.map +1 -0
  146. package/dist/dev/core/composition/share-signals.d.ts +47 -0
  147. package/dist/dev/core/composition/share-signals.d.ts.map +1 -0
  148. package/dist/dev/core/composition/share-signals.js +39 -0
  149. package/dist/dev/core/composition/share-signals.js.map +1 -0
  150. package/dist/dev/core/machine.d.ts +0 -1
  151. package/dist/dev/core/machine.d.ts.map +1 -1
  152. package/dist/dev/core/reactors/create-machine-reactor.d.ts +93 -0
  153. package/dist/dev/core/reactors/create-machine-reactor.d.ts.map +1 -0
  154. package/dist/{default/core → dev/core/reactors}/create-machine-reactor.js +4 -4
  155. package/dist/dev/core/reactors/create-machine-reactor.js.map +1 -0
  156. package/dist/dev/core/signals/primitives.d.ts +38 -1
  157. package/dist/dev/core/signals/primitives.d.ts.map +1 -1
  158. package/dist/dev/core/signals/primitives.js +33 -11
  159. package/dist/dev/core/signals/primitives.js.map +1 -1
  160. package/dist/dev/core/tasks/task.d.ts +115 -0
  161. package/dist/dev/core/tasks/task.d.ts.map +1 -0
  162. package/dist/dev/core/{task.js → tasks/task.js} +2 -2
  163. package/dist/dev/core/tasks/task.js.map +1 -0
  164. package/dist/dev/dom.d.ts +9 -10
  165. package/dist/dev/dom.js +9 -10
  166. package/dist/dev/hls.d.ts +5 -0
  167. package/dist/dev/hls.js +5 -0
  168. package/dist/dev/index.d.ts +15 -3
  169. package/dist/dev/index.d.ts.map +1 -1
  170. package/dist/dev/index.js +12 -3
  171. package/dist/dev/index.js.map +1 -1
  172. package/dist/dev/media/abr/quality-selection.d.ts +22 -0
  173. package/dist/dev/media/abr/quality-selection.d.ts.map +1 -0
  174. package/dist/dev/media/abr/quality-selection.js +21 -0
  175. package/dist/dev/media/abr/quality-selection.js.map +1 -0
  176. package/dist/dev/media/buffer/back-buffer.d.ts +14 -0
  177. package/dist/dev/media/buffer/back-buffer.d.ts.map +1 -0
  178. package/dist/dev/{core → media}/buffer/back-buffer.js +2 -2
  179. package/dist/dev/media/buffer/back-buffer.js.map +1 -0
  180. package/dist/dev/media/buffer/forward-buffer.d.ts +14 -0
  181. package/dist/dev/media/buffer/forward-buffer.d.ts.map +1 -0
  182. package/dist/{default/core → dev/media}/buffer/forward-buffer.js +14 -2
  183. package/dist/dev/media/buffer/forward-buffer.js.map +1 -0
  184. package/dist/dev/media/dom/capabilities.js +70 -0
  185. package/dist/dev/media/dom/capabilities.js.map +1 -0
  186. package/dist/dev/{dom/media → media/dom/mse}/append-segment.d.ts +1 -1
  187. package/dist/dev/media/dom/mse/append-segment.d.ts.map +1 -0
  188. package/dist/{default/dom/media → dev/media/dom/mse}/append-segment.js +1 -1
  189. package/dist/dev/media/dom/mse/append-segment.js.map +1 -0
  190. package/dist/dev/{dom/media → media/dom/mse}/buffer-flusher.d.ts +1 -1
  191. package/dist/dev/media/dom/mse/buffer-flusher.d.ts.map +1 -0
  192. package/dist/dev/{dom/media → media/dom/mse}/buffer-flusher.js +1 -1
  193. package/dist/dev/media/dom/mse/buffer-flusher.js.map +1 -0
  194. package/dist/dev/media/dom/mse/duration.js +78 -0
  195. package/dist/dev/media/dom/mse/duration.js.map +1 -0
  196. package/dist/dev/media/dom/mse/end-of-stream.js +20 -0
  197. package/dist/dev/media/dom/mse/end-of-stream.js.map +1 -0
  198. package/dist/dev/{dom/media → media/dom/mse}/mediasource-setup.js +63 -18
  199. package/dist/dev/media/dom/mse/mediasource-setup.js.map +1 -0
  200. package/dist/dev/media/dom/text/resolve-vtt-segment.d.ts +12 -0
  201. package/dist/dev/media/dom/text/resolve-vtt-segment.d.ts.map +1 -0
  202. package/dist/dev/{dom/text/parse-vtt-segment.js → media/dom/text/resolve-vtt-segment.js} +5 -5
  203. package/dist/dev/media/dom/text/resolve-vtt-segment.js.map +1 -0
  204. package/dist/dev/media/dom/text/text-track-slots.d.ts +31 -0
  205. package/dist/dev/media/dom/text/text-track-slots.d.ts.map +1 -0
  206. package/dist/dev/media/dom/text/text-track-slots.js +69 -0
  207. package/dist/dev/media/dom/text/text-track-slots.js.map +1 -0
  208. package/dist/{default/core → dev/media}/hls/parse-attributes.js +17 -3
  209. package/dist/dev/media/hls/parse-attributes.js.map +1 -0
  210. package/dist/{default/core → dev/media}/hls/parse-media-playlist.js +25 -2
  211. package/dist/dev/media/hls/parse-media-playlist.js.map +1 -0
  212. package/dist/{default/core → dev/media}/hls/parse-multivariant.js +17 -8
  213. package/dist/dev/media/hls/parse-multivariant.js.map +1 -0
  214. package/dist/dev/{core → media}/hls/resolve-url.js +1 -1
  215. package/dist/dev/media/hls/resolve-url.js.map +1 -0
  216. package/dist/dev/media/primitives/select-tracks.d.ts +36 -0
  217. package/dist/dev/media/primitives/select-tracks.d.ts.map +1 -0
  218. package/dist/dev/media/primitives/select-tracks.js +130 -0
  219. package/dist/dev/media/primitives/select-tracks.js.map +1 -0
  220. package/dist/dev/{core → media}/types/index.d.ts +55 -3
  221. package/dist/dev/media/types/index.d.ts.map +1 -0
  222. package/dist/dev/media/types/index.js +36 -0
  223. package/dist/dev/media/types/index.js.map +1 -0
  224. package/dist/dev/media/utils/cdn.d.ts +13 -0
  225. package/dist/dev/media/utils/cdn.d.ts.map +1 -0
  226. package/dist/dev/media/utils/cdn.js +56 -0
  227. package/dist/dev/media/utils/cdn.js.map +1 -0
  228. package/dist/dev/media/utils/preload.js +22 -0
  229. package/dist/dev/media/utils/preload.js.map +1 -0
  230. package/dist/dev/media/utils/track-selection.js +47 -0
  231. package/dist/dev/media/utils/track-selection.js.map +1 -0
  232. package/dist/dev/media/utils/tracks.js +130 -0
  233. package/dist/dev/media/utils/tracks.js.map +1 -0
  234. package/dist/dev/{core/abr → network}/bandwidth-estimator.d.ts +17 -2
  235. package/dist/dev/network/bandwidth-estimator.d.ts.map +1 -0
  236. package/dist/dev/{core/abr → network}/bandwidth-estimator.js +6 -5
  237. package/dist/dev/network/bandwidth-estimator.js.map +1 -0
  238. package/dist/{default/dom → dev}/network/chunked-stream-iterable.js +1 -1
  239. package/dist/dev/network/chunked-stream-iterable.js.map +1 -0
  240. package/dist/{default/core/abr → dev/network}/ewma.js +1 -1
  241. package/dist/dev/network/ewma.js.map +1 -0
  242. package/dist/dev/network/fetch.js +115 -0
  243. package/dist/dev/network/fetch.js.map +1 -0
  244. package/dist/dev/playback/actors/dom/segment-loader.d.ts +36 -0
  245. package/dist/dev/playback/actors/dom/segment-loader.d.ts.map +1 -0
  246. package/dist/dev/{dom/features/segment-loader-actor.js → playback/actors/dom/segment-loader.js} +63 -23
  247. package/dist/dev/playback/actors/dom/segment-loader.js.map +1 -0
  248. package/dist/dev/{dom/media/source-buffer-actor.d.ts → playback/actors/dom/source-buffer.d.ts} +20 -5
  249. package/dist/dev/playback/actors/dom/source-buffer.d.ts.map +1 -0
  250. package/dist/dev/{dom/media/source-buffer-actor.js → playback/actors/dom/source-buffer.js} +10 -9
  251. package/dist/dev/playback/actors/dom/source-buffer.js.map +1 -0
  252. package/dist/dev/playback/actors/dom/text-tracks.d.ts +1 -0
  253. package/dist/{default/dom/features/text-tracks-actor.js → dev/playback/actors/dom/text-tracks.js} +7 -3
  254. package/dist/dev/playback/actors/dom/text-tracks.js.map +1 -0
  255. package/dist/dev/playback/actors/text-track-segment-loader.d.ts +59 -0
  256. package/dist/dev/playback/actors/text-track-segment-loader.d.ts.map +1 -0
  257. package/dist/dev/playback/actors/text-track-segment-loader.js +135 -0
  258. package/dist/dev/playback/actors/text-track-segment-loader.js.map +1 -0
  259. package/dist/dev/playback/actors/text-tracks.d.ts +42 -0
  260. package/dist/dev/playback/actors/text-tracks.d.ts.map +1 -0
  261. package/dist/dev/playback/behaviors/calculate-presentation-duration.d.ts +25 -0
  262. package/dist/dev/playback/behaviors/calculate-presentation-duration.d.ts.map +1 -0
  263. package/dist/dev/playback/behaviors/calculate-presentation-duration.js +36 -0
  264. package/dist/dev/playback/behaviors/calculate-presentation-duration.js.map +1 -0
  265. package/dist/dev/playback/behaviors/derive-cdn-priority.js +68 -0
  266. package/dist/dev/playback/behaviors/derive-cdn-priority.js.map +1 -0
  267. package/dist/dev/playback/behaviors/dom/end-of-stream.js +90 -0
  268. package/dist/dev/playback/behaviors/dom/end-of-stream.js.map +1 -0
  269. package/dist/dev/playback/behaviors/dom/load-segments.d.ts +62 -0
  270. package/dist/dev/playback/behaviors/dom/load-segments.d.ts.map +1 -0
  271. package/dist/dev/playback/behaviors/dom/load-segments.js +177 -0
  272. package/dist/dev/playback/behaviors/dom/load-segments.js.map +1 -0
  273. package/dist/dev/playback/behaviors/dom/setup-buffer-actors.js +192 -0
  274. package/dist/dev/playback/behaviors/dom/setup-buffer-actors.js.map +1 -0
  275. package/dist/dev/playback/behaviors/dom/setup-mediasource.js +89 -0
  276. package/dist/dev/playback/behaviors/dom/setup-mediasource.js.map +1 -0
  277. package/dist/dev/playback/behaviors/dom/setup-text-track-actors.d.ts +31 -0
  278. package/dist/dev/playback/behaviors/dom/setup-text-track-actors.d.ts.map +1 -0
  279. package/dist/dev/playback/behaviors/dom/setup-text-track-actors.js +54 -0
  280. package/dist/dev/playback/behaviors/dom/setup-text-track-actors.js.map +1 -0
  281. package/dist/dev/playback/behaviors/dom/sync-text-tracks.js +124 -0
  282. package/dist/dev/playback/behaviors/dom/sync-text-tracks.js.map +1 -0
  283. package/dist/dev/playback/behaviors/dom/track-current-time.d.ts +34 -0
  284. package/dist/dev/playback/behaviors/dom/track-current-time.d.ts.map +1 -0
  285. package/dist/dev/playback/behaviors/dom/track-current-time.js +52 -0
  286. package/dist/dev/playback/behaviors/dom/track-current-time.js.map +1 -0
  287. package/dist/dev/playback/behaviors/dom/track-load-triggers.d.ts +48 -0
  288. package/dist/dev/playback/behaviors/dom/track-load-triggers.d.ts.map +1 -0
  289. package/dist/dev/playback/behaviors/dom/track-load-triggers.js +94 -0
  290. package/dist/dev/playback/behaviors/dom/track-load-triggers.js.map +1 -0
  291. package/dist/dev/playback/behaviors/dom/track-playback-rate.d.ts +34 -0
  292. package/dist/dev/playback/behaviors/dom/track-playback-rate.d.ts.map +1 -0
  293. package/dist/dev/playback/behaviors/dom/track-playback-rate.js +37 -0
  294. package/dist/dev/playback/behaviors/dom/track-playback-rate.js.map +1 -0
  295. package/dist/dev/playback/behaviors/dom/update-mediasource-duration.js +90 -0
  296. package/dist/dev/playback/behaviors/dom/update-mediasource-duration.js.map +1 -0
  297. package/dist/dev/playback/behaviors/resolve-presentation.d.ts +7 -0
  298. package/dist/dev/playback/behaviors/resolve-presentation.d.ts.map +1 -0
  299. package/dist/dev/playback/behaviors/resolve-presentation.js +85 -0
  300. package/dist/dev/playback/behaviors/resolve-presentation.js.map +1 -0
  301. package/dist/dev/playback/behaviors/resolve-track.js +120 -0
  302. package/dist/dev/playback/behaviors/resolve-track.js.map +1 -0
  303. package/dist/dev/playback/behaviors/select-tracks.d.ts +13 -0
  304. package/dist/dev/playback/behaviors/select-tracks.d.ts.map +1 -0
  305. package/dist/dev/playback/behaviors/select-tracks.js +101 -0
  306. package/dist/dev/playback/behaviors/select-tracks.js.map +1 -0
  307. package/dist/dev/playback/behaviors/setup-failover-monitor.d.ts +12 -0
  308. package/dist/dev/playback/behaviors/setup-failover-monitor.d.ts.map +1 -0
  309. package/dist/dev/playback/behaviors/setup-failover-monitor.js +66 -0
  310. package/dist/dev/playback/behaviors/setup-failover-monitor.js.map +1 -0
  311. package/dist/dev/playback/behaviors/sync-preload.js +59 -0
  312. package/dist/dev/playback/behaviors/sync-preload.js.map +1 -0
  313. package/dist/dev/playback/behaviors/track-switching.js +341 -0
  314. package/dist/dev/playback/behaviors/track-switching.js.map +1 -0
  315. package/dist/dev/playback/engines/background-video/adapter.d.ts +60 -0
  316. package/dist/dev/playback/engines/background-video/adapter.d.ts.map +1 -0
  317. package/dist/dev/playback/engines/background-video/adapter.js +158 -0
  318. package/dist/dev/playback/engines/background-video/adapter.js.map +1 -0
  319. package/dist/dev/playback/engines/background-video/engine.d.ts +107 -0
  320. package/dist/dev/playback/engines/background-video/engine.d.ts.map +1 -0
  321. package/dist/dev/playback/engines/background-video/engine.js +75 -0
  322. package/dist/dev/playback/engines/background-video/engine.js.map +1 -0
  323. package/dist/dev/playback/engines/hls/adapter-audio-only.d.ts +45 -0
  324. package/dist/dev/playback/engines/hls/adapter-audio-only.d.ts.map +1 -0
  325. package/dist/dev/playback/engines/hls/adapter-audio-only.js +119 -0
  326. package/dist/dev/playback/engines/hls/adapter-audio-only.js.map +1 -0
  327. package/dist/dev/{dom/playback-engine → playback/engines/hls}/adapter.d.ts +13 -12
  328. package/dist/dev/playback/engines/hls/adapter.d.ts.map +1 -0
  329. package/dist/dev/{dom/playback-engine → playback/engines/hls}/adapter.js +40 -26
  330. package/dist/dev/playback/engines/hls/adapter.js.map +1 -0
  331. package/dist/dev/playback/engines/hls/engine-audio-only.d.ts +127 -0
  332. package/dist/dev/playback/engines/hls/engine-audio-only.d.ts.map +1 -0
  333. package/dist/dev/playback/engines/hls/engine-audio-only.js +80 -0
  334. package/dist/dev/playback/engines/hls/engine-audio-only.js.map +1 -0
  335. package/dist/dev/playback/engines/hls/engine.d.ts +236 -0
  336. package/dist/dev/playback/engines/hls/engine.d.ts.map +1 -0
  337. package/dist/dev/playback/engines/hls/engine.js +115 -0
  338. package/dist/dev/playback/engines/hls/engine.js.map +1 -0
  339. package/dist/dev/playback/primitives/failover-fetch.js +42 -0
  340. package/dist/dev/playback/primitives/failover-fetch.js.map +1 -0
  341. package/dist/dev/playback/primitives/track-types.js +61 -0
  342. package/dist/dev/playback/primitives/track-types.js.map +1 -0
  343. package/package.json +12 -7
  344. package/dist/default/core/abr/bandwidth-estimator.js.map +0 -1
  345. package/dist/default/core/abr/ewma.js.map +0 -1
  346. package/dist/default/core/abr/quality-selection.js +0 -53
  347. package/dist/default/core/abr/quality-selection.js.map +0 -1
  348. package/dist/default/core/buffer/back-buffer.js.map +0 -1
  349. package/dist/default/core/buffer/forward-buffer.js.map +0 -1
  350. package/dist/default/core/create-machine-actor.js.map +0 -1
  351. package/dist/default/core/create-machine-reactor.js.map +0 -1
  352. package/dist/default/core/create-transition-actor.js.map +0 -1
  353. package/dist/default/core/features/calculate-presentation-duration.js +0 -53
  354. package/dist/default/core/features/calculate-presentation-duration.js.map +0 -1
  355. package/dist/default/core/features/quality-switching.js +0 -69
  356. package/dist/default/core/features/quality-switching.js.map +0 -1
  357. package/dist/default/core/features/resolve-presentation.js +0 -73
  358. package/dist/default/core/features/resolve-presentation.js.map +0 -1
  359. package/dist/default/core/features/resolve-track.js +0 -66
  360. package/dist/default/core/features/resolve-track.js.map +0 -1
  361. package/dist/default/core/features/select-tracks.js +0 -130
  362. package/dist/default/core/features/select-tracks.js.map +0 -1
  363. package/dist/default/core/features/sync-preload-attribute.js +0 -26
  364. package/dist/default/core/features/sync-preload-attribute.js.map +0 -1
  365. package/dist/default/core/hls/parse-attributes.js.map +0 -1
  366. package/dist/default/core/hls/parse-media-playlist.js.map +0 -1
  367. package/dist/default/core/hls/parse-multivariant.js.map +0 -1
  368. package/dist/default/core/hls/resolve-url.js.map +0 -1
  369. package/dist/default/core/task.js.map +0 -1
  370. package/dist/default/core/types/index.js +0 -15
  371. package/dist/default/core/types/index.js.map +0 -1
  372. package/dist/default/core/utils/generate-id.js +0 -21
  373. package/dist/default/core/utils/generate-id.js.map +0 -1
  374. package/dist/default/core/utils/track-selection.js +0 -39
  375. package/dist/default/core/utils/track-selection.js.map +0 -1
  376. package/dist/default/dom/features/end-of-stream.js +0 -145
  377. package/dist/default/dom/features/end-of-stream.js.map +0 -1
  378. package/dist/default/dom/features/load-segments.js +0 -192
  379. package/dist/default/dom/features/load-segments.js.map +0 -1
  380. package/dist/default/dom/features/load-text-track-cues.js +0 -104
  381. package/dist/default/dom/features/load-text-track-cues.js.map +0 -1
  382. package/dist/default/dom/features/segment-loader-actor.js.map +0 -1
  383. package/dist/default/dom/features/setup-mediasource.js +0 -48
  384. package/dist/default/dom/features/setup-mediasource.js.map +0 -1
  385. package/dist/default/dom/features/setup-sourcebuffer.js +0 -78
  386. package/dist/default/dom/features/setup-sourcebuffer.js.map +0 -1
  387. package/dist/default/dom/features/sync-text-tracks.js +0 -95
  388. package/dist/default/dom/features/sync-text-tracks.js.map +0 -1
  389. package/dist/default/dom/features/text-track-segment-loader-actor.js +0 -55
  390. package/dist/default/dom/features/text-track-segment-loader-actor.js.map +0 -1
  391. package/dist/default/dom/features/text-tracks-actor.js.map +0 -1
  392. package/dist/default/dom/features/track-current-time.js +0 -49
  393. package/dist/default/dom/features/track-current-time.js.map +0 -1
  394. package/dist/default/dom/features/track-playback-initiated.js +0 -66
  395. package/dist/default/dom/features/track-playback-initiated.js.map +0 -1
  396. package/dist/default/dom/features/track-playback-rate.js +0 -32
  397. package/dist/default/dom/features/track-playback-rate.js.map +0 -1
  398. package/dist/default/dom/features/update-duration.js +0 -78
  399. package/dist/default/dom/features/update-duration.js.map +0 -1
  400. package/dist/default/dom/media/append-segment.js.map +0 -1
  401. package/dist/default/dom/media/buffer-flusher.js.map +0 -1
  402. package/dist/default/dom/media/mediasource-setup.js.map +0 -1
  403. package/dist/default/dom/media/source-buffer-actor.js.map +0 -1
  404. package/dist/default/dom/network/chunked-stream-iterable.js.map +0 -1
  405. package/dist/default/dom/network/fetch.js +0 -54
  406. package/dist/default/dom/network/fetch.js.map +0 -1
  407. package/dist/default/dom/playback-engine/adapter.js.map +0 -1
  408. package/dist/default/dom/playback-engine/engine.js +0 -142
  409. package/dist/default/dom/playback-engine/engine.js.map +0 -1
  410. package/dist/default/dom/playback-engine.js +0 -4
  411. package/dist/default/dom/text/parse-vtt-segment.js.map +0 -1
  412. package/dist/dev/core/abr/bandwidth-estimator.d.ts.map +0 -1
  413. package/dist/dev/core/abr/bandwidth-estimator.js.map +0 -1
  414. package/dist/dev/core/abr/ewma.js.map +0 -1
  415. package/dist/dev/core/abr/quality-selection.js +0 -53
  416. package/dist/dev/core/abr/quality-selection.js.map +0 -1
  417. package/dist/dev/core/actor.d.ts.map +0 -1
  418. package/dist/dev/core/buffer/back-buffer.js.map +0 -1
  419. package/dist/dev/core/buffer/forward-buffer.js.map +0 -1
  420. package/dist/dev/core/create-machine-actor.d.ts +0 -12
  421. package/dist/dev/core/create-machine-actor.d.ts.map +0 -1
  422. package/dist/dev/core/create-machine-actor.js.map +0 -1
  423. package/dist/dev/core/create-machine-reactor.d.ts +0 -8
  424. package/dist/dev/core/create-machine-reactor.d.ts.map +0 -1
  425. package/dist/dev/core/create-machine-reactor.js.map +0 -1
  426. package/dist/dev/core/create-transition-actor.d.ts +0 -23
  427. package/dist/dev/core/create-transition-actor.d.ts.map +0 -1
  428. package/dist/dev/core/create-transition-actor.js.map +0 -1
  429. package/dist/dev/core/features/calculate-presentation-duration.js +0 -53
  430. package/dist/dev/core/features/calculate-presentation-duration.js.map +0 -1
  431. package/dist/dev/core/features/quality-switching.js +0 -69
  432. package/dist/dev/core/features/quality-switching.js.map +0 -1
  433. package/dist/dev/core/features/resolve-presentation.js +0 -73
  434. package/dist/dev/core/features/resolve-presentation.js.map +0 -1
  435. package/dist/dev/core/features/resolve-track.js +0 -66
  436. package/dist/dev/core/features/resolve-track.js.map +0 -1
  437. package/dist/dev/core/features/select-tracks.js +0 -130
  438. package/dist/dev/core/features/select-tracks.js.map +0 -1
  439. package/dist/dev/core/features/sync-preload-attribute.js +0 -26
  440. package/dist/dev/core/features/sync-preload-attribute.js.map +0 -1
  441. package/dist/dev/core/hls/parse-attributes.js.map +0 -1
  442. package/dist/dev/core/hls/parse-media-playlist.js.map +0 -1
  443. package/dist/dev/core/hls/parse-multivariant.js.map +0 -1
  444. package/dist/dev/core/hls/resolve-url.js.map +0 -1
  445. package/dist/dev/core/task.js.map +0 -1
  446. package/dist/dev/core/types/index.d.ts.map +0 -1
  447. package/dist/dev/core/types/index.js +0 -15
  448. package/dist/dev/core/types/index.js.map +0 -1
  449. package/dist/dev/core/utils/generate-id.js +0 -21
  450. package/dist/dev/core/utils/generate-id.js.map +0 -1
  451. package/dist/dev/core/utils/track-selection.d.ts +0 -16
  452. package/dist/dev/core/utils/track-selection.d.ts.map +0 -1
  453. package/dist/dev/core/utils/track-selection.js +0 -39
  454. package/dist/dev/core/utils/track-selection.js.map +0 -1
  455. package/dist/dev/dom/features/end-of-stream.js +0 -145
  456. package/dist/dev/dom/features/end-of-stream.js.map +0 -1
  457. package/dist/dev/dom/features/load-segments.d.ts +0 -72
  458. package/dist/dev/dom/features/load-segments.d.ts.map +0 -1
  459. package/dist/dev/dom/features/load-segments.js +0 -192
  460. package/dist/dev/dom/features/load-segments.js.map +0 -1
  461. package/dist/dev/dom/features/load-text-track-cues.d.ts +0 -85
  462. package/dist/dev/dom/features/load-text-track-cues.d.ts.map +0 -1
  463. package/dist/dev/dom/features/load-text-track-cues.js +0 -104
  464. package/dist/dev/dom/features/load-text-track-cues.js.map +0 -1
  465. package/dist/dev/dom/features/segment-loader-actor.d.ts +0 -1
  466. package/dist/dev/dom/features/segment-loader-actor.js.map +0 -1
  467. package/dist/dev/dom/features/setup-mediasource.js +0 -48
  468. package/dist/dev/dom/features/setup-mediasource.js.map +0 -1
  469. package/dist/dev/dom/features/setup-sourcebuffer.d.ts +0 -9
  470. package/dist/dev/dom/features/setup-sourcebuffer.d.ts.map +0 -1
  471. package/dist/dev/dom/features/setup-sourcebuffer.js +0 -78
  472. package/dist/dev/dom/features/setup-sourcebuffer.js.map +0 -1
  473. package/dist/dev/dom/features/sync-text-tracks.js +0 -95
  474. package/dist/dev/dom/features/sync-text-tracks.js.map +0 -1
  475. package/dist/dev/dom/features/text-track-segment-loader-actor.d.ts +0 -12
  476. package/dist/dev/dom/features/text-track-segment-loader-actor.d.ts.map +0 -1
  477. package/dist/dev/dom/features/text-track-segment-loader-actor.js +0 -55
  478. package/dist/dev/dom/features/text-track-segment-loader-actor.js.map +0 -1
  479. package/dist/dev/dom/features/text-tracks-actor.d.ts +0 -31
  480. package/dist/dev/dom/features/text-tracks-actor.d.ts.map +0 -1
  481. package/dist/dev/dom/features/text-tracks-actor.js.map +0 -1
  482. package/dist/dev/dom/features/track-current-time.d.ts +0 -40
  483. package/dist/dev/dom/features/track-current-time.d.ts.map +0 -1
  484. package/dist/dev/dom/features/track-current-time.js +0 -49
  485. package/dist/dev/dom/features/track-current-time.js.map +0 -1
  486. package/dist/dev/dom/features/track-playback-initiated.d.ts +0 -46
  487. package/dist/dev/dom/features/track-playback-initiated.d.ts.map +0 -1
  488. package/dist/dev/dom/features/track-playback-initiated.js +0 -66
  489. package/dist/dev/dom/features/track-playback-initiated.js.map +0 -1
  490. package/dist/dev/dom/features/track-playback-rate.d.ts +0 -34
  491. package/dist/dev/dom/features/track-playback-rate.d.ts.map +0 -1
  492. package/dist/dev/dom/features/track-playback-rate.js +0 -32
  493. package/dist/dev/dom/features/track-playback-rate.js.map +0 -1
  494. package/dist/dev/dom/features/update-duration.js +0 -78
  495. package/dist/dev/dom/features/update-duration.js.map +0 -1
  496. package/dist/dev/dom/media/append-segment.d.ts.map +0 -1
  497. package/dist/dev/dom/media/append-segment.js.map +0 -1
  498. package/dist/dev/dom/media/buffer-flusher.d.ts.map +0 -1
  499. package/dist/dev/dom/media/buffer-flusher.js.map +0 -1
  500. package/dist/dev/dom/media/mediasource-setup.js.map +0 -1
  501. package/dist/dev/dom/media/source-buffer-actor.d.ts.map +0 -1
  502. package/dist/dev/dom/media/source-buffer-actor.js.map +0 -1
  503. package/dist/dev/dom/network/chunked-stream-iterable.js.map +0 -1
  504. package/dist/dev/dom/network/fetch.js +0 -54
  505. package/dist/dev/dom/network/fetch.js.map +0 -1
  506. package/dist/dev/dom/playback-engine/adapter.d.ts.map +0 -1
  507. package/dist/dev/dom/playback-engine/adapter.js.map +0 -1
  508. package/dist/dev/dom/playback-engine/engine.d.ts +0 -124
  509. package/dist/dev/dom/playback-engine/engine.d.ts.map +0 -1
  510. package/dist/dev/dom/playback-engine/engine.js +0 -142
  511. package/dist/dev/dom/playback-engine/engine.js.map +0 -1
  512. package/dist/dev/dom/playback-engine.d.ts +0 -4
  513. package/dist/dev/dom/playback-engine.js +0 -4
  514. package/dist/dev/dom/text/parse-vtt-segment.d.ts +0 -12
  515. package/dist/dev/dom/text/parse-vtt-segment.d.ts.map +0 -1
  516. package/dist/dev/dom/text/parse-vtt-segment.js.map +0 -1
@@ -1,7 +1,6 @@
1
- import { update } from "../../core/signals/primitives.js";
2
- import { createPlaybackEngine } from "./engine.js";
3
- //#region src/dom/playback-engine/adapter.ts
4
- const spfMediaDefaultProps = {
1
+ import { createSimpleHlsEngine } from "./engine.js";
2
+ //#region src/playback/engines/hls/adapter.ts
3
+ const simpleHlsMediaDefaultProps = {
5
4
  src: "",
6
5
  preload: ""
7
6
  };
@@ -17,64 +16,72 @@ const spfMediaDefaultProps = {
17
16
  * changes and re-applied to the new engine automatically.
18
17
  *
19
18
  * @example
20
- * class SimpleHlsMedia extends SpfMediaMixin(HTMLVideoElementHost) {}
19
+ * class SimpleHlsMedia extends SimpleHlsMediaMixin(HTMLVideoElementHost) {}
21
20
  *
22
21
  * const media = new SimpleHlsMedia();
23
22
  * media.attach(document.querySelector('video'));
24
23
  * media.src = 'https://stream.mux.com/abc123.m3u8';
25
24
  */
26
- function SpfMediaMixin(BaseClass) {
27
- class SpfMediaImpl extends BaseClass {
25
+ function SimpleHlsMediaMixin(BaseClass) {
26
+ class SimpleHlsMediaImpl extends BaseClass {
28
27
  #engine;
29
28
  #config;
30
- #preload = spfMediaDefaultProps.preload;
29
+ #signals;
30
+ #preload = simpleHlsMediaDefaultProps.preload;
31
31
  /** Pending loadstart listener from a deferred play() retry, if any. */
32
32
  #loadstartListener = null;
33
33
  constructor(...args) {
34
34
  super(...args);
35
35
  const { config } = args?.[0] ?? {};
36
36
  this.#config = config;
37
- this.#engine = createPlaybackEngine(config);
37
+ this.#engine = this.#createEngine();
38
38
  }
39
+ /**
40
+ * Underlying playback engine — the low-level SPF reactive composition that
41
+ * drives playback. An advanced escape hatch for direct engine access;
42
+ * normal playback is driven through this element's own properties and
43
+ * methods.
44
+ */
39
45
  get engine() {
40
46
  return this.#engine;
41
47
  }
42
48
  attach(mediaElement) {
43
49
  super.attach?.(mediaElement);
44
- update(this.#engine.owners, { mediaElement });
50
+ this.#signals.context.mediaElement.set(mediaElement);
45
51
  }
46
52
  detach() {
47
53
  this.#cancelPendingPlay();
48
- update(this.#engine.owners, { mediaElement: void 0 });
54
+ this.#signals.context.mediaElement.set(void 0);
49
55
  super.detach?.();
50
56
  }
51
57
  destroy() {
52
58
  this.#cancelPendingPlay();
53
59
  this.#engine.destroy();
54
60
  }
61
+ /** Preload type (`'none'` / `'metadata'` / `'auto'`). */
55
62
  get preload() {
56
63
  return this.#preload;
57
64
  }
58
65
  set preload(value) {
59
66
  this.#preload = value;
60
- if (value) update(this.#engine.state, { preload: value });
67
+ if (value) this.#signals.state.preload.set(value);
61
68
  }
62
69
  get src() {
63
- return this.#engine.state.get().presentation?.url ?? "";
70
+ return this.#signals.state.presentation.get()?.url ?? "";
64
71
  }
65
72
  set src(value) {
66
- const prevMediaElement = this.#engine.owners.get().mediaElement;
73
+ const prevMediaElement = this.#signals.context.mediaElement.get();
67
74
  this.#cancelPendingPlay();
68
75
  this.#engine.destroy();
69
- this.#engine = createPlaybackEngine(this.#config);
70
- if (this.#preload) update(this.#engine.state, { preload: this.#preload });
71
- if (prevMediaElement) update(this.#engine.owners, { mediaElement: prevMediaElement });
72
- if (value) update(this.#engine.state, { presentation: { url: value } });
76
+ this.#engine = this.#createEngine();
77
+ if (this.#preload) this.#signals.state.preload.set(this.#preload);
78
+ if (prevMediaElement) this.#signals.context.mediaElement.set(prevMediaElement);
79
+ if (value) this.#signals.state.presentation.set({ url: value });
73
80
  }
74
81
  play() {
75
- const { mediaElement } = this.#engine.owners.get();
76
- if (!mediaElement) return Promise.reject(/* @__PURE__ */ new Error("SpfMedia: no media element attached"));
77
- update(this.#engine.state, { playbackInitiated: true });
82
+ const mediaElement = this.#signals.context.mediaElement.get();
83
+ if (!mediaElement) return Promise.reject(/* @__PURE__ */ new Error("SimpleHlsMediaElement: no media element attached"));
84
+ this.#signals.state.loadActivated.set(true);
78
85
  return mediaElement.play().catch((err) => {
79
86
  if (this.src) return new Promise((resolve, reject) => {
80
87
  const listener = () => {
@@ -87,18 +94,25 @@ function SpfMediaMixin(BaseClass) {
87
94
  throw err;
88
95
  });
89
96
  }
97
+ #createEngine() {
98
+ return createSimpleHlsEngine({
99
+ ...this.#config,
100
+ onSignalsReady: (signals) => {
101
+ this.#signals = signals;
102
+ }
103
+ });
104
+ }
90
105
  #cancelPendingPlay() {
91
106
  if (!this.#loadstartListener) return;
92
- const { mediaElement } = this.#engine.owners.get();
93
- mediaElement?.removeEventListener("loadstart", this.#loadstartListener);
107
+ this.#signals.context.mediaElement.get()?.removeEventListener("loadstart", this.#loadstartListener);
94
108
  this.#loadstartListener = null;
95
109
  }
96
110
  }
97
- return SpfMediaImpl;
111
+ return SimpleHlsMediaImpl;
98
112
  }
99
113
  /** Standalone SPF media adapter with no base class. */
100
- var SpfMedia = class extends SpfMediaMixin(class {}) {};
114
+ var SimpleHlsMediaElement = class extends SimpleHlsMediaMixin(class {}) {};
101
115
  //#endregion
102
- export { SpfMedia, SpfMediaMixin, spfMediaDefaultProps };
116
+ export { SimpleHlsMediaElement, SimpleHlsMediaMixin, simpleHlsMediaDefaultProps };
103
117
 
104
118
  //# sourceMappingURL=adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.js","names":["#config","#engine","#createEngine","#signals","#cancelPendingPlay","#preload","#loadstartListener"],"sources":["../../../../../src/playback/engines/hls/adapter.ts"],"sourcesContent":["import type { Constructor, MixinReturn } from '@videojs/utils/types';\nimport type { Composition } from '../../../core/composition/create-composition';\nimport {\n createSimpleHlsEngine,\n type SimpleHlsEngineConfig,\n type SimpleHlsEngineContext,\n type SimpleHlsEngineSignals,\n type SimpleHlsEngineState,\n} from './engine';\n\nexport interface SimpleHlsMediaProps {\n src: string;\n preload: '' | 'none' | 'metadata' | 'auto';\n}\n\nexport const simpleHlsMediaDefaultProps: SimpleHlsMediaProps = {\n src: '',\n preload: '',\n};\n\nexport interface SimpleHlsMediaAPI extends SimpleHlsMediaProps {\n readonly engine: Composition<SimpleHlsEngineState, SimpleHlsEngineContext>;\n attach(mediaElement: HTMLMediaElement): void;\n detach(): void;\n destroy(): void;\n play(): Promise<void>;\n}\n\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 new engine is created on every src assignment — this fully tears down all\n * state, SourceBuffers, and in-flight requests from the previous source before\n * the next one begins. The media element reference is preserved across src\n * changes and re-applied to the new engine automatically.\n *\n * @example\n * class SimpleHlsMedia extends SimpleHlsMediaMixin(HTMLVideoElementHost) {}\n *\n * const media = new SimpleHlsMedia();\n * media.attach(document.querySelector('video'));\n * media.src = 'https://stream.mux.com/abc123.m3u8';\n */\nexport function SimpleHlsMediaMixin<Base extends Constructor<any>>(BaseClass: Base) {\n class SimpleHlsMediaImpl extends BaseClass {\n #engine: Composition<SimpleHlsEngineState, SimpleHlsEngineContext>;\n #config: SimpleHlsEngineConfig;\n #signals!: SimpleHlsEngineSignals;\n #preload: '' | 'none' | 'metadata' | 'auto' = simpleHlsMediaDefaultProps.preload;\n\n /** Pending loadstart listener from a deferred play() retry, if any. */\n #loadstartListener: (() => void) | null = null;\n\n constructor(...args: any[]) {\n super(...args);\n\n const { config } = args?.[0] ?? {};\n this.#config = config;\n this.#engine = this.#createEngine();\n }\n\n /**\n * Underlying playback engine — the low-level SPF reactive composition that\n * drives playback. An advanced escape hatch for direct engine access;\n * normal playback is driven through this element's own properties and\n * methods.\n */\n get engine(): Composition<SimpleHlsEngineState, SimpleHlsEngineContext> {\n return this.#engine;\n }\n\n // -------------------------------------------------------------------------\n // Media element lifecycle\n // -------------------------------------------------------------------------\n\n attach(mediaElement: HTMLMediaElement): void {\n super.attach?.(mediaElement);\n this.#signals.context.mediaElement.set(mediaElement);\n }\n\n detach(): void {\n this.#cancelPendingPlay();\n this.#signals.context.mediaElement.set(undefined);\n super.detach?.();\n }\n\n destroy(): void {\n this.#cancelPendingPlay();\n this.#engine.destroy();\n }\n\n // -------------------------------------------------------------------------\n // preload — synchronous IDL attribute (WHATWG §4.8.11.2)\n // -------------------------------------------------------------------------\n\n /** Preload type (`'none'` / `'metadata'` / `'auto'`). */\n get preload(): '' | 'none' | 'metadata' | 'auto' {\n return this.#preload;\n }\n\n set preload(value: '' | 'none' | 'metadata' | 'auto') {\n this.#preload = value;\n if (value) {\n this.#signals.state.preload.set(value);\n }\n // value = '' clears #preload (so the next engine recreation won't re-apply\n // an explicit value) but does not patch current state — the existing preload\n // stays in effect until the next src change creates a fresh engine.\n }\n\n // -------------------------------------------------------------------------\n // src — synchronous IDL attribute (WHATWG §4.8.11.2)\n // Each assignment destroys the current engine and starts a fresh one, exactly\n // as the browser's load algorithm resets all media element state on src change.\n // -------------------------------------------------------------------------\n\n get src(): string {\n return this.#signals.state.presentation.get()?.url ?? '';\n }\n\n set src(value: string) {\n const prevMediaElement = this.#signals.context.mediaElement.get();\n\n this.#cancelPendingPlay();\n this.#engine.destroy();\n this.#engine = this.#createEngine();\n\n // Apply explicit preload before setting context so it's already in\n // state.preload when syncPreload's read effect runs on the attach —\n // the read effect only overwrites when the element's `preload` is a\n // W3C value (which a freshly-created <video> with no attribute is not).\n if (this.#preload) {\n this.#signals.state.preload.set(this.#preload);\n }\n\n if (prevMediaElement) {\n this.#signals.context.mediaElement.set(prevMediaElement);\n }\n\n if (value) {\n this.#signals.state.presentation.set({ url: value });\n }\n }\n\n // -------------------------------------------------------------------------\n // play() — WHATWG §4.8.11.8\n // Delegates to the attached media element's native play().\n // -------------------------------------------------------------------------\n\n play(): Promise<void> {\n const mediaElement = this.#signals.context.mediaElement.get();\n if (!mediaElement) {\n return Promise.reject(new Error('SimpleHlsMediaElement: no media element attached'));\n }\n\n // Signal play intent — enables loading even with preload=\"none\"\n this.#signals.state.loadActivated.set(true);\n\n return mediaElement.play().catch((err: unknown) => {\n // If we have a pending HLS source, the rejection may be because MSE\n // hasn't attached a blob URL yet. Wait for loadstart (src assigned\n // by MSE setup) and retry once.\n if (this.src) {\n return new Promise<void>((resolve, reject) => {\n const listener = () => {\n this.#loadstartListener = null;\n mediaElement.play().then(resolve, reject);\n };\n this.#loadstartListener = listener;\n mediaElement.addEventListener('loadstart', listener, { once: true });\n });\n }\n throw err;\n });\n }\n\n // -------------------------------------------------------------------------\n // Private\n // -------------------------------------------------------------------------\n\n #createEngine(): Composition<SimpleHlsEngineState, SimpleHlsEngineContext> {\n return createSimpleHlsEngine({\n ...this.#config,\n onSignalsReady: (signals) => {\n this.#signals = signals;\n },\n });\n }\n\n #cancelPendingPlay(): void {\n if (!this.#loadstartListener) return;\n const mediaElement = this.#signals.context.mediaElement.get();\n mediaElement?.removeEventListener('loadstart', this.#loadstartListener);\n this.#loadstartListener = null;\n }\n }\n\n return SimpleHlsMediaImpl as unknown as MixinReturn<Base, SimpleHlsMediaAPI>;\n}\n\n/** Standalone SPF media adapter with no base class. */\nexport class SimpleHlsMediaElement extends SimpleHlsMediaMixin(class {}) {}\n"],"mappings":";;AAeA,MAAa,6BAAkD;CAC7D,KAAK;CACL,SAAS;CACV;;;;;;;;;;;;;;;;;;;AA4BD,SAAgB,oBAAmD,WAAiB;CAClF,MAAM,2BAA2B,UAAU;EACzC;EACA;EACA;EACA,WAA8C,2BAA2B;;EAGzE,qBAA0C;EAE1C,YAAY,GAAG,MAAa;AAC1B,SAAM,GAAG,KAAK;GAEd,MAAM,EAAE,WAAW,OAAO,MAAM,EAAE;AAClC,SAAA,SAAe;AACf,SAAA,SAAe,MAAA,cAAoB;;;;;;;;EASrC,IAAI,SAAoE;AACtE,UAAO,MAAA;;EAOT,OAAO,cAAsC;AAC3C,SAAM,SAAS,aAAa;AAC5B,SAAA,QAAc,QAAQ,aAAa,IAAI,aAAa;;EAGtD,SAAe;AACb,SAAA,mBAAyB;AACzB,SAAA,QAAc,QAAQ,aAAa,IAAI,KAAA,EAAU;AACjD,SAAM,UAAU;;EAGlB,UAAgB;AACd,SAAA,mBAAyB;AACzB,SAAA,OAAa,SAAS;;;EAQxB,IAAI,UAA6C;AAC/C,UAAO,MAAA;;EAGT,IAAI,QAAQ,OAA0C;AACpD,SAAA,UAAgB;AAChB,OAAI,MACF,OAAA,QAAc,MAAM,QAAQ,IAAI,MAAM;;EAa1C,IAAI,MAAc;AAChB,UAAO,MAAA,QAAc,MAAM,aAAa,KAAK,EAAE,OAAO;;EAGxD,IAAI,IAAI,OAAe;GACrB,MAAM,mBAAmB,MAAA,QAAc,QAAQ,aAAa,KAAK;AAEjE,SAAA,mBAAyB;AACzB,SAAA,OAAa,SAAS;AACtB,SAAA,SAAe,MAAA,cAAoB;AAMnC,OAAI,MAAA,QACF,OAAA,QAAc,MAAM,QAAQ,IAAI,MAAA,QAAc;AAGhD,OAAI,iBACF,OAAA,QAAc,QAAQ,aAAa,IAAI,iBAAiB;AAG1D,OAAI,MACF,OAAA,QAAc,MAAM,aAAa,IAAI,EAAE,KAAK,OAAO,CAAC;;EASxD,OAAsB;GACpB,MAAM,eAAe,MAAA,QAAc,QAAQ,aAAa,KAAK;AAC7D,OAAI,CAAC,aACH,QAAO,QAAQ,uBAAO,IAAI,MAAM,mDAAmD,CAAC;AAItF,SAAA,QAAc,MAAM,cAAc,IAAI,KAAK;AAE3C,UAAO,aAAa,MAAM,CAAC,OAAO,QAAiB;AAIjD,QAAI,KAAK,IACP,QAAO,IAAI,SAAe,SAAS,WAAW;KAC5C,MAAM,iBAAiB;AACrB,YAAA,oBAA0B;AAC1B,mBAAa,MAAM,CAAC,KAAK,SAAS,OAAO;;AAE3C,WAAA,oBAA0B;AAC1B,kBAAa,iBAAiB,aAAa,UAAU,EAAE,MAAM,MAAM,CAAC;MACpE;AAEJ,UAAM;KACN;;EAOJ,gBAA2E;AACzE,UAAO,sBAAsB;IAC3B,GAAG,MAAA;IACH,iBAAiB,YAAY;AAC3B,WAAA,UAAgB;;IAEnB,CAAC;;EAGJ,qBAA2B;AACzB,OAAI,CAAC,MAAA,kBAAyB;AACT,SAAA,QAAc,QAAQ,aAAa,KAAK,EAC/C,oBAAoB,aAAa,MAAA,kBAAwB;AACvE,SAAA,oBAA0B;;;AAI9B,QAAO;;;AAIT,IAAa,wBAAb,cAA2C,oBAAoB,MAAM,GAAG,CAAC"}
@@ -0,0 +1,127 @@
1
+ import { Composition, ContextSignals, StateSignals } from "../../../core/composition/create-composition.js";
2
+ import { ShareSignalsConfig } from "../../../core/composition/share-signals.js";
3
+ import { AudioTrack, CanPlayTrack, MaybeResolvedPresentation } from "../../../media/types/index.js";
4
+ import { BackBufferConfig } from "../../../media/buffer/back-buffer.js";
5
+ import { ForwardBufferConfig } from "../../../media/buffer/forward-buffer.js";
6
+ import { SourceBufferActor } from "../../actors/dom/source-buffer.js";
7
+ import { SegmentLoaderActor } from "../../actors/dom/segment-loader.js";
8
+ import { ParsePresentation } from "../../behaviors/resolve-presentation.js";
9
+ import { GetCdnId } from "../../../media/utils/cdn.js";
10
+ import { PresentationDurationResolver } from "../../behaviors/calculate-presentation-duration.js";
11
+ import { FailoverMonitorConfig } from "../../behaviors/setup-failover-monitor.js";
12
+
13
+ //#region src/playback/engines/hls/engine-audio-only.d.ts
14
+ /**
15
+ * State shape for the audio-only HLS playback engine.
16
+ *
17
+ * Subset of `SimpleHlsEngineState` covering only the slots written and read
18
+ * by audio-side behaviors. Video and text-track slots are absent —
19
+ * subtractive composition removes the behaviors that declare them.
20
+ */
21
+ interface SimpleHlsAudioOnlyEngineState {
22
+ presentation?: MaybeResolvedPresentation;
23
+ preload?: 'auto' | 'metadata' | 'none';
24
+ selectedAudioTrackId?: string;
25
+ /**
26
+ * Consumer-driven constraint narrowing the audio candidate set. Sibling
27
+ * of `userVideoTrackSelection` in the default engine. Partial-track
28
+ * shape — `{ language: 'es' }`, `{ id: 'audio-en' }`, etc.
29
+ * `selectAudioTrack` reads this and re-picks when it changes.
30
+ * Multi-language-audio Tier 2 programmatic-write path.
31
+ */
32
+ userAudioTrackSelection?: Partial<AudioTrack>;
33
+ /**
34
+ * The CDNs the source is served from, in manifest priority order (mirrors
35
+ * HLS content steering's `PATHWAY-PRIORITY`). Owned by `deriveCdnPriority`,
36
+ * read by `track-switching`'s `preferActiveCdn` scope. Only meaningful for
37
+ * redundant-stream sources; a single-CDN source has one entry.
38
+ */
39
+ cdnPriority?: string[];
40
+ /**
41
+ * CDN ids currently in failover cooldown — read by `track-switching`'s
42
+ * `excludeFailedCdns` constraint, which prunes their tracks so the active-CDN
43
+ * scope falls to the next CDN. Empty / absent means all CDNs are eligible.
44
+ */
45
+ failedCdns?: string[];
46
+ currentTime?: number;
47
+ loadActivated?: boolean;
48
+ }
49
+ /**
50
+ * Context shape for the audio-only HLS playback engine.
51
+ *
52
+ * Subset of `SimpleHlsEngineContext` covering only the platform objects and
53
+ * actor refs managed by audio-side behaviors.
54
+ */
55
+ interface SimpleHlsAudioOnlyEngineContext {
56
+ mediaElement?: HTMLMediaElement | undefined;
57
+ mediaSource?: MediaSource;
58
+ audioBufferActor?: SourceBufferActor;
59
+ audioSegmentLoaderActor?: SegmentLoaderActor;
60
+ }
61
+ type SimpleHlsAudioOnlyEngineSignals = {
62
+ state: StateSignals<SimpleHlsAudioOnlyEngineState>;
63
+ context: ContextSignals<SimpleHlsAudioOnlyEngineContext>;
64
+ };
65
+ /**
66
+ * Configuration for the audio-only HLS playback engine.
67
+ *
68
+ * Subset of `SimpleHlsEngineConfig` — video-quality, bandwidth-estimator,
69
+ * and text-track config fields are omitted (no behavior consumes them).
70
+ */
71
+ interface SimpleHlsAudioOnlyEngineConfig extends ShareSignalsConfig<SimpleHlsAudioOnlyEngineState, SimpleHlsAudioOnlyEngineContext> {
72
+ preferredAudioLanguage?: string;
73
+ /**
74
+ * Codec capability probe read by `track-switching`'s `excludeUnplayableTracks`
75
+ * constraint. Defaults to the `MediaSource.isTypeSupported`-backed
76
+ * `canPlayTrack`; override to force-exclude a codec. Mirrors the default
77
+ * engine — without it, capability probing (and TS / raw-AAC detection) would
78
+ * be inert for audio-only playback.
79
+ */
80
+ canPlayTrack?: CanPlayTrack;
81
+ resolveDuration?: PresentationDurationResolver;
82
+ parsePresentation?: ParsePresentation;
83
+ forwardBuffer?: Partial<ForwardBufferConfig>;
84
+ backBuffer?: Partial<BackBufferConfig>;
85
+ /** Multi-CDN failover monitor tuning. Defaults: `DEFAULT_FAILOVER_MONITOR_CONFIG`. */
86
+ failover?: Partial<FailoverMonitorConfig>;
87
+ /**
88
+ * Derive a CDN grouping key from a track URL (used by `cdnPriority`, the
89
+ * failover trip, and the track-switching CDN rules — one function read by all).
90
+ * Defaults to the URL origin; override to key on e.g. Mux's `cdn=` param.
91
+ */
92
+ getCdnId?: GetCdnId;
93
+ }
94
+ /**
95
+ * Create an audio-only HLS playback engine.
96
+ *
97
+ * Subtractive composition variant of `createSimpleHlsEngine`: omits
98
+ * video-side behaviors (`resolveVideoTrack`, `switchVideoTrack`,
99
+ * `setupVideoBufferActors`, `loadVideoSegments`) and text-track behaviors
100
+ * (`switchTextTrack`, `resolveTextTrack`, `syncTextTracks`,
101
+ * `setupTextTrackActors`, `loadTextTrackSegments`). The remaining audio
102
+ * pipeline composes unchanged.
103
+ *
104
+ * Handles both truly audio-only HLS sources (no video stream-inf) and
105
+ * mixed-AV HLS sources where the audio rendition is selected and video /
106
+ * subtitle renditions are ignored at composition time. The variant decision
107
+ * is encoded by adapter choice; this engine does not branch on source
108
+ * shape.
109
+ *
110
+ * @example
111
+ * ```ts
112
+ * let signals: SimpleHlsAudioOnlyEngineSignals;
113
+ * const engine = createHlsAudioOnlyEngine({
114
+ * preferredAudioLanguage: 'en',
115
+ * onSignalsReady: (refs) => {
116
+ * signals = refs;
117
+ * },
118
+ * });
119
+ *
120
+ * signals.context.mediaElement.set(audioEl);
121
+ * signals.state.presentation.set({ url: 'https://example.com/stream.m3u8' });
122
+ * ```
123
+ */
124
+ declare function createHlsAudioOnlyEngine(config?: SimpleHlsAudioOnlyEngineConfig): Composition<SimpleHlsAudioOnlyEngineState, SimpleHlsAudioOnlyEngineContext>;
125
+ //#endregion
126
+ export { SimpleHlsAudioOnlyEngineConfig, SimpleHlsAudioOnlyEngineContext, SimpleHlsAudioOnlyEngineSignals, SimpleHlsAudioOnlyEngineState, createHlsAudioOnlyEngine };
127
+ //# sourceMappingURL=engine-audio-only.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine-audio-only.d.ts","names":[],"sources":["../../../../../src/playback/engines/hls/engine-audio-only.ts"],"mappings":";;;;;;;;;;;;;;;AA6CA;;;;;UAAiB,6BAAA;EACf,YAAA,GAAe,yBAAA;EACf,OAAA;EACA,oBAAA;EAFe;;;;;;;EAUf,uBAAA,GAA0B,OAAA,CAAQ,UAAA;EAclC;;;;AAUF;;EAjBE,WAAA;EAkBe;;;;;EAZf,UAAA;EACA,WAAA;EACA,aAAA;AAAA;;;;;;;UASe,+BAAA;EACf,YAAA,GAAe,gBAAA;EACf,WAAA,GAAc,WAAA;EACd,gBAAA,GAAmB,iBAAA;EACnB,uBAAA,GAA0B,kBAAA;AAAA;AAAA,KAGhB,+BAAA;EACV,KAAA,EAAO,YAAA,CAAa,6BAAA;EACpB,OAAA,EAAS,cAAA,CAAe,+BAAA;AAAA;;;;;;;UAST,8BAAA,SACP,kBAAA,CAAmB,6BAAA,EAA+B,+BAAA;EAC1D,sBAAA;EAFe;;;;;;;EAUf,YAAA,GAAe,YAAA;EACf,eAAA,GAAkB,4BAAA;EAClB,iBAAA,GAAoB,iBAAA;EACpB,aAAA,GAAgB,OAAA,CAAQ,mBAAA;EACxB,UAAA,GAAa,OAAA,CAAQ,gBAAA;EAEF;EAAnB,QAAA,GAAW,OAAA,CAAQ,qBAAA;EAMR;;;;;EAAX,QAAA,GAAW,QAAA;AAAA;;;;;;;;;;;;;;;;;;;;;AA6Cb;;;;;;;;;;iBAAgB,wBAAA,CACd,MAAA,GAAQ,8BAAA,GACP,WAAA,CAAY,6BAAA,EAA+B,+BAAA"}
@@ -0,0 +1,80 @@
1
+ import { createComposition } from "../../../core/composition/create-composition.js";
2
+ import { makeShareSignals } from "../../../core/composition/share-signals.js";
3
+ import { loadAudioSegments } from "../../behaviors/dom/load-segments.js";
4
+ import { trackCurrentTime } from "../../behaviors/dom/track-current-time.js";
5
+ import { trackLoadTriggers } from "../../behaviors/dom/track-load-triggers.js";
6
+ import { canPlayTrack } from "../../../media/dom/capabilities.js";
7
+ import { parseMultivariantPlaylist } from "../../../media/hls/parse-multivariant.js";
8
+ import { getResolvedSelectedTrackDuration } from "../../../media/utils/track-selection.js";
9
+ import { calculatePresentationDuration } from "../../behaviors/calculate-presentation-duration.js";
10
+ import { deriveCdnPriority } from "../../behaviors/derive-cdn-priority.js";
11
+ import { endOfStream } from "../../behaviors/dom/end-of-stream.js";
12
+ import { setupAudioBufferActors } from "../../behaviors/dom/setup-buffer-actors.js";
13
+ import { setupMediaSource } from "../../behaviors/dom/setup-mediasource.js";
14
+ import { updateMediaSourceDuration } from "../../behaviors/dom/update-mediasource-duration.js";
15
+ import { resolvePresentation } from "../../behaviors/resolve-presentation.js";
16
+ import { resolveAudioTrack } from "../../behaviors/resolve-track.js";
17
+ import { setupFailoverMonitor } from "../../behaviors/setup-failover-monitor.js";
18
+ import { syncPreload } from "../../behaviors/sync-preload.js";
19
+ import { switchAudioTrack } from "../../behaviors/track-switching.js";
20
+ //#region src/playback/engines/hls/engine-audio-only.ts
21
+ const shareSignals = makeShareSignals(["userAudioTrackSelection"]);
22
+ /**
23
+ * Create an audio-only HLS playback engine.
24
+ *
25
+ * Subtractive composition variant of `createSimpleHlsEngine`: omits
26
+ * video-side behaviors (`resolveVideoTrack`, `switchVideoTrack`,
27
+ * `setupVideoBufferActors`, `loadVideoSegments`) and text-track behaviors
28
+ * (`switchTextTrack`, `resolveTextTrack`, `syncTextTracks`,
29
+ * `setupTextTrackActors`, `loadTextTrackSegments`). The remaining audio
30
+ * pipeline composes unchanged.
31
+ *
32
+ * Handles both truly audio-only HLS sources (no video stream-inf) and
33
+ * mixed-AV HLS sources where the audio rendition is selected and video /
34
+ * subtitle renditions are ignored at composition time. The variant decision
35
+ * is encoded by adapter choice; this engine does not branch on source
36
+ * shape.
37
+ *
38
+ * @example
39
+ * ```ts
40
+ * let signals: SimpleHlsAudioOnlyEngineSignals;
41
+ * const engine = createHlsAudioOnlyEngine({
42
+ * preferredAudioLanguage: 'en',
43
+ * onSignalsReady: (refs) => {
44
+ * signals = refs;
45
+ * },
46
+ * });
47
+ *
48
+ * signals.context.mediaElement.set(audioEl);
49
+ * signals.state.presentation.set({ url: 'https://example.com/stream.m3u8' });
50
+ * ```
51
+ */
52
+ function createHlsAudioOnlyEngine(config = {}) {
53
+ const finalConfig = {
54
+ ...config,
55
+ canPlayTrack: config.canPlayTrack ?? canPlayTrack,
56
+ resolveDuration: config.resolveDuration ?? getResolvedSelectedTrackDuration,
57
+ parsePresentation: config.parsePresentation ?? parseMultivariantPlaylist
58
+ };
59
+ return createComposition([
60
+ syncPreload,
61
+ trackLoadTriggers,
62
+ resolvePresentation,
63
+ deriveCdnPriority,
64
+ setupFailoverMonitor,
65
+ switchAudioTrack,
66
+ resolveAudioTrack,
67
+ calculatePresentationDuration,
68
+ setupMediaSource,
69
+ updateMediaSourceDuration,
70
+ setupAudioBufferActors,
71
+ trackCurrentTime,
72
+ loadAudioSegments,
73
+ endOfStream,
74
+ shareSignals
75
+ ], { config: finalConfig });
76
+ }
77
+ //#endregion
78
+ export { createHlsAudioOnlyEngine };
79
+
80
+ //# sourceMappingURL=engine-audio-only.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine-audio-only.js","names":[],"sources":["../../../../../src/playback/engines/hls/engine-audio-only.ts"],"sourcesContent":["import {\n type Composition,\n type ContextSignals,\n createComposition,\n type StateSignals,\n} from '../../../core/composition/create-composition';\nimport { makeShareSignals, type ShareSignalsConfig } from '../../../core/composition/share-signals';\nimport type { BackBufferConfig } from '../../../media/buffer/back-buffer';\nimport type { ForwardBufferConfig } from '../../../media/buffer/forward-buffer';\nimport { canPlayTrack } from '../../../media/dom/capabilities';\nimport { parseMultivariantPlaylist } from '../../../media/hls/parse-multivariant';\nimport type { AudioTrack, CanPlayTrack, MaybeResolvedPresentation } from '../../../media/types';\nimport type { GetCdnId } from '../../../media/utils/cdn';\nimport { getResolvedSelectedTrackDuration } from '../../../media/utils/track-selection';\nimport type { SegmentLoaderActor } from '../../actors/dom/segment-loader';\nimport type { SourceBufferActor } from '../../actors/dom/source-buffer';\nimport {\n calculatePresentationDuration,\n type PresentationDurationResolver,\n} from '../../behaviors/calculate-presentation-duration';\nimport { deriveCdnPriority } from '../../behaviors/derive-cdn-priority';\nimport { endOfStream } from '../../behaviors/dom/end-of-stream';\nimport { loadAudioSegments } from '../../behaviors/dom/load-segments';\nimport { setupAudioBufferActors } from '../../behaviors/dom/setup-buffer-actors';\nimport { setupMediaSource } from '../../behaviors/dom/setup-mediasource';\nimport { trackCurrentTime } from '../../behaviors/dom/track-current-time';\nimport { trackLoadTriggers } from '../../behaviors/dom/track-load-triggers';\nimport { updateMediaSourceDuration } from '../../behaviors/dom/update-mediasource-duration';\nimport { type ParsePresentation, resolvePresentation } from '../../behaviors/resolve-presentation';\nimport { resolveAudioTrack } from '../../behaviors/resolve-track';\nimport { type FailoverMonitorConfig, setupFailoverMonitor } from '../../behaviors/setup-failover-monitor';\nimport { syncPreload } from '../../behaviors/sync-preload';\nimport { switchAudioTrack } from '../../behaviors/track-switching';\n\n// ============================================================================\n// Audio-Only HLS Engine State & Context\n// ============================================================================\n\n/**\n * State shape for the audio-only HLS playback engine.\n *\n * Subset of `SimpleHlsEngineState` covering only the slots written and read\n * by audio-side behaviors. Video and text-track slots are absent —\n * subtractive composition removes the behaviors that declare them.\n */\nexport interface SimpleHlsAudioOnlyEngineState {\n presentation?: MaybeResolvedPresentation;\n preload?: 'auto' | 'metadata' | 'none';\n selectedAudioTrackId?: string;\n /**\n * Consumer-driven constraint narrowing the audio candidate set. Sibling\n * of `userVideoTrackSelection` in the default engine. Partial-track\n * shape — `{ language: 'es' }`, `{ id: 'audio-en' }`, etc.\n * `selectAudioTrack` reads this and re-picks when it changes.\n * Multi-language-audio Tier 2 programmatic-write path.\n */\n userAudioTrackSelection?: Partial<AudioTrack>;\n /**\n * The CDNs the source is served from, in manifest priority order (mirrors\n * HLS content steering's `PATHWAY-PRIORITY`). Owned by `deriveCdnPriority`,\n * read by `track-switching`'s `preferActiveCdn` scope. Only meaningful for\n * redundant-stream sources; a single-CDN source has one entry.\n */\n cdnPriority?: string[];\n /**\n * CDN ids currently in failover cooldown — read by `track-switching`'s\n * `excludeFailedCdns` constraint, which prunes their tracks so the active-CDN\n * scope falls to the next CDN. Empty / absent means all CDNs are eligible.\n */\n failedCdns?: string[];\n currentTime?: number;\n loadActivated?: boolean;\n}\n\n/**\n * Context shape for the audio-only HLS playback engine.\n *\n * Subset of `SimpleHlsEngineContext` covering only the platform objects and\n * actor refs managed by audio-side behaviors.\n */\nexport interface SimpleHlsAudioOnlyEngineContext {\n mediaElement?: HTMLMediaElement | undefined;\n mediaSource?: MediaSource;\n audioBufferActor?: SourceBufferActor;\n audioSegmentLoaderActor?: SegmentLoaderActor;\n}\n\nexport type SimpleHlsAudioOnlyEngineSignals = {\n state: StateSignals<SimpleHlsAudioOnlyEngineState>;\n context: ContextSignals<SimpleHlsAudioOnlyEngineContext>;\n};\n\n/**\n * Configuration for the audio-only HLS playback engine.\n *\n * Subset of `SimpleHlsEngineConfig` — video-quality, bandwidth-estimator,\n * and text-track config fields are omitted (no behavior consumes them).\n */\nexport interface SimpleHlsAudioOnlyEngineConfig\n extends ShareSignalsConfig<SimpleHlsAudioOnlyEngineState, SimpleHlsAudioOnlyEngineContext> {\n preferredAudioLanguage?: string;\n /**\n * Codec capability probe read by `track-switching`'s `excludeUnplayableTracks`\n * constraint. Defaults to the `MediaSource.isTypeSupported`-backed\n * `canPlayTrack`; override to force-exclude a codec. Mirrors the default\n * engine — without it, capability probing (and TS / raw-AAC detection) would\n * be inert for audio-only playback.\n */\n canPlayTrack?: CanPlayTrack;\n resolveDuration?: PresentationDurationResolver;\n parsePresentation?: ParsePresentation;\n forwardBuffer?: Partial<ForwardBufferConfig>;\n backBuffer?: Partial<BackBufferConfig>;\n /** Multi-CDN failover monitor tuning. Defaults: `DEFAULT_FAILOVER_MONITOR_CONFIG`. */\n failover?: Partial<FailoverMonitorConfig>;\n /**\n * Derive a CDN grouping key from a track URL (used by `cdnPriority`, the\n * failover trip, and the track-switching CDN rules — one function read by all).\n * Defaults to the URL origin; override to key on e.g. Mux's `cdn=` param.\n */\n getCdnId?: GetCdnId;\n}\n\n// ============================================================================\n// Audio-Only HLS Playback Engine\n// ============================================================================\n\n// Materializes input slots no composed behavior produces — `userAudioTrackSelection`\n// (switchAudioTrack only reads it) — in addition to forwarding refs. `failedCdns`\n// is owned by `setupFailoverMonitor`, so it's already materialized and reachable\n// on the `onSignalsReady` refs without being listed here.\nconst shareSignals = makeShareSignals<SimpleHlsAudioOnlyEngineState, SimpleHlsAudioOnlyEngineContext>([\n 'userAudioTrackSelection',\n]);\n\n/**\n * Create an audio-only HLS playback engine.\n *\n * Subtractive composition variant of `createSimpleHlsEngine`: omits\n * video-side behaviors (`resolveVideoTrack`, `switchVideoTrack`,\n * `setupVideoBufferActors`, `loadVideoSegments`) and text-track behaviors\n * (`switchTextTrack`, `resolveTextTrack`, `syncTextTracks`,\n * `setupTextTrackActors`, `loadTextTrackSegments`). The remaining audio\n * pipeline composes unchanged.\n *\n * Handles both truly audio-only HLS sources (no video stream-inf) and\n * mixed-AV HLS sources where the audio rendition is selected and video /\n * subtitle renditions are ignored at composition time. The variant decision\n * is encoded by adapter choice; this engine does not branch on source\n * shape.\n *\n * @example\n * ```ts\n * let signals: SimpleHlsAudioOnlyEngineSignals;\n * const engine = createHlsAudioOnlyEngine({\n * preferredAudioLanguage: 'en',\n * onSignalsReady: (refs) => {\n * signals = refs;\n * },\n * });\n *\n * signals.context.mediaElement.set(audioEl);\n * signals.state.presentation.set({ url: 'https://example.com/stream.m3u8' });\n * ```\n */\nexport function createHlsAudioOnlyEngine(\n config: SimpleHlsAudioOnlyEngineConfig = {}\n): Composition<SimpleHlsAudioOnlyEngineState, SimpleHlsAudioOnlyEngineContext> {\n const finalConfig = {\n ...config,\n canPlayTrack: config.canPlayTrack ?? canPlayTrack,\n resolveDuration: config.resolveDuration ?? getResolvedSelectedTrackDuration,\n parsePresentation: config.parsePresentation ?? parseMultivariantPlaylist,\n };\n\n return createComposition(\n [\n syncPreload,\n trackLoadTriggers,\n resolvePresentation,\n\n // Session-level CDN priority for redundant-stream sources. Owns\n // `cdnPriority`; switchAudioTrack's preferActiveCdn scope reads it. No-op\n // for single-CDN sources.\n //\n // With a single track type there's no cross-type coherence to enforce and\n // the first pick is the primary CDN regardless, so composition order is\n // not load-bearing here today. It earns its place for forward-consistency\n // with the default engine and for future failover / steering, where the\n // active CDN changes dynamically (and selection stays reactive either way).\n deriveCdnPriority,\n\n // CDN failover cooldown: watches `failedCdns` (tripped directly by audio\n // track resolution on a failed media-playlist fetch) and removes each CDN\n // once its cooldown lapses.\n setupFailoverMonitor,\n\n // Audio track selection — slot owner with filter reactivity.\n // Mid-stream flush on language switch is handled in segment-loader's\n // planTasks, not here.\n switchAudioTrack,\n\n // Resolve selected tracks — audio only.\n resolveAudioTrack,\n\n // Presentation duration\n calculatePresentationDuration,\n\n // MSE setup. Single audio buffer; no video buffer to coordinate with,\n // so the Firefox `mozHasAudio` registration ordering is moot here.\n setupMediaSource,\n updateMediaSourceDuration,\n setupAudioBufferActors,\n\n // Playback tracking\n trackCurrentTime,\n\n // Segment loading — audio only.\n loadAudioSegments,\n\n // End of stream coordination. `endOfStream` iterates buffer actors via\n // `[videoBufferActor, audioBufferActor].filter(Boolean)` and reads\n // `mediaSource.sourceBuffers` aggregately — composes unchanged with\n // only audio in scope.\n endOfStream,\n\n // Adapter signal callback.\n shareSignals,\n ],\n {\n config: finalConfig,\n }\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAmIA,MAAM,eAAe,iBAAiF,CACpG,0BACD,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgCF,SAAgB,yBACd,SAAyC,EAAE,EACkC;CAC7E,MAAM,cAAc;EAClB,GAAG;EACH,cAAc,OAAO,gBAAgB;EACrC,iBAAiB,OAAO,mBAAmB;EAC3C,mBAAmB,OAAO,qBAAqB;EAChD;AAED,QAAO,kBACL;EACE;EACA;EACA;EAWA;EAKA;EAKA;EAGA;EAGA;EAIA;EACA;EACA;EAGA;EAGA;EAMA;EAGA;EACD,EACD,EACE,QAAQ,aACT,CACF"}
@@ -0,0 +1,236 @@
1
+ import { Composition, ContextSignals, StateSignals } from "../../../core/composition/create-composition.js";
2
+ import { ShareSignalsConfig } from "../../../core/composition/share-signals.js";
3
+ import { AudioTrack, CanPlayTrack, MaybeResolvedPresentation, TextTrack, VideoTrack } from "../../../media/types/index.js";
4
+ import { BackBufferConfig } from "../../../media/buffer/back-buffer.js";
5
+ import { ForwardBufferConfig } from "../../../media/buffer/forward-buffer.js";
6
+ import { SourceBufferActor } from "../../actors/dom/source-buffer.js";
7
+ import { SegmentLoaderActor } from "../../actors/dom/segment-loader.js";
8
+ import { TextTracksActor } from "../../actors/text-tracks.js";
9
+ import { TextTrackSegmentLoaderActor, TextTrackSegmentResolver } from "../../actors/text-track-segment-loader.js";
10
+ import { ParsePresentation } from "../../behaviors/resolve-presentation.js";
11
+ import { QualityConfig } from "../../../media/abr/quality-selection.js";
12
+ import { addSubtitlesTracksToMedia, getShowingSubtitlesTrackFromMedia, removeAllSubtitlesTracksFromMedia } from "../../../media/dom/text/text-track-slots.js";
13
+ import { GetCdnId } from "../../../media/utils/cdn.js";
14
+ import { BandwidthConfig, BandwidthState } from "../../../network/bandwidth-estimator.js";
15
+ import { PresentationDurationResolver } from "../../behaviors/calculate-presentation-duration.js";
16
+ import { FailoverMonitorConfig } from "../../behaviors/setup-failover-monitor.js";
17
+
18
+ //#region src/playback/engines/hls/engine.d.ts
19
+ /**
20
+ * State shape for the HLS playback engine.
21
+ *
22
+ * This is the union of all state required by the behaviors composed into
23
+ * the HLS engine. Each behavior declares its own state interface; this
24
+ * type satisfies all of them.
25
+ */
26
+ interface SimpleHlsEngineState {
27
+ /**
28
+ * The presentation being played. A caller writes `{ url }`;
29
+ * `resolvePresentation` parses the manifest and populates the rest.
30
+ */
31
+ presentation?: MaybeResolvedPresentation;
32
+ preload?: 'auto' | 'metadata' | 'none';
33
+ selectedVideoTrackId?: string;
34
+ selectedAudioTrackId?: string;
35
+ selectedTextTrackId?: string;
36
+ bandwidthState?: BandwidthState;
37
+ userVideoTrackSelection?: Partial<VideoTrack>;
38
+ /**
39
+ * Consumer-driven constraint narrowing the audio candidate set. Sibling
40
+ * of `userVideoTrackSelection`. Partial-track shape — `{ language: 'es' }`,
41
+ * `{ id: 'audio-en' }`, etc. `selectAudioTrack` reads this and re-picks
42
+ * when it changes. Multi-language-audio Tier 2 programmatic-write path.
43
+ */
44
+ userAudioTrackSelection?: Partial<AudioTrack>;
45
+ /**
46
+ * Consumer-driven *intent* for text selection, resolved into
47
+ * `selectedTextTrackId` by `switchTextTrack`. A language-based partial
48
+ * (`{ language: 'es' }`) selects captions, `'off'` disables them, and absence
49
+ * means auto (the engine's `preferredSubtitleLanguage` / DEFAULT-track policy).
50
+ * Also the write path for the DOM caption UI (via `syncTextTracks`); unlike the
51
+ * resolved id it persists across source changes (sticky preference).
52
+ */
53
+ userTextTrackSelection?: Partial<TextTrack> | 'off';
54
+ /**
55
+ * The CDNs the source is served from (track-URL origins), in manifest
56
+ * priority order — most-preferred first (mirrors HLS content steering's
57
+ * `PATHWAY-PRIORITY`). Owned by `deriveCdnPriority`, read by
58
+ * `track-switching`'s `preferActiveCdn` scope, which narrows to the
59
+ * highest-priority CDN with surviving tracks so video / audio / text stay on
60
+ * one host. Only meaningful for redundant-stream sources; a single-CDN source
61
+ * has one entry.
62
+ */
63
+ cdnPriority?: string[];
64
+ /**
65
+ * CDN ids (origins) currently in failover cooldown — written by the CDN
66
+ * monitor when a host fails too often, read by `track-switching`'s
67
+ * `excludeFailedCdns` hard constraint, which prunes their tracks so the
68
+ * active-CDN scope falls to the next CDN in `cdnPriority`. Empty / absent
69
+ * means all CDNs are eligible.
70
+ */
71
+ failedCdns?: string[];
72
+ currentTime?: number;
73
+ loadActivated?: boolean;
74
+ }
75
+ /**
76
+ * Context shape for the HLS playback engine.
77
+ *
78
+ * Platform objects and actor references managed by HLS behaviors.
79
+ */
80
+ interface SimpleHlsEngineContext {
81
+ mediaElement?: HTMLMediaElement | undefined;
82
+ mediaSource?: MediaSource;
83
+ videoBufferActor?: SourceBufferActor;
84
+ audioBufferActor?: SourceBufferActor;
85
+ videoSegmentLoaderActor?: SegmentLoaderActor;
86
+ audioSegmentLoaderActor?: SegmentLoaderActor;
87
+ textTracksActor?: TextTracksActor;
88
+ textTrackSegmentLoaderActor?: TextTrackSegmentLoaderActor;
89
+ }
90
+ /**
91
+ * The composition signal refs handed to `onSignalsReady` callers — the
92
+ * canonical way to drive the engine externally (writes) or observe its
93
+ * state (reads) without touching `composition.state` / `composition.context`
94
+ * directly.
95
+ */
96
+ type SimpleHlsEngineSignals = {
97
+ state: StateSignals<SimpleHlsEngineState>;
98
+ context: ContextSignals<SimpleHlsEngineContext>;
99
+ };
100
+ /**
101
+ * Configuration for the HLS playback engine.
102
+ *
103
+ * Each option is consumed by the appropriate behavior — the engine itself
104
+ * has no config beyond what its behaviors read.
105
+ */
106
+ interface SimpleHlsEngineConfig extends ShareSignalsConfig<SimpleHlsEngineState, SimpleHlsEngineContext> {
107
+ /**
108
+ * Bandwidth estimate in bps to use before enough samples have been
109
+ * collected. Default: `DEFAULT_INITIAL_BANDWIDTH` (5 Mbps).
110
+ */
111
+ initialBandwidth?: number;
112
+ /**
113
+ * Codec capability probe injected into `track-switching`'s
114
+ * `excludeUnplayableTracks` constraint — drops renditions the environment
115
+ * can't decode before selection. Defaults to the `MediaSource.isTypeSupported`
116
+ * -backed `canPlayTrack`; supply your own to override (e.g. force-exclude a
117
+ * codec).
118
+ */
119
+ canPlayTrack?: CanPlayTrack;
120
+ preferredAudioLanguage?: string;
121
+ preferredSubtitleLanguage?: string;
122
+ includeForcedTracks?: boolean;
123
+ enableDefaultTrack?: boolean;
124
+ /**
125
+ * Resolver that turns a text-track segment fetch into VTT cues.
126
+ * Defaults to the DOM-bound `resolveVttSegment` resolver, which uses an
127
+ * offscreen `<track>` element to parse WebVTT.
128
+ */
129
+ resolveTextTrackSegment?: TextTrackSegmentResolver<VTTCue>;
130
+ /**
131
+ * Resolver for `presentation.duration`. Defaults to picking the first
132
+ * resolved selected track's duration (video preferred, audio fallback) —
133
+ * appropriate for VoD and audio-only. Live engines should supply a
134
+ * resolver that returns `Number.POSITIVE_INFINITY` once the presentation
135
+ * is established as live; downstream `updateMediaSourceDuration` propagates
136
+ * that value to `mediaSource.duration` per the MSE spec.
137
+ */
138
+ resolveDuration?: PresentationDurationResolver;
139
+ /**
140
+ * Manifest parser handed to `resolvePresentation`. Defaults to the HLS
141
+ * multivariant-playlist parser; supply your own for alternate format
142
+ * support without forking the engine.
143
+ */
144
+ parsePresentation?: ParsePresentation;
145
+ /**
146
+ * Allocate SPF-owned text-track slots on the media element. Defaults to
147
+ * the standard `<track>`-element implementation in
148
+ * `media/dom/text/text-track-slots`.
149
+ */
150
+ addSubtitlesTracksToMedia?: typeof addSubtitlesTracksToMedia;
151
+ /**
152
+ * Return the SPF-owned subtitle/caption `TextTrack` currently in showing
153
+ * mode. Defaults to the standard selector-based implementation in
154
+ * `media/dom/text/text-track-slots`.
155
+ */
156
+ getShowingSubtitlesTrackFromMedia?: typeof getShowingSubtitlesTrackFromMedia;
157
+ /**
158
+ * Evict all SPF-owned text-track slots from the media element. Defaults to
159
+ * the standard selector-based implementation in
160
+ * `media/dom/text/text-track-slots`.
161
+ */
162
+ removeAllSubtitlesTracksFromMedia?: typeof removeAllSubtitlesTracksFromMedia;
163
+ /**
164
+ * Forward-buffer tuning. `bufferDuration` controls how far ahead of the
165
+ * playhead segments are loaded (and where forward-flush kicks in).
166
+ * Defaults: see `DEFAULT_FORWARD_BUFFER_CONFIG` (30 seconds). Threaded to
167
+ * segment-loader actors (v/a + text) at construction time and to
168
+ * `loadXSegments` dispatchers for the load-message range.
169
+ */
170
+ forwardBuffer?: Partial<ForwardBufferConfig>;
171
+ /**
172
+ * Back-buffer tuning. `keepSegments` controls how many segments stay
173
+ * behind the playhead before eviction. Defaults: see
174
+ * `DEFAULT_BACK_BUFFER_CONFIG` (2 segments). Threaded to the v/a
175
+ * segment-loader actor only (text tracks don't use back-buffer eviction).
176
+ */
177
+ backBuffer?: Partial<BackBufferConfig>;
178
+ /**
179
+ * Bandwidth-estimator tuning. Overrides any field of `BandwidthConfig`
180
+ * (`fastHalfLife`, `slowHalfLife`, `minTotalBytes`, `minBytes`,
181
+ * `minDuration`). `bandwidth.minTotalBytes` supersedes the flat
182
+ * `minTotalBytes` field above. Defaults: see `DEFAULT_BANDWIDTH_CONFIG`.
183
+ */
184
+ bandwidth?: Partial<BandwidthConfig>;
185
+ /**
186
+ * Quality-selection tuning. `safetyMargin` is the bandwidth-headroom
187
+ * multiplier used by `selectQuality`; `upgradeMargin` is the hysteresis
188
+ * ratio gating ABR upgrades. Defaults: `DEFAULT_QUALITY_CONFIG` (0.85 / 1.15).
189
+ */
190
+ quality?: Partial<QualityConfig>;
191
+ /**
192
+ * Multi-CDN failover monitor tuning. `cooldownMs` is how long a CDN stays
193
+ * excluded after a failed fetch trips it. Defaults:
194
+ * `DEFAULT_FAILOVER_MONITOR_CONFIG` (300s). Only meaningful for redundant-stream
195
+ * sources.
196
+ */
197
+ failover?: Partial<FailoverMonitorConfig>;
198
+ /**
199
+ * How to derive a CDN grouping key from a track URL — used to build
200
+ * `cdnPriority`, to record the failover trip in `failedCdns`, and by the
201
+ * track-switching CDN scope + failover constraint. One function, read by all of
202
+ * them, so the keys stay comparable. Defaults to the URL origin; override to
203
+ * key on something else (e.g. Mux's `cdn=` query param).
204
+ */
205
+ getCdnId?: GetCdnId;
206
+ }
207
+ /**
208
+ * Create an HLS playback engine.
209
+ *
210
+ * Composes SPF behaviors into a reactive pipeline for HLS playback over MSE:
211
+ * manifest resolution, track selection, ABR, segment loading, and
212
+ * end-of-stream coordination.
213
+ *
214
+ * @example
215
+ * ```ts
216
+ * let signals: SimpleHlsEngineSignals;
217
+ * const engine = createSimpleHlsEngine({
218
+ * initialBandwidth: 2_000_000,
219
+ * preferredAudioLanguage: 'en',
220
+ * onSignalsReady: (refs) => {
221
+ * signals = refs;
222
+ * },
223
+ * });
224
+ *
225
+ * signals.context.mediaElement.set(videoEl);
226
+ * signals.state.presentation.set({ url: 'https://example.com/stream.m3u8' });
227
+ *
228
+ * videoEl.play();
229
+ *
230
+ * await engine.destroy();
231
+ * ```
232
+ */
233
+ declare function createSimpleHlsEngine(config?: SimpleHlsEngineConfig): Composition<SimpleHlsEngineState, SimpleHlsEngineContext>;
234
+ //#endregion
235
+ export { SimpleHlsEngineConfig, SimpleHlsEngineContext, SimpleHlsEngineSignals, SimpleHlsEngineState, createSimpleHlsEngine };
236
+ //# sourceMappingURL=engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.d.ts","names":[],"sources":["../../../../../src/playback/engines/hls/engine.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAyDA;;;;UAAiB,oBAAA;EAWmB;;;;EANlC,YAAA,GAAe,yBAAA;EACf,OAAA;EACA,oBAAA;EACA,oBAAA;EACA,mBAAA;EACA,cAAA,GAAiB,cAAA;EACjB,uBAAA,GAA0B,OAAA,CAAQ,UAAA;EAJlC;;;;;;EAWA,uBAAA,GAA0B,OAAA,CAAQ,UAAA;EAPA;;;;;;;;EAgBlC,sBAAA,GAAyB,OAAA,CAAQ,SAAA;EAmBjC;;;;AASF;;;;;EAlBE,WAAA;EAsBmB;;;;;;;EAdnB,UAAA;EACA,WAAA;EACA,aAAA;AAAA;;;;;;UAQe,sBAAA;EACf,YAAA,GAAe,gBAAA;EACf,WAAA,GAAc,WAAA;EACd,gBAAA,GAAmB,iBAAA;EACnB,gBAAA,GAAmB,iBAAA;EACnB,uBAAA,GAA0B,kBAAA;EAC1B,uBAAA,GAA0B,kBAAA;EAC1B,eAAA,GAAkB,eAAA;EAClB,2BAAA,GAA8B,2BAAA;AAAA;;;;;;;KASpB,sBAAA;EACV,KAAA,EAAO,YAAA,CAAa,oBAAA;EACpB,OAAA,EAAS,cAAA,CAAe,sBAAA;AAAA;;;;;;;UAST,qBAAA,SAA8B,kBAAA,CAAmB,oBAAA,EAAsB,sBAAA;EAAjD;;;;EAKrC,gBAAA;EAkBmD;;;;;;;EAVnD,YAAA,GAAe,YAAA;EACf,sBAAA;EACA,yBAAA;EACA,mBAAA;EACA,kBAAA;EA6DY;;;;;EAvDZ,uBAAA,GAA0B,wBAAA,CAAyB,MAAA;EAvBN;;;;;;;;EAgC7C,eAAA,GAAkB,4BAAA;EAlBlB;;;;;EAwBA,iBAAA,GAAoB,iBAAA;EAf+B;;;;;EAqBnD,yBAAA,UAAmC,yBAAA;EAAA;;;;;EAMnC,iCAAA,UAA2C,iCAAA;EAc3B;;;;;EARhB,iCAAA,UAA2C,iCAAA;EAsB/B;;;;;;;EAdZ,aAAA,GAAgB,OAAA,CAAQ,mBAAA;EAmCxB;;;;AAgDF;;EA5EE,UAAA,GAAa,OAAA,CAAQ,gBAAA;EA6Eb;;;;;;EAtER,SAAA,GAAY,OAAA,CAAQ,eAAA;EAsEpB;;;;;EAhEA,OAAA,GAAU,OAAA,CAAQ,aAAA;;;;;;;EAOlB,QAAA,GAAW,OAAA,CAAQ,qBAAA;;;;;;;;EAQnB,QAAA,GAAW,QAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAgDG,qBAAA,CACd,MAAA,GAAQ,qBAAA,GACP,WAAA,CAAY,oBAAA,EAAsB,sBAAA"}