@videojs/spf 10.0.0-beta.9 → 10.0.0-rc.2

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 (556) hide show
  1. package/README.md +19 -38
  2. package/dist/default/core/actors/create-machine-actor.js +89 -0
  3. package/dist/default/core/actors/create-machine-actor.js.map +1 -0
  4. package/dist/default/core/actors/create-transition-actor.js +44 -0
  5. package/dist/default/core/actors/create-transition-actor.js.map +1 -0
  6. package/dist/default/core/composition/create-composition.js +82 -0
  7. package/dist/default/core/composition/create-composition.js.map +1 -0
  8. package/dist/default/core/composition/share-signals.js +34 -0
  9. package/dist/default/core/composition/share-signals.js.map +1 -0
  10. package/dist/default/core/machine.js +25 -0
  11. package/dist/default/core/machine.js.map +1 -0
  12. package/dist/default/core/reactors/create-machine-reactor.js +84 -0
  13. package/dist/default/core/reactors/create-machine-reactor.js.map +1 -0
  14. package/dist/default/core/signals/effect.js +61 -0
  15. package/dist/default/core/signals/effect.js.map +1 -0
  16. package/dist/default/core/signals/primitives.js +50 -0
  17. package/dist/default/core/signals/primitives.js.map +1 -0
  18. package/dist/default/core/signals/when.js +36 -0
  19. package/dist/default/core/signals/when.js.map +1 -0
  20. package/dist/default/core/tasks/delayed-reschedule.js +27 -0
  21. package/dist/default/core/tasks/delayed-reschedule.js.map +1 -0
  22. package/dist/default/core/tasks/task.js +298 -0
  23. package/dist/default/core/tasks/task.js.map +1 -0
  24. package/dist/default/dom.js +9 -0
  25. package/dist/default/hls-audio.js +3 -0
  26. package/dist/default/hls-background-video.js +3 -0
  27. package/dist/default/hls-video.js +4 -0
  28. package/dist/default/hls.js +10 -0
  29. package/dist/default/index.js +22 -0
  30. package/dist/default/index.js.map +1 -0
  31. package/dist/default/media/abr/quality-selection.js +17 -0
  32. package/dist/default/media/abr/quality-selection.js.map +1 -0
  33. package/dist/default/media/buffer/back-buffer.js +42 -0
  34. package/dist/default/media/buffer/back-buffer.js.map +1 -0
  35. package/dist/default/media/buffer/forward-buffer.js +110 -0
  36. package/dist/default/media/buffer/forward-buffer.js.map +1 -0
  37. package/dist/default/media/dom/capabilities.js +61 -0
  38. package/dist/default/media/dom/capabilities.js.map +1 -0
  39. package/dist/default/media/dom/mse/append-segment.js +58 -0
  40. package/dist/default/media/dom/mse/append-segment.js.map +1 -0
  41. package/dist/default/media/dom/mse/buffer-flusher.js +55 -0
  42. package/dist/default/media/dom/mse/buffer-flusher.js.map +1 -0
  43. package/dist/default/media/dom/mse/duration.js +87 -0
  44. package/dist/default/media/dom/mse/duration.js.map +1 -0
  45. package/dist/default/media/dom/mse/end-of-stream.js +17 -0
  46. package/dist/default/media/dom/mse/end-of-stream.js.map +1 -0
  47. package/dist/default/media/dom/mse/mediasource-setup.js +227 -0
  48. package/dist/default/media/dom/mse/mediasource-setup.js.map +1 -0
  49. package/dist/default/media/dom/screen.js +95 -0
  50. package/dist/default/media/dom/screen.js.map +1 -0
  51. package/dist/default/media/dom/text/resolve-vtt-segment.js +50 -0
  52. package/dist/default/media/dom/text/resolve-vtt-segment.js.map +1 -0
  53. package/dist/default/media/dom/text/text-track-slots.js +61 -0
  54. package/dist/default/media/dom/text/text-track-slots.js.map +1 -0
  55. package/dist/default/media/errors.js +60 -0
  56. package/dist/default/media/errors.js.map +1 -0
  57. package/dist/default/media/hls/parse-attributes.js +131 -0
  58. package/dist/default/media/hls/parse-attributes.js.map +1 -0
  59. package/dist/default/media/hls/parse-media-playlist.js +253 -0
  60. package/dist/default/media/hls/parse-media-playlist.js.map +1 -0
  61. package/dist/default/media/hls/parse-multivariant.js +234 -0
  62. package/dist/default/media/hls/parse-multivariant.js.map +1 -0
  63. package/dist/default/media/hls/reload-policy.js +63 -0
  64. package/dist/default/media/hls/reload-policy.js.map +1 -0
  65. package/dist/default/media/hls/resolve-url.js +9 -0
  66. package/dist/default/media/hls/resolve-url.js.map +1 -0
  67. package/dist/default/media/live-window.js +32 -0
  68. package/dist/default/media/live-window.js.map +1 -0
  69. package/dist/default/media/media-tracks/media-tracks.js +96 -0
  70. package/dist/default/media/media-tracks/media-tracks.js.map +1 -0
  71. package/dist/default/media/mp4/box.js +57 -0
  72. package/dist/default/media/mp4/box.js.map +1 -0
  73. package/dist/default/media/mp4/timestamp-origin.js +95 -0
  74. package/dist/default/media/mp4/timestamp-origin.js.map +1 -0
  75. package/dist/default/media/primitives/resolution.js +26 -0
  76. package/dist/default/media/primitives/resolution.js.map +1 -0
  77. package/dist/default/media/primitives/select-tracks.js +97 -0
  78. package/dist/default/media/primitives/select-tracks.js.map +1 -0
  79. package/dist/default/media/text/parse-vtt-timestamp-map.js +40 -0
  80. package/dist/default/media/text/parse-vtt-timestamp-map.js.map +1 -0
  81. package/dist/default/media/text/resolve-vtt-metadata.js +22 -0
  82. package/dist/default/media/text/resolve-vtt-metadata.js.map +1 -0
  83. package/dist/default/media/types/index.js +42 -0
  84. package/dist/default/media/types/index.js.map +1 -0
  85. package/dist/default/media/utils/cdn.js +50 -0
  86. package/dist/default/media/utils/cdn.js.map +1 -0
  87. package/dist/default/media/utils/preload.js +21 -0
  88. package/dist/default/media/utils/preload.js.map +1 -0
  89. package/dist/default/media/utils/track-selection.js +43 -0
  90. package/dist/default/media/utils/track-selection.js.map +1 -0
  91. package/dist/default/media/utils/tracks.js +146 -0
  92. package/dist/default/media/utils/tracks.js.map +1 -0
  93. package/dist/default/media-tracks.js +2 -0
  94. package/dist/default/network/bandwidth-estimator.js +95 -0
  95. package/dist/default/network/bandwidth-estimator.js.map +1 -0
  96. package/dist/default/network/chunked-stream-iterable.js +47 -0
  97. package/dist/default/network/chunked-stream-iterable.js.map +1 -0
  98. package/dist/default/network/ewma.js +68 -0
  99. package/dist/default/network/ewma.js.map +1 -0
  100. package/dist/default/network/fetch.js +108 -0
  101. package/dist/default/network/fetch.js.map +1 -0
  102. package/dist/default/playback/actors/dom/segment-loader.js +233 -0
  103. package/dist/default/playback/actors/dom/segment-loader.js.map +1 -0
  104. package/dist/default/playback/actors/dom/source-buffer.js +139 -0
  105. package/dist/default/playback/actors/dom/source-buffer.js.map +1 -0
  106. package/dist/default/playback/actors/dom/text-tracks.js +46 -0
  107. package/dist/default/playback/actors/dom/text-tracks.js.map +1 -0
  108. package/dist/default/playback/actors/text-track-segment-loader.js +138 -0
  109. package/dist/default/playback/actors/text-track-segment-loader.js.map +1 -0
  110. package/dist/default/playback/adapters/hls-audio/adapter.js +8 -0
  111. package/dist/default/playback/adapters/hls-audio/adapter.js.map +1 -0
  112. package/dist/default/playback/adapters/hls-audio/mixin.js +178 -0
  113. package/dist/default/playback/adapters/hls-audio/mixin.js.map +1 -0
  114. package/dist/default/playback/adapters/hls-background-video/adapter.js +17 -0
  115. package/dist/default/playback/adapters/hls-background-video/adapter.js.map +1 -0
  116. package/dist/default/playback/adapters/hls-background-video/host.js +56 -0
  117. package/dist/default/playback/adapters/hls-background-video/host.js.map +1 -0
  118. package/dist/default/playback/adapters/hls-background-video/mixin.js +191 -0
  119. package/dist/default/playback/adapters/hls-background-video/mixin.js.map +1 -0
  120. package/dist/default/playback/adapters/hls-video/adapter.js +11 -0
  121. package/dist/default/playback/adapters/hls-video/adapter.js.map +1 -0
  122. package/dist/default/playback/adapters/hls-video/error-surface.js +46 -0
  123. package/dist/default/playback/adapters/hls-video/error-surface.js.map +1 -0
  124. package/dist/default/playback/adapters/hls-video/media-tracks.js +125 -0
  125. package/dist/default/playback/adapters/hls-video/media-tracks.js.map +1 -0
  126. package/dist/default/playback/adapters/hls-video/mixin.js +299 -0
  127. package/dist/default/playback/adapters/hls-video/mixin.js.map +1 -0
  128. package/dist/default/playback/behaviors/calculate-presentation-duration.js +33 -0
  129. package/dist/default/playback/behaviors/calculate-presentation-duration.js.map +1 -0
  130. package/dist/default/playback/behaviors/collect-errors.js +98 -0
  131. package/dist/default/playback/behaviors/collect-errors.js.map +1 -0
  132. package/dist/default/playback/behaviors/derive-cdn-priority.js +61 -0
  133. package/dist/default/playback/behaviors/derive-cdn-priority.js.map +1 -0
  134. package/dist/default/playback/behaviors/dom/airplay.js +188 -0
  135. package/dist/default/playback/behaviors/dom/airplay.js.map +1 -0
  136. package/dist/default/playback/behaviors/dom/apply-start-position.js +81 -0
  137. package/dist/default/playback/behaviors/dom/apply-start-position.js.map +1 -0
  138. package/dist/default/playback/behaviors/dom/end-of-stream.js +97 -0
  139. package/dist/default/playback/behaviors/dom/end-of-stream.js.map +1 -0
  140. package/dist/default/playback/behaviors/dom/load-segments.js +169 -0
  141. package/dist/default/playback/behaviors/dom/load-segments.js.map +1 -0
  142. package/dist/default/playback/behaviors/dom/recover-end-stall.js +72 -0
  143. package/dist/default/playback/behaviors/dom/recover-end-stall.js.map +1 -0
  144. package/dist/default/playback/behaviors/dom/seek-to-live-edge.js +113 -0
  145. package/dist/default/playback/behaviors/dom/seek-to-live-edge.js.map +1 -0
  146. package/dist/default/playback/behaviors/dom/setup-buffer-actors.js +181 -0
  147. package/dist/default/playback/behaviors/dom/setup-buffer-actors.js.map +1 -0
  148. package/dist/default/playback/behaviors/dom/setup-mediasource.js +100 -0
  149. package/dist/default/playback/behaviors/dom/setup-mediasource.js.map +1 -0
  150. package/dist/default/playback/behaviors/dom/setup-text-track-actors.js +40 -0
  151. package/dist/default/playback/behaviors/dom/setup-text-track-actors.js.map +1 -0
  152. package/dist/default/playback/behaviors/dom/sync-live-seekable-range.js +25 -0
  153. package/dist/default/playback/behaviors/dom/sync-live-seekable-range.js.map +1 -0
  154. package/dist/default/playback/behaviors/dom/sync-text-tracks.js +109 -0
  155. package/dist/default/playback/behaviors/dom/sync-text-tracks.js.map +1 -0
  156. package/dist/default/playback/behaviors/dom/track-current-time.js +50 -0
  157. package/dist/default/playback/behaviors/dom/track-current-time.js.map +1 -0
  158. package/dist/default/playback/behaviors/dom/track-load-triggers.js +86 -0
  159. package/dist/default/playback/behaviors/dom/track-load-triggers.js.map +1 -0
  160. package/dist/default/playback/behaviors/dom/track-playback-rate.js +35 -0
  161. package/dist/default/playback/behaviors/dom/track-playback-rate.js.map +1 -0
  162. package/dist/default/playback/behaviors/dom/track-player-resolution.js +53 -0
  163. package/dist/default/playback/behaviors/dom/track-player-resolution.js.map +1 -0
  164. package/dist/default/playback/behaviors/dom/track-screen-resolution.js +28 -0
  165. package/dist/default/playback/behaviors/dom/track-screen-resolution.js.map +1 -0
  166. package/dist/default/playback/behaviors/dom/update-mediasource-duration.js +98 -0
  167. package/dist/default/playback/behaviors/dom/update-mediasource-duration.js.map +1 -0
  168. package/dist/default/playback/behaviors/establish-start-media-time.js +187 -0
  169. package/dist/default/playback/behaviors/establish-start-media-time.js.map +1 -0
  170. package/dist/default/playback/behaviors/resolve-presentation.js +76 -0
  171. package/dist/default/playback/behaviors/resolve-presentation.js.map +1 -0
  172. package/dist/default/playback/behaviors/resolve-track.js +134 -0
  173. package/dist/default/playback/behaviors/resolve-track.js.map +1 -0
  174. package/dist/default/playback/behaviors/select-tracks.js +189 -0
  175. package/dist/default/playback/behaviors/select-tracks.js.map +1 -0
  176. package/dist/default/playback/behaviors/setup-failover-monitor.js +61 -0
  177. package/dist/default/playback/behaviors/setup-failover-monitor.js.map +1 -0
  178. package/dist/default/playback/behaviors/sync-preload.js +59 -0
  179. package/dist/default/playback/behaviors/sync-preload.js.map +1 -0
  180. package/dist/default/playback/behaviors/track-switching.js +407 -0
  181. package/dist/default/playback/behaviors/track-switching.js.map +1 -0
  182. package/dist/default/playback/engines/hls/engine-audio-only.js +94 -0
  183. package/dist/default/playback/engines/hls/engine-audio-only.js.map +1 -0
  184. package/dist/default/playback/engines/hls/engine-background-video.js +87 -0
  185. package/dist/default/playback/engines/hls/engine-background-video.js.map +1 -0
  186. package/dist/default/playback/engines/hls/engine.js +144 -0
  187. package/dist/default/playback/engines/hls/engine.js.map +1 -0
  188. package/dist/default/playback/primitives/error-messages.js +42 -0
  189. package/dist/default/playback/primitives/error-messages.js.map +1 -0
  190. package/dist/default/playback/primitives/failover-fetch.js +37 -0
  191. package/dist/default/playback/primitives/failover-fetch.js.map +1 -0
  192. package/dist/default/playback/primitives/head-peek.js +41 -0
  193. package/dist/default/playback/primitives/head-peek.js.map +1 -0
  194. package/dist/default/playback/primitives/live-window.js +63 -0
  195. package/dist/default/playback/primitives/live-window.js.map +1 -0
  196. package/dist/default/playback/primitives/relocation-pipelines.js +191 -0
  197. package/dist/default/playback/primitives/relocation-pipelines.js.map +1 -0
  198. package/dist/default/playback/primitives/report-track-conditions.js +74 -0
  199. package/dist/default/playback/primitives/report-track-conditions.js.map +1 -0
  200. package/dist/default/playback/primitives/segment-load-pipeline.js +96 -0
  201. package/dist/default/playback/primitives/segment-load-pipeline.js.map +1 -0
  202. package/dist/default/playback/primitives/selection-rules.js +115 -0
  203. package/dist/default/playback/primitives/selection-rules.js.map +1 -0
  204. package/dist/default/playback/primitives/text-segment-load-pipeline.js +36 -0
  205. package/dist/default/playback/primitives/text-segment-load-pipeline.js.map +1 -0
  206. package/dist/default/playback/primitives/track-types.js +53 -0
  207. package/dist/default/playback/primitives/track-types.js.map +1 -0
  208. package/dist/dev/core/actors/actor.d.ts +26 -0
  209. package/dist/dev/core/actors/actor.d.ts.map +1 -0
  210. package/dist/dev/core/actors/create-machine-actor.d.ts +119 -0
  211. package/dist/dev/core/actors/create-machine-actor.d.ts.map +1 -0
  212. package/dist/dev/core/actors/create-machine-actor.js +89 -0
  213. package/dist/dev/core/actors/create-machine-actor.js.map +1 -0
  214. package/dist/dev/core/actors/create-transition-actor.d.ts +37 -0
  215. package/dist/dev/core/actors/create-transition-actor.d.ts.map +1 -0
  216. package/dist/dev/core/actors/create-transition-actor.js +44 -0
  217. package/dist/dev/core/actors/create-transition-actor.js.map +1 -0
  218. package/dist/dev/core/composition/create-composition.d.ts +241 -0
  219. package/dist/dev/core/composition/create-composition.d.ts.map +1 -0
  220. package/dist/dev/core/composition/create-composition.js +82 -0
  221. package/dist/dev/core/composition/create-composition.js.map +1 -0
  222. package/dist/dev/core/composition/share-signals.d.ts +39 -0
  223. package/dist/dev/core/composition/share-signals.d.ts.map +1 -0
  224. package/dist/dev/core/composition/share-signals.js +34 -0
  225. package/dist/dev/core/composition/share-signals.js.map +1 -0
  226. package/dist/dev/core/machine.d.ts +21 -0
  227. package/dist/dev/core/machine.d.ts.map +1 -0
  228. package/dist/dev/core/machine.js +25 -0
  229. package/dist/dev/core/machine.js.map +1 -0
  230. package/dist/dev/core/reactors/create-machine-reactor.d.ts +87 -0
  231. package/dist/dev/core/reactors/create-machine-reactor.d.ts.map +1 -0
  232. package/dist/dev/core/reactors/create-machine-reactor.js +84 -0
  233. package/dist/dev/core/reactors/create-machine-reactor.js.map +1 -0
  234. package/dist/dev/core/signals/effect.d.ts +14 -0
  235. package/dist/dev/core/signals/effect.d.ts.map +1 -0
  236. package/dist/dev/core/signals/effect.js +61 -0
  237. package/dist/dev/core/signals/effect.js.map +1 -0
  238. package/dist/dev/core/signals/primitives.d.ts +44 -0
  239. package/dist/dev/core/signals/primitives.d.ts.map +1 -0
  240. package/dist/dev/core/signals/primitives.js +50 -0
  241. package/dist/dev/core/signals/primitives.js.map +1 -0
  242. package/dist/dev/core/signals/when.js +36 -0
  243. package/dist/dev/core/signals/when.js.map +1 -0
  244. package/dist/dev/core/tasks/delayed-reschedule.js +27 -0
  245. package/dist/dev/core/tasks/delayed-reschedule.js.map +1 -0
  246. package/dist/dev/core/tasks/task.d.ts +144 -0
  247. package/dist/dev/core/tasks/task.d.ts.map +1 -0
  248. package/dist/dev/core/tasks/task.js +298 -0
  249. package/dist/dev/core/tasks/task.js.map +1 -0
  250. package/dist/dev/dom.d.ts +9 -0
  251. package/dist/dev/dom.js +9 -0
  252. package/dist/dev/hls-audio.d.ts +3 -0
  253. package/dist/dev/hls-audio.js +3 -0
  254. package/dist/dev/hls-background-video.d.ts +4 -0
  255. package/dist/dev/hls-background-video.js +3 -0
  256. package/dist/dev/hls-video.d.ts +5 -0
  257. package/dist/dev/hls-video.js +4 -0
  258. package/dist/dev/hls.d.ts +11 -0
  259. package/dist/dev/hls.js +10 -0
  260. package/dist/dev/index.d.ts +23 -0
  261. package/dist/dev/index.d.ts.map +1 -0
  262. package/dist/dev/index.js +22 -0
  263. package/dist/dev/index.js.map +1 -0
  264. package/dist/dev/media/abr/quality-selection.d.ts +19 -0
  265. package/dist/dev/media/abr/quality-selection.d.ts.map +1 -0
  266. package/dist/dev/media/abr/quality-selection.js +17 -0
  267. package/dist/dev/media/abr/quality-selection.js.map +1 -0
  268. package/dist/dev/media/buffer/back-buffer.d.ts +9 -0
  269. package/dist/dev/media/buffer/back-buffer.d.ts.map +1 -0
  270. package/dist/dev/media/buffer/back-buffer.js +42 -0
  271. package/dist/dev/media/buffer/back-buffer.js.map +1 -0
  272. package/dist/dev/media/buffer/forward-buffer.d.ts +9 -0
  273. package/dist/dev/media/buffer/forward-buffer.d.ts.map +1 -0
  274. package/dist/dev/media/buffer/forward-buffer.js +110 -0
  275. package/dist/dev/media/buffer/forward-buffer.js.map +1 -0
  276. package/dist/dev/media/dom/capabilities.js +61 -0
  277. package/dist/dev/media/dom/capabilities.js.map +1 -0
  278. package/dist/dev/media/dom/mse/append-segment.d.ts +16 -0
  279. package/dist/dev/media/dom/mse/append-segment.d.ts.map +1 -0
  280. package/dist/dev/media/dom/mse/append-segment.js +58 -0
  281. package/dist/dev/media/dom/mse/append-segment.js.map +1 -0
  282. package/dist/dev/media/dom/mse/buffer-flusher.d.ts +24 -0
  283. package/dist/dev/media/dom/mse/buffer-flusher.d.ts.map +1 -0
  284. package/dist/dev/media/dom/mse/buffer-flusher.js +55 -0
  285. package/dist/dev/media/dom/mse/buffer-flusher.js.map +1 -0
  286. package/dist/dev/media/dom/mse/duration.js +87 -0
  287. package/dist/dev/media/dom/mse/duration.js.map +1 -0
  288. package/dist/dev/media/dom/mse/end-of-stream.js +17 -0
  289. package/dist/dev/media/dom/mse/end-of-stream.js.map +1 -0
  290. package/dist/dev/media/dom/mse/mediasource-setup.js +227 -0
  291. package/dist/dev/media/dom/mse/mediasource-setup.js.map +1 -0
  292. package/dist/dev/media/dom/screen.d.ts +7 -0
  293. package/dist/dev/media/dom/screen.d.ts.map +1 -0
  294. package/dist/dev/media/dom/screen.js +95 -0
  295. package/dist/dev/media/dom/screen.js.map +1 -0
  296. package/dist/dev/media/dom/text/resolve-vtt-segment.d.ts +6 -0
  297. package/dist/dev/media/dom/text/resolve-vtt-segment.d.ts.map +1 -0
  298. package/dist/dev/media/dom/text/resolve-vtt-segment.js +50 -0
  299. package/dist/dev/media/dom/text/resolve-vtt-segment.js.map +1 -0
  300. package/dist/dev/media/dom/text/text-track-slots.d.ts +24 -0
  301. package/dist/dev/media/dom/text/text-track-slots.d.ts.map +1 -0
  302. package/dist/dev/media/dom/text/text-track-slots.js +61 -0
  303. package/dist/dev/media/dom/text/text-track-slots.js.map +1 -0
  304. package/dist/dev/media/errors.d.ts +68 -0
  305. package/dist/dev/media/errors.d.ts.map +1 -0
  306. package/dist/dev/media/errors.js +60 -0
  307. package/dist/dev/media/errors.js.map +1 -0
  308. package/dist/dev/media/hls/parse-attributes.js +131 -0
  309. package/dist/dev/media/hls/parse-attributes.js.map +1 -0
  310. package/dist/dev/media/hls/parse-media-playlist.js +253 -0
  311. package/dist/dev/media/hls/parse-media-playlist.js.map +1 -0
  312. package/dist/dev/media/hls/parse-multivariant.js +234 -0
  313. package/dist/dev/media/hls/parse-multivariant.js.map +1 -0
  314. package/dist/dev/media/hls/reload-policy.js +63 -0
  315. package/dist/dev/media/hls/reload-policy.js.map +1 -0
  316. package/dist/dev/media/hls/resolve-url.js +9 -0
  317. package/dist/dev/media/hls/resolve-url.js.map +1 -0
  318. package/dist/dev/media/live-window.js +32 -0
  319. package/dist/dev/media/live-window.js.map +1 -0
  320. package/dist/dev/media/media-tracks/media-tracks.d.ts +46 -0
  321. package/dist/dev/media/media-tracks/media-tracks.d.ts.map +1 -0
  322. package/dist/dev/media/media-tracks/media-tracks.js +96 -0
  323. package/dist/dev/media/media-tracks/media-tracks.js.map +1 -0
  324. package/dist/dev/media/mp4/box.js +57 -0
  325. package/dist/dev/media/mp4/box.js.map +1 -0
  326. package/dist/dev/media/mp4/timestamp-origin.js +95 -0
  327. package/dist/dev/media/mp4/timestamp-origin.js.map +1 -0
  328. package/dist/dev/media/primitives/resolution.d.ts +22 -0
  329. package/dist/dev/media/primitives/resolution.d.ts.map +1 -0
  330. package/dist/dev/media/primitives/resolution.js +26 -0
  331. package/dist/dev/media/primitives/resolution.js.map +1 -0
  332. package/dist/dev/media/primitives/select-tracks.js +97 -0
  333. package/dist/dev/media/primitives/select-tracks.js.map +1 -0
  334. package/dist/dev/media/text/parse-vtt-timestamp-map.js +40 -0
  335. package/dist/dev/media/text/parse-vtt-timestamp-map.js.map +1 -0
  336. package/dist/dev/media/text/resolve-vtt-metadata.js +22 -0
  337. package/dist/dev/media/text/resolve-vtt-metadata.js.map +1 -0
  338. package/dist/dev/media/types/index.d.ts +306 -0
  339. package/dist/dev/media/types/index.d.ts.map +1 -0
  340. package/dist/dev/media/types/index.js +42 -0
  341. package/dist/dev/media/types/index.js.map +1 -0
  342. package/dist/dev/media/utils/cdn.d.ts +11 -0
  343. package/dist/dev/media/utils/cdn.d.ts.map +1 -0
  344. package/dist/dev/media/utils/cdn.js +50 -0
  345. package/dist/dev/media/utils/cdn.js.map +1 -0
  346. package/dist/dev/media/utils/preload.js +21 -0
  347. package/dist/dev/media/utils/preload.js.map +1 -0
  348. package/dist/dev/media/utils/track-selection.js +43 -0
  349. package/dist/dev/media/utils/track-selection.js.map +1 -0
  350. package/dist/dev/media/utils/tracks.js +146 -0
  351. package/dist/dev/media/utils/tracks.js.map +1 -0
  352. package/dist/dev/media-tracks.d.ts +3 -0
  353. package/dist/dev/media-tracks.js +2 -0
  354. package/dist/dev/network/bandwidth-estimator.d.ts +48 -0
  355. package/dist/dev/network/bandwidth-estimator.d.ts.map +1 -0
  356. package/dist/dev/network/bandwidth-estimator.js +95 -0
  357. package/dist/dev/network/bandwidth-estimator.js.map +1 -0
  358. package/dist/dev/network/chunked-stream-iterable.js +47 -0
  359. package/dist/dev/network/chunked-stream-iterable.js.map +1 -0
  360. package/dist/dev/network/ewma.js +68 -0
  361. package/dist/dev/network/ewma.js.map +1 -0
  362. package/dist/dev/network/fetch.js +108 -0
  363. package/dist/dev/network/fetch.js.map +1 -0
  364. package/dist/dev/playback/actors/dom/segment-loader.d.ts +44 -0
  365. package/dist/dev/playback/actors/dom/segment-loader.d.ts.map +1 -0
  366. package/dist/dev/playback/actors/dom/segment-loader.js +233 -0
  367. package/dist/dev/playback/actors/dom/segment-loader.js.map +1 -0
  368. package/dist/dev/playback/actors/dom/source-buffer.d.ts +45 -0
  369. package/dist/dev/playback/actors/dom/source-buffer.d.ts.map +1 -0
  370. package/dist/dev/playback/actors/dom/source-buffer.js +139 -0
  371. package/dist/dev/playback/actors/dom/source-buffer.js.map +1 -0
  372. package/dist/dev/playback/actors/dom/text-tracks.d.ts +3 -0
  373. package/dist/dev/playback/actors/dom/text-tracks.js +46 -0
  374. package/dist/dev/playback/actors/dom/text-tracks.js.map +1 -0
  375. package/dist/dev/playback/actors/text-track-segment-loader.d.ts +48 -0
  376. package/dist/dev/playback/actors/text-track-segment-loader.d.ts.map +1 -0
  377. package/dist/dev/playback/actors/text-track-segment-loader.js +138 -0
  378. package/dist/dev/playback/actors/text-track-segment-loader.js.map +1 -0
  379. package/dist/dev/playback/actors/text-tracks.d.ts +30 -0
  380. package/dist/dev/playback/actors/text-tracks.d.ts.map +1 -0
  381. package/dist/dev/playback/adapters/hls-audio/adapter.d.ts +11 -0
  382. package/dist/dev/playback/adapters/hls-audio/adapter.d.ts.map +1 -0
  383. package/dist/dev/playback/adapters/hls-audio/adapter.js +8 -0
  384. package/dist/dev/playback/adapters/hls-audio/adapter.js.map +1 -0
  385. package/dist/dev/playback/adapters/hls-audio/mixin.d.ts +52 -0
  386. package/dist/dev/playback/adapters/hls-audio/mixin.d.ts.map +1 -0
  387. package/dist/dev/playback/adapters/hls-audio/mixin.js +178 -0
  388. package/dist/dev/playback/adapters/hls-audio/mixin.js.map +1 -0
  389. package/dist/dev/playback/adapters/hls-background-video/adapter.d.ts +19 -0
  390. package/dist/dev/playback/adapters/hls-background-video/adapter.d.ts.map +1 -0
  391. package/dist/dev/playback/adapters/hls-background-video/adapter.js +17 -0
  392. package/dist/dev/playback/adapters/hls-background-video/adapter.js.map +1 -0
  393. package/dist/dev/playback/adapters/hls-background-video/host.d.ts +34 -0
  394. package/dist/dev/playback/adapters/hls-background-video/host.d.ts.map +1 -0
  395. package/dist/dev/playback/adapters/hls-background-video/host.js +56 -0
  396. package/dist/dev/playback/adapters/hls-background-video/host.js.map +1 -0
  397. package/dist/dev/playback/adapters/hls-background-video/mixin.d.ts +69 -0
  398. package/dist/dev/playback/adapters/hls-background-video/mixin.d.ts.map +1 -0
  399. package/dist/dev/playback/adapters/hls-background-video/mixin.js +191 -0
  400. package/dist/dev/playback/adapters/hls-background-video/mixin.js.map +1 -0
  401. package/dist/dev/playback/adapters/hls-video/adapter.d.ts +11 -0
  402. package/dist/dev/playback/adapters/hls-video/adapter.d.ts.map +1 -0
  403. package/dist/dev/playback/adapters/hls-video/adapter.js +11 -0
  404. package/dist/dev/playback/adapters/hls-video/adapter.js.map +1 -0
  405. package/dist/dev/playback/adapters/hls-video/error-surface.d.ts +17 -0
  406. package/dist/dev/playback/adapters/hls-video/error-surface.d.ts.map +1 -0
  407. package/dist/dev/playback/adapters/hls-video/error-surface.js +46 -0
  408. package/dist/dev/playback/adapters/hls-video/error-surface.js.map +1 -0
  409. package/dist/dev/playback/adapters/hls-video/media-tracks.d.ts +21 -0
  410. package/dist/dev/playback/adapters/hls-video/media-tracks.d.ts.map +1 -0
  411. package/dist/dev/playback/adapters/hls-video/media-tracks.js +125 -0
  412. package/dist/dev/playback/adapters/hls-video/media-tracks.js.map +1 -0
  413. package/dist/dev/playback/adapters/hls-video/mixin.d.ts +62 -0
  414. package/dist/dev/playback/adapters/hls-video/mixin.d.ts.map +1 -0
  415. package/dist/dev/playback/adapters/hls-video/mixin.js +299 -0
  416. package/dist/dev/playback/adapters/hls-video/mixin.js.map +1 -0
  417. package/dist/dev/playback/behaviors/calculate-presentation-duration.d.ts +23 -0
  418. package/dist/dev/playback/behaviors/calculate-presentation-duration.d.ts.map +1 -0
  419. package/dist/dev/playback/behaviors/calculate-presentation-duration.js +33 -0
  420. package/dist/dev/playback/behaviors/calculate-presentation-duration.js.map +1 -0
  421. package/dist/dev/playback/behaviors/collect-errors.d.ts +2 -0
  422. package/dist/dev/playback/behaviors/collect-errors.js +98 -0
  423. package/dist/dev/playback/behaviors/collect-errors.js.map +1 -0
  424. package/dist/dev/playback/behaviors/derive-cdn-priority.js +61 -0
  425. package/dist/dev/playback/behaviors/derive-cdn-priority.js.map +1 -0
  426. package/dist/dev/playback/behaviors/dom/airplay.js +188 -0
  427. package/dist/dev/playback/behaviors/dom/airplay.js.map +1 -0
  428. package/dist/dev/playback/behaviors/dom/apply-start-position.js +81 -0
  429. package/dist/dev/playback/behaviors/dom/apply-start-position.js.map +1 -0
  430. package/dist/dev/playback/behaviors/dom/end-of-stream.js +97 -0
  431. package/dist/dev/playback/behaviors/dom/end-of-stream.js.map +1 -0
  432. package/dist/dev/playback/behaviors/dom/load-segments.d.ts +69 -0
  433. package/dist/dev/playback/behaviors/dom/load-segments.d.ts.map +1 -0
  434. package/dist/dev/playback/behaviors/dom/load-segments.js +169 -0
  435. package/dist/dev/playback/behaviors/dom/load-segments.js.map +1 -0
  436. package/dist/dev/playback/behaviors/dom/recover-end-stall.js +72 -0
  437. package/dist/dev/playback/behaviors/dom/recover-end-stall.js.map +1 -0
  438. package/dist/dev/playback/behaviors/dom/seek-to-live-edge.js +113 -0
  439. package/dist/dev/playback/behaviors/dom/seek-to-live-edge.js.map +1 -0
  440. package/dist/dev/playback/behaviors/dom/setup-buffer-actors.js +181 -0
  441. package/dist/dev/playback/behaviors/dom/setup-buffer-actors.js.map +1 -0
  442. package/dist/dev/playback/behaviors/dom/setup-mediasource.js +100 -0
  443. package/dist/dev/playback/behaviors/dom/setup-mediasource.js.map +1 -0
  444. package/dist/dev/playback/behaviors/dom/setup-text-track-actors.d.ts +28 -0
  445. package/dist/dev/playback/behaviors/dom/setup-text-track-actors.d.ts.map +1 -0
  446. package/dist/dev/playback/behaviors/dom/setup-text-track-actors.js +40 -0
  447. package/dist/dev/playback/behaviors/dom/setup-text-track-actors.js.map +1 -0
  448. package/dist/dev/playback/behaviors/dom/sync-live-seekable-range.js +25 -0
  449. package/dist/dev/playback/behaviors/dom/sync-live-seekable-range.js.map +1 -0
  450. package/dist/dev/playback/behaviors/dom/sync-text-tracks.js +109 -0
  451. package/dist/dev/playback/behaviors/dom/sync-text-tracks.js.map +1 -0
  452. package/dist/dev/playback/behaviors/dom/track-current-time.d.ts +33 -0
  453. package/dist/dev/playback/behaviors/dom/track-current-time.d.ts.map +1 -0
  454. package/dist/dev/playback/behaviors/dom/track-current-time.js +50 -0
  455. package/dist/dev/playback/behaviors/dom/track-current-time.js.map +1 -0
  456. package/dist/dev/playback/behaviors/dom/track-load-triggers.d.ts +41 -0
  457. package/dist/dev/playback/behaviors/dom/track-load-triggers.d.ts.map +1 -0
  458. package/dist/dev/playback/behaviors/dom/track-load-triggers.js +86 -0
  459. package/dist/dev/playback/behaviors/dom/track-load-triggers.js.map +1 -0
  460. package/dist/dev/playback/behaviors/dom/track-playback-rate.d.ts +33 -0
  461. package/dist/dev/playback/behaviors/dom/track-playback-rate.d.ts.map +1 -0
  462. package/dist/dev/playback/behaviors/dom/track-playback-rate.js +35 -0
  463. package/dist/dev/playback/behaviors/dom/track-playback-rate.js.map +1 -0
  464. package/dist/dev/playback/behaviors/dom/track-player-resolution.d.ts +8 -0
  465. package/dist/dev/playback/behaviors/dom/track-player-resolution.d.ts.map +1 -0
  466. package/dist/dev/playback/behaviors/dom/track-player-resolution.js +53 -0
  467. package/dist/dev/playback/behaviors/dom/track-player-resolution.js.map +1 -0
  468. package/dist/dev/playback/behaviors/dom/track-screen-resolution.js +28 -0
  469. package/dist/dev/playback/behaviors/dom/track-screen-resolution.js.map +1 -0
  470. package/dist/dev/playback/behaviors/dom/update-mediasource-duration.js +98 -0
  471. package/dist/dev/playback/behaviors/dom/update-mediasource-duration.js.map +1 -0
  472. package/dist/dev/playback/behaviors/establish-start-media-time.d.ts +32 -0
  473. package/dist/dev/playback/behaviors/establish-start-media-time.d.ts.map +1 -0
  474. package/dist/dev/playback/behaviors/establish-start-media-time.js +187 -0
  475. package/dist/dev/playback/behaviors/establish-start-media-time.js.map +1 -0
  476. package/dist/dev/playback/behaviors/resolve-presentation.d.ts +8 -0
  477. package/dist/dev/playback/behaviors/resolve-presentation.d.ts.map +1 -0
  478. package/dist/dev/playback/behaviors/resolve-presentation.js +76 -0
  479. package/dist/dev/playback/behaviors/resolve-presentation.js.map +1 -0
  480. package/dist/dev/playback/behaviors/resolve-track.js +134 -0
  481. package/dist/dev/playback/behaviors/resolve-track.js.map +1 -0
  482. package/dist/dev/playback/behaviors/select-tracks.d.ts +61 -0
  483. package/dist/dev/playback/behaviors/select-tracks.d.ts.map +1 -0
  484. package/dist/dev/playback/behaviors/select-tracks.js +189 -0
  485. package/dist/dev/playback/behaviors/select-tracks.js.map +1 -0
  486. package/dist/dev/playback/behaviors/setup-failover-monitor.d.ts +11 -0
  487. package/dist/dev/playback/behaviors/setup-failover-monitor.d.ts.map +1 -0
  488. package/dist/dev/playback/behaviors/setup-failover-monitor.js +61 -0
  489. package/dist/dev/playback/behaviors/setup-failover-monitor.js.map +1 -0
  490. package/dist/dev/playback/behaviors/sync-preload.js +59 -0
  491. package/dist/dev/playback/behaviors/sync-preload.js.map +1 -0
  492. package/dist/dev/playback/behaviors/track-switching.d.ts +110 -0
  493. package/dist/dev/playback/behaviors/track-switching.d.ts.map +1 -0
  494. package/dist/dev/playback/behaviors/track-switching.js +407 -0
  495. package/dist/dev/playback/behaviors/track-switching.js.map +1 -0
  496. package/dist/dev/playback/engines/hls/engine-audio-only.d.ts +160 -0
  497. package/dist/dev/playback/engines/hls/engine-audio-only.d.ts.map +1 -0
  498. package/dist/dev/playback/engines/hls/engine-audio-only.js +94 -0
  499. package/dist/dev/playback/engines/hls/engine-audio-only.js.map +1 -0
  500. package/dist/dev/playback/engines/hls/engine-background-video.d.ts +131 -0
  501. package/dist/dev/playback/engines/hls/engine-background-video.d.ts.map +1 -0
  502. package/dist/dev/playback/engines/hls/engine-background-video.js +87 -0
  503. package/dist/dev/playback/engines/hls/engine-background-video.js.map +1 -0
  504. package/dist/dev/playback/engines/hls/engine.d.ts +289 -0
  505. package/dist/dev/playback/engines/hls/engine.d.ts.map +1 -0
  506. package/dist/dev/playback/engines/hls/engine.js +144 -0
  507. package/dist/dev/playback/engines/hls/engine.js.map +1 -0
  508. package/dist/dev/playback/primitives/derive-start-media-time.d.ts +16 -0
  509. package/dist/dev/playback/primitives/derive-start-media-time.d.ts.map +1 -0
  510. package/dist/dev/playback/primitives/error-messages.js +42 -0
  511. package/dist/dev/playback/primitives/error-messages.js.map +1 -0
  512. package/dist/dev/playback/primitives/failover-fetch.js +37 -0
  513. package/dist/dev/playback/primitives/failover-fetch.js.map +1 -0
  514. package/dist/dev/playback/primitives/head-peek.js +41 -0
  515. package/dist/dev/playback/primitives/head-peek.js.map +1 -0
  516. package/dist/dev/playback/primitives/live-window.js +63 -0
  517. package/dist/dev/playback/primitives/live-window.js.map +1 -0
  518. package/dist/dev/playback/primitives/relocation-pipelines.js +191 -0
  519. package/dist/dev/playback/primitives/relocation-pipelines.js.map +1 -0
  520. package/dist/dev/playback/primitives/report-track-conditions.d.ts +8 -0
  521. package/dist/dev/playback/primitives/report-track-conditions.d.ts.map +1 -0
  522. package/dist/dev/playback/primitives/report-track-conditions.js +74 -0
  523. package/dist/dev/playback/primitives/report-track-conditions.js.map +1 -0
  524. package/dist/dev/playback/primitives/segment-load-pipeline.d.ts +2 -0
  525. package/dist/dev/playback/primitives/segment-load-pipeline.js +96 -0
  526. package/dist/dev/playback/primitives/segment-load-pipeline.js.map +1 -0
  527. package/dist/dev/playback/primitives/selection-rules.d.ts +66 -0
  528. package/dist/dev/playback/primitives/selection-rules.d.ts.map +1 -0
  529. package/dist/dev/playback/primitives/selection-rules.js +115 -0
  530. package/dist/dev/playback/primitives/selection-rules.js.map +1 -0
  531. package/dist/dev/playback/primitives/source-buffer-messages.d.ts +40 -0
  532. package/dist/dev/playback/primitives/source-buffer-messages.d.ts.map +1 -0
  533. package/dist/dev/playback/primitives/text-segment-load-pipeline.d.ts +56 -0
  534. package/dist/dev/playback/primitives/text-segment-load-pipeline.d.ts.map +1 -0
  535. package/dist/dev/playback/primitives/text-segment-load-pipeline.js +36 -0
  536. package/dist/dev/playback/primitives/text-segment-load-pipeline.js.map +1 -0
  537. package/dist/dev/playback/primitives/text-track-messages.d.ts +14 -0
  538. package/dist/dev/playback/primitives/text-track-messages.d.ts.map +1 -0
  539. package/dist/dev/playback/primitives/track-types.js +53 -0
  540. package/dist/dev/playback/primitives/track-types.js.map +1 -0
  541. package/package.json +60 -41
  542. package/dist/adapter-25AtMN8s.d.ts +0 -719
  543. package/dist/adapter-25AtMN8s.d.ts.map +0 -1
  544. package/dist/adapter-CflgYzjF.js +0 -3556
  545. package/dist/adapter-CflgYzjF.js.map +0 -1
  546. package/dist/dom/index.d.ts +0 -221
  547. package/dist/dom/index.d.ts.map +0 -1
  548. package/dist/dom/index.js +0 -38
  549. package/dist/dom/index.js.map +0 -1
  550. package/dist/dom/playback-engine/index.d.ts +0 -2
  551. package/dist/dom/playback-engine/index.js +0 -4
  552. package/dist/index.d.ts +0 -13
  553. package/dist/index.d.ts.map +0 -1
  554. package/dist/index.js +0 -3
  555. package/dist/src-DRsS_H80.js +0 -14
  556. package/dist/src-DRsS_H80.js.map +0 -1
