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,44 @@
1
+ const INITIAL = { seeded: false, lastSaved: 0 };
2
+ const SAVE_EVENT = 'abr-persist:save';
3
+ /** Relative drift that triggers a save. */
4
+ const DRIFT = 0.2;
5
+ export default function abrPersist(storage) {
6
+ return {
7
+ name: 'abr-persist',
8
+ requires: ['abr'],
9
+ install(ctx) {
10
+ const remembered = storage.get();
11
+ const reduce = (slice, msg, kernel) => {
12
+ const state = slice ?? INITIAL;
13
+ if (msg.type === 'LOAD' && !state.seeded && remembered !== null && remembered > 0) {
14
+ const effects = [
15
+ {
16
+ kind: 'schedule',
17
+ token: 'abr-persist:seed',
18
+ delayMs: 0,
19
+ // biome-ignore lint/suspicious/noThenProperty: `then` is the schedule effect's field name from the message taxonomy
20
+ then: { type: 'THROUGHPUT_SAMPLE', bps: remembered, trackId: 'abr-persist' },
21
+ },
22
+ ];
23
+ return [{ ...state, seeded: true, lastSaved: remembered }, effects];
24
+ }
25
+ if (msg.type === 'SEGMENT_LOADED') {
26
+ const current = kernel.stats.throughputEwma;
27
+ if (current > 0 && Math.abs(current - state.lastSaved) > state.lastSaved * DRIFT) {
28
+ return [
29
+ { ...state, lastSaved: current },
30
+ [{ kind: 'emit', event: SAVE_EVENT, payload: current }],
31
+ ];
32
+ }
33
+ }
34
+ return [state, []];
35
+ };
36
+ ctx.reduce('abr-persist', reduce);
37
+ return ctx.on(SAVE_EVENT, (bps) => {
38
+ if (typeof bps === 'number')
39
+ storage.set(Math.round(bps));
40
+ });
41
+ },
42
+ };
43
+ }
44
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/stages/abr-persist/index.ts"],"names":[],"mappings":"AA0BA,MAAM,OAAO,GAAiB,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;AAE9D,MAAM,UAAU,GAAG,kBAAkB,CAAC;AAEtC,2CAA2C;AAC3C,MAAM,KAAK,GAAG,GAAG,CAAC;AAElB,MAAM,CAAC,OAAO,UAAU,UAAU,CAAC,OAA0B;IAC3D,OAAO;QACL,IAAI,EAAE,aAAa;QACnB,QAAQ,EAAE,CAAC,KAAK,CAAC;QACjB,OAAO,CAAC,GAAG;YACT,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;YACjC,MAAM,MAAM,GAA+B,CAAC,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE;gBAChE,MAAM,KAAK,GAAG,KAAK,IAAI,OAAO,CAAC;gBAC/B,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,UAAU,KAAK,IAAI,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;oBAClF,MAAM,OAAO,GAAa;wBACxB;4BACE,IAAI,EAAE,UAAU;4BAChB,KAAK,EAAE,kBAAkB;4BACzB,OAAO,EAAE,CAAC;4BACV,oHAAoH;4BACpH,IAAI,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,GAAG,EAAE,UAAU,EAAE,OAAO,EAAE,aAAa,EAAE;yBAC7E;qBACF,CAAC;oBACF,OAAO,CAAC,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,EAAE,OAAO,CAAC,CAAC;gBACtE,CAAC;gBACD,IAAI,GAAG,CAAC,IAAI,KAAK,gBAAgB,EAAE,CAAC;oBAClC,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC;oBAC5C,IAAI,OAAO,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,GAAG,KAAK,CAAC,SAAS,CAAC,GAAG,KAAK,CAAC,SAAS,GAAG,KAAK,EAAE,CAAC;wBACjF,OAAO;4BACL,EAAE,GAAG,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE;4BAChC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;yBACxD,CAAC;oBACJ,CAAC;gBACH,CAAC;gBACD,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YACrB,CAAC,CAAC;YACF,GAAG,CAAC,MAAM,CAAC,aAAa,EAAE,MAAsB,CAAC,CAAC;YAClD,OAAO,GAAG,CAAC,EAAE,CAAC,UAAU,EAAE,CAAC,GAAG,EAAE,EAAE;gBAChC,IAAI,OAAO,GAAG,KAAK,QAAQ;oBAAE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;YAC5D,CAAC,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * aes-128 as a stage: full-segment AES-CBC decryption for HLS EXT-X-KEY
3
+ * METHOD=AES-128 (RFC 8216 §4.3.2.4). One transform step, ordered ahead of
4
+ * every container step, so the transmux and the probe only ever see clear
5
+ * bytes. Keys are fetched through the transport's request path and cached
6
+ * by URL; the IV is the playlist's or, absent one, the media sequence
7
+ * number. SAMPLE-AES is not this: it decrypts inside the elementary stream
8
+ * and stays deferred (docs/16).
9
+ */
10
+ import type { SegmentKey } from '../../types/ir.js';
11
+ import type { Stage } from '../../types/stage.js';
12
+ /** The 16-byte IV: the explicit hex one, or the sequence number big-endian. */
13
+ export declare function ivFor(key: SegmentKey, seq: number): Uint8Array;
14
+ export default function aes128(): Stage;
15
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/stages/aes-128/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,EAAW,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE7D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAKlD,+EAA+E;AAC/E,wBAAgB,KAAK,CAAC,GAAG,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,GAAG,UAAU,CAW9D;AAmBD,MAAM,CAAC,OAAO,UAAU,MAAM,IAAI,KAAK,CAiDtC"}
@@ -0,0 +1,78 @@
1
+ /** Before the transmux (100) and the codec probe (5), which must read clear bytes. */
2
+ const DECRYPT_ORDER = 1;
3
+ /** The 16-byte IV: the explicit hex one, or the sequence number big-endian. */
4
+ export function ivFor(key, seq) {
5
+ const iv = new Uint8Array(16);
6
+ if (key.iv !== undefined) {
7
+ const hex = key.iv.slice(-32).padStart(32, '0');
8
+ for (let i = 0; i < 16; i += 1)
9
+ iv[i] = Number.parseInt(hex.slice(i * 2, i * 2 + 2), 16);
10
+ return iv;
11
+ }
12
+ const view = new DataView(iv.buffer);
13
+ view.setUint32(8, Math.floor(seq / 2 ** 32));
14
+ view.setUint32(12, seq >>> 0);
15
+ return iv;
16
+ }
17
+ function findSegment(state, renditionId, seq) {
18
+ if (state.presentation === null || renditionId === '')
19
+ return null;
20
+ for (const period of state.presentation.periods) {
21
+ for (const track of period.tracks) {
22
+ for (const rendition of track.renditions) {
23
+ if (rendition.id !== renditionId || !Array.isArray(rendition.segments))
24
+ continue;
25
+ return rendition.segments.find((segment) => segment.seq === seq) ?? null;
26
+ }
27
+ }
28
+ }
29
+ return null;
30
+ }
31
+ export default function aes128() {
32
+ return {
33
+ name: 'aes-128',
34
+ // media-transform routes appends through the pipeline; the step itself
35
+ // leaves timing alone, so it is not media-time-normalized.
36
+ provides: ['aes-128', 'media-transform'],
37
+ install(ctx) {
38
+ const keys = new Map();
39
+ function keyFor(uri) {
40
+ let pending = keys.get(uri);
41
+ if (pending === undefined) {
42
+ pending = ctx
43
+ .request(uri, {})
44
+ .then(async (response) => {
45
+ if (!response.ok)
46
+ throw new Error(`key fetch failed: HTTP ${response.status}`);
47
+ const raw = await response.arrayBuffer();
48
+ if (raw.byteLength !== 16)
49
+ throw new Error(`key is ${raw.byteLength} bytes, not 16`);
50
+ return crypto.subtle.importKey('raw', raw, { name: 'AES-CBC' }, false, ['decrypt']);
51
+ })
52
+ .catch((err) => {
53
+ // A failed fetch is not cached: the next segment retries it.
54
+ keys.delete(uri);
55
+ throw err;
56
+ });
57
+ keys.set(uri, pending);
58
+ }
59
+ return pending;
60
+ }
61
+ ctx.registerTransform({
62
+ name: 'aes-128',
63
+ order: DECRYPT_ORDER,
64
+ async transform(data, meta) {
65
+ const segment = findSegment(ctx.getState(), meta.renditionId, meta.seq);
66
+ const key = segment?.key;
67
+ if (key === undefined)
68
+ return data;
69
+ const cryptoKey = await keyFor(key.uri);
70
+ const clear = await crypto.subtle.decrypt({ name: 'AES-CBC', iv: ivFor(key, meta.seq) }, cryptoKey, data);
71
+ return new Uint8Array(clear);
72
+ },
73
+ });
74
+ return () => keys.clear();
75
+ },
76
+ };
77
+ }
78
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/stages/aes-128/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { Stage } from '../../types/stage.js';
2
+ /** The stage factory. */
3
+ export default function altAudio(): Stage;
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/stages/alt-audio/index.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAmGlD,yBAAyB;AACzB,MAAM,CAAC,OAAO,UAAU,QAAQ,IAAI,KAAK,CAWxC"}
@@ -0,0 +1,90 @@
1
+ const INITIAL = { preferredLang: null };
2
+ /** Audio tracks with their group parsed from the `group:name` id convention. */
3
+ function audioTracks(kernel) {
4
+ const out = [];
5
+ for (const period of kernel.presentation?.periods ?? []) {
6
+ for (const track of period.tracks) {
7
+ if (track.contentType !== 'audio')
8
+ continue;
9
+ const colon = track.id.indexOf(':');
10
+ out.push({
11
+ id: track.id,
12
+ group: colon === -1 ? track.id : track.id.slice(0, colon),
13
+ lang: track.lang ?? null,
14
+ isDefault: track.role === 'main',
15
+ });
16
+ }
17
+ }
18
+ return out;
19
+ }
20
+ /** The audio group the active video rendition's coupling requires, or null. */
21
+ function requiredGroup(kernel) {
22
+ const activeVideo = kernel.quality.active;
23
+ if (activeVideo === null)
24
+ return null;
25
+ const coupling = kernel.presentation?.couplings.find((c) => c.renditionId === activeVideo);
26
+ return coupling?.requires.audio ?? null;
27
+ }
28
+ /** Picks the audio track in `group`, preferring a language, then default, then first. */
29
+ function pickInGroup(tracks, group, preferredLang) {
30
+ const inGroup = tracks.filter((t) => t.group === group);
31
+ if (inGroup.length === 0)
32
+ return null;
33
+ return ((preferredLang !== null ? inGroup.find((t) => t.lang === preferredLang) : undefined) ??
34
+ inGroup.find((t) => t.isDefault) ??
35
+ inGroup[0]);
36
+ }
37
+ /** Loops a command back into the bus through a zero-delay schedule effect. */
38
+ function select(trackId) {
39
+ return {
40
+ kind: 'schedule',
41
+ token: 'alt-audio:select',
42
+ delayMs: 0,
43
+ // biome-ignore lint/suspicious/noThenProperty: `then` is the schedule effect's field name from the message taxonomy
44
+ then: { type: 'SELECT_TRACK', trackId },
45
+ };
46
+ }
47
+ const reduceAltAudio = (slice, msg, kernel) => {
48
+ const state = slice ?? INITIAL;
49
+ if (msg.type === 'LOAD' || msg.type === 'UNLOAD' || msg.type === 'DETACH') {
50
+ return [INITIAL, []];
51
+ }
52
+ // Remember an explicit audio selection as a language preference.
53
+ if (msg.type === 'SELECT_TRACK') {
54
+ const chosen = audioTracks(kernel).find((t) => t.id === msg.trackId);
55
+ if (chosen?.lang != null)
56
+ return [{ preferredLang: chosen.lang }, []];
57
+ return [state, []];
58
+ }
59
+ // A manifest landing or a video rendition change may require a different
60
+ // audio group. Reconcile the active audio track to it.
61
+ if (msg.type === 'MANIFEST_LOADED' || msg.type === 'SEGMENT_LOADED') {
62
+ const group = requiredGroup(kernel);
63
+ if (group === null)
64
+ return [state, []];
65
+ const active = kernel.tracks.active.get('audio');
66
+ const tracks = audioTracks(kernel);
67
+ const activeInfo = tracks.find((t) => t.id === active);
68
+ if (activeInfo !== undefined && activeInfo.group === group)
69
+ return [state, []];
70
+ const target = pickInGroup(tracks, group, state.preferredLang);
71
+ if (target === undefined || target === null || target.id === active)
72
+ return [state, []];
73
+ return [state, [select(target.id)]];
74
+ }
75
+ return [state, []];
76
+ };
77
+ /** The stage factory. */
78
+ export default function altAudio() {
79
+ return {
80
+ name: 'alt-audio',
81
+ provides: ['alt-audio'],
82
+ // docs/06: audio group switching crosses codec boundaries, so the
83
+ // changeType machinery must be present; the loader pulls codec-switch in.
84
+ requires: ['scheduler', 'codec-switch'],
85
+ install(ctx) {
86
+ ctx.reduce('alt-audio', reduceAltAudio);
87
+ },
88
+ };
89
+ }
90
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/stages/alt-audio/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Stage } from '../../types/stage.js';
2
+ export default function cmafTiming(): Stage;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/stages/cmaf-timing/index.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAKlD,MAAM,CAAC,OAAO,UAAU,UAAU,IAAI,KAAK,CAiC1C"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * cmaf-timing normalizes the decode timeline of native fMP4 segments so a live
3
+ * CMAF stream plays. A CMAF live segment's tfdt carries the real broadcast
4
+ * clock (often a value in the billions of seconds); appended with the zero
5
+ * timestampOffset the kernel derives for fMP4, its frames land far past the
6
+ * playhead and nothing ever renders. This stage rewrites each segment's tfdt to
7
+ * the presentation start the manifest assigns it, which is the same alignment a
8
+ * TS transmux produces for free, so VOD (already near zero) is untouched and
9
+ * live is corrected.
10
+ *
11
+ * It contributes a transform step and the `media-transform` capability, so the
12
+ * append path routes through the transform pipeline for a CMAF composition too.
13
+ * Timescales come from the init segment's moov; the transform runs after any
14
+ * transmux, and a decrypt step never touches the moof header, so an encrypted
15
+ * segment is normalized the same way.
16
+ */
17
+ import { findBox, normalizeTfdt, trackTimescales } from '../../containers/mp4-box/index.js';
18
+ /** After ts-transmux (100) and any decrypt-class step, before the append. */
19
+ const ORDER = 150;
20
+ export default function cmafTiming() {
21
+ return {
22
+ name: 'cmaf-timing',
23
+ provides: ['cmaf-timing', 'media-transform', 'media-time-normalized'],
24
+ install(ctx) {
25
+ // Track-id to timescale, learned from init segments, per content type.
26
+ const timescales = new Map();
27
+ ctx.registerTransform({
28
+ name: 'cmaf-timing',
29
+ order: ORDER,
30
+ transform(data, meta) {
31
+ if (meta.contentType !== 'video' && meta.contentType !== 'audio')
32
+ return data;
33
+ // An init segment carries the moov: learn each track's timescale.
34
+ if (findBox(data, 'moov') !== null) {
35
+ const scales = trackTimescales(data);
36
+ if (scales.size > 0)
37
+ timescales.set(meta.contentType, scales);
38
+ }
39
+ // A media segment carries a moof: align its decode clock to the
40
+ // presentation start the manifest gave it. Without a known timescale
41
+ // (no init seen yet) leave the bytes alone rather than guess.
42
+ if (findBox(data, 'moof') !== null) {
43
+ const scales = timescales.get(meta.contentType);
44
+ if (scales !== undefined && scales.size > 0) {
45
+ const fallback = [...scales.values()][0] ?? 0;
46
+ normalizeTfdt(data, meta.start, scales, fallback);
47
+ }
48
+ }
49
+ return data;
50
+ },
51
+ });
52
+ return undefined;
53
+ },
54
+ };
55
+ }
56
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/stages/cmaf-timing/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AAI5F,6EAA6E;AAC7E,MAAM,KAAK,GAAG,GAAG,CAAC;AAElB,MAAM,CAAC,OAAO,UAAU,UAAU;IAChC,OAAO;QACL,IAAI,EAAE,aAAa;QACnB,QAAQ,EAAE,CAAC,aAAa,EAAE,iBAAiB,EAAE,uBAAuB,CAAC;QACrE,OAAO,CAAC,GAAG;YACT,uEAAuE;YACvE,MAAM,UAAU,GAAG,IAAI,GAAG,EAA+B,CAAC;YAC1D,GAAG,CAAC,iBAAiB,CAAC;gBACpB,IAAI,EAAE,aAAa;gBACnB,KAAK,EAAE,KAAK;gBACZ,SAAS,CAAC,IAAgB,EAAE,IAAiB;oBAC3C,IAAI,IAAI,CAAC,WAAW,KAAK,OAAO,IAAI,IAAI,CAAC,WAAW,KAAK,OAAO;wBAAE,OAAO,IAAI,CAAC;oBAC9E,kEAAkE;oBAClE,IAAI,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC;wBACnC,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;wBACrC,IAAI,MAAM,CAAC,IAAI,GAAG,CAAC;4BAAE,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;oBAChE,CAAC;oBACD,gEAAgE;oBAChE,qEAAqE;oBACrE,8DAA8D;oBAC9D,IAAI,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC;wBACnC,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;wBAChD,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;4BAC5C,MAAM,QAAQ,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;4BAC9C,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;wBACpD,CAAC;oBACH,CAAC;oBACD,OAAO,IAAI,CAAC;gBACd,CAAC;aACF,CAAC,CAAC;YACH,OAAO,SAAS,CAAC;QACnB,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Common Media Client Data (CTA-5004). The engine already exposes the seam
3
+ * this needs: a request hook that sees every outgoing segment and manifest
4
+ * URL. This stage reads playback state through the stage context and appends
5
+ * the CMCD keys a CDN reads to understand the session, as either a query
6
+ * argument or request headers.
7
+ *
8
+ * It computes nothing the kernel does not already track: the active rendition
9
+ * bitrate, the measured throughput EWMA, and the buffer ahead of the playhead
10
+ * from the media element. No new kernel state, no new effect.
11
+ */
12
+ import type { Stage } from '../../types/stage.js';
13
+ export interface CmcdOptions {
14
+ /** A stable content id, echoed as `cid`. */
15
+ readonly contentId?: string;
16
+ /** 'query' appends a CMCD argument to the URL; 'header' sends CMCD-* headers. */
17
+ readonly mode?: 'query' | 'header';
18
+ /** Overrides the generated session id, echoed as `sid`. */
19
+ readonly sessionId?: string;
20
+ }
21
+ export default function cmcd(options?: CmcdOptions): Stage;
22
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/stages/cmcd/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAElD,MAAM,WAAW,WAAW;IAC1B,4CAA4C;IAC5C,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,iFAAiF;IACjF,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC;IACnC,2DAA2D;IAC3D,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AA+BD,MAAM,CAAC,OAAO,UAAU,IAAI,CAAC,OAAO,GAAE,WAAgB,GAAG,KAAK,CAmD7D"}
@@ -0,0 +1,92 @@
1
+ /** The CMCD object type, inferred from the URL the request is fetching. */
2
+ function objectType(url) {
3
+ if (/\.(m3u8|mpd)(\?|$)/i.test(url))
4
+ return 'm';
5
+ if (/\.(vtt|srt)(\?|$)/i.test(url))
6
+ return 'c';
7
+ if (/\.(aac|mp3|ac3|m4a)(\?|$)/i.test(url))
8
+ return 'a';
9
+ return 'av';
10
+ }
11
+ /** CMCD keys whose value is an enumerated token, sent unquoted. */
12
+ const TOKEN_KEYS = new Set(['ot', 'sf', 'st']);
13
+ /**
14
+ * Serializes CMCD keys per CTA-5004: sorted, booleans bare, tokens unquoted,
15
+ * and true strings (sid, cid) quoted.
16
+ */
17
+ function serialize(keys) {
18
+ return Object.keys(keys)
19
+ .sort()
20
+ .map((key) => {
21
+ const value = keys[key];
22
+ if (value === true)
23
+ return key;
24
+ if (typeof value === 'string') {
25
+ return TOKEN_KEYS.has(key) ? `${key}=${value}` : `${key}=${JSON.stringify(value)}`;
26
+ }
27
+ return `${key}=${value}`;
28
+ })
29
+ .join(',');
30
+ }
31
+ export default function cmcd(options = {}) {
32
+ const sessionId = options.sessionId ??
33
+ globalThis.crypto?.randomUUID?.() ??
34
+ `mb-${Math.random().toString(36).slice(2)}`;
35
+ const mode = options.mode ?? 'query';
36
+ return {
37
+ name: 'cmcd',
38
+ provides: ['cmcd'],
39
+ requires: ['transport'],
40
+ install(ctx) {
41
+ ctx.addRequestHook((req) => {
42
+ const state = ctx.getState();
43
+ const keys = {
44
+ sid: sessionId,
45
+ ot: objectType(req.url),
46
+ };
47
+ if (options.contentId !== undefined)
48
+ keys.cid = options.contentId;
49
+ // Encoded bitrate of the active rendition, in kbps.
50
+ const activeId = state.quality.active;
51
+ if (activeId !== null && state.presentation !== null) {
52
+ for (const period of state.presentation.periods) {
53
+ for (const track of period.tracks) {
54
+ const rendition = track.renditions.find((r) => r.id === activeId);
55
+ if (rendition !== undefined)
56
+ keys.br = Math.round(rendition.bitrate / 1000);
57
+ }
58
+ }
59
+ }
60
+ // Measured throughput EWMA, in kbps, rounded to the spec's 100 kbps.
61
+ const mtp = state.stats.throughputEwma;
62
+ if (mtp > 0)
63
+ keys.mtp = Math.round(mtp / 1000 / 100) * 100;
64
+ // Buffer ahead of the playhead, in ms, from the element.
65
+ const el = ctx.element;
66
+ const ahead = bufferAhead(el);
67
+ if (ahead !== null)
68
+ keys.bl = Math.round((ahead * 1000) / 100) * 100;
69
+ if (ahead !== null && ahead < 1)
70
+ keys.su = true;
71
+ const payload = serialize(keys);
72
+ if (mode === 'header') {
73
+ req.headers['CMCD-Request'] = payload;
74
+ }
75
+ else {
76
+ const separator = req.url.includes('?') ? '&' : '?';
77
+ req.url = `${req.url}${separator}CMCD=${encodeURIComponent(payload)}`;
78
+ }
79
+ });
80
+ },
81
+ };
82
+ }
83
+ function bufferAhead(el) {
84
+ const { buffered, currentTime } = el;
85
+ for (let i = 0; i < buffered.length; i += 1) {
86
+ if (buffered.start(i) <= currentTime && currentTime <= buffered.end(i)) {
87
+ return buffered.end(i) - currentTime;
88
+ }
89
+ }
90
+ return null;
91
+ }
92
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/stages/cmcd/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { Stage } from '../../types/stage.js';
2
+ export interface CodecProbeApi {
3
+ /** The codec strings derived from the most recent init segment. */
4
+ readonly detected: readonly string[];
5
+ /** The MSE mime type the probe reconstructed, ready for isTypeSupported. */
6
+ readonly mimeType: string | null;
7
+ }
8
+ export default function codecProbe(): Stage;
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/stages/codec-probe/index.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAElD,MAAM,WAAW,aAAa;IAC5B,mEAAmE;IACnE,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,4EAA4E;IAC5E,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CAClC;AAYD,MAAM,CAAC,OAAO,UAAU,UAAU,IAAI,KAAK,CAuC1C"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * codec-probe as a loadable stage. The derivation itself lives in the
3
+ * container layer (probeInitSegment reads the stsd sample entries and rebuilds
4
+ * the RFC 6381 string from avcC/hvcC/esds/vpcC/dOps). This stage is the
5
+ * runtime call site the container never had: a transform that watches init
6
+ * segments, publishes what it derived on `engine.codecProbe`, and emits a
7
+ * `codecprobe:detected` event.
8
+ *
9
+ * It also registers the composition's type probe: a rendition the manifest
10
+ * left codec-less (a bare media playlist) gets its SourceBuffer typed from
11
+ * its first segment instead of the bare `video/mp4` Chrome refuses. A
12
+ * manifest that does declare codecs still creates the buffer as declared;
13
+ * a mismatch with the probe surfaces on the event for a follow-up stage.
14
+ */
15
+ import { probeInitSegment } from '../../containers/codec-probe/index.js';
16
+ /** A media segment carries a moof; only an init segment carries a moov. */
17
+ function isInitSegment(data) {
18
+ for (let i = 4; i + 4 <= data.byteLength && i < 64; i += 1) {
19
+ if (data[i] === 0x6d && data[i + 1] === 0x6f && data[i + 2] === 0x6f && data[i + 3] === 0x76) {
20
+ return true; // 'moov'
21
+ }
22
+ }
23
+ return false;
24
+ }
25
+ export default function codecProbe() {
26
+ return {
27
+ name: 'codec-probe',
28
+ provides: ['codec-probe'],
29
+ requires: ['mp4-box'],
30
+ install(ctx) {
31
+ let detected = [];
32
+ let mimeType = null;
33
+ ctx.registerNamespace('codecProbe', {
34
+ get detected() {
35
+ return detected;
36
+ },
37
+ get mimeType() {
38
+ return mimeType;
39
+ },
40
+ });
41
+ ctx.registerTypeProbe((bytes) => {
42
+ if (!isInitSegment(bytes))
43
+ return null;
44
+ const result = probeInitSegment(bytes);
45
+ return result.codecs.length > 0 ? result.mimeType : null;
46
+ });
47
+ ctx.registerTransform({
48
+ name: 'codec-probe',
49
+ // Early, so it reads the init before any transmux rewraps it.
50
+ order: 5,
51
+ transform(data, meta) {
52
+ if (meta.contentType !== 'video' && meta.contentType !== 'audio')
53
+ return data;
54
+ if (!isInitSegment(data))
55
+ return data;
56
+ const result = probeInitSegment(data);
57
+ if (result.codecs.length > 0) {
58
+ detected = result.codecs;
59
+ mimeType = result.mimeType;
60
+ ctx.emit('codecprobe:detected', { codecs: result.codecs, mimeType: result.mimeType });
61
+ }
62
+ return data;
63
+ },
64
+ });
65
+ },
66
+ };
67
+ }
68
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/stages/codec-probe/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,EAAE,gBAAgB,EAAE,MAAM,uCAAuC,CAAC;AAWzE,2EAA2E;AAC3E,SAAS,aAAa,CAAC,IAAgB;IACrC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,UAAU,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3D,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YAC7F,OAAO,IAAI,CAAC,CAAC,SAAS;QACxB,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,CAAC,OAAO,UAAU,UAAU;IAChC,OAAO;QACL,IAAI,EAAE,aAAa;QACnB,QAAQ,EAAE,CAAC,aAAa,CAAC;QACzB,QAAQ,EAAE,CAAC,SAAS,CAAC;QACrB,OAAO,CAAC,GAAG;YACT,IAAI,QAAQ,GAAsB,EAAE,CAAC;YACrC,IAAI,QAAQ,GAAkB,IAAI,CAAC;YACnC,GAAG,CAAC,iBAAiB,CAAC,YAAY,EAAE;gBAClC,IAAI,QAAQ;oBACV,OAAO,QAAQ,CAAC;gBAClB,CAAC;gBACD,IAAI,QAAQ;oBACV,OAAO,QAAQ,CAAC;gBAClB,CAAC;aACsB,CAAC,CAAC;YAC3B,GAAG,CAAC,iBAAiB,CAAC,CAAC,KAAK,EAAE,EAAE;gBAC9B,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;oBAAE,OAAO,IAAI,CAAC;gBACvC,MAAM,MAAM,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;gBACvC,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC;YAC3D,CAAC,CAAC,CAAC;YACH,GAAG,CAAC,iBAAiB,CAAC;gBACpB,IAAI,EAAE,aAAa;gBACnB,8DAA8D;gBAC9D,KAAK,EAAE,CAAC;gBACR,SAAS,CAAC,IAAgB,EAAE,IAAiB;oBAC3C,IAAI,IAAI,CAAC,WAAW,KAAK,OAAO,IAAI,IAAI,CAAC,WAAW,KAAK,OAAO;wBAAE,OAAO,IAAI,CAAC;oBAC9E,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;wBAAE,OAAO,IAAI,CAAC;oBACtC,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;oBACtC,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBAC7B,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC;wBACzB,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;wBAC3B,GAAG,CAAC,IAAI,CAAC,qBAAqB,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;oBACxF,CAAC;oBACD,OAAO,IAAI,CAAC;gBACd,CAAC;aACF,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { Rendition } from '../../types/ir.js';
2
+ import type { SwitchVerdict } from '../../types/quality.js';
3
+ import type { Stage } from '../../types/stage.js';
4
+ export declare function createPolicy(): (current: Rendition | null, target: Rendition) => SwitchVerdict;
5
+ export default function codecSwitch(): Stage;
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/stages/codec-switch/index.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAyBlD,wBAAgB,YAAY,IAAI,CAAC,OAAO,EAAE,SAAS,GAAG,IAAI,EAAE,MAAM,EAAE,SAAS,KAAK,aAAa,CAO9F;AAED,MAAM,CAAC,OAAO,UAAU,WAAW,IAAI,KAAK,CAa3C"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * codec-switch: the real answer to entanglement #2's query. It registers a
3
+ * switch policy the kernel injects into abr's telemetry; abr consumes it
4
+ * without importing this stage. The refinement over the kernel default: a
5
+ * changeType verdict is only returned when the browser can actually bridge
6
+ * the two codecs, which needs both a supported target type and
7
+ * SourceBuffer.changeType itself. Where the browser cannot, an in-family
8
+ * change downgrades to reload rather than proposing a switch that would
9
+ * throw at append time.
10
+ *
11
+ * codec-probe (declared in `requires`, resolved by the loader, never
12
+ * imported) is the future source of exact codec strings when a manifest
13
+ * lies; until a runtime call site exists this policy reasons over the IR's
14
+ * declared strings, which is already a real improvement.
15
+ */
16
+ import { canSwitchTo } from '../../kernel/rendition-select.js';
17
+ /** A full MSE type string for a rendition, mime plus codecs. */
18
+ function typeString(rendition) {
19
+ return rendition.codecs === null
20
+ ? rendition.mimeType
21
+ : `${rendition.mimeType}; codecs="${rendition.codecs}"`;
22
+ }
23
+ /** Whether the runtime can bridge two types without tearing the buffer down. */
24
+ function changeTypeSupported(target) {
25
+ const MediaSourceCtor = typeof MediaSource !== 'undefined'
26
+ ? MediaSource
27
+ : globalThis.ManagedMediaSource;
28
+ if (MediaSourceCtor === undefined)
29
+ return false;
30
+ if (typeof globalThis.SourceBuffer?.prototype?.changeType !==
31
+ 'function') {
32
+ return false;
33
+ }
34
+ return MediaSourceCtor.isTypeSupported(typeString(target));
35
+ }
36
+ export function createPolicy() {
37
+ return (current, target) => {
38
+ const base = canSwitchTo(current, target);
39
+ if (base !== 'changeType')
40
+ return base;
41
+ // The kernel says a changeType would do; confirm the browser agrees.
42
+ return changeTypeSupported(target) ? 'changeType' : 'reload';
43
+ };
44
+ }
45
+ export default function codecSwitch() {
46
+ return {
47
+ name: 'codec-switch',
48
+ provides: ['codec-switch'],
49
+ // docs/05 also lists codec-probe; that becomes a real `requires` once
50
+ // the probe has a runtime call site (tracked in the register). Until
51
+ // then this policy reasons over declared strings and needs only mse's
52
+ // changeType.
53
+ requires: ['mse'],
54
+ install(ctx) {
55
+ ctx.registerSwitchPolicy(createPolicy());
56
+ },
57
+ };
58
+ }
59
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/stages/codec-switch/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAK/D,gEAAgE;AAChE,SAAS,UAAU,CAAC,SAAoB;IACtC,OAAO,SAAS,CAAC,MAAM,KAAK,IAAI;QAC9B,CAAC,CAAC,SAAS,CAAC,QAAQ;QACpB,CAAC,CAAC,GAAG,SAAS,CAAC,QAAQ,aAAa,SAAS,CAAC,MAAM,GAAG,CAAC;AAC5D,CAAC;AAED,gFAAgF;AAChF,SAAS,mBAAmB,CAAC,MAAiB;IAC5C,MAAM,eAAe,GACnB,OAAO,WAAW,KAAK,WAAW;QAChC,CAAC,CAAC,WAAW;QACb,CAAC,CAAE,UAA0D,CAAC,kBAAkB,CAAC;IACrF,IAAI,eAAe,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IAChD,IACE,OAAQ,UAAU,CAAC,YAAY,EAAE,SAAsC,EAAE,UAAU;QACnF,UAAU,EACV,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,eAAe,CAAC,eAAe,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;AAC7D,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACzB,MAAM,IAAI,GAAG,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC1C,IAAI,IAAI,KAAK,YAAY;YAAE,OAAO,IAAI,CAAC;QACvC,qEAAqE;QACrE,OAAO,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC;IAC/D,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,OAAO,UAAU,WAAW;IACjC,OAAO;QACL,IAAI,EAAE,cAAc;QACpB,QAAQ,EAAE,CAAC,cAAc,CAAC;QAC1B,sEAAsE;QACtE,qEAAqE;QACrE,sEAAsE;QACtE,cAAc;QACd,QAAQ,EAAE,CAAC,KAAK,CAAC;QACjB,OAAO,CAAC,GAAG;YACT,GAAG,CAAC,oBAAoB,CAAC,YAAY,EAAE,CAAC,CAAC;QAC3C,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { Stage } from '../../types/stage.js';
2
+ /** The stage factory. */
3
+ export default function contentSteering(): Stage;
4
+ //# sourceMappingURL=index.d.ts.map