@videojs/spf 10.0.0-beta.30 → 10.0.0-beta.32

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 (520) hide show
  1. package/dist/default/core/actors/create-machine-actor.js +23 -25
  2. package/dist/default/core/actors/create-machine-actor.js.map +1 -1
  3. package/dist/default/core/actors/create-transition-actor.js +7 -9
  4. package/dist/default/core/actors/create-transition-actor.js.map +1 -1
  5. package/dist/default/core/composition/create-composition.js +26 -29
  6. package/dist/default/core/composition/create-composition.js.map +1 -1
  7. package/dist/default/core/composition/share-signals.js +12 -17
  8. package/dist/default/core/composition/share-signals.js.map +1 -1
  9. package/dist/default/core/machine.js +3 -4
  10. package/dist/default/core/machine.js.map +1 -1
  11. package/dist/default/core/reactors/create-machine-reactor.js +20 -19
  12. package/dist/default/core/reactors/create-machine-reactor.js.map +1 -1
  13. package/dist/default/core/signals/effect.js +24 -4
  14. package/dist/default/core/signals/effect.js.map +1 -1
  15. package/dist/default/core/signals/primitives.js +10 -14
  16. package/dist/default/core/signals/primitives.js.map +1 -1
  17. package/dist/default/core/signals/when.js +6 -8
  18. package/dist/default/core/signals/when.js.map +1 -1
  19. package/dist/default/core/tasks/delayed-reschedule.js +7 -11
  20. package/dist/default/core/tasks/delayed-reschedule.js.map +1 -1
  21. package/dist/default/core/tasks/task.js +59 -82
  22. package/dist/default/core/tasks/task.js.map +1 -1
  23. package/dist/default/hls.js +3 -1
  24. package/dist/default/index.js +2 -3
  25. package/dist/default/index.js.map +1 -1
  26. package/dist/default/media/abr/quality-selection.js +3 -7
  27. package/dist/default/media/abr/quality-selection.js.map +1 -1
  28. package/dist/default/media/buffer/back-buffer.js +15 -19
  29. package/dist/default/media/buffer/back-buffer.js.map +1 -1
  30. package/dist/default/media/buffer/forward-buffer.js +32 -41
  31. package/dist/default/media/buffer/forward-buffer.js.map +1 -1
  32. package/dist/default/media/dom/capabilities.js +26 -37
  33. package/dist/default/media/dom/capabilities.js.map +1 -1
  34. package/dist/default/media/dom/mse/append-segment.js +3 -5
  35. package/dist/default/media/dom/mse/append-segment.js.map +1 -1
  36. package/dist/default/media/dom/mse/buffer-flusher.js +5 -5
  37. package/dist/default/media/dom/mse/buffer-flusher.js.map +1 -1
  38. package/dist/default/media/dom/mse/duration.js +23 -31
  39. package/dist/default/media/dom/mse/duration.js.map +1 -1
  40. package/dist/default/media/dom/mse/end-of-stream.js +3 -6
  41. package/dist/default/media/dom/mse/end-of-stream.js.map +1 -1
  42. package/dist/default/media/dom/mse/mediasource-setup.js +65 -81
  43. package/dist/default/media/dom/mse/mediasource-setup.js.map +1 -1
  44. package/dist/default/media/dom/screen.js +37 -54
  45. package/dist/default/media/dom/screen.js.map +1 -1
  46. package/dist/default/media/dom/text/resolve-vtt-segment.js.map +1 -1
  47. package/dist/default/media/dom/text/text-track-slots.js +15 -23
  48. package/dist/default/media/dom/text/text-track-slots.js.map +1 -1
  49. package/dist/default/media/errors.js +25 -34
  50. package/dist/default/media/errors.js.map +1 -1
  51. package/dist/default/media/hls/parse-attributes.js +9 -26
  52. package/dist/default/media/hls/parse-attributes.js.map +1 -1
  53. package/dist/default/media/hls/parse-media-playlist.js +25 -33
  54. package/dist/default/media/hls/parse-media-playlist.js.map +1 -1
  55. package/dist/default/media/hls/parse-multivariant.js +3 -3
  56. package/dist/default/media/hls/parse-multivariant.js.map +1 -1
  57. package/dist/default/media/hls/reload-policy.js +19 -27
  58. package/dist/default/media/hls/reload-policy.js.map +1 -1
  59. package/dist/default/media/hls/resolve-url.js +1 -3
  60. package/dist/default/media/hls/resolve-url.js.map +1 -1
  61. package/dist/default/media/live-window.js +9 -13
  62. package/dist/default/media/live-window.js.map +1 -1
  63. package/dist/default/media/media-tracks/media-tracks.js +12 -17
  64. package/dist/default/media/media-tracks/media-tracks.js.map +1 -1
  65. package/dist/default/media/mp4/box.js +4 -5
  66. package/dist/default/media/mp4/box.js.map +1 -1
  67. package/dist/default/media/mp4/timestamp-origin.js +30 -42
  68. package/dist/default/media/mp4/timestamp-origin.js.map +1 -1
  69. package/dist/default/media/primitives/resolution.js +5 -8
  70. package/dist/default/media/primitives/resolution.js.map +1 -1
  71. package/dist/default/media/primitives/select-tracks.js +24 -34
  72. package/dist/default/media/primitives/select-tracks.js.map +1 -1
  73. package/dist/default/media/text/parse-vtt-timestamp-map.js +6 -8
  74. package/dist/default/media/text/parse-vtt-timestamp-map.js.map +1 -1
  75. package/dist/default/media/text/resolve-vtt-metadata.js +8 -9
  76. package/dist/default/media/text/resolve-vtt-metadata.js.map +1 -1
  77. package/dist/default/media/types/index.js +10 -18
  78. package/dist/default/media/types/index.js.map +1 -1
  79. package/dist/default/media/utils/cdn.js +10 -16
  80. package/dist/default/media/utils/cdn.js.map +1 -1
  81. package/dist/default/media/utils/preload.js +4 -6
  82. package/dist/default/media/utils/preload.js.map +1 -1
  83. package/dist/default/media/utils/track-selection.js +10 -14
  84. package/dist/default/media/utils/track-selection.js.map +1 -1
  85. package/dist/default/media/utils/tracks.js +56 -54
  86. package/dist/default/media/utils/tracks.js.map +1 -1
  87. package/dist/default/network/bandwidth-estimator.js +18 -19
  88. package/dist/default/network/bandwidth-estimator.js.map +1 -1
  89. package/dist/default/network/chunked-stream-iterable.js +4 -6
  90. package/dist/default/network/chunked-stream-iterable.js.map +1 -1
  91. package/dist/default/network/ewma.js +22 -25
  92. package/dist/default/network/ewma.js.map +1 -1
  93. package/dist/default/network/fetch.js +30 -37
  94. package/dist/default/network/fetch.js.map +1 -1
  95. package/dist/default/playback/actors/dom/segment-loader.js +28 -44
  96. package/dist/default/playback/actors/dom/segment-loader.js.map +1 -1
  97. package/dist/default/playback/actors/dom/source-buffer.js.map +1 -1
  98. package/dist/default/playback/actors/dom/text-tracks.js.map +1 -1
  99. package/dist/default/playback/actors/text-track-segment-loader.js +24 -35
  100. package/dist/default/playback/actors/text-track-segment-loader.js.map +1 -1
  101. package/dist/default/playback/adapters/hls-audio/adapter.js +23 -31
  102. package/dist/default/playback/adapters/hls-audio/adapter.js.map +1 -1
  103. package/dist/default/playback/adapters/hls-audio/media.js.map +1 -1
  104. package/dist/default/playback/adapters/hls-background-video/adapter.js +50 -70
  105. package/dist/default/playback/adapters/hls-background-video/adapter.js.map +1 -1
  106. package/dist/default/playback/adapters/hls-background-video/host.js +12 -16
  107. package/dist/default/playback/adapters/hls-background-video/host.js.map +1 -1
  108. package/dist/default/playback/adapters/hls-background-video/media.js +5 -8
  109. package/dist/default/playback/adapters/hls-background-video/media.js.map +1 -1
  110. package/dist/default/playback/adapters/hls-video/adapter.js +43 -60
  111. package/dist/default/playback/adapters/hls-video/adapter.js.map +1 -1
  112. package/dist/default/playback/adapters/hls-video/error-surface.js +13 -18
  113. package/dist/default/playback/adapters/hls-video/error-surface.js.map +1 -1
  114. package/dist/default/playback/adapters/hls-video/media-tracks.js +4 -5
  115. package/dist/default/playback/adapters/hls-video/media-tracks.js.map +1 -1
  116. package/dist/default/playback/adapters/hls-video/media.js.map +1 -1
  117. package/dist/default/playback/adapters/mux-audio/media.js +8 -12
  118. package/dist/default/playback/adapters/mux-audio/media.js.map +1 -1
  119. package/dist/default/playback/adapters/mux-video/adapter.js +25 -33
  120. package/dist/default/playback/adapters/mux-video/adapter.js.map +1 -1
  121. package/dist/default/playback/adapters/mux-video/media.js +7 -9
  122. package/dist/default/playback/adapters/mux-video/media.js.map +1 -1
  123. package/dist/default/playback/behaviors/calculate-presentation-duration.js +5 -8
  124. package/dist/default/playback/behaviors/calculate-presentation-duration.js.map +1 -1
  125. package/dist/default/playback/behaviors/collect-errors.js +39 -52
  126. package/dist/default/playback/behaviors/collect-errors.js.map +1 -1
  127. package/dist/default/playback/behaviors/derive-cdn-priority.js +16 -23
  128. package/dist/default/playback/behaviors/derive-cdn-priority.js.map +1 -1
  129. package/dist/default/playback/behaviors/dom/airplay.js +38 -61
  130. package/dist/default/playback/behaviors/dom/airplay.js.map +1 -1
  131. package/dist/default/playback/behaviors/dom/apply-start-position.js +23 -35
  132. package/dist/default/playback/behaviors/dom/apply-start-position.js.map +1 -1
  133. package/dist/default/playback/behaviors/dom/end-of-stream.js +11 -16
  134. package/dist/default/playback/behaviors/dom/end-of-stream.js.map +1 -1
  135. package/dist/default/playback/behaviors/dom/load-segments.js +27 -39
  136. package/dist/default/playback/behaviors/dom/load-segments.js.map +1 -1
  137. package/dist/default/playback/behaviors/dom/recover-end-stall.js +21 -26
  138. package/dist/default/playback/behaviors/dom/recover-end-stall.js.map +1 -1
  139. package/dist/default/playback/behaviors/dom/seek-to-live-edge.js +41 -60
  140. package/dist/default/playback/behaviors/dom/seek-to-live-edge.js.map +1 -1
  141. package/dist/default/playback/behaviors/dom/setup-buffer-actors.js +50 -74
  142. package/dist/default/playback/behaviors/dom/setup-buffer-actors.js.map +1 -1
  143. package/dist/default/playback/behaviors/dom/setup-mediasource.js +29 -43
  144. package/dist/default/playback/behaviors/dom/setup-mediasource.js.map +1 -1
  145. package/dist/default/playback/behaviors/dom/setup-text-track-actors.js.map +1 -1
  146. package/dist/default/playback/behaviors/dom/sync-live-seekable-range.js +3 -4
  147. package/dist/default/playback/behaviors/dom/sync-live-seekable-range.js.map +1 -1
  148. package/dist/default/playback/behaviors/dom/sync-text-tracks.js +30 -45
  149. package/dist/default/playback/behaviors/dom/sync-text-tracks.js.map +1 -1
  150. package/dist/default/playback/behaviors/dom/track-current-time.js +9 -11
  151. package/dist/default/playback/behaviors/dom/track-current-time.js.map +1 -1
  152. package/dist/default/playback/behaviors/dom/track-load-triggers.js +24 -32
  153. package/dist/default/playback/behaviors/dom/track-load-triggers.js.map +1 -1
  154. package/dist/default/playback/behaviors/dom/track-playback-rate.js +6 -8
  155. package/dist/default/playback/behaviors/dom/track-playback-rate.js.map +1 -1
  156. package/dist/default/playback/behaviors/dom/track-player-resolution.js +10 -14
  157. package/dist/default/playback/behaviors/dom/track-player-resolution.js.map +1 -1
  158. package/dist/default/playback/behaviors/dom/track-screen-resolution.js +8 -9
  159. package/dist/default/playback/behaviors/dom/track-screen-resolution.js.map +1 -1
  160. package/dist/default/playback/behaviors/dom/update-mediasource-duration.js +28 -43
  161. package/dist/default/playback/behaviors/dom/update-mediasource-duration.js.map +1 -1
  162. package/dist/default/playback/behaviors/establish-start-media-time.js +32 -42
  163. package/dist/default/playback/behaviors/establish-start-media-time.js.map +1 -1
  164. package/dist/default/playback/behaviors/resolve-presentation.js +13 -22
  165. package/dist/default/playback/behaviors/resolve-presentation.js.map +1 -1
  166. package/dist/default/playback/behaviors/resolve-track.js +5 -12
  167. package/dist/default/playback/behaviors/resolve-track.js.map +1 -1
  168. package/dist/default/playback/behaviors/select-tracks.js +77 -104
  169. package/dist/default/playback/behaviors/select-tracks.js.map +1 -1
  170. package/dist/default/playback/behaviors/setup-failover-monitor.js +11 -16
  171. package/dist/default/playback/behaviors/setup-failover-monitor.js.map +1 -1
  172. package/dist/default/playback/behaviors/sync-preload.js +9 -13
  173. package/dist/default/playback/behaviors/sync-preload.js.map +1 -1
  174. package/dist/default/playback/behaviors/track-switching.js +189 -173
  175. package/dist/default/playback/behaviors/track-switching.js.map +1 -1
  176. package/dist/default/playback/engines/hls/engine-audio-only.js +20 -24
  177. package/dist/default/playback/engines/hls/engine-audio-only.js.map +1 -1
  178. package/dist/default/playback/engines/hls/engine-background-video.js +22 -27
  179. package/dist/default/playback/engines/hls/engine-background-video.js.map +1 -1
  180. package/dist/default/playback/engines/hls/engine.js +22 -25
  181. package/dist/default/playback/engines/hls/engine.js.map +1 -1
  182. package/dist/default/playback/primitives/error-messages.js +16 -25
  183. package/dist/default/playback/primitives/error-messages.js.map +1 -1
  184. package/dist/default/playback/primitives/failover-fetch.js +9 -14
  185. package/dist/default/playback/primitives/failover-fetch.js.map +1 -1
  186. package/dist/default/playback/primitives/head-peek.js +7 -10
  187. package/dist/default/playback/primitives/head-peek.js.map +1 -1
  188. package/dist/default/playback/primitives/live-window.js +12 -15
  189. package/dist/default/playback/primitives/live-window.js.map +1 -1
  190. package/dist/default/playback/primitives/relocation-pipelines.js +34 -46
  191. package/dist/default/playback/primitives/relocation-pipelines.js.map +1 -1
  192. package/dist/default/playback/primitives/report-track-conditions.js +26 -38
  193. package/dist/default/playback/primitives/report-track-conditions.js.map +1 -1
  194. package/dist/default/playback/primitives/segment-load-pipeline.js +15 -15
  195. package/dist/default/playback/primitives/segment-load-pipeline.js.map +1 -1
  196. package/dist/default/playback/primitives/selection-rules.js +65 -36
  197. package/dist/default/playback/primitives/selection-rules.js.map +1 -1
  198. package/dist/default/playback/primitives/text-segment-load-pipeline.js +4 -5
  199. package/dist/default/playback/primitives/text-segment-load-pipeline.js.map +1 -1
  200. package/dist/default/playback/primitives/track-types.js +10 -18
  201. package/dist/default/playback/primitives/track-types.js.map +1 -1
  202. package/dist/dev/core/actors/actor.d.ts +4 -4
  203. package/dist/dev/core/actors/actor.d.ts.map +1 -1
  204. package/dist/dev/core/actors/create-machine-actor.d.ts +38 -47
  205. package/dist/dev/core/actors/create-machine-actor.d.ts.map +1 -1
  206. package/dist/dev/core/actors/create-machine-actor.js +23 -25
  207. package/dist/dev/core/actors/create-machine-actor.js.map +1 -1
  208. package/dist/dev/core/actors/create-transition-actor.d.ts +11 -15
  209. package/dist/dev/core/actors/create-transition-actor.d.ts.map +1 -1
  210. package/dist/dev/core/actors/create-transition-actor.js +7 -9
  211. package/dist/dev/core/actors/create-transition-actor.js.map +1 -1
  212. package/dist/dev/core/composition/create-composition.d.ts +70 -102
  213. package/dist/dev/core/composition/create-composition.d.ts.map +1 -1
  214. package/dist/dev/core/composition/create-composition.js +26 -29
  215. package/dist/dev/core/composition/create-composition.js.map +1 -1
  216. package/dist/dev/core/composition/share-signals.d.ts +17 -24
  217. package/dist/dev/core/composition/share-signals.d.ts.map +1 -1
  218. package/dist/dev/core/composition/share-signals.js +12 -17
  219. package/dist/dev/core/composition/share-signals.js.map +1 -1
  220. package/dist/dev/core/machine.d.ts +4 -4
  221. package/dist/dev/core/machine.js +3 -4
  222. package/dist/dev/core/machine.js.map +1 -1
  223. package/dist/dev/core/reactors/create-machine-reactor.d.ts +33 -39
  224. package/dist/dev/core/reactors/create-machine-reactor.d.ts.map +1 -1
  225. package/dist/dev/core/reactors/create-machine-reactor.js +20 -19
  226. package/dist/dev/core/reactors/create-machine-reactor.js.map +1 -1
  227. package/dist/dev/core/signals/effect.d.ts +3 -4
  228. package/dist/dev/core/signals/effect.d.ts.map +1 -1
  229. package/dist/dev/core/signals/effect.js +24 -4
  230. package/dist/dev/core/signals/effect.js.map +1 -1
  231. package/dist/dev/core/signals/primitives.d.ts +10 -12
  232. package/dist/dev/core/signals/primitives.d.ts.map +1 -1
  233. package/dist/dev/core/signals/primitives.js +10 -14
  234. package/dist/dev/core/signals/primitives.js.map +1 -1
  235. package/dist/dev/core/signals/when.js +6 -8
  236. package/dist/dev/core/signals/when.js.map +1 -1
  237. package/dist/dev/core/tasks/delayed-reschedule.js +7 -11
  238. package/dist/dev/core/tasks/delayed-reschedule.js.map +1 -1
  239. package/dist/dev/core/tasks/task.d.ts +51 -73
  240. package/dist/dev/core/tasks/task.d.ts.map +1 -1
  241. package/dist/dev/core/tasks/task.js +59 -82
  242. package/dist/dev/core/tasks/task.js.map +1 -1
  243. package/dist/dev/hls.d.ts +3 -1
  244. package/dist/dev/hls.js +3 -1
  245. package/dist/dev/index.d.ts +2 -3
  246. package/dist/dev/index.d.ts.map +1 -1
  247. package/dist/dev/index.js +2 -3
  248. package/dist/dev/index.js.map +1 -1
  249. package/dist/dev/media/abr/quality-selection.d.ts +7 -10
  250. package/dist/dev/media/abr/quality-selection.d.ts.map +1 -1
  251. package/dist/dev/media/abr/quality-selection.js +3 -7
  252. package/dist/dev/media/abr/quality-selection.js.map +1 -1
  253. package/dist/dev/media/buffer/back-buffer.d.ts +2 -7
  254. package/dist/dev/media/buffer/back-buffer.d.ts.map +1 -1
  255. package/dist/dev/media/buffer/back-buffer.js +15 -19
  256. package/dist/dev/media/buffer/back-buffer.js.map +1 -1
  257. package/dist/dev/media/buffer/forward-buffer.d.ts +2 -7
  258. package/dist/dev/media/buffer/forward-buffer.d.ts.map +1 -1
  259. package/dist/dev/media/buffer/forward-buffer.js +32 -41
  260. package/dist/dev/media/buffer/forward-buffer.js.map +1 -1
  261. package/dist/dev/media/dom/capabilities.js +26 -37
  262. package/dist/dev/media/dom/capabilities.js.map +1 -1
  263. package/dist/dev/media/dom/mse/append-segment.d.ts +3 -5
  264. package/dist/dev/media/dom/mse/append-segment.d.ts.map +1 -1
  265. package/dist/dev/media/dom/mse/append-segment.js +3 -5
  266. package/dist/dev/media/dom/mse/append-segment.js.map +1 -1
  267. package/dist/dev/media/dom/mse/buffer-flusher.d.ts +5 -5
  268. package/dist/dev/media/dom/mse/buffer-flusher.js +5 -5
  269. package/dist/dev/media/dom/mse/buffer-flusher.js.map +1 -1
  270. package/dist/dev/media/dom/mse/duration.js +23 -31
  271. package/dist/dev/media/dom/mse/duration.js.map +1 -1
  272. package/dist/dev/media/dom/mse/end-of-stream.js +3 -6
  273. package/dist/dev/media/dom/mse/end-of-stream.js.map +1 -1
  274. package/dist/dev/media/dom/mse/mediasource-setup.js +65 -81
  275. package/dist/dev/media/dom/mse/mediasource-setup.js.map +1 -1
  276. package/dist/dev/media/dom/screen.d.ts.map +1 -1
  277. package/dist/dev/media/dom/screen.js +37 -54
  278. package/dist/dev/media/dom/screen.js.map +1 -1
  279. package/dist/dev/media/dom/text/resolve-vtt-segment.d.ts.map +1 -1
  280. package/dist/dev/media/dom/text/resolve-vtt-segment.js.map +1 -1
  281. package/dist/dev/media/dom/text/text-track-slots.d.ts +10 -16
  282. package/dist/dev/media/dom/text/text-track-slots.d.ts.map +1 -1
  283. package/dist/dev/media/dom/text/text-track-slots.js +15 -23
  284. package/dist/dev/media/dom/text/text-track-slots.js.map +1 -1
  285. package/dist/dev/media/errors.d.ts +32 -46
  286. package/dist/dev/media/errors.d.ts.map +1 -1
  287. package/dist/dev/media/errors.js +25 -34
  288. package/dist/dev/media/errors.js.map +1 -1
  289. package/dist/dev/media/hls/parse-attributes.js +9 -26
  290. package/dist/dev/media/hls/parse-attributes.js.map +1 -1
  291. package/dist/dev/media/hls/parse-media-playlist.js +25 -33
  292. package/dist/dev/media/hls/parse-media-playlist.js.map +1 -1
  293. package/dist/dev/media/hls/parse-multivariant.js +3 -3
  294. package/dist/dev/media/hls/parse-multivariant.js.map +1 -1
  295. package/dist/dev/media/hls/reload-policy.js +19 -27
  296. package/dist/dev/media/hls/reload-policy.js.map +1 -1
  297. package/dist/dev/media/hls/resolve-url.js +1 -3
  298. package/dist/dev/media/hls/resolve-url.js.map +1 -1
  299. package/dist/dev/media/live-window.js +9 -13
  300. package/dist/dev/media/live-window.js.map +1 -1
  301. package/dist/dev/media/media-tracks/media-tracks.d.ts +8 -13
  302. package/dist/dev/media/media-tracks/media-tracks.d.ts.map +1 -1
  303. package/dist/dev/media/media-tracks/media-tracks.js +12 -17
  304. package/dist/dev/media/media-tracks/media-tracks.js.map +1 -1
  305. package/dist/dev/media/mp4/box.js +4 -5
  306. package/dist/dev/media/mp4/box.js.map +1 -1
  307. package/dist/dev/media/mp4/timestamp-origin.js +30 -42
  308. package/dist/dev/media/mp4/timestamp-origin.js.map +1 -1
  309. package/dist/dev/media/primitives/resolution.d.ts +6 -8
  310. package/dist/dev/media/primitives/resolution.d.ts.map +1 -1
  311. package/dist/dev/media/primitives/resolution.js +5 -8
  312. package/dist/dev/media/primitives/resolution.js.map +1 -1
  313. package/dist/dev/media/primitives/select-tracks.js +24 -34
  314. package/dist/dev/media/primitives/select-tracks.js.map +1 -1
  315. package/dist/dev/media/text/parse-vtt-timestamp-map.js +6 -8
  316. package/dist/dev/media/text/parse-vtt-timestamp-map.js.map +1 -1
  317. package/dist/dev/media/text/resolve-vtt-metadata.js +8 -9
  318. package/dist/dev/media/text/resolve-vtt-metadata.js.map +1 -1
  319. package/dist/dev/media/types/index.d.ts +106 -177
  320. package/dist/dev/media/types/index.d.ts.map +1 -1
  321. package/dist/dev/media/types/index.js +10 -18
  322. package/dist/dev/media/types/index.js.map +1 -1
  323. package/dist/dev/media/utils/cdn.d.ts +4 -6
  324. package/dist/dev/media/utils/cdn.d.ts.map +1 -1
  325. package/dist/dev/media/utils/cdn.js +10 -16
  326. package/dist/dev/media/utils/cdn.js.map +1 -1
  327. package/dist/dev/media/utils/preload.js +4 -6
  328. package/dist/dev/media/utils/preload.js.map +1 -1
  329. package/dist/dev/media/utils/track-selection.js +10 -14
  330. package/dist/dev/media/utils/track-selection.js.map +1 -1
  331. package/dist/dev/media/utils/tracks.js +56 -54
  332. package/dist/dev/media/utils/tracks.js.map +1 -1
  333. package/dist/dev/network/bandwidth-estimator.d.ts +7 -9
  334. package/dist/dev/network/bandwidth-estimator.d.ts.map +1 -1
  335. package/dist/dev/network/bandwidth-estimator.js +18 -19
  336. package/dist/dev/network/bandwidth-estimator.js.map +1 -1
  337. package/dist/dev/network/chunked-stream-iterable.js +4 -6
  338. package/dist/dev/network/chunked-stream-iterable.js.map +1 -1
  339. package/dist/dev/network/ewma.js +22 -25
  340. package/dist/dev/network/ewma.js.map +1 -1
  341. package/dist/dev/network/fetch.js +30 -37
  342. package/dist/dev/network/fetch.js.map +1 -1
  343. package/dist/dev/playback/actors/dom/segment-loader.d.ts +7 -11
  344. package/dist/dev/playback/actors/dom/segment-loader.d.ts.map +1 -1
  345. package/dist/dev/playback/actors/dom/segment-loader.js +28 -44
  346. package/dist/dev/playback/actors/dom/segment-loader.js.map +1 -1
  347. package/dist/dev/playback/actors/dom/source-buffer.d.ts +5 -7
  348. package/dist/dev/playback/actors/dom/source-buffer.d.ts.map +1 -1
  349. package/dist/dev/playback/actors/dom/source-buffer.js.map +1 -1
  350. package/dist/dev/playback/actors/dom/text-tracks.js.map +1 -1
  351. package/dist/dev/playback/actors/text-track-segment-loader.d.ts +10 -16
  352. package/dist/dev/playback/actors/text-track-segment-loader.d.ts.map +1 -1
  353. package/dist/dev/playback/actors/text-track-segment-loader.js +24 -35
  354. package/dist/dev/playback/actors/text-track-segment-loader.js.map +1 -1
  355. package/dist/dev/playback/actors/text-tracks.d.ts +5 -8
  356. package/dist/dev/playback/actors/text-tracks.d.ts.map +1 -1
  357. package/dist/dev/playback/adapters/hls-audio/adapter.d.ts +11 -14
  358. package/dist/dev/playback/adapters/hls-audio/adapter.d.ts.map +1 -1
  359. package/dist/dev/playback/adapters/hls-audio/adapter.js +23 -31
  360. package/dist/dev/playback/adapters/hls-audio/adapter.js.map +1 -1
  361. package/dist/dev/playback/adapters/hls-audio/media.d.ts.map +1 -1
  362. package/dist/dev/playback/adapters/hls-audio/media.js.map +1 -1
  363. package/dist/dev/playback/adapters/hls-background-video/adapter.d.ts +28 -39
  364. package/dist/dev/playback/adapters/hls-background-video/adapter.d.ts.map +1 -1
  365. package/dist/dev/playback/adapters/hls-background-video/adapter.js +50 -70
  366. package/dist/dev/playback/adapters/hls-background-video/adapter.js.map +1 -1
  367. package/dist/dev/playback/adapters/hls-background-video/host.d.ts +12 -16
  368. package/dist/dev/playback/adapters/hls-background-video/host.d.ts.map +1 -1
  369. package/dist/dev/playback/adapters/hls-background-video/host.js +12 -16
  370. package/dist/dev/playback/adapters/hls-background-video/host.js.map +1 -1
  371. package/dist/dev/playback/adapters/hls-background-video/media.d.ts +5 -8
  372. package/dist/dev/playback/adapters/hls-background-video/media.d.ts.map +1 -1
  373. package/dist/dev/playback/adapters/hls-background-video/media.js +5 -8
  374. package/dist/dev/playback/adapters/hls-background-video/media.js.map +1 -1
  375. package/dist/dev/playback/adapters/hls-video/adapter.d.ts +12 -14
  376. package/dist/dev/playback/adapters/hls-video/adapter.d.ts.map +1 -1
  377. package/dist/dev/playback/adapters/hls-video/adapter.js +43 -60
  378. package/dist/dev/playback/adapters/hls-video/adapter.js.map +1 -1
  379. package/dist/dev/playback/adapters/hls-video/error-surface.d.ts +4 -5
  380. package/dist/dev/playback/adapters/hls-video/error-surface.d.ts.map +1 -1
  381. package/dist/dev/playback/adapters/hls-video/error-surface.js +13 -18
  382. package/dist/dev/playback/adapters/hls-video/error-surface.js.map +1 -1
  383. package/dist/dev/playback/adapters/hls-video/media-tracks.d.ts +4 -5
  384. package/dist/dev/playback/adapters/hls-video/media-tracks.d.ts.map +1 -1
  385. package/dist/dev/playback/adapters/hls-video/media-tracks.js +4 -5
  386. package/dist/dev/playback/adapters/hls-video/media-tracks.js.map +1 -1
  387. package/dist/dev/playback/adapters/hls-video/media.d.ts.map +1 -1
  388. package/dist/dev/playback/adapters/hls-video/media.js.map +1 -1
  389. package/dist/dev/playback/adapters/mux-audio/media.d.ts +8 -12
  390. package/dist/dev/playback/adapters/mux-audio/media.d.ts.map +1 -1
  391. package/dist/dev/playback/adapters/mux-audio/media.js +8 -12
  392. package/dist/dev/playback/adapters/mux-audio/media.js.map +1 -1
  393. package/dist/dev/playback/adapters/mux-video/adapter.d.ts +9 -11
  394. package/dist/dev/playback/adapters/mux-video/adapter.d.ts.map +1 -1
  395. package/dist/dev/playback/adapters/mux-video/adapter.js +25 -33
  396. package/dist/dev/playback/adapters/mux-video/adapter.js.map +1 -1
  397. package/dist/dev/playback/adapters/mux-video/media.d.ts +7 -9
  398. package/dist/dev/playback/adapters/mux-video/media.d.ts.map +1 -1
  399. package/dist/dev/playback/adapters/mux-video/media.js +7 -9
  400. package/dist/dev/playback/adapters/mux-video/media.js.map +1 -1
  401. package/dist/dev/playback/behaviors/calculate-presentation-duration.d.ts +5 -8
  402. package/dist/dev/playback/behaviors/calculate-presentation-duration.d.ts.map +1 -1
  403. package/dist/dev/playback/behaviors/calculate-presentation-duration.js +5 -8
  404. package/dist/dev/playback/behaviors/calculate-presentation-duration.js.map +1 -1
  405. package/dist/dev/playback/behaviors/collect-errors.d.ts +2 -0
  406. package/dist/dev/playback/behaviors/collect-errors.js +39 -52
  407. package/dist/dev/playback/behaviors/collect-errors.js.map +1 -1
  408. package/dist/dev/playback/behaviors/derive-cdn-priority.js +16 -23
  409. package/dist/dev/playback/behaviors/derive-cdn-priority.js.map +1 -1
  410. package/dist/dev/playback/behaviors/dom/airplay.js +38 -61
  411. package/dist/dev/playback/behaviors/dom/airplay.js.map +1 -1
  412. package/dist/dev/playback/behaviors/dom/apply-start-position.js +23 -35
  413. package/dist/dev/playback/behaviors/dom/apply-start-position.js.map +1 -1
  414. package/dist/dev/playback/behaviors/dom/end-of-stream.js +11 -16
  415. package/dist/dev/playback/behaviors/dom/end-of-stream.js.map +1 -1
  416. package/dist/dev/playback/behaviors/dom/load-segments.d.ts +5 -8
  417. package/dist/dev/playback/behaviors/dom/load-segments.d.ts.map +1 -1
  418. package/dist/dev/playback/behaviors/dom/load-segments.js +27 -39
  419. package/dist/dev/playback/behaviors/dom/load-segments.js.map +1 -1
  420. package/dist/dev/playback/behaviors/dom/recover-end-stall.js +21 -26
  421. package/dist/dev/playback/behaviors/dom/recover-end-stall.js.map +1 -1
  422. package/dist/dev/playback/behaviors/dom/seek-to-live-edge.js +41 -60
  423. package/dist/dev/playback/behaviors/dom/seek-to-live-edge.js.map +1 -1
  424. package/dist/dev/playback/behaviors/dom/setup-buffer-actors.js +50 -74
  425. package/dist/dev/playback/behaviors/dom/setup-buffer-actors.js.map +1 -1
  426. package/dist/dev/playback/behaviors/dom/setup-mediasource.js +29 -43
  427. package/dist/dev/playback/behaviors/dom/setup-mediasource.js.map +1 -1
  428. package/dist/dev/playback/behaviors/dom/setup-text-track-actors.d.ts +3 -3
  429. package/dist/dev/playback/behaviors/dom/setup-text-track-actors.d.ts.map +1 -1
  430. package/dist/dev/playback/behaviors/dom/setup-text-track-actors.js.map +1 -1
  431. package/dist/dev/playback/behaviors/dom/sync-live-seekable-range.js +3 -4
  432. package/dist/dev/playback/behaviors/dom/sync-live-seekable-range.js.map +1 -1
  433. package/dist/dev/playback/behaviors/dom/sync-text-tracks.js +30 -45
  434. package/dist/dev/playback/behaviors/dom/sync-text-tracks.js.map +1 -1
  435. package/dist/dev/playback/behaviors/dom/track-current-time.d.ts +2 -2
  436. package/dist/dev/playback/behaviors/dom/track-current-time.d.ts.map +1 -1
  437. package/dist/dev/playback/behaviors/dom/track-current-time.js +9 -11
  438. package/dist/dev/playback/behaviors/dom/track-current-time.js.map +1 -1
  439. package/dist/dev/playback/behaviors/dom/track-load-triggers.d.ts +6 -12
  440. package/dist/dev/playback/behaviors/dom/track-load-triggers.d.ts.map +1 -1
  441. package/dist/dev/playback/behaviors/dom/track-load-triggers.js +24 -32
  442. package/dist/dev/playback/behaviors/dom/track-load-triggers.js.map +1 -1
  443. package/dist/dev/playback/behaviors/dom/track-playback-rate.d.ts +2 -2
  444. package/dist/dev/playback/behaviors/dom/track-playback-rate.d.ts.map +1 -1
  445. package/dist/dev/playback/behaviors/dom/track-playback-rate.js +6 -8
  446. package/dist/dev/playback/behaviors/dom/track-playback-rate.js.map +1 -1
  447. package/dist/dev/playback/behaviors/dom/track-player-resolution.d.ts.map +1 -1
  448. package/dist/dev/playback/behaviors/dom/track-player-resolution.js +10 -14
  449. package/dist/dev/playback/behaviors/dom/track-player-resolution.js.map +1 -1
  450. package/dist/dev/playback/behaviors/dom/track-screen-resolution.js +8 -9
  451. package/dist/dev/playback/behaviors/dom/track-screen-resolution.js.map +1 -1
  452. package/dist/dev/playback/behaviors/dom/update-mediasource-duration.js +28 -43
  453. package/dist/dev/playback/behaviors/dom/update-mediasource-duration.js.map +1 -1
  454. package/dist/dev/playback/behaviors/establish-start-media-time.d.ts +15 -19
  455. package/dist/dev/playback/behaviors/establish-start-media-time.d.ts.map +1 -1
  456. package/dist/dev/playback/behaviors/establish-start-media-time.js +32 -42
  457. package/dist/dev/playback/behaviors/establish-start-media-time.js.map +1 -1
  458. package/dist/dev/playback/behaviors/resolve-presentation.d.ts.map +1 -1
  459. package/dist/dev/playback/behaviors/resolve-presentation.js +13 -22
  460. package/dist/dev/playback/behaviors/resolve-presentation.js.map +1 -1
  461. package/dist/dev/playback/behaviors/resolve-track.js +5 -12
  462. package/dist/dev/playback/behaviors/resolve-track.js.map +1 -1
  463. package/dist/dev/playback/behaviors/select-tracks.d.ts +28 -39
  464. package/dist/dev/playback/behaviors/select-tracks.d.ts.map +1 -1
  465. package/dist/dev/playback/behaviors/select-tracks.js +77 -104
  466. package/dist/dev/playback/behaviors/select-tracks.js.map +1 -1
  467. package/dist/dev/playback/behaviors/setup-failover-monitor.d.ts +1 -4
  468. package/dist/dev/playback/behaviors/setup-failover-monitor.d.ts.map +1 -1
  469. package/dist/dev/playback/behaviors/setup-failover-monitor.js +11 -16
  470. package/dist/dev/playback/behaviors/setup-failover-monitor.js.map +1 -1
  471. package/dist/dev/playback/behaviors/sync-preload.js +9 -13
  472. package/dist/dev/playback/behaviors/sync-preload.js.map +1 -1
  473. package/dist/dev/playback/behaviors/track-switching.d.ts +110 -0
  474. package/dist/dev/playback/behaviors/track-switching.d.ts.map +1 -0
  475. package/dist/dev/playback/behaviors/track-switching.js +189 -173
  476. package/dist/dev/playback/behaviors/track-switching.js.map +1 -1
  477. package/dist/dev/playback/engines/hls/engine-audio-only.d.ts +59 -72
  478. package/dist/dev/playback/engines/hls/engine-audio-only.d.ts.map +1 -1
  479. package/dist/dev/playback/engines/hls/engine-audio-only.js +20 -24
  480. package/dist/dev/playback/engines/hls/engine-audio-only.js.map +1 -1
  481. package/dist/dev/playback/engines/hls/engine-background-video.d.ts +51 -78
  482. package/dist/dev/playback/engines/hls/engine-background-video.d.ts.map +1 -1
  483. package/dist/dev/playback/engines/hls/engine-background-video.js +22 -27
  484. package/dist/dev/playback/engines/hls/engine-background-video.js.map +1 -1
  485. package/dist/dev/playback/engines/hls/engine.d.ts +115 -155
  486. package/dist/dev/playback/engines/hls/engine.d.ts.map +1 -1
  487. package/dist/dev/playback/engines/hls/engine.js +22 -25
  488. package/dist/dev/playback/engines/hls/engine.js.map +1 -1
  489. package/dist/dev/playback/primitives/derive-start-media-time.d.ts +3 -3
  490. package/dist/dev/playback/primitives/derive-start-media-time.d.ts.map +1 -1
  491. package/dist/dev/playback/primitives/error-messages.js +16 -25
  492. package/dist/dev/playback/primitives/error-messages.js.map +1 -1
  493. package/dist/dev/playback/primitives/failover-fetch.js +9 -14
  494. package/dist/dev/playback/primitives/failover-fetch.js.map +1 -1
  495. package/dist/dev/playback/primitives/head-peek.js +7 -10
  496. package/dist/dev/playback/primitives/head-peek.js.map +1 -1
  497. package/dist/dev/playback/primitives/live-window.js +12 -15
  498. package/dist/dev/playback/primitives/live-window.js.map +1 -1
  499. package/dist/dev/playback/primitives/relocation-pipelines.js +34 -46
  500. package/dist/dev/playback/primitives/relocation-pipelines.js.map +1 -1
  501. package/dist/dev/playback/primitives/report-track-conditions.d.ts +1 -4
  502. package/dist/dev/playback/primitives/report-track-conditions.d.ts.map +1 -1
  503. package/dist/dev/playback/primitives/report-track-conditions.js +26 -38
  504. package/dist/dev/playback/primitives/report-track-conditions.js.map +1 -1
  505. package/dist/dev/playback/primitives/segment-load-pipeline.js +15 -15
  506. package/dist/dev/playback/primitives/segment-load-pipeline.js.map +1 -1
  507. package/dist/dev/playback/primitives/selection-rules.d.ts +45 -17
  508. package/dist/dev/playback/primitives/selection-rules.d.ts.map +1 -1
  509. package/dist/dev/playback/primitives/selection-rules.js +65 -36
  510. package/dist/dev/playback/primitives/selection-rules.js.map +1 -1
  511. package/dist/dev/playback/primitives/source-buffer-messages.d.ts +6 -9
  512. package/dist/dev/playback/primitives/source-buffer-messages.d.ts.map +1 -1
  513. package/dist/dev/playback/primitives/text-segment-load-pipeline.d.ts +20 -29
  514. package/dist/dev/playback/primitives/text-segment-load-pipeline.d.ts.map +1 -1
  515. package/dist/dev/playback/primitives/text-segment-load-pipeline.js +4 -5
  516. package/dist/dev/playback/primitives/text-segment-load-pipeline.js.map +1 -1
  517. package/dist/dev/playback/primitives/text-track-messages.d.ts.map +1 -1
  518. package/dist/dev/playback/primitives/track-types.js +10 -18
  519. package/dist/dev/playback/primitives/track-types.js.map +1 -1
  520. package/package.json +25 -28