@@ -0,0 +1,48 @@
1
+ import { Cue, TextTrack } from "../../media/types/index.js";
2
+ import { MessageActor } from "../../core/actors/create-machine-actor.js";
3
+ import { ForwardBufferConfig } from "../../media/buffer/forward-buffer.js";
4
+ import { TextMessagePipelines } from "../primitives/text-segment-load-pipeline.js";
5
+ import "./text-tracks.js";
6
+ //#region src/playback/actors/text-track-segment-loader.d.ts
7
+ /**
8
+ * Mirrors the v/a `SegmentLoaderMessage` shape. `range` carries the forward-window anchor (`range.start` is treated as
9
+ * the load anchor; the actor computes its own forward window internally via `getSegmentsToLoad`). When `range` is
10
+ * omitted (metadata mode), this actor is a no-op — text tracks have no init-segment concept.
11
+ */
12
+ type TextTrackSegmentLoaderMessage = {
13
+ type: 'load';
14
+ track: TextTrack;
15
+ range?: {
16
+ start: number;
17
+ end: number;
18
+ };
19
+ };
20
+ /** Finite states of the actor. */
21
+ type TextTrackSegmentLoaderActorState = 'idle' | 'loading' | 'destroyed';
22
+ /** Non-finite (extended) data managed by the actor. */
23
+ interface TextTrackSegmentLoaderActorContext {
24
+ /**
25
+ * Track ID of the segment currently being fetched, or null. Paired with `inFlightSegmentId` so the
26
+ * continue-vs-preempt check survives cross-track segment-id collisions (e.g. each track starts at `seg-0`).
27
+ */
28
+ inFlightTrackId: string | null;
29
+ /**
30
+ * Segment ID currently being fetched, or null. Used together with `inFlightTrackId` by the `loading` state's `load`
31
+ * handler.
32
+ */
33
+ inFlightSegmentId: string | null;
34
+ }
35
+ type TextTrackSegmentLoaderActor = MessageActor<TextTrackSegmentLoaderActorState, TextTrackSegmentLoaderActorContext, TextTrackSegmentLoaderMessage>;
36
+ /**
37
+ * Configuration for `createTextTrackSegmentLoaderActor`. Spread over `DEFAULT_FORWARD_BUFFER_CONFIG` to override
38
+ * individual forward-window fields (e.g. `bufferDuration`). Text tracks don't have a back-buffer concern — cues evict
39
+ * by their playhead-relative window at runtime — so no `backBuffer` config field.
40
+ */
41
+ interface TextTrackSegmentLoaderActorConfig<C extends Cue = Cue> {
42
+ forwardBuffer?: Partial<ForwardBufferConfig>;
43
+ /** Ordered step pipeline. Defaults to {@link DEFAULT_TEXT_MESSAGE_PIPELINES} (`resolveCues → dispatchCues`). */
44
+ messagePipelines?: TextMessagePipelines<C>;
45
+ }
46
+ //#endregion
47
+ export { TextTrackSegmentLoaderActor, TextTrackSegmentLoaderActorConfig, TextTrackSegmentLoaderActorContext, TextTrackSegmentLoaderActorState, TextTrackSegmentLoaderMessage };
48
+ //# sourceMappingURL=text-track-segment-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text-track-segment-loader.d.ts","names":[],"sources":["../../../../src/playback/actors/text-track-segment-loader.ts"],"mappings":";;;;;;;;;;;KA4BY;EACV;EACA,OAAO;EACP;IAAU;IAAe;;;;KAIf;;UAGK;;;;;EAKf;;;;;EAKA;;KAGU,8BAA8B,aACxC,kCACA,oCACA;;;;;;UAQe,kCAAkC,UAAU,MAAM;EACjE,gBAAgB,QAAQ;;EAExB,mBAAmB,qBAAqB"}
@@ -0,0 +1,138 @@
1
+ import { peek } from "../../core/signals/primitives.js";
2
+ import { SerialRunner, Task } from "../../core/tasks/task.js";
3
+ import { createMachineActor } from "../../core/actors/create-machine-actor.js";
4
+ import { DEFAULT_FORWARD_BUFFER_CONFIG, getSegmentsToLoad } from "../../media/buffer/forward-buffer.js";
5
+ import { DEFAULT_TEXT_MESSAGE_PIPELINES } from "../primitives/text-segment-load-pipeline.js";
6
+ //#region src/playback/actors/text-track-segment-loader.ts
7
+ /**
8
+ * Loads text-track segments for a track and delegates cue management to a TextTracksActor. Mirrors the v/a
9
+ * `SegmentLoaderActor` shape (FSM with `idle` / `loading` and `inFlight*` context for continue-vs-preempt), adapted to
10
+ * text:
11
+ *
12
+ * - No init segment, no flush ops (text cues don't need eviction — they're small and the playhead-relative window is
13
+ * enforced by the runtime).
14
+ * - Single in-flight identity (`inFlightSegmentId`) — text has only the media-segment path, no init-segment path.
15
+ *
16
+ * Planning is done in the load handler on every incoming message: `getSegmentsToLoad` filters to the forward window,
17
+ * then the segments not already in `TextTracksActor`'s context are scheduled. When a new `load` arrives mid-run, the
18
+ * handler replans and either:
19
+ *
20
+ * - **Continues**: the in-flight segment is still in the new plan → `abortPending` only, schedule the rest of the plan
21
+ * (minus the in-flight item, which covers its slot).
22
+ * - **Preempts**: in-flight segment is no longer wanted (track switch, large seek out of window) → `abortAll`, schedule
23
+ * the new plan from scratch.
24
+ *
25
+ * The cue parser is injected so this factory is host-agnostic. A DOM host supplies a VTT parser backed by
26
+ * `<track>`/`TextTrack` APIs; a non-DOM host (worker, test fake, alternate runtime) supplies its own.
27
+ */
28
+ function createTextTrackSegmentLoaderActor(textTracksActor, resolveSegment, config = {}, compositionDeps = {
29
+ state: {},
30
+ context: {},
31
+ config: {}
32
+ }) {
33
+ const forwardBufferConfig = {
34
+ ...DEFAULT_FORWARD_BUFFER_CONFIG,
35
+ ...config.forwardBuffer
36
+ };
37
+ const deps = {
38
+ state: compositionDeps.state,
39
+ context: compositionDeps.context,
40
+ config: {
41
+ ...compositionDeps.config,
42
+ textTracksActor,
43
+ resolveSegment
44
+ }
45
+ };
46
+ const pipeline = (config.messagePipelines ?? DEFAULT_TEXT_MESSAGE_PIPELINES)();
47
+ /**
48
+ * Translate a load message into an ordered TextLoadTask list based on committed actor state. In-flight awareness is
49
+ * handled separately in the `loading` state's load handler.
50
+ *
51
+ * Metadata mode (no `range`) is a no-op for text — text tracks have no init-segment concept, so there's nothing to
52
+ * load until a range arrives via `'full-range'` dispatch.
53
+ */
54
+ const planTasks = (message) => {
55
+ const { track, range } = message;
56
+ if (!range) return [];
57
+ const trackId = track.id;
58
+ const bufferedSegments = peek(textTracksActor.snapshot).context.segments[trackId] ?? [];
59
+ return getSegmentsToLoad(track.segments, bufferedSegments, range.start, forwardBufferConfig).map((segment) => ({
60
+ segment,
61
+ trackId
62
+ }));
63
+ };
64
+ /**
65
+ * Wraps a TextLoadTask into a Task that runs the op's step pipeline (resolve/relocate/dispatch, per the composition's
66
+ * `messagePipelines`). Updates `inFlightSegmentId` around the async region so the load handler can make accurate
67
+ * continue/preempt decisions, and checks the abort signal before each step.
68
+ *
69
+ * Text degrades gracefully: a step throwing (e.g. a failed segment fetch) is logged and swallowed so the runner
70
+ * continues to the next segment — unlike the v/a loader, where a failed init must abort the remaining tasks.
71
+ */
72
+ const makeLoadTask = (op, { getContext, setContext }) => {
73
+ return new Task(async (signal) => {
74
+ if (signal.aborted) return;
75
+ const frame = { op };
76
+ setContext({
77
+ ...getContext(),
78
+ inFlightTrackId: op.trackId,
79
+ inFlightSegmentId: op.segment.id
80
+ });
81
+ try {
82
+ for (const step of pipeline) {
83
+ if (signal.aborted) return;
84
+ await step(frame, signal, deps);
85
+ }
86
+ } catch (error) {
87
+ console.error("Failed to load text-track segment:", error);
88
+ } finally {
89
+ setContext({
90
+ ...getContext(),
91
+ inFlightTrackId: null,
92
+ inFlightSegmentId: null
93
+ });
94
+ }
95
+ });
96
+ };
97
+ const scheduleAll = (tasks, ctx) => {
98
+ for (const op of tasks) ctx.runner.schedule(makeLoadTask(op, ctx)).then(void 0, (e) => {
99
+ if (e instanceof Error && e.name === "AbortError") return;
100
+ console.error("Unexpected error in text-track segment loader:", e);
101
+ ctx.runner.abortPending();
102
+ });
103
+ };
104
+ return createMachineActor({
105
+ runner: () => new SerialRunner(),
106
+ initial: "idle",
107
+ context: {
108
+ inFlightTrackId: null,
109
+ inFlightSegmentId: null
110
+ },
111
+ states: {
112
+ idle: { on: { load: (msg, ctx) => {
113
+ const tasks = planTasks(msg);
114
+ if (tasks.length === 0) return;
115
+ ctx.transition("loading");
116
+ scheduleAll(tasks, ctx);
117
+ } } },
118
+ loading: {
119
+ onSettled: "idle",
120
+ on: { load: (msg, ctx) => {
121
+ const { context, runner } = ctx;
122
+ const tasks = planTasks(msg);
123
+ if (context.inFlightTrackId !== null && context.inFlightSegmentId !== null && tasks.some((t) => t.trackId === context.inFlightTrackId && t.segment.id === context.inFlightSegmentId)) {
124
+ runner.abortPending();
125
+ scheduleAll(tasks.filter((t) => !(t.trackId === context.inFlightTrackId && t.segment.id === context.inFlightSegmentId)), ctx);
126
+ } else {
127
+ runner.abortAll();
128
+ scheduleAll(tasks, ctx);
129
+ }
130
+ } }
131
+ }
132
+ }
133
+ });
134
+ }
135
+ //#endregion
136
+ export { createTextTrackSegmentLoaderActor };
137
+
138
+ //# sourceMappingURL=text-track-segment-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text-track-segment-loader.js","names":[],"sources":["../../../../src/playback/actors/text-track-segment-loader.ts"],"sourcesContent":["import { createMachineActor, type HandlerContext, type MessageActor } from '../../core/actors/create-machine-actor';\nimport { peek } from '../../core/signals/primitives';\nimport { SerialRunner, Task } from '../../core/tasks/task';\nimport {\n DEFAULT_FORWARD_BUFFER_CONFIG,\n type ForwardBufferConfig,\n getSegmentsToLoad,\n} from '../../media/buffer/forward-buffer';\nimport type { Cue, TextTrack } from '../../media/types';\nimport {\n DEFAULT_TEXT_MESSAGE_PIPELINES,\n type TextFrame,\n type TextLoadTask,\n type TextMessagePipelines,\n type TextStepDeps,\n type TextTrackSegmentResolver,\n} from '../primitives/text-segment-load-pipeline';\nimport type { TextTracksActor } from './text-tracks';\n\n// =============================================================================\n// Message / actor types\n// =============================================================================\n\n/**\n * Mirrors the v/a `SegmentLoaderMessage` shape. `range` carries the forward-window anchor (`range.start` is treated as\n * the load anchor; the actor computes its own forward window internally via `getSegmentsToLoad`). When `range` is\n * omitted (metadata mode), this actor is a no-op — text tracks have no init-segment concept.\n */\nexport type TextTrackSegmentLoaderMessage = {\n type: 'load';\n track: TextTrack;\n range?: { start: number; end: number };\n};\n\n/** Finite states of the actor. */\nexport type TextTrackSegmentLoaderActorState = 'idle' | 'loading' | 'destroyed';\n\n/** Non-finite (extended) data managed by the actor. */\nexport interface TextTrackSegmentLoaderActorContext {\n /**\n * Track ID of the segment currently being fetched, or null. Paired with `inFlightSegmentId` so the\n * continue-vs-preempt check survives cross-track segment-id collisions (e.g. each track starts at `seg-0`).\n */\n inFlightTrackId: string | null;\n /**\n * Segment ID currently being fetched, or null. Used together with `inFlightTrackId` by the `loading` state's `load`\n * handler.\n */\n inFlightSegmentId: string | null;\n}\n\nexport type TextTrackSegmentLoaderActor = MessageActor<\n TextTrackSegmentLoaderActorState,\n TextTrackSegmentLoaderActorContext,\n TextTrackSegmentLoaderMessage\n>;\n\n/**\n * Configuration for `createTextTrackSegmentLoaderActor`. Spread over `DEFAULT_FORWARD_BUFFER_CONFIG` to override\n * individual forward-window fields (e.g. `bufferDuration`). Text tracks don't have a back-buffer concern — cues evict\n * by their playhead-relative window at runtime — so no `backBuffer` config field.\n */\nexport interface TextTrackSegmentLoaderActorConfig<C extends Cue = Cue> {\n forwardBuffer?: Partial<ForwardBufferConfig>;\n /** Ordered step pipeline. Defaults to {@link DEFAULT_TEXT_MESSAGE_PIPELINES} (`resolveCues → dispatchCues`). */\n messagePipelines?: TextMessagePipelines<C>;\n}\n\n// =============================================================================\n// Implementation\n// =============================================================================\n\n/**\n * Loads text-track segments for a track and delegates cue management to a TextTracksActor. Mirrors the v/a\n * `SegmentLoaderActor` shape (FSM with `idle` / `loading` and `inFlight*` context for continue-vs-preempt), adapted to\n * text:\n *\n * - No init segment, no flush ops (text cues don't need eviction — they're small and the playhead-relative window is\n * enforced by the runtime).\n * - Single in-flight identity (`inFlightSegmentId`) — text has only the media-segment path, no init-segment path.\n *\n * Planning is done in the load handler on every incoming message: `getSegmentsToLoad` filters to the forward window,\n * then the segments not already in `TextTracksActor`'s context are scheduled. When a new `load` arrives mid-run, the\n * handler replans and either:\n *\n * - **Continues**: the in-flight segment is still in the new plan → `abortPending` only, schedule the rest of the plan\n * (minus the in-flight item, which covers its slot).\n * - **Preempts**: in-flight segment is no longer wanted (track switch, large seek out of window) → `abortAll`, schedule\n * the new plan from scratch.\n *\n * The cue parser is injected so this factory is host-agnostic. A DOM host supplies a VTT parser backed by\n * `<track>`/`TextTrack` APIs; a non-DOM host (worker, test fake, alternate runtime) supplies its own.\n */\nexport function createTextTrackSegmentLoaderActor<C extends Cue>(\n textTracksActor: TextTracksActor<C>,\n resolveSegment: TextTrackSegmentResolver<C>,\n config: TextTrackSegmentLoaderActorConfig<C> = {},\n // Composition deps threaded opaquely into each step's `TextStepDeps` (relocation\n // reads composition state). The loader never reads them. Defaults empty for\n // standalone / base-pipeline use.\n compositionDeps: TextStepDeps = { state: {}, context: {}, config: {} }\n): TextTrackSegmentLoaderActor {\n type UserState = Exclude<TextTrackSegmentLoaderActorState, 'destroyed'>;\n type Ctx = HandlerContext<UserState, TextTrackSegmentLoaderActorContext, () => SerialRunner>;\n\n const forwardBufferConfig: ForwardBufferConfig = { ...DEFAULT_FORWARD_BUFFER_CONFIG, ...config.forwardBuffer };\n // Fold the loader's wiring into the passthrough `config` (see `textStepWiring`) so\n // base steps read it from the uniform `{state,context,config}` — present in both\n // composition and standalone use.\n const deps: TextStepDeps = {\n state: compositionDeps.state,\n context: compositionDeps.context,\n config: { ...compositionDeps.config, textTracksActor, resolveSegment },\n };\n // Built once per actor; default is `resolveCues → dispatchCues`.\n const pipeline = (config.messagePipelines ?? DEFAULT_TEXT_MESSAGE_PIPELINES)();\n\n /**\n * Translate a load message into an ordered TextLoadTask list based on committed actor state. In-flight awareness is\n * handled separately in the `loading` state's load handler.\n *\n * Metadata mode (no `range`) is a no-op for text — text tracks have no init-segment concept, so there's nothing to\n * load until a range arrives via `'full-range'` dispatch.\n */\n const planTasks = (message: TextTrackSegmentLoaderMessage): TextLoadTask[] => {\n const { track, range } = message;\n if (!range) return [];\n\n const trackId = track.id;\n // Peek (don't track) the snapshot: the loader's `send` is typically\n // invoked from inside the dispatcher's effect body, so a tracked\n // `.get()` here would leak the textTracksActor snapshot into the\n // dispatcher's dep set — every `add-cues` would re-fire the dispatcher\n // and schedule duplicate loads.\n const bufferedSegments = peek(textTracksActor.snapshot).context.segments[trackId] ?? [];\n // `getSegmentsToLoad` uses the actor's threaded `forwardBufferConfig`\n // to compute its forward-window; only `range.start` is consulted\n // here as the playhead anchor. `range.end` is informational — it\n // carries the dispatcher's intended window upper bound but doesn't\n // override the actor's planning.\n const segmentsToLoad = getSegmentsToLoad(track.segments, bufferedSegments, range.start, forwardBufferConfig);\n\n return segmentsToLoad.map((segment) => ({ segment, trackId }));\n };\n\n /**\n * Wraps a TextLoadTask into a Task that runs the op's step pipeline (resolve/relocate/dispatch, per the composition's\n * `messagePipelines`). Updates `inFlightSegmentId` around the async region so the load handler can make accurate\n * continue/preempt decisions, and checks the abort signal before each step.\n *\n * Text degrades gracefully: a step throwing (e.g. a failed segment fetch) is logged and swallowed so the runner\n * continues to the next segment — unlike the v/a loader, where a failed init must abort the remaining tasks.\n */\n const makeLoadTask = (op: TextLoadTask, { getContext, setContext }: Ctx): Task<void> => {\n return new Task(async (signal) => {\n if (signal.aborted) return;\n\n const frame: TextFrame<C> = { op };\n\n setContext({ ...getContext(), inFlightTrackId: op.trackId, inFlightSegmentId: op.segment.id });\n\n try {\n for (const step of pipeline) {\n if (signal.aborted) return;\n\n await step(frame, signal, deps);\n }\n } catch (error) {\n // Graceful degradation: log and continue to the next segment.\n console.error('Failed to load text-track segment:', error);\n } finally {\n setContext({ ...getContext(), inFlightTrackId: null, inFlightSegmentId: null });\n }\n });\n };\n\n const scheduleAll = (tasks: TextLoadTask[], ctx: Ctx): void => {\n for (const op of tasks) {\n ctx.runner.schedule(makeLoadTask(op, ctx)).then(undefined, (e: unknown) => {\n if (e instanceof Error && e.name === 'AbortError') return;\n\n console.error('Unexpected error in text-track segment loader:', e);\n ctx.runner.abortPending();\n });\n }\n };\n\n return createMachineActor<\n UserState,\n TextTrackSegmentLoaderActorContext,\n TextTrackSegmentLoaderMessage,\n () => SerialRunner\n >({\n runner: () => new SerialRunner(),\n initial: 'idle',\n context: { inFlightTrackId: null, inFlightSegmentId: null },\n states: {\n idle: {\n on: {\n load: (msg, ctx) => {\n const tasks = planTasks(msg);\n if (tasks.length === 0) return;\n\n ctx.transition('loading');\n scheduleAll(tasks, ctx);\n },\n },\n },\n loading: {\n onSettled: 'idle',\n on: {\n load: (msg, ctx) => {\n const { context, runner } = ctx;\n const tasks = planTasks(msg);\n\n const inFlightStillNeeded =\n context.inFlightTrackId !== null &&\n context.inFlightSegmentId !== null &&\n tasks.some((t) => t.trackId === context.inFlightTrackId && t.segment.id === context.inFlightSegmentId);\n\n if (inFlightStillNeeded) {\n // Continue: keep the in-flight fetch, schedule the rest.\n runner.abortPending();\n scheduleAll(\n tasks.filter(\n (t) => !(t.trackId === context.inFlightTrackId && t.segment.id === context.inFlightSegmentId)\n ),\n ctx\n );\n } else {\n // Preempt: abort everything (including in-flight) and replan.\n runner.abortAll();\n scheduleAll(tasks, ctx);\n }\n },\n },\n },\n },\n });\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AA6FA,SAAgB,kCACd,iBACA,gBACA,SAA+C,CAAC,GAIhD,kBAAgC;CAAE,OAAO,CAAC;CAAG,SAAS,CAAC;CAAG,QAAQ,CAAC;AAAE,GACxC;CAI7B,MAAM,sBAA2C;EAAE,GAAG;EAA+B,GAAG,OAAO;CAAc;CAI7G,MAAM,OAAqB;EACzB,OAAO,gBAAgB;EACvB,SAAS,gBAAgB;EACzB,QAAQ;GAAE,GAAG,gBAAgB;GAAQ;GAAiB;EAAe;CACvE;CAEA,MAAM,YAAY,OAAO,oBAAoB,+BAAA,CAAgC;;;;;;;;CAS7E,MAAM,aAAa,YAA2D;EAC5E,MAAM,EAAE,OAAO,UAAU;EACzB,IAAI,CAAC,OAAO,OAAO,CAAC;EAEpB,MAAM,UAAU,MAAM;EAMtB,MAAM,mBAAmB,KAAK,gBAAgB,QAAQ,CAAC,CAAC,QAAQ,SAAS,YAAY,CAAC;EAQtF,OAFuB,kBAAkB,MAAM,UAAU,kBAAkB,MAAM,OAAO,mBAEpE,CAAC,CAAC,KAAK,aAAa;GAAE;GAAS;EAAQ,EAAE;CAC/D;;;;;;;;;CAUA,MAAM,gBAAgB,IAAkB,EAAE,YAAY,iBAAkC;EACtF,OAAO,IAAI,KAAK,OAAO,WAAW;GAChC,IAAI,OAAO,SAAS;GAEpB,MAAM,QAAsB,EAAE,GAAG;GAEjC,WAAW;IAAE,GAAG,WAAW;IAAG,iBAAiB,GAAG;IAAS,mBAAmB,GAAG,QAAQ;GAAG,CAAC;GAE7F,IAAI;IACF,KAAK,MAAM,QAAQ,UAAU;KAC3B,IAAI,OAAO,SAAS;KAEpB,MAAM,KAAK,OAAO,QAAQ,IAAI;IAChC;GACF,SAAS,OAAO;IAEd,QAAQ,MAAM,sCAAsC,KAAK;GAC3D,UAAU;IACR,WAAW;KAAE,GAAG,WAAW;KAAG,iBAAiB;KAAM,mBAAmB;IAAK,CAAC;GAChF;EACF,CAAC;CACH;CAEA,MAAM,eAAe,OAAuB,QAAmB;EAC7D,KAAK,MAAM,MAAM,OACf,IAAI,OAAO,SAAS,aAAa,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,KAAA,IAAY,MAAe;GACzE,IAAI,aAAa,SAAS,EAAE,SAAS,cAAc;GAEnD,QAAQ,MAAM,kDAAkD,CAAC;GACjE,IAAI,OAAO,aAAa;EAC1B,CAAC;CAEL;CAEA,OAAO,mBAKL;EACA,cAAc,IAAI,aAAa;EAC/B,SAAS;EACT,SAAS;GAAE,iBAAiB;GAAM,mBAAmB;EAAK;EAC1D,QAAQ;GACN,MAAM,EACJ,IAAI,EACF,OAAO,KAAK,QAAQ;IAClB,MAAM,QAAQ,UAAU,GAAG;IAC3B,IAAI,MAAM,WAAW,GAAG;IAExB,IAAI,WAAW,SAAS;IACxB,YAAY,OAAO,GAAG;GACxB,EACF,EACF;GACA,SAAS;IACP,WAAW;IACX,IAAI,EACF,OAAO,KAAK,QAAQ;KAClB,MAAM,EAAE,SAAS,WAAW;KAC5B,MAAM,QAAQ,UAAU,GAAG;KAO3B,IAJE,QAAQ,oBAAoB,QAC5B,QAAQ,sBAAsB,QAC9B,MAAM,MAAM,MAAM,EAAE,YAAY,QAAQ,mBAAmB,EAAE,QAAQ,OAAO,QAAQ,iBAAiB,GAE9E;MAEvB,OAAO,aAAa;MACpB,YACE,MAAM,QACH,MAAM,EAAE,EAAE,YAAY,QAAQ,mBAAmB,EAAE,QAAQ,OAAO,QAAQ,kBAC7E,GACA,GACF;KACF,OAAO;MAEL,OAAO,SAAS;MAChB,YAAY,OAAO,GAAG;KACxB;IACF,EACF;GACF;EACF;CACF,CAAC;AACH"}
@@ -0,0 +1,30 @@
1
+ import { Cue, Segment } from "../../media/types/index.js";
2
+ import { TransitionActor } from "../../core/actors/create-transition-actor.js";
3
+ import { AddCuesMessage } from "../primitives/text-track-messages.js";
4
+ //#region src/playback/actors/text-tracks.d.ts
5
+ /** Non-finite (extended) data managed by the actor — the XState "context". */
6
+ interface TextTracksActorContext {
7
+ /** Cues added per track ID. Used for duplicate detection and snapshot observability. */
8
+ loaded: Record<string, Cue[]>;
9
+ /** Segments whose cues have been fully added, keyed by track ID. Used for load planning. */
10
+ segments: Record<string, Array<Pick<Segment, 'id' | 'startTime' | 'duration'>>>;
11
+ }
12
+ /**
13
+ * Wipe the actor's `loaded` + `segments` context. Sent on source reset (typically by `syncTextTracks` on state exit) so
14
+ * a subsequent presentation starts with a fresh cue+segment cache. Without this, a new presentation reusing trackIds
15
+ * from the prior source would have `getSegmentsToLoad` treat its segments as already-buffered and skip loading them.
16
+ */
17
+ interface ClearMessage {
18
+ type: 'clear';
19
+ }
20
+ type TextTracksActorMessage<C extends Cue = Cue> = AddCuesMessage<C> | ClearMessage;
21
+ /**
22
+ * Host-agnostic text-track actor type.
23
+ *
24
+ * Generic over the concrete cue shape `C` so DOM hosts (using `VTTCue`) and non-DOM hosts (custom cue representations)
25
+ * can both satisfy it.
26
+ */
27
+ type TextTracksActor<C extends Cue = Cue> = TransitionActor<TextTracksActorContext, TextTracksActorMessage<C>>;
28
+ //#endregion
29
+ export { ClearMessage, TextTracksActor, TextTracksActorContext, TextTracksActorMessage };
30
+ //# sourceMappingURL=text-tracks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text-tracks.d.ts","names":[],"sources":["../../../../src/playback/actors/text-tracks.ts"],"mappings":";;;;;UASiB;;EAEf,QAAQ,eAAe;;EAEvB,UAAU,eAAe,MAAM,KAAK;;;;;;;UAQrB;EACf;;KAGU,uBAAuB,UAAU,MAAM,OAAO,eAAe,KAAK;;;;;;;KAQlE,gBAAgB,UAAU,MAAM,OAAO,gBAAgB,wBAAwB,uBAAuB"}
@@ -0,0 +1,11 @@
1
+ import { HlsAudioAdapterAPI, HlsAudioAdapterProps } from "./mixin.js";
2
+ import { HTMLAudioAdapter } from "@videojs/media/dom";
3
+ //#region src/playback/adapters/hls-audio/adapter.d.ts
4
+ declare const HlsAudioAdapter_base: import("@videojs/utils/types").Constructor<HTMLAudioAdapter & HlsAudioAdapterAPI, any[]> & Omit<typeof HTMLAudioAdapter, "prototype"> & {
5
+ readonly alternativeMediaSuggestion: string | undefined;
6
+ readonly defaultProps: HlsAudioAdapterProps;
7
+ };
8
+ declare class HlsAudioAdapter extends HlsAudioAdapter_base {}
9
+ //#endregion
10
+ export { HlsAudioAdapter };
11
+ //# sourceMappingURL=adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.d.ts","names":[],"sources":["../../../../../src/playback/adapters/hls-audio/adapter.ts"],"mappings":";;;;;;;cAIa,wBAAwB"}
@@ -0,0 +1,8 @@
1
+ import { HlsAudioMixin } from "./mixin.js";
2
+ import { HTMLAudioAdapter } from "@videojs/media/dom";
3
+ //#region src/playback/adapters/hls-audio/adapter.ts
4
+ var HlsAudioAdapter = class extends HlsAudioMixin(HTMLAudioAdapter) {};
5
+ //#endregion
6
+ export { HlsAudioAdapter };
7
+
8
+ //# sourceMappingURL=adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.js","names":[],"sources":["../../../../../src/playback/adapters/hls-audio/adapter.ts"],"sourcesContent":["import { HTMLAudioAdapter } from '@videojs/media/dom';\n\nimport { HlsAudioMixin } from './mixin';\n\nexport class HlsAudioAdapter extends HlsAudioMixin(HTMLAudioAdapter) {}\n"],"mappings":";;;AAIA,IAAa,kBAAb,cAAqC,cAAc,gBAAgB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,52 @@
1
+ import { Composition } from "../../../core/composition/create-composition.js";
2
+ import { HlsAudioEngineContext, HlsAudioEngineState } from "../../engines/hls/engine-audio-only.js";
3
+ import { HlsVideoMediaError } from "../hls-video/error-surface.js";
4
+ import { Constructor, MixinReturn } from "@videojs/utils/types";
5
+ //#region src/playback/adapters/hls-audio/mixin.d.ts
6
+ interface HlsAudioAdapterProps {
7
+ src: string;
8
+ preload: '' | 'none' | 'metadata' | 'auto';
9
+ disableRemotePlayback: boolean;
10
+ }
11
+ interface HlsAudioAdapterAPI extends HlsAudioAdapterProps {
12
+ readonly engine: Composition<HlsAudioEngineState, HlsAudioEngineContext>;
13
+ readonly error: HlsVideoMediaError | null;
14
+ attach(mediaElement: HTMLMediaElement): void;
15
+ detach(): void;
16
+ destroy(): void;
17
+ play(): Promise<void>;
18
+ }
19
+ /**
20
+ * Mixin that adds SPF audio-only HLS playback to any base class.
21
+ *
22
+ * @example
23
+ * class HlsAudioAdapter extends HlsAudioMixin(HTMLVideoAdapter) {}
24
+ *
25
+ * const media = new HlsAudioAdapter();
26
+ * media.attach(document.querySelector('video'));
27
+ * media.src = 'https://stream.mux.com/abc123.m3u8';
28
+ *
29
+ * @fires error - Fired when a fatal condition is reported. Read `error` for it.
30
+ *
31
+ * Parallel to `HlsVideoMixin` with one substantive difference: the underlying engine is the audio-only variant
32
+ * (`createHlsAudioEngine`), which omits video and text-track behaviors. The src / preload / disableRemotePlayback /
33
+ * play() contract per the WHATWG HTML spec is identical to the default adapter.
34
+ *
35
+ * Selecting this adapter is the variant decision: instantiating `HlsAudioAdapterCore` opts the consumer into
36
+ * audio-only delivery even when the source is a mixed-AV HLS manifest.
37
+ */
38
+ declare function HlsAudioMixin<Base extends Constructor<any>>(BaseClass: Base): MixinReturn<Base, HlsAudioAdapterAPI> & {
39
+ readonly alternativeMediaSuggestion: string | undefined;
40
+ readonly defaultProps: HlsAudioAdapterProps;
41
+ };
42
+ declare const HlsAudioAdapterCore_base: Constructor<{} & HlsAudioAdapterAPI, any[]> & Omit<{
43
+ new (): {};
44
+ }, "prototype"> & {
45
+ readonly alternativeMediaSuggestion: string | undefined;
46
+ readonly defaultProps: HlsAudioAdapterProps;
47
+ };
48
+ /** Standalone SPF audio-only media adapter with no base class. */
49
+ declare class HlsAudioAdapterCore extends HlsAudioAdapterCore_base {}
50
+ //#endregion
51
+ export { HlsAudioAdapterAPI, HlsAudioAdapterCore, HlsAudioAdapterProps, HlsAudioMixin };
52
+ //# sourceMappingURL=mixin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mixin.d.ts","names":[],"sources":["../../../../../src/playback/adapters/hls-audio/mixin.ts"],"mappings":";;;;;UAwBiB;EACf;EACA;EACA;;UAGe,2BAA2B;WACjC,QAAQ,YAAY,qBAAqB;WACzC,OAAO;EAChB,OAAO,cAAc;EACrB;EACA;EACA,QAAQ;;;;;;;;;;;;;;;;;;;;;iBA6BM,cAAc,aAAa,kBAAkB,WAAW,OA4OpC,YAAY,MAAM;WACzC;WACA,cAAc;;;;;WADc;WACd,cAAA;;;cAKd,4BAA4B"}
@@ -0,0 +1,178 @@
1
+ import { effect } from "../../../core/signals/effect.js";
2
+ import { SVTA_NO_SUPPORTED_AUDIO_TRACK, SVTA_UNSUPPORTED_PLAYBACK_FEATURE } from "../../../media/errors.js";
3
+ import { createHlsAudioEngine } from "../../engines/hls/engine-audio-only.js";
4
+ import { UNSUPPORTED_PLAYBACK_FEATURE_MESSAGE } from "../../primitives/error-messages.js";
5
+ import { firstFatal, hasUnsupportedFeatureCause, withAlternativeMediaSuggestion } from "../hls-video/error-surface.js";
6
+ //#region src/playback/adapters/hls-audio/mixin.ts
7
+ /**
8
+ * Which reported conditions this composition treats as fatal. Only the audio verdict: an audio-only engine composes no
9
+ * video selection, so `SVTA_NO_SUPPORTED_VIDEO_TRACK` is never reported and surfacing it would describe a track type
10
+ * this media doesn't have.
11
+ */
12
+ const FATAL_SVTA_CODES = /* @__PURE__ */ new Set([SVTA_NO_SUPPORTED_AUDIO_TRACK]);
13
+ /**
14
+ * Mixin that adds SPF audio-only HLS playback to any base class.
15
+ *
16
+ * @example
17
+ * class HlsAudioAdapter extends HlsAudioMixin(HTMLVideoAdapter) {}
18
+ *
19
+ * const media = new HlsAudioAdapter();
20
+ * media.attach(document.querySelector('video'));
21
+ * media.src = 'https://stream.mux.com/abc123.m3u8';
22
+ *
23
+ * @fires error - Fired when a fatal condition is reported. Read `error` for it.
24
+ *
25
+ * Parallel to `HlsVideoMixin` with one substantive difference: the underlying engine is the audio-only variant
26
+ * (`createHlsAudioEngine`), which omits video and text-track behaviors. The src / preload / disableRemotePlayback /
27
+ * play() contract per the WHATWG HTML spec is identical to the default adapter.
28
+ *
29
+ * Selecting this adapter is the variant decision: instantiating `HlsAudioAdapterCore` opts the consumer into
30
+ * audio-only delivery even when the source is a mixed-AV HLS manifest.
31
+ */
32
+ function HlsAudioMixin(BaseClass) {
33
+ class HlsAudioImpl extends BaseClass {
34
+ static defaultProps = {
35
+ src: "",
36
+ preload: "",
37
+ disableRemotePlayback: false
38
+ };
39
+ /**
40
+ * A complete sentence naming the Media to reach for when this one can't play a source. Appended to the copy this
41
+ * adapter logs.
42
+ *
43
+ * Empty here, and overridden the same way as on the video adapter — see its note. `hls-audio` has no
44
+ * better-equipped sibling of its own; the Mux audio Media built on this engine does, and points at the
45
+ * hls.js-backed one.
46
+ */
47
+ static get alternativeMediaSuggestion() {}
48
+ #engine;
49
+ #config;
50
+ #signals;
51
+ #preload = HlsAudioImpl.defaultProps.preload;
52
+ #disableRemotePlayback = HlsAudioImpl.defaultProps.disableRemotePlayback;
53
+ #error = null;
54
+ /** Reported condition currently surfaced — see the video adapter's note. */
55
+ #reportedCode = null;
56
+ #stopErrorSync;
57
+ /** Pending loadstart listener from a deferred play() retry, if any. */
58
+ #loadstartListener = null;
59
+ constructor(...args) {
60
+ super(...args);
61
+ const { config } = args?.[0] ?? {};
62
+ this.#config = config;
63
+ this.#engine = this.#createEngine();
64
+ this.#stopErrorSync = effect(() => {
65
+ const errors = this.#signals.state.errors.get();
66
+ this.#setError(firstFatal(errors, FATAL_SVTA_CODES), errors);
67
+ });
68
+ }
69
+ /**
70
+ * The current fatal error, or `null`. Only _fatal_ conditions appear here — the engine reports non-fatal ones too,
71
+ * which stay in `engine.state.errors`. Resets per source. Fires `'error'` when set.
72
+ */
73
+ get error() {
74
+ return this.#error;
75
+ }
76
+ #setError(reported, errors) {
77
+ if (!reported) {
78
+ this.#error = null;
79
+ this.#reportedCode = null;
80
+ return;
81
+ }
82
+ if (this.#reportedCode === reported.code) return;
83
+ this.#reportedCode = reported.code;
84
+ const unsupported = hasUnsupportedFeatureCause(errors);
85
+ if (unsupported) console.error(this.#withSuggestion(UNSUPPORTED_PLAYBACK_FEATURE_MESSAGE), { conditions: errors });
86
+ this.#error = {
87
+ code: unsupported ? SVTA_UNSUPPORTED_PLAYBACK_FEATURE : reported.code,
88
+ message: reported.message ?? "",
89
+ ...reported.data === void 0 ? {} : { data: reported.data }
90
+ };
91
+ this.dispatchEvent?.(new Event("error"));
92
+ }
93
+ /**
94
+ * Underlying playback engine — the low-level SPF reactive composition that drives playback. An advanced escape
95
+ * hatch for direct engine access; normal playback is driven through this element's own properties and methods.
96
+ */
97
+ get engine() {
98
+ return this.#engine;
99
+ }
100
+ attach(mediaElement) {
101
+ super.attach?.(mediaElement);
102
+ this.#signals.context.mediaElement.set(mediaElement);
103
+ }
104
+ detach() {
105
+ this.#cancelPendingPlay();
106
+ this.#signals.context.mediaElement.set(void 0);
107
+ super.detach?.();
108
+ }
109
+ destroy() {
110
+ this.#cancelPendingPlay();
111
+ this.#stopErrorSync();
112
+ this.#engine.destroy();
113
+ }
114
+ /** Preload type (`'none'` / `'metadata'` / `'auto'`). */
115
+ get preload() {
116
+ return this.#preload;
117
+ }
118
+ set preload(value) {
119
+ this.#preload = value;
120
+ if (value) this.#signals.state.preload.set(value);
121
+ }
122
+ get disableRemotePlayback() {
123
+ return this.#disableRemotePlayback;
124
+ }
125
+ set disableRemotePlayback(value) {
126
+ this.#disableRemotePlayback = value;
127
+ this.#signals.state.disableRemotePlayback.set(value);
128
+ }
129
+ get src() {
130
+ return this.#signals.state.presentation.get()?.url ?? "";
131
+ }
132
+ set src(value) {
133
+ if (value === this.src) return;
134
+ this.#cancelPendingPlay();
135
+ this.#signals.state.presentation.set(value ? { url: value } : void 0);
136
+ }
137
+ play() {
138
+ const mediaElement = this.#signals.context.mediaElement.get();
139
+ if (!mediaElement) return Promise.reject(/* @__PURE__ */ new Error("HlsAudioAdapterCore: no media element attached"));
140
+ this.#signals.state.loadActivated.set(true);
141
+ return mediaElement.play().catch((err) => {
142
+ if (this.src) return new Promise((resolve, reject) => {
143
+ const listener = () => {
144
+ this.#loadstartListener = null;
145
+ mediaElement.play().then(resolve, reject);
146
+ };
147
+ this.#loadstartListener = listener;
148
+ mediaElement.addEventListener("loadstart", listener, { once: true });
149
+ });
150
+ throw err;
151
+ });
152
+ }
153
+ /** `message`, plus the alternative-Media sentence when this class names one. */
154
+ #withSuggestion(message) {
155
+ return withAlternativeMediaSuggestion(message, this);
156
+ }
157
+ #createEngine() {
158
+ return createHlsAudioEngine({
159
+ ...this.#config,
160
+ onSignalsReady: (signals) => {
161
+ this.#signals = signals;
162
+ }
163
+ });
164
+ }
165
+ #cancelPendingPlay() {
166
+ if (!this.#loadstartListener) return;
167
+ this.#signals.context.mediaElement.get()?.removeEventListener("loadstart", this.#loadstartListener);
168
+ this.#loadstartListener = null;
169
+ }
170
+ }
171
+ return HlsAudioImpl;
172
+ }
173
+ /** Standalone SPF audio-only media adapter with no base class. */
174
+ var HlsAudioAdapterCore = class extends HlsAudioMixin(class {}) {};
175
+ //#endregion
176
+ export { HlsAudioAdapterCore, HlsAudioMixin };
177
+
178
+ //# sourceMappingURL=mixin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mixin.js","names":["#engine","#config","#createEngine","#stopErrorSync","#signals","#setError","#error","#reportedCode","#withSuggestion","#cancelPendingPlay","#preload","#disableRemotePlayback","#loadstartListener"],"sources":["../../../../../src/playback/adapters/hls-audio/mixin.ts"],"sourcesContent":["import type { Constructor, MixinReturn } from '@videojs/utils/types';\n\nimport type { Composition } from '../../../core/composition/create-composition';\nimport { effect } from '../../../core/signals/effect';\nimport {\n SVTA_NO_SUPPORTED_AUDIO_TRACK,\n SVTA_UNSUPPORTED_PLAYBACK_FEATURE,\n type SvtaError,\n} from '../../../media/errors';\nimport {\n createHlsAudioEngine,\n type HlsAudioEngineConfig,\n type HlsAudioEngineContext,\n type HlsAudioEngineSignals,\n type HlsAudioEngineState,\n} from '../../engines/hls/engine-audio-only';\nimport { UNSUPPORTED_PLAYBACK_FEATURE_MESSAGE } from '../../primitives/error-messages';\nimport {\n firstFatal,\n type HlsVideoMediaError,\n hasUnsupportedFeatureCause,\n withAlternativeMediaSuggestion,\n} from '../hls-video/error-surface';\n\nexport interface HlsAudioAdapterProps {\n src: string;\n preload: '' | 'none' | 'metadata' | 'auto';\n disableRemotePlayback: boolean;\n}\n\nexport interface HlsAudioAdapterAPI extends HlsAudioAdapterProps {\n readonly engine: Composition<HlsAudioEngineState, HlsAudioEngineContext>;\n readonly error: HlsVideoMediaError | null;\n attach(mediaElement: HTMLMediaElement): void;\n detach(): void;\n destroy(): void;\n play(): Promise<void>;\n}\n\n/**\n * Which reported conditions this composition treats as fatal. Only the audio verdict: an audio-only engine composes no\n * video selection, so `SVTA_NO_SUPPORTED_VIDEO_TRACK` is never reported and surfacing it would describe a track type\n * this media doesn't have.\n */\nconst FATAL_SVTA_CODES: ReadonlySet<number> = new Set<number>([SVTA_NO_SUPPORTED_AUDIO_TRACK]);\n\n/**\n * Mixin that adds SPF audio-only HLS playback to any base class.\n *\n * @example\n * class HlsAudioAdapter extends HlsAudioMixin(HTMLVideoAdapter) {}\n *\n * const media = new HlsAudioAdapter();\n * media.attach(document.querySelector('video'));\n * media.src = 'https://stream.mux.com/abc123.m3u8';\n *\n * @fires error - Fired when a fatal condition is reported. Read `error` for it.\n *\n * Parallel to `HlsVideoMixin` with one substantive difference: the underlying engine is the audio-only variant\n * (`createHlsAudioEngine`), which omits video and text-track behaviors. The src / preload / disableRemotePlayback /\n * play() contract per the WHATWG HTML spec is identical to the default adapter.\n *\n * Selecting this adapter is the variant decision: instantiating `HlsAudioAdapterCore` opts the consumer into\n * audio-only delivery even when the source is a mixed-AV HLS manifest.\n */\nexport function HlsAudioMixin<Base extends Constructor<any>>(BaseClass: Base) {\n class HlsAudioImpl extends BaseClass {\n static readonly defaultProps: HlsAudioAdapterProps = {\n src: '',\n preload: '',\n disableRemotePlayback: false,\n };\n\n /**\n * A complete sentence naming the Media to reach for when this one can't play a source. Appended to the copy this\n * adapter logs.\n *\n * Empty here, and overridden the same way as on the video adapter — see its note. `hls-audio` has no\n * better-equipped sibling of its own; the Mux audio Media built on this engine does, and points at the\n * hls.js-backed one.\n */\n static get alternativeMediaSuggestion(): string | undefined {\n return undefined;\n }\n\n readonly #engine: Composition<HlsAudioEngineState, HlsAudioEngineContext>;\n #config: HlsAudioEngineConfig;\n #signals!: HlsAudioEngineSignals;\n #preload: '' | 'none' | 'metadata' | 'auto' = HlsAudioImpl.defaultProps.preload;\n #disableRemotePlayback: boolean = HlsAudioImpl.defaultProps.disableRemotePlayback;\n #error: HlsVideoMediaError | null = null;\n /** Reported condition currently surfaced — see the video adapter's note. */\n #reportedCode: number | null = null;\n #stopErrorSync: () => void;\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\n this.#config = config;\n this.#engine = this.#createEngine();\n\n // Promote the first fatal condition out of the engine's reported sequence\n // onto the media surface. Clearing rides the same signal: `collectErrors`\n // resets the slot per source, so a new source starts with no error without\n // this needing its own source-change hook.\n this.#stopErrorSync = effect(() => {\n const errors = this.#signals.state.errors.get();\n\n this.#setError(firstFatal(errors, FATAL_SVTA_CODES), errors);\n });\n }\n\n /**\n * The current fatal error, or `null`. Only _fatal_ conditions appear here — the engine reports non-fatal ones too,\n * which stay in `engine.state.errors`. Resets per source. Fires `'error'` when set.\n */\n get error(): HlsVideoMediaError | null {\n return this.#error;\n }\n\n #setError(reported: SvtaError | undefined, errors: readonly SvtaError[] | undefined): void {\n if (!reported) {\n // Cleared (new source). No event: `'error'` announces a failure, and\n // consumers reset their own copy on source change.\n this.#error = null;\n this.#reportedCode = null;\n return;\n }\n\n // Keyed on the code, not the object: a later append re-runs this effect\n // with an equal-but-new array, and re-firing `'error'` for a condition\n // already surfaced would look like a second failure.\n if (this.#reportedCode === reported.code) return;\n\n this.#reportedCode = reported.code;\n\n // See the video adapter: a cause this engine can't implement is what the\n // consumer needs, so it replaces the verdict's code on the surface.\n const unsupported = hasUnsupportedFeatureCause(errors);\n\n if (unsupported) {\n console.error(this.#withSuggestion(UNSUPPORTED_PLAYBACK_FEATURE_MESSAGE), { conditions: errors });\n }\n\n this.#error = {\n code: unsupported ? SVTA_UNSUPPORTED_PLAYBACK_FEATURE : reported.code,\n message: reported.message ?? '',\n ...(reported.data === undefined ? {} : { data: reported.data }),\n };\n this.dispatchEvent?.(new Event('error'));\n }\n\n /**\n * Underlying playback engine — the low-level SPF reactive composition that drives playback. An advanced escape\n * hatch for direct engine access; normal playback is driven through this element's own properties and methods.\n */\n get engine(): Composition<HlsAudioEngineState, HlsAudioEngineContext> {\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.#stopErrorSync();\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\n if (value) {\n this.#signals.state.preload.set(value);\n }\n }\n\n // -------------------------------------------------------------------------\n // disableRemotePlayback — synchronous IDL attribute (WHATWG Remote Playback)\n // Author intent for whether the AirPlay/remote picker is offered. Mirrors\n // the DOM attribute name; the value flows to `state.disableRemotePlayback`,\n // which `setupAirPlay` reads to honor an explicit opt-out. The underlying\n // media element's own `disableRemotePlayback` stays programmatically managed\n // (ManagedMediaSource needs it `true` to open; AirPlay flips it `false` once\n // the source is open), so author intent and the effective flag stay distinct.\n // -------------------------------------------------------------------------\n\n get disableRemotePlayback(): boolean {\n return this.#disableRemotePlayback;\n }\n\n set disableRemotePlayback(value: boolean) {\n this.#disableRemotePlayback = value;\n this.#signals.state.disableRemotePlayback.set(value);\n }\n\n // -------------------------------------------------------------------------\n // src — synchronous IDL attribute (WHATWG §4.8.11.2)\n // Each assignment overwrites the engine's presentation state in place. The\n // resolver FSM routes back through teardown → rebuild on the same engine,\n // mirroring how the browser's load algorithm resets media state on src change\n // — without recreating the engine or re-capturing its signals. Setting an\n // empty src un-resolves the presentation, tearing the current source down to\n // the engine's fresh-but-attached \"no source\" state.\n // -------------------------------------------------------------------------\n\n get src(): string {\n return this.#signals.state.presentation.get()?.url ?? '';\n }\n\n set src(value: string) {\n // Unchanged URL, no reload — see the video adapter's note.\n if (value === this.src) return;\n\n this.#cancelPendingPlay();\n this.#signals.state.presentation.set(value ? { url: value } : undefined);\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) return Promise.reject(new Error('HlsAudioAdapterCore: no media element attached'));\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\n this.#loadstartListener = listener;\n mediaElement.addEventListener('loadstart', listener, { once: true });\n });\n }\n\n throw err;\n });\n }\n\n // -------------------------------------------------------------------------\n // Private\n // -------------------------------------------------------------------------\n\n /** `message`, plus the alternative-Media sentence when this class names one. */\n #withSuggestion(message: string): string {\n return withAlternativeMediaSuggestion(message, this);\n }\n\n #createEngine(): Composition<HlsAudioEngineState, HlsAudioEngineContext> {\n return createHlsAudioEngine({\n ...this.#config,\n onSignalsReady: (signals) => {\n this.#signals = signals;\n },\n });\n }\n\n #cancelPendingPlay(): void {\n if (!this.#loadstartListener) return;\n\n const mediaElement = this.#signals.context.mediaElement.get();\n\n mediaElement?.removeEventListener('loadstart', this.#loadstartListener);\n this.#loadstartListener = null;\n }\n }\n\n // `MixinReturn` sources statics from `Base`, so the adapter's own static needs\n // adding back to the type or callers can't read it.\n return HlsAudioImpl as unknown as MixinReturn<Base, HlsAudioAdapterAPI> & {\n readonly alternativeMediaSuggestion: string | undefined;\n readonly defaultProps: HlsAudioAdapterProps;\n };\n}\n\n/** Standalone SPF audio-only media adapter with no base class. */\nexport class HlsAudioAdapterCore extends HlsAudioMixin(class {}) {}\n"],"mappings":";;;;;;;;;;;AA4CA,MAAM,mCAAwC,IAAI,IAAY,CAAC,6BAA6B,CAAC;;;;;;;;;;;;;;;;;;;;AAqB7F,SAAgB,cAA6C,WAAiB;CAC5E,MAAM,qBAAqB,UAAU;EACnC,OAAgB,eAAqC;GACnD,KAAK;GACL,SAAS;GACT,uBAAuB;EACzB;;;;;;;;;EAUA,WAAW,6BAAiD,CAE5D;EAEA;EACA;EACA;EACA,WAA8C,aAAa,aAAa;EACxE,yBAAkC,aAAa,aAAa;EAC5D,SAAoC;;EAEpC,gBAA+B;EAC/B;;EAGA,qBAA0C;EAE1C,YAAY,GAAG,MAAa;GAC1B,MAAM,GAAG,IAAI;GAEb,MAAM,EAAE,WAAW,OAAO,MAAM,CAAC;GAEjC,KAAKC,UAAU;GACf,KAAKD,UAAU,KAAKE,cAAc;GAMlC,KAAKC,iBAAiB,aAAa;IACjC,MAAM,SAAS,KAAKC,SAAS,MAAM,OAAO,IAAI;IAE9C,KAAKC,UAAU,WAAW,QAAQ,gBAAgB,GAAG,MAAM;GAC7D,CAAC;EACH;;;;;EAMA,IAAI,QAAmC;GACrC,OAAO,KAAKC;EACd;EAEA,UAAU,UAAiC,QAAgD;GACzF,IAAI,CAAC,UAAU;IAGb,KAAKA,SAAS;IACd,KAAKC,gBAAgB;IACrB;GACF;GAKA,IAAI,KAAKA,kBAAkB,SAAS,MAAM;GAE1C,KAAKA,gBAAgB,SAAS;GAI9B,MAAM,cAAc,2BAA2B,MAAM;GAErD,IAAI,aACF,QAAQ,MAAM,KAAKC,gBAAgB,oCAAoC,GAAG,EAAE,YAAY,OAAO,CAAC;GAGlG,KAAKF,SAAS;IACZ,MAAM,cAAc,oCAAoC,SAAS;IACjE,SAAS,SAAS,WAAW;IAC7B,GAAI,SAAS,SAAS,KAAA,IAAY,CAAC,IAAI,EAAE,MAAM,SAAS,KAAK;GAC/D;GACA,KAAK,gBAAgB,IAAI,MAAM,OAAO,CAAC;EACzC;;;;;EAMA,IAAI,SAAkE;GACpE,OAAO,KAAKN;EACd;EAMA,OAAO,cAAsC;GAC3C,MAAM,SAAS,YAAY;GAC3B,KAAKI,SAAS,QAAQ,aAAa,IAAI,YAAY;EACrD;EAEA,SAAe;GACb,KAAKK,mBAAmB;GACxB,KAAKL,SAAS,QAAQ,aAAa,IAAI,KAAA,CAAS;GAChD,MAAM,SAAS;EACjB;EAEA,UAAgB;GACd,KAAKK,mBAAmB;GACxB,KAAKN,eAAe;GACpB,KAAKH,QAAQ,QAAQ;EACvB;;EAOA,IAAI,UAA6C;GAC/C,OAAO,KAAKU;EACd;EAEA,IAAI,QAAQ,OAA0C;GACpD,KAAKA,WAAW;GAEhB,IAAI,OACF,KAAKN,SAAS,MAAM,QAAQ,IAAI,KAAK;EAEzC;EAYA,IAAI,wBAAiC;GACnC,OAAO,KAAKO;EACd;EAEA,IAAI,sBAAsB,OAAgB;GACxC,KAAKA,yBAAyB;GAC9B,KAAKP,SAAS,MAAM,sBAAsB,IAAI,KAAK;EACrD;EAYA,IAAI,MAAc;GAChB,OAAO,KAAKA,SAAS,MAAM,aAAa,IAAI,CAAC,EAAE,OAAO;EACxD;EAEA,IAAI,IAAI,OAAe;GAErB,IAAI,UAAU,KAAK,KAAK;GAExB,KAAKK,mBAAmB;GACxB,KAAKL,SAAS,MAAM,aAAa,IAAI,QAAQ,EAAE,KAAK,MAAM,IAAI,KAAA,CAAS;EACzE;EAMA,OAAsB;GACpB,MAAM,eAAe,KAAKA,SAAS,QAAQ,aAAa,IAAI;GAC5D,IAAI,CAAC,cAAc,OAAO,QAAQ,uBAAO,IAAI,MAAM,gDAAgD,CAAC;GAEpG,KAAKA,SAAS,MAAM,cAAc,IAAI,IAAI;GAE1C,OAAO,aAAa,KAAK,CAAC,CAAC,OAAO,QAAiB;IACjD,IAAI,KAAK,KACP,OAAO,IAAI,SAAe,SAAS,WAAW;KAC5C,MAAM,iBAAiB;MACrB,KAAKQ,qBAAqB;MAC1B,aAAa,KAAK,CAAC,CAAC,KAAK,SAAS,MAAM;KAC1C;KAEA,KAAKA,qBAAqB;KAC1B,aAAa,iBAAiB,aAAa,UAAU,EAAE,MAAM,KAAK,CAAC;IACrE,CAAC;IAGH,MAAM;GACR,CAAC;EACH;;EAOA,gBAAgB,SAAyB;GACvC,OAAO,+BAA+B,SAAS,IAAI;EACrD;EAEA,gBAAyE;GACvE,OAAO,qBAAqB;IAC1B,GAAG,KAAKX;IACR,iBAAiB,YAAY;KAC3B,KAAKG,WAAW;IAClB;GACF,CAAC;EACH;EAEA,qBAA2B;GACzB,IAAI,CAAC,KAAKQ,oBAAoB;GAI9B,KAF0BR,SAAS,QAAQ,aAAa,IAE7C,CAAC,EAAE,oBAAoB,aAAa,KAAKQ,kBAAkB;GACtE,KAAKA,qBAAqB;EAC5B;CACF;CAIA,OAAO;AAIT;;AAGA,IAAa,sBAAb,cAAyC,cAAc,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC"}
@@ -0,0 +1,19 @@
1
+ import { HlsBackgroundVideoAdapterAPI, HlsBackgroundVideoAdapterProps } from "./mixin.js";
2
+ import { BackgroundVideoHost } from "./host.js";
3
+ //#region src/playback/adapters/hls-background-video/adapter.d.ts
4
+ declare const HlsBackgroundVideoAdapter_base: import("@videojs/utils/types").Constructor<BackgroundVideoHost & HlsBackgroundVideoAdapterAPI, any[]> & Omit<typeof BackgroundVideoHost, "prototype"> & {
5
+ readonly defaultProps: HlsBackgroundVideoAdapterProps;
6
+ };
7
+ /**
8
+ * The background-video Media, bound to a `<video>` through {@link BackgroundVideoHost}.
9
+ *
10
+ * That host carries the attached element and the four properties `attach` fixes, which is all this Media's surface
11
+ * needs, and it is local — so this entry has no `@videojs/media` dependency.
12
+ *
13
+ * No `MediaTracksMixin`, unlike `HlsVideoAdapter`: the engine subtracts audio and text entirely and pins one video
14
+ * rendition for the session, so there are no track lists for a consumer to project or switch between.
15
+ */
16
+ declare class HlsBackgroundVideoAdapter extends HlsBackgroundVideoAdapter_base {}
17
+ //#endregion
18
+ export { HlsBackgroundVideoAdapter };
19
+ //# sourceMappingURL=adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.d.ts","names":[],"sources":["../../../../../src/playback/adapters/hls-background-video/adapter.ts"],"mappings":";;;;;;;;;;;;;;;cAYa,kCAAkC"}
@@ -0,0 +1,17 @@
1
+ import { HlsBackgroundVideoMixin } from "./mixin.js";
2
+ import { BackgroundVideoHost } from "./host.js";
3
+ //#region src/playback/adapters/hls-background-video/adapter.ts
4
+ /**
5
+ * The background-video Media, bound to a `<video>` through {@link BackgroundVideoHost}.
6
+ *
7
+ * That host carries the attached element and the four properties `attach` fixes, which is all this Media's surface
8
+ * needs, and it is local — so this entry has no `@videojs/media` dependency.
9
+ *
10
+ * No `MediaTracksMixin`, unlike `HlsVideoAdapter`: the engine subtracts audio and text entirely and pins one video
11
+ * rendition for the session, so there are no track lists for a consumer to project or switch between.
12
+ */
13
+ var HlsBackgroundVideoAdapter = class extends HlsBackgroundVideoMixin(BackgroundVideoHost) {};
14
+ //#endregion
15
+ export { HlsBackgroundVideoAdapter };
16
+
17
+ //# sourceMappingURL=adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.js","names":[],"sources":["../../../../../src/playback/adapters/hls-background-video/adapter.ts"],"sourcesContent":["import { BackgroundVideoHost } from './host';\nimport { HlsBackgroundVideoMixin } from './mixin';\n\n/**\n * The background-video Media, bound to a `<video>` through {@link BackgroundVideoHost}.\n *\n * That host carries the attached element and the four properties `attach` fixes, which is all this Media's surface\n * needs, and it is local — so this entry has no `@videojs/media` dependency.\n *\n * No `MediaTracksMixin`, unlike `HlsVideoAdapter`: the engine subtracts audio and text entirely and pins one video\n * rendition for the session, so there are no track lists for a consumer to project or switch between.\n */\nexport class HlsBackgroundVideoAdapter extends HlsBackgroundVideoMixin(BackgroundVideoHost) {}\n"],"mappings":";;;;;;;;;;;;AAYA,IAAa,4BAAb,cAA+C,wBAAwB,mBAAmB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,34 @@
1
+ //#region src/playback/adapters/hls-background-video/host.d.ts
2
+ /**
3
+ * The `<video>` binding a background video uses: somewhere to keep the attached element, and the four properties the
4
+ * Media fixes on it.
5
+ *
6
+ * That is the whole surface anything here reaches. The engine drives playback, the element exposes `src` and nothing
7
+ * else, and the background player subscribes to no store features, so nothing asks a background video for
8
+ * `currentTime`, `play()`, picture-in-picture, fullscreen, forwarded events, or media components. Holding the host to
9
+ * what is reachable is what keeps this entry free of `@videojs/media`, and small enough to suit a component whose whole
10
+ * pitch is its size.
11
+ *
12
+ * An `EventTarget`, because a Media is one: the store and the element layers take anything they attach as an event
13
+ * source, and inheriting the three methods satisfies that for free rather than by stubbing them.
14
+ *
15
+ * ⚠️ It still implements too little to carry the rest of the media surface, which bounds what may consume it: a store
16
+ * feature reading a property outside this set gets `undefined` rather than an error. A Media needing more of that
17
+ * surface belongs on a host that provides it.
18
+ */
19
+ declare class BackgroundVideoHost extends EventTarget {
20
+ #private;
21
+ attach(target: HTMLVideoElement): void;
22
+ detach(): void;
23
+ get loop(): boolean;
24
+ set loop(value: boolean);
25
+ get muted(): boolean;
26
+ set muted(value: boolean);
27
+ get autoplay(): boolean;
28
+ set autoplay(value: boolean);
29
+ get preload(): HTMLVideoElement['preload'];
30
+ set preload(value: HTMLVideoElement['preload']);
31
+ }
32
+ //#endregion
33
+ export { BackgroundVideoHost };
34
+ //# sourceMappingURL=host.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host.d.ts","names":[],"sources":["../../../../../src/playback/adapters/hls-background-video/host.ts"],"mappings":";;;;;;;;;;;;;;;;;;cAiBa,4BAA4B;;EAGvC,OAAO,QAAQ;EAMf;MAOI;MAIA,KAAK;MAIL;MAIA,MAAM;MAIN;MAIA,SAAS;MAIT,WAAW;MAIX,QAAQ,OAAO"}