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,296 @@
1
+ import _objectSpread2 from "../../_virtual/_@oxc-project_runtime@0.147.0/helpers/esm/objectSpread2.js";
2
+ import { mergePlaylist, parseMediaPlaylist } from "../hls-cmaf/parse.js";
3
+ import { registerLiveNamespace } from "../live-shared.js";
4
+ //#region src/protocols/hls-live/index.ts
5
+ const REFRESH_TOKEN = "hls:live:refresh";
6
+ const TICK_TOKEN = "hls-live:reload";
7
+ const INITIAL = {
8
+ manifestUrl: null,
9
+ target: null,
10
+ companions: [],
11
+ round: 0,
12
+ tickPending: false,
13
+ inflight: null,
14
+ lastEndSeq: -1,
15
+ awaitingTarget: false
16
+ };
17
+ /**
18
+ * A two-hour DVR playlist is tens of kilobytes; reloading four of them every
19
+ * target duration saturates a slow link. The audio and text companions keep
20
+ * the full cadence because playback consumes them; the other video rungs
21
+ * only need to be fresh enough for a switch, which reloads the new target
22
+ * at once anyway.
23
+ */
24
+ const LADDER_EVERY = 3;
25
+ /**
26
+ * Every reload names its rendition in the token, the target's included. A
27
+ * response is merged into the rendition it was fetched for, never into
28
+ * whichever rendition is the target when it lands: a switch while a
29
+ * reload is in flight would otherwise file one rendition's segment URLs
30
+ * under another, and the scheduler would then append the wrong bytes under
31
+ * a matching rendition id, which no init guard can catch.
32
+ */
33
+ function refreshToken(renditionId) {
34
+ return `${REFRESH_TOKEN}:${renditionId}`;
35
+ }
36
+ function renditionOfToken(token) {
37
+ return token.startsWith(`${REFRESH_TOKEN}:`) ? token.slice(17) : null;
38
+ }
39
+ function findRendition(presentation, renditionId) {
40
+ for (const period of presentation.periods) for (const track of period.tracks) for (const rendition of track.renditions) if (rendition.id === renditionId) return rendition;
41
+ return null;
42
+ }
43
+ /**
44
+ * The active tracks' playlists other than the window rendition's: every
45
+ * other video rendition, the audio group rendition, a segmented subtitle
46
+ * playlist. The whole video ladder reloads because a switch can only land
47
+ * on a rendition whose playlist reaches the playhead; one left at its
48
+ * startup window can never be scheduled from, so the switch never happens.
49
+ * Renditions without a playlist of their own (muxed audio, a text track in
50
+ * a single file) need no reload.
51
+ */
52
+ function companionTargets(presentation, kernel, windowRenditionId) {
53
+ const activeIds = new Set([
54
+ "video",
55
+ "audio",
56
+ "text"
57
+ ].map((contentType) => kernel.tracks.active.get(contentType)).filter((id) => id !== void 0));
58
+ const out = [];
59
+ for (const period of presentation.periods) for (const track of period.tracks) {
60
+ if (!activeIds.has(track.id)) continue;
61
+ for (const rendition of track.renditions) {
62
+ if (rendition.id === windowRenditionId || rendition.playlistUrl === void 0) continue;
63
+ out.push({
64
+ url: rendition.playlistUrl,
65
+ renditionId: rendition.id,
66
+ ladder: track.contentType === "video"
67
+ });
68
+ }
69
+ }
70
+ return out;
71
+ }
72
+ /** Loops a message back into the bus through a zero-delay schedule effect. */
73
+ function feed(message) {
74
+ return {
75
+ kind: "schedule",
76
+ token: "hls-live:loopback",
77
+ delayMs: 0,
78
+ then: message
79
+ };
80
+ }
81
+ function tick(delaySeconds) {
82
+ return {
83
+ kind: "schedule",
84
+ token: TICK_TOKEN,
85
+ delayMs: Math.max(500, delaySeconds * 1e3),
86
+ then: {
87
+ type: "TICK",
88
+ token: TICK_TOKEN
89
+ }
90
+ };
91
+ }
92
+ /**
93
+ * The rendition whose playlist drives the live window: the active video
94
+ * rendition, else the first with segments. Video leads, but an audio-only
95
+ * presentation (a radio or packed-audio DVR stream) has no video track, so
96
+ * audio drives the window there.
97
+ */
98
+ function windowRendition(presentation, kernel) {
99
+ let fallback = null;
100
+ for (const contentType of ["video", "audio"]) {
101
+ for (const period of presentation.periods) for (const track of period.tracks) {
102
+ if (track.contentType !== contentType) continue;
103
+ for (const rendition of track.renditions) {
104
+ var _fallback;
105
+ if (!Array.isArray(rendition.segments) || rendition.segments.length === 0) continue;
106
+ if (rendition.id === kernel.quality.active) return rendition;
107
+ fallback = (_fallback = fallback) !== null && _fallback !== void 0 ? _fallback : rendition;
108
+ }
109
+ }
110
+ if (fallback !== null) return fallback;
111
+ }
112
+ return fallback;
113
+ }
114
+ /**
115
+ * The window fact for the rendition's current segment list, or null when
116
+ * the kernel already holds exactly that window: every companion reload
117
+ * feeds a MANIFEST_LOADED, and a window that has not moved is not news.
118
+ */
119
+ function windowFact(presentation, rendition, kernel) {
120
+ var _presentation$live$ho, _presentation$live, _presentation$live$up, _presentation$live2;
121
+ const segments = rendition.segments;
122
+ if (!Array.isArray(segments) || segments.length === 0) return null;
123
+ const first = segments[0];
124
+ const last = segments[segments.length - 1];
125
+ if (first === void 0 || last === void 0) return null;
126
+ const end = last.start + last.duration;
127
+ const holdBack = (_presentation$live$ho = (_presentation$live = presentation.live) === null || _presentation$live === void 0 ? void 0 : _presentation$live.holdBack) !== null && _presentation$live$ho !== void 0 ? _presentation$live$ho : 3 * ((_presentation$live$up = (_presentation$live2 = presentation.live) === null || _presentation$live2 === void 0 ? void 0 : _presentation$live2.updatePeriod) !== null && _presentation$live$up !== void 0 ? _presentation$live$up : last.duration);
128
+ const start = first.start;
129
+ const edge = Math.max(start, end - holdBack);
130
+ const known = kernel.live;
131
+ if (known !== null && known.span.start === start && known.span.end === end && known.edge === edge) return null;
132
+ return feed({
133
+ type: "LIVE_WINDOW_CHANGED",
134
+ start,
135
+ end,
136
+ edge
137
+ });
138
+ }
139
+ /** The playlist URL a rendition's reload resolves against. */
140
+ function playlistUrlFor(presentation, renditionId, target) {
141
+ const rendition = findRendition(presentation, renditionId);
142
+ if ((rendition === null || rendition === void 0 ? void 0 : rendition.playlistUrl) !== void 0) return rendition.playlistUrl;
143
+ return target !== null && target.renditionId === renditionId ? target.url : null;
144
+ }
145
+ const reduceHlsLive = (slice, msg, kernel) => {
146
+ const state = slice !== null && slice !== void 0 ? slice : INITIAL;
147
+ if (msg.type === "LOAD") return [_objectSpread2(_objectSpread2({}, INITIAL), {}, { manifestUrl: msg.url }), []];
148
+ if (msg.type === "UNLOAD" || msg.type === "DETACH") return [INITIAL, []];
149
+ if (msg.type === "MANIFEST_LOADED") {
150
+ var _rendition$playlistUr, _rendition$id;
151
+ if (!msg.presentation.isLive) return [_objectSpread2(_objectSpread2({}, state), {}, {
152
+ target: null,
153
+ companions: [],
154
+ inflight: null
155
+ }), []];
156
+ const rendition = windowRendition(msg.presentation, kernel);
157
+ const effects = [];
158
+ const url = (_rendition$playlistUr = rendition === null || rendition === void 0 ? void 0 : rendition.playlistUrl) !== null && _rendition$playlistUr !== void 0 ? _rendition$playlistUr : state.manifestUrl;
159
+ const target = url !== null && rendition !== null ? {
160
+ url,
161
+ renditionId: rendition.id,
162
+ ladder: false
163
+ } : state.target;
164
+ const companions = companionTargets(msg.presentation, kernel, (_rendition$id = rendition === null || rendition === void 0 ? void 0 : rendition.id) !== null && _rendition$id !== void 0 ? _rendition$id : null);
165
+ const switched = state.target !== null && target !== null && target.renditionId !== state.target.renditionId;
166
+ let awaitingTarget = state.awaitingTarget;
167
+ let inflight = state.inflight;
168
+ if (switched && target !== null) {
169
+ if (inflight !== target.renditionId) {
170
+ effects.push({
171
+ kind: "fetch",
172
+ token: refreshToken(target.renditionId),
173
+ url: target.url
174
+ });
175
+ inflight = target.renditionId;
176
+ }
177
+ awaitingTarget = true;
178
+ } else if (!awaitingTarget && rendition !== null) {
179
+ const window = windowFact(msg.presentation, rendition, kernel);
180
+ if (window !== null) effects.push(window);
181
+ }
182
+ let tickPending = state.tickPending;
183
+ if (!tickPending && inflight === null && target !== null) {
184
+ var _msg$presentation$liv, _msg$presentation$liv2;
185
+ effects.push(tick((_msg$presentation$liv = (_msg$presentation$liv2 = msg.presentation.live) === null || _msg$presentation$liv2 === void 0 ? void 0 : _msg$presentation$liv2.updatePeriod) !== null && _msg$presentation$liv !== void 0 ? _msg$presentation$liv : 4));
186
+ tickPending = true;
187
+ }
188
+ return [_objectSpread2(_objectSpread2({}, state), {}, {
189
+ target,
190
+ companions,
191
+ tickPending,
192
+ inflight,
193
+ awaitingTarget
194
+ }), effects];
195
+ }
196
+ if (msg.type === "TICK" && msg.token === TICK_TOKEN) {
197
+ var _kernel$presentation;
198
+ if (state.target === null || ((_kernel$presentation = kernel.presentation) === null || _kernel$presentation === void 0 ? void 0 : _kernel$presentation.isLive) !== true) return [_objectSpread2(_objectSpread2({}, state), {}, {
199
+ tickPending: false,
200
+ inflight: null
201
+ }), []];
202
+ const effects = [];
203
+ let inflight = state.inflight;
204
+ if (inflight !== state.target.renditionId) {
205
+ effects.push({
206
+ kind: "fetch",
207
+ token: refreshToken(state.target.renditionId),
208
+ url: state.target.url
209
+ });
210
+ inflight = state.target.renditionId;
211
+ }
212
+ for (const companion of state.companions) {
213
+ if (companion.ladder && state.round % LADDER_EVERY !== 0) continue;
214
+ effects.push({
215
+ kind: "fetch",
216
+ token: refreshToken(companion.renditionId),
217
+ url: companion.url
218
+ });
219
+ }
220
+ return [_objectSpread2(_objectSpread2({}, state), {}, {
221
+ round: state.round + 1,
222
+ tickPending: false,
223
+ inflight
224
+ }), effects];
225
+ }
226
+ if (msg.type === "SEGMENT_FAILED") {
227
+ const renditionId = renditionOfToken(msg.trackId);
228
+ if (renditionId === null) return [state, []];
229
+ if (state.target === null || renditionId !== state.target.renditionId) return [state, []];
230
+ if (state.tickPending) return [_objectSpread2(_objectSpread2({}, state), {}, { inflight: null }), []];
231
+ return [_objectSpread2(_objectSpread2({}, state), {}, {
232
+ inflight: null,
233
+ tickPending: true
234
+ }), [tick(2)]];
235
+ }
236
+ if (msg.type === "SEGMENT_LOADED") {
237
+ var _lastSegment$seq;
238
+ const renditionId = renditionOfToken(msg.trackId);
239
+ if (renditionId === null || kernel.presentation === null) return [state, []];
240
+ const isTarget = state.target !== null && renditionId === state.target.renditionId;
241
+ const url = playlistUrlFor(kernel.presentation, renditionId, state.target);
242
+ if (url === null) return [state, []];
243
+ const text = new TextDecoder().decode(msg.bytes);
244
+ const media = parseMediaPlaylist(text, url);
245
+ if (media.playlist === null) {
246
+ if (!isTarget) return [state, []];
247
+ if (state.tickPending) return [_objectSpread2(_objectSpread2({}, state), {}, { inflight: null }), []];
248
+ return [_objectSpread2(_objectSpread2({}, state), {}, {
249
+ inflight: null,
250
+ tickPending: true
251
+ }), [tick(2)]];
252
+ }
253
+ const refreshed = mergePlaylist(kernel.presentation, renditionId, media.playlist);
254
+ const effects = [feed({
255
+ type: "PLAYLIST_REFRESHED",
256
+ trackId: renditionId,
257
+ renditionId,
258
+ mediaSequence: media.playlist.mediaSequence,
259
+ segments: media.playlist.segments
260
+ }), feed({
261
+ type: "MANIFEST_LOADED",
262
+ presentation: refreshed
263
+ })];
264
+ if (!isTarget) return [state, effects];
265
+ const lastSegment = media.playlist.segments[media.playlist.segments.length - 1];
266
+ const endSeq = (_lastSegment$seq = lastSegment === null || lastSegment === void 0 ? void 0 : lastSegment.seq) !== null && _lastSegment$seq !== void 0 ? _lastSegment$seq : -1;
267
+ const changed = endSeq !== state.lastEndSeq;
268
+ const cadence = media.playlist.targetDuration || 4;
269
+ let tickPending = state.tickPending;
270
+ if (!media.playlist.endlist && !tickPending) {
271
+ effects.push(tick(changed ? cadence : cadence / 2));
272
+ tickPending = true;
273
+ }
274
+ return [_objectSpread2(_objectSpread2({}, state), {}, {
275
+ lastEndSeq: endSeq,
276
+ tickPending,
277
+ inflight: null,
278
+ awaitingTarget: false
279
+ }), effects];
280
+ }
281
+ return [state, []];
282
+ };
283
+ /** The stage factory. Requires hls-cmaf; the loader enforces it. */
284
+ function hlsLive() {
285
+ return {
286
+ name: "hls-live",
287
+ provides: ["hls-live"],
288
+ requires: ["hls-cmaf"],
289
+ install(ctx) {
290
+ ctx.reduce("hls-live", reduceHlsLive);
291
+ registerLiveNamespace(ctx);
292
+ }
293
+ };
294
+ }
295
+ //#endregion
296
+ export { hlsLive as default };
@@ -0,0 +1,29 @@
1
+ //#region src/protocols/live-shared.ts
2
+ /** How far behind the edge still counts as at it, in seconds. */
3
+ const AT_EDGE_SLACK = 2;
4
+ function registerLiveNamespace(ctx) {
5
+ const api = {
6
+ get edge() {
7
+ var _ctx$getState$live$ed, _ctx$getState$live;
8
+ return (_ctx$getState$live$ed = (_ctx$getState$live = ctx.getState().live) === null || _ctx$getState$live === void 0 ? void 0 : _ctx$getState$live.edge) !== null && _ctx$getState$live$ed !== void 0 ? _ctx$getState$live$ed : null;
9
+ },
10
+ get latency() {
11
+ const state = ctx.getState();
12
+ if (state.live === null) return null;
13
+ return state.live.span.end - state.playback.currentTime;
14
+ },
15
+ get atEdge() {
16
+ const state = ctx.getState();
17
+ if (state.live === null) return false;
18
+ return state.playback.currentTime >= state.live.edge - AT_EDGE_SLACK;
19
+ },
20
+ seekToEdge() {
21
+ ctx.dispatch({ type: "SEEK_TO_LIVE_EDGE" });
22
+ }
23
+ };
24
+ try {
25
+ ctx.registerNamespace("live", api);
26
+ } catch (_unused) {}
27
+ }
28
+ //#endregion
29
+ export { registerLiveNamespace };
@@ -0,0 +1,126 @@
1
+ import _objectSpread2 from "../../_virtual/_@oxc-project_runtime@0.147.0/helpers/esm/objectSpread2.js";
2
+ import { canSwitchTo } from "../../kernel/rendition-select.js";
3
+ //#region src/stages/abr/index.ts
4
+ /**
5
+ * Adaptive bitrate as a stage, not kernel. It registers one chooser
6
+ * consulted at arbitration step 5 and one constraint source for
7
+ * emergencies; it never mutates another source's constraints and playback
8
+ * works identically without it, at the lowest permitted rendition.
9
+ *
10
+ * The chooser is a pure function of its arguments: every input comes from
11
+ * kernel telemetry, so replaying a trace through the same composition
12
+ * reproduces every decision. The emergency path lives in a slice reducer
13
+ * for the same reason.
14
+ */
15
+ const DEFAULTS = {
16
+ safetyFactor: .7,
17
+ upBufferSeconds: 8,
18
+ downBufferSeconds: 4,
19
+ emergencyFactor: .5,
20
+ recoveryFactor: 2
21
+ };
22
+ /** The conservative estimate: the minimum of the slow and fast EWMAs. */
23
+ function estimateBps(telemetry) {
24
+ var _telemetry$throughput;
25
+ const slow = telemetry.throughputEwma;
26
+ const fast = (_telemetry$throughput = telemetry.throughputFastEwma) !== null && _telemetry$throughput !== void 0 ? _telemetry$throughput : slow;
27
+ if (slow === 0) return fast;
28
+ if (fast === 0) return slow;
29
+ return Math.min(slow, fast);
30
+ }
31
+ function choose(allowed, telemetry, options) {
32
+ var _allowed$find, _telemetry$bufferAhea, _telemetry$canSwitchT;
33
+ const sorted = [...allowed].sort((a, b) => a.bitrate - b.bitrate);
34
+ const lowestRendition = sorted[0];
35
+ const current = (_allowed$find = allowed.find((r) => r.id === telemetry.current)) !== null && _allowed$find !== void 0 ? _allowed$find : null;
36
+ const estimate = estimateBps(telemetry);
37
+ if (estimate === 0) return (current !== null && current !== void 0 ? current : lowestRendition).id;
38
+ let best = lowestRendition;
39
+ for (const candidate of sorted) if (candidate.bitrate <= estimate * options.safetyFactor) best = candidate;
40
+ if (current === null) return best.id;
41
+ if (best.id === current.id) return current.id;
42
+ const buffer = (_telemetry$bufferAhea = telemetry.bufferAhead) !== null && _telemetry$bufferAhea !== void 0 ? _telemetry$bufferAhea : 0;
43
+ const policy = (_telemetry$canSwitchT = telemetry.canSwitchTo) !== null && _telemetry$canSwitchT !== void 0 ? _telemetry$canSwitchT : canSwitchTo;
44
+ if (best.bitrate > current.bitrate) {
45
+ if (buffer < options.upBufferSeconds) return current.id;
46
+ if (policy(current, best) === "reload") return current.id;
47
+ return best.id;
48
+ }
49
+ if (buffer < options.downBufferSeconds || current.bitrate > estimate) {
50
+ if (policy(current, best) === "reload") return current.id;
51
+ return best.id;
52
+ }
53
+ return current.id;
54
+ }
55
+ const INITIAL = { emergencyCap: null };
56
+ /** Loops a command back into the bus through a zero-delay schedule effect. */
57
+ function feed(message) {
58
+ return {
59
+ kind: "schedule",
60
+ token: "abr:emergency",
61
+ delayMs: 0,
62
+ then: message
63
+ };
64
+ }
65
+ function activeBitrate(kernel) {
66
+ if (kernel.presentation === null || kernel.quality.active === null) return null;
67
+ for (const period of kernel.presentation.periods) for (const track of period.tracks) for (const rendition of track.renditions) if (rendition.id === kernel.quality.active) return rendition.bitrate;
68
+ return null;
69
+ }
70
+ /** The track ABR steers: video where there is one, else audio. */
71
+ function leadTrack(kernel) {
72
+ var _kernel$tracks$active;
73
+ return (_kernel$tracks$active = kernel.tracks.active.get("video")) !== null && _kernel$tracks$active !== void 0 ? _kernel$tracks$active : kernel.tracks.active.get("audio");
74
+ }
75
+ function lowestBitrate(kernel) {
76
+ var _kernel$presentation$, _kernel$presentation;
77
+ let lowest = Number.POSITIVE_INFINITY;
78
+ for (const period of (_kernel$presentation$ = (_kernel$presentation = kernel.presentation) === null || _kernel$presentation === void 0 ? void 0 : _kernel$presentation.periods) !== null && _kernel$presentation$ !== void 0 ? _kernel$presentation$ : []) for (const track of period.tracks) {
79
+ if (track.contentType !== "video") continue;
80
+ for (const rendition of track.renditions) lowest = Math.min(lowest, rendition.bitrate);
81
+ }
82
+ return Number.isFinite(lowest) ? lowest : 0;
83
+ }
84
+ /** Samples smaller than this are jitter-dominated; ignore them for emergencies. */
85
+ const MIN_SAMPLE_BYTES = 1e4;
86
+ function createEmergencyReducer(options) {
87
+ return (slice, msg, kernel) => {
88
+ const state = slice !== null && slice !== void 0 ? slice : INITIAL;
89
+ if (msg.type === "UNLOAD" || msg.type === "DETACH") return [INITIAL, []];
90
+ let raw = null;
91
+ if (msg.type === "THROUGHPUT_SAMPLE") raw = msg.bps;
92
+ else if (msg.type === "SEGMENT_LOADED" && msg.seq >= 0 && msg.trackId === leadTrack(kernel) && msg.rtt > 0 && msg.size >= MIN_SAMPLE_BYTES) raw = msg.size * 8e3 / msg.rtt;
93
+ if (raw === null) return [state, []];
94
+ if (state.emergencyCap === null) {
95
+ const bitrate = activeBitrate(kernel);
96
+ if (bitrate === null || bitrate === 0) return [state, []];
97
+ if (raw >= bitrate * options.emergencyFactor) return [state, []];
98
+ const cap = Math.max(raw, lowestBitrate(kernel));
99
+ return [{ emergencyCap: cap }, [feed({
100
+ type: "CONSTRAIN",
101
+ source: "abr-emergency",
102
+ constraint: { maxBitrate: cap }
103
+ })]];
104
+ }
105
+ if (kernel.stats.throughputFastEwma >= state.emergencyCap * options.recoveryFactor) return [INITIAL, [feed({
106
+ type: "RELEASE_CONSTRAINT",
107
+ source: "abr-emergency"
108
+ })]];
109
+ return [state, []];
110
+ };
111
+ }
112
+ /** The stage factory. One chooser, one emergency constraint source. */
113
+ function abr(options) {
114
+ const resolved = _objectSpread2(_objectSpread2({}, DEFAULTS), options);
115
+ return {
116
+ name: "abr",
117
+ provides: ["abr"],
118
+ requires: ["scheduler", "track-registry"],
119
+ install(ctx) {
120
+ ctx.registerChooser({ choose: (allowed, telemetry) => choose(allowed, telemetry, resolved) });
121
+ ctx.reduce("abr", createEmergencyReducer(resolved));
122
+ }
123
+ };
124
+ }
125
+ //#endregion
126
+ export { abr as default };
@@ -0,0 +1,22 @@
1
+ //#region src/stages/abr-cap-size/index.ts
2
+ function abrCapSize() {
3
+ return {
4
+ name: "abr-cap-size",
5
+ requires: ["rendition-select"],
6
+ install(ctx) {
7
+ const observer = new ResizeObserver(([entry]) => {
8
+ if (entry === void 0) return;
9
+ const dpr = Math.min(globalThis.devicePixelRatio || 1, 2);
10
+ ctx.dispatch({
11
+ type: "CONSTRAIN",
12
+ source: "element-size",
13
+ constraint: { maxHeight: entry.contentRect.height * dpr }
14
+ });
15
+ });
16
+ observer.observe(ctx.element);
17
+ return () => observer.disconnect();
18
+ }
19
+ };
20
+ }
21
+ //#endregion
22
+ export { abrCapSize as default };
@@ -0,0 +1,52 @@
1
+ import _objectSpread2 from "../../_virtual/_@oxc-project_runtime@0.147.0/helpers/esm/objectSpread2.js";
2
+ //#region src/stages/abr-persist/index.ts
3
+ const INITIAL = {
4
+ seeded: false,
5
+ lastSaved: 0
6
+ };
7
+ const SAVE_EVENT = "abr-persist:save";
8
+ /** Relative drift that triggers a save. */
9
+ const DRIFT = .2;
10
+ function abrPersist(storage) {
11
+ return {
12
+ name: "abr-persist",
13
+ requires: ["abr"],
14
+ install(ctx) {
15
+ const remembered = storage.get();
16
+ const reduce = (slice, msg, kernel) => {
17
+ const state = slice !== null && slice !== void 0 ? slice : INITIAL;
18
+ if (msg.type === "LOAD" && !state.seeded && remembered !== null && remembered > 0) {
19
+ const effects = [{
20
+ kind: "schedule",
21
+ token: "abr-persist:seed",
22
+ delayMs: 0,
23
+ then: {
24
+ type: "THROUGHPUT_SAMPLE",
25
+ bps: remembered,
26
+ trackId: "abr-persist"
27
+ }
28
+ }];
29
+ return [_objectSpread2(_objectSpread2({}, state), {}, {
30
+ seeded: true,
31
+ lastSaved: remembered
32
+ }), effects];
33
+ }
34
+ if (msg.type === "SEGMENT_LOADED") {
35
+ const current = kernel.stats.throughputEwma;
36
+ if (current > 0 && Math.abs(current - state.lastSaved) > state.lastSaved * DRIFT) return [_objectSpread2(_objectSpread2({}, state), {}, { lastSaved: current }), [{
37
+ kind: "emit",
38
+ event: SAVE_EVENT,
39
+ payload: current
40
+ }]];
41
+ }
42
+ return [state, []];
43
+ };
44
+ ctx.reduce("abr-persist", reduce);
45
+ return ctx.on(SAVE_EVENT, (bps) => {
46
+ if (typeof bps === "number") storage.set(Math.round(bps));
47
+ });
48
+ }
49
+ };
50
+ }
51
+ //#endregion
52
+ export { abrPersist as default };
@@ -0,0 +1,76 @@
1
+ import _asyncToGenerator from "../../_virtual/_@oxc-project_runtime@0.147.0/helpers/esm/asyncToGenerator.js";
2
+ //#region src/stages/aes-128/index.ts
3
+ /** Before the transmux (100) and the codec probe (5), which must read clear bytes. */
4
+ const DECRYPT_ORDER = 1;
5
+ /** The 16-byte IV: the explicit hex one, or the sequence number big-endian. */
6
+ function ivFor(key, seq) {
7
+ const iv = /* @__PURE__ */ new Uint8Array(16);
8
+ if (key.iv !== void 0) {
9
+ const hex = key.iv.slice(-32).padStart(32, "0");
10
+ for (let i = 0; i < 16; i += 1) iv[i] = Number.parseInt(hex.slice(i * 2, i * 2 + 2), 16);
11
+ return iv;
12
+ }
13
+ const view = new DataView(iv.buffer);
14
+ view.setUint32(8, Math.floor(seq / Math.pow(2, 32)));
15
+ view.setUint32(12, seq >>> 0);
16
+ return iv;
17
+ }
18
+ function findSegment(state, renditionId, seq) {
19
+ if (state.presentation === null || renditionId === "") return null;
20
+ for (const period of state.presentation.periods) for (const track of period.tracks) for (const rendition of track.renditions) {
21
+ var _rendition$segments$f;
22
+ if (rendition.id !== renditionId || !Array.isArray(rendition.segments)) continue;
23
+ return (_rendition$segments$f = rendition.segments.find((segment) => segment.seq === seq)) !== null && _rendition$segments$f !== void 0 ? _rendition$segments$f : null;
24
+ }
25
+ return null;
26
+ }
27
+ function aes128() {
28
+ return {
29
+ name: "aes-128",
30
+ provides: ["aes-128", "media-transform"],
31
+ install(ctx) {
32
+ const keys = /* @__PURE__ */ new Map();
33
+ function keyFor(uri) {
34
+ let pending = keys.get(uri);
35
+ if (pending === void 0) {
36
+ pending = ctx.request(uri, {}).then(function() {
37
+ var _ref = _asyncToGenerator(function* (response) {
38
+ if (!response.ok) throw new Error(`key fetch failed: HTTP ${response.status}`);
39
+ const raw = yield response.arrayBuffer();
40
+ if (raw.byteLength !== 16) throw new Error(`key is ${raw.byteLength} bytes, not 16`);
41
+ return crypto.subtle.importKey("raw", raw, { name: "AES-CBC" }, false, ["decrypt"]);
42
+ });
43
+ return function(_x) {
44
+ return _ref.apply(this, arguments);
45
+ };
46
+ }()).catch((err) => {
47
+ keys.delete(uri);
48
+ throw err;
49
+ });
50
+ keys.set(uri, pending);
51
+ }
52
+ return pending;
53
+ }
54
+ ctx.registerTransform({
55
+ name: "aes-128",
56
+ order: DECRYPT_ORDER,
57
+ transform(data, meta) {
58
+ return _asyncToGenerator(function* () {
59
+ const segment = findSegment(ctx.getState(), meta.renditionId, meta.seq);
60
+ const key = segment === null || segment === void 0 ? void 0 : segment.key;
61
+ if (key === void 0) return data;
62
+ const cryptoKey = yield keyFor(key.uri);
63
+ const clear = yield crypto.subtle.decrypt({
64
+ name: "AES-CBC",
65
+ iv: ivFor(key, meta.seq)
66
+ }, cryptoKey, data);
67
+ return new Uint8Array(clear);
68
+ })();
69
+ }
70
+ });
71
+ return () => keys.clear();
72
+ }
73
+ };
74
+ }
75
+ //#endregion
76
+ export { aes128 as default, ivFor };
@@ -0,0 +1,80 @@
1
+ //#region src/stages/alt-audio/index.ts
2
+ const INITIAL = { preferredLang: null };
3
+ /** Audio tracks with their group parsed from the `group:name` id convention. */
4
+ function audioTracks(kernel) {
5
+ var _kernel$presentation$, _kernel$presentation;
6
+ const out = [];
7
+ for (const period of (_kernel$presentation$ = (_kernel$presentation = kernel.presentation) === null || _kernel$presentation === void 0 ? void 0 : _kernel$presentation.periods) !== null && _kernel$presentation$ !== void 0 ? _kernel$presentation$ : []) for (const track of period.tracks) {
8
+ var _track$lang;
9
+ if (track.contentType !== "audio") continue;
10
+ const colon = track.id.indexOf(":");
11
+ out.push({
12
+ id: track.id,
13
+ group: colon === -1 ? track.id : track.id.slice(0, colon),
14
+ lang: (_track$lang = track.lang) !== null && _track$lang !== void 0 ? _track$lang : null,
15
+ isDefault: track.role === "main"
16
+ });
17
+ }
18
+ return out;
19
+ }
20
+ /** The audio group the active video rendition's coupling requires, or null. */
21
+ function requiredGroup(kernel) {
22
+ var _kernel$presentation2, _coupling$requires$au;
23
+ const activeVideo = kernel.quality.active;
24
+ if (activeVideo === null) return null;
25
+ const coupling = (_kernel$presentation2 = kernel.presentation) === null || _kernel$presentation2 === void 0 ? void 0 : _kernel$presentation2.couplings.find((c) => c.renditionId === activeVideo);
26
+ return (_coupling$requires$au = coupling === null || coupling === void 0 ? void 0 : coupling.requires.audio) !== null && _coupling$requires$au !== void 0 ? _coupling$requires$au : null;
27
+ }
28
+ /** Picks the audio track in `group`, preferring a language, then default, then first. */
29
+ function pickInGroup(tracks, group, preferredLang) {
30
+ var _ref, _ref2;
31
+ const inGroup = tracks.filter((t) => t.group === group);
32
+ if (inGroup.length === 0) return null;
33
+ return (_ref = (_ref2 = preferredLang !== null ? inGroup.find((t) => t.lang === preferredLang) : void 0) !== null && _ref2 !== void 0 ? _ref2 : inGroup.find((t) => t.isDefault)) !== null && _ref !== void 0 ? _ref : inGroup[0];
34
+ }
35
+ /** Loops a command back into the bus through a zero-delay schedule effect. */
36
+ function select(trackId) {
37
+ return {
38
+ kind: "schedule",
39
+ token: "alt-audio:select",
40
+ delayMs: 0,
41
+ then: {
42
+ type: "SELECT_TRACK",
43
+ trackId
44
+ }
45
+ };
46
+ }
47
+ const reduceAltAudio = (slice, msg, kernel) => {
48
+ const state = slice !== null && slice !== void 0 ? slice : INITIAL;
49
+ if (msg.type === "LOAD" || msg.type === "UNLOAD" || msg.type === "DETACH") return [INITIAL, []];
50
+ if (msg.type === "SELECT_TRACK") {
51
+ const chosen = audioTracks(kernel).find((t) => t.id === msg.trackId);
52
+ if ((chosen === null || chosen === void 0 ? void 0 : chosen.lang) != null) return [{ preferredLang: chosen.lang }, []];
53
+ return [state, []];
54
+ }
55
+ if (msg.type === "MANIFEST_LOADED" || msg.type === "SEGMENT_LOADED") {
56
+ const group = requiredGroup(kernel);
57
+ if (group === null) return [state, []];
58
+ const active = kernel.tracks.active.get("audio");
59
+ const tracks = audioTracks(kernel);
60
+ const activeInfo = tracks.find((t) => t.id === active);
61
+ if (activeInfo !== void 0 && activeInfo.group === group) return [state, []];
62
+ const target = pickInGroup(tracks, group, state.preferredLang);
63
+ if (target === void 0 || target === null || target.id === active) return [state, []];
64
+ return [state, [select(target.id)]];
65
+ }
66
+ return [state, []];
67
+ };
68
+ /** The stage factory. */
69
+ function altAudio() {
70
+ return {
71
+ name: "alt-audio",
72
+ provides: ["alt-audio"],
73
+ requires: ["scheduler", "codec-switch"],
74
+ install(ctx) {
75
+ ctx.reduce("alt-audio", reduceAltAudio);
76
+ }
77
+ };
78
+ }
79
+ //#endregion
80
+ export { altAudio as default };