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.
- package/LICENSE +21 -0
- package/README.md +106 -0
- package/dist/cdn/mattebox.dash-drm.min.js +2 -0
- package/dist/cdn/mattebox.dash.min.js +2 -0
- package/dist/cdn/mattebox.dual-drm.min.js +2 -0
- package/dist/cdn/mattebox.dual-ts-drm.min.js +3 -0
- package/dist/cdn/mattebox.dual-ts.min.js +3 -0
- package/dist/cdn/mattebox.dual.min.js +2 -0
- package/dist/cdn/mattebox.hls-drm.min.js +2 -0
- package/dist/cdn/mattebox.hls-ts-drm.min.js +3 -0
- package/dist/cdn/mattebox.hls-ts.min.js +3 -0
- package/dist/cdn/mattebox.hls.min.js +2 -0
- package/dist/cdn/mattebox.kernel.min.js +1 -0
- package/dist/cdn/mattebox.min.js +6 -0
- package/dist/cdn/transmux.worker.js +1 -0
- package/dist/containers/adts.d.ts +33 -0
- package/dist/containers/adts.d.ts.map +1 -0
- package/dist/containers/adts.js +66 -0
- package/dist/containers/adts.js.map +1 -0
- package/dist/containers/captions.d.ts +27 -0
- package/dist/containers/captions.d.ts.map +1 -0
- package/dist/containers/captions.js +36 -0
- package/dist/containers/captions.js.map +1 -0
- package/dist/containers/codec-probe/index.d.ts +35 -0
- package/dist/containers/codec-probe/index.d.ts.map +1 -0
- package/dist/containers/codec-probe/index.js +222 -0
- package/dist/containers/codec-probe/index.js.map +1 -0
- package/dist/containers/fmp4/writer.d.ts +62 -0
- package/dist/containers/fmp4/writer.d.ts.map +1 -0
- package/dist/containers/fmp4/writer.js +201 -0
- package/dist/containers/fmp4/writer.js.map +1 -0
- package/dist/containers/id3.d.ts +25 -0
- package/dist/containers/id3.d.ts.map +1 -0
- package/dist/containers/id3.js +75 -0
- package/dist/containers/id3.js.map +1 -0
- package/dist/containers/mp4-box/index.d.ts +79 -0
- package/dist/containers/mp4-box/index.d.ts.map +1 -0
- package/dist/containers/mp4-box/index.js +231 -0
- package/dist/containers/mp4-box/index.js.map +1 -0
- package/dist/containers/packed-audio/index.d.ts +7 -0
- package/dist/containers/packed-audio/index.d.ts.map +1 -0
- package/dist/containers/packed-audio/index.js +63 -0
- package/dist/containers/packed-audio/index.js.map +1 -0
- package/dist/containers/sei.d.ts +26 -0
- package/dist/containers/sei.d.ts.map +1 -0
- package/dist/containers/sei.js +100 -0
- package/dist/containers/sei.js.map +1 -0
- package/dist/containers/ts-transmux/demux.d.ts +49 -0
- package/dist/containers/ts-transmux/demux.d.ts.map +1 -0
- package/dist/containers/ts-transmux/demux.js +222 -0
- package/dist/containers/ts-transmux/demux.js.map +1 -0
- package/dist/containers/ts-transmux/h264.d.ts +48 -0
- package/dist/containers/ts-transmux/h264.d.ts.map +1 -0
- package/dist/containers/ts-transmux/h264.js +211 -0
- package/dist/containers/ts-transmux/h264.js.map +1 -0
- package/dist/containers/ts-transmux/index.d.ts +17 -0
- package/dist/containers/ts-transmux/index.d.ts.map +1 -0
- package/dist/containers/ts-transmux/index.js +34 -0
- package/dist/containers/ts-transmux/index.js.map +1 -0
- package/dist/containers/ts-transmux/runner.d.ts +23 -0
- package/dist/containers/ts-transmux/runner.d.ts.map +1 -0
- package/dist/containers/ts-transmux/runner.js +99 -0
- package/dist/containers/ts-transmux/runner.js.map +1 -0
- package/dist/containers/ts-transmux/transmux.d.ts +24 -0
- package/dist/containers/ts-transmux/transmux.d.ts.map +1 -0
- package/dist/containers/ts-transmux/transmux.js +212 -0
- package/dist/containers/ts-transmux/transmux.js.map +1 -0
- package/dist/containers/ts-transmux/transmux.worker.d.ts +2 -0
- package/dist/containers/ts-transmux/transmux.worker.d.ts.map +1 -0
- package/dist/containers/ts-transmux/transmux.worker.js +19 -0
- package/dist/containers/ts-transmux/transmux.worker.js.map +1 -0
- package/dist/es2015/_virtual/_@oxc-project_runtime@0.147.0/helpers/esm/asyncToGenerator.js +27 -0
- package/dist/es2015/_virtual/_@oxc-project_runtime@0.147.0/helpers/esm/defineProperty.js +12 -0
- package/dist/es2015/_virtual/_@oxc-project_runtime@0.147.0/helpers/esm/objectSpread2.js +25 -0
- package/dist/es2015/_virtual/_@oxc-project_runtime@0.147.0/helpers/esm/objectWithoutProperties.js +13 -0
- package/dist/es2015/_virtual/_@oxc-project_runtime@0.147.0/helpers/esm/objectWithoutPropertiesLoose.js +12 -0
- package/dist/es2015/_virtual/_@oxc-project_runtime@0.147.0/helpers/esm/toPrimitive.js +14 -0
- package/dist/es2015/_virtual/_@oxc-project_runtime@0.147.0/helpers/esm/toPropertyKey.js +9 -0
- package/dist/es2015/_virtual/_@oxc-project_runtime@0.147.0/helpers/esm/typeof.js +11 -0
- package/dist/es2015/containers/adts.js +77 -0
- package/dist/es2015/containers/captions.js +36 -0
- package/dist/es2015/containers/codec-probe/index.js +220 -0
- package/dist/es2015/containers/fmp4/writer.js +165 -0
- package/dist/es2015/containers/id3.js +72 -0
- package/dist/es2015/containers/mp4-box/index.js +209 -0
- package/dist/es2015/containers/packed-audio/index.js +67 -0
- package/dist/es2015/containers/sei.js +79 -0
- package/dist/es2015/containers/ts-transmux/demux.js +211 -0
- package/dist/es2015/containers/ts-transmux/h264.js +204 -0
- package/dist/es2015/containers/ts-transmux/index.js +37 -0
- package/dist/es2015/containers/ts-transmux/runner.js +95 -0
- package/dist/es2015/containers/ts-transmux/transmux.js +210 -0
- package/dist/es2015/containers/ts-transmux/transmux.worker.js +26 -0
- package/dist/es2015/index.js +356 -0
- package/dist/es2015/kernel/append-queue.js +148 -0
- package/dist/es2015/kernel/bus.js +134 -0
- package/dist/es2015/kernel/context.js +92 -0
- package/dist/es2015/kernel/effects.js +62 -0
- package/dist/es2015/kernel/evictor.js +67 -0
- package/dist/es2015/kernel/lifecycle.js +122 -0
- package/dist/es2015/kernel/loader.js +108 -0
- package/dist/es2015/kernel/mime.js +20 -0
- package/dist/es2015/kernel/mse.js +426 -0
- package/dist/es2015/kernel/reducer.js +1051 -0
- package/dist/es2015/kernel/rendition-select.js +263 -0
- package/dist/es2015/kernel/scheduler.js +82 -0
- package/dist/es2015/kernel/sinks/metadata-sink.js +7 -0
- package/dist/es2015/kernel/sinks/mse-sink.js +31 -0
- package/dist/es2015/kernel/sinks/text-track-sink.js +167 -0
- package/dist/es2015/kernel/timeline.js +127 -0
- package/dist/es2015/kernel/trace.js +134 -0
- package/dist/es2015/kernel/track-registry.js +47 -0
- package/dist/es2015/kernel/transport.js +242 -0
- package/dist/es2015/kernel/watchdog.js +38 -0
- package/dist/es2015/presets/dash/index.js +9 -0
- package/dist/es2015/presets/dash-drm/index.js +13 -0
- package/dist/es2015/presets/define.js +45 -0
- package/dist/es2015/presets/dual/index.js +14 -0
- package/dist/es2015/presets/dual-drm/index.js +14 -0
- package/dist/es2015/presets/dual-ts/index.js +14 -0
- package/dist/es2015/presets/dual-ts-drm/index.js +15 -0
- package/dist/es2015/presets/full/index.js +28 -0
- package/dist/es2015/presets/hls/index.js +9 -0
- package/dist/es2015/presets/hls-drm/index.js +13 -0
- package/dist/es2015/presets/hls-ts/index.js +13 -0
- package/dist/es2015/presets/hls-ts-drm/index.js +14 -0
- package/dist/es2015/presets/kernel/index.js +10 -0
- package/dist/es2015/presets/storage.js +24 -0
- package/dist/es2015/presets/tiers.js +93 -0
- package/dist/es2015/protocols/dash-cmaf/index.js +161 -0
- package/dist/es2015/protocols/dash-cmaf/parse.js +491 -0
- package/dist/es2015/protocols/dash-live/index.js +192 -0
- package/dist/es2015/protocols/hls-cmaf/index.js +168 -0
- package/dist/es2015/protocols/hls-cmaf/lexer.js +72 -0
- package/dist/es2015/protocols/hls-cmaf/parse.js +457 -0
- package/dist/es2015/protocols/hls-live/index.js +296 -0
- package/dist/es2015/protocols/live-shared.js +29 -0
- package/dist/es2015/stages/abr/index.js +126 -0
- package/dist/es2015/stages/abr-cap-size/index.js +22 -0
- package/dist/es2015/stages/abr-persist/index.js +52 -0
- package/dist/es2015/stages/aes-128/index.js +76 -0
- package/dist/es2015/stages/alt-audio/index.js +80 -0
- package/dist/es2015/stages/cmaf-timing/index.js +55 -0
- package/dist/es2015/stages/cmcd/index.js +70 -0
- package/dist/es2015/stages/codec-probe/index.js +65 -0
- package/dist/es2015/stages/codec-switch/index.js +48 -0
- package/dist/es2015/stages/content-steering/index.js +179 -0
- package/dist/es2015/stages/drm-shared.js +18 -0
- package/dist/es2015/stages/eme-cenc/index.js +46 -0
- package/dist/es2015/stages/eme-core/index.js +237 -0
- package/dist/es2015/stages/eme-fairplay/index.js +52 -0
- package/dist/es2015/stages/meta-id3/index.js +37 -0
- package/dist/es2015/stages/mp4-box/index.js +27 -0
- package/dist/es2015/stages/nal-scan/index.js +121 -0
- package/dist/es2015/stages/pdt/index.js +34 -0
- package/dist/es2015/stages/recovery/index.js +283 -0
- package/dist/es2015/stages/text-cea608/decode.js +201 -0
- package/dist/es2015/stages/text-cea608/index.js +71 -0
- package/dist/es2015/stages/text-webvtt/index.js +82 -0
- package/dist/es2015/stages/text-webvtt/parse.js +60 -0
- package/dist/es2015/stages/text-webvtt-segmented/index.js +57 -0
- package/dist/es2015/stages/thumbnails/index.js +73 -0
- package/dist/index.d.ts +32 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +423 -0
- package/dist/index.js.map +1 -0
- package/dist/kernel/append-queue.d.ts +47 -0
- package/dist/kernel/append-queue.d.ts.map +1 -0
- package/dist/kernel/append-queue.js +180 -0
- package/dist/kernel/append-queue.js.map +1 -0
- package/dist/kernel/bus.d.ts +50 -0
- package/dist/kernel/bus.d.ts.map +1 -0
- package/dist/kernel/bus.js +147 -0
- package/dist/kernel/bus.js.map +1 -0
- package/dist/kernel/context.d.ts +45 -0
- package/dist/kernel/context.d.ts.map +1 -0
- package/dist/kernel/context.js +116 -0
- package/dist/kernel/context.js.map +1 -0
- package/dist/kernel/effects.d.ts +33 -0
- package/dist/kernel/effects.d.ts.map +1 -0
- package/dist/kernel/effects.js +65 -0
- package/dist/kernel/effects.js.map +1 -0
- package/dist/kernel/evictor.d.ts +46 -0
- package/dist/kernel/evictor.d.ts.map +1 -0
- package/dist/kernel/evictor.js +92 -0
- package/dist/kernel/evictor.js.map +1 -0
- package/dist/kernel/lifecycle.d.ts +41 -0
- package/dist/kernel/lifecycle.d.ts.map +1 -0
- package/dist/kernel/lifecycle.js +129 -0
- package/dist/kernel/lifecycle.js.map +1 -0
- package/dist/kernel/loader.d.ts +28 -0
- package/dist/kernel/loader.d.ts.map +1 -0
- package/dist/kernel/loader.js +126 -0
- package/dist/kernel/loader.js.map +1 -0
- package/dist/kernel/mime.d.ts +13 -0
- package/dist/kernel/mime.d.ts.map +1 -0
- package/dist/kernel/mime.js +18 -0
- package/dist/kernel/mime.js.map +1 -0
- package/dist/kernel/mse.d.ts +62 -0
- package/dist/kernel/mse.d.ts.map +1 -0
- package/dist/kernel/mse.js +490 -0
- package/dist/kernel/mse.js.map +1 -0
- package/dist/kernel/reducer.d.ts +39 -0
- package/dist/kernel/reducer.d.ts.map +1 -0
- package/dist/kernel/reducer.js +1316 -0
- package/dist/kernel/reducer.js.map +1 -0
- package/dist/kernel/rendition-select.d.ts +102 -0
- package/dist/kernel/rendition-select.d.ts.map +1 -0
- package/dist/kernel/rendition-select.js +295 -0
- package/dist/kernel/rendition-select.js.map +1 -0
- package/dist/kernel/scheduler.d.ts +57 -0
- package/dist/kernel/scheduler.d.ts.map +1 -0
- package/dist/kernel/scheduler.js +98 -0
- package/dist/kernel/scheduler.js.map +1 -0
- package/dist/kernel/sinks/metadata-sink.d.ts +7 -0
- package/dist/kernel/sinks/metadata-sink.d.ts.map +1 -0
- package/dist/kernel/sinks/metadata-sink.js +5 -0
- package/dist/kernel/sinks/metadata-sink.js.map +1 -0
- package/dist/kernel/sinks/mse-sink.d.ts +17 -0
- package/dist/kernel/sinks/mse-sink.d.ts.map +1 -0
- package/dist/kernel/sinks/mse-sink.js +20 -0
- package/dist/kernel/sinks/mse-sink.js.map +1 -0
- package/dist/kernel/sinks/text-track-sink.d.ts +45 -0
- package/dist/kernel/sinks/text-track-sink.d.ts.map +1 -0
- package/dist/kernel/sinks/text-track-sink.js +184 -0
- package/dist/kernel/sinks/text-track-sink.js.map +1 -0
- package/dist/kernel/timeline.d.ts +57 -0
- package/dist/kernel/timeline.d.ts.map +1 -0
- package/dist/kernel/timeline.js +203 -0
- package/dist/kernel/timeline.js.map +1 -0
- package/dist/kernel/trace.d.ts +42 -0
- package/dist/kernel/trace.d.ts.map +1 -0
- package/dist/kernel/trace.js +165 -0
- package/dist/kernel/trace.js.map +1 -0
- package/dist/kernel/track-registry.d.ts +22 -0
- package/dist/kernel/track-registry.d.ts.map +1 -0
- package/dist/kernel/track-registry.js +42 -0
- package/dist/kernel/track-registry.js.map +1 -0
- package/dist/kernel/transport.d.ts +90 -0
- package/dist/kernel/transport.d.ts.map +1 -0
- package/dist/kernel/transport.js +256 -0
- package/dist/kernel/transport.js.map +1 -0
- package/dist/kernel/watchdog.d.ts +35 -0
- package/dist/kernel/watchdog.d.ts.map +1 -0
- package/dist/kernel/watchdog.js +43 -0
- package/dist/kernel/watchdog.js.map +1 -0
- package/dist/presets/dash/index.d.ts +4 -0
- package/dist/presets/dash/index.d.ts.map +1 -0
- package/dist/presets/dash/index.js +8 -0
- package/dist/presets/dash/index.js.map +1 -0
- package/dist/presets/dash-drm/index.d.ts +4 -0
- package/dist/presets/dash-drm/index.d.ts.map +1 -0
- package/dist/presets/dash-drm/index.js +8 -0
- package/dist/presets/dash-drm/index.js.map +1 -0
- package/dist/presets/define.d.ts +36 -0
- package/dist/presets/define.d.ts.map +1 -0
- package/dist/presets/define.js +39 -0
- package/dist/presets/define.js.map +1 -0
- package/dist/presets/dual/index.d.ts +4 -0
- package/dist/presets/dual/index.d.ts.map +1 -0
- package/dist/presets/dual/index.js +9 -0
- package/dist/presets/dual/index.js.map +1 -0
- package/dist/presets/dual-drm/index.d.ts +4 -0
- package/dist/presets/dual-drm/index.d.ts.map +1 -0
- package/dist/presets/dual-drm/index.js +13 -0
- package/dist/presets/dual-drm/index.js.map +1 -0
- package/dist/presets/dual-ts/index.d.ts +4 -0
- package/dist/presets/dual-ts/index.d.ts.map +1 -0
- package/dist/presets/dual-ts/index.js +8 -0
- package/dist/presets/dual-ts/index.js.map +1 -0
- package/dist/presets/dual-ts-drm/index.d.ts +4 -0
- package/dist/presets/dual-ts-drm/index.d.ts.map +1 -0
- package/dist/presets/dual-ts-drm/index.js +14 -0
- package/dist/presets/dual-ts-drm/index.js.map +1 -0
- package/dist/presets/full/index.d.ts +4 -0
- package/dist/presets/full/index.d.ts.map +1 -0
- package/dist/presets/full/index.js +27 -0
- package/dist/presets/full/index.js.map +1 -0
- package/dist/presets/hls/index.d.ts +4 -0
- package/dist/presets/hls/index.d.ts.map +1 -0
- package/dist/presets/hls/index.js +8 -0
- package/dist/presets/hls/index.js.map +1 -0
- package/dist/presets/hls-drm/index.d.ts +4 -0
- package/dist/presets/hls-drm/index.d.ts.map +1 -0
- package/dist/presets/hls-drm/index.js +8 -0
- package/dist/presets/hls-drm/index.js.map +1 -0
- package/dist/presets/hls-ts/index.d.ts +4 -0
- package/dist/presets/hls-ts/index.d.ts.map +1 -0
- package/dist/presets/hls-ts/index.js +8 -0
- package/dist/presets/hls-ts/index.js.map +1 -0
- package/dist/presets/hls-ts-drm/index.d.ts +4 -0
- package/dist/presets/hls-ts-drm/index.d.ts.map +1 -0
- package/dist/presets/hls-ts-drm/index.js +13 -0
- package/dist/presets/hls-ts-drm/index.js.map +1 -0
- package/dist/presets/kernel/index.d.ts +4 -0
- package/dist/presets/kernel/index.d.ts.map +1 -0
- package/dist/presets/kernel/index.js +9 -0
- package/dist/presets/kernel/index.js.map +1 -0
- package/dist/presets/storage.d.ts +9 -0
- package/dist/presets/storage.d.ts.map +1 -0
- package/dist/presets/storage.js +24 -0
- package/dist/presets/storage.js.map +1 -0
- package/dist/presets/tiers.d.ts +22 -0
- package/dist/presets/tiers.d.ts.map +1 -0
- package/dist/presets/tiers.js +78 -0
- package/dist/presets/tiers.js.map +1 -0
- package/dist/protocols/dash-cmaf/index.d.ts +20 -0
- package/dist/protocols/dash-cmaf/index.d.ts.map +1 -0
- package/dist/protocols/dash-cmaf/index.js +176 -0
- package/dist/protocols/dash-cmaf/index.js.map +1 -0
- package/dist/protocols/dash-cmaf/parse.d.ts +24 -0
- package/dist/protocols/dash-cmaf/parse.d.ts.map +1 -0
- package/dist/protocols/dash-cmaf/parse.js +586 -0
- package/dist/protocols/dash-cmaf/parse.js.map +1 -0
- package/dist/protocols/dash-live/index.d.ts +4 -0
- package/dist/protocols/dash-live/index.d.ts.map +1 -0
- package/dist/protocols/dash-live/index.js +188 -0
- package/dist/protocols/dash-live/index.js.map +1 -0
- package/dist/protocols/hls-cmaf/index.d.ts +17 -0
- package/dist/protocols/hls-cmaf/index.d.ts.map +1 -0
- package/dist/protocols/hls-cmaf/index.js +189 -0
- package/dist/protocols/hls-cmaf/index.js.map +1 -0
- package/dist/protocols/hls-cmaf/lexer.d.ts +25 -0
- package/dist/protocols/hls-cmaf/lexer.d.ts.map +1 -0
- package/dist/protocols/hls-cmaf/lexer.js +81 -0
- package/dist/protocols/hls-cmaf/lexer.js.map +1 -0
- package/dist/protocols/hls-cmaf/parse.d.ts +57 -0
- package/dist/protocols/hls-cmaf/parse.d.ts.map +1 -0
- package/dist/protocols/hls-cmaf/parse.js +572 -0
- package/dist/protocols/hls-cmaf/parse.js.map +1 -0
- package/dist/protocols/hls-live/index.d.ts +4 -0
- package/dist/protocols/hls-live/index.d.ts.map +1 -0
- package/dist/protocols/hls-live/index.js +309 -0
- package/dist/protocols/hls-live/index.js.map +1 -0
- package/dist/protocols/live-shared.d.ts +21 -0
- package/dist/protocols/live-shared.d.ts.map +1 -0
- package/dist/protocols/live-shared.js +32 -0
- package/dist/protocols/live-shared.js.map +1 -0
- package/dist/stages/abr/index.d.ts +16 -0
- package/dist/stages/abr/index.d.ts.map +1 -0
- package/dist/stages/abr/index.js +176 -0
- package/dist/stages/abr/index.js.map +1 -0
- package/dist/stages/abr-cap-size/index.d.ts +8 -0
- package/dist/stages/abr-cap-size/index.d.ts.map +1 -0
- package/dist/stages/abr-cap-size/index.js +21 -0
- package/dist/stages/abr-cap-size/index.js.map +1 -0
- package/dist/stages/abr-persist/index.d.ts +8 -0
- package/dist/stages/abr-persist/index.d.ts.map +1 -0
- package/dist/stages/abr-persist/index.js +44 -0
- package/dist/stages/abr-persist/index.js.map +1 -0
- package/dist/stages/aes-128/index.d.ts +15 -0
- package/dist/stages/aes-128/index.d.ts.map +1 -0
- package/dist/stages/aes-128/index.js +78 -0
- package/dist/stages/aes-128/index.js.map +1 -0
- package/dist/stages/alt-audio/index.d.ts +4 -0
- package/dist/stages/alt-audio/index.d.ts.map +1 -0
- package/dist/stages/alt-audio/index.js +90 -0
- package/dist/stages/alt-audio/index.js.map +1 -0
- package/dist/stages/cmaf-timing/index.d.ts +3 -0
- package/dist/stages/cmaf-timing/index.d.ts.map +1 -0
- package/dist/stages/cmaf-timing/index.js +56 -0
- package/dist/stages/cmaf-timing/index.js.map +1 -0
- package/dist/stages/cmcd/index.d.ts +22 -0
- package/dist/stages/cmcd/index.d.ts.map +1 -0
- package/dist/stages/cmcd/index.js +92 -0
- package/dist/stages/cmcd/index.js.map +1 -0
- package/dist/stages/codec-probe/index.d.ts +9 -0
- package/dist/stages/codec-probe/index.d.ts.map +1 -0
- package/dist/stages/codec-probe/index.js +68 -0
- package/dist/stages/codec-probe/index.js.map +1 -0
- package/dist/stages/codec-switch/index.d.ts +6 -0
- package/dist/stages/codec-switch/index.d.ts.map +1 -0
- package/dist/stages/codec-switch/index.js +59 -0
- package/dist/stages/codec-switch/index.js.map +1 -0
- package/dist/stages/content-steering/index.d.ts +4 -0
- package/dist/stages/content-steering/index.d.ts.map +1 -0
- package/dist/stages/content-steering/index.js +174 -0
- package/dist/stages/content-steering/index.js.map +1 -0
- package/dist/stages/drm-shared.d.ts +46 -0
- package/dist/stages/drm-shared.d.ts.map +1 -0
- package/dist/stages/drm-shared.js +28 -0
- package/dist/stages/drm-shared.js.map +1 -0
- package/dist/stages/eme-cenc/index.d.ts +12 -0
- package/dist/stages/eme-cenc/index.d.ts.map +1 -0
- package/dist/stages/eme-cenc/index.js +53 -0
- package/dist/stages/eme-cenc/index.js.map +1 -0
- package/dist/stages/eme-core/index.d.ts +29 -0
- package/dist/stages/eme-core/index.d.ts.map +1 -0
- package/dist/stages/eme-core/index.js +244 -0
- package/dist/stages/eme-core/index.js.map +1 -0
- package/dist/stages/eme-fairplay/index.d.ts +20 -0
- package/dist/stages/eme-fairplay/index.d.ts.map +1 -0
- package/dist/stages/eme-fairplay/index.js +59 -0
- package/dist/stages/eme-fairplay/index.js.map +1 -0
- package/dist/stages/meta-id3/index.d.ts +14 -0
- package/dist/stages/meta-id3/index.d.ts.map +1 -0
- package/dist/stages/meta-id3/index.js +30 -0
- package/dist/stages/meta-id3/index.js.map +1 -0
- package/dist/stages/mp4-box/index.d.ts +3 -0
- package/dist/stages/mp4-box/index.d.ts.map +1 -0
- package/dist/stages/mp4-box/index.js +19 -0
- package/dist/stages/mp4-box/index.js.map +1 -0
- package/dist/stages/nal-scan/index.d.ts +3 -0
- package/dist/stages/nal-scan/index.d.ts.map +1 -0
- package/dist/stages/nal-scan/index.js +123 -0
- package/dist/stages/nal-scan/index.js.map +1 -0
- package/dist/stages/pdt/index.d.ts +14 -0
- package/dist/stages/pdt/index.d.ts.map +1 -0
- package/dist/stages/pdt/index.js +34 -0
- package/dist/stages/pdt/index.js.map +1 -0
- package/dist/stages/recovery/index.d.ts +16 -0
- package/dist/stages/recovery/index.d.ts.map +1 -0
- package/dist/stages/recovery/index.js +270 -0
- package/dist/stages/recovery/index.js.map +1 -0
- package/dist/stages/text-cea608/decode.d.ts +44 -0
- package/dist/stages/text-cea608/decode.d.ts.map +1 -0
- package/dist/stages/text-cea608/decode.js +225 -0
- package/dist/stages/text-cea608/decode.js.map +1 -0
- package/dist/stages/text-cea608/index.d.ts +3 -0
- package/dist/stages/text-cea608/index.d.ts.map +1 -0
- package/dist/stages/text-cea608/index.js +84 -0
- package/dist/stages/text-cea608/index.js.map +1 -0
- package/dist/stages/text-webvtt/index.d.ts +3 -0
- package/dist/stages/text-webvtt/index.d.ts.map +1 -0
- package/dist/stages/text-webvtt/index.js +82 -0
- package/dist/stages/text-webvtt/index.js.map +1 -0
- package/dist/stages/text-webvtt/parse.d.ts +19 -0
- package/dist/stages/text-webvtt/parse.d.ts.map +1 -0
- package/dist/stages/text-webvtt/parse.js +62 -0
- package/dist/stages/text-webvtt/parse.js.map +1 -0
- package/dist/stages/text-webvtt-segmented/index.d.ts +5 -0
- package/dist/stages/text-webvtt-segmented/index.d.ts.map +1 -0
- package/dist/stages/text-webvtt-segmented/index.js +63 -0
- package/dist/stages/text-webvtt-segmented/index.js.map +1 -0
- package/dist/stages/thumbnails/index.d.ts +34 -0
- package/dist/stages/thumbnails/index.d.ts.map +1 -0
- package/dist/stages/thumbnails/index.js +58 -0
- package/dist/stages/thumbnails/index.js.map +1 -0
- package/dist/types/error.d.ts +33 -0
- package/dist/types/error.d.ts.map +1 -0
- package/dist/types/error.js +7 -0
- package/dist/types/error.js.map +1 -0
- package/dist/types/facade.d.ts +104 -0
- package/dist/types/facade.d.ts.map +1 -0
- package/dist/types/facade.js +2 -0
- package/dist/types/facade.js.map +1 -0
- package/dist/types/ir.d.ts +238 -0
- package/dist/types/ir.d.ts.map +1 -0
- package/dist/types/ir.js +7 -0
- package/dist/types/ir.js.map +1 -0
- package/dist/types/kernel.d.ts +217 -0
- package/dist/types/kernel.d.ts.map +1 -0
- package/dist/types/kernel.js +2 -0
- package/dist/types/kernel.js.map +1 -0
- package/dist/types/messages.d.ts +288 -0
- package/dist/types/messages.d.ts.map +1 -0
- package/dist/types/messages.js +2 -0
- package/dist/types/messages.js.map +1 -0
- package/dist/types/quality.d.ts +108 -0
- package/dist/types/quality.d.ts.map +1 -0
- package/dist/types/quality.js +2 -0
- package/dist/types/quality.js.map +1 -0
- package/dist/types/sink.d.ts +27 -0
- package/dist/types/sink.d.ts.map +1 -0
- package/dist/types/sink.js +2 -0
- package/dist/types/sink.js.map +1 -0
- package/dist/types/stage.d.ts +139 -0
- package/dist/types/stage.d.ts.map +1 -0
- package/dist/types/stage.js +2 -0
- package/dist/types/stage.js.map +1 -0
- package/package.json +132 -0
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
export function createEffectRunner(options = {}) {
|
|
2
|
+
const onEvent = options.onEvent ?? (() => undefined);
|
|
3
|
+
const handlers = new Map();
|
|
4
|
+
const cancels = new Map();
|
|
5
|
+
function cancel(token) {
|
|
6
|
+
const fn = cancels.get(token);
|
|
7
|
+
if (fn === undefined)
|
|
8
|
+
return;
|
|
9
|
+
cancels.delete(token);
|
|
10
|
+
try {
|
|
11
|
+
fn();
|
|
12
|
+
}
|
|
13
|
+
catch (err) {
|
|
14
|
+
onEvent('kernel:effect-error', { kind: 'abort', message: String(err) });
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
return {
|
|
18
|
+
register(kind, handler) {
|
|
19
|
+
if (handlers.has(kind)) {
|
|
20
|
+
throw new Error(`duplicate handler for '${kind}'`);
|
|
21
|
+
}
|
|
22
|
+
// The map erases the per-kind parameter; run() only ever hands a
|
|
23
|
+
// handler the kind it was registered under.
|
|
24
|
+
handlers.set(kind, handler);
|
|
25
|
+
},
|
|
26
|
+
run(effects) {
|
|
27
|
+
for (const effect of effects) {
|
|
28
|
+
if (effect.kind === 'abort') {
|
|
29
|
+
cancel(effect.token);
|
|
30
|
+
// An abort handler is optional; the runner already did the work.
|
|
31
|
+
handlers.get('abort')?.(effect);
|
|
32
|
+
continue;
|
|
33
|
+
}
|
|
34
|
+
const handler = handlers.get(effect.kind);
|
|
35
|
+
if (handler === undefined) {
|
|
36
|
+
// An unhandled kind is an event, not a throw: a deployment without
|
|
37
|
+
// the owning module must degrade, not crash.
|
|
38
|
+
onEvent('kernel:effect-unhandled', { kind: effect.kind });
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
try {
|
|
42
|
+
const cancelFn = handler(effect);
|
|
43
|
+
if (cancelFn !== undefined && 'token' in effect) {
|
|
44
|
+
cancels.set(effect.token, cancelFn);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
catch (err) {
|
|
48
|
+
onEvent('kernel:effect-error', { kind: effect.kind, message: String(err) });
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
},
|
|
52
|
+
cancel,
|
|
53
|
+
forget(token) {
|
|
54
|
+
cancels.delete(token);
|
|
55
|
+
},
|
|
56
|
+
cancelAll() {
|
|
57
|
+
for (const token of [...cancels.keys()])
|
|
58
|
+
cancel(token);
|
|
59
|
+
},
|
|
60
|
+
pending() {
|
|
61
|
+
return [...cancels.keys()];
|
|
62
|
+
},
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=effects.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"effects.js","sourceRoot":"","sources":["../../src/kernel/effects.ts"],"names":[],"mappings":"AAoCA,MAAM,UAAU,kBAAkB,CAAC,UAAqC,EAAE;IACxE,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IACrD,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAiC,CAAC;IAC1D,MAAM,OAAO,GAAG,IAAI,GAAG,EAAsB,CAAC;IAE9C,SAAS,MAAM,CAAC,KAAa;QAC3B,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC9B,IAAI,EAAE,KAAK,SAAS;YAAE,OAAO;QAC7B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACtB,IAAI,CAAC;YACH,EAAE,EAAE,CAAC;QACP,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,qBAAqB,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC1E,CAAC;IACH,CAAC;IAED,OAAO;QACL,QAAQ,CAAC,IAAI,EAAE,OAAO;YACpB,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBACvB,MAAM,IAAI,KAAK,CAAC,0BAA0B,IAAI,GAAG,CAAC,CAAC;YACrD,CAAC;YACD,iEAAiE;YACjE,4CAA4C;YAC5C,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,OAAmC,CAAC,CAAC;QAC1D,CAAC;QACD,GAAG,CAAC,OAAO;YACT,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;gBAC7B,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;oBAC5B,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;oBACrB,iEAAiE;oBACjE,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;oBAChC,SAAS;gBACX,CAAC;gBACD,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;gBAC1C,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;oBAC1B,mEAAmE;oBACnE,6CAA6C;oBAC7C,OAAO,CAAC,yBAAyB,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;oBAC1D,SAAS;gBACX,CAAC;gBACD,IAAI,CAAC;oBACH,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;oBACjC,IAAI,QAAQ,KAAK,SAAS,IAAI,OAAO,IAAI,MAAM,EAAE,CAAC;wBAChD,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;oBACtC,CAAC;gBACH,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,OAAO,CAAC,qBAAqB,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAC9E,CAAC;YACH,CAAC;QACH,CAAC;QACD,MAAM;QACN,MAAM,CAAC,KAAK;YACV,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACxB,CAAC;QACD,SAAS;YACP,KAAK,MAAM,KAAK,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;gBAAE,MAAM,CAAC,KAAK,CAAC,CAAC;QACzD,CAAC;QACD,OAAO;YACL,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;QAC7B,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* QuotaExceededError recovery policy, executed against real SourceBuffer
|
|
3
|
+
* ranges. The reducer decides the steady-state policy (remove behind the
|
|
4
|
+
* playhead); this module plans escalating passes when one pass does not
|
|
5
|
+
* free enough, then tells the owner to stop and surface a fatal error
|
|
6
|
+
* rather than looping.
|
|
7
|
+
*
|
|
8
|
+
* "Never remove the range containing currentTime" is enforced as a keep-out
|
|
9
|
+
* window around the playhead, not as the whole contiguous buffered range: a
|
|
10
|
+
* VOD buffer is usually one range, and sparing all of it would make quota
|
|
11
|
+
* recovery impossible.
|
|
12
|
+
*
|
|
13
|
+
* With ManagedMediaSource the OS signals buffering pressure through
|
|
14
|
+
* startstreaming and endstreaming; the evictor listens to those instead of
|
|
15
|
+
* running any eviction on its own schedule. There is no timer here at all.
|
|
16
|
+
*/
|
|
17
|
+
export interface EvictionPlanEntry {
|
|
18
|
+
readonly start: number;
|
|
19
|
+
readonly end: number;
|
|
20
|
+
}
|
|
21
|
+
export interface EvictorOptions {
|
|
22
|
+
/** Seconds kept behind the playhead on a normal pass. */
|
|
23
|
+
readonly backBufferSeconds?: number;
|
|
24
|
+
/** Failed passes tolerated before the owner should surface a fatal error. */
|
|
25
|
+
readonly maxPasses?: number;
|
|
26
|
+
}
|
|
27
|
+
export interface Evictor {
|
|
28
|
+
/**
|
|
29
|
+
* Ranges to remove for escalation pass `attempt` (1-based), computed
|
|
30
|
+
* against the buffer's real ranges. Empty when nothing can be freed on
|
|
31
|
+
* this pass. Null when `attempt` exceeds maxPasses: stop evicting and
|
|
32
|
+
* surface a fatal error.
|
|
33
|
+
*/
|
|
34
|
+
plan(sb: SourceBuffer, currentTime: number, attempt: number): readonly EvictionPlanEntry[] | null;
|
|
35
|
+
/** Clamps an externally requested removal out of the playhead's keep-out window. */
|
|
36
|
+
clamp(sb: SourceBuffer, start: number, end: number, currentTime: number): EvictionPlanEntry | null;
|
|
37
|
+
/**
|
|
38
|
+
* Follows ManagedMediaSource streaming signals. On endstreaming the OS
|
|
39
|
+
* has what it needs; `onTrim` lets the owner run one back-buffer trim
|
|
40
|
+
* then. Returns an unlisten function.
|
|
41
|
+
*/
|
|
42
|
+
observeManaged(ms: EventTarget, onTrim: () => void): () => void;
|
|
43
|
+
readonly streaming: () => boolean;
|
|
44
|
+
}
|
|
45
|
+
export declare function createEvictor(options?: EvictorOptions): Evictor;
|
|
46
|
+
//# sourceMappingURL=evictor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evictor.d.ts","sourceRoot":"","sources":["../../src/kernel/evictor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC7B,yDAAyD;IACzD,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IACpC,6EAA6E;IAC7E,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,OAAO;IACtB;;;;;OAKG;IACH,IAAI,CAAC,EAAE,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,SAAS,iBAAiB,EAAE,GAAG,IAAI,CAAC;IAClG,oFAAoF;IACpF,KAAK,CACH,EAAE,EAAE,YAAY,EAChB,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,EACX,WAAW,EAAE,MAAM,GAClB,iBAAiB,GAAG,IAAI,CAAC;IAC5B;;;;OAIG;IACH,cAAc,CAAC,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC;IAChE,QAAQ,CAAC,SAAS,EAAE,MAAM,OAAO,CAAC;CACnC;AAWD,wBAAgB,aAAa,CAAC,OAAO,GAAE,cAAmB,GAAG,OAAO,CAwEnE"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* QuotaExceededError recovery policy, executed against real SourceBuffer
|
|
3
|
+
* ranges. The reducer decides the steady-state policy (remove behind the
|
|
4
|
+
* playhead); this module plans escalating passes when one pass does not
|
|
5
|
+
* free enough, then tells the owner to stop and surface a fatal error
|
|
6
|
+
* rather than looping.
|
|
7
|
+
*
|
|
8
|
+
* "Never remove the range containing currentTime" is enforced as a keep-out
|
|
9
|
+
* window around the playhead, not as the whole contiguous buffered range: a
|
|
10
|
+
* VOD buffer is usually one range, and sparing all of it would make quota
|
|
11
|
+
* recovery impossible.
|
|
12
|
+
*
|
|
13
|
+
* With ManagedMediaSource the OS signals buffering pressure through
|
|
14
|
+
* startstreaming and endstreaming; the evictor listens to those instead of
|
|
15
|
+
* running any eviction on its own schedule. There is no timer here at all.
|
|
16
|
+
*/
|
|
17
|
+
const DEFAULT_BACK_BUFFER = 30;
|
|
18
|
+
const DEFAULT_MAX_PASSES = 3;
|
|
19
|
+
/** Seconds behind the playhead that are never removed. */
|
|
20
|
+
const KEEPOUT_BEHIND_SECONDS = 1;
|
|
21
|
+
/** Seconds ahead of the playhead kept when the last pass drops forward buffer. */
|
|
22
|
+
const FORWARD_KEEP_SECONDS = 10;
|
|
23
|
+
export function createEvictor(options = {}) {
|
|
24
|
+
const backBuffer = options.backBufferSeconds ?? DEFAULT_BACK_BUFFER;
|
|
25
|
+
const maxPasses = options.maxPasses ?? DEFAULT_MAX_PASSES;
|
|
26
|
+
let streaming = true;
|
|
27
|
+
function clamp(_sb, start, end, currentTime) {
|
|
28
|
+
// An unbounded removal is a deliberate flush-forward: a quality switch
|
|
29
|
+
// clearing everything ahead of the playhead. The keep-out window
|
|
30
|
+
// guards eviction and housekeeping clears, never flushes; clamping a
|
|
31
|
+
// flush silently keeps the stale content and the switch never happens.
|
|
32
|
+
if (end === Number.POSITIVE_INFINITY) {
|
|
33
|
+
return { start, end };
|
|
34
|
+
}
|
|
35
|
+
const clampedEnd = Math.min(end, currentTime - KEEPOUT_BEHIND_SECONDS);
|
|
36
|
+
if (clampedEnd <= start)
|
|
37
|
+
return null;
|
|
38
|
+
return { start, end: clampedEnd };
|
|
39
|
+
}
|
|
40
|
+
function overlapsBuffered(sb, entry) {
|
|
41
|
+
const { buffered } = sb;
|
|
42
|
+
for (let i = 0; i < buffered.length; i += 1) {
|
|
43
|
+
if (entry.start < buffered.end(i) && entry.end > buffered.start(i))
|
|
44
|
+
return true;
|
|
45
|
+
}
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
return {
|
|
49
|
+
clamp,
|
|
50
|
+
plan(sb, currentTime, attempt) {
|
|
51
|
+
if (attempt > maxPasses)
|
|
52
|
+
return null;
|
|
53
|
+
const entries = [];
|
|
54
|
+
// Pass 1 keeps the configured back-buffer, pass 2 a quarter of it,
|
|
55
|
+
// pass 3 keeps only the keep-out window.
|
|
56
|
+
const keep = attempt === 1 ? backBuffer : attempt === 2 ? backBuffer / 4 : KEEPOUT_BEHIND_SECONDS;
|
|
57
|
+
const behind = clamp(sb, 0, currentTime - keep, currentTime);
|
|
58
|
+
if (behind !== null)
|
|
59
|
+
entries.push(behind);
|
|
60
|
+
if (attempt >= 3) {
|
|
61
|
+
// Last resort: drop forward buffer well ahead of the playhead. The
|
|
62
|
+
// scheduler refetches it later; a fatal quota error does not.
|
|
63
|
+
const aheadStart = currentTime + FORWARD_KEEP_SECONDS;
|
|
64
|
+
const { buffered } = sb;
|
|
65
|
+
const bufferedEnd = buffered.length > 0 ? buffered.end(buffered.length - 1) : 0;
|
|
66
|
+
if (bufferedEnd > aheadStart)
|
|
67
|
+
entries.push({ start: aheadStart, end: bufferedEnd });
|
|
68
|
+
}
|
|
69
|
+
// A removal touching nothing frees nothing, and worse: remove() on an
|
|
70
|
+
// ended MediaSource re-opens it, which turns an idle trim into an
|
|
71
|
+
// endless open, trim, end cycle on ManagedMediaSource.
|
|
72
|
+
return entries.filter((entry) => overlapsBuffered(sb, entry));
|
|
73
|
+
},
|
|
74
|
+
observeManaged(ms, onTrim) {
|
|
75
|
+
const onStart = () => {
|
|
76
|
+
streaming = true;
|
|
77
|
+
};
|
|
78
|
+
const onEnd = () => {
|
|
79
|
+
streaming = false;
|
|
80
|
+
onTrim();
|
|
81
|
+
};
|
|
82
|
+
ms.addEventListener('startstreaming', onStart);
|
|
83
|
+
ms.addEventListener('endstreaming', onEnd);
|
|
84
|
+
return () => {
|
|
85
|
+
ms.removeEventListener('startstreaming', onStart);
|
|
86
|
+
ms.removeEventListener('endstreaming', onEnd);
|
|
87
|
+
};
|
|
88
|
+
},
|
|
89
|
+
streaming: () => streaming,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=evictor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evictor.js","sourceRoot":"","sources":["../../src/kernel/evictor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Attach and detach, the docs-09 sequences, orchestrating the mse
|
|
3
|
+
* controller, the stage loader, and element listeners. The element itself
|
|
4
|
+
* is never modified beyond what attachment requires: autoplay untouched,
|
|
5
|
+
* no member shadowed, nothing monkey-patched.
|
|
6
|
+
*/
|
|
7
|
+
import type { KernelConfig } from '../types/kernel.js';
|
|
8
|
+
import type { TransportRequestDraftView } from '../types/stage.js';
|
|
9
|
+
import type { KernelBus } from './bus.js';
|
|
10
|
+
import type { HookRegistry } from './context.js';
|
|
11
|
+
import type { Composition } from './loader.js';
|
|
12
|
+
import type { MseController } from './mse.js';
|
|
13
|
+
export interface LifecycleDeps {
|
|
14
|
+
readonly bus: KernelBus;
|
|
15
|
+
readonly mse: MseController;
|
|
16
|
+
readonly composition: Composition;
|
|
17
|
+
readonly facade: Record<string, unknown>;
|
|
18
|
+
readonly config: Partial<KernelConfig> | undefined;
|
|
19
|
+
/** Shared mutable registry: stages set hooks at install, the reducer reads them live. */
|
|
20
|
+
readonly hooks: HookRegistry;
|
|
21
|
+
/** Transport request-hook registration, passed to stage contexts. */
|
|
22
|
+
readonly addRequestHook: (hook: (req: TransportRequestDraftView) => void) => () => void;
|
|
23
|
+
/** A one-off transport request, passed to stage contexts. */
|
|
24
|
+
readonly request: (url: string, init: {
|
|
25
|
+
method?: string;
|
|
26
|
+
headers?: Record<string, string>;
|
|
27
|
+
body?: ArrayBuffer | Uint8Array | string;
|
|
28
|
+
}) => Promise<Response>;
|
|
29
|
+
/** WeakMap registration, owned by the package entry. */
|
|
30
|
+
readonly register: (el: HTMLMediaElement) => void;
|
|
31
|
+
readonly unregister: (el: HTMLMediaElement) => void;
|
|
32
|
+
/** The element reported a media error; the package entry decides whether to rebuild. */
|
|
33
|
+
readonly onMediaError?: (el: HTMLMediaElement) => void;
|
|
34
|
+
}
|
|
35
|
+
export interface Lifecycle {
|
|
36
|
+
attach(el: HTMLMediaElement): void;
|
|
37
|
+
detach(): void;
|
|
38
|
+
element(): HTMLMediaElement | null;
|
|
39
|
+
}
|
|
40
|
+
export declare function createLifecycle(deps: LifecycleDeps): Lifecycle;
|
|
41
|
+
//# sourceMappingURL=lifecycle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../../src/kernel/lifecycle.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAgB,MAAM,oBAAoB,CAAC;AAErE,OAAO,KAAK,EAAS,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AAC1E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEjD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAI9C,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,GAAG,EAAE,SAAS,CAAC;IACxB,QAAQ,CAAC,GAAG,EAAE,aAAa,CAAC;IAC5B,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAClC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACzC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,SAAS,CAAC;IACnD,yFAAyF;IACzF,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;IAC7B,qEAAqE;IACrE,QAAQ,CAAC,cAAc,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,yBAAyB,KAAK,IAAI,KAAK,MAAM,IAAI,CAAC;IACxF,6DAA6D;IAC7D,QAAQ,CAAC,OAAO,EAAE,CAChB,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,KACE,OAAO,CAAC,QAAQ,CAAC,CAAC;IACvB,wDAAwD;IACxD,QAAQ,CAAC,QAAQ,EAAE,CAAC,EAAE,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAClD,QAAQ,CAAC,UAAU,EAAE,CAAC,EAAE,EAAE,gBAAgB,KAAK,IAAI,CAAC;IACpD,wFAAwF;IACxF,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC,EAAE,EAAE,gBAAgB,KAAK,IAAI,CAAC;CACxD;AAED,MAAM,WAAW,SAAS;IACxB,MAAM,CAAC,EAAE,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACnC,MAAM,IAAI,IAAI,CAAC;IACf,OAAO,IAAI,gBAAgB,GAAG,IAAI,CAAC;CACpC;AAUD,wBAAgB,eAAe,CAAC,IAAI,EAAE,aAAa,GAAG,SAAS,CAoH9D"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Attach and detach, the docs-09 sequences, orchestrating the mse
|
|
3
|
+
* controller, the stage loader, and element listeners. The element itself
|
|
4
|
+
* is never modified beyond what attachment requires: autoplay untouched,
|
|
5
|
+
* no member shadowed, nothing monkey-patched.
|
|
6
|
+
*/
|
|
7
|
+
import { createStageContext } from './context.js';
|
|
8
|
+
import { createReducer } from './reducer.js';
|
|
9
|
+
import { createPlaybackWatchdog } from './watchdog.js';
|
|
10
|
+
function snapshot(ranges) {
|
|
11
|
+
const out = [];
|
|
12
|
+
for (let i = 0; i < ranges.length; i += 1) {
|
|
13
|
+
out.push({ start: ranges.start(i), end: ranges.end(i) });
|
|
14
|
+
}
|
|
15
|
+
return out;
|
|
16
|
+
}
|
|
17
|
+
export function createLifecycle(deps) {
|
|
18
|
+
let element = null;
|
|
19
|
+
let teardowns = [];
|
|
20
|
+
let stopWatchdog = null;
|
|
21
|
+
const elementListeners = [];
|
|
22
|
+
function listen(el, type, fn) {
|
|
23
|
+
el.addEventListener(type, fn);
|
|
24
|
+
elementListeners.push({ type, fn });
|
|
25
|
+
}
|
|
26
|
+
function attach(el) {
|
|
27
|
+
if (element !== null) {
|
|
28
|
+
throw Object.assign(new Error('this engine is already attached'), {
|
|
29
|
+
category: 'config',
|
|
30
|
+
code: 'CONFIG_ELEMENT_OCCUPIED',
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
// Compose the stages first: a composition error must leave the element
|
|
34
|
+
// untouched. Slices collected here rebuild the reducer below.
|
|
35
|
+
const slices = [];
|
|
36
|
+
const stageTeardowns = [];
|
|
37
|
+
for (const stage of deps.composition.order) {
|
|
38
|
+
const { ctx, teardown } = createStageContext({
|
|
39
|
+
bus: deps.bus,
|
|
40
|
+
element: el,
|
|
41
|
+
facade: deps.facade,
|
|
42
|
+
slices,
|
|
43
|
+
hooks: deps.hooks,
|
|
44
|
+
addRequestHook: deps.addRequestHook,
|
|
45
|
+
request: deps.request,
|
|
46
|
+
});
|
|
47
|
+
const returned = stage.install(ctx);
|
|
48
|
+
// Reverse order on teardown: the context cleanup runs after the
|
|
49
|
+
// stage's own teardown, mirroring construction.
|
|
50
|
+
if (typeof returned === 'function')
|
|
51
|
+
stageTeardowns.push(returned);
|
|
52
|
+
stageTeardowns.push(teardown);
|
|
53
|
+
}
|
|
54
|
+
deps.bus.setReducer(createReducer(slices, deps.config, deps.hooks));
|
|
55
|
+
teardowns = stageTeardowns;
|
|
56
|
+
deps.bus.dispatch({ type: 'ATTACH', element: el });
|
|
57
|
+
// The mse controller runs the element-level sequence: occupancy check,
|
|
58
|
+
// resource-selection reset, ManagedMediaSource preference, srcObject
|
|
59
|
+
// with revoke-at-sourceopen fallback. autoplay is never touched.
|
|
60
|
+
try {
|
|
61
|
+
deps.mse.attach(el);
|
|
62
|
+
}
|
|
63
|
+
catch (err) {
|
|
64
|
+
for (const fn of [...teardowns].reverse())
|
|
65
|
+
fn();
|
|
66
|
+
teardowns = [];
|
|
67
|
+
deps.bus.dispatch({ type: 'DETACH' });
|
|
68
|
+
throw err;
|
|
69
|
+
}
|
|
70
|
+
element = el;
|
|
71
|
+
const absorb = (fact) => deps.bus.absorb(fact);
|
|
72
|
+
listen(el, 'timeupdate', () => {
|
|
73
|
+
absorb({
|
|
74
|
+
type: 'TIME_UPDATE',
|
|
75
|
+
currentTime: el.currentTime,
|
|
76
|
+
buffered: snapshot(el.buffered),
|
|
77
|
+
// Wall time enters the loop here, at the boundary; live stages
|
|
78
|
+
// slide their windows on it and the reducer never reads a clock.
|
|
79
|
+
wallClock: Date.now() / 1000,
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
listen(el, 'ended', () => {
|
|
83
|
+
absorb({ type: 'ENDED', at: el.currentTime });
|
|
84
|
+
});
|
|
85
|
+
listen(el, 'seeking', () => {
|
|
86
|
+
absorb({ type: 'SEEKING', to: el.currentTime });
|
|
87
|
+
});
|
|
88
|
+
listen(el, 'seeked', () => {
|
|
89
|
+
absorb({ type: 'SEEKED', at: el.currentTime });
|
|
90
|
+
});
|
|
91
|
+
listen(el, 'waiting', () => {
|
|
92
|
+
absorb({ type: 'STALLED', at: el.currentTime });
|
|
93
|
+
});
|
|
94
|
+
listen(el, 'error', () => {
|
|
95
|
+
deps.onMediaError?.(el);
|
|
96
|
+
});
|
|
97
|
+
// The clock-driven twin of the waiting listener, for the stalls the
|
|
98
|
+
// browser never announces.
|
|
99
|
+
stopWatchdog = createPlaybackWatchdog(el, absorb);
|
|
100
|
+
deps.register(el);
|
|
101
|
+
}
|
|
102
|
+
function detach() {
|
|
103
|
+
if (element === null)
|
|
104
|
+
return;
|
|
105
|
+
const el = element;
|
|
106
|
+
// Order per docs/09: stop the world (aborts ride the DETACH effects),
|
|
107
|
+
// tear down stages in reverse install order, then release the element.
|
|
108
|
+
deps.bus.dispatch({ type: 'DETACH' });
|
|
109
|
+
stopWatchdog?.();
|
|
110
|
+
stopWatchdog = null;
|
|
111
|
+
for (const fn of [...teardowns].reverse()) {
|
|
112
|
+
fn();
|
|
113
|
+
}
|
|
114
|
+
teardowns = [];
|
|
115
|
+
deps.mse.detach();
|
|
116
|
+
for (const { type, fn } of elementListeners) {
|
|
117
|
+
el.removeEventListener(type, fn);
|
|
118
|
+
}
|
|
119
|
+
elementListeners.length = 0;
|
|
120
|
+
deps.unregister(el);
|
|
121
|
+
element = null;
|
|
122
|
+
}
|
|
123
|
+
return {
|
|
124
|
+
attach,
|
|
125
|
+
detach,
|
|
126
|
+
element: () => element,
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=lifecycle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../src/kernel/lifecycle.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAGlD,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AAkCvD,SAAS,QAAQ,CAAC,MAAkB;IAClC,MAAM,GAAG,GAA0C,EAAE,CAAC;IACtD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1C,GAAG,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC3D,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAAmB;IACjD,IAAI,OAAO,GAA4B,IAAI,CAAC;IAC5C,IAAI,SAAS,GAAsB,EAAE,CAAC;IACtC,IAAI,YAAY,GAAwB,IAAI,CAAC;IAC7C,MAAM,gBAAgB,GAA+C,EAAE,CAAC;IAExE,SAAS,MAAM,CAAC,EAAoB,EAAE,IAAY,EAAE,EAAiB;QACnE,EAAE,CAAC,gBAAgB,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAC9B,gBAAgB,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;IACtC,CAAC;IAED,SAAS,MAAM,CAAC,EAAoB;QAClC,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;YACrB,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,iCAAiC,CAAC,EAAE;gBAChE,QAAQ,EAAE,QAAQ;gBAClB,IAAI,EAAE,yBAAyB;aAChC,CAAC,CAAC;QACL,CAAC;QAED,uEAAuE;QACvE,8DAA8D;QAC9D,MAAM,MAAM,GAA2C,EAAE,CAAC;QAC1D,MAAM,cAAc,GAAsB,EAAE,CAAC;QAC7C,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;YAC3C,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,kBAAkB,CAAC;gBAC3C,GAAG,EAAE,IAAI,CAAC,GAAG;gBACb,OAAO,EAAE,EAAE;gBACX,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,MAAM;gBACN,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,cAAc,EAAE,IAAI,CAAC,cAAc;gBACnC,OAAO,EAAE,IAAI,CAAC,OAAO;aACtB,CAAC,CAAC;YACH,MAAM,QAAQ,GAAI,KAAe,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAC/C,gEAAgE;YAChE,gDAAgD;YAChD,IAAI,OAAO,QAAQ,KAAK,UAAU;gBAAE,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAClE,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAChC,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,aAAa,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QACpE,SAAS,GAAG,cAAc,CAAC;QAE3B,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;QACnD,uEAAuE;QACvE,qEAAqE;QACrE,iEAAiE;QACjE,IAAI,CAAC;YACH,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACtB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,KAAK,MAAM,EAAE,IAAI,CAAC,GAAG,SAAS,CAAC,CAAC,OAAO,EAAE;gBAAE,EAAE,EAAE,CAAC;YAChD,SAAS,GAAG,EAAE,CAAC;YACf,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;YACtC,MAAM,GAAG,CAAC;QACZ,CAAC;QACD,OAAO,GAAG,EAAE,CAAC;QAEb,MAAM,MAAM,GAAG,CAAC,IAAU,EAAQ,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC3D,MAAM,CAAC,EAAE,EAAE,YAAY,EAAE,GAAG,EAAE;YAC5B,MAAM,CAAC;gBACL,IAAI,EAAE,aAAa;gBACnB,WAAW,EAAE,EAAE,CAAC,WAAW;gBAC3B,QAAQ,EAAE,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC;gBAC/B,+DAA+D;gBAC/D,iEAAiE;gBACjE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI;aAC7B,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE;YACvB,MAAM,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;QAChD,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE;YACzB,MAAM,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE;YACxB,MAAM,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;QACjD,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE;YACzB,MAAM,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE;YACvB,IAAI,CAAC,YAAY,EAAE,CAAC,EAAE,CAAC,CAAC;QAC1B,CAAC,CAAC,CAAC;QACH,oEAAoE;QACpE,2BAA2B;QAC3B,YAAY,GAAG,sBAAsB,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;QAElD,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC;IAED,SAAS,MAAM;QACb,IAAI,OAAO,KAAK,IAAI;YAAE,OAAO;QAC7B,MAAM,EAAE,GAAG,OAAO,CAAC;QAEnB,sEAAsE;QACtE,uEAAuE;QACvE,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;QACtC,YAAY,EAAE,EAAE,CAAC;QACjB,YAAY,GAAG,IAAI,CAAC;QACpB,KAAK,MAAM,EAAE,IAAI,CAAC,GAAG,SAAS,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC;YAC1C,EAAE,EAAE,CAAC;QACP,CAAC;QACD,SAAS,GAAG,EAAE,CAAC;QACf,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;QAClB,KAAK,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,gBAAgB,EAAE,CAAC;YAC5C,EAAE,CAAC,mBAAmB,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACnC,CAAC;QACD,gBAAgB,CAAC,MAAM,GAAG,CAAC,CAAC;QAC5B,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QACpB,OAAO,GAAG,IAAI,CAAC;IACjB,CAAC;IAED,OAAO;QACL,MAAM;QACN,MAAM;QACN,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO;KACvB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stage composition: `requires` resolution into a topological install
|
|
3
|
+
* order, with every conflict surfaced at composition time. Last-one-wins
|
|
4
|
+
* and silent missing dependencies are how modular designs rot; here they
|
|
5
|
+
* are errors with both names in the message.
|
|
6
|
+
*/
|
|
7
|
+
import type { Capability, Stage } from '../types/stage.js';
|
|
8
|
+
/**
|
|
9
|
+
* Names the kernel itself provides. A stage's `requires` naming one of
|
|
10
|
+
* these is always satisfied; everything else must match a composed stage's
|
|
11
|
+
* name or a capability it provides.
|
|
12
|
+
*/
|
|
13
|
+
export declare const KERNEL_PROVIDES: ReadonlySet<string>;
|
|
14
|
+
export interface Composition {
|
|
15
|
+
/** Stages in dependency order; install in this order, tear down reversed. */
|
|
16
|
+
readonly order: readonly Stage[];
|
|
17
|
+
/** Every capability the composition provides, deduplicated keys. */
|
|
18
|
+
readonly capabilities: readonly Capability[];
|
|
19
|
+
/**
|
|
20
|
+
* The manifest MIME types the composed adapters parse, normalized. A
|
|
21
|
+
* string capability containing '/' declares one; `engine.accepts` and the
|
|
22
|
+
* pre-fetch LOAD check read this set.
|
|
23
|
+
*/
|
|
24
|
+
readonly manifestTypes: ReadonlySet<string>;
|
|
25
|
+
}
|
|
26
|
+
/** Validates and orders a stage set. Throws on any composition error. */
|
|
27
|
+
export declare function compose(stages: readonly Stage[]): Composition;
|
|
28
|
+
//# sourceMappingURL=loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/kernel/loader.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAG3D;;;;GAIG;AACH,eAAO,MAAM,eAAe,EAAE,WAAW,CAAC,MAAM,CAa9C,CAAC;AAmBH,MAAM,WAAW,WAAW;IAC1B,6EAA6E;IAC7E,QAAQ,CAAC,KAAK,EAAE,SAAS,KAAK,EAAE,CAAC;IACjC,oEAAoE;IACpE,QAAQ,CAAC,YAAY,EAAE,SAAS,UAAU,EAAE,CAAC;IAC7C;;;;OAIG;IACH,QAAQ,CAAC,aAAa,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CAC7C;AAED,yEAAyE;AACzE,wBAAgB,OAAO,CAAC,MAAM,EAAE,SAAS,KAAK,EAAE,GAAG,WAAW,CAyF7D"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { isManifestType, normalizeMimeType } from './mime.js';
|
|
2
|
+
/**
|
|
3
|
+
* Names the kernel itself provides. A stage's `requires` naming one of
|
|
4
|
+
* these is always satisfied; everything else must match a composed stage's
|
|
5
|
+
* name or a capability it provides.
|
|
6
|
+
*/
|
|
7
|
+
export const KERNEL_PROVIDES = new Set([
|
|
8
|
+
'bus',
|
|
9
|
+
'reducer',
|
|
10
|
+
'effects',
|
|
11
|
+
'trace',
|
|
12
|
+
'mse',
|
|
13
|
+
'append-queue',
|
|
14
|
+
'evictor',
|
|
15
|
+
'scheduler',
|
|
16
|
+
'transport',
|
|
17
|
+
'timeline',
|
|
18
|
+
'track-registry',
|
|
19
|
+
'rendition-select',
|
|
20
|
+
]);
|
|
21
|
+
function capabilityKey(capability) {
|
|
22
|
+
if (typeof capability === 'string')
|
|
23
|
+
return capability;
|
|
24
|
+
return `${capability.contentType}:${capability.mimeType}`;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Capabilities that name a shared trait rather than a singleton service, so
|
|
28
|
+
* more than one stage may provide them without conflict. `media-transform`
|
|
29
|
+
* is the marker every byte-transform container (ts-transmux, packed-audio)
|
|
30
|
+
* carries so the composition root knows to route media appends through the
|
|
31
|
+
* transform pipeline; several such containers coexist by design.
|
|
32
|
+
*/
|
|
33
|
+
const SHARED_CAPABILITIES = new Set([
|
|
34
|
+
'media-transform',
|
|
35
|
+
'media-time-normalized',
|
|
36
|
+
]);
|
|
37
|
+
/** Validates and orders a stage set. Throws on any composition error. */
|
|
38
|
+
export function compose(stages) {
|
|
39
|
+
const byName = new Map();
|
|
40
|
+
for (const stage of stages) {
|
|
41
|
+
if (byName.has(stage.name)) {
|
|
42
|
+
throw new Error(`duplicate stage name '${stage.name}'`);
|
|
43
|
+
}
|
|
44
|
+
byName.set(stage.name, stage);
|
|
45
|
+
}
|
|
46
|
+
// Capability conflicts are composition errors, not last-one-wins.
|
|
47
|
+
const capabilityOwners = new Map();
|
|
48
|
+
const capabilities = [];
|
|
49
|
+
for (const stage of stages) {
|
|
50
|
+
for (const capability of stage.provides ?? []) {
|
|
51
|
+
const key = capabilityKey(capability);
|
|
52
|
+
if (SHARED_CAPABILITIES.has(key)) {
|
|
53
|
+
// A shared marker: many stages may carry it. Record the key once so
|
|
54
|
+
// requires can resolve it, but never conflict on a second provider.
|
|
55
|
+
if (!capabilityOwners.has(key)) {
|
|
56
|
+
capabilityOwners.set(key, stage.name);
|
|
57
|
+
capabilities.push(capability);
|
|
58
|
+
}
|
|
59
|
+
continue;
|
|
60
|
+
}
|
|
61
|
+
const owner = capabilityOwners.get(key);
|
|
62
|
+
if (owner !== undefined && owner !== stage.name) {
|
|
63
|
+
throw new Error(`'${owner}' and '${stage.name}' both provide '${key}'`);
|
|
64
|
+
}
|
|
65
|
+
if (owner === undefined) {
|
|
66
|
+
capabilityOwners.set(key, stage.name);
|
|
67
|
+
capabilities.push(capability);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
function providerOf(requirement) {
|
|
72
|
+
if (KERNEL_PROVIDES.has(requirement))
|
|
73
|
+
return 'kernel';
|
|
74
|
+
const direct = byName.get(requirement);
|
|
75
|
+
if (direct !== undefined)
|
|
76
|
+
return direct;
|
|
77
|
+
const owner = capabilityOwners.get(requirement);
|
|
78
|
+
if (owner !== undefined)
|
|
79
|
+
return byName.get(owner) ?? null;
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
// Depth-first topological sort with cycle detection.
|
|
83
|
+
const order = [];
|
|
84
|
+
const state = new Map();
|
|
85
|
+
function visit(stage, path) {
|
|
86
|
+
const mark = state.get(stage.name);
|
|
87
|
+
if (mark === 'done')
|
|
88
|
+
return;
|
|
89
|
+
if (mark === 'visiting') {
|
|
90
|
+
throw new Error(`circular requires: ${[...path, stage.name].join(' -> ')}`);
|
|
91
|
+
}
|
|
92
|
+
state.set(stage.name, 'visiting');
|
|
93
|
+
for (const requirement of stage.requires ?? []) {
|
|
94
|
+
// An array requirement is a set of alternatives: the first one with a
|
|
95
|
+
// provider wins. A plain string is a single hard dependency.
|
|
96
|
+
const alternatives = Array.isArray(requirement) ? requirement : [requirement];
|
|
97
|
+
let resolved = null;
|
|
98
|
+
for (const alternative of alternatives) {
|
|
99
|
+
const provider = providerOf(alternative);
|
|
100
|
+
if (provider !== null) {
|
|
101
|
+
resolved = provider;
|
|
102
|
+
break;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
if (resolved === null) {
|
|
106
|
+
const names = alternatives.map((a) => `'${a}'`).join(' or ');
|
|
107
|
+
throw new Error(`'${stage.name}' requires ${names}, which nothing provides`);
|
|
108
|
+
}
|
|
109
|
+
if (resolved !== 'kernel')
|
|
110
|
+
visit(resolved, [...path, stage.name]);
|
|
111
|
+
}
|
|
112
|
+
state.set(stage.name, 'done');
|
|
113
|
+
order.push(stage);
|
|
114
|
+
}
|
|
115
|
+
for (const stage of stages) {
|
|
116
|
+
visit(stage, []);
|
|
117
|
+
}
|
|
118
|
+
const manifestTypes = new Set();
|
|
119
|
+
for (const capability of capabilities) {
|
|
120
|
+
if (typeof capability === 'string' && isManifestType(capability)) {
|
|
121
|
+
manifestTypes.add(normalizeMimeType(capability));
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
return { order, capabilities, manifestTypes };
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/kernel/loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MIME type normalization, shared by the composition root, the reducer, and
|
|
3
|
+
* the protocol adapters. A caller's `mimeType` hint and a server's
|
|
4
|
+
* Content-Type header both arrive with arbitrary case and optional
|
|
5
|
+
* parameters (`; charset=utf-8`); every comparison in the engine runs on the
|
|
6
|
+
* normalized form so `Application/X-MPEGURL` and `application/x-mpegurl`
|
|
7
|
+
* name the same format.
|
|
8
|
+
*/
|
|
9
|
+
/** Lowercases a MIME type and drops its parameters. Whitespace is trimmed. */
|
|
10
|
+
export declare function normalizeMimeType(value: string): string;
|
|
11
|
+
/** True for a capability string that names a manifest format: a MIME type, the only capability strings containing '/'. */
|
|
12
|
+
export declare function isManifestType(capability: string): boolean;
|
|
13
|
+
//# sourceMappingURL=mime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mime.d.ts","sourceRoot":"","sources":["../../src/kernel/mime.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,8EAA8E;AAC9E,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAGvD;AAED,0HAA0H;AAC1H,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAE1D"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MIME type normalization, shared by the composition root, the reducer, and
|
|
3
|
+
* the protocol adapters. A caller's `mimeType` hint and a server's
|
|
4
|
+
* Content-Type header both arrive with arbitrary case and optional
|
|
5
|
+
* parameters (`; charset=utf-8`); every comparison in the engine runs on the
|
|
6
|
+
* normalized form so `Application/X-MPEGURL` and `application/x-mpegurl`
|
|
7
|
+
* name the same format.
|
|
8
|
+
*/
|
|
9
|
+
/** Lowercases a MIME type and drops its parameters. Whitespace is trimmed. */
|
|
10
|
+
export function normalizeMimeType(value) {
|
|
11
|
+
const semicolon = value.indexOf(';');
|
|
12
|
+
return (semicolon === -1 ? value : value.slice(0, semicolon)).trim().toLowerCase();
|
|
13
|
+
}
|
|
14
|
+
/** True for a capability string that names a manifest format: a MIME type, the only capability strings containing '/'. */
|
|
15
|
+
export function isManifestType(capability) {
|
|
16
|
+
return capability.includes('/');
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=mime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mime.js","sourceRoot":"","sources":["../../src/kernel/mime.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,8EAA8E;AAC9E,MAAM,UAAU,iBAAiB,CAAC,KAAa;IAC7C,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACrC,OAAO,CAAC,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;AACrF,CAAC;AAED,0HAA0H;AAC1H,MAAM,UAAU,cAAc,CAAC,UAAkB;IAC/C,OAAO,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;AAClC,CAAC"}
|