@@ -1 +1 @@
1
- {"version":3,"file":"select-tracks.js","names":[],"sources":["../../../../src/media/primitives/select-tracks.ts"],"sourcesContent":["import type { MaybeResolvedPresentation, PartiallyResolvedTextTrack, TextTrack } from '../types';\n\n/**\n * State shape for track selection.\n */\nexport interface TrackSelectionState {\n presentation?: MaybeResolvedPresentation;\n selectedVideoTrackId?: string;\n selectedAudioTrackId?: string;\n selectedTextTrackId?: string;\n}\n\n/**\n * Configuration for audio track selection.\n */\nexport interface AudioSelectionConfig {\n /**\n * Preferred audio language (ISO 639 code, e.g., \"en\", \"es\").\n * If not specified, selects first audio track.\n */\n preferredAudioLanguage?: string;\n}\n\n/**\n * Configuration for text track selection.\n */\nexport interface TextSelectionConfig {\n /**\n * Preferred subtitle language (ISO 639 code, e.g., \"en\", \"es\").\n * If specified, selects matching track if available.\n */\n preferredSubtitleLanguage?: string;\n\n /**\n * Include FORCED subtitle tracks in selection.\n * Default: false (follows hls.js/http-streaming pattern)\n *\n * Note: Per Apple's HLS spec, if content has forced and regular subtitles\n * in the same language, the regular track MUST contain both forced and\n * regular content. Therefore, forced-only tracks are redundant and excluded\n * by default.\n */\n includeForcedTracks?: boolean;\n\n /**\n * Auto-select DEFAULT track (requires DEFAULT=YES + AUTOSELECT=YES in HLS).\n * Default: false (user opt-in, matches hls.js/http-streaming)\n *\n * When enabled, tracks marked with both DEFAULT=YES and AUTOSELECT=YES\n * will be automatically selected if no user preference matches.\n */\n enableDefaultTrack?: boolean;\n}\n\n// =============================================================================\n// Helper Functions (Pure Selection Logic)\n//\n// Candidate-list policies and track geometry, for the selection rules in\n// `playback/behaviors/select-tracks.ts` and `playback/behaviors/track-switching.ts`\n// to compose. Nothing here consults a whole presentation or returns a single id:\n// narrowing a list and ordering a list are the two shapes a rule can take, and the\n// rule chain takes the head of what they leave.\n// =============================================================================\n\n/**\n * Test whether a track matches a partial-track description: every present,\n * defined field of `filter` equals the track's. Absent or `undefined` filter\n * fields don't constrain. Used to narrow candidates by a user selection\n * (`{ id }`, `{ language }`, `{ height }`, …).\n *\n * @param track - The track to test\n * @param filter - Partial-track description; only present, defined fields constrain\n * @returns `true` when the track matches every constraining field\n */\nexport function matchesPartialTrack<T>(track: T, filter: Partial<T>): boolean {\n for (const key in filter) {\n const filterValue = filter[key as keyof T];\n if (filterValue !== undefined && track[key as keyof T] !== filterValue) return false;\n }\n return true;\n}\n\ntype RankableTrack = { id: string; width?: number; height?: number; bandwidth?: number };\n\n/** Missing dimensions are treated as area `0`, so a track without them ranks last. */\nfunction pixelArea(track: RankableTrack): number {\n return (track.width ?? 0) * (track.height ?? 0);\n}\n\n/**\n * Narrow to the tracks at or below `maxPixelArea`, and nothing else: no ordering,\n * no fallback. Survivors keep their incoming order, and an empty result is a real\n * answer — \"none of these fit\".\n *\n * Deliberately only the filter, because as a selection rule this composes under\n * `applyRules`, which already owns both halves a caller might expect here: an empty\n * result is skipped, so a preference can never narrow the candidate set to nothing;\n * and ordering the survivors is a separate rule's job\n * ({@link byDescendingResolution}, bandwidth ABR). Doing either here would duplicate\n * the composer and give one rule two responsibilities.\n */\nexport function tracksUnderPixelArea<T extends RankableTrack>(\n tracks: readonly T[],\n maxPixelArea: number = Number.POSITIVE_INFINITY\n): readonly T[] {\n return tracks.filter((track) => pixelArea(track) <= maxPixelArea);\n}\n\n/**\n * The smallest track area that still covers `minPixelArea`, or `undefined` when\n * no track reaches it.\n *\n * The cap a surface-size rule wants when it should round *up* to the ladder: a\n * surface between two tiers is covered by the upper one, and capping at the\n * surface's own area instead would serve a picture smaller than the surface and\n * upscale it.\n *\n * Tracks declaring no dimensions compare as area `0` and so never cover anything,\n * which keeps them out of the cap rather than pinning it to zero.\n */\nexport function smallestCoveringPixelArea(tracks: readonly RankableTrack[], minPixelArea: number): number | undefined {\n const covering = tracks.map(pixelArea).filter((area) => area >= minPixelArea);\n\n return covering.length ? Math.min(...covering) : undefined;\n}\n\n/**\n * Compare two tracks by resolution, largest first, with bandwidth as the tiebreak\n * for renditions of identical dimensions. Missing dimensions are treated as area\n * `0`, so a track without them sorts last.\n *\n * A comparator rather than a \"highest track\" function: the selection-rule chain\n * takes the head of the list it produces, so ranking never has to collapse to a\n * single track. `preferHighestResolution` is `sort` over this and nothing more.\n */\nexport function byDescendingResolution(a: RankableTrack, b: RankableTrack): number {\n return pixelArea(b) - pixelArea(a) || (b.bandwidth ?? 0) - (a.bandwidth ?? 0);\n}\n\n/**\n * Default audio policy over a candidate list: the three-tier pick a selection-rule\n * chain applies once it has narrowed the candidates.\n *\n * Priority: `preferredAudioLanguage` match → `DEFAULT=YES` → first track.\n */\nexport function pickAudioTrackFromTracks(\n tracks: readonly { id: string; language?: string | undefined; default?: boolean | undefined }[],\n config?: AudioSelectionConfig\n): string | undefined {\n // Try preferred language first\n if (config?.preferredAudioLanguage) {\n const languageMatch = tracks.find((track) => track.language === config.preferredAudioLanguage);\n if (languageMatch) {\n return languageMatch.id;\n }\n }\n\n // Try default track\n const defaultTrack = tracks.find((track) => track.default === true);\n if (defaultTrack) {\n return defaultTrack.id;\n }\n\n // Fall back to first track\n return tracks[0]?.id;\n}\n\n/**\n * Default text-track policy over a candidate list: the opt-in three-tier pick\n * `switchTextTrack`'s terminal applies once it has narrowed the renditions to the\n * constrained, CDN-scoped set.\n *\n * Priority: `preferredSubtitleLanguage` match → `DEFAULT=YES + AUTOSELECT=YES`\n * (only when `enableDefaultTrack`) `undefined` (opt-in). FORCED tracks are\n * excluded unless `includeForcedTracks` (Apple-spec: a regular track must carry\n * forced content when both exist, so a forced-only track is redundant).\n */\nexport function pickTextTrackFromTracks(\n tracks: readonly (PartiallyResolvedTextTrack | TextTrack)[],\n config?: TextSelectionConfig\n): string | undefined {\n const availableTracks = config?.includeForcedTracks ? tracks : tracks.filter((track) => !track.forced);\n if (availableTracks.length === 0) return undefined;\n\n const { preferredSubtitleLanguage, enableDefaultTrack = false } = config ?? {};\n\n if (preferredSubtitleLanguage) {\n const languageMatch = availableTracks.find((track) => track.language === preferredSubtitleLanguage);\n if (languageMatch) return languageMatch.id;\n }\n\n if (enableDefaultTrack) {\n const defaultTrack = availableTracks.find((track) => track.default === true);\n if (defaultTrack) return defaultTrack.id;\n }\n\n return undefined;\n}\n"],"mappings":";;;;;;;;;;;AA0EA,SAAgB,oBAAuB,OAAU,QAA6B;CAC5E,KAAK,MAAM,OAAO,QAAQ;EACxB,MAAM,cAAc,OAAO;EAC3B,IAAI,gBAAgB,KAAA,KAAa,MAAM,SAAoB,aAAa,OAAO;CACjF;CACA,OAAO;AACT;;AAKA,SAAS,UAAU,OAA8B;CAC/C,QAAQ,MAAM,SAAS,MAAM,MAAM,UAAU;AAC/C;;;;;;;;;;;;;AAcA,SAAgB,qBACd,QACA,eAAuB,OAAO,mBAChB;CACd,OAAO,OAAO,QAAQ,UAAU,UAAU,KAAK,KAAK,YAAY;AAClE;;;;;;;;;;;;;AAcA,SAAgB,0BAA0B,QAAkC,cAA0C;CACpH,MAAM,WAAW,OAAO,IAAI,SAAS,CAAC,CAAC,QAAQ,SAAS,QAAQ,YAAY;CAE5E,OAAO,SAAS,SAAS,KAAK,IAAI,GAAG,QAAQ,IAAI,KAAA;AACnD;;;;;;;;;;AAWA,SAAgB,uBAAuB,GAAkB,GAA0B;CACjF,OAAO,UAAU,CAAC,IAAI,UAAU,CAAC,MAAM,EAAE,aAAa,MAAM,EAAE,aAAa;AAC7E;;;;;;;AAQA,SAAgB,yBACd,QACA,QACoB;CAEpB,IAAI,QAAQ,wBAAwB;EAClC,MAAM,gBAAgB,OAAO,MAAM,UAAU,MAAM,aAAa,OAAO,sBAAsB;EAC7F,IAAI,eACF,OAAO,cAAc;CAEzB;CAGA,MAAM,eAAe,OAAO,MAAM,UAAU,MAAM,YAAY,IAAI;CAClE,IAAI,cACF,OAAO,aAAa;CAItB,OAAO,OAAO,EAAE,EAAE;AACpB;;;;;;;;;;;AAYA,SAAgB,wBACd,QACA,QACoB;CACpB,MAAM,kBAAkB,QAAQ,sBAAsB,SAAS,OAAO,QAAQ,UAAU,CAAC,MAAM,MAAM;CACrG,IAAI,gBAAgB,WAAW,GAAG,OAAO,KAAA;CAEzC,MAAM,EAAE,2BAA2B,qBAAqB,UAAU,UAAU,CAAC;CAE7E,IAAI,2BAA2B;EAC7B,MAAM,gBAAgB,gBAAgB,MAAM,UAAU,MAAM,aAAa,yBAAyB;EAClG,IAAI,eAAe,OAAO,cAAc;CAC1C;CAEA,IAAI,oBAAoB;EACtB,MAAM,eAAe,gBAAgB,MAAM,UAAU,MAAM,YAAY,IAAI;EAC3E,IAAI,cAAc,OAAO,aAAa;CACxC;AAGF"}
1
+ {"version":3,"file":"select-tracks.js","names":[],"sources":["../../../../src/media/primitives/select-tracks.ts"],"sourcesContent":["import type { MaybeResolvedPresentation, PartiallyResolvedTextTrack, TextTrack } from '../types';\n\n/** State shape for track selection. */\nexport interface TrackSelectionState {\n presentation?: MaybeResolvedPresentation;\n selectedVideoTrackId?: string;\n selectedAudioTrackId?: string;\n selectedTextTrackId?: string;\n}\n\n/** Configuration for audio track selection. */\nexport interface AudioSelectionConfig {\n /** Preferred audio language (ISO 639 code, e.g., \"en\", \"es\"). If not specified, selects first audio track. */\n preferredAudioLanguage?: string;\n}\n\n/** Configuration for text track selection. */\nexport interface TextSelectionConfig {\n /** Preferred subtitle language (ISO 639 code, e.g., \"en\", \"es\"). If specified, selects matching track if available. */\n preferredSubtitleLanguage?: string;\n\n /**\n * Include FORCED subtitle tracks in selection. Default: false (follows hls.js/http-streaming pattern)\n *\n * Note: Per Apple's HLS spec, if content has forced and regular subtitles in the same language, the regular track\n * MUST contain both forced and regular content. Therefore, forced-only tracks are redundant and excluded by default.\n */\n includeForcedTracks?: boolean;\n\n /**\n * Auto-select DEFAULT track (requires DEFAULT=YES + AUTOSELECT=YES in HLS). Default: false (user opt-in, matches\n * hls.js/http-streaming)\n *\n * When enabled, tracks marked with both DEFAULT=YES and AUTOSELECT=YES will be automatically selected if no user\n * preference matches.\n */\n enableDefaultTrack?: boolean;\n}\n\n// =============================================================================\n// Helper Functions (Pure Selection Logic)\n//\n// Candidate-list policies and track geometry, for the selection rules in\n// `playback/behaviors/select-tracks.ts` and `playback/behaviors/track-switching.ts`\n// to compose. Nothing here consults a whole presentation or returns a single id:\n// narrowing a list and ordering a list are the two shapes a rule can take, and the\n// rule chain takes the head of what they leave.\n// =============================================================================\n\n/**\n * Test whether a track matches a partial-track description: every present, defined field of `filter` equals the\n * track's. Absent or `undefined` filter fields don't constrain. Used to narrow candidates by a user selection (`{ id\n * }`, `{ language }`, `{ height }`, …).\n *\n * @param track - The track to test\n * @param filter - Partial-track description; only present, defined fields constrain\n * @returns `true` when the track matches every constraining field\n */\nexport function matchesPartialTrack<T>(track: T, filter: Partial<T>): boolean {\n for (const key in filter) {\n const filterValue = filter[key as keyof T];\n if (filterValue !== undefined && track[key as keyof T] !== filterValue) return false;\n }\n\n return true;\n}\n\ntype RankableTrack = { id: string; width?: number; height?: number; bandwidth?: number };\n\n/** Missing dimensions are treated as area `0`, so a track without them ranks last. */\nfunction pixelArea(track: RankableTrack): number {\n return (track.width ?? 0) * (track.height ?? 0);\n}\n\n/**\n * Narrow to the tracks at or below `maxPixelArea`, and nothing else: no ordering, no fallback. Survivors keep their\n * incoming order, and an empty result is a real answer — \"none of these fit\".\n *\n * Deliberately only the filter, because as a selection rule this composes under `applyRules`, which already owns both\n * halves a caller might expect here: an empty result is skipped, so a preference can never narrow the candidate set to\n * nothing; and ordering the survivors is a separate rule's job ({@link byDescendingResolution}, bandwidth ABR). Doing\n * either here would duplicate the composer and give one rule two responsibilities.\n */\nexport function tracksUnderPixelArea<T extends RankableTrack>(\n tracks: readonly T[],\n maxPixelArea: number = Number.POSITIVE_INFINITY\n): readonly T[] {\n return tracks.filter((track) => pixelArea(track) <= maxPixelArea);\n}\n\n/**\n * The smallest track area that still covers `minPixelArea`, or `undefined` when no track reaches it.\n *\n * The cap a surface-size rule wants when it should round _up_ to the ladder: a surface between two tiers is covered by\n * the upper one, and capping at the surface's own area instead would serve a picture smaller than the surface and\n * upscale it.\n *\n * Tracks declaring no dimensions compare as area `0` and so never cover anything, which keeps them out of the cap\n * rather than pinning it to zero.\n */\nexport function smallestCoveringPixelArea(tracks: readonly RankableTrack[], minPixelArea: number): number | undefined {\n const covering = tracks.map(pixelArea).filter((area) => area >= minPixelArea);\n\n return covering.length ? Math.min(...covering) : undefined;\n}\n\n/**\n * Compare two tracks by resolution, largest first, with bandwidth as the tiebreak for renditions of identical\n * dimensions. Missing dimensions are treated as area `0`, so a track without them sorts last.\n *\n * A comparator rather than a \"highest track\" function: the selection-rule chain takes the head of the list it produces,\n * so ranking never has to collapse to a single track. `preferHighestResolution` is `sort` over this and nothing more.\n */\nexport function byDescendingResolution(a: RankableTrack, b: RankableTrack): number {\n return pixelArea(b) - pixelArea(a) || (b.bandwidth ?? 0) - (a.bandwidth ?? 0);\n}\n\n/**\n * Default audio policy over a candidate list: the three-tier pick a selection-rule chain applies once it has narrowed\n * the candidates.\n *\n * Priority: `preferredAudioLanguage` match → `DEFAULT=YES` → first track.\n */\nexport function pickAudioTrackFromTracks(\n tracks: readonly { id: string; language?: string | undefined; default?: boolean | undefined }[],\n config?: AudioSelectionConfig\n): string | undefined {\n // Try preferred language first\n if (config?.preferredAudioLanguage) {\n const languageMatch = tracks.find((track) => track.language === config.preferredAudioLanguage);\n if (languageMatch) return languageMatch.id;\n }\n\n // Try default track\n const defaultTrack = tracks.find((track) => track.default === true);\n if (defaultTrack) return defaultTrack.id;\n\n // Fall back to first track\n return tracks[0]?.id;\n}\n\n/**\n * Default text-track policy over a candidate list: the opt-in three-tier pick `switchTextTrack`'s terminal applies once\n * it has narrowed the renditions to the constrained, CDN-scoped set.\n *\n * Priority: `preferredSubtitleLanguage` match → `DEFAULT=YES + AUTOSELECT=YES` (only when `enableDefaultTrack`) →\n * `undefined` (opt-in). FORCED tracks are excluded unless `includeForcedTracks` (Apple-spec: a regular track must carry\n * forced content when both exist, so a forced-only track is redundant).\n */\nexport function pickTextTrackFromTracks(\n tracks: readonly (PartiallyResolvedTextTrack | TextTrack)[],\n config?: TextSelectionConfig\n): string | undefined {\n const availableTracks = config?.includeForcedTracks ? tracks : tracks.filter((track) => !track.forced);\n if (availableTracks.length === 0) return undefined;\n\n const { preferredSubtitleLanguage, enableDefaultTrack = false } = config ?? {};\n\n if (preferredSubtitleLanguage) {\n const languageMatch = availableTracks.find((track) => track.language === preferredSubtitleLanguage);\n if (languageMatch) return languageMatch.id;\n }\n\n if (enableDefaultTrack) {\n const defaultTrack = availableTracks.find((track) => track.default === true);\n if (defaultTrack) return defaultTrack.id;\n }\n\n return undefined;\n}\n"],"mappings":";;;;;;;;;;AA0DA,SAAgB,oBAAuB,OAAU,QAA6B;CAC5E,KAAK,MAAM,OAAO,QAAQ;EACxB,MAAM,cAAc,OAAO;EAC3B,IAAI,gBAAgB,KAAA,KAAa,MAAM,SAAoB,aAAa,OAAO;CACjF;CAEA,OAAO;AACT;;AAKA,SAAS,UAAU,OAA8B;CAC/C,QAAQ,MAAM,SAAS,MAAM,MAAM,UAAU;AAC/C;;;;;;;;;;AAWA,SAAgB,qBACd,QACA,eAAuB,OAAO,mBAChB;CACd,OAAO,OAAO,QAAQ,UAAU,UAAU,KAAK,KAAK,YAAY;AAClE;;;;;;;;;;;AAYA,SAAgB,0BAA0B,QAAkC,cAA0C;CACpH,MAAM,WAAW,OAAO,IAAI,SAAS,CAAC,CAAC,QAAQ,SAAS,QAAQ,YAAY;CAE5E,OAAO,SAAS,SAAS,KAAK,IAAI,GAAG,QAAQ,IAAI,KAAA;AACnD;;;;;;;;AASA,SAAgB,uBAAuB,GAAkB,GAA0B;CACjF,OAAO,UAAU,CAAC,IAAI,UAAU,CAAC,MAAM,EAAE,aAAa,MAAM,EAAE,aAAa;AAC7E;;;;;;;AAQA,SAAgB,yBACd,QACA,QACoB;CAEpB,IAAI,QAAQ,wBAAwB;EAClC,MAAM,gBAAgB,OAAO,MAAM,UAAU,MAAM,aAAa,OAAO,sBAAsB;EAC7F,IAAI,eAAe,OAAO,cAAc;CAC1C;CAGA,MAAM,eAAe,OAAO,MAAM,UAAU,MAAM,YAAY,IAAI;CAClE,IAAI,cAAc,OAAO,aAAa;CAGtC,OAAO,OAAO,EAAE,EAAE;AACpB;;;;;;;;;AAUA,SAAgB,wBACd,QACA,QACoB;CACpB,MAAM,kBAAkB,QAAQ,sBAAsB,SAAS,OAAO,QAAQ,UAAU,CAAC,MAAM,MAAM;CACrG,IAAI,gBAAgB,WAAW,GAAG,OAAO,KAAA;CAEzC,MAAM,EAAE,2BAA2B,qBAAqB,UAAU,UAAU,CAAC;CAE7E,IAAI,2BAA2B;EAC7B,MAAM,gBAAgB,gBAAgB,MAAM,UAAU,MAAM,aAAa,yBAAyB;EAClG,IAAI,eAAe,OAAO,cAAc;CAC1C;CAEA,IAAI,oBAAoB;EACtB,MAAM,eAAe,gBAAgB,MAAM,UAAU,MAAM,YAAY,IAAI;EAC3E,IAAI,cAAc,OAAO,aAAa;CACxC;AAGF"}
@@ -1,15 +1,13 @@
1
1
  //#region src/media/text/parse-vtt-timestamp-map.ts
