@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
@@ -0,0 +1,158 @@
1
+ import { maxResolutionToPixelArea, pickTrackUnderPixelArea } from "../../../media/primitives/select-tracks.js";
2
+ import { createBackgroundVideoEngine } from "./engine.js";
3
+ //#region src/playback/engines/background-video/adapter.ts
4
+ const backgroundVideoMediaDefaultProps = {
5
+ src: "",
6
+ preload: "auto",
7
+ loop: true,
8
+ muted: true,
9
+ autoplay: true,
10
+ maxResolution: void 0
11
+ };
12
+ /**
13
+ * Mixin that adds the background-video SPF playback engine to any
14
+ * base class.
15
+ *
16
+ * Implements the WHATWG HTML media element contract (`src`, `preload`,
17
+ * `loop`, `muted`, `autoplay`, `play()`) so it can be dropped in anywhere a
18
+ * media element API is expected. Compared to `SimpleHlsMediaMixin`, this
19
+ * variant:
20
+ *
21
+ * - exposes `loop`, `muted`, and `autoplay` as adapter-owned native
22
+ * passthroughs, all defaulting to `true` — the use case is silent
23
+ * autoplay-looping video, so muted + autoplay satisfy browser autoplay
24
+ * policies and loop is the defining behavior;
25
+ * - drives the underlying engine with the background-video
26
+ * composition (single-rendition, video-only, autoplay-from-construction).
27
+ *
28
+ * A new engine is created on every src assignment — this fully tears down
29
+ * all state, SourceBuffers, and in-flight requests from the previous
30
+ * source before the next one begins. The media element reference is
31
+ * preserved across src changes and re-applied to the new engine
32
+ * automatically.
33
+ *
34
+ * @example
35
+ * class BackgroundVideoMedia extends BackgroundVideoMediaMixin(HTMLVideoElementHost) {}
36
+ *
37
+ * const media = new BackgroundVideoMedia();
38
+ * media.attach(document.querySelector('video'));
39
+ * media.src = 'https://stream.mux.com/abc123.m3u8';
40
+ * media.play();
41
+ */
42
+ function BackgroundVideoMediaMixin(BaseClass) {
43
+ class BackgroundVideoMediaImpl extends BaseClass {
44
+ #engine;
45
+ #config;
46
+ #signals;
47
+ #preload = backgroundVideoMediaDefaultProps.preload;
48
+ #loop = backgroundVideoMediaDefaultProps.loop;
49
+ #muted = backgroundVideoMediaDefaultProps.muted;
50
+ #autoplay = backgroundVideoMediaDefaultProps.autoplay;
51
+ #maxResolution;
52
+ /** Pending loadstart listener from a deferred play() retry, if any. */
53
+ #loadstartListener = null;
54
+ constructor(...args) {
55
+ super(...args);
56
+ const { config } = args?.[0] ?? {};
57
+ this.#config = config;
58
+ this.#maxResolution = config?.maxResolution;
59
+ this.#engine = this.#createEngine();
60
+ }
61
+ get engine() {
62
+ return this.#engine;
63
+ }
64
+ attach(mediaElement) {
65
+ super.attach?.(mediaElement);
66
+ mediaElement.loop = this.#loop;
67
+ mediaElement.muted = this.#muted;
68
+ mediaElement.autoplay = this.#autoplay;
69
+ this.#signals.context.mediaElement.set(mediaElement);
70
+ }
71
+ detach() {
72
+ this.#cancelPendingPlay();
73
+ this.#signals.context.mediaElement.set(void 0);
74
+ super.detach?.();
75
+ }
76
+ destroy() {
77
+ this.#cancelPendingPlay();
78
+ this.#engine.destroy();
79
+ }
80
+ get preload() {
81
+ return this.#preload;
82
+ }
83
+ set preload(_value) {}
84
+ get loop() {
85
+ return this.#loop;
86
+ }
87
+ set loop(_value) {}
88
+ get muted() {
89
+ return this.#muted;
90
+ }
91
+ set muted(_value) {}
92
+ get autoplay() {
93
+ return this.#autoplay;
94
+ }
95
+ set autoplay(_value) {}
96
+ get maxResolution() {
97
+ return this.#maxResolution;
98
+ }
99
+ /**
100
+ * Set the cap. Accepts `"720p"` / `"1080p"` etc., a bare number
101
+ * (interpreted as pixel area), or `undefined` to clear. Unrecognized
102
+ * values are treated as no cap.
103
+ */
104
+ set maxResolution(value) {
105
+ if (value === this.#maxResolution) return;
106
+ this.#maxResolution = value;
107
+ }
108
+ get src() {
109
+ return this.#signals.state.presentation.get()?.url ?? "";
110
+ }
111
+ set src(value) {
112
+ this.#cancelPendingPlay();
113
+ if (value) this.#signals.state.presentation.set({ url: value });
114
+ else this.#signals.state.presentation.set(void 0);
115
+ }
116
+ async play() {
117
+ const mediaElement = this.#signals.context.mediaElement.get();
118
+ if (!mediaElement) return Promise.reject(/* @__PURE__ */ new Error("BackgroundVideoMediaElement: no media element attached"));
119
+ try {
120
+ return await mediaElement.play();
121
+ } catch (err) {
122
+ if (this.src) return new Promise((resolve, reject) => {
123
+ const listener = () => {
124
+ this.#loadstartListener = null;
125
+ mediaElement.play().then(resolve, reject);
126
+ };
127
+ this.#loadstartListener = listener;
128
+ mediaElement.addEventListener("loadstart", listener, { once: true });
129
+ });
130
+ throw err;
131
+ }
132
+ }
133
+ #createEngine() {
134
+ const adapterPicker = (presentation) => {
135
+ return pickTrackUnderPixelArea((presentation.selectionSets?.find((s) => s.type === "video"))?.switchingSets[0]?.tracks ?? [], maxResolutionToPixelArea(this.#maxResolution))?.id;
136
+ };
137
+ return createBackgroundVideoEngine({
138
+ picker: adapterPicker,
139
+ ...this.#config,
140
+ onSignalsReady: (signals) => {
141
+ this.#signals = signals;
142
+ }
143
+ });
144
+ }
145
+ #cancelPendingPlay() {
146
+ if (!this.#loadstartListener) return;
147
+ this.#signals.context.mediaElement.get()?.removeEventListener("loadstart", this.#loadstartListener);
148
+ this.#loadstartListener = null;
149
+ }
150
+ }
151
+ return BackgroundVideoMediaImpl;
152
+ }
153
+ /** Standalone SPF background-video adapter with no base class. */
154
+ var BackgroundVideoMediaElement = class extends BackgroundVideoMediaMixin(class {}) {};
155
+ //#endregion
156
+ export { BackgroundVideoMediaElement, BackgroundVideoMediaMixin, backgroundVideoMediaDefaultProps };
157
+
158
+ //# sourceMappingURL=adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.js","names":["#config","#maxResolution","#engine","#createEngine","#loop","#muted","#autoplay","#signals","#cancelPendingPlay","#preload","#loadstartListener"],"sources":["../../../../../src/playback/engines/background-video/adapter.ts"],"sourcesContent":["import type { Constructor, MixinReturn } from '@videojs/utils/types';\nimport type { Composition } from '../../../core/composition/create-composition';\nimport {\n maxResolutionToPixelArea,\n pickTrackUnderPixelArea,\n type TrackPicker,\n} from '../../../media/primitives/select-tracks';\nimport type { VideoSelectionSet } from '../../../media/types';\nimport {\n type BackgroundVideoEngineConfig,\n type BackgroundVideoEngineContext,\n type BackgroundVideoEngineSignals,\n type BackgroundVideoEngineState,\n createBackgroundVideoEngine,\n} from './engine';\n\nexport interface BackgroundVideoMediaProps {\n src: string;\n preload: '' | 'none' | 'metadata' | 'auto';\n loop: boolean;\n muted: boolean;\n autoplay: boolean;\n maxResolution: string | number | undefined;\n}\n\nexport const backgroundVideoMediaDefaultProps: BackgroundVideoMediaProps = {\n src: '',\n preload: 'auto',\n loop: true,\n muted: true,\n autoplay: true,\n maxResolution: undefined,\n};\n\nexport interface BackgroundVideoMediaAPI extends BackgroundVideoMediaProps {\n readonly engine: Composition<BackgroundVideoEngineState, BackgroundVideoEngineContext>;\n attach(mediaElement: HTMLMediaElement): void;\n detach(): void;\n destroy(): void;\n play(): Promise<void>;\n}\n\n/**\n * Mixin that adds the background-video SPF playback engine to any\n * base class.\n *\n * Implements the WHATWG HTML media element contract (`src`, `preload`,\n * `loop`, `muted`, `autoplay`, `play()`) so it can be dropped in anywhere a\n * media element API is expected. Compared to `SimpleHlsMediaMixin`, this\n * variant:\n *\n * - exposes `loop`, `muted`, and `autoplay` as adapter-owned native\n * passthroughs, all defaulting to `true` — the use case is silent\n * autoplay-looping video, so muted + autoplay satisfy browser autoplay\n * policies and loop is the defining behavior;\n * - drives the underlying engine with the background-video\n * composition (single-rendition, video-only, autoplay-from-construction).\n *\n * A new engine is created on every src assignment — this fully tears down\n * all state, SourceBuffers, and in-flight requests from the previous\n * source before the next one begins. The media element reference is\n * preserved across src changes and re-applied to the new engine\n * automatically.\n *\n * @example\n * class BackgroundVideoMedia extends BackgroundVideoMediaMixin(HTMLVideoElementHost) {}\n *\n * const media = new BackgroundVideoMedia();\n * media.attach(document.querySelector('video'));\n * media.src = 'https://stream.mux.com/abc123.m3u8';\n * media.play();\n */\nexport function BackgroundVideoMediaMixin<Base extends Constructor<any>>(BaseClass: Base) {\n class BackgroundVideoMediaImpl extends BaseClass {\n #engine: Composition<BackgroundVideoEngineState, BackgroundVideoEngineContext>;\n #config: BackgroundVideoEngineConfig;\n #signals!: BackgroundVideoEngineSignals;\n #preload: '' | 'none' | 'metadata' | 'auto' = backgroundVideoMediaDefaultProps.preload;\n #loop: boolean = backgroundVideoMediaDefaultProps.loop;\n #muted: boolean = backgroundVideoMediaDefaultProps.muted;\n #autoplay: boolean = backgroundVideoMediaDefaultProps.autoplay;\n #maxResolution: string | number | undefined;\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\n this.#maxResolution = config?.maxResolution;\n this.#engine = this.#createEngine();\n }\n\n get engine(): Composition<BackgroundVideoEngineState, BackgroundVideoEngineContext> {\n return this.#engine;\n }\n\n // -------------------------------------------------------------------------\n // Media element lifecycle\n // -------------------------------------------------------------------------\n\n attach(mediaElement: HTMLMediaElement): void {\n super.attach?.(mediaElement);\n // Apply adapter-owned native props before the engine takes over —\n // the underlying element needs `loop` / `muted` / `autoplay` set for\n // the use case's autoplay-looping semantics.\n mediaElement.loop = this.#loop;\n mediaElement.muted = this.#muted;\n mediaElement.autoplay = this.#autoplay;\n\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 get preload(): '' | 'none' | 'metadata' | 'auto' {\n return this.#preload;\n }\n\n set preload(_value: '' | 'none' | 'metadata' | 'auto') {\n // Noop for this phase\n }\n\n // -------------------------------------------------------------------------\n // loop / muted / autoplay — adapter-owned IDL attributes mirrored onto\n // the attached media element. The engine itself has no opinion on any\n // of them.\n // -------------------------------------------------------------------------\n\n get loop(): boolean {\n return this.#loop;\n }\n\n set loop(_value: boolean) {\n // Noop for this phase\n }\n\n get muted(): boolean {\n return this.#muted;\n }\n\n set muted(_value: boolean) {\n // Noop for this phase\n }\n\n get autoplay(): boolean {\n return this.#autoplay;\n }\n\n set autoplay(_value: boolean) {\n // Noop for this phase\n }\n\n // -------------------------------------------------------------------------\n // maxResolution — adapter-owned cap on the picked rendition. The engine's\n // closure picker (see `#createEngine`) reads this field at pick time, so\n // setter writes take effect on the next `presentation-resolved` transition\n // without an engine rebuild.\n // -------------------------------------------------------------------------\n\n get maxResolution(): string | number | undefined {\n return this.#maxResolution;\n }\n\n /**\n * Set the cap. Accepts `\"720p\"` / `\"1080p\"` etc., a bare number\n * (interpreted as pixel area), or `undefined` to clear. Unrecognized\n * values are treated as no cap.\n */\n set maxResolution(value: string | number | undefined) {\n if (value === this.#maxResolution) return;\n this.#maxResolution = value;\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,\n // matching the browser's load algorithm reset 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 this.#cancelPendingPlay();\n\n if (value) {\n this.#signals.state.presentation.set({ url: value });\n } else {\n this.#signals.state.presentation.set(undefined);\n }\n }\n\n // -------------------------------------------------------------------------\n // play() — WHATWG §4.8.11.8\n // Delegates to the attached media element's native play().\n // -------------------------------------------------------------------------\n\n async play(): Promise<void> {\n const mediaElement = this.#signals.context.mediaElement.get();\n if (!mediaElement) {\n return Promise.reject(new Error('BackgroundVideoMediaElement: no media element attached'));\n }\n\n try {\n return await mediaElement.play();\n } catch (err) {\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<BackgroundVideoEngineState, BackgroundVideoEngineContext> {\n const adapterPicker: TrackPicker = (presentation) => {\n const videoSet = presentation.selectionSets?.find((s) => s.type === 'video') as VideoSelectionSet | undefined;\n const tracks = videoSet?.switchingSets[0]?.tracks ?? [];\n return pickTrackUnderPixelArea(tracks, maxResolutionToPixelArea(this.#maxResolution))?.id;\n };\n\n return createBackgroundVideoEngine({\n picker: adapterPicker,\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 BackgroundVideoMediaImpl as unknown as MixinReturn<Base, BackgroundVideoMediaAPI>;\n}\n\n/** Standalone SPF background-video adapter with no base class. */\nexport class BackgroundVideoMediaElement extends BackgroundVideoMediaMixin(class {}) {}\n"],"mappings":";;;AAyBA,MAAa,mCAA8D;CACzE,KAAK;CACL,SAAS;CACT,MAAM;CACN,OAAO;CACP,UAAU;CACV,eAAe,KAAA;CAChB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwCD,SAAgB,0BAAyD,WAAiB;CACxF,MAAM,iCAAiC,UAAU;EAC/C;EACA;EACA;EACA,WAA8C,iCAAiC;EAC/E,QAAiB,iCAAiC;EAClD,SAAkB,iCAAiC;EACnD,YAAqB,iCAAiC;EACtD;;EAGA,qBAA0C;EAE1C,YAAY,GAAG,MAAa;AAC1B,SAAM,GAAG,KAAK;GAEd,MAAM,EAAE,WAAW,OAAO,MAAM,EAAE;AAClC,SAAA,SAAe;AAEf,SAAA,gBAAsB,QAAQ;AAC9B,SAAA,SAAe,MAAA,cAAoB;;EAGrC,IAAI,SAAgF;AAClF,UAAO,MAAA;;EAOT,OAAO,cAAsC;AAC3C,SAAM,SAAS,aAAa;AAI5B,gBAAa,OAAO,MAAA;AACpB,gBAAa,QAAQ,MAAA;AACrB,gBAAa,WAAW,MAAA;AAExB,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;;EAOxB,IAAI,UAA6C;AAC/C,UAAO,MAAA;;EAGT,IAAI,QAAQ,QAA2C;EAUvD,IAAI,OAAgB;AAClB,UAAO,MAAA;;EAGT,IAAI,KAAK,QAAiB;EAI1B,IAAI,QAAiB;AACnB,UAAO,MAAA;;EAGT,IAAI,MAAM,QAAiB;EAI3B,IAAI,WAAoB;AACtB,UAAO,MAAA;;EAGT,IAAI,SAAS,QAAiB;EAW9B,IAAI,gBAA6C;AAC/C,UAAO,MAAA;;;;;;;EAQT,IAAI,cAAc,OAAoC;AACpD,OAAI,UAAU,MAAA,cAAqB;AACnC,SAAA,gBAAsB;;EASxB,IAAI,MAAc;AAChB,UAAO,MAAA,QAAc,MAAM,aAAa,KAAK,EAAE,OAAO;;EAGxD,IAAI,IAAI,OAAe;AACrB,SAAA,mBAAyB;AAEzB,OAAI,MACF,OAAA,QAAc,MAAM,aAAa,IAAI,EAAE,KAAK,OAAO,CAAC;OAEpD,OAAA,QAAc,MAAM,aAAa,IAAI,KAAA,EAAU;;EASnD,MAAM,OAAsB;GAC1B,MAAM,eAAe,MAAA,QAAc,QAAQ,aAAa,KAAK;AAC7D,OAAI,CAAC,aACH,QAAO,QAAQ,uBAAO,IAAI,MAAM,yDAAyD,CAAC;AAG5F,OAAI;AACF,WAAO,MAAM,aAAa,MAAM;YACzB,KAAK;AAIZ,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;;;EAQV,gBAAuF;GACrF,MAAM,iBAA8B,iBAAiB;AAGnD,WAAO,yBAFU,aAAa,eAAe,MAAM,MAAM,EAAE,SAAS,QAAQ,GACnD,cAAc,IAAI,UAAU,EAAE,EAChB,yBAAyB,MAAA,cAAoB,CAAC,EAAE;;AAGzF,UAAO,4BAA4B;IACjC,QAAQ;IACR,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,8BAAb,cAAiD,0BAA0B,MAAM,GAAG,CAAC"}
@@ -0,0 +1,107 @@
1
+ import { Composition, ContextSignals, StateSignals } from "../../../core/composition/create-composition.js";
2
+ import { ShareSignalsConfig } from "../../../core/composition/share-signals.js";
3
+ import { MaybeResolvedPresentation } from "../../../media/types/index.js";
4
+ import { SourceBufferActor } from "../../actors/dom/source-buffer.js";
5
+ import { SegmentLoaderActor } from "../../actors/dom/segment-loader.js";
6
+ import { TrackPicker } from "../../../media/primitives/select-tracks.js";
7
+ import { ParsePresentation } from "../../behaviors/resolve-presentation.js";
8
+ import { SelectVideoTrackConfig } from "../../behaviors/select-tracks.js";
9
+
10
+ //#region src/playback/engines/background-video/engine.d.ts
11
+ /**
12
+ * State shape for the background-video playback engine.
13
+ *
14
+ * Narrower than `SimpleHlsEngineState`: audio/text track slots are absent
15
+ * because their selection/resolution behaviors are subtracted. `bandwidthState`
16
+ * is present because `setupVideoBufferActors` declares it and `loadVideoSegments`
17
+ * samples into it (wasted work in this variant — a Phase 3 alt-impl will skip
18
+ * sampling).
19
+ */
20
+ interface BackgroundVideoEngineState {
21
+ /**
22
+ * The presentation being played. A caller writes `{ url }`;
23
+ * `resolvePresentation` parses the manifest and populates the rest.
24
+ */
25
+ presentation?: MaybeResolvedPresentation;
26
+ preload?: 'auto' | 'metadata' | 'none';
27
+ selectedVideoTrackId?: string;
28
+ loadActivated?: boolean;
29
+ }
30
+ /**
31
+ * Context shape for the background-video engine.
32
+ */
33
+ interface BackgroundVideoEngineContext {
34
+ mediaElement?: HTMLMediaElement | undefined;
35
+ mediaSource?: MediaSource;
36
+ videoBufferActor?: SourceBufferActor;
37
+ videoSegmentLoaderActor?: SegmentLoaderActor;
38
+ }
39
+ /**
40
+ * The composition signal refs handed to `onSignalsReady` callers — the
41
+ * canonical way to drive the engine externally (writes) or observe its
42
+ * state (reads) without touching `composition.state` / `composition.context`
43
+ * directly.
44
+ */
45
+ type BackgroundVideoEngineSignals = {
46
+ state: StateSignals<BackgroundVideoEngineState>;
47
+ context: ContextSignals<BackgroundVideoEngineContext>;
48
+ };
49
+ /**
50
+ * Configuration for the background-video engine.
51
+ *
52
+ * Each option is consumed by the appropriate behavior — the engine itself
53
+ * has no config beyond what its behaviors read. Compared to
54
+ * `SimpleHlsEngineConfig`, audio/text/ABR/bandwidth/quality knobs are
55
+ * dropped: the variant subtracts the behaviors that read them.
56
+ */
57
+ interface BackgroundVideoEngineConfig extends ShareSignalsConfig<BackgroundVideoEngineState, BackgroundVideoEngineContext> {
58
+ /**
59
+ * Track picker handed to `selectVideoTrack`. Default:
60
+ * `pickHighestResolutionVideoTrack` — picks the highest-resolution variant on
61
+ * presentation resolve and pins it for the session. Override for
62
+ * mobile-aware or content-aware caps.
63
+ *
64
+ * Adapters (e.g. `BackgroundVideoMediaElement`) install their own
65
+ * picker; this default applies when the engine is constructed directly.
66
+ */
67
+ picker?: TrackPicker<SelectVideoTrackConfig>;
68
+ /**
69
+ * Manifest parser handed to `resolvePresentation`. Defaults to the HLS
70
+ * multivariant-playlist parser.
71
+ */
72
+ parsePresentation?: ParsePresentation;
73
+ }
74
+ /**
75
+ * Create a background-video playback engine.
76
+ *
77
+ * Subtractive composition over the HLS engine baseline:
78
+ * audio-side, text-side, ABR-driven, preload-monitoring, and play/seek
79
+ * load-trigger behaviors are removed. `selectVideoTrack` (with a
80
+ * max-resolution picker by default) replaces `switchVideoQuality`, pinning
81
+ * a single rendition for the session. The initial state seeds
82
+ * `loadActivated: true` so the composition behaves as if preload has
83
+ * already been activated — appropriate for ambient / hero / GIF-replacement
84
+ * surfaces that should start loading the moment a src is set.
85
+ *
86
+ * Native `loop` / `muted` / `autoplay` are adapter concerns and live on
87
+ * `BackgroundVideoMediaElement` rather than the engine.
88
+ *
89
+ * @example
90
+ * ```ts
91
+ * let signals: BackgroundVideoEngineSignals;
92
+ * const engine = createBackgroundVideoEngine({
93
+ * onSignalsReady: (refs) => {
94
+ * signals = refs;
95
+ * },
96
+ * });
97
+ *
98
+ * signals.context.mediaElement.set(videoEl);
99
+ * signals.state.presentation.set({ url: 'https://example.com/stream.m3u8' });
100
+ *
101
+ * await engine.destroy();
102
+ * ```
103
+ */
104
+ declare function createBackgroundVideoEngine(config?: BackgroundVideoEngineConfig): Composition<BackgroundVideoEngineState, BackgroundVideoEngineContext>;
105
+ //#endregion
106
+ export { BackgroundVideoEngineConfig, BackgroundVideoEngineContext, BackgroundVideoEngineSignals, BackgroundVideoEngineState, createBackgroundVideoEngine };
107
+ //# sourceMappingURL=engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.d.ts","names":[],"sources":["../../../../../src/playback/engines/background-video/engine.ts"],"mappings":";;;;;;;;;;;;AAqCA;;;;;;;UAAiB,0BAAA;EAQf;;;AAMF;EATE,YAAA,GAAe,yBAAA;EACf,OAAA;EACA,oBAAA;EACA,aAAA;AAAA;;;;UAMe,4BAAA;EACf,YAAA,GAAe,gBAAA;EACf,WAAA,GAAc,WAAA;EACd,gBAAA,GAAmB,iBAAA;EACnB,uBAAA,GAA0B,kBAAA;AAAA;;;;;AAS5B;;KAAY,4BAAA;EACV,KAAA,EAAO,YAAA,CAAa,0BAAA;EACpB,OAAA,EAAS,cAAA,CAAe,4BAAA;AAAA;;;;;;;;;UAWT,2BAAA,SACP,kBAAA,CAAmB,0BAAA,EAA4B,4BAAA;EAZH;;AAWtD;;;;;;;EAWE,MAAA,GAAS,WAAA,CAAY,sBAAA;EAVb;;;;EAeR,iBAAA,GAAoB,iBAAA;AAAA;;;;;;;;AAuCtB;;;;;;;;;;;;;;;;;;;;;;;iBAAgB,2BAAA,CACd,MAAA,GAAQ,2BAAA,GACP,WAAA,CAAY,0BAAA,EAA4B,4BAAA"}
@@ -0,0 +1,75 @@
1
+ import { createComposition } from "../../../core/composition/create-composition.js";
2
+ import { makeShareSignals } from "../../../core/composition/share-signals.js";
3
+ import { loadVideoSegments } from "../../behaviors/dom/load-segments.js";
4
+ import { trackCurrentTime } from "../../behaviors/dom/track-current-time.js";
5
+ import { parseMultivariantPlaylist } from "../../../media/hls/parse-multivariant.js";
6
+ import { getResolvedSelectedTrackDuration } from "../../../media/utils/track-selection.js";
7
+ import { calculatePresentationDuration } from "../../behaviors/calculate-presentation-duration.js";
8
+ import { endOfStream } from "../../behaviors/dom/end-of-stream.js";
9
+ import { setupVideoBufferActors } from "../../behaviors/dom/setup-buffer-actors.js";
10
+ import { setupMediaSource } from "../../behaviors/dom/setup-mediasource.js";
11
+ import { updateMediaSourceDuration } from "../../behaviors/dom/update-mediasource-duration.js";
12
+ import { resolvePresentation } from "../../behaviors/resolve-presentation.js";
13
+ import { resolveVideoTrack } from "../../behaviors/resolve-track.js";
14
+ import { pickHighestResolutionVideoTrack } from "../../../media/primitives/select-tracks.js";
15
+ import { selectVideoTrack } from "../../behaviors/select-tracks.js";
16
+ //#region src/playback/engines/background-video/engine.ts
17
+ const shareSignals = makeShareSignals();
18
+ /**
19
+ * Create a background-video playback engine.
20
+ *
21
+ * Subtractive composition over the HLS engine baseline:
22
+ * audio-side, text-side, ABR-driven, preload-monitoring, and play/seek
23
+ * load-trigger behaviors are removed. `selectVideoTrack` (with a
24
+ * max-resolution picker by default) replaces `switchVideoQuality`, pinning
25
+ * a single rendition for the session. The initial state seeds
26
+ * `loadActivated: true` so the composition behaves as if preload has
27
+ * already been activated — appropriate for ambient / hero / GIF-replacement
28
+ * surfaces that should start loading the moment a src is set.
29
+ *
30
+ * Native `loop` / `muted` / `autoplay` are adapter concerns and live on
31
+ * `BackgroundVideoMediaElement` rather than the engine.
32
+ *
33
+ * @example
34
+ * ```ts
35
+ * let signals: BackgroundVideoEngineSignals;
36
+ * const engine = createBackgroundVideoEngine({
37
+ * onSignalsReady: (refs) => {
38
+ * signals = refs;
39
+ * },
40
+ * });
41
+ *
42
+ * signals.context.mediaElement.set(videoEl);
43
+ * signals.state.presentation.set({ url: 'https://example.com/stream.m3u8' });
44
+ *
45
+ * await engine.destroy();
46
+ * ```
47
+ */
48
+ function createBackgroundVideoEngine(config = {}) {
49
+ const finalConfig = {
50
+ ...config,
51
+ picker: config.picker ?? pickHighestResolutionVideoTrack,
52
+ parsePresentation: config.parsePresentation ?? parseMultivariantPlaylist,
53
+ resolveDuration: getResolvedSelectedTrackDuration
54
+ };
55
+ return createComposition([
56
+ resolvePresentation,
57
+ calculatePresentationDuration,
58
+ selectVideoTrack,
59
+ resolveVideoTrack,
60
+ loadVideoSegments,
61
+ setupMediaSource,
62
+ updateMediaSourceDuration,
63
+ setupVideoBufferActors,
64
+ trackCurrentTime,
65
+ endOfStream,
66
+ shareSignals
67
+ ], {
68
+ config: finalConfig,
69
+ initialState: { loadActivated: true }
70
+ });
71
+ }
72
+ //#endregion
73
+ export { createBackgroundVideoEngine };
74
+
75
+ //# sourceMappingURL=engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.js","names":[],"sources":["../../../../../src/playback/engines/background-video/engine.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 { parseMultivariantPlaylist } from '../../../media/hls/parse-multivariant';\nimport { pickHighestResolutionVideoTrack, type TrackPicker } from '../../../media/primitives/select-tracks';\nimport type { MaybeResolvedPresentation } from '../../../media/types';\nimport { getResolvedSelectedTrackDuration } from '../../../media/utils/track-selection';\nimport type { SegmentLoaderActor } from '../../actors/dom/segment-loader';\nimport type { SourceBufferActor } from '../../actors/dom/source-buffer';\nimport { calculatePresentationDuration } from '../../behaviors/calculate-presentation-duration';\nimport { endOfStream } from '../../behaviors/dom/end-of-stream';\nimport { loadVideoSegments } from '../../behaviors/dom/load-segments';\nimport { setupVideoBufferActors } from '../../behaviors/dom/setup-buffer-actors';\nimport { setupMediaSource } from '../../behaviors/dom/setup-mediasource';\nimport { trackCurrentTime } from '../../behaviors/dom/track-current-time';\nimport { updateMediaSourceDuration } from '../../behaviors/dom/update-mediasource-duration';\nimport { type ParsePresentation, resolvePresentation } from '../../behaviors/resolve-presentation';\nimport { resolveVideoTrack } from '../../behaviors/resolve-track';\nimport { type SelectVideoTrackConfig, selectVideoTrack } from '../../behaviors/select-tracks';\n\n// ============================================================================\n// Background-video engine state & context\n// ============================================================================\n\n/**\n * State shape for the background-video playback engine.\n *\n * Narrower than `SimpleHlsEngineState`: audio/text track slots are absent\n * because their selection/resolution behaviors are subtracted. `bandwidthState`\n * is present because `setupVideoBufferActors` declares it and `loadVideoSegments`\n * samples into it (wasted work in this variant — a Phase 3 alt-impl will skip\n * sampling).\n */\nexport interface BackgroundVideoEngineState {\n /**\n * The presentation being played. A caller writes `{ url }`;\n * `resolvePresentation` parses the manifest and populates the rest.\n */\n presentation?: MaybeResolvedPresentation;\n preload?: 'auto' | 'metadata' | 'none';\n selectedVideoTrackId?: string;\n loadActivated?: boolean;\n}\n\n/**\n * Context shape for the background-video engine.\n */\nexport interface BackgroundVideoEngineContext {\n mediaElement?: HTMLMediaElement | undefined;\n mediaSource?: MediaSource;\n videoBufferActor?: SourceBufferActor;\n videoSegmentLoaderActor?: SegmentLoaderActor;\n}\n\n/**\n * The composition signal refs handed to `onSignalsReady` callers — the\n * canonical way to drive the engine externally (writes) or observe its\n * state (reads) without touching `composition.state` / `composition.context`\n * directly.\n */\nexport type BackgroundVideoEngineSignals = {\n state: StateSignals<BackgroundVideoEngineState>;\n context: ContextSignals<BackgroundVideoEngineContext>;\n};\n\n/**\n * Configuration for the background-video engine.\n *\n * Each option is consumed by the appropriate behavior — the engine itself\n * has no config beyond what its behaviors read. Compared to\n * `SimpleHlsEngineConfig`, audio/text/ABR/bandwidth/quality knobs are\n * dropped: the variant subtracts the behaviors that read them.\n */\nexport interface BackgroundVideoEngineConfig\n extends ShareSignalsConfig<BackgroundVideoEngineState, BackgroundVideoEngineContext> {\n /**\n * Track picker handed to `selectVideoTrack`. Default:\n * `pickHighestResolutionVideoTrack` — picks the highest-resolution variant on\n * presentation resolve and pins it for the session. Override for\n * mobile-aware or content-aware caps.\n *\n * Adapters (e.g. `BackgroundVideoMediaElement`) install their own\n * picker; this default applies when the engine is constructed directly.\n */\n picker?: TrackPicker<SelectVideoTrackConfig>;\n /**\n * Manifest parser handed to `resolvePresentation`. Defaults to the HLS\n * multivariant-playlist parser.\n */\n parsePresentation?: ParsePresentation;\n}\n\n// ============================================================================\n// Background-video playback engine\n// ============================================================================\n\nconst shareSignals = makeShareSignals<BackgroundVideoEngineState, BackgroundVideoEngineContext>();\n\n/**\n * Create a background-video playback engine.\n *\n * Subtractive composition over the HLS engine baseline:\n * audio-side, text-side, ABR-driven, preload-monitoring, and play/seek\n * load-trigger behaviors are removed. `selectVideoTrack` (with a\n * max-resolution picker by default) replaces `switchVideoQuality`, pinning\n * a single rendition for the session. The initial state seeds\n * `loadActivated: true` so the composition behaves as if preload has\n * already been activated — appropriate for ambient / hero / GIF-replacement\n * surfaces that should start loading the moment a src is set.\n *\n * Native `loop` / `muted` / `autoplay` are adapter concerns and live on\n * `BackgroundVideoMediaElement` rather than the engine.\n *\n * @example\n * ```ts\n * let signals: BackgroundVideoEngineSignals;\n * const engine = createBackgroundVideoEngine({\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 * await engine.destroy();\n * ```\n */\nexport function createBackgroundVideoEngine(\n config: BackgroundVideoEngineConfig = {}\n): Composition<BackgroundVideoEngineState, BackgroundVideoEngineContext> {\n const finalConfig = {\n ...config,\n picker: config.picker ?? pickHighestResolutionVideoTrack,\n parsePresentation: config.parsePresentation ?? parseMultivariantPlaylist,\n resolveDuration: getResolvedSelectedTrackDuration,\n };\n\n return createComposition(\n [\n resolvePresentation,\n // Presentation duration\n calculatePresentationDuration,\n\n // Track selection - pinned single-rendition pick on presentation resolve.\n selectVideoTrack,\n // Resolve selected video track (fetch its media playlist)\n resolveVideoTrack,\n // Segment loading — video-only.\n loadVideoSegments,\n\n // MSE setup — video-only.\n setupMediaSource,\n updateMediaSourceDuration,\n setupVideoBufferActors,\n\n // Playback tracking\n trackCurrentTime,\n\n // End of stream coordination\n endOfStream,\n\n // Behavior whose sole purpose is to expose signal refs via a callback\n // (e.g. to an adapter). Listed last so initial signal setup has run\n // before the callback fires.\n shareSignals,\n ],\n {\n config: finalConfig,\n initialState: {\n // Note: Set to true until we add preload configuration\n loadActivated: true,\n },\n }\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAoGA,MAAM,eAAe,kBAA4E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgCjG,SAAgB,4BACd,SAAsC,EAAE,EAC+B;CACvE,MAAM,cAAc;EAClB,GAAG;EACH,QAAQ,OAAO,UAAU;EACzB,mBAAmB,OAAO,qBAAqB;EAC/C,iBAAiB;EAClB;AAED,QAAO,kBACL;EACE;EAEA;EAGA;EAEA;EAEA;EAGA;EACA;EACA;EAGA;EAGA;EAKA;EACD,EACD;EACE,QAAQ;EACR,cAAc,EAEZ,eAAe,MAChB;EACF,CACF"}
@@ -0,0 +1,45 @@
1
+ import { Composition } from "../../../core/composition/create-composition.js";
2
+ import { SimpleHlsAudioOnlyEngineContext, SimpleHlsAudioOnlyEngineState } from "./engine-audio-only.js";
3
+ import { Constructor, MixinReturn } from "@videojs/utils/types";
4
+
5
+ //#region src/playback/engines/hls/adapter-audio-only.d.ts
6
+ interface SimpleHlsAudioOnlyMediaProps {
7
+ src: string;
8
+ preload: '' | 'none' | 'metadata' | 'auto';
9
+ }
10
+ declare const simpleHlsAudioOnlyMediaDefaultProps: SimpleHlsAudioOnlyMediaProps;
11
+ interface SimpleHlsAudioOnlyMediaAPI extends SimpleHlsAudioOnlyMediaProps {
12
+ readonly engine: Composition<SimpleHlsAudioOnlyEngineState, SimpleHlsAudioOnlyEngineContext>;
13
+ attach(mediaElement: HTMLMediaElement): void;
14
+ detach(): void;
15
+ destroy(): void;
16
+ play(): Promise<void>;
17
+ }
18
+ /**
19
+ * Mixin that adds SPF audio-only HLS playback to any base class.
20
+ *
21
+ * Parallel to `SimpleHlsMediaMixin` with one substantive difference: the
22
+ * underlying engine is the audio-only variant (`createHlsAudioOnlyEngine`),
23
+ * which omits video and text-track behaviors. The src / preload / play()
24
+ * contract per the WHATWG HTML spec is identical to the default adapter.
25
+ *
26
+ * Selecting this adapter is the variant decision: instantiating
27
+ * `SimpleHlsAudioOnlyMediaElement` opts the consumer into audio-only
28
+ * delivery even when the source is a mixed-AV HLS manifest.
29
+ *
30
+ * @example
31
+ * class SimpleHlsAudioOnlyMedia extends SimpleHlsAudioOnlyMediaMixin(HTMLVideoElementHost) {}
32
+ *
33
+ * const media = new SimpleHlsAudioOnlyMedia();
34
+ * media.attach(document.querySelector('video'));
35
+ * media.src = 'https://stream.mux.com/abc123.m3u8';
36
+ */
37
+ declare function SimpleHlsAudioOnlyMediaMixin<Base extends Constructor<any>>(BaseClass: Base): MixinReturn<Base, SimpleHlsAudioOnlyMediaAPI>;
38
+ declare const SimpleHlsAudioOnlyMediaElement_base: MixinReturn<{
39
+ new (): {};
40
+ }, SimpleHlsAudioOnlyMediaAPI>;
41
+ /** Standalone SPF audio-only media adapter with no base class. */
42
+ declare class SimpleHlsAudioOnlyMediaElement extends SimpleHlsAudioOnlyMediaElement_base {}
43
+ //#endregion
44
+ export { SimpleHlsAudioOnlyMediaAPI, SimpleHlsAudioOnlyMediaElement, SimpleHlsAudioOnlyMediaMixin, SimpleHlsAudioOnlyMediaProps, simpleHlsAudioOnlyMediaDefaultProps };
45
+ //# sourceMappingURL=adapter-audio-only.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter-audio-only.d.ts","names":[],"sources":["../../../../../src/playback/engines/hls/adapter-audio-only.ts"],"mappings":";;;;;UAUiB,4BAAA;EACf,GAAA;EACA,OAAA;AAAA;AAAA,cAGW,mCAAA,EAAqC,4BAAA;AAAA,UAKjC,0BAAA,SAAmC,4BAAA;EAAA,SACzC,MAAA,EAAQ,WAAA,CAAY,6BAAA,EAA+B,+BAAA;EAC5D,MAAA,CAAO,YAAA,EAAc,gBAAA;EACrB,MAAA;EACA,OAAA;EACA,IAAA,IAAQ,OAAA;AAAA;AALV;;;;;;;;;;;;;;;;;;;AAAA,iBA2BgB,4BAAA,cAA0C,WAAA,MAAA,CAAkB,SAAA,EAAW,IAAA,GA4IpC,WAAA,CAAY,IAAA,EAAM,0BAAA;AAAA,cACpE,mCAAA;;;;cAGY,8BAAA,SAAuC,mCAAA"}
@@ -0,0 +1,119 @@
1
+ import { createHlsAudioOnlyEngine } from "./engine-audio-only.js";
2
+ //#region src/playback/engines/hls/adapter-audio-only.ts
3
+ const simpleHlsAudioOnlyMediaDefaultProps = {
4
+ src: "",
5
+ preload: ""
6
+ };
7
+ /**
8
+ * Mixin that adds SPF audio-only HLS playback to any base class.
9
+ *
10
+ * Parallel to `SimpleHlsMediaMixin` with one substantive difference: the
11
+ * underlying engine is the audio-only variant (`createHlsAudioOnlyEngine`),
12
+ * which omits video and text-track behaviors. The src / preload / play()
13
+ * contract per the WHATWG HTML spec is identical to the default adapter.
14
+ *
15
+ * Selecting this adapter is the variant decision: instantiating
16
+ * `SimpleHlsAudioOnlyMediaElement` opts the consumer into audio-only
17
+ * delivery even when the source is a mixed-AV HLS manifest.
18
+ *
19
+ * @example
20
+ * class SimpleHlsAudioOnlyMedia extends SimpleHlsAudioOnlyMediaMixin(HTMLVideoElementHost) {}
21
+ *
22
+ * const media = new SimpleHlsAudioOnlyMedia();
23
+ * media.attach(document.querySelector('video'));
24
+ * media.src = 'https://stream.mux.com/abc123.m3u8';
25
+ */
26
+ function SimpleHlsAudioOnlyMediaMixin(BaseClass) {
27
+ class SimpleHlsAudioOnlyMediaImpl extends BaseClass {
28
+ #engine;
29
+ #config;
30
+ #signals;
31
+ #preload = simpleHlsAudioOnlyMediaDefaultProps.preload;
32
+ /** Pending loadstart listener from a deferred play() retry, if any. */
33
+ #loadstartListener = null;
34
+ constructor(...args) {
35
+ super(...args);
36
+ const { config } = args?.[0] ?? {};
37
+ this.#config = config;
38
+ this.#engine = this.#createEngine();
39
+ }
40
+ /**
41
+ * Underlying playback engine — the low-level SPF reactive composition that
42
+ * drives playback. An advanced escape hatch for direct engine access;
43
+ * normal playback is driven through this element's own properties and
44
+ * methods.
45
+ */
46
+ get engine() {
47
+ return this.#engine;
48
+ }
49
+ attach(mediaElement) {
50
+ super.attach?.(mediaElement);
51
+ this.#signals.context.mediaElement.set(mediaElement);
52
+ }
53
+ detach() {
54
+ this.#cancelPendingPlay();
55
+ this.#signals.context.mediaElement.set(void 0);
56
+ super.detach?.();
57
+ }
58
+ destroy() {
59
+ this.#cancelPendingPlay();
60
+ this.#engine.destroy();
61
+ }
62
+ /** Preload type (`'none'` / `'metadata'` / `'auto'`). */
63
+ get preload() {
64
+ return this.#preload;
65
+ }
66
+ set preload(value) {
67
+ this.#preload = value;
68
+ if (value) this.#signals.state.preload.set(value);
69
+ }
70
+ get src() {
71
+ return this.#signals.state.presentation.get()?.url ?? "";
72
+ }
73
+ set src(value) {
74
+ const prevMediaElement = this.#signals.context.mediaElement.get();
75
+ this.#cancelPendingPlay();
76
+ this.#engine.destroy();
77
+ this.#engine = this.#createEngine();
78
+ if (this.#preload) this.#signals.state.preload.set(this.#preload);
79
+ if (prevMediaElement) this.#signals.context.mediaElement.set(prevMediaElement);
80
+ if (value) this.#signals.state.presentation.set({ url: value });
81
+ }
82
+ play() {
83
+ const mediaElement = this.#signals.context.mediaElement.get();
84
+ if (!mediaElement) return Promise.reject(/* @__PURE__ */ new Error("SimpleHlsAudioOnlyMediaElement: no media element attached"));
85
+ this.#signals.state.loadActivated.set(true);
86
+ return mediaElement.play().catch((err) => {
87
+ if (this.src) return new Promise((resolve, reject) => {
88
+ const listener = () => {
89
+ this.#loadstartListener = null;
90
+ mediaElement.play().then(resolve, reject);
91
+ };
92
+ this.#loadstartListener = listener;
93
+ mediaElement.addEventListener("loadstart", listener, { once: true });
94
+ });
95
+ throw err;
96
+ });
97
+ }
98
+ #createEngine() {
99
+ return createHlsAudioOnlyEngine({
100
+ ...this.#config,
101
+ onSignalsReady: (signals) => {
102
+ this.#signals = signals;
103
+ }
104
+ });
105
+ }
106
+ #cancelPendingPlay() {
107
+ if (!this.#loadstartListener) return;
108
+ this.#signals.context.mediaElement.get()?.removeEventListener("loadstart", this.#loadstartListener);
109
+ this.#loadstartListener = null;
110
+ }
111
+ }
112
+ return SimpleHlsAudioOnlyMediaImpl;
113
+ }
114
+ /** Standalone SPF audio-only media adapter with no base class. */
115
+ var SimpleHlsAudioOnlyMediaElement = class extends SimpleHlsAudioOnlyMediaMixin(class {}) {};
116
+ //#endregion
117
+ export { SimpleHlsAudioOnlyMediaElement, SimpleHlsAudioOnlyMediaMixin, simpleHlsAudioOnlyMediaDefaultProps };
118
+
119
+ //# sourceMappingURL=adapter-audio-only.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter-audio-only.js","names":["#config","#engine","#createEngine","#signals","#cancelPendingPlay","#preload","#loadstartListener"],"sources":["../../../../../src/playback/engines/hls/adapter-audio-only.ts"],"sourcesContent":["import type { Constructor, MixinReturn } from '@videojs/utils/types';\nimport type { Composition } from '../../../core/composition/create-composition';\nimport {\n createHlsAudioOnlyEngine,\n type SimpleHlsAudioOnlyEngineConfig,\n type SimpleHlsAudioOnlyEngineContext,\n type SimpleHlsAudioOnlyEngineSignals,\n type SimpleHlsAudioOnlyEngineState,\n} from './engine-audio-only';\n\nexport interface SimpleHlsAudioOnlyMediaProps {\n src: string;\n preload: '' | 'none' | 'metadata' | 'auto';\n}\n\nexport const simpleHlsAudioOnlyMediaDefaultProps: SimpleHlsAudioOnlyMediaProps = {\n src: '',\n preload: '',\n};\n\nexport interface SimpleHlsAudioOnlyMediaAPI extends SimpleHlsAudioOnlyMediaProps {\n readonly engine: Composition<SimpleHlsAudioOnlyEngineState, SimpleHlsAudioOnlyEngineContext>;\n attach(mediaElement: HTMLMediaElement): void;\n detach(): void;\n destroy(): void;\n play(): Promise<void>;\n}\n\n/**\n * Mixin that adds SPF audio-only HLS playback to any base class.\n *\n * Parallel to `SimpleHlsMediaMixin` with one substantive difference: the\n * underlying engine is the audio-only variant (`createHlsAudioOnlyEngine`),\n * which omits video and text-track behaviors. The src / preload / play()\n * contract per the WHATWG HTML spec is identical to the default adapter.\n *\n * Selecting this adapter is the variant decision: instantiating\n * `SimpleHlsAudioOnlyMediaElement` opts the consumer into audio-only\n * delivery even when the source is a mixed-AV HLS manifest.\n *\n * @example\n * class SimpleHlsAudioOnlyMedia extends SimpleHlsAudioOnlyMediaMixin(HTMLVideoElementHost) {}\n *\n * const media = new SimpleHlsAudioOnlyMedia();\n * media.attach(document.querySelector('video'));\n * media.src = 'https://stream.mux.com/abc123.m3u8';\n */\nexport function SimpleHlsAudioOnlyMediaMixin<Base extends Constructor<any>>(BaseClass: Base) {\n class SimpleHlsAudioOnlyMediaImpl extends BaseClass {\n #engine: Composition<SimpleHlsAudioOnlyEngineState, SimpleHlsAudioOnlyEngineContext>;\n #config: SimpleHlsAudioOnlyEngineConfig;\n #signals!: SimpleHlsAudioOnlyEngineSignals;\n #preload: '' | 'none' | 'metadata' | 'auto' = simpleHlsAudioOnlyMediaDefaultProps.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<SimpleHlsAudioOnlyEngineState, SimpleHlsAudioOnlyEngineContext> {\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 }\n\n // -------------------------------------------------------------------------\n // src — synchronous IDL attribute (WHATWG §4.8.11.2)\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 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 // -------------------------------------------------------------------------\n\n play(): Promise<void> {\n const mediaElement = this.#signals.context.mediaElement.get();\n if (!mediaElement) {\n return Promise.reject(new Error('SimpleHlsAudioOnlyMediaElement: no media element attached'));\n }\n\n this.#signals.state.loadActivated.set(true);\n\n return mediaElement.play().catch((err: unknown) => {\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<SimpleHlsAudioOnlyEngineState, SimpleHlsAudioOnlyEngineContext> {\n return createHlsAudioOnlyEngine({\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 SimpleHlsAudioOnlyMediaImpl as unknown as MixinReturn<Base, SimpleHlsAudioOnlyMediaAPI>;\n}\n\n/** Standalone SPF audio-only media adapter with no base class. */\nexport class SimpleHlsAudioOnlyMediaElement extends SimpleHlsAudioOnlyMediaMixin(class {}) {}\n"],"mappings":";;AAeA,MAAa,sCAAoE;CAC/E,KAAK;CACL,SAAS;CACV;;;;;;;;;;;;;;;;;;;;AA6BD,SAAgB,6BAA4D,WAAiB;CAC3F,MAAM,oCAAoC,UAAU;EAClD;EACA;EACA;EACA,WAA8C,oCAAoC;;EAGlF,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,SAAsF;AACxF,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;;EAQ1C,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;AAEnC,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;;EAQxD,OAAsB;GACpB,MAAM,eAAe,MAAA,QAAc,QAAQ,aAAa,KAAK;AAC7D,OAAI,CAAC,aACH,QAAO,QAAQ,uBAAO,IAAI,MAAM,4DAA4D,CAAC;AAG/F,SAAA,QAAc,MAAM,cAAc,IAAI,KAAK;AAE3C,UAAO,aAAa,MAAM,CAAC,OAAO,QAAiB;AACjD,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,gBAA6F;AAC3F,UAAO,yBAAyB;IAC9B,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,iCAAb,cAAoD,6BAA6B,MAAM,GAAG,CAAC"}
@@ -1,14 +1,15 @@
1
- import { PlaybackEngine } from "./engine.js";
1
+ import { Composition } from "../../../core/composition/create-composition.js";
2
+ import { SimpleHlsEngineContext, SimpleHlsEngineState } from "./engine.js";
2
3
  import { Constructor, MixinReturn } from "@videojs/utils/types";
3
4
 
4
- //#region src/dom/playback-engine/adapter.d.ts
5
- interface SpfMediaProps {
5
+ //#region src/playback/engines/hls/adapter.d.ts
6
+ interface SimpleHlsMediaProps {
6
7
  src: string;
7
8
  preload: '' | 'none' | 'metadata' | 'auto';
8
9
  }
9
- declare const spfMediaDefaultProps: SpfMediaProps;
10
- interface SpfMediaAPI extends SpfMediaProps {
11
- readonly engine: PlaybackEngine;
10
+ declare const simpleHlsMediaDefaultProps: SimpleHlsMediaProps;
11
+ interface SimpleHlsMediaAPI extends SimpleHlsMediaProps {
12
+ readonly engine: Composition<SimpleHlsEngineState, SimpleHlsEngineContext>;
12
13
  attach(mediaElement: HTMLMediaElement): void;
13
14
  detach(): void;
14
15
  destroy(): void;
@@ -26,18 +27,18 @@ interface SpfMediaAPI extends SpfMediaProps {
26
27
  * changes and re-applied to the new engine automatically.
27
28
  *
28
29
  * @example
29
- * class SimpleHlsMedia extends SpfMediaMixin(HTMLVideoElementHost) {}
30
+ * class SimpleHlsMedia extends SimpleHlsMediaMixin(HTMLVideoElementHost) {}
30
31
  *
31
32
  * const media = new SimpleHlsMedia();
32
33
  * media.attach(document.querySelector('video'));
33
34
  * media.src = 'https://stream.mux.com/abc123.m3u8';
34
35
  */
35
- declare function SpfMediaMixin<Base extends Constructor<any>>(BaseClass: Base): MixinReturn<Base, SpfMediaAPI>;
36
- declare const SpfMedia_base: MixinReturn<{
36
+ declare function SimpleHlsMediaMixin<Base extends Constructor<any>>(BaseClass: Base): MixinReturn<Base, SimpleHlsMediaAPI>;
37
+ declare const SimpleHlsMediaElement_base: MixinReturn<{
37
38
  new (): {};
38
- }, SpfMediaAPI>;
39
+ }, SimpleHlsMediaAPI>;
39
40
  /** Standalone SPF media adapter with no base class. */
40
- declare class SpfMedia extends SpfMedia_base {}
41
+ declare class SimpleHlsMediaElement extends SimpleHlsMediaElement_base {}
41
42
  //#endregion
42
- export { SpfMedia, SpfMediaAPI, SpfMediaMixin, SpfMediaProps, spfMediaDefaultProps };
43
+ export { SimpleHlsMediaAPI, SimpleHlsMediaElement, SimpleHlsMediaMixin, SimpleHlsMediaProps, simpleHlsMediaDefaultProps };
43
44
  //# sourceMappingURL=adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.d.ts","names":[],"sources":["../../../../../src/playback/engines/hls/adapter.ts"],"mappings":";;;;;UAUiB,mBAAA;EACf,GAAA;EACA,OAAA;AAAA;AAAA,cAGW,0BAAA,EAA4B,mBAAA;AAAA,UAKxB,iBAAA,SAA0B,mBAAA;EAAA,SAChC,MAAA,EAAQ,WAAA,CAAY,oBAAA,EAAsB,sBAAA;EACnD,MAAA,CAAO,YAAA,EAAc,gBAAA;EACrB,MAAA;EACA,OAAA;EACA,IAAA,IAAQ,OAAA;AAAA;AALV;;;;;;;;;;;;;;;;;;AAAA,iBA0BgB,mBAAA,cAAiC,WAAA,MAAA,CAAkB,SAAA,EAAW,IAAA,GA0JpC,WAAA,CAAY,IAAA,EAAM,iBAAA;AAAA,cAC3D,0BAAA;;;;cAGY,qBAAA,SAA8B,0BAAA"}