mattebox 0.1.0

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 (471) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +106 -0
  3. package/dist/cdn/mattebox.dash-drm.min.js +2 -0
  4. package/dist/cdn/mattebox.dash.min.js +2 -0
  5. package/dist/cdn/mattebox.dual-drm.min.js +2 -0
  6. package/dist/cdn/mattebox.dual-ts-drm.min.js +3 -0
  7. package/dist/cdn/mattebox.dual-ts.min.js +3 -0
  8. package/dist/cdn/mattebox.dual.min.js +2 -0
  9. package/dist/cdn/mattebox.hls-drm.min.js +2 -0
  10. package/dist/cdn/mattebox.hls-ts-drm.min.js +3 -0
  11. package/dist/cdn/mattebox.hls-ts.min.js +3 -0
  12. package/dist/cdn/mattebox.hls.min.js +2 -0
  13. package/dist/cdn/mattebox.kernel.min.js +1 -0
  14. package/dist/cdn/mattebox.min.js +6 -0
  15. package/dist/cdn/transmux.worker.js +1 -0
  16. package/dist/containers/adts.d.ts +33 -0
  17. package/dist/containers/adts.d.ts.map +1 -0
  18. package/dist/containers/adts.js +66 -0
  19. package/dist/containers/adts.js.map +1 -0
  20. package/dist/containers/captions.d.ts +27 -0
  21. package/dist/containers/captions.d.ts.map +1 -0
  22. package/dist/containers/captions.js +36 -0
  23. package/dist/containers/captions.js.map +1 -0
  24. package/dist/containers/codec-probe/index.d.ts +35 -0
  25. package/dist/containers/codec-probe/index.d.ts.map +1 -0
  26. package/dist/containers/codec-probe/index.js +222 -0
  27. package/dist/containers/codec-probe/index.js.map +1 -0
  28. package/dist/containers/fmp4/writer.d.ts +62 -0
  29. package/dist/containers/fmp4/writer.d.ts.map +1 -0
  30. package/dist/containers/fmp4/writer.js +201 -0
  31. package/dist/containers/fmp4/writer.js.map +1 -0
  32. package/dist/containers/id3.d.ts +25 -0
  33. package/dist/containers/id3.d.ts.map +1 -0
  34. package/dist/containers/id3.js +75 -0
  35. package/dist/containers/id3.js.map +1 -0
  36. package/dist/containers/mp4-box/index.d.ts +79 -0
  37. package/dist/containers/mp4-box/index.d.ts.map +1 -0
  38. package/dist/containers/mp4-box/index.js +231 -0
  39. package/dist/containers/mp4-box/index.js.map +1 -0
  40. package/dist/containers/packed-audio/index.d.ts +7 -0
  41. package/dist/containers/packed-audio/index.d.ts.map +1 -0
  42. package/dist/containers/packed-audio/index.js +63 -0
  43. package/dist/containers/packed-audio/index.js.map +1 -0
  44. package/dist/containers/sei.d.ts +26 -0
  45. package/dist/containers/sei.d.ts.map +1 -0
  46. package/dist/containers/sei.js +100 -0
  47. package/dist/containers/sei.js.map +1 -0
  48. package/dist/containers/ts-transmux/demux.d.ts +49 -0
  49. package/dist/containers/ts-transmux/demux.d.ts.map +1 -0
  50. package/dist/containers/ts-transmux/demux.js +222 -0
  51. package/dist/containers/ts-transmux/demux.js.map +1 -0
  52. package/dist/containers/ts-transmux/h264.d.ts +48 -0
  53. package/dist/containers/ts-transmux/h264.d.ts.map +1 -0
  54. package/dist/containers/ts-transmux/h264.js +211 -0
  55. package/dist/containers/ts-transmux/h264.js.map +1 -0
  56. package/dist/containers/ts-transmux/index.d.ts +17 -0
  57. package/dist/containers/ts-transmux/index.d.ts.map +1 -0
  58. package/dist/containers/ts-transmux/index.js +34 -0
  59. package/dist/containers/ts-transmux/index.js.map +1 -0
  60. package/dist/containers/ts-transmux/runner.d.ts +23 -0
  61. package/dist/containers/ts-transmux/runner.d.ts.map +1 -0
  62. package/dist/containers/ts-transmux/runner.js +99 -0
  63. package/dist/containers/ts-transmux/runner.js.map +1 -0
  64. package/dist/containers/ts-transmux/transmux.d.ts +24 -0
  65. package/dist/containers/ts-transmux/transmux.d.ts.map +1 -0
  66. package/dist/containers/ts-transmux/transmux.js +212 -0
  67. package/dist/containers/ts-transmux/transmux.js.map +1 -0
  68. package/dist/containers/ts-transmux/transmux.worker.d.ts +2 -0
  69. package/dist/containers/ts-transmux/transmux.worker.d.ts.map +1 -0
  70. package/dist/containers/ts-transmux/transmux.worker.js +19 -0
  71. package/dist/containers/ts-transmux/transmux.worker.js.map +1 -0
  72. package/dist/es2015/_virtual/_@oxc-project_runtime@0.147.0/helpers/esm/asyncToGenerator.js +27 -0
  73. package/dist/es2015/_virtual/_@oxc-project_runtime@0.147.0/helpers/esm/defineProperty.js +12 -0
  74. package/dist/es2015/_virtual/_@oxc-project_runtime@0.147.0/helpers/esm/objectSpread2.js +25 -0
  75. package/dist/es2015/_virtual/_@oxc-project_runtime@0.147.0/helpers/esm/objectWithoutProperties.js +13 -0
  76. package/dist/es2015/_virtual/_@oxc-project_runtime@0.147.0/helpers/esm/objectWithoutPropertiesLoose.js +12 -0
  77. package/dist/es2015/_virtual/_@oxc-project_runtime@0.147.0/helpers/esm/toPrimitive.js +14 -0
  78. package/dist/es2015/_virtual/_@oxc-project_runtime@0.147.0/helpers/esm/toPropertyKey.js +9 -0
  79. package/dist/es2015/_virtual/_@oxc-project_runtime@0.147.0/helpers/esm/typeof.js +11 -0
  80. package/dist/es2015/containers/adts.js +77 -0
  81. package/dist/es2015/containers/captions.js +36 -0
  82. package/dist/es2015/containers/codec-probe/index.js +220 -0
  83. package/dist/es2015/containers/fmp4/writer.js +165 -0
  84. package/dist/es2015/containers/id3.js +72 -0
  85. package/dist/es2015/containers/mp4-box/index.js +209 -0
  86. package/dist/es2015/containers/packed-audio/index.js +67 -0
  87. package/dist/es2015/containers/sei.js +79 -0
  88. package/dist/es2015/containers/ts-transmux/demux.js +211 -0
  89. package/dist/es2015/containers/ts-transmux/h264.js +204 -0
  90. package/dist/es2015/containers/ts-transmux/index.js +37 -0
  91. package/dist/es2015/containers/ts-transmux/runner.js +95 -0
  92. package/dist/es2015/containers/ts-transmux/transmux.js +210 -0
  93. package/dist/es2015/containers/ts-transmux/transmux.worker.js +26 -0
  94. package/dist/es2015/index.js +356 -0
  95. package/dist/es2015/kernel/append-queue.js +148 -0
  96. package/dist/es2015/kernel/bus.js +134 -0
  97. package/dist/es2015/kernel/context.js +92 -0
  98. package/dist/es2015/kernel/effects.js +62 -0
  99. package/dist/es2015/kernel/evictor.js +67 -0
  100. package/dist/es2015/kernel/lifecycle.js +122 -0
  101. package/dist/es2015/kernel/loader.js +108 -0
  102. package/dist/es2015/kernel/mime.js +20 -0
  103. package/dist/es2015/kernel/mse.js +426 -0
  104. package/dist/es2015/kernel/reducer.js +1051 -0
  105. package/dist/es2015/kernel/rendition-select.js +263 -0
  106. package/dist/es2015/kernel/scheduler.js +82 -0
  107. package/dist/es2015/kernel/sinks/metadata-sink.js +7 -0
  108. package/dist/es2015/kernel/sinks/mse-sink.js +31 -0
  109. package/dist/es2015/kernel/sinks/text-track-sink.js +167 -0
  110. package/dist/es2015/kernel/timeline.js +127 -0
  111. package/dist/es2015/kernel/trace.js +134 -0
  112. package/dist/es2015/kernel/track-registry.js +47 -0
  113. package/dist/es2015/kernel/transport.js +242 -0
  114. package/dist/es2015/kernel/watchdog.js +38 -0
  115. package/dist/es2015/presets/dash/index.js +9 -0
  116. package/dist/es2015/presets/dash-drm/index.js +13 -0
  117. package/dist/es2015/presets/define.js +45 -0
  118. package/dist/es2015/presets/dual/index.js +14 -0
  119. package/dist/es2015/presets/dual-drm/index.js +14 -0
  120. package/dist/es2015/presets/dual-ts/index.js +14 -0
  121. package/dist/es2015/presets/dual-ts-drm/index.js +15 -0
  122. package/dist/es2015/presets/full/index.js +28 -0
  123. package/dist/es2015/presets/hls/index.js +9 -0
  124. package/dist/es2015/presets/hls-drm/index.js +13 -0
  125. package/dist/es2015/presets/hls-ts/index.js +13 -0
  126. package/dist/es2015/presets/hls-ts-drm/index.js +14 -0
  127. package/dist/es2015/presets/kernel/index.js +10 -0
  128. package/dist/es2015/presets/storage.js +24 -0
  129. package/dist/es2015/presets/tiers.js +93 -0
  130. package/dist/es2015/protocols/dash-cmaf/index.js +161 -0
  131. package/dist/es2015/protocols/dash-cmaf/parse.js +491 -0
  132. package/dist/es2015/protocols/dash-live/index.js +192 -0
  133. package/dist/es2015/protocols/hls-cmaf/index.js +168 -0
  134. package/dist/es2015/protocols/hls-cmaf/lexer.js +72 -0
  135. package/dist/es2015/protocols/hls-cmaf/parse.js +457 -0
  136. package/dist/es2015/protocols/hls-live/index.js +296 -0
  137. package/dist/es2015/protocols/live-shared.js +29 -0
  138. package/dist/es2015/stages/abr/index.js +126 -0
  139. package/dist/es2015/stages/abr-cap-size/index.js +22 -0
  140. package/dist/es2015/stages/abr-persist/index.js +52 -0
  141. package/dist/es2015/stages/aes-128/index.js +76 -0
  142. package/dist/es2015/stages/alt-audio/index.js +80 -0
  143. package/dist/es2015/stages/cmaf-timing/index.js +55 -0
  144. package/dist/es2015/stages/cmcd/index.js +70 -0
  145. package/dist/es2015/stages/codec-probe/index.js +65 -0
  146. package/dist/es2015/stages/codec-switch/index.js +48 -0
  147. package/dist/es2015/stages/content-steering/index.js +179 -0
  148. package/dist/es2015/stages/drm-shared.js +18 -0
  149. package/dist/es2015/stages/eme-cenc/index.js +46 -0
  150. package/dist/es2015/stages/eme-core/index.js +237 -0
  151. package/dist/es2015/stages/eme-fairplay/index.js +52 -0
  152. package/dist/es2015/stages/meta-id3/index.js +37 -0
  153. package/dist/es2015/stages/mp4-box/index.js +27 -0
  154. package/dist/es2015/stages/nal-scan/index.js +121 -0
  155. package/dist/es2015/stages/pdt/index.js +34 -0
  156. package/dist/es2015/stages/recovery/index.js +283 -0
  157. package/dist/es2015/stages/text-cea608/decode.js +201 -0
  158. package/dist/es2015/stages/text-cea608/index.js +71 -0
  159. package/dist/es2015/stages/text-webvtt/index.js +82 -0
  160. package/dist/es2015/stages/text-webvtt/parse.js +60 -0
  161. package/dist/es2015/stages/text-webvtt-segmented/index.js +57 -0
  162. package/dist/es2015/stages/thumbnails/index.js +73 -0
  163. package/dist/index.d.ts +32 -0
  164. package/dist/index.d.ts.map +1 -0
  165. package/dist/index.js +423 -0
  166. package/dist/index.js.map +1 -0
  167. package/dist/kernel/append-queue.d.ts +47 -0
  168. package/dist/kernel/append-queue.d.ts.map +1 -0
  169. package/dist/kernel/append-queue.js +180 -0
  170. package/dist/kernel/append-queue.js.map +1 -0
  171. package/dist/kernel/bus.d.ts +50 -0
  172. package/dist/kernel/bus.d.ts.map +1 -0
  173. package/dist/kernel/bus.js +147 -0
  174. package/dist/kernel/bus.js.map +1 -0
  175. package/dist/kernel/context.d.ts +45 -0
  176. package/dist/kernel/context.d.ts.map +1 -0
  177. package/dist/kernel/context.js +116 -0
  178. package/dist/kernel/context.js.map +1 -0
  179. package/dist/kernel/effects.d.ts +33 -0
  180. package/dist/kernel/effects.d.ts.map +1 -0
  181. package/dist/kernel/effects.js +65 -0
  182. package/dist/kernel/effects.js.map +1 -0
  183. package/dist/kernel/evictor.d.ts +46 -0
  184. package/dist/kernel/evictor.d.ts.map +1 -0
  185. package/dist/kernel/evictor.js +92 -0
  186. package/dist/kernel/evictor.js.map +1 -0
  187. package/dist/kernel/lifecycle.d.ts +41 -0
  188. package/dist/kernel/lifecycle.d.ts.map +1 -0
  189. package/dist/kernel/lifecycle.js +129 -0
  190. package/dist/kernel/lifecycle.js.map +1 -0
  191. package/dist/kernel/loader.d.ts +28 -0
  192. package/dist/kernel/loader.d.ts.map +1 -0
  193. package/dist/kernel/loader.js +126 -0
  194. package/dist/kernel/loader.js.map +1 -0
  195. package/dist/kernel/mime.d.ts +13 -0
  196. package/dist/kernel/mime.d.ts.map +1 -0
  197. package/dist/kernel/mime.js +18 -0
  198. package/dist/kernel/mime.js.map +1 -0
  199. package/dist/kernel/mse.d.ts +62 -0
  200. package/dist/kernel/mse.d.ts.map +1 -0
  201. package/dist/kernel/mse.js +490 -0
  202. package/dist/kernel/mse.js.map +1 -0
  203. package/dist/kernel/reducer.d.ts +39 -0
  204. package/dist/kernel/reducer.d.ts.map +1 -0
  205. package/dist/kernel/reducer.js +1316 -0
  206. package/dist/kernel/reducer.js.map +1 -0
  207. package/dist/kernel/rendition-select.d.ts +102 -0
  208. package/dist/kernel/rendition-select.d.ts.map +1 -0
  209. package/dist/kernel/rendition-select.js +295 -0
  210. package/dist/kernel/rendition-select.js.map +1 -0
  211. package/dist/kernel/scheduler.d.ts +57 -0
  212. package/dist/kernel/scheduler.d.ts.map +1 -0
  213. package/dist/kernel/scheduler.js +98 -0
  214. package/dist/kernel/scheduler.js.map +1 -0
  215. package/dist/kernel/sinks/metadata-sink.d.ts +7 -0
  216. package/dist/kernel/sinks/metadata-sink.d.ts.map +1 -0
  217. package/dist/kernel/sinks/metadata-sink.js +5 -0
  218. package/dist/kernel/sinks/metadata-sink.js.map +1 -0
  219. package/dist/kernel/sinks/mse-sink.d.ts +17 -0
  220. package/dist/kernel/sinks/mse-sink.d.ts.map +1 -0
  221. package/dist/kernel/sinks/mse-sink.js +20 -0
  222. package/dist/kernel/sinks/mse-sink.js.map +1 -0
  223. package/dist/kernel/sinks/text-track-sink.d.ts +45 -0
  224. package/dist/kernel/sinks/text-track-sink.d.ts.map +1 -0
  225. package/dist/kernel/sinks/text-track-sink.js +184 -0
  226. package/dist/kernel/sinks/text-track-sink.js.map +1 -0
  227. package/dist/kernel/timeline.d.ts +57 -0
  228. package/dist/kernel/timeline.d.ts.map +1 -0
  229. package/dist/kernel/timeline.js +203 -0
  230. package/dist/kernel/timeline.js.map +1 -0
  231. package/dist/kernel/trace.d.ts +42 -0
  232. package/dist/kernel/trace.d.ts.map +1 -0
  233. package/dist/kernel/trace.js +165 -0
  234. package/dist/kernel/trace.js.map +1 -0
  235. package/dist/kernel/track-registry.d.ts +22 -0
  236. package/dist/kernel/track-registry.d.ts.map +1 -0
  237. package/dist/kernel/track-registry.js +42 -0
  238. package/dist/kernel/track-registry.js.map +1 -0
  239. package/dist/kernel/transport.d.ts +90 -0
  240. package/dist/kernel/transport.d.ts.map +1 -0
  241. package/dist/kernel/transport.js +256 -0
  242. package/dist/kernel/transport.js.map +1 -0
  243. package/dist/kernel/watchdog.d.ts +35 -0
  244. package/dist/kernel/watchdog.d.ts.map +1 -0
  245. package/dist/kernel/watchdog.js +43 -0
  246. package/dist/kernel/watchdog.js.map +1 -0
  247. package/dist/presets/dash/index.d.ts +4 -0
  248. package/dist/presets/dash/index.d.ts.map +1 -0
  249. package/dist/presets/dash/index.js +8 -0
  250. package/dist/presets/dash/index.js.map +1 -0
  251. package/dist/presets/dash-drm/index.d.ts +4 -0
  252. package/dist/presets/dash-drm/index.d.ts.map +1 -0
  253. package/dist/presets/dash-drm/index.js +8 -0
  254. package/dist/presets/dash-drm/index.js.map +1 -0
  255. package/dist/presets/define.d.ts +36 -0
  256. package/dist/presets/define.d.ts.map +1 -0
  257. package/dist/presets/define.js +39 -0
  258. package/dist/presets/define.js.map +1 -0
  259. package/dist/presets/dual/index.d.ts +4 -0
  260. package/dist/presets/dual/index.d.ts.map +1 -0
  261. package/dist/presets/dual/index.js +9 -0
  262. package/dist/presets/dual/index.js.map +1 -0
  263. package/dist/presets/dual-drm/index.d.ts +4 -0
  264. package/dist/presets/dual-drm/index.d.ts.map +1 -0
  265. package/dist/presets/dual-drm/index.js +13 -0
  266. package/dist/presets/dual-drm/index.js.map +1 -0
  267. package/dist/presets/dual-ts/index.d.ts +4 -0
  268. package/dist/presets/dual-ts/index.d.ts.map +1 -0
  269. package/dist/presets/dual-ts/index.js +8 -0
  270. package/dist/presets/dual-ts/index.js.map +1 -0
  271. package/dist/presets/dual-ts-drm/index.d.ts +4 -0
  272. package/dist/presets/dual-ts-drm/index.d.ts.map +1 -0
  273. package/dist/presets/dual-ts-drm/index.js +14 -0
  274. package/dist/presets/dual-ts-drm/index.js.map +1 -0
  275. package/dist/presets/full/index.d.ts +4 -0
  276. package/dist/presets/full/index.d.ts.map +1 -0
  277. package/dist/presets/full/index.js +27 -0
  278. package/dist/presets/full/index.js.map +1 -0
  279. package/dist/presets/hls/index.d.ts +4 -0
  280. package/dist/presets/hls/index.d.ts.map +1 -0
  281. package/dist/presets/hls/index.js +8 -0
  282. package/dist/presets/hls/index.js.map +1 -0
  283. package/dist/presets/hls-drm/index.d.ts +4 -0
  284. package/dist/presets/hls-drm/index.d.ts.map +1 -0
  285. package/dist/presets/hls-drm/index.js +8 -0
  286. package/dist/presets/hls-drm/index.js.map +1 -0
  287. package/dist/presets/hls-ts/index.d.ts +4 -0
  288. package/dist/presets/hls-ts/index.d.ts.map +1 -0
  289. package/dist/presets/hls-ts/index.js +8 -0
  290. package/dist/presets/hls-ts/index.js.map +1 -0
  291. package/dist/presets/hls-ts-drm/index.d.ts +4 -0
  292. package/dist/presets/hls-ts-drm/index.d.ts.map +1 -0
  293. package/dist/presets/hls-ts-drm/index.js +13 -0
  294. package/dist/presets/hls-ts-drm/index.js.map +1 -0
  295. package/dist/presets/kernel/index.d.ts +4 -0
  296. package/dist/presets/kernel/index.d.ts.map +1 -0
  297. package/dist/presets/kernel/index.js +9 -0
  298. package/dist/presets/kernel/index.js.map +1 -0
  299. package/dist/presets/storage.d.ts +9 -0
  300. package/dist/presets/storage.d.ts.map +1 -0
  301. package/dist/presets/storage.js +24 -0
  302. package/dist/presets/storage.js.map +1 -0
  303. package/dist/presets/tiers.d.ts +22 -0
  304. package/dist/presets/tiers.d.ts.map +1 -0
  305. package/dist/presets/tiers.js +78 -0
  306. package/dist/presets/tiers.js.map +1 -0
  307. package/dist/protocols/dash-cmaf/index.d.ts +20 -0
  308. package/dist/protocols/dash-cmaf/index.d.ts.map +1 -0
  309. package/dist/protocols/dash-cmaf/index.js +176 -0
  310. package/dist/protocols/dash-cmaf/index.js.map +1 -0
  311. package/dist/protocols/dash-cmaf/parse.d.ts +24 -0
  312. package/dist/protocols/dash-cmaf/parse.d.ts.map +1 -0
  313. package/dist/protocols/dash-cmaf/parse.js +586 -0
  314. package/dist/protocols/dash-cmaf/parse.js.map +1 -0
  315. package/dist/protocols/dash-live/index.d.ts +4 -0
  316. package/dist/protocols/dash-live/index.d.ts.map +1 -0
  317. package/dist/protocols/dash-live/index.js +188 -0
  318. package/dist/protocols/dash-live/index.js.map +1 -0
  319. package/dist/protocols/hls-cmaf/index.d.ts +17 -0
  320. package/dist/protocols/hls-cmaf/index.d.ts.map +1 -0
  321. package/dist/protocols/hls-cmaf/index.js +189 -0
  322. package/dist/protocols/hls-cmaf/index.js.map +1 -0
  323. package/dist/protocols/hls-cmaf/lexer.d.ts +25 -0
  324. package/dist/protocols/hls-cmaf/lexer.d.ts.map +1 -0
  325. package/dist/protocols/hls-cmaf/lexer.js +81 -0
  326. package/dist/protocols/hls-cmaf/lexer.js.map +1 -0
  327. package/dist/protocols/hls-cmaf/parse.d.ts +57 -0
  328. package/dist/protocols/hls-cmaf/parse.d.ts.map +1 -0
  329. package/dist/protocols/hls-cmaf/parse.js +572 -0
  330. package/dist/protocols/hls-cmaf/parse.js.map +1 -0
  331. package/dist/protocols/hls-live/index.d.ts +4 -0
  332. package/dist/protocols/hls-live/index.d.ts.map +1 -0
  333. package/dist/protocols/hls-live/index.js +309 -0
  334. package/dist/protocols/hls-live/index.js.map +1 -0
  335. package/dist/protocols/live-shared.d.ts +21 -0
  336. package/dist/protocols/live-shared.d.ts.map +1 -0
  337. package/dist/protocols/live-shared.js +32 -0
  338. package/dist/protocols/live-shared.js.map +1 -0
  339. package/dist/stages/abr/index.d.ts +16 -0
  340. package/dist/stages/abr/index.d.ts.map +1 -0
  341. package/dist/stages/abr/index.js +176 -0
  342. package/dist/stages/abr/index.js.map +1 -0
  343. package/dist/stages/abr-cap-size/index.d.ts +8 -0
  344. package/dist/stages/abr-cap-size/index.d.ts.map +1 -0
  345. package/dist/stages/abr-cap-size/index.js +21 -0
  346. package/dist/stages/abr-cap-size/index.js.map +1 -0
  347. package/dist/stages/abr-persist/index.d.ts +8 -0
  348. package/dist/stages/abr-persist/index.d.ts.map +1 -0
  349. package/dist/stages/abr-persist/index.js +44 -0
  350. package/dist/stages/abr-persist/index.js.map +1 -0
  351. package/dist/stages/aes-128/index.d.ts +15 -0
  352. package/dist/stages/aes-128/index.d.ts.map +1 -0
  353. package/dist/stages/aes-128/index.js +78 -0
  354. package/dist/stages/aes-128/index.js.map +1 -0
  355. package/dist/stages/alt-audio/index.d.ts +4 -0
  356. package/dist/stages/alt-audio/index.d.ts.map +1 -0
  357. package/dist/stages/alt-audio/index.js +90 -0
  358. package/dist/stages/alt-audio/index.js.map +1 -0
  359. package/dist/stages/cmaf-timing/index.d.ts +3 -0
  360. package/dist/stages/cmaf-timing/index.d.ts.map +1 -0
  361. package/dist/stages/cmaf-timing/index.js +56 -0
  362. package/dist/stages/cmaf-timing/index.js.map +1 -0
  363. package/dist/stages/cmcd/index.d.ts +22 -0
  364. package/dist/stages/cmcd/index.d.ts.map +1 -0
  365. package/dist/stages/cmcd/index.js +92 -0
  366. package/dist/stages/cmcd/index.js.map +1 -0
  367. package/dist/stages/codec-probe/index.d.ts +9 -0
  368. package/dist/stages/codec-probe/index.d.ts.map +1 -0
  369. package/dist/stages/codec-probe/index.js +68 -0
  370. package/dist/stages/codec-probe/index.js.map +1 -0
  371. package/dist/stages/codec-switch/index.d.ts +6 -0
  372. package/dist/stages/codec-switch/index.d.ts.map +1 -0
  373. package/dist/stages/codec-switch/index.js +59 -0
  374. package/dist/stages/codec-switch/index.js.map +1 -0
  375. package/dist/stages/content-steering/index.d.ts +4 -0
  376. package/dist/stages/content-steering/index.d.ts.map +1 -0
  377. package/dist/stages/content-steering/index.js +174 -0
  378. package/dist/stages/content-steering/index.js.map +1 -0
  379. package/dist/stages/drm-shared.d.ts +46 -0
  380. package/dist/stages/drm-shared.d.ts.map +1 -0
  381. package/dist/stages/drm-shared.js +28 -0
  382. package/dist/stages/drm-shared.js.map +1 -0
  383. package/dist/stages/eme-cenc/index.d.ts +12 -0
  384. package/dist/stages/eme-cenc/index.d.ts.map +1 -0
  385. package/dist/stages/eme-cenc/index.js +53 -0
  386. package/dist/stages/eme-cenc/index.js.map +1 -0
  387. package/dist/stages/eme-core/index.d.ts +29 -0
  388. package/dist/stages/eme-core/index.d.ts.map +1 -0
  389. package/dist/stages/eme-core/index.js +244 -0
  390. package/dist/stages/eme-core/index.js.map +1 -0
  391. package/dist/stages/eme-fairplay/index.d.ts +20 -0
  392. package/dist/stages/eme-fairplay/index.d.ts.map +1 -0
  393. package/dist/stages/eme-fairplay/index.js +59 -0
  394. package/dist/stages/eme-fairplay/index.js.map +1 -0
  395. package/dist/stages/meta-id3/index.d.ts +14 -0
  396. package/dist/stages/meta-id3/index.d.ts.map +1 -0
  397. package/dist/stages/meta-id3/index.js +30 -0
  398. package/dist/stages/meta-id3/index.js.map +1 -0
  399. package/dist/stages/mp4-box/index.d.ts +3 -0
  400. package/dist/stages/mp4-box/index.d.ts.map +1 -0
  401. package/dist/stages/mp4-box/index.js +19 -0
  402. package/dist/stages/mp4-box/index.js.map +1 -0
  403. package/dist/stages/nal-scan/index.d.ts +3 -0
  404. package/dist/stages/nal-scan/index.d.ts.map +1 -0
  405. package/dist/stages/nal-scan/index.js +123 -0
  406. package/dist/stages/nal-scan/index.js.map +1 -0
  407. package/dist/stages/pdt/index.d.ts +14 -0
  408. package/dist/stages/pdt/index.d.ts.map +1 -0
  409. package/dist/stages/pdt/index.js +34 -0
  410. package/dist/stages/pdt/index.js.map +1 -0
  411. package/dist/stages/recovery/index.d.ts +16 -0
  412. package/dist/stages/recovery/index.d.ts.map +1 -0
  413. package/dist/stages/recovery/index.js +270 -0
  414. package/dist/stages/recovery/index.js.map +1 -0
  415. package/dist/stages/text-cea608/decode.d.ts +44 -0
  416. package/dist/stages/text-cea608/decode.d.ts.map +1 -0
  417. package/dist/stages/text-cea608/decode.js +225 -0
  418. package/dist/stages/text-cea608/decode.js.map +1 -0
  419. package/dist/stages/text-cea608/index.d.ts +3 -0
  420. package/dist/stages/text-cea608/index.d.ts.map +1 -0
  421. package/dist/stages/text-cea608/index.js +84 -0
  422. package/dist/stages/text-cea608/index.js.map +1 -0
  423. package/dist/stages/text-webvtt/index.d.ts +3 -0
  424. package/dist/stages/text-webvtt/index.d.ts.map +1 -0
  425. package/dist/stages/text-webvtt/index.js +82 -0
  426. package/dist/stages/text-webvtt/index.js.map +1 -0
  427. package/dist/stages/text-webvtt/parse.d.ts +19 -0
  428. package/dist/stages/text-webvtt/parse.d.ts.map +1 -0
  429. package/dist/stages/text-webvtt/parse.js +62 -0
  430. package/dist/stages/text-webvtt/parse.js.map +1 -0
  431. package/dist/stages/text-webvtt-segmented/index.d.ts +5 -0
  432. package/dist/stages/text-webvtt-segmented/index.d.ts.map +1 -0
  433. package/dist/stages/text-webvtt-segmented/index.js +63 -0
  434. package/dist/stages/text-webvtt-segmented/index.js.map +1 -0
  435. package/dist/stages/thumbnails/index.d.ts +34 -0
  436. package/dist/stages/thumbnails/index.d.ts.map +1 -0
  437. package/dist/stages/thumbnails/index.js +58 -0
  438. package/dist/stages/thumbnails/index.js.map +1 -0
  439. package/dist/types/error.d.ts +33 -0
  440. package/dist/types/error.d.ts.map +1 -0
  441. package/dist/types/error.js +7 -0
  442. package/dist/types/error.js.map +1 -0
  443. package/dist/types/facade.d.ts +104 -0
  444. package/dist/types/facade.d.ts.map +1 -0
  445. package/dist/types/facade.js +2 -0
  446. package/dist/types/facade.js.map +1 -0
  447. package/dist/types/ir.d.ts +238 -0
  448. package/dist/types/ir.d.ts.map +1 -0
  449. package/dist/types/ir.js +7 -0
  450. package/dist/types/ir.js.map +1 -0
  451. package/dist/types/kernel.d.ts +217 -0
  452. package/dist/types/kernel.d.ts.map +1 -0
  453. package/dist/types/kernel.js +2 -0
  454. package/dist/types/kernel.js.map +1 -0
  455. package/dist/types/messages.d.ts +288 -0
  456. package/dist/types/messages.d.ts.map +1 -0
  457. package/dist/types/messages.js +2 -0
  458. package/dist/types/messages.js.map +1 -0
  459. package/dist/types/quality.d.ts +108 -0
  460. package/dist/types/quality.d.ts.map +1 -0
  461. package/dist/types/quality.js +2 -0
  462. package/dist/types/quality.js.map +1 -0
  463. package/dist/types/sink.d.ts +27 -0
  464. package/dist/types/sink.d.ts.map +1 -0
  465. package/dist/types/sink.js +2 -0
  466. package/dist/types/sink.js.map +1 -0
  467. package/dist/types/stage.d.ts +139 -0
  468. package/dist/types/stage.d.ts.map +1 -0
  469. package/dist/types/stage.js +2 -0
  470. package/dist/types/stage.js.map +1 -0
  471. package/package.json +132 -0
