@blockcast/mmt-container 0.1.0-main.149f78a4adae
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/README.md +432 -0
- package/dist/.build-stamp +0 -0
- package/dist/__tests__/test-utils.d.ts +71 -0
- package/dist/__tests__/test-utils.d.ts.map +1 -0
- package/dist/align.d.ts +148 -0
- package/dist/align.d.ts.map +1 -0
- package/dist/align.js +88 -0
- package/dist/align.js.map +7 -0
- package/dist/audio-init-parser.d.ts +66 -0
- package/dist/audio-init-parser.d.ts.map +1 -0
- package/dist/audio-init-parser.js +118 -0
- package/dist/audio-init-parser.js.map +7 -0
- package/dist/audio-ring-buffer.d.ts +50 -0
- package/dist/audio-ring-buffer.d.ts.map +1 -0
- package/dist/audio-ring-buffer.js +93 -0
- package/dist/audio-ring-buffer.js.map +7 -0
- package/dist/authored-timing.d.ts +32 -0
- package/dist/authored-timing.d.ts.map +1 -0
- package/dist/authored-timing.js +32 -0
- package/dist/authored-timing.js.map +7 -0
- package/dist/browser-runtime.js +17109 -0
- package/dist/browser-runtime.js.map +7 -0
- package/dist/carp-catalog.d.ts +318 -0
- package/dist/carp-catalog.d.ts.map +1 -0
- package/dist/carp-catalog.js +549 -0
- package/dist/carp-catalog.js.map +7 -0
- package/dist/catalog-fec-params.d.ts +82 -0
- package/dist/catalog-fec-params.d.ts.map +1 -0
- package/dist/catalog-fec-params.js +66 -0
- package/dist/catalog-fec-params.js.map +7 -0
- package/dist/catalog-network-source.d.ts +19 -0
- package/dist/catalog-network-source.d.ts.map +1 -0
- package/dist/catalog-network-source.js +22 -0
- package/dist/catalog-network-source.js.map +7 -0
- package/dist/catalog-validator.d.ts +18 -0
- package/dist/catalog-validator.d.ts.map +1 -0
- package/dist/catalog-validator.js +7747 -0
- package/dist/catalog-validator.js.map +7 -0
- package/dist/cmaf-block-assembler.d.ts +168 -0
- package/dist/cmaf-block-assembler.d.ts.map +1 -0
- package/dist/cmaf-block-assembler.js +1755 -0
- package/dist/cmaf-block-assembler.js.map +7 -0
- package/dist/cmaf-group-batcher.d.ts +38 -0
- package/dist/cmaf-group-batcher.d.ts.map +1 -0
- package/dist/cmaf-group-batcher.js +195 -0
- package/dist/cmaf-group-batcher.js.map +7 -0
- package/dist/cmcd-producer.d.ts +104 -0
- package/dist/cmcd-producer.d.ts.map +1 -0
- package/dist/cmcd-producer.js +207 -0
- package/dist/cmcd-producer.js.map +7 -0
- package/dist/codec-utils.d.ts +235 -0
- package/dist/codec-utils.d.ts.map +1 -0
- package/dist/codec-utils.js +1225 -0
- package/dist/codec-utils.js.map +7 -0
- package/dist/fec-codec.d.ts +32 -0
- package/dist/fec-codec.d.ts.map +1 -0
- package/dist/fec-codec.js +47 -0
- package/dist/fec-codec.js.map +7 -0
- package/dist/fec-manager.d.ts +266 -0
- package/dist/fec-manager.d.ts.map +1 -0
- package/dist/fec-manager.js +1447 -0
- package/dist/fec-manager.js.map +7 -0
- package/dist/fec-starvation-detector.d.ts +59 -0
- package/dist/fec-starvation-detector.d.ts.map +1 -0
- package/dist/fec-starvation-detector.js +75 -0
- package/dist/fec-starvation-detector.js.map +7 -0
- package/dist/fec-worker-setup.d.ts +76 -0
- package/dist/fec-worker-setup.d.ts.map +1 -0
- package/dist/fec-worker-setup.js +603 -0
- package/dist/fec-worker-setup.js.map +7 -0
- package/dist/fmp4-completion.d.ts +30 -0
- package/dist/fmp4-completion.d.ts.map +1 -0
- package/dist/fmp4-completion.js +21 -0
- package/dist/fmp4-completion.js.map +7 -0
- package/dist/fmp4-reader.d.ts +37 -0
- package/dist/fmp4-reader.d.ts.map +1 -0
- package/dist/fmp4-reader.js +100 -0
- package/dist/fmp4-reader.js.map +7 -0
- package/dist/index.d.ts +47 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +330 -0
- package/dist/index.js.map +7 -0
- package/dist/iso-bmff-timing.d.ts +47 -0
- package/dist/iso-bmff-timing.d.ts.map +1 -0
- package/dist/iso-bmff-timing.js +526 -0
- package/dist/iso-bmff-timing.js.map +7 -0
- package/dist/loc.d.ts +68 -0
- package/dist/loc.d.ts.map +1 -0
- package/dist/loc.js +143 -0
- package/dist/loc.js.map +7 -0
- package/dist/manifest-auth-plan.d.ts +30 -0
- package/dist/manifest-auth-plan.d.ts.map +1 -0
- package/dist/manifest-auth-plan.js +1267 -0
- package/dist/manifest-auth-plan.js.map +7 -0
- package/dist/media-router.d.ts +338 -0
- package/dist/media-router.d.ts.map +1 -0
- package/dist/media-router.js +802 -0
- package/dist/media-router.js.map +7 -0
- package/dist/mfu-reassembler.d.ts +264 -0
- package/dist/mfu-reassembler.d.ts.map +1 -0
- package/dist/mfu-reassembler.js +2668 -0
- package/dist/mfu-reassembler.js.map +7 -0
- package/dist/mfu-reassembly-policy.d.ts +24 -0
- package/dist/mfu-reassembly-policy.d.ts.map +1 -0
- package/dist/mfu-reassembly-policy.js +99 -0
- package/dist/mfu-reassembly-policy.js.map +7 -0
- package/dist/mmtp-container-parser.d.ts +304 -0
- package/dist/mmtp-container-parser.d.ts.map +1 -0
- package/dist/mmtp-container-parser.js +5378 -0
- package/dist/mmtp-container-parser.js.map +7 -0
- package/dist/mmtp-container-parser.no-modules.js +7853 -0
- package/dist/mmtp-container-parser.no-modules.js.map +7 -0
- package/dist/mmtp-decode-pipeline.d.ts +96 -0
- package/dist/mmtp-decode-pipeline.d.ts.map +1 -0
- package/dist/mmtp-decode-pipeline.js +5589 -0
- package/dist/mmtp-decode-pipeline.js.map +7 -0
- package/dist/mmtp-router.d.ts +383 -0
- package/dist/mmtp-router.d.ts.map +1 -0
- package/dist/mmtp-router.js +8384 -0
- package/dist/mmtp-router.js.map +7 -0
- package/dist/mmtp-to-cmaf.d.ts +166 -0
- package/dist/mmtp-to-cmaf.d.ts.map +1 -0
- package/dist/mmtp-to-cmaf.js +781 -0
- package/dist/mmtp-to-cmaf.js.map +7 -0
- package/dist/multicast-auth-catalog.d.ts +115 -0
- package/dist/multicast-auth-catalog.d.ts.map +1 -0
- package/dist/multicast-auth-catalog.js +202 -0
- package/dist/multicast-auth-catalog.js.map +7 -0
- package/dist/multicast-input.d.ts +107 -0
- package/dist/multicast-input.d.ts.map +1 -0
- package/dist/multicast-input.js +256 -0
- package/dist/multicast-input.js.map +7 -0
- package/dist/multicast-manager.d.ts +330 -0
- package/dist/multicast-manager.d.ts.map +1 -0
- package/dist/multicast-manager.js +11032 -0
- package/dist/multicast-manager.js.map +7 -0
- package/dist/multicast-transport.d.ts +62 -0
- package/dist/multicast-transport.d.ts.map +1 -0
- package/dist/multicast-transport.js +338 -0
- package/dist/multicast-transport.js.map +7 -0
- package/dist/multicast-unwrap.d.ts +57 -0
- package/dist/multicast-unwrap.d.ts.map +1 -0
- package/dist/multicast-unwrap.js +384 -0
- package/dist/multicast-unwrap.js.map +7 -0
- package/dist/no-modules.d.ts +9 -0
- package/dist/no-modules.d.ts.map +1 -0
- package/dist/no-modules.js +7819 -0
- package/dist/no-modules.js.map +7 -0
- package/dist/phase14-catalog-override.d.ts +126 -0
- package/dist/phase14-catalog-override.d.ts.map +1 -0
- package/dist/phase14-catalog-override.js +155 -0
- package/dist/phase14-catalog-override.js.map +7 -0
- package/dist/repair-fetch.d.ts +58 -0
- package/dist/repair-fetch.d.ts.map +1 -0
- package/dist/repair-fetch.js +117 -0
- package/dist/repair-fetch.js.map +7 -0
- package/dist/sample-combiner.d.ts +182 -0
- package/dist/sample-combiner.d.ts.map +1 -0
- package/dist/sample-combiner.js +571 -0
- package/dist/sample-combiner.js.map +7 -0
- package/dist/signaling.d.ts +29 -0
- package/dist/signaling.d.ts.map +1 -0
- package/dist/signaling.js +232 -0
- package/dist/signaling.js.map +7 -0
- package/dist/source-auth.d.ts +2 -0
- package/dist/source-auth.d.ts.map +1 -0
- package/dist/source-auth.js +1220 -0
- package/dist/source-auth.js.map +7 -0
- package/dist/switching-set-alignment.d.ts +61 -0
- package/dist/switching-set-alignment.d.ts.map +1 -0
- package/dist/switching-set-alignment.js +85 -0
- package/dist/switching-set-alignment.js.map +7 -0
- package/dist/timestamp-codec.d.ts +34 -0
- package/dist/timestamp-codec.d.ts.map +1 -0
- package/dist/timestamp-codec.js +456 -0
- package/dist/timestamp-codec.js.map +7 -0
- package/dist/track-pipeline-setup.d.ts +72 -0
- package/dist/track-pipeline-setup.d.ts.map +1 -0
- package/dist/track-pipeline-setup.js +306 -0
- package/dist/track-pipeline-setup.js.map +7 -0
- package/dist/track-pipeline.d.ts +121 -0
- package/dist/track-pipeline.d.ts.map +1 -0
- package/dist/track-pipeline.js +229 -0
- package/dist/track-pipeline.js.map +7 -0
- package/dist/track-session.d.ts +269 -0
- package/dist/track-session.d.ts.map +1 -0
- package/dist/track-session.js +597 -0
- package/dist/track-session.js.map +7 -0
- package/dist/transport-pool.d.ts +69 -0
- package/dist/transport-pool.d.ts.map +1 -0
- package/dist/transport-pool.js +88 -0
- package/dist/transport-pool.js.map +7 -0
- package/dist/wasm-mfu-reassembler.d.ts +81 -0
- package/dist/wasm-mfu-reassembler.d.ts.map +1 -0
- package/dist/wasm-mfu-reassembler.js +1915 -0
- package/dist/wasm-mfu-reassembler.js.map +7 -0
- package/dist/wasm-mmtp-container-parser.d.ts +10 -0
- package/dist/wasm-mmtp-container-parser.d.ts.map +1 -0
- package/dist/wasm-mmtp-container-parser.js +5635 -0
- package/dist/wasm-mmtp-container-parser.js.map +7 -0
- package/node_modules/@blockcast/fec-worker/README.md +213 -0
- package/node_modules/@blockcast/fec-worker/dist/.build-stamp +0 -0
- package/node_modules/@blockcast/fec-worker/dist/fec-worker-client.d.ts +80 -0
- package/node_modules/@blockcast/fec-worker/dist/fec-worker-client.d.ts.map +1 -0
- package/node_modules/@blockcast/fec-worker/dist/fec-worker-client.js +270 -0
- package/node_modules/@blockcast/fec-worker/dist/fec-worker-client.js.map +1 -0
- package/node_modules/@blockcast/fec-worker/dist/fec-worker-types.d.ts +252 -0
- package/node_modules/@blockcast/fec-worker/dist/fec-worker-types.d.ts.map +1 -0
- package/node_modules/@blockcast/fec-worker/dist/fec-worker-types.js +11 -0
- package/node_modules/@blockcast/fec-worker/dist/fec-worker-types.js.map +1 -0
- package/node_modules/@blockcast/fec-worker/dist/fec-worker.d.ts +14 -0
- package/node_modules/@blockcast/fec-worker/dist/fec-worker.d.ts.map +1 -0
- package/node_modules/@blockcast/fec-worker/dist/fec-worker.js +565 -0
- package/node_modules/@blockcast/fec-worker/dist/fec-worker.js.map +7 -0
- package/node_modules/@blockcast/fec-worker/dist/index.d.ts +10 -0
- package/node_modules/@blockcast/fec-worker/dist/index.d.ts.map +1 -0
- package/node_modules/@blockcast/fec-worker/dist/index.js +8 -0
- package/node_modules/@blockcast/fec-worker/dist/index.js.map +1 -0
- package/node_modules/@blockcast/fec-worker/dist/shred-fec-worker.d.ts +20 -0
- package/node_modules/@blockcast/fec-worker/dist/shred-fec-worker.d.ts.map +1 -0
- package/node_modules/@blockcast/fec-worker/dist/shred-fec-worker.js +349 -0
- package/node_modules/@blockcast/fec-worker/dist/shred-fec-worker.js.map +7 -0
- package/node_modules/@blockcast/fec-worker/dist/shred-worker-client.d.ts +104 -0
- package/node_modules/@blockcast/fec-worker/dist/shred-worker-client.d.ts.map +1 -0
- package/node_modules/@blockcast/fec-worker/dist/shred-worker-client.js +181 -0
- package/node_modules/@blockcast/fec-worker/dist/shred-worker-client.js.map +1 -0
- package/node_modules/@blockcast/fec-worker/dist/shred-worker-types.d.ts +179 -0
- package/node_modules/@blockcast/fec-worker/dist/shred-worker-types.d.ts.map +1 -0
- package/node_modules/@blockcast/fec-worker/dist/shred-worker-types.js +47 -0
- package/node_modules/@blockcast/fec-worker/dist/shred-worker-types.js.map +1 -0
- package/node_modules/@blockcast/fec-worker/dist/transfer.d.ts +9 -0
- package/node_modules/@blockcast/fec-worker/dist/transfer.d.ts.map +1 -0
- package/node_modules/@blockcast/fec-worker/dist/transfer.js +13 -0
- package/node_modules/@blockcast/fec-worker/dist/transfer.js.map +1 -0
- package/node_modules/@blockcast/fec-worker/package.json +59 -0
- package/node_modules/@blockcast/fec-worker/src/fec-worker-client.ts +309 -0
- package/node_modules/@blockcast/fec-worker/src/fec-worker-types.ts +268 -0
- package/node_modules/@blockcast/fec-worker/src/fec-worker.ts +1048 -0
- package/node_modules/@blockcast/fec-worker/src/index.ts +32 -0
- package/node_modules/@blockcast/fec-worker/src/shred-fec-worker.ts +558 -0
- package/node_modules/@blockcast/fec-worker/src/shred-worker-client.ts +222 -0
- package/node_modules/@blockcast/fec-worker/src/shred-worker-types.ts +194 -0
- package/node_modules/@blockcast/fec-worker/src/transfer.ts +12 -0
- package/node_modules/@blockcast/mmt-alta-parse/README.md +181 -0
- package/node_modules/@blockcast/mmt-alta-parse/dist/.build-stamp +0 -0
- package/node_modules/@blockcast/mmt-alta-parse/dist/index.d.ts +57 -0
- package/node_modules/@blockcast/mmt-alta-parse/dist/index.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-alta-parse/dist/index.js +115 -0
- package/node_modules/@blockcast/mmt-alta-parse/dist/index.js.map +1 -0
- package/node_modules/@blockcast/mmt-alta-parse/package.json +50 -0
- package/node_modules/@blockcast/mmt-alta-parse/src/index.ts +136 -0
- package/node_modules/@blockcast/mmt-base/README.md +120 -0
- package/node_modules/@blockcast/mmt-base/dist/.build-stamp +0 -0
- package/node_modules/@blockcast/mmt-base/dist/index.d.ts +2 -0
- package/node_modules/@blockcast/mmt-base/dist/index.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-base/dist/index.js +2 -0
- package/node_modules/@blockcast/mmt-base/dist/index.js.map +1 -0
- package/node_modules/@blockcast/mmt-base/dist/mmtp.d.ts +275 -0
- package/node_modules/@blockcast/mmt-base/dist/mmtp.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-base/dist/mmtp.js +644 -0
- package/node_modules/@blockcast/mmt-base/dist/mmtp.js.map +1 -0
- package/node_modules/@blockcast/mmt-base/package.json +49 -0
- package/node_modules/@blockcast/mmt-base/src/index.ts +1 -0
- package/node_modules/@blockcast/mmt-base/src/mmtp.ts +898 -0
- package/node_modules/@blockcast/mmt-fec/README.md +270 -0
- package/node_modules/@blockcast/mmt-fec/dist/.build-stamp +0 -0
- package/node_modules/@blockcast/mmt-fec/dist/block-manager.d.ts +80 -0
- package/node_modules/@blockcast/mmt-fec/dist/block-manager.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-fec/dist/block-manager.js +294 -0
- package/node_modules/@blockcast/mmt-fec/dist/block-manager.js.map +1 -0
- package/node_modules/@blockcast/mmt-fec/dist/block-processor.d.ts +72 -0
- package/node_modules/@blockcast/mmt-fec/dist/block-processor.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-fec/dist/block-processor.js +192 -0
- package/node_modules/@blockcast/mmt-fec/dist/block-processor.js.map +1 -0
- package/node_modules/@blockcast/mmt-fec/dist/cmaf-recovery.d.ts +46 -0
- package/node_modules/@blockcast/mmt-fec/dist/cmaf-recovery.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-fec/dist/cmaf-recovery.js +96 -0
- package/node_modules/@blockcast/mmt-fec/dist/cmaf-recovery.js.map +1 -0
- package/node_modules/@blockcast/mmt-fec/dist/cmaf-symbols.d.ts +33 -0
- package/node_modules/@blockcast/mmt-fec/dist/cmaf-symbols.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-fec/dist/cmaf-symbols.js +57 -0
- package/node_modules/@blockcast/mmt-fec/dist/cmaf-symbols.js.map +1 -0
- package/node_modules/@blockcast/mmt-fec/dist/fec-block-mapper.d.ts +185 -0
- package/node_modules/@blockcast/mmt-fec/dist/fec-block-mapper.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-fec/dist/fec-block-mapper.js +273 -0
- package/node_modules/@blockcast/mmt-fec/dist/fec-block-mapper.js.map +1 -0
- package/node_modules/@blockcast/mmt-fec/dist/index.d.ts +22 -0
- package/node_modules/@blockcast/mmt-fec/dist/index.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-fec/dist/index.js +22 -0
- package/node_modules/@blockcast/mmt-fec/dist/index.js.map +1 -0
- package/node_modules/@blockcast/mmt-fec/dist/loc-symbols.d.ts +20 -0
- package/node_modules/@blockcast/mmt-fec/dist/loc-symbols.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-fec/dist/loc-symbols.js +28 -0
- package/node_modules/@blockcast/mmt-fec/dist/loc-symbols.js.map +1 -0
- package/node_modules/@blockcast/mmt-fec/dist/oti.d.ts +174 -0
- package/node_modules/@blockcast/mmt-fec/dist/oti.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-fec/dist/oti.js +256 -0
- package/node_modules/@blockcast/mmt-fec/dist/oti.js.map +1 -0
- package/node_modules/@blockcast/mmt-fec/dist/reorder-buffer.d.ts +41 -0
- package/node_modules/@blockcast/mmt-fec/dist/reorder-buffer.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-fec/dist/reorder-buffer.js +81 -0
- package/node_modules/@blockcast/mmt-fec/dist/reorder-buffer.js.map +1 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/README.md +181 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/dist/.build-stamp +0 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/dist/index.d.ts +57 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/dist/index.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/dist/index.js +115 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/dist/index.js.map +1 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/package.json +50 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/src/index.ts +136 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/README.md +120 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/.build-stamp +0 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/index.d.ts +2 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/index.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/index.js +2 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/index.js.map +1 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/mmtp.d.ts +275 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/mmtp.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/mmtp.js +644 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/mmtp.js.map +1 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/package.json +49 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/src/index.ts +1 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/src/mmtp.ts +898 -0
- package/node_modules/@blockcast/mmt-fec/package.json +79 -0
- package/node_modules/@blockcast/mmt-fec/src/block-manager.ts +369 -0
- package/node_modules/@blockcast/mmt-fec/src/block-processor.ts +277 -0
- package/node_modules/@blockcast/mmt-fec/src/cmaf-recovery.ts +127 -0
- package/node_modules/@blockcast/mmt-fec/src/cmaf-symbols.ts +68 -0
- package/node_modules/@blockcast/mmt-fec/src/fec-block-mapper.ts +332 -0
- package/node_modules/@blockcast/mmt-fec/src/index.ts +77 -0
- package/node_modules/@blockcast/mmt-fec/src/loc-symbols.ts +34 -0
- package/node_modules/@blockcast/mmt-fec/src/oti.ts +319 -0
- package/node_modules/@blockcast/mmt-fec/src/reorder-buffer.ts +101 -0
- package/node_modules/@blockcast/mmt-manifest-verify/dist/.build-stamp +0 -0
- package/node_modules/@blockcast/mmt-manifest-verify/dist/admission.d.ts +28 -0
- package/node_modules/@blockcast/mmt-manifest-verify/dist/admission.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-manifest-verify/dist/admission.js +128 -0
- package/node_modules/@blockcast/mmt-manifest-verify/dist/admission.js.map +1 -0
- package/node_modules/@blockcast/mmt-manifest-verify/dist/index.d.ts +4 -0
- package/node_modules/@blockcast/mmt-manifest-verify/dist/index.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-manifest-verify/dist/index.js +4 -0
- package/node_modules/@blockcast/mmt-manifest-verify/dist/index.js.map +1 -0
- package/node_modules/@blockcast/mmt-manifest-verify/dist/source-auth.d.ts +37 -0
- package/node_modules/@blockcast/mmt-manifest-verify/dist/source-auth.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-manifest-verify/dist/source-auth.js +179 -0
- package/node_modules/@blockcast/mmt-manifest-verify/dist/source-auth.js.map +1 -0
- package/node_modules/@blockcast/mmt-manifest-verify/dist/verifier.d.ts +90 -0
- package/node_modules/@blockcast/mmt-manifest-verify/dist/verifier.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-manifest-verify/dist/verifier.js +462 -0
- package/node_modules/@blockcast/mmt-manifest-verify/dist/verifier.js.map +1 -0
- package/node_modules/@blockcast/mmt-manifest-verify/package.json +45 -0
- package/node_modules/@blockcast/mmt-manifest-verify/src/admission.ts +171 -0
- package/node_modules/@blockcast/mmt-manifest-verify/src/index.ts +3 -0
- package/node_modules/@blockcast/mmt-manifest-verify/src/source-auth.ts +230 -0
- package/node_modules/@blockcast/mmt-manifest-verify/src/verifier.ts +636 -0
- package/node_modules/@noble/hashes/LICENSE +21 -0
- package/node_modules/@noble/hashes/README.md +521 -0
- package/node_modules/@noble/hashes/_assert.d.ts +17 -0
- package/node_modules/@noble/hashes/_assert.d.ts.map +1 -0
- package/node_modules/@noble/hashes/_assert.js +18 -0
- package/node_modules/@noble/hashes/_assert.js.map +1 -0
- package/node_modules/@noble/hashes/_blake.d.ts +14 -0
- package/node_modules/@noble/hashes/_blake.d.ts.map +1 -0
- package/node_modules/@noble/hashes/_blake.js +50 -0
- package/node_modules/@noble/hashes/_blake.js.map +1 -0
- package/node_modules/@noble/hashes/_md.d.ts +51 -0
- package/node_modules/@noble/hashes/_md.d.ts.map +1 -0
- package/node_modules/@noble/hashes/_md.js +162 -0
- package/node_modules/@noble/hashes/_md.js.map +1 -0
- package/node_modules/@noble/hashes/_u64.d.ts +55 -0
- package/node_modules/@noble/hashes/_u64.d.ts.map +1 -0
- package/node_modules/@noble/hashes/_u64.js +90 -0
- package/node_modules/@noble/hashes/_u64.js.map +1 -0
- package/node_modules/@noble/hashes/argon2.d.ts +32 -0
- package/node_modules/@noble/hashes/argon2.d.ts.map +1 -0
- package/node_modules/@noble/hashes/argon2.js +401 -0
- package/node_modules/@noble/hashes/argon2.js.map +1 -0
- package/node_modules/@noble/hashes/blake1.d.ts +106 -0
- package/node_modules/@noble/hashes/blake1.d.ts.map +1 -0
- package/node_modules/@noble/hashes/blake1.js +459 -0
- package/node_modules/@noble/hashes/blake1.js.map +1 -0
- package/node_modules/@noble/hashes/blake2.d.ts +116 -0
- package/node_modules/@noble/hashes/blake2.d.ts.map +1 -0
- package/node_modules/@noble/hashes/blake2.js +420 -0
- package/node_modules/@noble/hashes/blake2.js.map +1 -0
- package/node_modules/@noble/hashes/blake2b.d.ts +11 -0
- package/node_modules/@noble/hashes/blake2b.d.ts.map +1 -0
- package/node_modules/@noble/hashes/blake2b.js +14 -0
- package/node_modules/@noble/hashes/blake2b.js.map +1 -0
- package/node_modules/@noble/hashes/blake2s.d.ts +20 -0
- package/node_modules/@noble/hashes/blake2s.d.ts.map +1 -0
- package/node_modules/@noble/hashes/blake2s.js +24 -0
- package/node_modules/@noble/hashes/blake2s.js.map +1 -0
- package/node_modules/@noble/hashes/blake3.d.ts +54 -0
- package/node_modules/@noble/hashes/blake3.d.ts.map +1 -0
- package/node_modules/@noble/hashes/blake3.js +255 -0
- package/node_modules/@noble/hashes/blake3.js.map +1 -0
- package/node_modules/@noble/hashes/crypto.d.ts +2 -0
- package/node_modules/@noble/hashes/crypto.d.ts.map +1 -0
- package/node_modules/@noble/hashes/crypto.js +5 -0
- package/node_modules/@noble/hashes/crypto.js.map +1 -0
- package/node_modules/@noble/hashes/cryptoNode.d.ts +2 -0
- package/node_modules/@noble/hashes/cryptoNode.d.ts.map +1 -0
- package/node_modules/@noble/hashes/cryptoNode.js +18 -0
- package/node_modules/@noble/hashes/cryptoNode.js.map +1 -0
- package/node_modules/@noble/hashes/eskdf.d.ts +47 -0
- package/node_modules/@noble/hashes/eskdf.d.ts.map +1 -0
- package/node_modules/@noble/hashes/eskdf.js +166 -0
- package/node_modules/@noble/hashes/eskdf.js.map +1 -0
- package/node_modules/@noble/hashes/esm/_assert.d.ts +17 -0
- package/node_modules/@noble/hashes/esm/_assert.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/_assert.js +15 -0
- package/node_modules/@noble/hashes/esm/_assert.js.map +1 -0
- package/node_modules/@noble/hashes/esm/_blake.d.ts +14 -0
- package/node_modules/@noble/hashes/esm/_blake.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/_blake.js +45 -0
- package/node_modules/@noble/hashes/esm/_blake.js.map +1 -0
- package/node_modules/@noble/hashes/esm/_md.d.ts +51 -0
- package/node_modules/@noble/hashes/esm/_md.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/_md.js +155 -0
- package/node_modules/@noble/hashes/esm/_md.js.map +1 -0
- package/node_modules/@noble/hashes/esm/_u64.d.ts +55 -0
- package/node_modules/@noble/hashes/esm/_u64.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/_u64.js +67 -0
- package/node_modules/@noble/hashes/esm/_u64.js.map +1 -0
- package/node_modules/@noble/hashes/esm/argon2.d.ts +32 -0
- package/node_modules/@noble/hashes/esm/argon2.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/argon2.js +392 -0
- package/node_modules/@noble/hashes/esm/argon2.js.map +1 -0
- package/node_modules/@noble/hashes/esm/blake1.d.ts +106 -0
- package/node_modules/@noble/hashes/esm/blake1.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/blake1.js +452 -0
- package/node_modules/@noble/hashes/esm/blake1.js.map +1 -0
- package/node_modules/@noble/hashes/esm/blake2.d.ts +116 -0
- package/node_modules/@noble/hashes/esm/blake2.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/blake2.js +413 -0
- package/node_modules/@noble/hashes/esm/blake2.js.map +1 -0
- package/node_modules/@noble/hashes/esm/blake2b.d.ts +11 -0
- package/node_modules/@noble/hashes/esm/blake2b.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/blake2b.js +11 -0
- package/node_modules/@noble/hashes/esm/blake2b.js.map +1 -0
- package/node_modules/@noble/hashes/esm/blake2s.d.ts +20 -0
- package/node_modules/@noble/hashes/esm/blake2s.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/blake2s.js +21 -0
- package/node_modules/@noble/hashes/esm/blake2s.js.map +1 -0
- package/node_modules/@noble/hashes/esm/blake3.d.ts +54 -0
- package/node_modules/@noble/hashes/esm/blake3.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/blake3.js +251 -0
- package/node_modules/@noble/hashes/esm/blake3.js.map +1 -0
- package/node_modules/@noble/hashes/esm/crypto.d.ts +2 -0
- package/node_modules/@noble/hashes/esm/crypto.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/crypto.js +2 -0
- package/node_modules/@noble/hashes/esm/crypto.js.map +1 -0
- package/node_modules/@noble/hashes/esm/cryptoNode.d.ts +2 -0
- package/node_modules/@noble/hashes/esm/cryptoNode.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/cryptoNode.js +15 -0
- package/node_modules/@noble/hashes/esm/cryptoNode.js.map +1 -0
- package/node_modules/@noble/hashes/esm/eskdf.d.ts +47 -0
- package/node_modules/@noble/hashes/esm/eskdf.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/eskdf.js +160 -0
- package/node_modules/@noble/hashes/esm/eskdf.js.map +1 -0
- package/node_modules/@noble/hashes/esm/hkdf.d.ts +36 -0
- package/node_modules/@noble/hashes/esm/hkdf.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/hkdf.js +82 -0
- package/node_modules/@noble/hashes/esm/hkdf.js.map +1 -0
- package/node_modules/@noble/hashes/esm/hmac.d.ts +35 -0
- package/node_modules/@noble/hashes/esm/hmac.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/hmac.js +86 -0
- package/node_modules/@noble/hashes/esm/hmac.js.map +1 -0
- package/node_modules/@noble/hashes/esm/index.d.ts +2 -0
- package/node_modules/@noble/hashes/esm/index.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/index.js +33 -0
- package/node_modules/@noble/hashes/esm/index.js.map +1 -0
- package/node_modules/@noble/hashes/esm/legacy.d.ts +71 -0
- package/node_modules/@noble/hashes/esm/legacy.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/legacy.js +281 -0
- package/node_modules/@noble/hashes/esm/legacy.js.map +1 -0
- package/node_modules/@noble/hashes/esm/package.json +10 -0
- package/node_modules/@noble/hashes/esm/pbkdf2.d.ts +23 -0
- package/node_modules/@noble/hashes/esm/pbkdf2.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/pbkdf2.js +97 -0
- package/node_modules/@noble/hashes/esm/pbkdf2.js.map +1 -0
- package/node_modules/@noble/hashes/esm/ripemd160.d.ts +13 -0
- package/node_modules/@noble/hashes/esm/ripemd160.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/ripemd160.js +13 -0
- package/node_modules/@noble/hashes/esm/ripemd160.js.map +1 -0
- package/node_modules/@noble/hashes/esm/scrypt.d.ts +34 -0
- package/node_modules/@noble/hashes/esm/scrypt.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/scrypt.js +228 -0
- package/node_modules/@noble/hashes/esm/scrypt.js.map +1 -0
- package/node_modules/@noble/hashes/esm/sha1.d.ts +11 -0
- package/node_modules/@noble/hashes/esm/sha1.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/sha1.js +11 -0
- package/node_modules/@noble/hashes/esm/sha1.js.map +1 -0
- package/node_modules/@noble/hashes/esm/sha2.d.ts +159 -0
- package/node_modules/@noble/hashes/esm/sha2.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/sha2.js +375 -0
- package/node_modules/@noble/hashes/esm/sha2.js.map +1 -0
- package/node_modules/@noble/hashes/esm/sha256.d.ts +20 -0
- package/node_modules/@noble/hashes/esm/sha256.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/sha256.js +20 -0
- package/node_modules/@noble/hashes/esm/sha256.js.map +1 -0
- package/node_modules/@noble/hashes/esm/sha3-addons.d.ts +142 -0
- package/node_modules/@noble/hashes/esm/sha3-addons.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/sha3-addons.js +393 -0
- package/node_modules/@noble/hashes/esm/sha3-addons.js.map +1 -0
- package/node_modules/@noble/hashes/esm/sha3.d.ts +53 -0
- package/node_modules/@noble/hashes/esm/sha3.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/sha3.js +234 -0
- package/node_modules/@noble/hashes/esm/sha3.js.map +1 -0
- package/node_modules/@noble/hashes/esm/sha512.d.ts +26 -0
- package/node_modules/@noble/hashes/esm/sha512.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/sha512.js +26 -0
- package/node_modules/@noble/hashes/esm/sha512.js.map +1 -0
- package/node_modules/@noble/hashes/esm/utils.d.ts +161 -0
- package/node_modules/@noble/hashes/esm/utils.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/utils.js +281 -0
- package/node_modules/@noble/hashes/esm/utils.js.map +1 -0
- package/node_modules/@noble/hashes/hkdf.d.ts +36 -0
- package/node_modules/@noble/hashes/hkdf.d.ts.map +1 -0
- package/node_modules/@noble/hashes/hkdf.js +88 -0
- package/node_modules/@noble/hashes/hkdf.js.map +1 -0
- package/node_modules/@noble/hashes/hmac.d.ts +35 -0
- package/node_modules/@noble/hashes/hmac.d.ts.map +1 -0
- package/node_modules/@noble/hashes/hmac.js +91 -0
- package/node_modules/@noble/hashes/hmac.js.map +1 -0
- package/node_modules/@noble/hashes/index.d.ts +1 -0
- package/node_modules/@noble/hashes/index.d.ts.map +1 -0
- package/node_modules/@noble/hashes/index.js +33 -0
- package/node_modules/@noble/hashes/index.js.map +1 -0
- package/node_modules/@noble/hashes/legacy.d.ts +71 -0
- package/node_modules/@noble/hashes/legacy.d.ts.map +1 -0
- package/node_modules/@noble/hashes/legacy.js +287 -0
- package/node_modules/@noble/hashes/legacy.js.map +1 -0
- package/node_modules/@noble/hashes/package.json +266 -0
- package/node_modules/@noble/hashes/pbkdf2.d.ts +23 -0
- package/node_modules/@noble/hashes/pbkdf2.d.ts.map +1 -0
- package/node_modules/@noble/hashes/pbkdf2.js +101 -0
- package/node_modules/@noble/hashes/pbkdf2.js.map +1 -0
- package/node_modules/@noble/hashes/ripemd160.d.ts +13 -0
- package/node_modules/@noble/hashes/ripemd160.d.ts.map +1 -0
- package/node_modules/@noble/hashes/ripemd160.js +16 -0
- package/node_modules/@noble/hashes/ripemd160.js.map +1 -0
- package/node_modules/@noble/hashes/scrypt.d.ts +34 -0
- package/node_modules/@noble/hashes/scrypt.d.ts.map +1 -0
- package/node_modules/@noble/hashes/scrypt.js +232 -0
- package/node_modules/@noble/hashes/scrypt.js.map +1 -0
- package/node_modules/@noble/hashes/sha1.d.ts +11 -0
- package/node_modules/@noble/hashes/sha1.d.ts.map +1 -0
- package/node_modules/@noble/hashes/sha1.js +14 -0
- package/node_modules/@noble/hashes/sha1.js.map +1 -0
- package/node_modules/@noble/hashes/sha2.d.ts +159 -0
- package/node_modules/@noble/hashes/sha2.d.ts.map +1 -0
- package/node_modules/@noble/hashes/sha2.js +384 -0
- package/node_modules/@noble/hashes/sha2.js.map +1 -0
- package/node_modules/@noble/hashes/sha256.d.ts +20 -0
- package/node_modules/@noble/hashes/sha256.d.ts.map +1 -0
- package/node_modules/@noble/hashes/sha256.js +23 -0
- package/node_modules/@noble/hashes/sha256.js.map +1 -0
- package/node_modules/@noble/hashes/sha3-addons.d.ts +142 -0
- package/node_modules/@noble/hashes/sha3-addons.d.ts.map +1 -0
- package/node_modules/@noble/hashes/sha3-addons.js +402 -0
- package/node_modules/@noble/hashes/sha3-addons.js.map +1 -0
- package/node_modules/@noble/hashes/sha3.d.ts +53 -0
- package/node_modules/@noble/hashes/sha3.d.ts.map +1 -0
- package/node_modules/@noble/hashes/sha3.js +239 -0
- package/node_modules/@noble/hashes/sha3.js.map +1 -0
- package/node_modules/@noble/hashes/sha512.d.ts +26 -0
- package/node_modules/@noble/hashes/sha512.d.ts.map +1 -0
- package/node_modules/@noble/hashes/sha512.js +29 -0
- package/node_modules/@noble/hashes/sha512.js.map +1 -0
- package/node_modules/@noble/hashes/src/_assert.ts +22 -0
- package/node_modules/@noble/hashes/src/_blake.ts +50 -0
- package/node_modules/@noble/hashes/src/_md.ts +176 -0
- package/node_modules/@noble/hashes/src/_u64.ts +91 -0
- package/node_modules/@noble/hashes/src/argon2.ts +497 -0
- package/node_modules/@noble/hashes/src/blake1.ts +534 -0
- package/node_modules/@noble/hashes/src/blake2.ts +486 -0
- package/node_modules/@noble/hashes/src/blake2b.ts +10 -0
- package/node_modules/@noble/hashes/src/blake2s.ts +20 -0
- package/node_modules/@noble/hashes/src/blake3.ts +272 -0
- package/node_modules/@noble/hashes/src/crypto.ts +9 -0
- package/node_modules/@noble/hashes/src/cryptoNode.ts +15 -0
- package/node_modules/@noble/hashes/src/eskdf.ts +187 -0
- package/node_modules/@noble/hashes/src/hkdf.ts +88 -0
- package/node_modules/@noble/hashes/src/hmac.ts +94 -0
- package/node_modules/@noble/hashes/src/index.ts +31 -0
- package/node_modules/@noble/hashes/src/legacy.ts +293 -0
- package/node_modules/@noble/hashes/src/pbkdf2.ts +122 -0
- package/node_modules/@noble/hashes/src/ripemd160.ts +12 -0
- package/node_modules/@noble/hashes/src/scrypt.ts +257 -0
- package/node_modules/@noble/hashes/src/sha1.ts +10 -0
- package/node_modules/@noble/hashes/src/sha2.ts +402 -0
- package/node_modules/@noble/hashes/src/sha256.ts +24 -0
- package/node_modules/@noble/hashes/src/sha3-addons.ts +499 -0
- package/node_modules/@noble/hashes/src/sha3.ts +258 -0
- package/node_modules/@noble/hashes/src/sha512.ts +34 -0
- package/node_modules/@noble/hashes/src/utils.ts +395 -0
- package/node_modules/@noble/hashes/utils.d.ts +161 -0
- package/node_modules/@noble/hashes/utils.d.ts.map +1 -0
- package/node_modules/@noble/hashes/utils.js +313 -0
- package/node_modules/@noble/hashes/utils.js.map +1 -0
- package/package.json +203 -0
- package/schemas/catalog.schema.json +283 -0
- package/src/align.ts +235 -0
- package/src/audio-init-parser.ts +189 -0
- package/src/audio-ring-buffer.ts +120 -0
- package/src/authored-timing.ts +63 -0
- package/src/carp-catalog.ts +776 -0
- package/src/catalog-fec-params.ts +167 -0
- package/src/catalog-network-source.ts +49 -0
- package/src/catalog-validator.ts +34 -0
- package/src/cmaf-block-assembler.ts +1058 -0
- package/src/cmaf-group-batcher.ts +104 -0
- package/src/cmcd-producer.ts +329 -0
- package/src/codec-utils.ts +1539 -0
- package/src/fec-codec.ts +61 -0
- package/src/fec-manager.ts +1939 -0
- package/src/fec-starvation-detector.ts +128 -0
- package/src/fec-worker-setup.ts +177 -0
- package/src/fmp4-completion.ts +47 -0
- package/src/fmp4-reader.ts +112 -0
- package/src/index.ts +443 -0
- package/src/iso-bmff-timing.ts +688 -0
- package/src/loc.ts +181 -0
- package/src/manifest-auth-plan.ts +107 -0
- package/src/media-router.ts +1185 -0
- package/src/mfu-reassembler.ts +2842 -0
- package/src/mfu-reassembly-policy.ts +134 -0
- package/src/mmtp-container-parser.ts +1498 -0
- package/src/mmtp-decode-pipeline.ts +315 -0
- package/src/mmtp-router.ts +3027 -0
- package/src/mmtp-to-cmaf.ts +956 -0
- package/src/multicast-auth-catalog.ts +340 -0
- package/src/multicast-input.ts +439 -0
- package/src/multicast-manager.ts +1503 -0
- package/src/multicast-transport.ts +320 -0
- package/src/multicast-unwrap.ts +132 -0
- package/src/no-modules.ts +20 -0
- package/src/phase14-catalog-override.ts +336 -0
- package/src/repair-fetch.ts +217 -0
- package/src/sample-combiner.ts +846 -0
- package/src/signaling.ts +78 -0
- package/src/source-auth.ts +1 -0
- package/src/switching-set-alignment.ts +109 -0
- package/src/timestamp-codec.ts +265 -0
- package/src/track-pipeline-setup.ts +189 -0
- package/src/track-pipeline.ts +332 -0
- package/src/track-session.ts +778 -0
- package/src/transport-pool.ts +128 -0
- package/src/wasm-mfu-reassembler.ts +372 -0
- package/src/wasm-mmtp-container-parser.ts +23 -0
- package/test-vectors/align.json +199 -0
- package/test-vectors/catalog/README.md +25 -0
- package/test-vectors/catalog/negative/legacy-selection-params.json +15 -0
- package/test-vectors/catalog/negative/missing-mmtp-fields.json +12 -0
- package/test-vectors/catalog/negative/multicast-auth-padded-key.json +37 -0
- package/test-vectors/catalog/negative/multicast-auth-reused-track-format.json +53 -0
- package/test-vectors/catalog/negative/multicast-auth-trailing-pad-bits.json +37 -0
- package/test-vectors/catalog/negative/multicast-endpoint-missing-protocol-and-source.json +24 -0
- package/test-vectors/catalog/negative/network-source-object.json +25 -0
- package/test-vectors/catalog/negative/raptorq-unaligned-symbol.json +26 -0
- package/test-vectors/catalog/negative/repair-track-legacy-shape.json +18 -0
- package/test-vectors/catalog/negative/track-role-empty.json +16 -0
- package/test-vectors/catalog/negative/track-role-non-string.json +16 -0
- package/test-vectors/catalog/positive/fec-multicast.json +51 -0
- package/test-vectors/catalog/positive/flat-av.json +30 -0
- package/test-vectors/catalog/positive/multicast-auth-rotation.json +55 -0
- package/test-vectors/catalog/positive/ticks-and-mixed-timescales.json +39 -0
- package/test-vectors/catalog/positive/track-role.json +49 -0
- package/test-vectors/catalog/releases/moqcast-native-v16-v1/catalog.json +65 -0
- package/test-vectors/catalog/releases/moqcast-native-v16-v1.archive.sha256 +1 -0
- package/test-vectors/catalog-multicast-auth-v1.json +26 -0
- package/test-vectors/catalog-validation.json +148 -0
- package/test-vectors/catalog-validator-public-api.mjs +25 -0
- package/test-vectors/generate-source-auth-fixture.mjs +114 -0
- package/test-vectors/source-auth-v1.json +61 -0
- package/test-vectors/subsample-placement-v1.json +230 -0
|
@@ -0,0 +1,802 @@
|
|
|
1
|
+
var __typeError = (msg) => {
|
|
2
|
+
throw TypeError(msg);
|
|
3
|
+
};
|
|
4
|
+
var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
|
|
5
|
+
var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
|
|
6
|
+
var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
|
|
7
|
+
var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), setter ? setter.call(obj, value) : member.set(obj, value), value);
|
|
8
|
+
var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "access private method"), method);
|
|
9
|
+
var __privateWrapper = (obj, member, setter, getter) => ({
|
|
10
|
+
set _(value) {
|
|
11
|
+
__privateSet(obj, member, value, setter);
|
|
12
|
+
},
|
|
13
|
+
get _() {
|
|
14
|
+
return __privateGet(obj, member, getter);
|
|
15
|
+
}
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
// src/align.ts
|
|
19
|
+
function groupIdForTicks(ticks, groupDurationTicks) {
|
|
20
|
+
if (!Number.isInteger(ticks)) {
|
|
21
|
+
throw new Error(
|
|
22
|
+
`[align] groupIdForTicks: ticks must be an integer, got ${ticks}`
|
|
23
|
+
);
|
|
24
|
+
}
|
|
25
|
+
if (!Number.isInteger(groupDurationTicks) || groupDurationTicks <= 0) {
|
|
26
|
+
throw new Error(
|
|
27
|
+
`[align] groupIdForTicks: groupDurationTicks must be a positive integer, got ${groupDurationTicks}`
|
|
28
|
+
);
|
|
29
|
+
}
|
|
30
|
+
if (ticks < 0) return 0;
|
|
31
|
+
return Math.floor(ticks / groupDurationTicks);
|
|
32
|
+
}
|
|
33
|
+
function driftCheck(expected, actual) {
|
|
34
|
+
if (!Number.isInteger(expected) || !Number.isInteger(actual)) {
|
|
35
|
+
throw new Error(
|
|
36
|
+
`[align] driftCheck: both arguments must be integer groupIds, got expected=${expected} actual=${actual}`
|
|
37
|
+
);
|
|
38
|
+
}
|
|
39
|
+
const deltaGroups = actual - expected;
|
|
40
|
+
if (deltaGroups === 0) return { kind: "aligned", deltaGroups: 0 };
|
|
41
|
+
return { kind: "drifted", deltaGroups };
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// src/track-session.ts
|
|
45
|
+
import { deriveFecInterleaveDepth } from "@blockcast/mmt-fec";
|
|
46
|
+
function computeFecDeliveryWindowMs(config) {
|
|
47
|
+
const fecInterleaveMs = config.interleaveDepthMs;
|
|
48
|
+
const fecK = config.sourceSymbols;
|
|
49
|
+
if (fecInterleaveMs <= 0) {
|
|
50
|
+
throw new Error(
|
|
51
|
+
`[TrackSession] fecInterleaveMs=${fecInterleaveMs}. Derive a positive FEC interleave window from the stream catalog.`
|
|
52
|
+
);
|
|
53
|
+
}
|
|
54
|
+
if (fecK <= 0) {
|
|
55
|
+
throw new Error(
|
|
56
|
+
`[TrackSession] fecK=${fecK}. Derive a positive FEC source-symbol count from the stream catalog.`
|
|
57
|
+
);
|
|
58
|
+
}
|
|
59
|
+
const spansMs = [fecInterleaveMs];
|
|
60
|
+
if (config.mediaUnitsPerSecond && config.mediaUnitsPerSecond > 0) {
|
|
61
|
+
const mediaUnitMs = 1e3 / config.mediaUnitsPerSecond;
|
|
62
|
+
const interleaveUnits = deriveFecInterleaveDepth(fecInterleaveMs, mediaUnitMs);
|
|
63
|
+
const deliverySymbols = fecK + Math.max(0, config.repairSymbols ?? 0);
|
|
64
|
+
spansMs.push(deliverySymbols * interleaveUnits * mediaUnitMs);
|
|
65
|
+
}
|
|
66
|
+
if (config.symbolSize && config.symbolSize > 0 && config.bandwidthBps && config.bandwidthBps > 0) {
|
|
67
|
+
const repairSymbols = Math.max(0, config.repairSymbols ?? 0);
|
|
68
|
+
spansMs.push(
|
|
69
|
+
(fecK + repairSymbols) * config.symbolSize * 8 * 1e3 / config.bandwidthBps
|
|
70
|
+
);
|
|
71
|
+
}
|
|
72
|
+
const coreMs = Math.max(...spansMs);
|
|
73
|
+
const marginMs = config.jitterBufferMs !== void 0 && config.jitterBufferMs >= 0 ? config.jitterBufferMs : fecInterleaveMs;
|
|
74
|
+
return Math.ceil(coreMs) + Math.ceil(marginMs);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// src/media-router.ts
|
|
78
|
+
var GROUP_ALIGN_WARN_BUDGET = {
|
|
79
|
+
"invalid-tick-inputs": 1,
|
|
80
|
+
"ticks-formula-threw": 1,
|
|
81
|
+
"invalid-seconds-inputs": 1,
|
|
82
|
+
"sub-nanosecond-duration": 1,
|
|
83
|
+
"media-time-overflow": 1,
|
|
84
|
+
"seconds-formula-threw": 1,
|
|
85
|
+
"callback-threw": 3
|
|
86
|
+
};
|
|
87
|
+
var TrackSourceConflictError = class extends Error {
|
|
88
|
+
constructor(trackName) {
|
|
89
|
+
super(`Track source already assigned for '${trackName}'; call clearTrackSource first`);
|
|
90
|
+
this.trackName = trackName;
|
|
91
|
+
this.name = "TrackSourceConflictError";
|
|
92
|
+
}
|
|
93
|
+
};
|
|
94
|
+
var DEFAULT_CROSSFADE_FRAMES = 10;
|
|
95
|
+
var DEFAULT_MAX_OVERLAY_BUFFER = 128;
|
|
96
|
+
var _active, _multicastVideoKeyed, _multicastAudioReceived, _moqVideoKeyframeEmitted, _requireAudio, _suppressed, _audioFallbackTimer, _audioFallbackMs, _crossfadeFrames, _maxOverlayBuffer, _allowDeltaMulticastTakeoverAfterMoqKeyframe, _repairInFlight, _maxRepairInFlight, _onRepairRequest, _onVideoFrame, _onAudioFrame, _onOverlayFrame, _onSourceSwitch, _sourceSwitchReady, _sourceSwitchToken, _pendingMulticastToken, _pendingMulticastVideo, _pendingMulticastAudio, _trackSources, _trackTypes, _crossfadeCounters, _overlayBoundaryReached, _overlayBuffer, _deltaConfigured, _deltaActive, _deltaWindow, _deltaWindowSize, _deltaFailThresholdRatio, _deltaRecoverThresholdRatio, _deltaProbeIntervalMs, _lastProbeAt, _onDeltaFallbackCb, _onDeltaRecoverCb, _onGroupDrift, _groupAlignWarnCounts, _MediaRouter_instances, skipWithWarning_fn, resolveTicks_fn, resolveSeconds_fn, _moqAudioWarmed, tryActivateMulticast_fn, commitMulticastActivation_fn, rejectMulticastActivation_fn, emitForTrack_fn, handleOverlayFrame_fn;
|
|
97
|
+
var MediaRouter = class {
|
|
98
|
+
constructor(options) {
|
|
99
|
+
__privateAdd(this, _MediaRouter_instances);
|
|
100
|
+
__privateAdd(this, _active, "moq");
|
|
101
|
+
__privateAdd(this, _multicastVideoKeyed, false);
|
|
102
|
+
__privateAdd(this, _multicastAudioReceived, false);
|
|
103
|
+
__privateAdd(this, _moqVideoKeyframeEmitted, false);
|
|
104
|
+
__privateAdd(this, _requireAudio);
|
|
105
|
+
__privateAdd(this, _suppressed, false);
|
|
106
|
+
// true after multicast confirmed — suppresses MoQ
|
|
107
|
+
__privateAdd(this, _audioFallbackTimer, null);
|
|
108
|
+
// Configurable constants (from catalog/FEC config, not magic numbers)
|
|
109
|
+
__privateAdd(this, _audioFallbackMs);
|
|
110
|
+
__privateAdd(this, _crossfadeFrames);
|
|
111
|
+
__privateAdd(this, _maxOverlayBuffer);
|
|
112
|
+
__privateAdd(this, _allowDeltaMulticastTakeoverAfterMoqKeyframe);
|
|
113
|
+
// ── Keyframe repair state ────────────────────────────────────────
|
|
114
|
+
/** Groups currently being repaired — idempotent guard per Pitfall 2 (T-13-01 mitigation) */
|
|
115
|
+
__privateAdd(this, _repairInFlight, /* @__PURE__ */ new Set());
|
|
116
|
+
/** Max concurrent repairs — prevents relay SUBSCRIBE flood (T-13-01 mitigation) */
|
|
117
|
+
__privateAdd(this, _maxRepairInFlight);
|
|
118
|
+
/** Callback to request MoQ subscribe for a specific group (wired by player) */
|
|
119
|
+
__privateAdd(this, _onRepairRequest, null);
|
|
120
|
+
__privateAdd(this, _onVideoFrame, null);
|
|
121
|
+
__privateAdd(this, _onAudioFrame, null);
|
|
122
|
+
__privateAdd(this, _onOverlayFrame, null);
|
|
123
|
+
__privateAdd(this, _onSourceSwitch, null);
|
|
124
|
+
__privateAdd(this, _sourceSwitchReady, null);
|
|
125
|
+
__privateAdd(this, _sourceSwitchToken, 0);
|
|
126
|
+
__privateAdd(this, _pendingMulticastToken, null);
|
|
127
|
+
__privateAdd(this, _pendingMulticastVideo, null);
|
|
128
|
+
__privateAdd(this, _pendingMulticastAudio, null);
|
|
129
|
+
// Per-track source state
|
|
130
|
+
__privateAdd(this, _trackSources, /* @__PURE__ */ new Map());
|
|
131
|
+
// Track type registry: trackName → { type, source }.
|
|
132
|
+
// Init data / inline signaling is authoritative until catalog updates.
|
|
133
|
+
// Priority: 'init' > 'catalog' > 'name' (backward compat fallback).
|
|
134
|
+
__privateAdd(this, _trackTypes, /* @__PURE__ */ new Map());
|
|
135
|
+
// Crossfade state: maps trackName → remaining binary-path frames allowed during window
|
|
136
|
+
__privateAdd(this, _crossfadeCounters, /* @__PURE__ */ new Map());
|
|
137
|
+
// Overlay alignment state
|
|
138
|
+
__privateAdd(this, _overlayBoundaryReached, false);
|
|
139
|
+
__privateAdd(this, _overlayBuffer, []);
|
|
140
|
+
// ── Phase 14: deltaActive state machine (D-11..D-14) ─────────────
|
|
141
|
+
// No timers — state transitions driven entirely by notifyDeltaBlock() callbacks.
|
|
142
|
+
// All thresholds derived from catalog fields or throw at configureDelta() time.
|
|
143
|
+
__privateAdd(this, _deltaConfigured, false);
|
|
144
|
+
__privateAdd(this, _deltaActive, true);
|
|
145
|
+
__privateAdd(this, _deltaWindow, []);
|
|
146
|
+
// ring buffer: true = block failed
|
|
147
|
+
__privateAdd(this, _deltaWindowSize, 0);
|
|
148
|
+
__privateAdd(this, _deltaFailThresholdRatio, 0);
|
|
149
|
+
// P/K
|
|
150
|
+
__privateAdd(this, _deltaRecoverThresholdRatio, 0);
|
|
151
|
+
// (P/K)/2 — hysteresis (D-13)
|
|
152
|
+
__privateAdd(this, _deltaProbeIntervalMs, 0);
|
|
153
|
+
__privateAdd(this, _lastProbeAt, 0);
|
|
154
|
+
__privateAdd(this, _onDeltaFallbackCb, null);
|
|
155
|
+
__privateAdd(this, _onDeltaRecoverCb, null);
|
|
156
|
+
// ── Group-alignment observer (align.ts formula) ──────────────────
|
|
157
|
+
// Observation only — does NOT alter routing. Producers are wired in
|
|
158
|
+
// follow-up PRs; when they land they will call
|
|
159
|
+
// CmcdProducer.incrementSwitchMiscount() + emitSwitchDrift() from the
|
|
160
|
+
// onGroupDrift callback so divergence between packet-stamped groupIds
|
|
161
|
+
// and the shared formula surfaces on `x-bc-switch-drift-us` /
|
|
162
|
+
// `x-bc-switch-miscount`. Canonical Go impl: Blockcast/multicast
|
|
163
|
+
// cmd/caddy/sender/group_align.go (commit 104eeff). Canonical Rust impl:
|
|
164
|
+
// moqtail/moqtail apps/relay/src/server/abr.rs (branch
|
|
165
|
+
// experimental/server-side-abr, commit 39accbf).
|
|
166
|
+
__privateAdd(this, _onGroupDrift, null);
|
|
167
|
+
__privateAdd(this, _groupAlignWarnCounts, /* @__PURE__ */ new Map());
|
|
168
|
+
/**
|
|
169
|
+
* MoQ unicast audio warmup gate. When audio is required, multicast takeover
|
|
170
|
+
* waits until the MoQ unicast audio decoder has emitted at least one frame
|
|
171
|
+
* (so downstream samples-before-takeover counters observe nonzero) or until
|
|
172
|
+
* the existing audio-fallback timer forces the flag true.
|
|
173
|
+
*/
|
|
174
|
+
__privateAdd(this, _moqAudioWarmed, false);
|
|
175
|
+
__privateSet(this, _requireAudio, options?.requireAudio ?? true);
|
|
176
|
+
__privateSet(this, _audioFallbackMs, options?.audioFallbackMs ?? 0);
|
|
177
|
+
__privateSet(this, _crossfadeFrames, options?.crossfadeFrames ?? DEFAULT_CROSSFADE_FRAMES);
|
|
178
|
+
__privateSet(this, _maxOverlayBuffer, options?.maxOverlayBuffer ?? DEFAULT_MAX_OVERLAY_BUFFER);
|
|
179
|
+
__privateSet(this, _maxRepairInFlight, options?.maxRepairInFlight ?? 2);
|
|
180
|
+
__privateSet(this, _allowDeltaMulticastTakeoverAfterMoqKeyframe, options?.allowDeltaMulticastTakeoverAfterMoqKeyframe ?? false);
|
|
181
|
+
}
|
|
182
|
+
onVideoFrame(cb) {
|
|
183
|
+
__privateSet(this, _onVideoFrame, cb);
|
|
184
|
+
}
|
|
185
|
+
onAudioFrame(cb) {
|
|
186
|
+
__privateSet(this, _onAudioFrame, cb);
|
|
187
|
+
}
|
|
188
|
+
onOverlayFrame(cb) {
|
|
189
|
+
__privateSet(this, _onOverlayFrame, cb);
|
|
190
|
+
}
|
|
191
|
+
onSourceSwitch(cb) {
|
|
192
|
+
__privateSet(this, _onSourceSwitch, cb);
|
|
193
|
+
}
|
|
194
|
+
onGroupDrift(cb) {
|
|
195
|
+
__privateSet(this, _onGroupDrift, cb);
|
|
196
|
+
}
|
|
197
|
+
notifyGroupBoundary(trackName, packetGroupId, timingOrMediaTimeSec, groupDurationSec) {
|
|
198
|
+
if (!__privateGet(this, _onGroupDrift)) return;
|
|
199
|
+
const resolved = typeof timingOrMediaTimeSec === "object" && timingOrMediaTimeSec !== null ? __privateMethod(this, _MediaRouter_instances, resolveTicks_fn).call(this, trackName, timingOrMediaTimeSec) : __privateMethod(this, _MediaRouter_instances, resolveSeconds_fn).call(this, trackName, timingOrMediaTimeSec, groupDurationSec);
|
|
200
|
+
if (!resolved) return;
|
|
201
|
+
if (resolved.mediaTimeSec === 0 && packetGroupId !== 0) return;
|
|
202
|
+
const expected = resolved.expected;
|
|
203
|
+
const result = driftCheck(expected, packetGroupId);
|
|
204
|
+
if (result.kind === "aligned") return;
|
|
205
|
+
try {
|
|
206
|
+
__privateGet(this, _onGroupDrift).call(this, {
|
|
207
|
+
trackName,
|
|
208
|
+
expectedGroupId: expected,
|
|
209
|
+
actualGroupId: packetGroupId,
|
|
210
|
+
deltaGroups: result.deltaGroups,
|
|
211
|
+
mediaTimeSec: resolved.mediaTimeSec,
|
|
212
|
+
groupDurationSec: resolved.groupDurationSec,
|
|
213
|
+
...resolved.timing ? { timing: resolved.timing } : {}
|
|
214
|
+
});
|
|
215
|
+
} catch (err) {
|
|
216
|
+
__privateMethod(this, _MediaRouter_instances, skipWithWarning_fn).call(this, "callback-threw", `[MediaRouter] onGroupDrift callback threw (track=${trackName} expected=${expected} actual=${packetGroupId}); continuing: ${err?.message ?? err}`);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
get activeSource() {
|
|
220
|
+
return __privateGet(this, _active);
|
|
221
|
+
}
|
|
222
|
+
// ── Keyframe repair API ──────────────────────────────────────────
|
|
223
|
+
/** Register callback for keyframe repair requests. Player wires this to issue MoQ SUBSCRIBE. */
|
|
224
|
+
onRepairRequest(cb) {
|
|
225
|
+
__privateSet(this, _onRepairRequest, cb);
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Request repair for a lost keyframe group. Only fires when activeSource is 'multicast'.
|
|
229
|
+
* Idempotent per groupId — duplicate calls for the same group are suppressed.
|
|
230
|
+
* @param expectedGroupId - The group ID expected but not received
|
|
231
|
+
* @param trackName - Track name for the SUBSCRIBE (e.g. 'video'). Default: 'video'.
|
|
232
|
+
*/
|
|
233
|
+
repairLostGroup(expectedGroupId, trackName = "video") {
|
|
234
|
+
var _a;
|
|
235
|
+
if (__privateGet(this, _active) !== "multicast") return;
|
|
236
|
+
if (__privateGet(this, _repairInFlight).has(expectedGroupId)) return;
|
|
237
|
+
if (__privateGet(this, _repairInFlight).size >= __privateGet(this, _maxRepairInFlight)) {
|
|
238
|
+
console.warn(
|
|
239
|
+
`[MediaRouter] max repair in flight (${__privateGet(this, _maxRepairInFlight)}), dropping repair for group ${expectedGroupId}`
|
|
240
|
+
);
|
|
241
|
+
return;
|
|
242
|
+
}
|
|
243
|
+
__privateGet(this, _repairInFlight).add(expectedGroupId);
|
|
244
|
+
(_a = __privateGet(this, _onRepairRequest)) == null ? void 0 : _a.call(this, expectedGroupId, trackName);
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Feed a recovered keyframe frame from the repair path.
|
|
248
|
+
* Bypasses source arbitration entirely — goes directly to decoder callbacks.
|
|
249
|
+
* Does NOT change activeSource. Does NOT trigger failbackToMoq.
|
|
250
|
+
*/
|
|
251
|
+
feedRepair(data, meta, kind) {
|
|
252
|
+
var _a, _b;
|
|
253
|
+
if (__privateGet(this, _active) !== "multicast") return;
|
|
254
|
+
const routedMeta = { ...meta, source: "repair", recovered: true };
|
|
255
|
+
if (kind === "video") (_a = __privateGet(this, _onVideoFrame)) == null ? void 0 : _a.call(this, data, routedMeta);
|
|
256
|
+
else (_b = __privateGet(this, _onAudioFrame)) == null ? void 0 : _b.call(this, data, routedMeta);
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Clear repair-in-flight state for a group (called after repair completes or times out).
|
|
260
|
+
*/
|
|
261
|
+
clearRepairInFlight(groupId) {
|
|
262
|
+
__privateGet(this, _repairInFlight).delete(groupId);
|
|
263
|
+
}
|
|
264
|
+
// ── Phase 14: deltaActive state machine API ──────────────────────
|
|
265
|
+
/**
|
|
266
|
+
* Configure the delta-track fallback state machine from catalog parameters.
|
|
267
|
+
*
|
|
268
|
+
* D-11: Thresholds derive from fec.sourceSymbols, fec.repairSymbols, framerate.
|
|
269
|
+
* D-13: Probe interval derives from deltaProbeIntervalMs or interleaveDepthMs*2.
|
|
270
|
+
* CLAUDE.md: error on bad init — throws if required inputs are absent.
|
|
271
|
+
*
|
|
272
|
+
* Calling again resets deltaActive=true and clears the window buffer (stream restart).
|
|
273
|
+
*/
|
|
274
|
+
configureDelta(cfg) {
|
|
275
|
+
if (typeof cfg.framerate !== "number" || !Number.isFinite(cfg.framerate) || cfg.framerate <= 0) {
|
|
276
|
+
throw new Error("[MediaRouter] configureDelta: framerate required and must be > 0");
|
|
277
|
+
}
|
|
278
|
+
if (typeof cfg.sourceSymbols !== "number" || cfg.sourceSymbols <= 0) {
|
|
279
|
+
throw new Error("[MediaRouter] configureDelta: sourceSymbols (K_delta) required and must be > 0");
|
|
280
|
+
}
|
|
281
|
+
if (typeof cfg.repairSymbols !== "number" || cfg.repairSymbols <= 0) {
|
|
282
|
+
throw new Error("[MediaRouter] configureDelta: repairSymbols (P_delta) required and must be > 0");
|
|
283
|
+
}
|
|
284
|
+
if (cfg.deltaProbeIntervalMs === void 0 && cfg.interleaveDepthMs === void 0) {
|
|
285
|
+
throw new Error(
|
|
286
|
+
"[MediaRouter] configureDelta: either deltaProbeIntervalMs or interleaveDepthMs required for probe interval derivation"
|
|
287
|
+
);
|
|
288
|
+
}
|
|
289
|
+
__privateSet(this, _deltaWindowSize, cfg.deltaFailWindowBlocks ?? Math.ceil(cfg.framerate));
|
|
290
|
+
__privateSet(this, _deltaFailThresholdRatio, cfg.repairSymbols / cfg.sourceSymbols);
|
|
291
|
+
__privateSet(this, _deltaRecoverThresholdRatio, __privateGet(this, _deltaFailThresholdRatio) / 2);
|
|
292
|
+
__privateSet(this, _deltaProbeIntervalMs, cfg.deltaProbeIntervalMs ?? computeFecDeliveryWindowMs({
|
|
293
|
+
interleaveDepthMs: cfg.interleaveDepthMs,
|
|
294
|
+
sourceSymbols: cfg.sourceSymbols
|
|
295
|
+
}));
|
|
296
|
+
__privateSet(this, _deltaActive, true);
|
|
297
|
+
__privateSet(this, _deltaWindow, []);
|
|
298
|
+
__privateSet(this, _lastProbeAt, 0);
|
|
299
|
+
__privateSet(this, _deltaConfigured, true);
|
|
300
|
+
}
|
|
301
|
+
/**
|
|
302
|
+
* Notify the state machine of a completed FEC block for the delta track.
|
|
303
|
+
*
|
|
304
|
+
* @param failed - true if the block was unrecoverable (FEC failure)
|
|
305
|
+
* @param nowMs - caller-injected monotonic ms (no internal timer — D-13, CLAUDE.md)
|
|
306
|
+
*
|
|
307
|
+
* If configureDelta() has not been called, this is a silent no-op (pre-catalog state).
|
|
308
|
+
*/
|
|
309
|
+
notifyDeltaBlock(failed, nowMs) {
|
|
310
|
+
var _a, _b;
|
|
311
|
+
if (!__privateGet(this, _deltaConfigured)) return;
|
|
312
|
+
__privateGet(this, _deltaWindow).push(failed);
|
|
313
|
+
if (__privateGet(this, _deltaWindow).length > __privateGet(this, _deltaWindowSize)) {
|
|
314
|
+
__privateGet(this, _deltaWindow).shift();
|
|
315
|
+
}
|
|
316
|
+
if (__privateGet(this, _deltaWindow).length < __privateGet(this, _deltaWindowSize)) return;
|
|
317
|
+
const failedCount = __privateGet(this, _deltaWindow).filter((x) => x).length;
|
|
318
|
+
const ratio = failedCount / __privateGet(this, _deltaWindowSize);
|
|
319
|
+
if (__privateGet(this, _deltaActive)) {
|
|
320
|
+
if (ratio > __privateGet(this, _deltaFailThresholdRatio)) {
|
|
321
|
+
__privateSet(this, _deltaActive, false);
|
|
322
|
+
__privateSet(this, _lastProbeAt, nowMs);
|
|
323
|
+
(_a = __privateGet(this, _onDeltaFallbackCb)) == null ? void 0 : _a.call(this);
|
|
324
|
+
}
|
|
325
|
+
} else {
|
|
326
|
+
if (nowMs - __privateGet(this, _lastProbeAt) >= __privateGet(this, _deltaProbeIntervalMs) && ratio < __privateGet(this, _deltaRecoverThresholdRatio)) {
|
|
327
|
+
__privateSet(this, _deltaActive, true);
|
|
328
|
+
__privateSet(this, _lastProbeAt, nowMs);
|
|
329
|
+
(_b = __privateGet(this, _onDeltaRecoverCb)) == null ? void 0 : _b.call(this);
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
/** Register callback fired when delta track degrades past threshold (D-12). */
|
|
334
|
+
onDeltaFallback(cb) {
|
|
335
|
+
__privateSet(this, _onDeltaFallbackCb, cb);
|
|
336
|
+
}
|
|
337
|
+
/** Register callback fired when delta track recovers below recovery threshold (D-13). */
|
|
338
|
+
onDeltaRecover(cb) {
|
|
339
|
+
__privateSet(this, _onDeltaRecoverCb, cb);
|
|
340
|
+
}
|
|
341
|
+
/** Whether the delta track is currently considered healthy (true = active). */
|
|
342
|
+
get deltaActive() {
|
|
343
|
+
return __privateGet(this, _deltaActive);
|
|
344
|
+
}
|
|
345
|
+
// ── Test-visible accessors for threshold verification ────────────
|
|
346
|
+
// These expose internal derived values for test assertions (Tests 3,4,5,6,7).
|
|
347
|
+
// Prefixed with 'delta' to namespace clearly within the public API surface.
|
|
348
|
+
/** Derived window size — exposed for test assertions (Test 3, 4). */
|
|
349
|
+
get deltaWindowSize() {
|
|
350
|
+
return __privateGet(this, _deltaWindowSize);
|
|
351
|
+
}
|
|
352
|
+
/** Derived fail threshold ratio (P/K) — exposed for test assertions (Test 6). */
|
|
353
|
+
get deltaFailThresholdRatio() {
|
|
354
|
+
return __privateGet(this, _deltaFailThresholdRatio);
|
|
355
|
+
}
|
|
356
|
+
/** Derived recovery threshold ratio ((P/K)/2) — exposed for test assertions (Test 7). */
|
|
357
|
+
get deltaRecoverThresholdRatio() {
|
|
358
|
+
return __privateGet(this, _deltaRecoverThresholdRatio);
|
|
359
|
+
}
|
|
360
|
+
/** Derived probe interval ms — exposed for test assertions (Test 5a). */
|
|
361
|
+
get deltaProbeIntervalMs() {
|
|
362
|
+
return __privateGet(this, _deltaProbeIntervalMs);
|
|
363
|
+
}
|
|
364
|
+
/**
|
|
365
|
+
* Register a track name → type mapping from catalog.
|
|
366
|
+
* Catalog is the default authority. Init data / inline signaling
|
|
367
|
+
* takes precedence until the next catalog update.
|
|
368
|
+
*/
|
|
369
|
+
registerTrackType(trackName, type) {
|
|
370
|
+
__privateGet(this, _trackTypes).set(trackName, { type, source: "catalog" });
|
|
371
|
+
}
|
|
372
|
+
/**
|
|
373
|
+
* Register a track name → type from init data / inline signaling (MMTP FT=0).
|
|
374
|
+
* Authoritative until the next catalog update per §5.3.
|
|
375
|
+
* Does NOT overwrite an existing catalog registration.
|
|
376
|
+
*/
|
|
377
|
+
registerTrackTypeFromInit(trackName, type) {
|
|
378
|
+
const existing = __privateGet(this, _trackTypes).get(trackName);
|
|
379
|
+
if (existing?.source === "catalog") return;
|
|
380
|
+
__privateGet(this, _trackTypes).set(trackName, { type, source: "init" });
|
|
381
|
+
}
|
|
382
|
+
/**
|
|
383
|
+
* Assign a per-track source. Frames from this source bypass the binary
|
|
384
|
+
* MoQ↔multicast switching for this track only.
|
|
385
|
+
*
|
|
386
|
+
* Throws TrackSourceConflictError if a source is already assigned for this
|
|
387
|
+
* track without a clearTrackSource() in between.
|
|
388
|
+
*/
|
|
389
|
+
setTrackSource(trackName, source, opts) {
|
|
390
|
+
if (__privateGet(this, _trackSources).has(trackName)) {
|
|
391
|
+
throw new TrackSourceConflictError(trackName);
|
|
392
|
+
}
|
|
393
|
+
const effectivePolicy = opts?.policy ?? (opts?.overlay ? "wait" : void 0);
|
|
394
|
+
if (effectivePolicy === "crossfade") {
|
|
395
|
+
__privateGet(this, _crossfadeCounters).set(trackName, __privateGet(this, _crossfadeFrames));
|
|
396
|
+
}
|
|
397
|
+
const record = {
|
|
398
|
+
source,
|
|
399
|
+
unsubscribeFrame: () => {
|
|
400
|
+
},
|
|
401
|
+
emitCount: 0
|
|
402
|
+
};
|
|
403
|
+
record.unsubscribeFrame = source.onFrame((data, meta) => {
|
|
404
|
+
record.emitCount++;
|
|
405
|
+
if (effectivePolicy === "wait") {
|
|
406
|
+
__privateMethod(this, _MediaRouter_instances, handleOverlayFrame_fn).call(this, data, meta);
|
|
407
|
+
} else {
|
|
408
|
+
__privateMethod(this, _MediaRouter_instances, emitForTrack_fn).call(this, trackName, data, meta);
|
|
409
|
+
}
|
|
410
|
+
});
|
|
411
|
+
if (source.onError) {
|
|
412
|
+
record.unsubscribeError = source.onError(() => {
|
|
413
|
+
this.clearTrackSource(trackName);
|
|
414
|
+
});
|
|
415
|
+
}
|
|
416
|
+
__privateGet(this, _trackSources).set(trackName, record);
|
|
417
|
+
}
|
|
418
|
+
/**
|
|
419
|
+
* Remove the per-track source for the given track.
|
|
420
|
+
* Binary switching resumes for this track after this call.
|
|
421
|
+
*/
|
|
422
|
+
clearTrackSource(trackName) {
|
|
423
|
+
const record = __privateGet(this, _trackSources).get(trackName);
|
|
424
|
+
if (!record) return;
|
|
425
|
+
record.unsubscribeFrame();
|
|
426
|
+
record.unsubscribeError?.();
|
|
427
|
+
record.source.dispose?.();
|
|
428
|
+
__privateGet(this, _trackSources).delete(trackName);
|
|
429
|
+
__privateGet(this, _crossfadeCounters).delete(trackName);
|
|
430
|
+
const reg = __privateGet(this, _trackTypes).get(trackName);
|
|
431
|
+
const isMedia = reg?.type === "video" || reg?.type === "audio" || reg === void 0 && (trackName === "video" || trackName === "audio");
|
|
432
|
+
if (!isMedia) {
|
|
433
|
+
__privateSet(this, _overlayBoundaryReached, false);
|
|
434
|
+
__privateSet(this, _overlayBuffer, []);
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
/**
|
|
438
|
+
* Signal that a FEC block boundary has been reached on the base track.
|
|
439
|
+
* Overlay tracks waiting for alignment flush their buffered frames now.
|
|
440
|
+
*/
|
|
441
|
+
notifyFecBlockBoundary() {
|
|
442
|
+
var _a;
|
|
443
|
+
if (__privateGet(this, _overlayBoundaryReached)) return;
|
|
444
|
+
__privateSet(this, _overlayBoundaryReached, true);
|
|
445
|
+
const buffered = __privateGet(this, _overlayBuffer).splice(0);
|
|
446
|
+
for (const { data, meta } of buffered) {
|
|
447
|
+
(_a = __privateGet(this, _onOverlayFrame)) == null ? void 0 : _a.call(this, data, meta);
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
/**
|
|
451
|
+
* Return the number of frames emitted from the per-track source for a given
|
|
452
|
+
* track. Used in test-mode to verify per-track routing histogram.
|
|
453
|
+
* Returns 0 if no per-track source is active for the track.
|
|
454
|
+
*/
|
|
455
|
+
trackSourceEmitCount(trackName) {
|
|
456
|
+
return __privateGet(this, _trackSources).get(trackName)?.emitCount ?? 0;
|
|
457
|
+
}
|
|
458
|
+
/** Feed a frame from the MoQ path. Suppressed when multicast is active OR a per-track source owns this track. */
|
|
459
|
+
feedMoq(data, meta, kind) {
|
|
460
|
+
var _a, _b;
|
|
461
|
+
if (__privateGet(this, _trackSources).has(kind)) {
|
|
462
|
+
const remaining = __privateGet(this, _crossfadeCounters).get(kind);
|
|
463
|
+
if (remaining && remaining > 0) {
|
|
464
|
+
const next = remaining - 1;
|
|
465
|
+
if (next === 0) {
|
|
466
|
+
__privateGet(this, _crossfadeCounters).delete(kind);
|
|
467
|
+
} else {
|
|
468
|
+
__privateGet(this, _crossfadeCounters).set(kind, next);
|
|
469
|
+
}
|
|
470
|
+
} else {
|
|
471
|
+
return;
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
if (__privateGet(this, _suppressed)) return;
|
|
475
|
+
const routedMeta = { ...meta, source: "moq" };
|
|
476
|
+
if (kind === "video") (_a = __privateGet(this, _onVideoFrame)) == null ? void 0 : _a.call(this, data, routedMeta);
|
|
477
|
+
else (_b = __privateGet(this, _onAudioFrame)) == null ? void 0 : _b.call(this, data, routedMeta);
|
|
478
|
+
}
|
|
479
|
+
/** Feed a frame from the multicast path. Video waits for keyframe before activating. */
|
|
480
|
+
feedMulticast(data, meta, kind) {
|
|
481
|
+
var _a, _b;
|
|
482
|
+
if (__privateGet(this, _trackSources).has(kind)) {
|
|
483
|
+
const remaining = __privateGet(this, _crossfadeCounters).get(kind);
|
|
484
|
+
if (remaining && remaining > 0) {
|
|
485
|
+
const next = remaining - 1;
|
|
486
|
+
if (next === 0) {
|
|
487
|
+
__privateGet(this, _crossfadeCounters).delete(kind);
|
|
488
|
+
} else {
|
|
489
|
+
__privateGet(this, _crossfadeCounters).set(kind, next);
|
|
490
|
+
}
|
|
491
|
+
} else {
|
|
492
|
+
return;
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
if (kind === "video") {
|
|
496
|
+
if (!__privateGet(this, _multicastVideoKeyed)) {
|
|
497
|
+
const moqSeededDelta = !meta.keyframe && __privateGet(this, _allowDeltaMulticastTakeoverAfterMoqKeyframe) && __privateGet(this, _moqVideoKeyframeEmitted);
|
|
498
|
+
if (!meta.keyframe && !moqSeededDelta) return;
|
|
499
|
+
__privateSet(this, _multicastVideoKeyed, true);
|
|
500
|
+
const pendingMeta = { ...meta, source: "multicast" };
|
|
501
|
+
if (!moqSeededDelta) pendingMeta.sourceDiscontinuity = true;
|
|
502
|
+
__privateSet(this, _pendingMulticastVideo, {
|
|
503
|
+
data: data.slice(),
|
|
504
|
+
meta: pendingMeta
|
|
505
|
+
});
|
|
506
|
+
if (__privateGet(this, _requireAudio) && __privateGet(this, _audioFallbackMs) > 0 && !__privateGet(this, _multicastAudioReceived) && !__privateGet(this, _audioFallbackTimer)) {
|
|
507
|
+
__privateSet(this, _audioFallbackTimer, setTimeout(() => {
|
|
508
|
+
if (!__privateGet(this, _multicastAudioReceived) && __privateGet(this, _active) !== "multicast") {
|
|
509
|
+
__privateSet(this, _multicastAudioReceived, true);
|
|
510
|
+
__privateSet(this, _moqAudioWarmed, true);
|
|
511
|
+
__privateMethod(this, _MediaRouter_instances, tryActivateMulticast_fn).call(this);
|
|
512
|
+
}
|
|
513
|
+
}, __privateGet(this, _audioFallbackMs)));
|
|
514
|
+
}
|
|
515
|
+
} else if (__privateGet(this, _active) !== "multicast") {
|
|
516
|
+
if (meta.keyframe) {
|
|
517
|
+
__privateSet(this, _pendingMulticastVideo, {
|
|
518
|
+
data: data.slice(),
|
|
519
|
+
meta: { ...meta, source: "multicast", sourceDiscontinuity: true }
|
|
520
|
+
});
|
|
521
|
+
}
|
|
522
|
+
__privateMethod(this, _MediaRouter_instances, tryActivateMulticast_fn).call(this);
|
|
523
|
+
return;
|
|
524
|
+
}
|
|
525
|
+
if (__privateGet(this, _active) === "multicast") (_a = __privateGet(this, _onVideoFrame)) == null ? void 0 : _a.call(this, data, { ...meta, source: "multicast" });
|
|
526
|
+
__privateMethod(this, _MediaRouter_instances, tryActivateMulticast_fn).call(this);
|
|
527
|
+
} else {
|
|
528
|
+
__privateSet(this, _multicastAudioReceived, true);
|
|
529
|
+
if (__privateGet(this, _audioFallbackTimer)) {
|
|
530
|
+
clearTimeout(__privateGet(this, _audioFallbackTimer));
|
|
531
|
+
__privateSet(this, _audioFallbackTimer, null);
|
|
532
|
+
}
|
|
533
|
+
if (!__privateGet(this, _moqAudioWarmed)) __privateSet(this, _moqAudioWarmed, true);
|
|
534
|
+
__privateMethod(this, _MediaRouter_instances, tryActivateMulticast_fn).call(this);
|
|
535
|
+
if (__privateGet(this, _active) === "multicast") {
|
|
536
|
+
(_b = __privateGet(this, _onAudioFrame)) == null ? void 0 : _b.call(this, data, { ...meta, source: "multicast" });
|
|
537
|
+
} else if (__privateGet(this, _pendingMulticastToken) !== null) {
|
|
538
|
+
__privateSet(this, _pendingMulticastAudio, { data: data.slice(), meta: { ...meta, source: "multicast" } });
|
|
539
|
+
}
|
|
540
|
+
}
|
|
541
|
+
}
|
|
542
|
+
/** Called by the player when the MoQ unicast audio decoder emits first frame. */
|
|
543
|
+
notifyMoqAudioEmit() {
|
|
544
|
+
if (__privateGet(this, _moqAudioWarmed)) return;
|
|
545
|
+
__privateSet(this, _moqAudioWarmed, true);
|
|
546
|
+
__privateMethod(this, _MediaRouter_instances, tryActivateMulticast_fn).call(this);
|
|
547
|
+
}
|
|
548
|
+
/**
|
|
549
|
+
* Called by the player after a MoQ video keyframe has reached the active
|
|
550
|
+
* decoder path. Used only by MSE/MMTP continuity switching; decoder-reset
|
|
551
|
+
* paths leave allowDeltaMulticastTakeoverAfterMoqKeyframe disabled.
|
|
552
|
+
*/
|
|
553
|
+
notifyMoqVideoKeyframeEmit() {
|
|
554
|
+
__privateSet(this, _moqVideoKeyframeEmitted, true);
|
|
555
|
+
__privateMethod(this, _MediaRouter_instances, tryActivateMulticast_fn).call(this);
|
|
556
|
+
}
|
|
557
|
+
/** Switch back to MoQ immediately (called on multicast failback). */
|
|
558
|
+
failbackToMoq() {
|
|
559
|
+
var _a;
|
|
560
|
+
const hadPendingMulticast = __privateGet(this, _pendingMulticastToken) !== null;
|
|
561
|
+
if (__privateGet(this, _active) === "moq" && !hadPendingMulticast) return;
|
|
562
|
+
++__privateWrapper(this, _sourceSwitchToken)._;
|
|
563
|
+
__privateSet(this, _active, "moq");
|
|
564
|
+
__privateSet(this, _suppressed, false);
|
|
565
|
+
__privateSet(this, _pendingMulticastToken, null);
|
|
566
|
+
__privateSet(this, _pendingMulticastVideo, null);
|
|
567
|
+
__privateSet(this, _pendingMulticastAudio, null);
|
|
568
|
+
__privateSet(this, _sourceSwitchReady, null);
|
|
569
|
+
__privateSet(this, _multicastVideoKeyed, false);
|
|
570
|
+
__privateSet(this, _multicastAudioReceived, false);
|
|
571
|
+
__privateSet(this, _moqVideoKeyframeEmitted, false);
|
|
572
|
+
if (__privateGet(this, _audioFallbackTimer)) {
|
|
573
|
+
clearTimeout(__privateGet(this, _audioFallbackTimer));
|
|
574
|
+
__privateSet(this, _audioFallbackTimer, null);
|
|
575
|
+
}
|
|
576
|
+
(_a = __privateGet(this, _onSourceSwitch)) == null ? void 0 : _a.call(this, "moq");
|
|
577
|
+
}
|
|
578
|
+
/** Dispose timers and per-track sources. Call on teardown to prevent
|
|
579
|
+
* stale timer callbacks firing into garbage-collected closures (WR-03). */
|
|
580
|
+
dispose() {
|
|
581
|
+
if (__privateGet(this, _audioFallbackTimer)) {
|
|
582
|
+
clearTimeout(__privateGet(this, _audioFallbackTimer));
|
|
583
|
+
__privateSet(this, _audioFallbackTimer, null);
|
|
584
|
+
}
|
|
585
|
+
for (const [name] of __privateGet(this, _trackSources)) {
|
|
586
|
+
this.clearTrackSource(name);
|
|
587
|
+
}
|
|
588
|
+
}
|
|
589
|
+
};
|
|
590
|
+
_active = new WeakMap();
|
|
591
|
+
_multicastVideoKeyed = new WeakMap();
|
|
592
|
+
_multicastAudioReceived = new WeakMap();
|
|
593
|
+
_moqVideoKeyframeEmitted = new WeakMap();
|
|
594
|
+
_requireAudio = new WeakMap();
|
|
595
|
+
_suppressed = new WeakMap();
|
|
596
|
+
_audioFallbackTimer = new WeakMap();
|
|
597
|
+
_audioFallbackMs = new WeakMap();
|
|
598
|
+
_crossfadeFrames = new WeakMap();
|
|
599
|
+
_maxOverlayBuffer = new WeakMap();
|
|
600
|
+
_allowDeltaMulticastTakeoverAfterMoqKeyframe = new WeakMap();
|
|
601
|
+
_repairInFlight = new WeakMap();
|
|
602
|
+
_maxRepairInFlight = new WeakMap();
|
|
603
|
+
_onRepairRequest = new WeakMap();
|
|
604
|
+
_onVideoFrame = new WeakMap();
|
|
605
|
+
_onAudioFrame = new WeakMap();
|
|
606
|
+
_onOverlayFrame = new WeakMap();
|
|
607
|
+
_onSourceSwitch = new WeakMap();
|
|
608
|
+
_sourceSwitchReady = new WeakMap();
|
|
609
|
+
_sourceSwitchToken = new WeakMap();
|
|
610
|
+
_pendingMulticastToken = new WeakMap();
|
|
611
|
+
_pendingMulticastVideo = new WeakMap();
|
|
612
|
+
_pendingMulticastAudio = new WeakMap();
|
|
613
|
+
_trackSources = new WeakMap();
|
|
614
|
+
_trackTypes = new WeakMap();
|
|
615
|
+
_crossfadeCounters = new WeakMap();
|
|
616
|
+
_overlayBoundaryReached = new WeakMap();
|
|
617
|
+
_overlayBuffer = new WeakMap();
|
|
618
|
+
_deltaConfigured = new WeakMap();
|
|
619
|
+
_deltaActive = new WeakMap();
|
|
620
|
+
_deltaWindow = new WeakMap();
|
|
621
|
+
_deltaWindowSize = new WeakMap();
|
|
622
|
+
_deltaFailThresholdRatio = new WeakMap();
|
|
623
|
+
_deltaRecoverThresholdRatio = new WeakMap();
|
|
624
|
+
_deltaProbeIntervalMs = new WeakMap();
|
|
625
|
+
_lastProbeAt = new WeakMap();
|
|
626
|
+
_onDeltaFallbackCb = new WeakMap();
|
|
627
|
+
_onDeltaRecoverCb = new WeakMap();
|
|
628
|
+
_onGroupDrift = new WeakMap();
|
|
629
|
+
_groupAlignWarnCounts = new WeakMap();
|
|
630
|
+
_MediaRouter_instances = new WeakSet();
|
|
631
|
+
/**
|
|
632
|
+
* Warn at most `GROUP_ALIGN_WARN_BUDGET[reason]` times **per reason**, across
|
|
633
|
+
* every skip and post-emit failure on the drift path.
|
|
634
|
+
*
|
|
635
|
+
* Note the two call shapes: the resolvers call this *instead of* computing a
|
|
636
|
+
* groupId, and return its `null` to skip the drift check; the `onGroupDrift`
|
|
637
|
+
* catch calls it after the check already ran and the event was already
|
|
638
|
+
* emitted, so there only the warn is coalesced and the `null` is discarded.
|
|
639
|
+
*
|
|
640
|
+
* Keyed on a short stable `reason` tag, NOT on the formatted message: the
|
|
641
|
+
* messages interpolate track name and operand values, so message-keying
|
|
642
|
+
* would hand a malformed stream a fresh warn slot on every boundary — the
|
|
643
|
+
* log flood this coalescing exists to prevent.
|
|
644
|
+
*
|
|
645
|
+
* Per-reason rather than one shared boolean (PCL-2211, #329 review): the
|
|
646
|
+
* budget is never reset — not by `dispose()`, not on source switch — so a
|
|
647
|
+
* single flag means the FIRST malformed boundary of a long-running stream
|
|
648
|
+
* permanently silences every later, genuinely different failure mode. The
|
|
649
|
+
* throw/overflow diagnostics carry the operand values (`ticks=`, `durTicks=`,
|
|
650
|
+
* `err.message`) an incident responder actually needs, and under one shared
|
|
651
|
+
* flag those are precisely the ones most likely to be already spent by an
|
|
652
|
+
* unrelated NaN at catalog load.
|
|
653
|
+
*
|
|
654
|
+
* A closed, bounded set of reasons times a small per-reason budget is still
|
|
655
|
+
* bounded, so this cannot flood. See `GROUP_ALIGN_WARN_BUDGET` for why the
|
|
656
|
+
* budget is not uniform.
|
|
657
|
+
*/
|
|
658
|
+
skipWithWarning_fn = function(reason, message) {
|
|
659
|
+
const seen = __privateGet(this, _groupAlignWarnCounts).get(reason) ?? 0;
|
|
660
|
+
if (seen < GROUP_ALIGN_WARN_BUDGET[reason]) {
|
|
661
|
+
__privateGet(this, _groupAlignWarnCounts).set(reason, seen + 1);
|
|
662
|
+
console.warn(message);
|
|
663
|
+
}
|
|
664
|
+
return null;
|
|
665
|
+
};
|
|
666
|
+
/**
|
|
667
|
+
* Exact path: integers straight from the catalog, no rounding. `mediaTimeSec`
|
|
668
|
+
* / `groupDurationSec` are derived for reporting only and never feed the
|
|
669
|
+
* groupId computation.
|
|
670
|
+
*/
|
|
671
|
+
resolveTicks_fn = function(trackName, timing) {
|
|
672
|
+
const { mediaTimeTicks, groupDurationTicks, timescale } = timing;
|
|
673
|
+
if (!Number.isInteger(mediaTimeTicks) || !Number.isInteger(groupDurationTicks) || groupDurationTicks <= 0 || !Number.isInteger(timescale) || timescale <= 0) {
|
|
674
|
+
return __privateMethod(this, _MediaRouter_instances, skipWithWarning_fn).call(this, "invalid-tick-inputs", `[MediaRouter] notifyGroupBoundary invalid tick inputs (track=${trackName} mediaTimeTicks=${mediaTimeTicks} groupDurationTicks=${groupDurationTicks} timescale=${timescale}); skipping drift check. Pre-validate at catalog load time.`);
|
|
675
|
+
}
|
|
676
|
+
try {
|
|
677
|
+
return {
|
|
678
|
+
expected: groupIdForTicks(mediaTimeTicks, groupDurationTicks),
|
|
679
|
+
mediaTimeSec: mediaTimeTicks / timescale,
|
|
680
|
+
groupDurationSec: groupDurationTicks / timescale,
|
|
681
|
+
// Snapshot, not the caller's reference: a producer that reuses one
|
|
682
|
+
// scratch object per boundary would otherwise retroactively mutate
|
|
683
|
+
// every GroupDriftEvent it has already emitted. Three integers.
|
|
684
|
+
timing: { mediaTimeTicks, groupDurationTicks, timescale }
|
|
685
|
+
};
|
|
686
|
+
} catch (err) {
|
|
687
|
+
return __privateMethod(this, _MediaRouter_instances, skipWithWarning_fn).call(this, "ticks-formula-threw", `[MediaRouter] notifyGroupBoundary: groupIdForTicks threw (track=${trackName} mediaTimeTicks=${mediaTimeTicks} groupDurationTicks=${groupDurationTicks}); skipping drift check: ${err?.message ?? err}`);
|
|
688
|
+
}
|
|
689
|
+
};
|
|
690
|
+
/**
|
|
691
|
+
* Legacy seconds path. Quantizes to a synthetic 1e9 Hz timescale — the exact
|
|
692
|
+
* behaviour the deprecated `align.groupIdFor` wrapper had, reproduced here so
|
|
693
|
+
* that wrapper has no non-test callers left and can be deleted (BLO-21176).
|
|
694
|
+
*
|
|
695
|
+
* Inherits that wrapper's ns-rounding error; see the `@deprecated` overload.
|
|
696
|
+
* Delete this branch once every caller passes ticks.
|
|
697
|
+
*/
|
|
698
|
+
resolveSeconds_fn = function(trackName, mediaTimeSec, groupDurationSec) {
|
|
699
|
+
if (!Number.isFinite(groupDurationSec) || groupDurationSec <= 0 || !Number.isFinite(mediaTimeSec)) {
|
|
700
|
+
return __privateMethod(this, _MediaRouter_instances, skipWithWarning_fn).call(this, "invalid-seconds-inputs", `[MediaRouter] notifyGroupBoundary invalid inputs (track=${trackName} mediaTimeSec=${mediaTimeSec} groupDurationSec=${groupDurationSec}); skipping drift check. Pre-validate at catalog load time.`);
|
|
701
|
+
}
|
|
702
|
+
const TS = 1e9;
|
|
703
|
+
const ticks = mediaTimeSec < 0 ? 0 : Math.round(mediaTimeSec * TS);
|
|
704
|
+
const durTicks = Math.round(groupDurationSec * TS);
|
|
705
|
+
if (durTicks <= 0) {
|
|
706
|
+
return __privateMethod(this, _MediaRouter_instances, skipWithWarning_fn).call(this, "sub-nanosecond-duration", `[MediaRouter] notifyGroupBoundary: groupDurationSec=${groupDurationSec} rounds to <1 tick at 1e9 Hz (track=${trackName}); skipping drift check. Pass GroupBoundaryTicks for sub-nanosecond durations.`);
|
|
707
|
+
}
|
|
708
|
+
if (!Number.isSafeInteger(ticks)) {
|
|
709
|
+
return __privateMethod(this, _MediaRouter_instances, skipWithWarning_fn).call(this, "media-time-overflow", `[MediaRouter] notifyGroupBoundary: mediaTimeSec=${mediaTimeSec} overflows safe-integer ticks at 1e9 Hz (>~104 days, track=${trackName}); skipping drift check. Pass GroupBoundaryTicks with the catalog timescale.`);
|
|
710
|
+
}
|
|
711
|
+
try {
|
|
712
|
+
return {
|
|
713
|
+
expected: groupIdForTicks(ticks, durTicks),
|
|
714
|
+
mediaTimeSec,
|
|
715
|
+
groupDurationSec
|
|
716
|
+
};
|
|
717
|
+
} catch (err) {
|
|
718
|
+
return __privateMethod(this, _MediaRouter_instances, skipWithWarning_fn).call(this, "seconds-formula-threw", `[MediaRouter] notifyGroupBoundary: groupIdForTicks threw (track=${trackName} mediaTimeSec=${mediaTimeSec} groupDurationSec=${groupDurationSec} ticks=${ticks} durTicks=${durTicks}); skipping drift check: ${err?.message ?? err}`);
|
|
719
|
+
}
|
|
720
|
+
};
|
|
721
|
+
_moqAudioWarmed = new WeakMap();
|
|
722
|
+
tryActivateMulticast_fn = function() {
|
|
723
|
+
var _a;
|
|
724
|
+
if (__privateGet(this, _active) === "multicast") return;
|
|
725
|
+
if (__privateGet(this, _pendingMulticastToken) !== null) return;
|
|
726
|
+
if (!__privateGet(this, _multicastVideoKeyed)) return;
|
|
727
|
+
if (__privateGet(this, _requireAudio) && !__privateGet(this, _multicastAudioReceived)) return;
|
|
728
|
+
if (__privateGet(this, _requireAudio) && !__privateGet(this, _moqAudioWarmed)) return;
|
|
729
|
+
const token = ++__privateWrapper(this, _sourceSwitchToken)._;
|
|
730
|
+
const maybeReady = (_a = __privateGet(this, _onSourceSwitch)) == null ? void 0 : _a.call(this, "multicast");
|
|
731
|
+
if (!maybeReady || typeof maybeReady.then !== "function") {
|
|
732
|
+
__privateMethod(this, _MediaRouter_instances, commitMulticastActivation_fn).call(this, token);
|
|
733
|
+
return;
|
|
734
|
+
}
|
|
735
|
+
const ready = Promise.resolve(maybeReady);
|
|
736
|
+
__privateSet(this, _pendingMulticastToken, token);
|
|
737
|
+
__privateSet(this, _sourceSwitchReady, ready);
|
|
738
|
+
void ready.then(
|
|
739
|
+
() => __privateMethod(this, _MediaRouter_instances, commitMulticastActivation_fn).call(this, token),
|
|
740
|
+
(err) => __privateMethod(this, _MediaRouter_instances, rejectMulticastActivation_fn).call(this, token, err)
|
|
741
|
+
).finally(() => {
|
|
742
|
+
if (__privateGet(this, _sourceSwitchReady) === ready) __privateSet(this, _sourceSwitchReady, null);
|
|
743
|
+
});
|
|
744
|
+
};
|
|
745
|
+
commitMulticastActivation_fn = function(token) {
|
|
746
|
+
var _a, _b;
|
|
747
|
+
if (token !== __privateGet(this, _sourceSwitchToken)) return;
|
|
748
|
+
__privateSet(this, _active, "multicast");
|
|
749
|
+
__privateSet(this, _suppressed, true);
|
|
750
|
+
__privateSet(this, _pendingMulticastToken, null);
|
|
751
|
+
const video = __privateGet(this, _pendingMulticastVideo);
|
|
752
|
+
__privateSet(this, _pendingMulticastVideo, null);
|
|
753
|
+
const audio = __privateGet(this, _pendingMulticastAudio);
|
|
754
|
+
__privateSet(this, _pendingMulticastAudio, null);
|
|
755
|
+
if (video) (_a = __privateGet(this, _onVideoFrame)) == null ? void 0 : _a.call(this, video.data, video.meta);
|
|
756
|
+
if (audio) (_b = __privateGet(this, _onAudioFrame)) == null ? void 0 : _b.call(this, audio.data, audio.meta);
|
|
757
|
+
};
|
|
758
|
+
rejectMulticastActivation_fn = function(token, err) {
|
|
759
|
+
if (token !== __privateGet(this, _sourceSwitchToken)) return;
|
|
760
|
+
if (__privateGet(this, _pendingMulticastToken) === token) __privateSet(this, _pendingMulticastToken, null);
|
|
761
|
+
__privateSet(this, _pendingMulticastVideo, null);
|
|
762
|
+
__privateSet(this, _pendingMulticastAudio, null);
|
|
763
|
+
console.warn("[MediaRouter] onSourceSwitch(multicast) failed", err);
|
|
764
|
+
};
|
|
765
|
+
// ── Private helpers ──────────────────────────────────────────────────────
|
|
766
|
+
/** Emit a frame on the correct per-track callback using the type registry.
|
|
767
|
+
* Falls back to name match if no type registered (backward compat). */
|
|
768
|
+
emitForTrack_fn = function(trackName, data, meta) {
|
|
769
|
+
var _a, _b, _c, _d, _e, _f;
|
|
770
|
+
const reg = __privateGet(this, _trackTypes).get(trackName);
|
|
771
|
+
if (reg?.type === "video") {
|
|
772
|
+
(_a = __privateGet(this, _onVideoFrame)) == null ? void 0 : _a.call(this, data, meta);
|
|
773
|
+
} else if (reg?.type === "audio") {
|
|
774
|
+
(_b = __privateGet(this, _onAudioFrame)) == null ? void 0 : _b.call(this, data, meta);
|
|
775
|
+
} else if (reg !== void 0) {
|
|
776
|
+
(_c = __privateGet(this, _onOverlayFrame)) == null ? void 0 : _c.call(this, data, meta);
|
|
777
|
+
} else {
|
|
778
|
+
if (trackName === "video") (_d = __privateGet(this, _onVideoFrame)) == null ? void 0 : _d.call(this, data, meta);
|
|
779
|
+
else if (trackName === "audio") (_e = __privateGet(this, _onAudioFrame)) == null ? void 0 : _e.call(this, data, meta);
|
|
780
|
+
else (_f = __privateGet(this, _onOverlayFrame)) == null ? void 0 : _f.call(this, data, meta);
|
|
781
|
+
}
|
|
782
|
+
};
|
|
783
|
+
/** Handle an overlay frame: buffer until first FEC block boundary, then pass through. */
|
|
784
|
+
handleOverlayFrame_fn = function(data, meta) {
|
|
785
|
+
var _a;
|
|
786
|
+
if (__privateGet(this, _overlayBoundaryReached)) {
|
|
787
|
+
(_a = __privateGet(this, _onOverlayFrame)) == null ? void 0 : _a.call(this, data, meta);
|
|
788
|
+
return;
|
|
789
|
+
}
|
|
790
|
+
if (__privateGet(this, _overlayBuffer).length >= __privateGet(this, _maxOverlayBuffer)) {
|
|
791
|
+
console.warn(
|
|
792
|
+
`[MediaRouter] overlay buffer full (${__privateGet(this, _maxOverlayBuffer)} frames); dropping frame ts=${meta.timestamp}`
|
|
793
|
+
);
|
|
794
|
+
return;
|
|
795
|
+
}
|
|
796
|
+
__privateGet(this, _overlayBuffer).push({ data, meta });
|
|
797
|
+
};
|
|
798
|
+
export {
|
|
799
|
+
MediaRouter,
|
|
800
|
+
TrackSourceConflictError
|
|
801
|
+
};
|
|
802
|
+
//# sourceMappingURL=media-router.js.map
|