2
2
  const TIMESTAMP_MAP_PREFIX = "X-TIMESTAMP-MAP=";
3
3
  /**
4
- * Scrape a WebVTT segment's `X-TIMESTAMP-MAP` header into a {@link TimestampMap}
5
- * the only header line we need to correlate LOCAL cue times with the media
6
- * presentation timeline. Deliberately *not* a WebVTT parser: cue parsing stays
7
- * with the browser's native `<track>` parser (which drops this line); this reads
8
- * just the one header field the native path discards.
4
+ * Scrape a WebVTT segment's `X-TIMESTAMP-MAP` header into a {@link TimestampMap} — the only header line we need to
5
+ * correlate LOCAL cue times with the media presentation timeline. Deliberately _not_ a WebVTT parser: cue parsing stays
6
+ * with the browser's native `<track>` parser (which drops this line); this reads just the one header field the native
7
+ * path discards.
9
8
  *
10
- * Returns `undefined` when the segment carries no map (e.g. cues already in
11
- * absolute presentation time) per the HLS spec that means LOCAL 0 maps to
12
- * MPEGTS 0. Tolerant of attribute order and `[HH:]MM:SS.mmm` LOCAL forms.
9
+ * Returns `undefined` when the segment carries no map (e.g. cues already in absolute presentation time) — per the HLS
10
+ * spec that means LOCAL 0 maps to MPEGTS 0. Tolerant of attribute order and `[HH:]MM:SS.mmm` LOCAL forms.
13
11
  */
