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,203 @@
1
+ function isIndexed(addressing) {
2
+ return !Array.isArray(addressing) && addressing.kind === 'indexed';
3
+ }
4
+ /**
5
+ * An on-demand addressing whose index box has not been fetched yet: it
6
+ * carries no resolvable segments. Once the adapter parses the index it swaps
7
+ * this for an explicit array, so every consumer treats it as empty until then.
8
+ */
9
+ function isUnresolved(addressing) {
10
+ return !Array.isArray(addressing) && addressing.kind === 'sidx';
11
+ }
12
+ /**
13
+ * Epochs for one rendition timeline across periods. A period boundary opens
14
+ * an epoch; inside a period, every segment flagged `discontinuity` opens
15
+ * another. One code path for both.
16
+ */
17
+ export function buildEpochs(parts) {
18
+ const epochs = [];
19
+ for (const { period, rendition } of parts) {
20
+ const addressing = rendition.segments;
21
+ if (isIndexed(addressing)) {
22
+ const pto = (addressing.presentationTimeOffset ?? 0) / addressing.timescale;
23
+ epochs.push({
24
+ periodId: period.id,
25
+ firstSeq: addressing.startSeq,
26
+ presentationStart: period.start,
27
+ mediaStart: pto,
28
+ });
29
+ continue;
30
+ }
31
+ if (isUnresolved(addressing))
32
+ continue;
33
+ let open = false;
34
+ for (const segment of addressing) {
35
+ if (!open || segment.discontinuity === true) {
36
+ // A period-opening list that begins mid-timeline is a window into
37
+ // a longer stream (a live sliding window): media time is assumed
38
+ // continuous, so the offset is zero. A discontinuity restarts the
39
+ // media clock. tfdt reconciliation corrects both guesses with the
40
+ // bytes' truth once wired.
41
+ const mediaStart = open ? 0 : segment.start - period.start;
42
+ epochs.push({
43
+ periodId: period.id,
44
+ firstSeq: segment.seq,
45
+ presentationStart: segment.start,
46
+ mediaStart,
47
+ });
48
+ open = true;
49
+ }
50
+ }
51
+ }
52
+ return epochs;
53
+ }
54
+ /** The epoch a sequence number belongs to, or null before the first epoch. */
55
+ export function epochForSeq(epochs, seq) {
56
+ let match = null;
57
+ for (const epoch of epochs) {
58
+ if (epoch.firstSeq <= seq)
59
+ match = epoch;
60
+ }
61
+ return match;
62
+ }
63
+ /** The timestampOffset an append from this epoch requires. */
64
+ export function timestampOffsetFor(epoch) {
65
+ return epoch.presentationStart - epoch.mediaStart;
66
+ }
67
+ export function mediaToPresentation(mediaTime, epoch) {
68
+ return mediaTime - epoch.mediaStart + epoch.presentationStart;
69
+ }
70
+ export function presentationToMedia(presentationTime, epoch) {
71
+ return presentationTime - epoch.presentationStart + epoch.mediaStart;
72
+ }
73
+ /**
74
+ * Corrects an epoch with a real baseMediaDecodeTime once mp4-box can read
75
+ * tfdt (Stage 07). Interface only for now: manifests promise timing, the
76
+ * bytes tell the truth.
77
+ */
78
+ export function reconcileTfdt(epoch, baseMediaDecodeTime, timescale) {
79
+ return { ...epoch, mediaStart: baseMediaDecodeTime / timescale };
80
+ }
81
+ /** Materializes one segment from an indexed form. Null outside the window. */
82
+ export function segmentAt(addressing, seq, periodStart = 0) {
83
+ if (!isIndexed(addressing)) {
84
+ if (isUnresolved(addressing))
85
+ return null;
86
+ return addressing.find((segment) => segment.seq === seq) ?? null;
87
+ }
88
+ if (seq < addressing.startSeq)
89
+ return null;
90
+ if (addressing.endSeq !== null && seq > addressing.endSeq)
91
+ return null;
92
+ const { timescale } = addressing;
93
+ const pto = addressing.presentationTimeOffset ?? 0;
94
+ let startUnits;
95
+ let durationUnits;
96
+ if (addressing.timeline !== null) {
97
+ let cursor = addressing.startSeq;
98
+ let found = null;
99
+ for (const run of addressing.timeline) {
100
+ if (seq < cursor + run.count) {
101
+ found = { start: run.start + (seq - cursor) * run.duration, duration: run.duration };
102
+ break;
103
+ }
104
+ cursor += run.count;
105
+ }
106
+ if (found === null)
107
+ return null;
108
+ startUnits = found.start;
109
+ durationUnits = found.duration;
110
+ }
111
+ else if (addressing.segmentDuration !== null) {
112
+ // Media time starts at the offset: the period's first segment carries
113
+ // it, so $Time$ expands with it and the subtraction below lands at the
114
+ // period start, not before it.
115
+ durationUnits = addressing.segmentDuration;
116
+ startUnits = pto + (seq - addressing.startSeq) * durationUnits;
117
+ }
118
+ else {
119
+ return null;
120
+ }
121
+ // $Number$ and $Time$, with the ISO/IEC 23009-1 %0<width>d format tag,
122
+ // then $$ unescaped last.
123
+ const url = addressing.urlTemplate
124
+ .replace(/\$(Number|Time)(?:%0(\d+)d)?\$/g, (_, name, width) => {
125
+ const text = String(name === 'Number' ? seq : startUnits);
126
+ return width === undefined ? text : text.padStart(Number(width), '0');
127
+ })
128
+ .replaceAll('$$', '$');
129
+ return {
130
+ seq,
131
+ start: periodStart + (startUnits - pto) / timescale,
132
+ duration: durationUnits / timescale,
133
+ url,
134
+ };
135
+ }
136
+ /** The first segment whose interval contains or follows `time`, or null past the end. */
137
+ export function segmentAtTime(addressing, time, periodStart = 0) {
138
+ if (!isIndexed(addressing)) {
139
+ if (isUnresolved(addressing))
140
+ return null;
141
+ for (const segment of addressing) {
142
+ if (segment.start + segment.duration > time)
143
+ return segment;
144
+ }
145
+ return null;
146
+ }
147
+ // Constant-duration templates index directly; timelines scan their runs.
148
+ if (addressing.timeline === null && addressing.segmentDuration !== null) {
149
+ const dur = addressing.segmentDuration / addressing.timescale;
150
+ const relative = Math.max(0, time - periodStart);
151
+ const seq = addressing.startSeq + Math.floor(relative / dur);
152
+ return segmentAt(addressing, Math.max(seq, addressing.startSeq), periodStart);
153
+ }
154
+ let seq = addressing.startSeq;
155
+ const last = addressing.endSeq;
156
+ while (last === null || seq <= last) {
157
+ const segment = segmentAt(addressing, seq, periodStart);
158
+ if (segment === null)
159
+ return null;
160
+ if (segment.start + segment.duration > time)
161
+ return segment;
162
+ seq += 1;
163
+ }
164
+ return null;
165
+ }
166
+ /**
167
+ * The seekable window. VOD: zero to the announced or derivable duration.
168
+ * Live: the sliding window ending at the supplied edge; the kernel never
169
+ * computes the edge itself.
170
+ */
171
+ export function seekableWindow(presentation, liveEdge) {
172
+ if (!presentation.isLive) {
173
+ if (presentation.duration !== undefined)
174
+ return { start: 0, end: presentation.duration };
175
+ let end = 0;
176
+ for (const period of presentation.periods) {
177
+ if (period.duration !== undefined)
178
+ end = Math.max(end, period.start + period.duration);
179
+ }
180
+ return { start: 0, end };
181
+ }
182
+ const edge = liveEdge ?? 0;
183
+ let windowStart = edge;
184
+ for (const period of presentation.periods) {
185
+ for (const track of period.tracks) {
186
+ for (const rendition of track.renditions) {
187
+ const addressing = rendition.segments;
188
+ if (isIndexed(addressing)) {
189
+ const first = segmentAt(addressing, addressing.startSeq, period.start);
190
+ if (first !== null)
191
+ windowStart = Math.min(windowStart, first.start);
192
+ }
193
+ else if (!isUnresolved(addressing)) {
194
+ const first = addressing[0];
195
+ if (first !== undefined)
196
+ windowStart = Math.min(windowStart, first.start);
197
+ }
198
+ }
199
+ }
200
+ }
201
+ return { start: Math.min(windowStart, edge), end: edge };
202
+ }
203
+ //# sourceMappingURL=timeline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timeline.js","sourceRoot":"","sources":["../../src/kernel/timeline.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * The diagnostic ring buffer and its tooling. Because the reducer is pure, a
3
+ * recorded trace replays into a fresh reducer and must reproduce the same
4
+ * effects. That turns a production stall into a deterministic regression
5
+ * test.
6
+ */
7
+ import type { KernelState, Reducer, TraceEntry } from '../types/kernel.js';
8
+ import type { Effect } from '../types/messages.js';
9
+ export declare const DEFAULT_TRACE_CAPACITY = 500;
10
+ export interface TraceBuffer {
11
+ push(entry: TraceEntry): void;
12
+ /** Entries oldest first. */
13
+ snapshot(): readonly TraceEntry[];
14
+ readonly capacity: number;
15
+ }
16
+ /** Fixed capacity, overwriting. Roughly 200 bytes of code for the whole payoff. */
17
+ export declare function createTraceBuffer(capacity?: number): TraceBuffer;
18
+ /**
19
+ * A cheap, stable hash of the state slices that matter for divergence
20
+ * detection. Stable across runs: it depends only on the state.
21
+ */
22
+ export declare function digest(state: KernelState): string;
23
+ /**
24
+ * JSON for a bug report. Byte payloads are reduced to their length and
25
+ * non-plain objects to their constructor name; the shape of the
26
+ * interleaving is what matters, not the media bytes.
27
+ */
28
+ export declare function exportTrace(entries: readonly TraceEntry[]): string;
29
+ export interface ReplayResult {
30
+ readonly ok: boolean;
31
+ /** Index of the first diverging entry, when not ok. */
32
+ readonly divergedAt?: number;
33
+ readonly expected?: readonly Effect[];
34
+ readonly actual?: readonly Effect[];
35
+ }
36
+ /**
37
+ * Feeds a recorded message sequence into a fresh reducer and checks that the
38
+ * same effects come out. The reducer must be built with the same slices as
39
+ * the one that produced the trace.
40
+ */
41
+ export declare function replay(entries: readonly TraceEntry[], reducer: Reducer, initial: KernelState): ReplayResult;
42
+ //# sourceMappingURL=trace.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trace.d.ts","sourceRoot":"","sources":["../../src/kernel/trace.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAC3E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAEnD,eAAO,MAAM,sBAAsB,MAAM,CAAC;AAE1C,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,CAAC;IAC9B,4BAA4B;IAC5B,QAAQ,IAAI,SAAS,UAAU,EAAE,CAAC;IAClC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED,mFAAmF;AACnF,wBAAgB,iBAAiB,CAAC,QAAQ,GAAE,MAA+B,GAAG,WAAW,CAiBxF;AAiDD;;;GAGG;AACH,wBAAgB,MAAM,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,CAkBjD;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,SAAS,UAAU,EAAE,GAAG,MAAM,CAgBlE;AA8BD,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC;IACrB,uDAAuD;IACvD,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACtC,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACrC;AAED;;;;GAIG;AACH,wBAAgB,MAAM,CACpB,OAAO,EAAE,SAAS,UAAU,EAAE,EAC9B,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,WAAW,GACnB,YAAY,CAYd"}
@@ -0,0 +1,165 @@
1
+ export const DEFAULT_TRACE_CAPACITY = 500;
2
+ /** Fixed capacity, overwriting. Roughly 200 bytes of code for the whole payoff. */
3
+ export function createTraceBuffer(capacity = DEFAULT_TRACE_CAPACITY) {
4
+ const entries = [];
5
+ let head = 0;
6
+ return {
7
+ capacity,
8
+ push(entry) {
9
+ if (entries.length < capacity) {
10
+ entries.push(entry);
11
+ }
12
+ else {
13
+ entries[head] = entry;
14
+ head = (head + 1) % capacity;
15
+ }
16
+ },
17
+ snapshot() {
18
+ return [...entries.slice(head), ...entries.slice(0, head)];
19
+ },
20
+ };
21
+ }
22
+ function isPlainObject(value) {
23
+ const proto = Object.getPrototypeOf(value);
24
+ return proto === Object.prototype || proto === null;
25
+ }
26
+ /**
27
+ * Deterministic serialization for hashing: sorted object keys, sorted Map
28
+ * entries, opaque values tagged by constructor name. Not a wire format.
29
+ */
30
+ function stableStringify(value) {
31
+ if (value === null || typeof value === 'number' || typeof value === 'boolean') {
32
+ return String(value);
33
+ }
34
+ if (typeof value === 'string')
35
+ return JSON.stringify(value);
36
+ if (value === undefined)
37
+ return 'undefined';
38
+ if (typeof value === 'function')
39
+ return '[function]';
40
+ if (Array.isArray(value)) {
41
+ return `[${value.map(stableStringify).join(',')}]`;
42
+ }
43
+ if (value instanceof Map) {
44
+ const parts = [...value.entries()]
45
+ .map(([k, v]) => `${stableStringify(k)}:${stableStringify(v)}`)
46
+ .sort();
47
+ return `Map{${parts.join(',')}}`;
48
+ }
49
+ if (value instanceof ArrayBuffer)
50
+ return `ArrayBuffer(${value.byteLength})`;
51
+ if (ArrayBuffer.isView(value))
52
+ return `${value.constructor.name}(${value.byteLength})`;
53
+ if (typeof value === 'object') {
54
+ if (!isPlainObject(value))
55
+ return `[${value.constructor?.name ?? 'opaque'}]`;
56
+ const parts = Object.keys(value)
57
+ .sort()
58
+ .map((k) => `${JSON.stringify(k)}:${stableStringify(value[k])}`);
59
+ return `{${parts.join(',')}}`;
60
+ }
61
+ return String(value);
62
+ }
63
+ /** 32-bit FNV-1a over a string, as fixed-width hex. */
64
+ function fnv1a(input) {
65
+ let hash = 0x811c9dc5;
66
+ for (let i = 0; i < input.length; i += 1) {
67
+ hash ^= input.charCodeAt(i);
68
+ hash = Math.imul(hash, 0x01000193) >>> 0;
69
+ }
70
+ return hash.toString(16).padStart(8, '0');
71
+ }
72
+ /**
73
+ * A cheap, stable hash of the state slices that matter for divergence
74
+ * detection. Stable across runs: it depends only on the state.
75
+ */
76
+ export function digest(state) {
77
+ return fnv1a(stableStringify({
78
+ phase: state.lifecycle.phase,
79
+ presentation: state.presentation?.id ?? null,
80
+ inflight: [...state.scheduling.inflight.keys()].sort(),
81
+ bufferGoal: state.scheduling.bufferGoal,
82
+ tokenSeq: state.scheduling.tokenSeq,
83
+ buffers: state.buffers,
84
+ tracks: state.tracks.active,
85
+ quality: {
86
+ pinned: state.quality.pinned,
87
+ active: state.quality.active,
88
+ constraints: [...state.quality.constraints.keys()].sort(),
89
+ },
90
+ currentTime: state.playback.currentTime,
91
+ }));
92
+ }
93
+ /**
94
+ * JSON for a bug report. Byte payloads are reduced to their length and
95
+ * non-plain objects to their constructor name; the shape of the
96
+ * interleaving is what matters, not the media bytes.
97
+ */
98
+ export function exportTrace(entries) {
99
+ return JSON.stringify(entries, (_key, value) => {
100
+ if (value instanceof ArrayBuffer)
101
+ return { $bytes: value.byteLength };
102
+ if (ArrayBuffer.isView(value))
103
+ return { $bytes: value.byteLength };
104
+ if (value instanceof Map)
105
+ return Object.fromEntries(value);
106
+ if (typeof value === 'function')
107
+ return { $opaque: 'function' };
108
+ if (typeof value === 'object' &&
109
+ value !== null &&
110
+ !Array.isArray(value) &&
111
+ !isPlainObject(value)) {
112
+ return { $opaque: value.constructor?.name ?? 'object' };
113
+ }
114
+ return value;
115
+ });
116
+ }
117
+ function buffersEqual(a, b) {
118
+ if (a.byteLength !== b.byteLength)
119
+ return false;
120
+ const va = new Uint8Array(a);
121
+ const vb = new Uint8Array(b);
122
+ for (let i = 0; i < va.length; i += 1) {
123
+ if (va[i] !== vb[i])
124
+ return false;
125
+ }
126
+ return true;
127
+ }
128
+ /** Structural equality over effect payloads: plain data plus ArrayBuffer. */
129
+ function deepEqual(a, b) {
130
+ if (Object.is(a, b))
131
+ return true;
132
+ if (a instanceof ArrayBuffer && b instanceof ArrayBuffer)
133
+ return buffersEqual(a, b);
134
+ if (Array.isArray(a) && Array.isArray(b)) {
135
+ return a.length === b.length && a.every((item, i) => deepEqual(item, b[i]));
136
+ }
137
+ if (typeof a === 'object' && typeof b === 'object' && a !== null && b !== null) {
138
+ const ka = Object.keys(a);
139
+ const kb = Object.keys(b);
140
+ if (ka.length !== kb.length)
141
+ return false;
142
+ return ka.every((k) => deepEqual(a[k], b[k]));
143
+ }
144
+ return false;
145
+ }
146
+ /**
147
+ * Feeds a recorded message sequence into a fresh reducer and checks that the
148
+ * same effects come out. The reducer must be built with the same slices as
149
+ * the one that produced the trace.
150
+ */
151
+ export function replay(entries, reducer, initial) {
152
+ let state = initial;
153
+ for (let i = 0; i < entries.length; i += 1) {
154
+ const entry = entries[i];
155
+ if (entry === undefined)
156
+ continue;
157
+ const [next, effects] = reducer(state, entry.msg);
158
+ if (!deepEqual(effects, entry.effects)) {
159
+ return { ok: false, divergedAt: i, expected: entry.effects, actual: effects };
160
+ }
161
+ state = next;
162
+ }
163
+ return { ok: true };
164
+ }
165
+ //# sourceMappingURL=trace.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trace.js","sourceRoot":"","sources":["../../src/kernel/trace.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Generic track enumeration and selection, the engine.tracks surface.
3
+ * Tracks whose content type has no registered sink are enumerated but not
4
+ * selectable: that is how a deployment without text-webvtt degrades
5
+ * gracefully instead of crashing.
6
+ */
7
+ import type { TracksApi } from '../types/facade.js';
8
+ import type { ContentType, TrackId } from '../types/ir.js';
9
+ import type { KernelState } from '../types/kernel.js';
10
+ import type { Command } from '../types/messages.js';
11
+ export interface TrackRegistryDeps {
12
+ getState(): KernelState;
13
+ dispatch(cmd: Command): void;
14
+ emitEvent(event: string, payload: unknown): void;
15
+ /** Whether a sink is registered for the content type, from the bus registry. */
16
+ hasSink(contentType: ContentType): boolean;
17
+ }
18
+ export interface TrackRegistry extends TracksApi {
19
+ selectable(trackId: TrackId): boolean;
20
+ }
21
+ export declare function createTrackRegistry(deps: TrackRegistryDeps): TrackRegistry;
22
+ //# sourceMappingURL=track-registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"track-registry.d.ts","sourceRoot":"","sources":["../../src/kernel/track-registry.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,KAAK,EAAE,WAAW,EAAS,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAClE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAEpD,MAAM,WAAW,iBAAiB;IAChC,QAAQ,IAAI,WAAW,CAAC;IACxB,QAAQ,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,CAAC;IAC7B,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IACjD,gFAAgF;IAChF,OAAO,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC;CAC5C;AAED,MAAM,WAAW,aAAc,SAAQ,SAAS;IAC9C,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC;CACvC;AAOD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,iBAAiB,GAAG,aAAa,CAmC1E"}
@@ -0,0 +1,42 @@
1
+ function allTracks(state) {
2
+ if (state.presentation === null)
3
+ return [];
4
+ return state.presentation.periods.flatMap((period) => period.tracks);
5
+ }
6
+ export function createTrackRegistry(deps) {
7
+ function find(trackId) {
8
+ return allTracks(deps.getState()).find((track) => track.id === trackId) ?? null;
9
+ }
10
+ return {
11
+ get available() {
12
+ return allTracks(deps.getState());
13
+ },
14
+ active(contentType) {
15
+ const activeId = deps.getState().tracks.active.get(contentType);
16
+ if (activeId === undefined)
17
+ return null;
18
+ return find(activeId);
19
+ },
20
+ selectable(trackId) {
21
+ const track = find(trackId);
22
+ return track !== null && deps.hasSink(track.contentType);
23
+ },
24
+ select(trackId) {
25
+ const track = find(trackId);
26
+ if (track !== null && !deps.hasSink(track.contentType)) {
27
+ // Selecting a track nothing can render is refused up front; the
28
+ // reducer cannot see the sink registry, so the check lives here.
29
+ deps.emitEvent('command:rejected', {
30
+ command: 'SELECT_TRACK',
31
+ reason: `no sink registered for '${track.contentType}'`,
32
+ });
33
+ return;
34
+ }
35
+ deps.dispatch({ type: 'SELECT_TRACK', trackId });
36
+ },
37
+ deselect(contentType) {
38
+ deps.dispatch({ type: 'DESELECT_TRACK', contentType });
39
+ },
40
+ };
41
+ }
42
+ //# sourceMappingURL=track-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"track-registry.js","sourceRoot":"","sources":["../../src/kernel/track-registry.ts"],"names":[],"mappings":"AAuBA,SAAS,SAAS,CAAC,KAAkB;IACnC,IAAI,KAAK,CAAC,YAAY,KAAK,IAAI;QAAE,OAAO,EAAE,CAAC;IAC3C,OAAO,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AACvE,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,IAAuB;IACzD,SAAS,IAAI,CAAC,OAAgB;QAC5B,OAAO,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,OAAO,CAAC,IAAI,IAAI,CAAC;IAClF,CAAC;IAED,OAAO;QACL,IAAI,SAAS;YACX,OAAO,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QACpC,CAAC;QACD,MAAM,CAAC,WAAW;YAChB,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;YAChE,IAAI,QAAQ,KAAK,SAAS;gBAAE,OAAO,IAAI,CAAC;YACxC,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC;QACxB,CAAC;QACD,UAAU,CAAC,OAAO;YAChB,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;YAC5B,OAAO,KAAK,KAAK,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAC3D,CAAC;QACD,MAAM,CAAC,OAAO;YACZ,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;YAC5B,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC;gBACvD,gEAAgE;gBAChE,iEAAiE;gBACjE,IAAI,CAAC,SAAS,CAAC,kBAAkB,EAAE;oBACjC,OAAO,EAAE,cAAc;oBACvB,MAAM,EAAE,2BAA2B,KAAK,CAAC,WAAW,GAAG;iBACxD,CAAC,CAAC;gBACH,OAAO;YACT,CAAC;YACD,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,CAAC,CAAC;QACnD,CAAC;QACD,QAAQ,CAAC,WAAW;YAClB,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,WAAW,EAAE,CAAC,CAAC;QACzD,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,90 @@
1
+ /**
2
+ * The fetch wrapper. Executes fetch effects, feeds results back as facts,
3
+ * and owns per-token AbortControllers so the abort effect can target any
4
+ * request, including one stalled in a timeout or waiting out a backoff.
5
+ *
6
+ * Extension points, used by cmcd, content-steering, and the playground's
7
+ * fault injector:
8
+ * - request hooks mutate a draft (url, headers, timeout) before dispatch
9
+ * - response hooks observe the outcome (status, rtt, size) after it
10
+ * - fetchImpl replaces the network entirely, which is how tests and the
11
+ * fault injector produce deterministic bad networks
12
+ *
13
+ * Example:
14
+ * transport.addRequestHook((req) => {
15
+ * req.headers['CMCD-Request'] = `sid=${sessionId}`;
16
+ * });
17
+ */
18
+ import type { InflightRequest } from '../types/kernel.js';
19
+ import type { Fact } from '../types/messages.js';
20
+ import type { EffectRunner } from './effects.js';
21
+ /** Retry policy as data, not code. */
22
+ export interface RetryPolicy {
23
+ /** Total attempts including the first. */
24
+ readonly maxAttempts: number;
25
+ readonly baseDelayMs: number;
26
+ readonly factor: number;
27
+ readonly maxDelayMs: number;
28
+ /** HTTP statuses worth retrying. Network errors and timeouts always retry. */
29
+ readonly retryStatuses: readonly number[];
30
+ }
31
+ export declare const DEFAULT_RETRY_POLICY: RetryPolicy;
32
+ /** Backoff delay before retry `attempt` (1 = first retry). Exported so tests pin the schedule. */
33
+ export declare function backoffDelayMs(policy: RetryPolicy, attempt: number): number;
34
+ /** The mutable draft request hooks receive before dispatch. */
35
+ export interface TransportRequestDraft {
36
+ url: string;
37
+ headers: Record<string, string>;
38
+ timeoutMs: number | null;
39
+ readonly token: string;
40
+ readonly attempt: number;
41
+ }
42
+ export interface TransportResponseInfo {
43
+ readonly token: string;
44
+ readonly url: string;
45
+ readonly status: number | null;
46
+ readonly rtt: number;
47
+ readonly size: number;
48
+ readonly outcome: 'success' | 'failure' | 'timeout';
49
+ readonly attempt: number;
50
+ }
51
+ export type RequestHook = (req: TransportRequestDraft) => void;
52
+ export type ResponseHook = (res: TransportResponseInfo) => void;
53
+ export type FetchImpl = (url: string, init: RequestInit) => Promise<Response>;
54
+ export interface TransportOptions {
55
+ readonly absorb: (fact: Fact) => void;
56
+ /** Correlates a token with its request record from kernel state. */
57
+ readonly inflight: (token: string) => InflightRequest | undefined;
58
+ readonly retry?: Partial<RetryPolicy>;
59
+ /** Default timeout when the fetch effect carries none. Null disables. */
60
+ readonly defaultTimeoutMs?: number | null;
61
+ readonly fetchImpl?: FetchImpl;
62
+ readonly now?: () => number;
63
+ /**
64
+ * Decides from the response Content-Type whether the manifest request's
65
+ * body is worth reading. Returning false fails the request as an
66
+ * unsupported manifest before the body downloads, so an audio file
67
+ * handed to `load` costs one round of headers, not the whole file. Only
68
+ * the request on the `manifest` track is checked; segments never are.
69
+ */
70
+ readonly acceptManifestType?: (contentType: string) => boolean;
71
+ }
72
+ export interface Transport {
73
+ registerHandlers(runner: EffectRunner): void;
74
+ addRequestHook(hook: RequestHook): () => void;
75
+ addResponseHook(hook: ResponseHook): () => void;
76
+ /**
77
+ * A one-off request through the same request hooks and fetchImpl as
78
+ * segments, for license and steering fetches. Not correlated to a token
79
+ * or the reducer; the caller awaits the Response directly.
80
+ */
81
+ request(url: string, init: {
82
+ method?: string;
83
+ headers?: Record<string, string>;
84
+ body?: ArrayBuffer | Uint8Array | string;
85
+ }): Promise<Response>;
86
+ /** Tokens with live network activity or a pending retry. For tests and diagnostics. */
87
+ pending(): readonly string[];
88
+ }
89
+ export declare function createTransport(options: TransportOptions): Transport;
90
+ //# sourceMappingURL=transport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../../src/kernel/transport.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEjD,sCAAsC;AACtC,MAAM,WAAW,WAAW;IAC1B,0CAA0C;IAC1C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,8EAA8E;IAC9E,QAAQ,CAAC,aAAa,EAAE,SAAS,MAAM,EAAE,CAAC;CAC3C;AAED,eAAO,MAAM,oBAAoB,EAAE,WAMlC,CAAC;AAEF,kGAAkG;AAClG,wBAAgB,cAAc,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAE3E;AAED,+DAA+D;AAC/D,MAAM,WAAW,qBAAqB;IACpC,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;IACpD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,MAAM,WAAW,GAAG,CAAC,GAAG,EAAE,qBAAqB,KAAK,IAAI,CAAC;AAC/D,MAAM,MAAM,YAAY,GAAG,CAAC,GAAG,EAAE,qBAAqB,KAAK,IAAI,CAAC;AAEhE,MAAM,MAAM,SAAS,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;AAE9E,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;IACtC,oEAAoE;IACpE,QAAQ,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,eAAe,GAAG,SAAS,CAAC;IAClE,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;IACtC,yEAAyE;IACzE,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1C,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,CAAC;IAC/B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IAC5B;;;;;;OAMG;IACH,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC;CAChE;AAED,MAAM,WAAW,SAAS;IACxB,gBAAgB,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,CAAC;IAC7C,cAAc,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,IAAI,CAAC;IAC9C,eAAe,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,IAAI,CAAC;IAChD;;;;OAIG;IACH,OAAO,CACL,GAAG,EAAE,MAAM,EACX,IAAI,EAAE;QACJ,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACjC,IAAI,CAAC,EAAE,WAAW,GAAG,UAAU,GAAG,MAAM,CAAC;KAC1C,GACA,OAAO,CAAC,QAAQ,CAAC,CAAC;IACrB,uFAAuF;IACvF,OAAO,IAAI,SAAS,MAAM,EAAE,CAAC;CAC9B;AAUD,wBAAgB,eAAe,CAAC,OAAO,EAAE,gBAAgB,GAAG,SAAS,CA0QpE"}