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,57 @@
1
+ //#region src/stages/text-webvtt-segmented/index.ts
2
+ const MPEGTS_TIMESCALE = 9e4;
3
+ function timestampToSeconds(text) {
4
+ const [rest, millis] = text.split(".");
5
+ const parts = (rest !== null && rest !== void 0 ? rest : "").split(":").map(Number);
6
+ const [h, m, s] = parts.length === 3 ? parts : [0, ...parts];
7
+ return (h !== null && h !== void 0 ? h : 0) * 3600 + (m !== null && m !== void 0 ? m : 0) * 60 + (s !== null && s !== void 0 ? s : 0) + Number(millis !== null && millis !== void 0 ? millis : 0) / 1e3;
8
+ }
9
+ function secondsToTimestamp(seconds) {
10
+ const clamped = Math.max(0, seconds);
11
+ const h = Math.floor(clamped / 3600);
12
+ const m = Math.floor(clamped % 3600 / 60);
13
+ const s = Math.floor(clamped % 60);
14
+ const ms = Math.round((clamped - Math.floor(clamped)) * 1e3);
15
+ const pad = (value, width) => String(value).padStart(width, "0");
16
+ return `${pad(h, 2)}:${pad(m, 2)}:${pad(s, 2)}.${pad(ms, 3)}`;
17
+ }
18
+ /** Applies the segment's X-TIMESTAMP-MAP to every cue timing, in text. */
19
+ function shiftTimestampMap(text) {
20
+ const header = /X-TIMESTAMP-MAP=([^\r\n]+)/.exec(text);
21
+ if (header === null) return text;
22
+ let local = 0;
23
+ let mpegts = 0;
24
+ for (const part of header[1].split(",")) {
25
+ const [key, value] = splitOnce(part.trim());
26
+ if (key === "LOCAL") local = timestampToSeconds(value);
27
+ if (key === "MPEGTS") mpegts = Number(value);
28
+ }
29
+ const offset = mpegts / MPEGTS_TIMESCALE - local;
30
+ return text.replace(/X-TIMESTAMP-MAP=[^\r\n]*\r?\n?/, "").replace(/((?:\d+:)?[0-5]\d:[0-5]\d\.\d{3})(\s+-->\s+)((?:\d+:)?[0-5]\d:[0-5]\d\.\d{3})/g, (_, start, arrow, end) => `${secondsToTimestamp(timestampToSeconds(start) + offset)}${arrow}${secondsToTimestamp(timestampToSeconds(end) + offset)}`);
31
+ }
32
+ function splitOnce(part) {
33
+ const index = part.indexOf(":");
34
+ if (index === -1) return [part, ""];
35
+ return [part.slice(0, index), part.slice(index + 1)];
36
+ }
37
+ function textWebvttSegmented() {
38
+ return {
39
+ name: "text-webvtt-segmented",
40
+ provides: ["text-webvtt-segmented"],
41
+ requires: ["text-webvtt"],
42
+ install(ctx) {
43
+ ctx.registerTransform({
44
+ name: "vtt-timestamp-map",
45
+ order: 50,
46
+ transform(data, meta) {
47
+ if (meta.contentType !== "text") return data;
48
+ const text = new TextDecoder().decode(data);
49
+ if (!text.includes("X-TIMESTAMP-MAP")) return data;
50
+ return new TextEncoder().encode(shiftTimestampMap(text));
51
+ }
52
+ });
53
+ }
54
+ };
55
+ }
56
+ //#endregion
57
+ export { textWebvttSegmented as default, shiftTimestampMap };
@@ -0,0 +1,73 @@
1
+ import _asyncToGenerator from "../../_virtual/_@oxc-project_runtime@0.147.0/helpers/esm/asyncToGenerator.js";
2
+ //#region src/stages/thumbnails/index.ts
3
+ function timestamp(text) {
4
+ const parts = text.trim().split(":").map(Number);
5
+ const [h, m, s] = parts.length === 3 ? parts : [0, ...parts];
6
+ return (h !== null && h !== void 0 ? h : 0) * 3600 + (m !== null && m !== void 0 ? m : 0) * 60 + (s !== null && s !== void 0 ? s : 0);
7
+ }
8
+ /** Parses a WebVTT thumbnail track into tiles, resolving URLs against a base. */
9
+ function parseThumbnailTrack(text, baseUrl) {
10
+ const thumbnails = [];
11
+ const blocks = text.replace(/\r/g, "").split("\n\n");
12
+ for (const block of blocks) {
13
+ const lines = block.split("\n").filter((line) => line !== "");
14
+ const timing = lines.find((line) => line.includes("-->"));
15
+ const target = lines.find((line) => !line.includes("-->") && line !== "WEBVTT" && line !== "");
16
+ if (timing === void 0 || target === void 0) continue;
17
+ const [from, to] = timing.split("-->");
18
+ const start = timestamp(from !== null && from !== void 0 ? from : "");
19
+ const end = timestamp(to !== null && to !== void 0 ? to : "");
20
+ const [rawUrl, fragment] = target.split("#");
21
+ const url = new URL(rawUrl !== null && rawUrl !== void 0 ? rawUrl : "", baseUrl).href;
22
+ let [x, y, width, height] = [
23
+ 0,
24
+ 0,
25
+ 0,
26
+ 0
27
+ ];
28
+ const xywh = /xywh=(?:pixel:)?(\d+),(\d+),(\d+),(\d+)/.exec(fragment !== null && fragment !== void 0 ? fragment : "");
29
+ if (xywh !== null) {
30
+ x = Number(xywh[1]);
31
+ y = Number(xywh[2]);
32
+ width = Number(xywh[3]);
33
+ height = Number(xywh[4]);
34
+ }
35
+ thumbnails.push({
36
+ url,
37
+ start,
38
+ end,
39
+ x,
40
+ y,
41
+ width,
42
+ height
43
+ });
44
+ }
45
+ return thumbnails;
46
+ }
47
+ function thumbnails() {
48
+ return {
49
+ name: "thumbnails",
50
+ provides: ["thumbnails"],
51
+ requires: ["transport"],
52
+ install(ctx) {
53
+ let tiles = [];
54
+ ctx.registerNamespace("thumbnails", {
55
+ load(url) {
56
+ return _asyncToGenerator(function* () {
57
+ tiles = parseThumbnailTrack(yield (yield ctx.request(url, { method: "GET" })).text(), url);
58
+ return tiles.length;
59
+ })();
60
+ },
61
+ at(time) {
62
+ var _tiles$find;
63
+ return (_tiles$find = tiles.find((tile) => time >= tile.start && time < tile.end)) !== null && _tiles$find !== void 0 ? _tiles$find : null;
64
+ },
65
+ get all() {
66
+ return tiles;
67
+ }
68
+ });
69
+ }
70
+ };
71
+ }
72
+ //#endregion
73
+ export { thumbnails as default, parseThumbnailTrack };
@@ -0,0 +1,32 @@
1
+ import type { MatteboxBase, MatteboxOptions } from './types/facade.js';
2
+ export { createReducer, initialState, resolveConfig } from './kernel/reducer.js';
3
+ export { canSwitchTo } from './kernel/rendition-select.js';
4
+ export { exportTrace, replay } from './kernel/trace.js';
5
+ export type * from './types/error.js';
6
+ export type * from './types/facade.js';
7
+ export type * from './types/ir.js';
8
+ export type * from './types/kernel.js';
9
+ export type * from './types/messages.js';
10
+ export type * from './types/quality.js';
11
+ export type * from './types/sink.js';
12
+ export type * from './types/stage.js';
13
+ /**
14
+ * Namespaces contributed by stages. Empty here on purpose: a stage's module
15
+ * augments this interface (declaration merging) so that, for example,
16
+ * `engine.live` is typed exactly when `hls-live` or `dash-live` is loaded.
17
+ * Without the merge the property does not exist, matching the runtime, where
18
+ * an absent stage leaves no stub behind.
19
+ */
20
+ export interface MatteboxNamespaces {
21
+ }
22
+ /**
23
+ * The engine facade. Namespace members are optional because presence
24
+ * depends on the loaded stages; `'live' in engine` is the feature test.
25
+ */
26
+ export type Mattebox = MatteboxBase & Partial<MatteboxNamespaces>;
27
+ /** Creates an engine. The element is supplied later via `attach`. */
28
+ export declare function mattebox(options: MatteboxOptions): Mattebox;
29
+ export declare namespace mattebox {
30
+ var from: (el: HTMLMediaElement) => Mattebox | null;
31
+ }
32
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAMvE,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEjF,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAExD,mBAAmB,kBAAkB,CAAC;AACtC,mBAAmB,mBAAmB,CAAC;AACvC,mBAAmB,eAAe,CAAC;AACnC,mBAAmB,mBAAmB,CAAC;AACvC,mBAAmB,qBAAqB,CAAC;AACzC,mBAAmB,oBAAoB,CAAC;AACxC,mBAAmB,iBAAiB,CAAC;AACrC,mBAAmB,kBAAkB,CAAC;AAEtC;;;;;;GAMG;AAEH,MAAM,WAAW,kBAAkB;CAAG;AAEtC;;;GAGG;AACH,MAAM,MAAM,QAAQ,GAAG,YAAY,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;AAIlE,qEAAqE;AACrE,wBAAgB,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,QAAQ,CAsZ3D;yBAtZe,QAAQ;mBA4ZH,gBAAgB,KAAG,QAAQ,GAAG,IAAI"}
package/dist/index.js ADDED
@@ -0,0 +1,423 @@
1
+ /**
2
+ * Mattebox: a modular adaptive-streaming engine for HLS and DASH.
3
+ * The public entry: the mattebox() factory composes the kernel with the
4
+ * caller's stages; mattebox.from() finds an engine from its element. One
5
+ * name for both, so the ESM import and the CDN global read the same.
6
+ */
7
+ import { createBus } from './kernel/bus.js';
8
+ import { createEffectRunner } from './kernel/effects.js';
9
+ import { createLifecycle } from './kernel/lifecycle.js';
10
+ import { compose } from './kernel/loader.js';
11
+ import { normalizeMimeType } from './kernel/mime.js';
12
+ import { createMseController } from './kernel/mse.js';
13
+ import { createReducer, initialState, resolveConfig } from './kernel/reducer.js';
14
+ import { createArbiter } from './kernel/rendition-select.js';
15
+ import { createMseSink } from './kernel/sinks/mse-sink.js';
16
+ import { createTrackRegistry } from './kernel/track-registry.js';
17
+ import { createTransport } from './kernel/transport.js';
18
+ // Diagnosability is a project goal: the trace tooling is public API. A
19
+ // production trace replays into a fresh reducer as a regression test.
20
+ export { createReducer, initialState, resolveConfig } from './kernel/reducer.js';
21
+ // The kernel's default answer to entanglement #2; the abr stage consumes it.
22
+ export { canSwitchTo } from './kernel/rendition-select.js';
23
+ export { exportTrace, replay } from './kernel/trace.js';
24
+ const registry = new WeakMap();
25
+ /** Creates an engine. The element is supplied later via `attach`. */
26
+ export function mattebox(options) {
27
+ const composition = compose(options.stages ?? []);
28
+ // A timing transform makes media time equal presentation time; the
29
+ // scheduler must know, or a discontinuity gets re-anchored twice.
30
+ const config = {
31
+ ...options.config,
32
+ mediaTimeNormalized: options.config?.mediaTimeNormalized ??
33
+ composition.capabilities.includes('media-time-normalized'),
34
+ };
35
+ const cfg = resolveConfig(config);
36
+ const bus = createBus({
37
+ reducer: createReducer([], config),
38
+ initial: initialState(config),
39
+ traceCapacity: cfg.traceCapacity,
40
+ });
41
+ const runner = createEffectRunner({ onEvent: (event, payload) => bus.emitEvent(event, payload) });
42
+ bus.setEffectSink((effects) => runner.run(effects));
43
+ // A transform pipeline routes media bytes through registerTransform steps
44
+ // before the SourceBuffer, exactly as the deliver effect routes cue bytes.
45
+ // Wired only when the composition actually registered a transform, so a
46
+ // CMAF composition keeps the direct-enqueue append path untouched.
47
+ const mediaTransforms = composition.capabilities.includes('media-transform');
48
+ const mse = createMseController({
49
+ absorb: (fact) => bus.absorb(fact),
50
+ backBufferSeconds: cfg.backBufferSeconds,
51
+ // A codec-less rendition's buffer is typed from its first segment,
52
+ // when a stage registered a probe; without one the bare type is tried.
53
+ inferType: (bytes) => hooks.typeProbe?.(bytes) ?? null,
54
+ ...(mediaTransforms
55
+ ? {
56
+ appendTransform: async (data, meta) => {
57
+ let out = data;
58
+ for (const step of bus.transforms()) {
59
+ out = new Uint8Array(await step.transform(out, meta));
60
+ }
61
+ return out;
62
+ },
63
+ }
64
+ : {}),
65
+ });
66
+ mse.registerHandlers(runner);
67
+ const transport = createTransport({
68
+ absorb: (fact) => bus.absorb(fact),
69
+ inflight: (token) => bus.getState().scheduling.inflight.get(token),
70
+ // A media Content-Type on the manifest response that no adapter parses
71
+ // (an mp3, a progressive mp4) is refused before the body downloads.
72
+ // Anything else, including octet-stream, downloads and is sniffed.
73
+ acceptManifestType: (contentType) => {
74
+ const type = normalizeMimeType(contentType);
75
+ return !(type.startsWith('audio/') || type.startsWith('video/')) || accepts(type);
76
+ },
77
+ ...(options.transport?.retry !== undefined ? { retry: options.transport.retry } : {}),
78
+ ...(options.transport?.fetchImpl !== undefined
79
+ ? { fetchImpl: options.transport.fetchImpl }
80
+ : {}),
81
+ });
82
+ transport.registerHandlers(runner);
83
+ for (const hook of options.transport?.requestHooks ?? [])
84
+ transport.addRequestHook(hook);
85
+ for (const hook of options.transport?.responseHooks ?? [])
86
+ transport.addResponseHook(hook);
87
+ runner.register('emit', (effect) => {
88
+ bus.emitEvent(effect.event, effect.payload);
89
+ return undefined;
90
+ });
91
+ runner.register('schedule', (effect) => {
92
+ const id = setTimeout(() => {
93
+ runner.forget(effect.token);
94
+ // Ticks carry the wall time of their firing: the one clock input a
95
+ // pure slice can loop itself.
96
+ const msg = effect.then.type === 'TICK'
97
+ ? { ...effect.then, wallClock: Date.now() / 1000 }
98
+ : effect.then;
99
+ bus.route(msg);
100
+ }, effect.delayMs);
101
+ return () => clearTimeout(id);
102
+ });
103
+ runner.register('seekElement', (effect) => {
104
+ const el = lifecycle.element();
105
+ if (el !== null)
106
+ el.currentTime = effect.to;
107
+ return undefined;
108
+ });
109
+ // Cue sinks arrive from stages as factories; the kernel instantiates one
110
+ // per content type at first use, against the attached element, so the
111
+ // emitCues, deliver, and clearCues effects have a live target. Cleared on
112
+ // detach with the element.
113
+ const cueSinks = new Map();
114
+ function cueSinkFor(contentType) {
115
+ const existing = cueSinks.get(contentType);
116
+ if (existing !== undefined)
117
+ return existing;
118
+ const el = lifecycle.element();
119
+ if (el === null)
120
+ return null;
121
+ const factory = bus.sinkFor(contentType);
122
+ if (factory === undefined)
123
+ return null;
124
+ const sink = factory({ element: el });
125
+ cueSinks.set(contentType, sink);
126
+ return sink;
127
+ }
128
+ function contentTypeOfTrack(trackId) {
129
+ for (const period of bus.getState().presentation?.periods ?? []) {
130
+ for (const track of period.tracks) {
131
+ if (track.id === trackId)
132
+ return track.contentType;
133
+ }
134
+ }
135
+ return null;
136
+ }
137
+ runner.register('emitCues', (effect) => {
138
+ const contentType = contentTypeOfTrack(effect.trackId);
139
+ if (contentType !== 'text' && contentType !== 'metadata')
140
+ return undefined;
141
+ cueSinkFor(contentType)?.handleEmitCues(effect.trackId, effect.cues);
142
+ return undefined;
143
+ });
144
+ // Byte delivery for cue pipelines: transforms in declared order, then the
145
+ // sink parses and answers with effects. A per-engine chain keeps segment
146
+ // order even when a transform is asynchronous.
147
+ let deliverChain = Promise.resolve();
148
+ runner.register('deliver', (effect) => {
149
+ const sink = cueSinkFor(effect.contentType);
150
+ if (sink === null)
151
+ return undefined;
152
+ deliverChain = deliverChain
153
+ .then(async () => {
154
+ let data = new Uint8Array(effect.data);
155
+ for (const step of bus.transforms()) {
156
+ data = new Uint8Array(await step.transform(data, effect.meta));
157
+ }
158
+ const bytes = data.byteOffset === 0 && data.byteLength === data.buffer.byteLength
159
+ ? data.buffer
160
+ : data.slice().buffer;
161
+ const produced = sink.accept(effect.trackId, bytes, effect.meta);
162
+ if (produced.length > 0)
163
+ runner.run(produced);
164
+ })
165
+ .catch(() => {
166
+ // A cue pipeline degrades; playback is untouched.
167
+ bus.emitEvent('error', {
168
+ category: 'media',
169
+ code: 'MEDIA_CONTAINER_INVALID',
170
+ fatal: false,
171
+ recoverable: false,
172
+ trackId: effect.trackId,
173
+ });
174
+ });
175
+ return undefined;
176
+ });
177
+ runner.register('clearCues', (effect) => {
178
+ for (const sink of cueSinks.values()) {
179
+ sink.clear(effect.trackId, effect.start, effect.end);
180
+ }
181
+ return undefined;
182
+ });
183
+ // The kernel owns the media sinks; stages own text and metadata.
184
+ const sinkInstances = new Map();
185
+ for (const contentType of ['video', 'audio']) {
186
+ const sink = createMseSink(contentType, { buffered: (sbId) => mse.buffered(sbId) });
187
+ sinkInstances.set(contentType, sink);
188
+ bus.registerSink(contentType, () => sink);
189
+ }
190
+ for (const capability of composition.capabilities) {
191
+ bus.registerCapability(capability);
192
+ }
193
+ const tracks = createTrackRegistry({
194
+ getState: () => bus.getState(),
195
+ dispatch: (cmd) => bus.dispatch(cmd),
196
+ emitEvent: (event, payload) => bus.emitEvent(event, payload),
197
+ hasSink: (contentType) => bus.sinkFor(contentType) !== undefined,
198
+ });
199
+ const arbiter = createArbiter();
200
+ // Shared with the stage contexts: the abr stage sets `abr` at install and
201
+ // the reducer reads it live through this object.
202
+ const hooks = { manifestTypes: composition.manifestTypes };
203
+ let lastError = null;
204
+ function accepts(mimeType) {
205
+ return composition.manifestTypes.has(normalizeMimeType(mimeType));
206
+ }
207
+ function activeVideoRenditions() {
208
+ const state = bus.getState();
209
+ if (state.presentation === null)
210
+ return [];
211
+ const activeId = state.tracks.active.get('video');
212
+ for (const period of state.presentation.periods) {
213
+ for (const track of period.tracks) {
214
+ if (track.contentType !== 'video')
215
+ continue;
216
+ if (activeId === undefined || track.id === activeId)
217
+ return track.renditions;
218
+ }
219
+ }
220
+ return [];
221
+ }
222
+ function arbitrated() {
223
+ const state = bus.getState();
224
+ return arbiter.run({
225
+ renditions: activeVideoRenditions(),
226
+ constraints: state.quality.constraints,
227
+ pinned: state.quality.pinned,
228
+ current: state.quality.active,
229
+ couplings: state.presentation?.couplings ?? [],
230
+ activeTracks: state.tracks.active,
231
+ availableGroups: (() => {
232
+ const groups = new Set();
233
+ for (const period of state.presentation?.periods ?? []) {
234
+ for (const track of period.tracks) {
235
+ if (track.contentType !== 'audio' && track.contentType !== 'text')
236
+ continue;
237
+ const colon = track.id.indexOf(':');
238
+ groups.add(`${track.contentType}:${colon === -1 ? track.id : track.id.slice(0, colon)}`);
239
+ }
240
+ }
241
+ return groups;
242
+ })(),
243
+ telemetry: {
244
+ throughputEwma: state.stats.throughputEwma,
245
+ throughputFastEwma: state.stats.throughputFastEwma,
246
+ current: state.quality.active,
247
+ currentTime: state.playback.currentTime,
248
+ },
249
+ }, state.quality.version);
250
+ }
251
+ const facadeTarget = {};
252
+ // The element's own error (a decoder that gave up, a source the browser
253
+ // rejects) is reported as a fatal engine error, never papered over by a
254
+ // reload: a rebuilt pipeline restarts playback visibly, which is worse
255
+ // than an honest error. In-place recovery (nudges, gap jumps, flushes,
256
+ // skips, rendition exclusion) is the recovery stage's job and happens
257
+ // before the decoder ever fails.
258
+ const MEDIA_ERR = [
259
+ '',
260
+ 'MEDIA_ERR_ABORTED',
261
+ 'MEDIA_ERR_NETWORK',
262
+ 'MEDIA_ERR_DECODE',
263
+ 'MEDIA_ERR_SRC_NOT_SUPPORTED',
264
+ ];
265
+ function onMediaError(el) {
266
+ const code = el.error?.code ?? 0;
267
+ // An abort is the app's doing; an engine that already halted keeps its error.
268
+ if (code === 1 || lastError !== null)
269
+ return;
270
+ bus.emitEvent('error', {
271
+ category: 'media',
272
+ code: code === 4 ? 'MEDIA_CODEC_UNSUPPORTED' : 'MEDIA_DECODE_ERROR',
273
+ fatal: true,
274
+ recoverable: false,
275
+ context: { mediaError: MEDIA_ERR[code] ?? code, message: el.error?.message ?? '' },
276
+ });
277
+ }
278
+ const base = {
279
+ get media() {
280
+ return lifecycle.element();
281
+ },
282
+ quality: {
283
+ get renditions() {
284
+ return activeVideoRenditions();
285
+ },
286
+ get allowed() {
287
+ const ids = arbitrated().result.allowed;
288
+ return activeVideoRenditions().filter((r) => ids.includes(r.id));
289
+ },
290
+ get active() {
291
+ const id = bus.getState().quality.active;
292
+ return activeVideoRenditions().find((r) => r.id === id) ?? null;
293
+ },
294
+ get playing() {
295
+ const state = bus.getState();
296
+ const id = arbiter.playingAt(state.quality.appendLog, state.playback.currentTime);
297
+ return activeVideoRenditions().find((r) => r.id === id) ?? null;
298
+ },
299
+ get pinned() {
300
+ return bus.getState().quality.pinned;
301
+ },
302
+ get constraints() {
303
+ return bus.getState().quality.constraints;
304
+ },
305
+ constrain(source, constraint) {
306
+ bus.dispatch({ type: 'CONSTRAIN', source, constraint });
307
+ },
308
+ release(source) {
309
+ bus.dispatch({ type: 'RELEASE_CONSTRAINT', source });
310
+ },
311
+ pin(renditionId, pinOptions) {
312
+ bus.dispatch({
313
+ type: 'PIN_RENDITION',
314
+ renditionId,
315
+ apply: pinOptions?.apply ?? 'soon',
316
+ });
317
+ },
318
+ auto() {
319
+ bus.dispatch({ type: 'RELEASE_PIN' });
320
+ },
321
+ },
322
+ tracks,
323
+ stats: {
324
+ get throughput() {
325
+ return bus.getState().stats.throughputEwma;
326
+ },
327
+ trace() {
328
+ return bus.trace();
329
+ },
330
+ snapshot() {
331
+ return bus.getState();
332
+ },
333
+ },
334
+ get error() {
335
+ return lastError;
336
+ },
337
+ async attach(el) {
338
+ // async so a synchronous composition or occupancy error surfaces as
339
+ // a rejection, matching the declared Promise contract.
340
+ lifecycle.attach(el);
341
+ },
342
+ async detach() {
343
+ lifecycle.detach();
344
+ },
345
+ load(url, loadOptions) {
346
+ // Consumers hand over page-relative URLs; the IR stores absolute ones
347
+ // and parsers resolve against the manifest URL, so absolutize here.
348
+ let absolute = url;
349
+ try {
350
+ absolute = new URL(url, globalThis.location?.href).href;
351
+ }
352
+ catch {
353
+ // No document base (tests, workers): the caller's URL stands.
354
+ }
355
+ lastError = null;
356
+ bus.dispatch({
357
+ type: 'LOAD',
358
+ url: absolute,
359
+ ...(loadOptions?.mimeType !== undefined ? { mimeType: loadOptions.mimeType } : {}),
360
+ });
361
+ },
362
+ unload() {
363
+ bus.dispatch({ type: 'UNLOAD' });
364
+ },
365
+ dispatch(cmd) {
366
+ bus.dispatch(cmd);
367
+ },
368
+ capabilities() {
369
+ return composition.capabilities.map((capability) => typeof capability === 'string'
370
+ ? capability
371
+ : `${capability.contentType}:${capability.mimeType}`);
372
+ },
373
+ accepts,
374
+ on(event, fn) {
375
+ return bus.on(event, fn);
376
+ },
377
+ };
378
+ bus.on('error', (payload) => {
379
+ const summary = payload;
380
+ if (summary.fatal === true) {
381
+ lastError = {
382
+ category: summary.category ?? 'internal',
383
+ code: summary.code ?? 'INTERNAL_ASSERTION',
384
+ fatal: true,
385
+ recoverable: summary.recoverable ?? false,
386
+ trace: bus.trace(),
387
+ };
388
+ }
389
+ });
390
+ // Copy descriptors, not values: Object.assign would evaluate every live
391
+ // getter once and freeze the result.
392
+ Object.defineProperties(facadeTarget, Object.getOwnPropertyDescriptors(base));
393
+ const engine = facadeTarget;
394
+ const lifecycle = createLifecycle({
395
+ bus,
396
+ mse,
397
+ composition,
398
+ facade: facadeTarget,
399
+ config,
400
+ hooks,
401
+ addRequestHook: (hook) => transport.addRequestHook(hook),
402
+ request: (url, init) => transport.request(url, init),
403
+ register: (el) => registry.set(el, engine),
404
+ unregister: (el) => {
405
+ registry.delete(el);
406
+ // Nothing started before the detach may land after it: pending
407
+ // timers and fetches go, and the cue sinks release their native
408
+ // tracks (the element cannot drop a TextTrack, so they empty them).
409
+ runner.cancelAll();
410
+ for (const sink of cueSinks.values())
411
+ sink.dispose();
412
+ cueSinks.clear();
413
+ },
414
+ onMediaError,
415
+ });
416
+ return engine;
417
+ }
418
+ /**
419
+ * Static lookup from an element to its engine, backed by a WeakMap. The
420
+ * element itself carries no added surface and garbage-collects normally.
421
+ */
422
+ mattebox.from = (el) => registry.get(el) ?? null;
423
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Per-SourceBuffer FIFO, strictly serialized on updateend. The single most
3
+ * common MSE bug is touching a SourceBuffer while `updating` is true; every
4
+ * operation here waits its turn.
5
+ *
6
+ * Quota handling: an append that throws QuotaExceededError goes back to the
7
+ * front of the queue and the owner is notified with an attempt count. The
8
+ * owner enqueues eviction removes with `enqueueFront`, so they run before
9
+ * the failed append retries; queued appends behind it keep their order. The
10
+ * attempt count resets as soon as an append succeeds, so only consecutive
11
+ * failures escalate.
12
+ */
13
+ import type { SbId } from '../types/kernel.js';
14
+ import type { Fact } from '../types/messages.js';
15
+ export type QueueOp = {
16
+ readonly op: 'append';
17
+ readonly data: ArrayBuffer;
18
+ } | {
19
+ readonly op: 'remove';
20
+ readonly start: number;
21
+ readonly end: number;
22
+ } | {
23
+ readonly op: 'changeType';
24
+ readonly type: string;
25
+ } | {
26
+ readonly op: 'setTimestampOffset';
27
+ readonly offset: number;
28
+ };
29
+ export interface AppendQueueCallbacks {
30
+ absorb(fact: Fact): void;
31
+ /** appendBuffer threw QuotaExceededError. `attempt` counts consecutive failures, starting at 1. */
32
+ onQuota(sbId: SbId, attempt: number): void;
33
+ /** The queue drained and the buffer is not updating. Used for deferred endOfStream. */
34
+ onIdle(sbId: SbId): void;
35
+ }
36
+ export interface AppendQueue {
37
+ enqueue(op: QueueOp): void;
38
+ /** Jumps the queue. For eviction removes that must precede a retried append. */
39
+ enqueueFront(op: QueueOp): void;
40
+ /** sourceBuffer.abort() semantics: pending operations are dropped, not retried. */
41
+ abort(): void;
42
+ /** Detach teardown: drops everything and removes listeners. Idempotent. */
43
+ destroy(): void;
44
+ readonly idle: () => boolean;
45
+ }
46
+ export declare function createAppendQueue(sbId: SbId, sb: SourceBuffer, cb: AppendQueueCallbacks): AppendQueue;
47
+ //# sourceMappingURL=append-queue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"append-queue.d.ts","sourceRoot":"","sources":["../../src/kernel/append-queue.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAEjD,MAAM,MAAM,OAAO,GACf;IAAE,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAA;CAAE,GACrD;IAAE,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GACvE;IAAE,QAAQ,CAAC,EAAE,EAAE,YAAY,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACpD;IAAE,QAAQ,CAAC,EAAE,EAAE,oBAAoB,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnE,MAAM,WAAW,oBAAoB;IACnC,MAAM,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;IACzB,mGAAmG;IACnG,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3C,uFAAuF;IACvF,MAAM,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;CAC1B;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,CAAC,EAAE,EAAE,OAAO,GAAG,IAAI,CAAC;IAC3B,gFAAgF;IAChF,YAAY,CAAC,EAAE,EAAE,OAAO,GAAG,IAAI,CAAC;IAChC,mFAAmF;IACnF,KAAK,IAAI,IAAI,CAAC;IACd,2EAA2E;IAC3E,OAAO,IAAI,IAAI,CAAC;IAChB,QAAQ,CAAC,IAAI,EAAE,MAAM,OAAO,CAAC;CAC9B;AAUD,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,IAAI,EACV,EAAE,EAAE,YAAY,EAChB,EAAE,EAAE,oBAAoB,GACvB,WAAW,CAwKb"}