@@ -0,0 +1,1051 @@
1
+ import { normalizeMimeType } from "./mime.js";
2
+ import _objectSpread2 from "../_virtual/_@oxc-project_runtime@0.147.0/helpers/esm/objectSpread2.js";
3
+ import { bufferedEndFrom, schedule } from "./scheduler.js";
4
+ import { canSwitchTo, codecFamily, createArbiter, planPinApply } from "./rendition-select.js";
5
+ import { sbIdFor } from "./sinks/mse-sink.js";
6
+ import _objectWithoutProperties from "../_virtual/_@oxc-project_runtime@0.147.0/helpers/esm/objectWithoutProperties.js";
7
+ //#region src/kernel/reducer.ts
8
+ const _excluded = ["repeat"];
9
+ const _excluded2 = ["initFor"];
10
+ /**
11
+ * The default tuning. Every value is overridable through the `config`
12
+ * parameters of `initialState` and `createReducer`; these are starting
13
+ * points, not policy.
14
+ */
15
+ const DEFAULT_KERNEL_CONFIG = {
16
+ ewmaAlpha: .2,
17
+ ewmaFastAlpha: .6,
18
+ ewmaMinSampleBytes: 1e4,
19
+ bufferErrorLimit: 3,
20
+ repeatFetchLimit: 5,
21
+ backBufferSeconds: 30,
22
+ bufferGoalSeconds: 30,
23
+ manifestTimeoutMs: 1e4,
24
+ traceCapacity: 500,
25
+ baseRetryDelayMs: 400,
26
+ mediaTimeNormalized: false
27
+ };
28
+ function resolveConfig(config) {
29
+ return _objectSpread2(_objectSpread2({}, DEFAULT_KERNEL_CONFIG), config);
30
+ }
31
+ function initialState(config) {
32
+ const cfg = resolveConfig(config);
33
+ return {
34
+ lifecycle: { phase: "idle" },
35
+ presentation: null,
36
+ timeline: {
37
+ periodOffsets: /* @__PURE__ */ new Map(),
38
+ discontinuitySeq: 0
39
+ },
40
+ buffers: /* @__PURE__ */ new Map(),
41
+ bufferErrors: /* @__PURE__ */ new Map(),
42
+ cues: /* @__PURE__ */ new Map(),
43
+ live: null,
44
+ scheduling: {
45
+ inflight: /* @__PURE__ */ new Map(),
46
+ bufferGoal: cfg.bufferGoalSeconds,
47
+ tokenSeq: 0
48
+ },
49
+ tracks: {
50
+ active: /* @__PURE__ */ new Map(),
51
+ available: []
52
+ },
53
+ quality: {
54
+ version: 0,
55
+ constraints: /* @__PURE__ */ new Map(),
56
+ pinned: null,
57
+ active: null,
58
+ appendLog: []
59
+ },
60
+ stats: {
61
+ throughputEwma: 0,
62
+ throughputFastEwma: 0
63
+ },
64
+ playback: {
65
+ currentTime: 0,
66
+ buffered: [],
67
+ seeking: false
68
+ }
69
+ };
70
+ }
71
+ /** Gap width treated as continuous when measuring buffered spans. */
72
+ const GAP_TOLERANCE = .25;
73
+ /** The codecs part of an MSE type string ('video/mp4; codecs="avc1.42c00d"' -> 'avc1.42c00d'). */
74
+ function bufferCodecString(type) {
75
+ var _match$;
76
+ const match = /codecs="?([^"]+)"?/.exec(type);
77
+ return (_match$ = match === null || match === void 0 ? void 0 : match[1]) !== null && _match$ !== void 0 ? _match$ : null;
78
+ }
79
+ function reject(state, command, reason) {
80
+ return [state, [{
81
+ kind: "emit",
82
+ event: "command:rejected",
83
+ payload: {
84
+ command,
85
+ reason
86
+ }
87
+ }]];
88
+ }
89
+ /**
90
+ * A manifest that will never yield a presentation. Every path lands here:
91
+ * an adapter's parse failure (MANIFEST_FAILED), a fetch failure on the
92
+ * manifest request, a `mimeType` no adapter accepts, and bytes no adapter
93
+ * claims. One phase transition and one error shape, so an integrator
94
+ * handles a single code per cause.
95
+ */
96
+ function failManifest(state, error, extra = {}) {
97
+ const phase = error.fatal ? "error" : state.lifecycle.phase;
98
+ return [_objectSpread2(_objectSpread2({}, state), {}, { lifecycle: { phase } }), [{
99
+ kind: "emit",
100
+ event: "error",
101
+ payload: _objectSpread2({
102
+ category: error.category,
103
+ code: error.code,
104
+ fatal: error.fatal,
105
+ recoverable: error.recoverable
106
+ }, extra)
107
+ }]];
108
+ }
109
+ /** The in-flight manifest request a SEGMENT_LOADED fact answers, or null. At most one is ever in flight. */
110
+ function manifestRequestFor(state, msg) {
111
+ if (msg.trackId !== "manifest") return null;
112
+ for (const request of state.scheduling.inflight.values()) if (request.trackId === "manifest" && (msg.token === void 0 || msg.token === request.token)) return request;
113
+ return null;
114
+ }
115
+ function bumped(quality) {
116
+ return _objectSpread2(_objectSpread2({}, quality), {}, { version: quality.version + 1 });
117
+ }
118
+ /**
119
+ * Forgets the last fetch decision. A pin or a seek legitimately makes the
120
+ * scheduler repeat itself; only unprompted repetition means a stuck loop.
121
+ */
122
+ function clearRepeat(scheduling) {
123
+ if (scheduling.repeat === void 0) return scheduling;
124
+ const { repeat: _repeat } = scheduling;
125
+ return _objectWithoutProperties(scheduling, _excluded);
126
+ }
127
+ function ewma(previous, sample, alpha) {
128
+ return previous === 0 ? sample : alpha * sample + (1 - alpha) * previous;
129
+ }
130
+ /** Companion groups present, as `contentType:groupId`, for the coupling filter. */
131
+ function availableGroups(state) {
132
+ var _state$presentation$p, _state$presentation;
133
+ const groups = /* @__PURE__ */ new Set();
134
+ for (const period of (_state$presentation$p = (_state$presentation = state.presentation) === null || _state$presentation === void 0 ? void 0 : _state$presentation.periods) !== null && _state$presentation$p !== void 0 ? _state$presentation$p : []) for (const track of period.tracks) {
135
+ if (track.contentType !== "audio" && track.contentType !== "text") continue;
136
+ const colon = track.id.indexOf(":");
137
+ const group = colon === -1 ? track.id : track.id.slice(0, colon);
138
+ groups.add(`${track.contentType}:${group}`);
139
+ }
140
+ return groups;
141
+ }
142
+ /** Merges one span into a sorted coverage list, coalescing overlaps. */
143
+ function mergeCoverage(coverage, added) {
144
+ const merged = [];
145
+ let pending = added;
146
+ for (const range of coverage) if (range.end < pending.start || range.start > pending.end) merged.push(range);
147
+ else pending = {
148
+ start: Math.min(range.start, pending.start),
149
+ end: Math.max(range.end, pending.end)
150
+ };
151
+ merged.push(pending);
152
+ return merged.sort((a, b) => a.start - b.start);
153
+ }
154
+ function findTrack(presentation, trackId) {
155
+ if (presentation === null) return null;
156
+ for (const period of presentation.periods) for (const track of period.tracks) if (track.id === trackId) return track;
157
+ return null;
158
+ }
159
+ function findTrackSite(presentation, trackId) {
160
+ for (const period of presentation.periods) for (const track of period.tracks) if (track.id === trackId) return {
161
+ track,
162
+ period
163
+ };
164
+ return null;
165
+ }
166
+ function findRendition(presentation, renditionId) {
167
+ if (presentation === null) return null;
168
+ for (const period of presentation.periods) for (const track of period.tracks) for (const rendition of track.renditions) if (rendition.id === renditionId) return {
169
+ rendition,
170
+ track,
171
+ period
172
+ };
173
+ return null;
174
+ }
175
+ /**
176
+ * Whether a completed request feeds the throughput estimate: only media of
177
+ * the lead track (video where there is one, else audio). An audio segment
178
+ * beside video, a text cue, or a playlist is a small transfer whose time
179
+ * is latency, not bandwidth.
180
+ */
181
+ function samplesThroughput(state, request) {
182
+ var _state$tracks$active$;
183
+ const lead = (_state$tracks$active$ = state.tracks.active.get("video")) !== null && _state$tracks$active$ !== void 0 ? _state$tracks$active$ : state.tracks.active.get("audio");
184
+ return lead === void 0 ? request.renditionId === void 0 : request.trackId === lead;
185
+ }
186
+ /** Abort effects for every matching in-flight request, plus the state with them removed. */
187
+ function abortInflight(state, trackId) {
188
+ const effects = [];
189
+ const inflight = new Map(state.scheduling.inflight);
190
+ for (const [token, request] of state.scheduling.inflight) {
191
+ if (trackId !== void 0 && request.trackId !== trackId) continue;
192
+ effects.push({
193
+ kind: "abort",
194
+ token
195
+ });
196
+ inflight.delete(token);
197
+ }
198
+ if (effects.length === 0) return [state, []];
199
+ return [_objectSpread2(_objectSpread2({}, state), {}, { scheduling: _objectSpread2(_objectSpread2({}, state.scheduling), {}, { inflight }) }), effects];
200
+ }
201
+ function reduceCommand(state, msg, cfg, hooks) {
202
+ switch (msg.type) {
203
+ case "ATTACH":
204
+ if (state.lifecycle.phase !== "idle") return reject(state, msg.type, "already attached");
205
+ return [_objectSpread2(_objectSpread2({}, state), {}, { lifecycle: { phase: "attaching" } }), []];
206
+ case "DETACH": {
207
+ const [, aborts] = abortInflight(state);
208
+ return [initialState(cfg), aborts];
209
+ }
210
+ case "LOAD": {
211
+ if (state.lifecycle.phase === "idle") return reject(state, msg.type, "not attached");
212
+ if (state.lifecycle.phase !== "attaching") return reject(state, msg.type, "already loaded");
213
+ if (msg.mimeType !== void 0 && hooks.manifestTypes !== void 0) {
214
+ const mimeType = normalizeMimeType(msg.mimeType);
215
+ if (!hooks.manifestTypes.has(mimeType)) return failManifest(state, {
216
+ category: "manifest",
217
+ code: "MANIFEST_UNSUPPORTED",
218
+ fatal: true,
219
+ recoverable: false
220
+ }, { mimeType });
221
+ }
222
+ const tokenSeq = state.scheduling.tokenSeq + 1;
223
+ const token = `t${tokenSeq}:manifest`;
224
+ const inflight = new Map(state.scheduling.inflight);
225
+ inflight.set(token, {
226
+ token,
227
+ trackId: "manifest",
228
+ seq: 0,
229
+ url: msg.url
230
+ });
231
+ return [_objectSpread2(_objectSpread2({}, state), {}, {
232
+ lifecycle: { phase: "loading" },
233
+ scheduling: _objectSpread2(_objectSpread2({}, state.scheduling), {}, {
234
+ inflight,
235
+ tokenSeq
236
+ })
237
+ }), [{
238
+ kind: "fetch",
239
+ token,
240
+ url: msg.url,
241
+ timeout: cfg.manifestTimeoutMs
242
+ }]];
243
+ }
244
+ case "UNLOAD": {
245
+ const [, aborts] = abortInflight(state);
246
+ const fresh = initialState(cfg);
247
+ const phase = state.lifecycle.phase === "idle" ? "idle" : "attaching";
248
+ const clears = [...state.cues.keys()].map((trackId) => ({
249
+ kind: "clearCues",
250
+ trackId,
251
+ start: 0,
252
+ end: Number.POSITIVE_INFINITY
253
+ }));
254
+ return [_objectSpread2(_objectSpread2({}, fresh), {}, {
255
+ lifecycle: { phase },
256
+ scheduling: _objectSpread2(_objectSpread2({}, fresh.scheduling), {}, { tokenSeq: state.scheduling.tokenSeq })
257
+ }), [...aborts, ...clears]];
258
+ }
259
+ case "SEEK": {
260
+ if (state.presentation === null) return reject(state, msg.type, "no source");
261
+ const [next, aborts] = abortInflight(state);
262
+ const to = state.live === null ? msg.to : Math.min(Math.max(msg.to, state.live.span.start), state.live.edge);
263
+ return [_objectSpread2(_objectSpread2({}, next), {}, { scheduling: clearRepeat(next.scheduling) }), [...aborts, {
264
+ kind: "seekElement",
265
+ to
266
+ }]];
267
+ }
268
+ case "SEEK_TO_LIVE_EDGE": {
269
+ if (state.presentation === null || !state.presentation.isLive) return reject(state, msg.type, "not live");
270
+ if (state.live === null) return reject(state, msg.type, "no live support loaded");
271
+ const [next, aborts] = abortInflight(state);
272
+ return [_objectSpread2(_objectSpread2({}, next), {}, { scheduling: clearRepeat(next.scheduling) }), [...aborts, {
273
+ kind: "seekElement",
274
+ to: state.live.edge
275
+ }]];
276
+ }
277
+ case "SELECT_TRACK": {
278
+ const track = findTrack(state.presentation, msg.trackId);
279
+ if (track === null) return reject(state, msg.type, `unknown track: ${msg.trackId}`);
280
+ const previous = state.tracks.active.get(track.contentType);
281
+ const active = new Map(state.tracks.active);
282
+ active.set(track.contentType, track.id);
283
+ const effects = [];
284
+ let buffers = state.buffers;
285
+ let inflight = state.scheduling.inflight;
286
+ if (previous !== void 0 && previous !== track.id && (track.contentType === "audio" || track.contentType === "video")) {
287
+ const sbId = sbIdFor(track.contentType);
288
+ if (state.buffers.has(sbId)) {
289
+ effects.push({
290
+ kind: "remove",
291
+ sbId,
292
+ start: 0,
293
+ end: Number.POSITIVE_INFINITY
294
+ });
295
+ const buffer = state.buffers.get(sbId);
296
+ if (buffer !== void 0) {
297
+ const next = new Map(state.buffers);
298
+ const { initFor: _initFor } = buffer, rest = _objectWithoutProperties(buffer, _excluded2);
299
+ next.set(sbId, rest);
300
+ buffers = next;
301
+ }
302
+ const pruned = new Map(state.scheduling.inflight);
303
+ for (const [token, request] of state.scheduling.inflight) if (request.trackId === previous) {
304
+ effects.push({
305
+ kind: "abort",
306
+ token
307
+ });
308
+ pruned.delete(token);
309
+ }
310
+ inflight = pruned;
311
+ }
312
+ }
313
+ if (previous !== track.id) effects.push({
314
+ kind: "emit",
315
+ event: "tracks:selected",
316
+ payload: {
317
+ contentType: track.contentType,
318
+ trackId: track.id
319
+ }
320
+ });
321
+ return [_objectSpread2(_objectSpread2({}, state), {}, {
322
+ tracks: _objectSpread2(_objectSpread2({}, state.tracks), {}, { active }),
323
+ buffers,
324
+ scheduling: clearRepeat(_objectSpread2(_objectSpread2({}, state.scheduling), {}, { inflight })),
325
+ quality: bumped(state.quality)
326
+ }), effects];
327
+ }
328
+ case "DESELECT_TRACK": {
329
+ if (msg.contentType !== "text" && msg.contentType !== "metadata") return reject(state, msg.type, "video and audio always keep a selection");
330
+ const trackId = state.tracks.active.get(msg.contentType);
331
+ if (trackId === void 0) return [state, []];
332
+ const active = new Map(state.tracks.active);
333
+ active.delete(msg.contentType);
334
+ const cues = new Map(state.cues);
335
+ cues.delete(trackId);
336
+ const [aborted, abortEffects] = abortInflight(state, trackId);
337
+ return [_objectSpread2(_objectSpread2({}, aborted), {}, {
338
+ tracks: _objectSpread2(_objectSpread2({}, state.tracks), {}, { active }),
339
+ cues,
340
+ quality: bumped(state.quality)
341
+ }), [
342
+ ...abortEffects,
343
+ {
344
+ kind: "clearCues",
345
+ trackId,
346
+ start: 0,
347
+ end: Number.POSITIVE_INFINITY
348
+ },
349
+ {
350
+ kind: "emit",
351
+ event: "tracks:selected",
352
+ payload: {
353
+ contentType: msg.contentType,
354
+ trackId: null
355
+ }
356
+ }
357
+ ]];
358
+ }
359
+ case "PIN_RENDITION": {
360
+ var _state$buffers$get$ra, _state$buffers$get;
361
+ const site = findRendition(state.presentation, msg.renditionId);
362
+ if (site === null) return reject(state, msg.type, `unknown rendition: ${msg.renditionId}`);
363
+ const pinnedState = _objectSpread2(_objectSpread2({}, state), {}, { quality: bumped(_objectSpread2(_objectSpread2({}, state.quality), {}, {
364
+ pinned: site.rendition.id,
365
+ active: site.rendition.id
366
+ })) });
367
+ if (site.track.contentType !== "video" && site.track.contentType !== "audio") return [pinnedState, []];
368
+ const sbId = sbIdFor(site.track.contentType);
369
+ const inflightTokens = [];
370
+ for (const request of state.scheduling.inflight.values()) if (request.trackId === site.track.id) inflightTokens.push(request.token);
371
+ const plan = planPinApply({
372
+ strategy: msg.apply,
373
+ currentTime: state.playback.currentTime,
374
+ ranges: (_state$buffers$get$ra = (_state$buffers$get = state.buffers.get(sbId)) === null || _state$buffers$get === void 0 ? void 0 : _state$buffers$get.ranges) !== null && _state$buffers$get$ra !== void 0 ? _state$buffers$get$ra : [],
375
+ sbId,
376
+ trackId: site.track.id,
377
+ inflightTokens,
378
+ period: site.period,
379
+ rendition: site.rendition,
380
+ tokenSeq: state.scheduling.tokenSeq
381
+ });
382
+ const inflight = new Map(state.scheduling.inflight);
383
+ for (const token of inflightTokens) inflight.delete(token);
384
+ for (const request of plan.requests) inflight.set(request.token, request);
385
+ return [_objectSpread2(_objectSpread2({}, pinnedState), {}, { scheduling: clearRepeat(_objectSpread2(_objectSpread2({}, state.scheduling), {}, {
386
+ inflight,
387
+ tokenSeq: plan.tokenSeq
388
+ })) }), plan.effects];
389
+ }
390
+ case "RELEASE_PIN": return [_objectSpread2(_objectSpread2({}, state), {}, { quality: bumped(_objectSpread2(_objectSpread2({}, state.quality), {}, { pinned: null })) }), []];
391
+ case "CONSTRAIN": {
392
+ const constraints = new Map(state.quality.constraints);
393
+ constraints.set(msg.source, msg.constraint);
394
+ return [_objectSpread2(_objectSpread2({}, state), {}, {
395
+ quality: bumped(_objectSpread2(_objectSpread2({}, state.quality), {}, { constraints })),
396
+ scheduling: clearRepeat(state.scheduling)
397
+ }), []];
398
+ }
399
+ case "RELEASE_CONSTRAINT": {
400
+ if (!state.quality.constraints.has(msg.source)) return [state, []];
401
+ const constraints = new Map(state.quality.constraints);
402
+ constraints.delete(msg.source);
403
+ return [_objectSpread2(_objectSpread2({}, state), {}, {
404
+ quality: bumped(_objectSpread2(_objectSpread2({}, state.quality), {}, { constraints })),
405
+ scheduling: clearRepeat(state.scheduling)
406
+ }), []];
407
+ }
408
+ case "SET_BUFFER_GOAL":
409
+ if (!Number.isFinite(msg.seconds) || msg.seconds <= 0) return reject(state, msg.type, "invalid buffer goal");
410
+ return [_objectSpread2(_objectSpread2({}, state), {}, { scheduling: _objectSpread2(_objectSpread2({}, state.scheduling), {}, { bufferGoal: msg.seconds }) }), []];
411
+ case "ABORT_INFLIGHT": return abortInflight(state, msg.trackId);
412
+ }
413
+ }
414
+ function reduceFact(state, msg, cfg, hooks) {
415
+ switch (msg.type) {
416
+ case "ELEMENT_ATTACHED":
417
+ case "MEDIASOURCE_OPEN":
418
+ case "MEDIASOURCE_CLOSED": return [state, []];
419
+ case "MANIFEST_LOADED": {
420
+ const available = [];
421
+ for (const period of msg.presentation.periods) for (const track of period.tracks) available.push(track.id);
422
+ const inflight = new Map(state.scheduling.inflight);
423
+ for (const [token, request] of inflight) if (request.trackId === "manifest") inflight.delete(token);
424
+ const phase = state.lifecycle.phase === "loading" ? "ready" : state.lifecycle.phase;
425
+ const active = new Map(state.tracks.active);
426
+ for (const period of msg.presentation.periods) for (const track of period.tracks) if ((track.contentType === "video" || track.contentType === "audio") && !active.has(track.contentType)) active.set(track.contentType, track.id);
427
+ const loaded = _objectSpread2(_objectSpread2({}, state), {}, {
428
+ lifecycle: { phase },
429
+ presentation: msg.presentation,
430
+ scheduling: _objectSpread2(_objectSpread2({}, state.scheduling), {}, { inflight }),
431
+ tracks: {
432
+ active,
433
+ available
434
+ },
435
+ quality: bumped(state.quality)
436
+ });
437
+ const manifestEffects = available.length === state.tracks.available.length && available.every((id, index) => id === state.tracks.available[index]) ? [] : [{
438
+ kind: "emit",
439
+ event: "tracks:changed",
440
+ payload: { available }
441
+ }];
442
+ const schemes = msg.presentation.periods.flatMap((period) => period.tracks.flatMap((track) => {
443
+ var _track$protection$sch, _track$protection;
444
+ return (_track$protection$sch = (_track$protection = track.protection) === null || _track$protection === void 0 ? void 0 : _track$protection.schemes) !== null && _track$protection$sch !== void 0 ? _track$protection$sch : [];
445
+ }));
446
+ if (schemes.length > 0) manifestEffects.push({
447
+ kind: "emit",
448
+ event: "presentation:protection",
449
+ payload: schemes
450
+ });
451
+ if (!msg.presentation.isLive && msg.presentation.duration !== void 0) manifestEffects.push({
452
+ kind: "setDuration",
453
+ seconds: msg.presentation.duration
454
+ });
455
+ return [loaded, manifestEffects];
456
+ }
457
+ case "MANIFEST_FAILED": return failManifest(state, msg.error);
458
+ case "PLAYLIST_REFRESHED": return [state, []];
459
+ case "SEGMENT_LOADED": {
460
+ let matched = null;
461
+ if (msg.token !== void 0) {
462
+ var _state$scheduling$inf;
463
+ matched = (_state$scheduling$inf = state.scheduling.inflight.get(msg.token)) !== null && _state$scheduling$inf !== void 0 ? _state$scheduling$inf : null;
464
+ } else for (const request of state.scheduling.inflight.values()) if (request.trackId === msg.trackId && request.seq === msg.seq) {
465
+ matched = request;
466
+ break;
467
+ }
468
+ if (matched === null) return [state, []];
469
+ const inflight = new Map(state.scheduling.inflight);
470
+ inflight.delete(matched.token);
471
+ const sampleBps = msg.rtt > 0 && msg.size >= cfg.ewmaMinSampleBytes && samplesThroughput(state, matched) ? msg.size * 8e3 / msg.rtt : null;
472
+ const stats = sampleBps === null ? state.stats : {
473
+ throughputEwma: ewma(state.stats.throughputEwma, sampleBps, cfg.ewmaAlpha),
474
+ throughputFastEwma: ewma(state.stats.throughputFastEwma, sampleBps, cfg.ewmaFastAlpha)
475
+ };
476
+ let buffers = state.buffers;
477
+ let timeline = state.timeline;
478
+ let quality = state.quality;
479
+ let cues = state.cues;
480
+ const effects = [];
481
+ const cueTrack = matched.sbId === void 0 ? findTrack(state.presentation, matched.trackId) : null;
482
+ if (cueTrack !== null && (cueTrack.contentType === "text" || cueTrack.contentType === "metadata") && matched.segmentStart !== void 0) {
483
+ var _matched$segmentDurat, _cues$get, _matched$renditionId, _matched$segmentDurat2;
484
+ const span = {
485
+ start: matched.segmentStart,
486
+ end: matched.segmentStart + ((_matched$segmentDurat = matched.segmentDuration) !== null && _matched$segmentDurat !== void 0 ? _matched$segmentDurat : 0)
487
+ };
488
+ const next = new Map(cues);
489
+ next.set(matched.trackId, mergeCoverage((_cues$get = cues.get(matched.trackId)) !== null && _cues$get !== void 0 ? _cues$get : [], span));
490
+ cues = next;
491
+ effects.push({
492
+ kind: "deliver",
493
+ trackId: matched.trackId,
494
+ contentType: cueTrack.contentType,
495
+ data: msg.bytes,
496
+ meta: {
497
+ trackId: matched.trackId,
498
+ renditionId: (_matched$renditionId = matched.renditionId) !== null && _matched$renditionId !== void 0 ? _matched$renditionId : "",
499
+ contentType: cueTrack.contentType,
500
+ seq: matched.seq,
501
+ start: matched.segmentStart,
502
+ duration: (_matched$segmentDurat2 = matched.segmentDuration) !== null && _matched$segmentDurat2 !== void 0 ? _matched$segmentDurat2 : 0,
503
+ isInit: matched.seq < 0
504
+ }
505
+ });
506
+ }
507
+ if (matched.sbId !== void 0) {
508
+ var _buffers$get;
509
+ if (matched.seq < 0 && matched.renditionId !== void 0) {
510
+ const buffer = state.buffers.get(matched.sbId);
511
+ if (buffer !== void 0) {
512
+ var _targetSite$rendition;
513
+ const targetSite = findRendition(state.presentation, matched.renditionId);
514
+ const targetCodecs = targetSite === null ? buffer.codecs : targetSite.rendition.codecs === null ? targetSite.rendition.mimeType : `${targetSite.rendition.mimeType}; codecs="${targetSite.rendition.codecs}"`;
515
+ const familyChanged = codecFamily((_targetSite$rendition = targetSite === null || targetSite === void 0 ? void 0 : targetSite.rendition.codecs) !== null && _targetSite$rendition !== void 0 ? _targetSite$rendition : null) !== codecFamily(bufferCodecString(buffer.codecs));
516
+ const nextBuffers = new Map(state.buffers);
517
+ if (targetCodecs !== buffer.codecs && familyChanged) effects.push({
518
+ kind: "changeType",
519
+ sbId: matched.sbId,
520
+ codecs: targetCodecs
521
+ });
522
+ nextBuffers.set(matched.sbId, _objectSpread2(_objectSpread2({}, buffer), {}, {
523
+ initFor: matched.renditionId,
524
+ codecs: targetCodecs
525
+ }));
526
+ buffers = nextBuffers;
527
+ }
528
+ }
529
+ const initFor = (_buffers$get = buffers.get(matched.sbId)) === null || _buffers$get === void 0 ? void 0 : _buffers$get.initFor;
530
+ if (matched.seq >= 0 && matched.renditionId !== void 0 && initFor !== void 0 && initFor !== matched.renditionId) return [_objectSpread2(_objectSpread2({}, state), {}, {
531
+ scheduling: _objectSpread2(_objectSpread2({}, state.scheduling), {}, { inflight }),
532
+ stats,
533
+ buffers,
534
+ cues
535
+ }), [...effects, {
536
+ kind: "emit",
537
+ event: "quality:stale-segment",
538
+ payload: {
539
+ renditionId: matched.renditionId,
540
+ seq: matched.seq,
541
+ initFor
542
+ }
543
+ }]];
544
+ if (matched.timestampOffset !== void 0 && state.timeline.periodOffsets.get(matched.sbId) !== matched.timestampOffset) {
545
+ effects.push({
546
+ kind: "setTimestampOffset",
547
+ sbId: matched.sbId,
548
+ offset: matched.timestampOffset
549
+ });
550
+ const periodOffsets = new Map(state.timeline.periodOffsets);
551
+ periodOffsets.set(matched.sbId, matched.timestampOffset);
552
+ timeline = _objectSpread2(_objectSpread2({}, state.timeline), {}, { periodOffsets });
553
+ }
554
+ effects.push(_objectSpread2(_objectSpread2(_objectSpread2({
555
+ kind: "append",
556
+ sbId: matched.sbId,
557
+ data: msg.bytes
558
+ }, matched.segmentStart !== void 0 ? { start: matched.segmentStart } : {}), matched.renditionId !== void 0 ? { renditionId: matched.renditionId } : {}), {}, { seq: matched.seq }));
559
+ const buffer = buffers.get(matched.sbId);
560
+ if (buffer !== void 0) {
561
+ const nextBuffers = new Map(buffers);
562
+ nextBuffers.set(matched.sbId, _objectSpread2(_objectSpread2({}, buffer), {}, { pendingAppends: buffer.pendingAppends + 1 }));
563
+ buffers = nextBuffers;
564
+ }
565
+ if (matched.sbId === sbIdFor("video") && matched.renditionId !== void 0 && matched.segmentStart !== void 0) {
566
+ var _matched$segmentDurat3;
567
+ const watermark = state.playback.currentTime - cfg.backBufferSeconds;
568
+ const appendLog = [...state.quality.appendLog.filter(([range]) => range.end > watermark), [{
569
+ start: matched.segmentStart,
570
+ end: matched.segmentStart + ((_matched$segmentDurat3 = matched.segmentDuration) !== null && _matched$segmentDurat3 !== void 0 ? _matched$segmentDurat3 : 0)
571
+ }, matched.renditionId]];
572
+ quality = _objectSpread2(_objectSpread2({}, quality), {}, { appendLog });
573
+ }
574
+ }
575
+ return [_objectSpread2(_objectSpread2({}, state), {}, {
576
+ buffers,
577
+ timeline,
578
+ quality,
579
+ cues,
580
+ scheduling: _objectSpread2(_objectSpread2({}, state.scheduling), {}, { inflight }),
581
+ stats
582
+ }), effects];
583
+ }
584
+ case "SEGMENT_FAILED": {
585
+ var _msg$status2;
586
+ const inflight = new Map(state.scheduling.inflight);
587
+ for (const [token, request] of inflight) if (request.trackId === msg.trackId && request.seq === msg.seq) inflight.delete(token);
588
+ if (msg.trackId === "manifest") {
589
+ var _msg$error$context, _msg$status;
590
+ const contentType = (_msg$error$context = msg.error.context) === null || _msg$error$context === void 0 ? void 0 : _msg$error$context.contentType;
591
+ return failManifest(_objectSpread2(_objectSpread2({}, state), {}, { scheduling: _objectSpread2(_objectSpread2({}, state.scheduling), {}, { inflight }) }), _objectSpread2(_objectSpread2({}, msg.error), {}, {
592
+ fatal: true,
593
+ recoverable: false
594
+ }), _objectSpread2({ status: (_msg$status = msg.status) !== null && _msg$status !== void 0 ? _msg$status : null }, typeof contentType === "string" ? { contentType } : {}));
595
+ }
596
+ const failedTrack = findTrack(state.presentation, msg.trackId);
597
+ const isCueTrack = failedTrack !== null && (failedTrack.contentType === "text" || failedTrack.contentType === "metadata");
598
+ let cues = state.cues;
599
+ if (isCueTrack) {
600
+ const request = [...state.scheduling.inflight.values()].find((r) => r.trackId === msg.trackId && r.seq === msg.seq);
601
+ if ((request === null || request === void 0 ? void 0 : request.segmentStart) !== void 0) {
602
+ var _cues$get2, _request$segmentDurat;
603
+ const next = new Map(cues);
604
+ next.set(msg.trackId, mergeCoverage((_cues$get2 = cues.get(msg.trackId)) !== null && _cues$get2 !== void 0 ? _cues$get2 : [], {
605
+ start: request.segmentStart,
606
+ end: request.segmentStart + ((_request$segmentDurat = request.segmentDuration) !== null && _request$segmentDurat !== void 0 ? _request$segmentDurat : 0)
607
+ }));
608
+ cues = next;
609
+ }
610
+ }
611
+ const failEffects = [{
612
+ kind: "emit",
613
+ event: "error",
614
+ payload: {
615
+ category: msg.error.category,
616
+ code: msg.error.code,
617
+ fatal: isCueTrack ? false : msg.error.fatal,
618
+ recoverable: msg.error.recoverable,
619
+ trackId: msg.trackId,
620
+ seq: msg.seq,
621
+ status: (_msg$status2 = msg.status) !== null && _msg$status2 !== void 0 ? _msg$status2 : null
622
+ }
623
+ }];
624
+ if (!isCueTrack) failEffects.push({
625
+ kind: "schedule",
626
+ token: "kernel:retry",
627
+ delayMs: cfg.baseRetryDelayMs,
628
+ then: {
629
+ type: "TICK",
630
+ token: "kernel:retry"
631
+ }
632
+ });
633
+ return [_objectSpread2(_objectSpread2({}, state), {}, {
634
+ cues,
635
+ scheduling: _objectSpread2(_objectSpread2({}, state.scheduling), {}, { inflight })
636
+ }), failEffects];
637
+ }
638
+ case "SOURCEBUFFER_CREATED": {
639
+ const buffers = new Map(state.buffers);
640
+ buffers.set(msg.sbId, {
641
+ codecs: msg.codecs,
642
+ ranges: [],
643
+ pendingAppends: 0
644
+ });
645
+ return [_objectSpread2(_objectSpread2({}, state), {}, { buffers }), []];
646
+ }
647
+ case "SOURCEBUFFER_UPDATEEND": {
648
+ const buffer = state.buffers.get(msg.sbId);
649
+ if (buffer === void 0) return [state, []];
650
+ const buffers = new Map(state.buffers);
651
+ buffers.set(msg.sbId, _objectSpread2(_objectSpread2(_objectSpread2({}, buffer), msg.ranges !== void 0 ? { ranges: msg.ranges } : {}), {}, { pendingAppends: Math.max(0, buffer.pendingAppends - 1) }));
652
+ let bufferErrors = state.bufferErrors;
653
+ if (bufferErrors.has(msg.sbId)) {
654
+ bufferErrors = new Map(bufferErrors);
655
+ bufferErrors.delete(msg.sbId);
656
+ }
657
+ return driveScheduling(_objectSpread2(_objectSpread2({}, state), {}, {
658
+ buffers,
659
+ bufferErrors
660
+ }), hooks, cfg);
661
+ }
662
+ case "SOURCEBUFFER_ERROR": {
663
+ var _state$bufferErrors$g;
664
+ const count = ((_state$bufferErrors$g = state.bufferErrors.get(msg.sbId)) !== null && _state$bufferErrors$g !== void 0 ? _state$bufferErrors$g : 0) + 1;
665
+ const bufferErrors = new Map(state.bufferErrors);
666
+ bufferErrors.set(msg.sbId, count);
667
+ const fatal = msg.error.fatal || count >= cfg.bufferErrorLimit;
668
+ const phase = fatal ? "error" : state.lifecycle.phase;
669
+ const effects = [{
670
+ kind: "emit",
671
+ event: "error",
672
+ payload: _objectSpread2({
673
+ category: msg.error.category,
674
+ code: msg.error.code,
675
+ fatal,
676
+ recoverable: msg.error.recoverable,
677
+ sbId: msg.sbId
678
+ }, fatal && !msg.error.fatal ? { consecutiveFailures: count } : {})
679
+ }];
680
+ let inflight = state.scheduling.inflight;
681
+ if (fatal) {
682
+ const pruned = new Map(state.scheduling.inflight);
683
+ for (const [token, request] of state.scheduling.inflight) if (request.sbId === msg.sbId) {
684
+ effects.push({
685
+ kind: "abort",
686
+ token
687
+ });
688
+ pruned.delete(token);
689
+ }
690
+ inflight = pruned;
691
+ }
692
+ return [_objectSpread2(_objectSpread2({}, state), {}, {
693
+ bufferErrors,
694
+ lifecycle: { phase },
695
+ scheduling: _objectSpread2(_objectSpread2({}, state.scheduling), {}, { inflight })
696
+ }), effects];
697
+ }
698
+ case "QUOTA_EXCEEDED": {
699
+ const boundary = Math.max(0, state.playback.currentTime - cfg.backBufferSeconds);
700
+ if (boundary <= 0) return [state, [{
701
+ kind: "emit",
702
+ event: "quota:exhausted",
703
+ payload: { sbId: msg.sbId }
704
+ }]];
705
+ return [state, [{
706
+ kind: "remove",
707
+ sbId: msg.sbId,
708
+ start: 0,
709
+ end: boundary
710
+ }]];
711
+ }
712
+ case "TIME_UPDATE": return driveScheduling(_objectSpread2(_objectSpread2({}, state), {}, { playback: _objectSpread2(_objectSpread2({}, state.playback), {}, {
713
+ currentTime: msg.currentTime,
714
+ buffered: msg.buffered
715
+ }) }), hooks, cfg);
716
+ case "SEEKING": {
717
+ const phase = state.lifecycle.phase === "ended" ? "ready" : state.lifecycle.phase;
718
+ return [_objectSpread2(_objectSpread2({}, state), {}, {
719
+ lifecycle: { phase },
720
+ playback: _objectSpread2(_objectSpread2({}, state.playback), {}, {
721
+ currentTime: msg.to,
722
+ seeking: true
723
+ })
724
+ }), []];
725
+ }
726
+ case "SEEKED": return [_objectSpread2(_objectSpread2({}, state), {}, { playback: _objectSpread2(_objectSpread2({}, state.playback), {}, {
727
+ currentTime: msg.at,
728
+ seeking: false
729
+ }) }), []];
730
+ case "STALLED": return [state, [{
731
+ kind: "emit",
732
+ event: "playback:stalled",
733
+ payload: { at: msg.at }
734
+ }]];
735
+ case "ENCRYPTED": return [state, [{
736
+ kind: "emit",
737
+ event: "drm:encrypted",
738
+ payload: {
739
+ initDataType: msg.initDataType,
740
+ initData: msg.initData
741
+ }
742
+ }]];
743
+ case "LIVE_WINDOW_CHANGED": {
744
+ var _state$presentation2;
745
+ const firstWindow = state.live === null;
746
+ const withLive = _objectSpread2(_objectSpread2({}, state), {}, { live: {
747
+ span: {
748
+ start: msg.start,
749
+ end: msg.end
750
+ },
751
+ edge: msg.edge
752
+ } });
753
+ const spanEffects = [];
754
+ if (firstWindow && ((_state$presentation2 = state.presentation) === null || _state$presentation2 === void 0 ? void 0 : _state$presentation2.duration) === void 0) spanEffects.push({
755
+ kind: "setDuration",
756
+ seconds: Number.POSITIVE_INFINITY
757
+ });
758
+ spanEffects.push({
759
+ kind: "setLiveSeekableRange",
760
+ start: msg.start,
761
+ end: msg.end
762
+ });
763
+ if (firstWindow && msg.edge > state.playback.currentTime + 1) {
764
+ const [scheduled, effects] = driveScheduling(_objectSpread2(_objectSpread2({}, withLive), {}, { playback: _objectSpread2(_objectSpread2({}, withLive.playback), {}, { currentTime: msg.edge }) }), hooks, cfg);
765
+ return [scheduled, [
766
+ ...spanEffects,
767
+ {
768
+ kind: "seekElement",
769
+ to: msg.edge
770
+ },
771
+ ...effects
772
+ ]];
773
+ }
774
+ const [scheduled, effects] = driveScheduling(withLive, hooks, cfg);
775
+ return [scheduled, [...spanEffects, ...effects]];
776
+ }
777
+ case "TICK": return [state, []];
778
+ case "ENDED":
779
+ if (state.lifecycle.phase !== "ready") return [state, []];
780
+ return [_objectSpread2(_objectSpread2({}, state), {}, { lifecycle: { phase: "ended" } }), [{
781
+ kind: "emit",
782
+ event: "playback:ended",
783
+ payload: { at: msg.at }
784
+ }]];
785
+ case "THROUGHPUT_SAMPLE": return [_objectSpread2(_objectSpread2({}, state), {}, { stats: {
786
+ throughputEwma: ewma(state.stats.throughputEwma, msg.bps, cfg.ewmaAlpha),
787
+ throughputFastEwma: ewma(state.stats.throughputFastEwma, msg.bps, cfg.ewmaFastAlpha)
788
+ } }), []];
789
+ }
790
+ }
791
+ /**
792
+ * The buffer-goal loop, run on TIME_UPDATE. Pure: rendition choice comes
793
+ * from arbitration over state, buffer knowledge from the ranges snapshots
794
+ * the updateend facts carried into state. Live presentations wait for
795
+ * the live stages to supply availability bounds; until then nothing is
796
+ * scheduled.
797
+ */
798
+ function driveScheduling(state, hooks, cfg) {
799
+ var _state$live$span, _state$live;
800
+ if (state.lifecycle.phase !== "ready" || state.presentation === null) return [state, []];
801
+ if (state.presentation.isLive && state.live === null) return [state, []];
802
+ const effects = [];
803
+ const tracks = [];
804
+ const initFetches = [];
805
+ let quality = state.quality;
806
+ for (const contentType of ["video", "audio"]) {
807
+ var _state$buffers$get$pe, _state$buffers$get2, _state$buffers$get$ra2, _state$buffers$get3, _hooks$abr, _hooks$switchPolicy, _state$buffers$get4, _state$buffers$get$ra3, _state$buffers$get5;
808
+ const trackId = state.tracks.active.get(contentType);
809
+ if (trackId === void 0) continue;
810
+ const found = findTrackSite(state.presentation, trackId);
811
+ if (found === null || found.track.renditions.length === 0) continue;
812
+ const sbId = sbIdFor(contentType);
813
+ if (((_state$buffers$get$pe = (_state$buffers$get2 = state.buffers.get(sbId)) === null || _state$buffers$get2 === void 0 ? void 0 : _state$buffers$get2.pendingAppends) !== null && _state$buffers$get$pe !== void 0 ? _state$buffers$get$pe : 0) > 0) continue;
814
+ const bufferAhead = bufferedEndFrom((_state$buffers$get$ra2 = (_state$buffers$get3 = state.buffers.get(sbId)) === null || _state$buffers$get3 === void 0 ? void 0 : _state$buffers$get3.ranges) !== null && _state$buffers$get$ra2 !== void 0 ? _state$buffers$get$ra2 : [], state.playback.currentTime, GAP_TOLERANCE) - state.playback.currentTime;
815
+ const memoKey = hooks.abr == null ? state.quality.version : `${state.quality.version}:${Math.round(state.stats.throughputEwma / 25e3)}:${Math.round(state.stats.throughputFastEwma / 25e3)}:${Math.round(bufferAhead)}:${state.quality.active}`;
816
+ const outcome = arbiterFor(hooks, contentType).run({
817
+ renditions: found.track.renditions,
818
+ constraints: state.quality.constraints,
819
+ pinned: state.quality.pinned,
820
+ current: state.quality.active,
821
+ couplings: state.presentation.couplings,
822
+ activeTracks: state.tracks.active,
823
+ availableGroups: availableGroups(state),
824
+ abr: (_hooks$abr = hooks.abr) !== null && _hooks$abr !== void 0 ? _hooks$abr : null,
825
+ telemetry: {
826
+ throughputEwma: state.stats.throughputEwma,
827
+ throughputFastEwma: state.stats.throughputFastEwma,
828
+ bufferAhead,
829
+ current: state.quality.active,
830
+ currentTime: state.playback.currentTime,
831
+ canSwitchTo: (_hooks$switchPolicy = hooks.switchPolicy) !== null && _hooks$switchPolicy !== void 0 ? _hooks$switchPolicy : canSwitchTo
832
+ }
833
+ }, memoKey);
834
+ for (const event of outcome.events) effects.push(event);
835
+ const rendition = found.track.renditions.find((r) => r.id === outcome.result.selected);
836
+ if (rendition === void 0) continue;
837
+ if (contentType === "video" && quality.active !== rendition.id) quality = _objectSpread2(_objectSpread2({}, quality), {}, { active: rendition.id });
838
+ const inflight = [];
839
+ for (const request of state.scheduling.inflight.values()) if (request.trackId === trackId) inflight.push(request);
840
+ if (!state.buffers.has(sbId) && inflight.length === 0) {
841
+ const codecs = rendition.codecs === null ? rendition.mimeType : `${rendition.mimeType}; codecs="${rendition.codecs}"`;
842
+ effects.push({
843
+ kind: "createSourceBuffer",
844
+ sbId,
845
+ codecs
846
+ });
847
+ }
848
+ if (rendition.init !== void 0 && ((_state$buffers$get4 = state.buffers.get(sbId)) === null || _state$buffers$get4 === void 0 ? void 0 : _state$buffers$get4.initFor) !== rendition.id && inflight.length === 0) {
849
+ initFetches.push({
850
+ trackId,
851
+ sbId,
852
+ rendition: rendition.id,
853
+ init: rendition.init
854
+ });
855
+ continue;
856
+ }
857
+ tracks.push({
858
+ trackId,
859
+ period: found.period,
860
+ rendition,
861
+ ranges: (_state$buffers$get$ra3 = (_state$buffers$get5 = state.buffers.get(sbId)) === null || _state$buffers$get5 === void 0 ? void 0 : _state$buffers$get5.ranges) !== null && _state$buffers$get$ra3 !== void 0 ? _state$buffers$get$ra3 : [],
862
+ sbId,
863
+ inflight
864
+ });
865
+ }
866
+ for (const contentType of ["text", "metadata"]) {
867
+ var _state$cues$get;
868
+ const trackId = state.tracks.active.get(contentType);
869
+ if (trackId === void 0) continue;
870
+ const found = findTrackSite(state.presentation, trackId);
871
+ const rendition = found === null || found === void 0 ? void 0 : found.track.renditions[0];
872
+ if (found === null || rendition === void 0) continue;
873
+ const inflight = [];
874
+ for (const request of state.scheduling.inflight.values()) if (request.trackId === trackId) inflight.push(request);
875
+ tracks.push({
876
+ trackId,
877
+ period: found.period,
878
+ rendition,
879
+ ranges: (_state$cues$get = state.cues.get(trackId)) !== null && _state$cues$get !== void 0 ? _state$cues$get : [],
880
+ inflight
881
+ });
882
+ }
883
+ const result = schedule({
884
+ currentTime: state.playback.currentTime,
885
+ bufferGoal: state.scheduling.bufferGoal,
886
+ tokenSeq: state.scheduling.tokenSeq + initFetches.length,
887
+ tracks,
888
+ liveWindow: state.presentation.isLive ? (_state$live$span = (_state$live = state.live) === null || _state$live === void 0 ? void 0 : _state$live.span) !== null && _state$live$span !== void 0 ? _state$live$span : null : null,
889
+ mediaTimeNormalized: cfg.mediaTimeNormalized
890
+ });
891
+ const decisionKey = [...initFetches.map((p) => `${p.trackId}:init:${p.rendition}`), ...result.requests.map((r) => {
892
+ var _r$renditionId;
893
+ return `${r.trackId}:${r.seq}:${(_r$renditionId = r.renditionId) !== null && _r$renditionId !== void 0 ? _r$renditionId : ""}`;
894
+ })].join("|");
895
+ let repeat = state.scheduling.repeat;
896
+ if (decisionKey !== "") {
897
+ repeat = repeat !== void 0 && repeat.key === decisionKey ? {
898
+ key: decisionKey,
899
+ count: repeat.count + 1
900
+ } : {
901
+ key: decisionKey,
902
+ count: 1
903
+ };
904
+ if (repeat.count > cfg.repeatFetchLimit) {
905
+ effects.push({
906
+ kind: "emit",
907
+ event: "error",
908
+ payload: {
909
+ category: "internal",
910
+ code: "INTERNAL_ASSERTION",
911
+ fatal: true,
912
+ recoverable: false,
913
+ context: {
914
+ reason: "the same fetch decision repeated without progress",
915
+ decisionKey
916
+ }
917
+ }
918
+ });
919
+ return [_objectSpread2(_objectSpread2({}, state), {}, {
920
+ quality,
921
+ lifecycle: { phase: "error" },
922
+ scheduling: _objectSpread2(_objectSpread2({}, state.scheduling), {}, { repeat })
923
+ }), effects];
924
+ }
925
+ }
926
+ let tokenSeq = state.scheduling.tokenSeq;
927
+ const inflight = new Map(state.scheduling.inflight);
928
+ for (const pending of initFetches) {
929
+ tokenSeq += 1;
930
+ const token = `t${tokenSeq}:${pending.trackId}:init`;
931
+ effects.push(_objectSpread2({
932
+ kind: "fetch",
933
+ token,
934
+ url: pending.init.url
935
+ }, pending.init.byteRange !== void 0 ? { range: pending.init.byteRange } : {}));
936
+ inflight.set(token, {
937
+ token,
938
+ trackId: pending.trackId,
939
+ seq: -1,
940
+ url: pending.init.url,
941
+ sbId: pending.sbId,
942
+ renditionId: pending.rendition
943
+ });
944
+ }
945
+ for (const effect of result.effects) effects.push(effect);
946
+ for (const request of result.requests) inflight.set(request.token, request);
947
+ const mediaTracks = tracks.filter((track) => track.sbId !== void 0);
948
+ if (state.presentation.duration !== void 0 && initFetches.length === 0 && result.effects.length === 0 && mediaTracks.length > 0 && mediaTracks.every((track) => {
949
+ var _state$presentation$d, _state$presentation3;
950
+ return bufferedEndFrom(track.ranges, state.playback.currentTime, .25) >= ((_state$presentation$d = (_state$presentation3 = state.presentation) === null || _state$presentation3 === void 0 ? void 0 : _state$presentation3.duration) !== null && _state$presentation$d !== void 0 ? _state$presentation$d : 0) - .5;
951
+ })) effects.push({ kind: "endOfStream" });
952
+ if (effects.length === 0 && quality === state.quality) return [state, []];
953
+ return [_objectSpread2(_objectSpread2({}, state), {}, {
954
+ quality,
955
+ scheduling: _objectSpread2(_objectSpread2({}, state.scheduling), {}, {
956
+ inflight,
957
+ tokenSeq: result.tokenSeq
958
+ }, repeat !== void 0 ? { repeat } : {})
959
+ }), effects];
960
+ }
961
+ const arbiters = /* @__PURE__ */ new WeakMap();
962
+ function arbiterFor(hooks, contentType) {
963
+ let pair = arbiters.get(hooks);
964
+ if (pair === void 0) {
965
+ pair = {
966
+ video: createArbiter(),
967
+ audio: createArbiter()
968
+ };
969
+ arbiters.set(hooks, pair);
970
+ }
971
+ return pair[contentType];
972
+ }
973
+ const COMMAND_TYPES = {
974
+ ATTACH: true,
975
+ DETACH: true,
976
+ LOAD: true,
977
+ UNLOAD: true,
978
+ SEEK: true,
979
+ SEEK_TO_LIVE_EDGE: true,
980
+ DESELECT_TRACK: true,
981
+ SELECT_TRACK: true,
982
+ PIN_RENDITION: true,
983
+ RELEASE_PIN: true,
984
+ CONSTRAIN: true,
985
+ RELEASE_CONSTRAINT: true,
986
+ SET_BUFFER_GOAL: true,
987
+ ABORT_INFLIGHT: true
988
+ };
989
+ function isCommand(msg) {
990
+ return msg.type in COMMAND_TYPES;
991
+ }
992
+ /**
993
+ * Builds the root reducer from the built-in kernel logic plus stage slices.
994
+ * A slice reducer receives its own slice (undefined on first run) and a
995
+ * read-only view of kernel state. A throwing slice reducer is contained: its
996
+ * slice keeps the previous value and an error event effect is emitted, so
997
+ * one broken stage cannot corrupt kernel state.
998
+ */
999
+ function createReducer(slices, config, hooks = {}) {
1000
+ const sliceList = slices ? [...slices] : [];
1001
+ const cfg = resolveConfig(config);
1002
+ const DRIVING_FACTS = /* @__PURE__ */ new Set([
1003
+ "MANIFEST_LOADED",
1004
+ "SEGMENT_LOADED",
1005
+ "SOURCEBUFFER_UPDATEEND",
1006
+ "SEEKING",
1007
+ "SEEKED",
1008
+ "LIVE_WINDOW_CHANGED",
1009
+ "TICK"
1010
+ ]);
1011
+ return (state, msg) => {
1012
+ const manifestRequest = !isCommand(msg) && msg.type === "SEGMENT_LOADED" ? manifestRequestFor(state, msg) : null;
1013
+ let [next, effects] = isCommand(msg) ? reduceCommand(state, msg, cfg, hooks) : reduceFact(state, msg, cfg, hooks);
1014
+ if (!isCommand(msg) && DRIVING_FACTS.has(msg.type)) {
1015
+ const [driven, driveEffects] = driveScheduling(next, hooks, cfg);
1016
+ next = driven;
1017
+ if (driveEffects.length > 0) effects = [...effects, ...driveEffects];
1018
+ }
1019
+ let claimed = manifestRequest === null;
1020
+ for (const [name, slice] of sliceList) try {
1021
+ const [sliceState, sliceEffects] = slice(next[name], msg, next);
1022
+ next = _objectSpread2(_objectSpread2({}, next), {}, { [name]: sliceState });
1023
+ if (sliceEffects.length > 0) {
1024
+ effects = [...effects, ...sliceEffects];
1025
+ if (sliceEffects.some((effect) => effect.kind !== "emit")) claimed = true;
1026
+ }
1027
+ } catch (err) {
1028
+ effects = [...effects, {
1029
+ kind: "emit",
1030
+ event: "kernel:slice-error",
1031
+ payload: {
1032
+ slice: name,
1033
+ message: String(err)
1034
+ }
1035
+ }];
1036
+ }
1037
+ if (!claimed && manifestRequest !== null && next.lifecycle.phase === "loading") {
1038
+ const [failed, failEffects] = failManifest(next, {
1039
+ category: "manifest",
1040
+ code: "MANIFEST_UNSUPPORTED",
1041
+ fatal: true,
1042
+ recoverable: false
1043
+ }, { url: manifestRequest.url });
1044
+ next = failed;
1045
+ effects = [...effects, ...failEffects];
1046
+ }
1047
+ return [next, effects];
1048
+ };
1049
+ }
1050
+ //#endregion
1051
+ export { DEFAULT_KERNEL_CONFIG, createReducer, initialState, isCommand, resolveConfig };