14
12
  function parseVttTimestampMap(text) {
15
13
  const timestampMapLine = text.split(/\r\n|\r|\n/).find((line) => line.startsWith(TIMESTAMP_MAP_PREFIX));
@@ -1 +1 @@
1
- {"version":3,"file":"parse-vtt-timestamp-map.js","names":[],"sources":["../../../../src/media/text/parse-vtt-timestamp-map.ts"],"sourcesContent":["/**\n * WebVTT-in-HLS `X-TIMESTAMP-MAP`: correlates a cue's LOCAL (in-file) time with\n * an MPEG-2 presentation timestamp, so LOCAL-authored cues can be placed on the\n * media presentation timeline. Stored raw — the LOCAL→native correction is\n * `mpegts / 90000 - local` — so it stays independent of how (or whether) the\n * presentation is later re-origined. See the HLS spec, RFC 8216bis §3.5.\n */\nexport interface TimestampMap {\n /** The MPEG-2 presentation timestamp, in 90 kHz ticks, as authored. */\n mpegts: number;\n /** The LOCAL cue time the `mpegts` value maps to, in seconds. */\n local: number;\n}\n\nconst TIMESTAMP_MAP_PREFIX = 'X-TIMESTAMP-MAP=';\n\n/**\n * Scrape a WebVTT segment's `X-TIMESTAMP-MAP` header into a {@link TimestampMap}\n * — the only header line we need to correlate LOCAL cue times with the media\n * presentation timeline. Deliberately *not* a WebVTT parser: cue parsing stays\n * with the browser's native `<track>` parser (which drops this line); this reads\n * just the one header field the native path discards.\n *\n * Returns `undefined` when the segment carries no map (e.g. cues already in\n * absolute presentation time) — per the HLS spec that means LOCAL 0 maps to\n * MPEGTS 0. Tolerant of attribute order and `[HH:]MM:SS.mmm` LOCAL forms.\n */\nexport function parseVttTimestampMap(text: string): TimestampMap | undefined {\n const timestampMapLine = text.split(/\\r\\n|\\r|\\n/).find((line) => line.startsWith(TIMESTAMP_MAP_PREFIX));\n return timestampMapLine ? parseTimestampMapBody(timestampMapLine.slice(TIMESTAMP_MAP_PREFIX.length)) : undefined;\n}\n\nconst TimeStampMapParserMap = {\n LOCAL: parseWebVttTimestamp,\n MPEGTS: (v: string) => +v,\n} as const;\n\ntype TimeStampMapParserMap = typeof TimeStampMapParserMap;\n\nfunction parseTimestampMapBody(body: string): TimestampMap | undefined {\n return Object.fromEntries(\n body.split(',').map((kvStr) => {\n const [k, v] = kvStr.split(/:(.*)/).map((kOrV) => kOrV.trim());\n return [k?.toLowerCase(), TimeStampMapParserMap[k as keyof TimeStampMapParserMap](v as string)];\n })\n ) as TimestampMap;\n}\n\n/** Seconds-per-unit for the `[HH:]MM:SS.mmm` parts, right-aligned so a missing HH just drops the leading weight. */\nconst VTT_TIMESTAMP_WEIGHTS = [3600, 60, 1, 0.001];\n\nfunction parseWebVttTimestamp(value: string): number {\n const parts = value.split(/[:.]/);\n return parts.reduce((acc, val, i) => acc + +val * (VTT_TIMESTAMP_WEIGHTS[i + 4 - parts.length] ?? 0), 0);\n}\n"],"mappings":";AAcA,MAAM,uBAAuB;;;;;;;;;;;;AAa7B,SAAgB,qBAAqB,MAAwC;CAC3E,MAAM,mBAAmB,KAAK,MAAM,YAAY,CAAC,CAAC,MAAM,SAAS,KAAK,WAAW,oBAAoB,CAAC;CACtG,OAAO,mBAAmB,sBAAsB,iBAAiB,MAAM,EAA2B,CAAC,IAAI,KAAA;AACzG;AAEA,MAAM,wBAAwB;CAC5B,OAAO;CACP,SAAS,MAAc,CAAC;AAC1B;AAIA,SAAS,sBAAsB,MAAwC;CACrE,OAAO,OAAO,YACZ,KAAK,MAAM,GAAG,CAAC,CAAC,KAAK,UAAU;EAC7B,MAAM,CAAC,GAAG,KAAK,MAAM,MAAM,OAAO,CAAC,CAAC,KAAK,SAAS,KAAK,KAAK,CAAC;EAC7D,OAAO,CAAC,GAAG,YAAY,GAAG,sBAAsB,EAAiC,CAAC,CAAW,CAAC;CAChG,CAAC,CACH;AACF;;AAGA,MAAM,wBAAwB;CAAC;CAAM;CAAI;CAAG;AAAK;AAEjD,SAAS,qBAAqB,OAAuB;CACnD,MAAM,QAAQ,MAAM,MAAM,MAAM;CAChC,OAAO,MAAM,QAAQ,KAAK,KAAK,MAAM,MAAM,CAAC,OAAO,sBAAsB,IAAI,IAAI,MAAM,WAAW,IAAI,CAAC;AACzG"}
1
+ {"version":3,"file":"parse-vtt-timestamp-map.js","names":[],"sources":["../../../../src/media/text/parse-vtt-timestamp-map.ts"],"sourcesContent":["/**\n * WebVTT-in-HLS `X-TIMESTAMP-MAP`: correlates a cue's LOCAL (in-file) time with an MPEG-2 presentation timestamp, so\n * LOCAL-authored cues can be placed on the media presentation timeline. Stored raw — the LOCAL→native correction is\n * `mpegts / 90000 - local` — so it stays independent of how (or whether) the presentation is later re-origined. See the\n * HLS spec, RFC 8216bis §3.5.\n */\nexport interface TimestampMap {\n /** The MPEG-2 presentation timestamp, in 90 kHz ticks, as authored. */\n mpegts: number;\n /** The LOCAL cue time the `mpegts` value maps to, in seconds. */\n local: number;\n}\n\nconst TIMESTAMP_MAP_PREFIX = 'X-TIMESTAMP-MAP=';\n\n/**\n * Scrape a WebVTT segment's `X-TIMESTAMP-MAP` header into a {@link TimestampMap} — the only header line we need to\n * correlate LOCAL cue times with the media presentation timeline. Deliberately _not_ a WebVTT parser: cue parsing stays\n * with the browser's native `<track>` parser (which drops this line); this reads just the one header field the native\n * path discards.\n *\n * Returns `undefined` when the segment carries no map (e.g. cues already in absolute presentation time) — per the HLS\n * spec that means LOCAL 0 maps to MPEGTS 0. Tolerant of attribute order and `[HH:]MM:SS.mmm` LOCAL forms.\n */\nexport function parseVttTimestampMap(text: string): TimestampMap | undefined {\n const timestampMapLine = text.split(/\\r\\n|\\r|\\n/).find((line) => line.startsWith(TIMESTAMP_MAP_PREFIX));\n\n return timestampMapLine ? parseTimestampMapBody(timestampMapLine.slice(TIMESTAMP_MAP_PREFIX.length)) : undefined;\n}\n\nconst TimeStampMapParserMap = {\n LOCAL: parseWebVttTimestamp,\n MPEGTS: (v: string) => +v,\n} as const;\n\ntype TimeStampMapParserMap = typeof TimeStampMapParserMap;\n\nfunction parseTimestampMapBody(body: string): TimestampMap | undefined {\n return Object.fromEntries(\n body.split(',').map((kvStr) => {\n const [k, v] = kvStr.split(/:(.*)/).map((kOrV) => kOrV.trim());\n\n return [k?.toLowerCase(), TimeStampMapParserMap[k as keyof TimeStampMapParserMap](v as string)];\n })\n ) as TimestampMap;\n}\n\n/** Seconds-per-unit for the `[HH:]MM:SS.mmm` parts, right-aligned so a missing HH just drops the leading weight. */\nconst VTT_TIMESTAMP_WEIGHTS = [3600, 60, 1, 0.001];\n\nfunction parseWebVttTimestamp(value: string): number {\n const parts = value.split(/[:.]/);\n\n return parts.reduce((acc, val, i) => acc + +val * (VTT_TIMESTAMP_WEIGHTS[i + 4 - parts.length] ?? 0), 0);\n}\n"],"mappings":";AAaA,MAAM,uBAAuB;;;;;;;;;;AAW7B,SAAgB,qBAAqB,MAAwC;CAC3E,MAAM,mBAAmB,KAAK,MAAM,YAAY,CAAC,CAAC,MAAM,SAAS,KAAK,WAAW,oBAAoB,CAAC;CAEtG,OAAO,mBAAmB,sBAAsB,iBAAiB,MAAM,EAA2B,CAAC,IAAI,KAAA;AACzG;AAEA,MAAM,wBAAwB;CAC5B,OAAO;CACP,SAAS,MAAc,CAAC;AAC1B;AAIA,SAAS,sBAAsB,MAAwC;CACrE,OAAO,OAAO,YACZ,KAAK,MAAM,GAAG,CAAC,CAAC,KAAK,UAAU;EAC7B,MAAM,CAAC,GAAG,KAAK,MAAM,MAAM,OAAO,CAAC,CAAC,KAAK,SAAS,KAAK,KAAK,CAAC;EAE7D,OAAO,CAAC,GAAG,YAAY,GAAG,sBAAsB,EAAiC,CAAC,CAAW,CAAC;CAChG,CAAC,CACH;AACF;;AAGA,MAAM,wBAAwB;CAAC;CAAM;CAAI;CAAG;AAAK;AAEjD,SAAS,qBAAqB,OAAuB;CACnD,MAAM,QAAQ,MAAM,MAAM,MAAM;CAEhC,OAAO,MAAM,QAAQ,KAAK,KAAK,MAAM,MAAM,CAAC,OAAO,sBAAsB,IAAI,IAAI,MAAM,WAAW,IAAI,CAAC;AACzG"}
@@ -1,21 +1,20 @@
1
1
  import { parseVttTimestampMap } from "./parse-vtt-timestamp-map.js";
2
2
  //#region src/media/text/resolve-vtt-metadata.ts
3
3
  /**
4
- * Header-level text-segment metadata — the `X-TIMESTAMP-MAP` correlation scraped from
5
- * a VTT segment's raw bytes. DOM-free (a plain fetch + regex parse): the native
6
- * `<track>` parser in `media/dom/text` (`resolveVttSegment`) discards this header, so a
7
- * caller that needs it (e.g. non-zero-PTS relocation) fetches the bytes itself.
4
+ * Header-level text-segment metadata — the `X-TIMESTAMP-MAP` correlation scraped from a VTT segment's raw bytes.
5
+ * DOM-free (a plain fetch + regex parse): the native `<track>` parser in `media/dom/text` (`resolveVttSegment`)
6
+ * discards this header, so a caller that needs it (e.g. non-zero-PTS relocation) fetches the bytes itself.
8
7
  */
9
8
  /**
10
9
  * Fetch a VTT segment and scrape only its header metadata (no cue parsing).
11
10
  *
12
- * The native `<track>` parser (`media/dom/text`'s `resolveVttSegment`) discards
13
- * `X-TIMESTAMP-MAP`, so reading it requires the raw bytes. This is a separate,
14
- * caller-controlled fetch the caller decides *when* metadata is needed (e.g.
15
- * once per source) rather than paying for it on every segment.
11
+ * The native `<track>` parser (`media/dom/text`'s `resolveVttSegment`) discards `X-TIMESTAMP-MAP`, so reading it
12
+ * requires the raw bytes. This is a separate, caller-controlled fetch — the caller decides _when_ metadata is needed
13
+ * (e.g. once per source) rather than paying for it on every segment.
16
14
  */
17
15
  async function resolveVttSegmentMetadata(url) {
18
- return { timestampMap: parseVttTimestampMap(await fetch(url).then((response) => response.text())) };
16
+ const text = await fetch(url).then((response) => response.text());
17
+ return { timestampMap: parseVttTimestampMap(text) };
19
18
  }
20
19
  //#endregion
21
20
  export { resolveVttSegmentMetadata };
@@ -1 +1 @@
1
- {"version":3,"file":"resolve-vtt-metadata.js","names":[],"sources":["../../../../src/media/text/resolve-vtt-metadata.ts"],"sourcesContent":["/**\n * Header-level text-segment metadata — the `X-TIMESTAMP-MAP` correlation scraped from\n * a VTT segment's raw bytes. DOM-free (a plain fetch + regex parse): the native\n * `<track>` parser in `media/dom/text` (`resolveVttSegment`) discards this header, so a\n * caller that needs it (e.g. non-zero-PTS relocation) fetches the bytes itself.\n */\nimport { parseVttTimestampMap, type TimestampMap } from './parse-vtt-timestamp-map';\n\n/**\n * Header-level metadata for a text segment, surfaced alongside its cues. Each\n * field is present only when the segment declared it.\n */\nexport interface TextSegmentMetadata {\n timestampMap?: TimestampMap;\n}\n\n/**\n * Fetch a VTT segment and scrape only its header metadata (no cue parsing).\n *\n * The native `<track>` parser (`media/dom/text`'s `resolveVttSegment`) discards\n * `X-TIMESTAMP-MAP`, so reading it requires the raw bytes. This is a separate,\n * caller-controlled fetch — the caller decides *when* metadata is needed (e.g.\n * once per source) rather than paying for it on every segment.\n */\nexport async function resolveVttSegmentMetadata(url: string): Promise<TextSegmentMetadata> {\n const text = await fetch(url).then((response) => response.text());\n return { timestampMap: parseVttTimestampMap(text) };\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAwBA,eAAsB,0BAA0B,KAA2C;CAEzF,OAAO,EAAE,cAAc,qBAAqB,MADzB,MAAM,GAAG,CAAC,CAAC,MAAM,aAAa,SAAS,KAAK,CAAC,CAChB,EAAE;AACpD"}
1
+ {"version":3,"file":"resolve-vtt-metadata.js","names":[],"sources":["../../../../src/media/text/resolve-vtt-metadata.ts"],"sourcesContent":["/**\n * Header-level text-segment metadata — the `X-TIMESTAMP-MAP` correlation scraped from a VTT segment's raw bytes.\n * DOM-free (a plain fetch + regex parse): the native `<track>` parser in `media/dom/text` (`resolveVttSegment`)\n * discards this header, so a caller that needs it (e.g. non-zero-PTS relocation) fetches the bytes itself.\n */\nimport { parseVttTimestampMap, type TimestampMap } from './parse-vtt-timestamp-map';\n\n/**\n * Header-level metadata for a text segment, surfaced alongside its cues. Each field is present only when the segment\n * declared it.\n */\nexport interface TextSegmentMetadata {\n timestampMap?: TimestampMap;\n}\n\n/**\n * Fetch a VTT segment and scrape only its header metadata (no cue parsing).\n *\n * The native `<track>` parser (`media/dom/text`'s `resolveVttSegment`) discards `X-TIMESTAMP-MAP`, so reading it\n * requires the raw bytes. This is a separate, caller-controlled fetch — the caller decides _when_ metadata is needed\n * (e.g. once per source) rather than paying for it on every segment.\n */\nexport async function resolveVttSegmentMetadata(url: string): Promise<TextSegmentMetadata> {\n const text = await fetch(url).then((response) => response.text());\n\n return { timestampMap: parseVttTimestampMap(text) };\n}\n"],"mappings":";;;;;;;;;;;;;;AAsBA,eAAsB,0BAA0B,KAA2C;CACzF,MAAM,OAAO,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,aAAa,SAAS,KAAK,CAAC;CAEhE,OAAO,EAAE,cAAc,qBAAqB,IAAI,EAAE;AACpD"}
@@ -2,27 +2,22 @@
2
2
  /**
3
3
  * Core SPF Types
4
4
  *
5
- * Based on CMAF-HAM (Common Media Application Format - Hypothetical Application Model)
6
- * Protocol-agnostic representation of streaming media content.
5
+ * Based on CMAF-HAM (Common Media Application Format - Hypothetical Application Model) Protocol-agnostic representation
6
+ * of streaming media content.
7
7
  *
8
8
  * @see https://github.com/streaming-video-technology-alliance/common-media-library
9
9
  */
10
- /**
11
- * Base identifier type for all HAM objects.
12
- */
10
+ /** Base identifier type for all HAM objects. */
13
11
  interface Ham {
14
12
  id: string;
15
13
  /**
16
- * Format-/protocol-specific values that aren't part of the generic CMAF-HAM
17
- * model kept in an open bag so the model stays format-neutral (mirrors how
18
- * CMAF-HAM itself stashes protocol extras rather than growing the model).
19
- * Typed reads go through dedicated accessors (e.g. `getMediaPlaylistMetadata`).
14
+ * Format-/protocol-specific values that aren't part of the generic CMAF-HAM model — kept in an open bag so the model
15
+ * stays format-neutral (mirrors how CMAF-HAM itself stashes protocol extras rather than growing the model). Typed
16
+ * reads go through dedicated accessors (e.g. `getMediaPlaylistMetadata`).
20
17
  */
21
18
  metadata?: Record<string, unknown>;
22
19
  }
23
- /**
24
- * Addressable resource with optional byte range.
25
- */
20
+ /** Addressable resource with optional byte range. */
26
21
  interface AddressableObject {
27
22
  url: string;
28
23
  byteRange?: {
@@ -30,32 +25,24 @@ interface AddressableObject {
30
25
  end: number;
31
26
  };
32
27
  }
33
- /**
34
- * Time span with start time and duration.
35
- * Used for segments and other timed ranges.
36
- */
28
+ /** Time span with start time and duration. Used for segments and other timed ranges. */
37
29
  interface TimeSpan {
38
30
  startTime: number;
39
31
  duration: number;
40
32
  }
41
- /**
42
- * Track content type.
43
- */
33
+ /** Track content type. */
44
34
  type TrackType = 'video' | 'audio' | 'text';
45
35
  /**
46
36
  * Video frame rate expressed as numerator/denominator.
47
37
  *
48
- * Examples:
49
- * - 30 fps: { frameRateNumerator: 30 }
50
- * - 29.97 fps: { frameRateNumerator: 30000, frameRateDenominator: 1001 }
38
+ * Examples: - 30 fps: { frameRateNumerator: 30 } - 29.97 fps: { frameRateNumerator: 30000, frameRateDenominator: 1001 }
51
39
  */
52
40
  interface FrameRate {
53
41
  frameRateNumerator: number;
54
42
  frameRateDenominator?: number;
55
43
  }
56
44
  /**
57
- * Generic type for partially resolved tracks.
58
- * Removes fields that come from media playlist parsing.
45
+ * Generic type for partially resolved tracks. Removes fields that come from media playlist parsing.
59
46
  *
60
47
  * @param T - Track type to make partially resolved (must extend Track)
61
48
  */
@@ -66,14 +53,12 @@ type PartiallyResolved<T extends Track = Track> = Omit<T, 'segments' | 'initiali
66
53
  initialization?: never;
67
54
  };
68
55
  /**
69
- * Base track type containing common properties for all resolved tracks.
70
- * A resolved track has segments, duration, and initialization data.
71
- * All URLs are fully qualified (parsers resolve relative URLs).
56
+ * Base track type containing common properties for all resolved tracks. A resolved track has segments, duration, and
57
+ * initialization data. All URLs are fully qualified (parsers resolve relative URLs).
72
58
  */
73
59
  /**
74
- * Track startTime is always 0 — the presentation-timeline origin (and future
75
- * multi-period base). The live sliding-window edge is `segments[0].startTime`,
76
- * derived — never stored here.
60
+ * Track startTime is always 0 — the presentation-timeline origin (and future multi-period base). The live
61
+ * sliding-window edge is `segments[0].startTime`, derived — never stored here.
77
62
  */
78
63
  type Track = Ham & AddressableObject & TimeSpan & {
79
64
  type: TrackType;
@@ -84,51 +69,40 @@ type Track = Ham & AddressableObject & TimeSpan & {
84
69
  initialization?: AddressableObject;
85
70
  segments: Segment[];
86
71
  /**
87
- * Media-timeline (decode/encode) coordinate of the track's timeline origin
88
- * (presentation-0) — the media-time base value of the coordinate model, peer
89
- * to `startTime` (presentation). Derived from the container
90
- * (`tfdt.baseMediaDecodeTime ÷ mdhd.timescale`); the relocation offset is
91
- * `−startMediaTime` (targets presentation-0 — `Track.startTime` plays no
92
- * part), never stored.
72
+ * Media-timeline (decode/encode) coordinate of the track's timeline origin (presentation-0) — the media-time base
73
+ * value of the coordinate model, peer to `startTime` (presentation). Derived from the container
74
+ * (`tfdt.baseMediaDecodeTime ÷ mdhd.timescale`); the relocation offset is `−startMediaTime` (targets presentation-0
75
+ * `Track.startTime` plays no part), never stored.
93
76
  *
94
- * Optional: `undefined` means not yet established, or never establishable
95
- * (e.g. text tracks carry no container origin); a near-zero/native origin is
96
- * established as `0` (no relocation). Established once per source by the
97
- * `establishStartMediaTime` reactor. See
98
- * `internal/design/spf/presentation-timeline-model.md`.
77
+ * Optional: `undefined` means not yet established, or never establishable (e.g. text tracks carry no container
78
+ * origin); a near-zero/native origin is established as `0` (no relocation). Established once per source by the
79
+ * `establishStartMediaTime` reactor. See `internal/design/spf/presentation-timeline-model.md`.
99
80
  */
100
81
  startMediaTime?: number;
101
82
  /**
102
- * Wall-clock time (epoch seconds) at the track's timeline origin
103
- * (presentation-0) pure playlist arithmetic over any PDT-bearing segment:
104
- * `segment.startDate segment.startTime`, invariant along a linear
105
- * timeline. Optional: absent when no segment carries `startDate`.
83
+ * Wall-clock time (epoch seconds) at the track's timeline origin (presentation-0) — pure playlist arithmetic over
84
+ * any PDT-bearing segment: `segment.startDate segment.startTime`, invariant along a linear timeline. Optional:
85
+ * absent when no segment carries `startDate`.
106
86
  *
107
- * The wall-clock member of the coordinate triple (peer to `startTime` and
108
- * `startMediaTime`). For live it is the anchor segments are PDT-placed
109
- * against on every parse; equal `startDate` across tracks marks the same
110
- * presentation instant. See
111
- * `internal/design/spf/live-presentation-timeline-model.md`.
87
+ * The wall-clock member of the coordinate triple (peer to `startTime` and `startMediaTime`). For live it is the
88
+ * anchor segments are PDT-placed against on every parse; equal `startDate` across tracks marks the same
89
+ * presentation instant. See `internal/design/spf/live-presentation-timeline-model.md`.
112
90
  */
113
91
  startDate?: number;
114
92
  };
115
93
  /**
116
- * Per-track-type origin-establishment data, accumulated across appends (the media
117
- * track's `track_id` + `mdhd` timescale from the init, `tfdt` baseMediaDecodeTime of
118
- * that same track from the first media segment) hence optional. The transient input
119
- * the `establishStartMediaTime` reactor reduces into `Track.startMediaTime`.
94
+ * Per-track-type origin-establishment data, accumulated across appends (the media track's `track_id` + `mdhd` timescale
95
+ * from the init, `tfdt` baseMediaDecodeTime of that same track from the first media segment) — hence optional. The
96
+ * transient input the `establishStartMediaTime` reactor reduces into `Track.startMediaTime`.
120
97
  *
121
- * `trackId` is the ISO-BMFF `track_ID` of the buffered media track (`vide`/`soun`),
122
- * read from the init's `tkhd`; it ties the timescale to the *same* track's
123
- * `baseMediaDecodeTime` (matched via `tfhd.track_id`) so a muxed segment carrying a
124
- * second track (e.g. `clcp` captions) reads the right `tfdt` rather than the first one.
98
+ * `trackId` is the ISO-BMFF `track_ID` of the buffered media track (`vide`/`soun`), read from the init's `tkhd`; it
99
+ * ties the timescale to the _same_ track's `baseMediaDecodeTime` (matched via `tfhd.track_id`) so a muxed segment
100
+ * carrying a second track (e.g. `clcp` captions) reads the right `tfdt` rather than the first one.
125
101
  *
126
- * `segmentStartTime` is the 0-based presentation start of the segment
127
- * `baseMediaDecodeTime` was read from — *not* a container value (it's the playlist
128
- * position), but co-located because the origin is `baseMediaDecodeTime/timescale
129
- * segmentStartTime`: the first *loaded* segment isn't necessarily the 0th (a
130
- * non-zero initial `currentTime`, or live/DVR), so the decode time alone isn't the
131
- * stream origin.
102
+ * `segmentStartTime` is the 0-based presentation start of the segment `baseMediaDecodeTime` was read from — _not_ a
103
+ * container value (it's the playlist position), but co-located because the origin is `baseMediaDecodeTime/timescale −
104
+ * segmentStartTime`: the first _loaded_ segment isn't necessarily the 0th (a non-zero initial `currentTime`, or
105
+ * live/DVR), so the decode time alone isn't the stream origin.
132
106
  */
133
107
  interface MediaContainerData {
134
108
  trackId?: number;
@@ -137,31 +111,25 @@ interface MediaContainerData {
137
111
  segmentStartTime?: number;
138
112
  }
139
113
  /**
140
- * Raw media-segment bytes — a complete buffer or a byte stream. The transport-neutral
141
- * payload the loader pipeline carries; `AppendData` (the MSE `SourceBuffer` append
142
- * input in `media/dom/mse`) is an alias of this at the DOM boundary.
114
+ * Raw media-segment bytes — a complete buffer or a byte stream. The transport-neutral payload the loader pipeline
115
+ * carries; `AppendData` (the MSE `SourceBuffer` append input in `media/dom/mse`) is an alias of this at the DOM
116
+ * boundary.
143
117
  */
144
118
  type SegmentData = ArrayBuffer | AsyncIterable<Uint8Array>;
145
- /**
146
- * Resolved video track with segments.
147
- */
119
+ /** Resolved video track with segments. */
148
120
  type VideoTrack = Track & Required<Pick<Track, 'initialization' | 'codecs'>> & {
149
121
  type: 'video';
150
122
  width?: number;
151
123
  height?: number;
152
124
  frameRate?: FrameRate;
153
125
  /**
154
- * Audio groups (`EXT-X-STREAM-INF:AUDIO`) this video rendition can pair
155
- * with. A list because one rendition is typically listed across multiple
156
- * `EXT-X-STREAM-INF` entries one per audio group (the HLS cross-product)
157
- * which the parser collapses into a single track carrying every group it
158
- * advertised.
126
+ * Audio groups (`EXT-X-STREAM-INF:AUDIO`) this video rendition can pair with. A list because one rendition is
127
+ * typically listed across multiple `EXT-X-STREAM-INF` entries — one per audio group (the HLS cross-product) — which
128
+ * the parser collapses into a single track carrying every group it advertised.
159
129
  */
160
130
  audioGroupIds?: string[];
161
131
  };
162
- /**
163
- * Resolved audio track with segments.
164
- */
132
+ /** Resolved audio track with segments. */
165
133
  type AudioTrack = Track & Required<Pick<Track, 'initialization' | 'codecs'>> & {
166
134
  type: 'audio';
167
135
  groupId: string;
@@ -171,9 +139,7 @@ type AudioTrack = Track & Required<Pick<Track, 'initialization' | 'codecs'>> & {
171
139
  default?: boolean;
172
140
  autoselect?: boolean;
173
141
  };
174
- /**
175
- * Resolved text track with segments.
176
- */
142
+ /** Resolved text track with segments. */
177
143
  type TextTrack = Track & {
178
144
  type: 'text';
179
145
  groupId: string;
@@ -184,17 +150,13 @@ type TextTrack = Track & {
184
150
  forced?: boolean;
185
151
  };
186
152
  /**
187
- * Predicate that answers "can this environment decode this track?" — the
188
- * capability-probing surface, read by the track-switching hard-constraint
189
- * pre-pass (`excludeUnplayableTracks`) to drop undecodable renditions before
190
- * selection. Kept DOM-free here (a plain function type over a minimal track
191
- * shape) so DOM-free behaviors can consume it; the DOM implementation
192
- * (`canPlayTrack` in `media/dom/capabilities.ts`) wraps
193
- * `MediaSource.isTypeSupported`.
153
+ * Predicate that answers "can this environment decode this track?" — the capability-probing surface, read by the
154
+ * track-switching hard-constraint pre-pass (`excludeUnplayableTracks`) to drop undecodable renditions before selection.
155
+ * Kept DOM-free here (a plain function type over a minimal track shape) so DOM-free behaviors can consume it; the DOM
156
+ * implementation (`canPlayTrack` in `media/dom/capabilities.ts`) wraps `MediaSource.isTypeSupported`.
194
157
  *
195
- * Takes the minimal codec-bearing shape both video and audio candidates
196
- * carry. `mimeType` is optional so unprobeable candidates (no MIME) can be
197
- * passed straight through as playable rather than dropped.
158
+ * Takes the minimal codec-bearing shape both video and audio candidates carry. `mimeType` is optional so unprobeable
159
+ * candidates (no MIME) can be passed straight through as playable rather than dropped.
198
160
  */
199
161
  type CanPlayTrack = (track: {
200
162
  mimeType?: string;
@@ -204,10 +166,9 @@ type CanPlayTrack = (track: {
204
166
  /**
205
167
  * Minimal text-track cue shape — start time, end time, and display text.
206
168
  *
207
- * Host-agnostic representation. `VTTCue` structurally satisfies this
208
- * interface, so DOM consumers pass `VTTCue` values directly. Non-DOM
209
- * hosts (workers, test fakes, non-browser engines) can satisfy the same
210
- * shape without pulling in DOM types.
169
+ * Host-agnostic representation. `VTTCue` structurally satisfies this interface, so DOM consumers pass `VTTCue` values
170
+ * directly. Non-DOM hosts (workers, test fakes, non-browser engines) can satisfy the same shape without pulling in DOM
171
+ * types.
211
172
  */
212
173
  interface Cue {
213
174
  startTime: number;
@@ -215,17 +176,14 @@ interface Cue {
215
176
  text: string;
216
177
  }
217
178
  /**
218
- * Partially resolved text track from multivariant playlist.
219
- * Has metadata but no segments or initialization yet (media playlist not fetched).
179
+ * Partially resolved text track from multivariant playlist. Has metadata but no segments or initialization yet (media
180
+ * playlist not fetched).
220
181
  */
221
182
  type PartiallyResolvedTextTrack = PartiallyResolved<TextTrack>;
222
- /**
223
- * Union of all resolved track types.
224
- */
183
+ /** Union of all resolved track types. */
225
184
  type ResolvedTrack = VideoTrack | AudioTrack | TextTrack;
226
185
  /**
227
- * Generic switching set type.
228
- * A group of tracks that can be switched between seamlessly.
186
+ * Generic switching set type. A group of tracks that can be switched between seamlessly.
229
187
  *
230
188
  * @param T - Track type (VideoTrack, AudioTrack, or TextTrack)
231
189
  */
@@ -234,8 +192,7 @@ type SwitchingSetOf<T extends Track = Track> = Ham & {
234
192
  tracks: (PartiallyResolved<T> | T)[];
235
193
  };
236
194
  /**
237
- * Generic selection set type.
238
- * Groups switching sets by track type.
195
+ * Generic selection set type. Groups switching sets by track type.
239
196
  *
240
197
  * @param T - Track type (VideoTrack, AudioTrack, or TextTrack)
241
198
  */
@@ -243,48 +200,34 @@ type SelectionSetOf<T extends Track = Track> = Ham & {
243
200
  type: T['type'];
244
201
  switchingSets: SwitchingSetOf<T>[];
245
202
  };
246
- /**
247
- * Video selection set - contains only video switching sets.
248
- */
203
+ /** Video selection set - contains only video switching sets. */
249
204
  type VideoSelectionSet = SelectionSetOf<VideoTrack>;
250
- /**
251
- * Audio selection set - contains only audio switching sets.
252
- */
205
+ /** Audio selection set - contains only audio switching sets. */
253
206
  type AudioSelectionSet = SelectionSetOf<AudioTrack>;
254
- /**
255
- * Text selection set - contains only text switching sets.
256
- */
207
+ /** Text selection set - contains only text switching sets. */
257
208
  type TextSelectionSet = SelectionSetOf<TextTrack>;
258
- /**
259
- * Selection set - groups switching sets by track type.
260
- * Discriminated union ensures type-safe track access.
261
- */
209
+ /** Selection set - groups switching sets by track type. Discriminated union ensures type-safe track access. */
262
210
  type SelectionSet = VideoSelectionSet | AudioSelectionSet | TextSelectionSet;
263
211
  /**
264
- * Media segment with timing information.
265
- * Follows CMAF-HAM composition pattern.
212
+ * Media segment with timing information. Follows CMAF-HAM composition pattern.
266
213
  *
267
- * `startDate` is the absolute wall-clock time of the segment's first
268
- * sample, in **epoch seconds** (unit-consistent with `startTime`/`duration`),
269
- * derived from `#EXT-X-PROGRAM-DATE-TIME` (explicit or interpolated forward via
270
- * `EXTINF`). Unlike the per-track-relative `startTime`, it is comparable across
271
- * tracks, so it is the cross-track sync anchor for demuxed audio/video and the
272
- * exact recovery value on a full live-window turnover. Optional: absent when the
273
- * source carries no PDT (allowed by RFC 8216, required by Apple's HLS authoring
274
- * spec — so present on conformant content).
214
+ * `startDate` is the absolute wall-clock time of the segment's first sample, in **epoch seconds** (unit-consistent with
215
+ * `startTime`/`duration`), derived from `#EXT-X-PROGRAM-DATE-TIME` (explicit or interpolated forward via `EXTINF`).
216
+ * Unlike the per-track-relative `startTime`, it is comparable across tracks, so it is the cross-track sync anchor for
217
+ * demuxed audio/video and the exact recovery value on a full live-window turnover. Optional: absent when the source
218
+ * carries no PDT (allowed by RFC 8216, required by Apple's HLS authoring spec so present on conformant content).
275
219
  */
276
220
  type Segment = Ham & AddressableObject & TimeSpan & {
277
221
  startDate?: number;
278
222
  };
279
223
  /**
280
- * Playlist-level metadata surfaced from a parsed media playlist. HLS delivery
281
- * specifics — not part of the generic CMAF-HAM model — so they live under
282
- * `Ham.metadata` (read via `getMediaPlaylistMetadata`) rather than as
283
- * first-class `Track` fields:
224
+ * Playlist-level metadata surfaced from a parsed media playlist. HLS delivery specifics — not part of the generic
225
+ * CMAF-HAM model — so they live under `Ham.metadata` (read via `getMediaPlaylistMetadata`) rather than as first-class
226
+ * `Track` fields:
284
227
  *
285
228
  * - `targetDuration` (`#EXT-X-TARGETDURATION`) — reload-cadence basis.
286
- * - `mediaSequence` (`#EXT-X-MEDIA-SEQUENCE`, default 0) — sequence number of
287
- * `segments[0]`; the join key for merging successive reload snapshots.
229
+ * - `mediaSequence` (`#EXT-X-MEDIA-SEQUENCE`, default 0) — sequence number of `segments[0]`; the join key for merging
230
+ * successive reload snapshots.
288
231
  * - `playlistType` (`#EXT-X-PLAYLIST-TYPE`) — `VOD` / `EVENT` / undefined.
289
232
  * - `endList` (`#EXT-X-ENDLIST`) — playlist is complete; stop reloading.
290
233
  */
@@ -294,80 +237,66 @@ interface MediaPlaylistMetadata {
294
237
  playlistType?: 'VOD' | 'EVENT';
295
238
  endList: boolean;
296
239
  /**
297
- * Whether this rendition carries encrypted segments — any `#EXT-X-KEY` whose
298
- * `METHOD` isn't `NONE`. Detection only: enough to tell that playback needs
299
- * decryption support, not enough to perform it.
240
+ * Whether this rendition carries encrypted segments — any `#EXT-X-KEY` whose `METHOD` isn't `NONE`. Detection only:
241
+ * enough to tell that playback needs decryption support, not enough to perform it.
300
242
  *
301
- * Deliberately *not* a model-level `protection` shape. CMAF-HAM puts
302
- * `protection` on `SwitchingSet`, but that can't express two real cases: a
303
- * clear lead (`METHOD=NONE` segments followed by encrypted ones — protection
304
- * varies along the timeline within one rendition) or key rotation (its single
305
- * `defaultKid` can't represent a key changing over time). Modeling it properly
306
- * belongs to DRM support; until then this records the one fact a playlist
307
- * reliably gives us. Per-rendition because that's HLS's granularity —
308
- * `EXT-X-KEY` is a media-playlist tag.
243
+ * Deliberately _not_ a model-level `protection` shape. CMAF-HAM puts `protection` on `SwitchingSet`, but that can't
244
+ * express two real cases: a clear lead (`METHOD=NONE` segments followed by encrypted ones protection varies along
245
+ * the timeline within one rendition) or key rotation (its single `defaultKid` can't represent a key changing over
246
+ * time). Modeling it properly belongs to DRM support; until then this records the one fact a playlist reliably gives
247
+ * us. Per-rendition because that's HLS's granularity `EXT-X-KEY` is a media-playlist tag.
309
248
  *
310
- * Conservative for a clear lead: a rendition whose opening segments are clear
311
- * still reads as encrypted, so it's judged unplayable rather than played until
312
- * it breaks.
249
+ * Conservative for a clear lead: a rendition whose opening segments are clear still reads as encrypted, so it's
250
+ * judged unplayable rather than played until it breaks.
313
251
  */
314
252
  encrypted?: boolean;
315
253
  /**
316
- * `EXT-X-SERVER-CONTROL` `HOLD-BACK` (seconds) — the server's declared distance
317
- * from the live edge for clients playing *complete* segments. Absent when the
318
- * server doesn't advertise it, in which case the spec default (3 × target
319
- * duration) applies. Deliberately HLS vocabulary living in the playlist
320
- * metadata rather than on `Track`: whether a wall-clock holdback generalizes
321
- * across delivery formats is unresolved.
254
+ * `EXT-X-SERVER-CONTROL` `HOLD-BACK` (seconds) — the server's declared distance from the live edge for clients
255
+ * playing _complete_ segments. Absent when the server doesn't advertise it, in which case the spec default (3 ×
256
+ * target duration) applies. Deliberately HLS vocabulary living in the playlist metadata rather than on `Track`:
257
+ * whether a wall-clock holdback generalizes across delivery formats is unresolved.
322
258
  *
323
- * `PART-HOLD-BACK` is **not** captured — it only applies to clients playing
324
- * partial segments, and using it while fetching whole segments would put the
325
- * playhead ahead of the last complete segment. Add it with LL-HLS support.
259
+ * `PART-HOLD-BACK` is **not** captured — it only applies to clients playing partial segments, and using it while
260
+ * fetching whole segments would put the playhead ahead of the last complete segment. Add it with LL-HLS support.
326
261
  */
327
262
  holdBack?: number;
328
263
  /**
329
- * Whether the server is delivering this rendition as Low-Latency HLS — any of
330
- * `#EXT-X-PART`, `#EXT-X-PART-INF`, or `EXT-X-SERVER-CONTROL`'s
331
- * `PART-HOLD-BACK`.
264
+ * Whether the server is delivering this rendition as Low-Latency HLS — any of `#EXT-X-PART`, `#EXT-X-PART-INF`, or
265
+ * `EXT-X-SERVER-CONTROL`'s `PART-HOLD-BACK`.
332
266
  *
333
- * Detection only, and deliberately so: partial segments are ignored by the
334
- * parser and the loader fetches whole segments, so an LL-HLS playlist plays as
335
- * standard live at standard latency. Recording the fact is what lets a
336
- * composition *say* that rather than silently under-delivering the latency the
337
- * publisher configured.
267
+ * Detection only, and deliberately so: partial segments are ignored by the parser and the loader fetches whole
268
+ * segments, so an LL-HLS playlist plays as standard live at standard latency. Recording the fact is what lets a
269
+ * composition _say_ that rather than silently under-delivering the latency the publisher configured.
338
270
  */
339
271
  lowLatency?: boolean;
340
272
  }
341
273
  /** Typed read of the media-playlist metadata stashed in `ham.metadata`. */
342
274
  declare function getMediaPlaylistMetadata(ham: Pick<Ham, 'metadata'>): MediaPlaylistMetadata | undefined;
343
275
  /**
344
- * The source's semantic nature — live vs on-demand. A model concept
345
- * (consumer-facing), distinct from completeness / duration: a live stream that
346
- * has *ended* is still `'live'`.
276
+ * The source's semantic nature — live vs on-demand. A model concept (consumer-facing), distinct from completeness /
277
+ * duration: a live stream that has _ended_ is still `'live'`.
347
278
  */
348
279
  type StreamType = 'live' | 'on-demand';
349
280
  /**
350
- * Presentation - a single playable period of content.
351
- * Uses TimeSpan fields (startTime always 0, duration optional until track resolved).
281
+ * Presentation - a single playable period of content. Uses TimeSpan fields (startTime always 0, duration optional until
282
+ * track resolved).
352
283
  *
353
- * Extends AddressableObject so `url` contains the original manifest URL.
354
- * All URLs are fully qualified (parsers resolve relative URLs).
284
+ * Extends AddressableObject so `url` contains the original manifest URL. All URLs are fully qualified (parsers resolve
285
+ * relative URLs).
355
286
  */
356
287
  type Presentation = Ham & AddressableObject & Partial<TimeSpan> & {
357
288
  selectionSets: SelectionSet[];
358
289
  /**
359
- * Live vs on-demand — the source's semantic nature. Populated once a media
360
- * playlist is parsed (derived from `#EXT-X-PLAYLIST-TYPE` via
361
- * `deriveStreamType`); orthogonal to duration / completeness.
290
+ * Live vs on-demand — the source's semantic nature. Populated once a media playlist is parsed (derived from
291
+ * `#EXT-X-PLAYLIST-TYPE` via `deriveStreamType`); orthogonal to duration / completeness.
362
292
  */
363
293
  streamType?: StreamType;
364
294
  };
365
295
  /**
366
296
  * State-shaped presentation that may or may not be resolved yet.
367
297
  *
368
- * The lifecycle is a single value: a caller writes `{ url }`, and the
369
- * resolver populates the rest in place. `url` is always present; resolved
370
- * fields (`id`, `selectionSets`, duration) appear once parsing succeeds.
298
+ * The lifecycle is a single value: a caller writes `{ url }`, and the resolver populates the rest in place. `url` is
299
+ * always present; resolved fields (`id`, `selectionSets`, duration) appear once parsing succeeds.
371
300
  *
372
301
  * Use `isResolvedPresentation` to narrow to `Presentation`.
373
302
  */
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../../../../src/media/types/index.ts"],"mappings":";;;;;;;;;;;;UAgBiB;EACf;;;;;;;EAOA,WAAW;;;;;UAMI;EACf;EACA;IACE;IACA;;;;;;;UAyBa;EACf;EACA;;;;;KAUU;;;;;;;;UAaK;EACf;EACA;;;;;;;;KAaU,kBAAkB,UAAU,QAAQ,SAAS,KAAK,yCAAyC;EACrG;EACA;EACA;EACA;;;;;;;;;;;;KA6BU,QAAQ,MAClB,oBACA;EACE,MAAM;EACN;EACA;EACA;EACA;EACA,iBAAiB;EACjB,UAAU;;;;;;;;;;;;;;;EAeV;;;;;;;;;;;;;EAaA;;;;;;;;;;;;;;;;;;;;UAqBa;EACf;EACA;EACA;EACA;;;;;;;KAQU,cAAc,cAAc,cAAc;;;;KAK1C,aAAa,QACvB,SAAS,KAAK;EACZ;EAGA;EACA;EACA,YAAY;;;;;;;;EAQZ;;;;;KAMQ,aAAa,QACvB,SAAS,KAAK;EACZ;EACA;EACA;EACA;EACA;EACA;EACA;;;;;KAMQ,YAAY;EACtB;EACA;EACA;EACA;EACA;EACA;EACA;;;;;;;;;;;;;;;KAgBU,gBAAgB;EAC1B;EACA;EACA,WAAW;;;;;;;;;;UAWI;EACf;EACA;EACA;;;;;;KAmBU,6BAA6B,kBAAkB;;;;KAK/C,gBAAgB,aAAa,aAAa;;;;;;;KAoB1C,eAAe,UAAU,QAAQ,SAAS;EACpD,MAAM;EACN,SAAS,kBAAkB,KAAK;;;;;;;;KA8BtB,eAAe,UAAU,QAAQ,SAAS;EACpD,MAAM;EACN,eAAe,eAAe;;;;;KAMpB,oBAAoB,eAAe;;;;KAKnC,oBAAoB,eAAe;;;;KAKnC,mBAAmB,eAAe;;;;;KAMlC,eAAe,oBAAoB,oBAAoB;;;;;;;;;;;;;;KAmBvD,UAAU,MAAM,oBAAoB;EAAa;;;;;;;;;;;;;;UA4B5C;EACf;EACA;EACA;EACA;;;;;;;;;;;;;;;;;;;EAmBA;;;;;;;;;;;;;EAaA;;;;;;;;;;;;EAYA;;;iBAOc,yBAAyB,KAAK,KAAK,mBAAmB;;;;;;KAa1D;;;;;;;;KAwCA,eAAe,MACzB,oBACA,QAAQ;EACN,eAAe;;;;;;EAMf,aAAa;;;;;;;;;;;KAYL,4BAA4B,oBAAoB,QAAQ,KAAK,oBAAoB"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../../../src/media/types/index.ts"],"mappings":";;;;;;;;;;UAciB;EACf;;;;;;EAMA,WAAW;;;UAII;EACf;EACA;IACE;IACA;;;;UAqBa;EACf;EACA;;;KAQU;;;;;;UAWK;EACf;EACA;;;;;;;KAYU,kBAAkB,UAAU,QAAQ,SAAS,KAAK,yCAAyC;EACrG;EACA;EACA;EACA;;;;;;;;;;KA2BU,QAAQ,MAClB,oBACA;EACE,MAAM;EACN;EACA;EACA;EACA;EACA,iBAAiB;EACjB,UAAU;;;;;;;;;;;EAWV;;;;;;;;;;EAUA;;;;;;;;;;;;;;;;UAiBa;EACf;EACA;EACA;EACA;;;;;;;KAQU,cAAc,cAAc,cAAc;;KAG1C,aAAa,QACvB,SAAS,KAAK;EACZ;EAGA;EACA;EACA,YAAY;;;;;;EAMZ;;;KAIQ,aAAa,QACvB,SAAS,KAAK;EACZ;EACA;EACA;EACA;EACA;EACA;EACA;;;KAIQ,YAAY;EACtB;EACA;EACA;EACA;EACA;EACA;EACA;;;;;;;;;;;KAYU,gBAAgB;EAC1B;EACA;EACA,WAAW;;;;;;;;;UAUI;EACf;EACA;EACA;;;;;;KAkBU,6BAA6B,kBAAkB;;KAG/C,gBAAgB,aAAa,aAAa;;;;;;KAiB1C,eAAe,UAAU,QAAQ,SAAS;EACpD,MAAM;EACN,SAAS,kBAAkB,KAAK;;;;;;;KAoBtB,eAAe,UAAU,QAAQ,SAAS;EACpD,MAAM;EACN,eAAe,eAAe;;;KAIpB,oBAAoB,eAAe;;KAGnC,oBAAoB,eAAe;;KAGnC,mBAAmB,eAAe;;KAGlC,eAAe,oBAAoB,oBAAoB;;;;;;;;;;KAevD,UAAU,MAAM,oBAAoB;EAAa;;;;;;;;;;;;;UAyB5C;EACf;EACA;EACA;EACA;;;;;;;;;;;;;;EAcA;;;;;;;;;;EAUA;;;;;;;;;EASA;;;iBAOc,yBAAyB,KAAK,KAAK,mBAAmB;;;;;KAY1D;;;;;;;;KAoCA,eAAe,MACzB,oBACA,QAAQ;EACN,eAAe;;;;;EAKf,aAAa;;;;;;;;;;KAWL,4BAA4B,oBAAoB,QAAQ,KAAK,oBAAoB"}