@blockcast/mmt-container 0.1.0 → 0.3.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/README.md +524 -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 +152 -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 +80 -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/block-policy.d.ts +314 -0
- package/dist/block-policy.d.ts.map +1 -0
- package/dist/block-policy.js +466 -0
- package/dist/block-policy.js.map +7 -0
- package/dist/browser-runtime.js +26549 -0
- package/dist/browser-runtime.js.map +7 -0
- package/dist/carp-catalog.d.ts +429 -0
- package/dist/carp-catalog.d.ts.map +1 -0
- package/dist/carp-catalog.js +985 -0
- package/dist/carp-catalog.js.map +7 -0
- package/dist/catalog-fec-params.d.ts +275 -0
- package/dist/catalog-fec-params.d.ts.map +1 -0
- package/dist/catalog-fec-params.js +702 -0
- package/dist/catalog-fec-params.js.map +7 -0
- package/dist/catalog-network-source.d.ts +42 -0
- package/dist/catalog-network-source.d.ts.map +1 -0
- package/dist/catalog-network-source.js +47 -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 +285 -0
- package/dist/cmaf-block-assembler.d.ts.map +1 -0
- package/dist/cmaf-block-assembler.js +1966 -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 +176 -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 +183 -0
- package/dist/cmcd-producer.js.map +7 -0
- package/dist/codec-utils.d.ts +384 -0
- package/dist/codec-utils.d.ts.map +1 -0
- package/dist/codec-utils.js +1546 -0
- package/dist/codec-utils.js.map +7 -0
- package/dist/conceal-timeline.d.ts +146 -0
- package/dist/conceal-timeline.d.ts.map +1 -0
- package/dist/conceal-timeline.js +137 -0
- package/dist/conceal-timeline.js.map +7 -0
- package/dist/delivery-gap.d.ts +75 -0
- package/dist/delivery-gap.d.ts.map +1 -0
- package/dist/delivery-gap.js +88 -0
- package/dist/delivery-gap.js.map +7 -0
- package/dist/duplicate-ledger.d.ts +197 -0
- package/dist/duplicate-ledger.d.ts.map +1 -0
- package/dist/duplicate-ledger.js +226 -0
- package/dist/duplicate-ledger.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 +583 -0
- package/dist/fec-manager.d.ts.map +1 -0
- package/dist/fec-manager.js +3899 -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 +60 -0
- package/dist/fec-starvation-detector.js.map +7 -0
- package/dist/fec-state.d.ts +131 -0
- package/dist/fec-state.d.ts.map +1 -0
- package/dist/fec-state.js +87 -0
- package/dist/fec-state.js.map +7 -0
- package/dist/fec-worker-setup.d.ts +94 -0
- package/dist/fec-worker-setup.d.ts.map +1 -0
- package/dist/fec-worker-setup.js +673 -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 +44 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +460 -14
- package/dist/index.js.map +7 -1
- package/dist/iso-block-locator.d.ts +118 -0
- package/dist/iso-block-locator.d.ts.map +1 -0
- package/dist/iso-block-locator.js +289 -0
- package/dist/iso-block-locator.js.map +7 -0
- package/dist/iso-bmff-timing.d.ts +78 -0
- package/dist/iso-bmff-timing.d.ts.map +1 -0
- package/dist/iso-bmff-timing.js +593 -0
- package/dist/iso-bmff-timing.js.map +7 -0
- package/dist/loc.d.ts +70 -75
- package/dist/loc.d.ts.map +1 -1
- package/dist/loc.js +106 -192
- package/dist/loc.js.map +7 -1
- 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 +1266 -0
- package/dist/manifest-auth-plan.js.map +7 -0
- package/dist/media-router.d.ts +262 -0
- package/dist/media-router.d.ts.map +1 -0
- package/dist/media-router.js +584 -0
- package/dist/media-router.js.map +7 -0
- package/dist/mfu-reassembler.d.ts +313 -9
- package/dist/mfu-reassembler.d.ts.map +1 -1
- package/dist/mfu-reassembler.js +3051 -285
- package/dist/mfu-reassembler.js.map +7 -1
- 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 +568 -0
- package/dist/mmtp-container-parser.d.ts.map +1 -0
- package/dist/mmtp-container-parser.js +6580 -0
- package/dist/mmtp-container-parser.js.map +7 -0
- package/dist/mmtp-container-parser.no-modules.js +9616 -0
- package/dist/mmtp-container-parser.no-modules.js.map +7 -0
- package/dist/mmtp-decode-pipeline.d.ts +138 -0
- package/dist/mmtp-decode-pipeline.d.ts.map +1 -0
- package/dist/mmtp-decode-pipeline.js +6814 -0
- package/dist/mmtp-decode-pipeline.js.map +7 -0
- package/dist/mmtp-router.d.ts +679 -0
- package/dist/mmtp-router.d.ts.map +1 -0
- package/dist/mmtp-router.js +11278 -0
- package/dist/mmtp-router.js.map +7 -0
- package/dist/mmtp-to-cmaf.d.ts +187 -0
- package/dist/mmtp-to-cmaf.d.ts.map +1 -0
- package/dist/mmtp-to-cmaf.js +716 -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 +141 -0
- package/dist/multicast-input.d.ts.map +1 -0
- package/dist/multicast-input.js +390 -0
- package/dist/multicast-input.js.map +7 -0
- package/dist/multicast-manager.d.ts +669 -0
- package/dist/multicast-manager.d.ts.map +1 -0
- package/dist/multicast-manager.js +19101 -0
- package/dist/multicast-manager.js.map +7 -0
- package/dist/multicast-transport.d.ts +271 -0
- package/dist/multicast-transport.d.ts.map +1 -0
- package/dist/multicast-transport.js +2264 -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 +418 -0
- package/dist/multicast-unwrap.js.map +7 -0
- package/dist/no-modules.d.ts +10 -0
- package/dist/no-modules.d.ts.map +1 -0
- package/dist/no-modules.js +9491 -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 +270 -0
- package/dist/repair-fetch.d.ts.map +1 -0
- package/dist/repair-fetch.js +381 -0
- package/dist/repair-fetch.js.map +7 -0
- package/dist/repair-layers.d.ts +158 -0
- package/dist/repair-layers.d.ts.map +1 -0
- package/dist/repair-layers.js +344 -0
- package/dist/repair-layers.js.map +7 -0
- package/dist/sample-combiner.d.ts +212 -0
- package/dist/sample-combiner.d.ts.map +1 -0
- package/dist/sample-combiner.js +595 -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 +572 -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 +1209 -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 +70 -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 +473 -0
- package/dist/timestamp-codec.js.map +7 -0
- package/dist/track-pipeline-setup.d.ts +83 -0
- package/dist/track-pipeline-setup.d.ts.map +1 -0
- package/dist/track-pipeline-setup.js +291 -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 +209 -0
- package/dist/track-pipeline.js.map +7 -0
- package/dist/track-session.d.ts +414 -0
- package/dist/track-session.d.ts.map +1 -0
- package/dist/track-session.js +754 -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 +74 -0
- package/dist/transport-pool.js.map +7 -0
- package/dist/wasm-mfu-reassembler.d.ts +97 -0
- package/dist/wasm-mfu-reassembler.d.ts.map +1 -0
- package/dist/wasm-mfu-reassembler.js +2133 -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 +6834 -0
- package/dist/wasm-mmtp-container-parser.js.map +7 -0
- package/node_modules/@blockcast/fec-worker/README.md +223 -0
- package/node_modules/@blockcast/fec-worker/dist/.build-stamp +0 -0
- package/node_modules/@blockcast/fec-worker/dist/block-order.d.ts +38 -0
- package/node_modules/@blockcast/fec-worker/dist/block-order.d.ts.map +1 -0
- package/node_modules/@blockcast/fec-worker/dist/block-order.js +78 -0
- package/node_modules/@blockcast/fec-worker/dist/block-order.js.map +1 -0
- package/node_modules/@blockcast/fec-worker/dist/fec-worker-client.d.ts +93 -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 +346 -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 +380 -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 +859 -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 +370 -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 +194 -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 +62 -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/block-order.ts +93 -0
- package/node_modules/@blockcast/fec-worker/src/fec-worker-client.ts +392 -0
- package/node_modules/@blockcast/fec-worker/src/fec-worker-types.ts +399 -0
- package/node_modules/@blockcast/fec-worker/src/fec-worker.ts +1502 -0
- package/node_modules/@blockcast/fec-worker/src/index.ts +35 -0
- package/node_modules/@blockcast/fec-worker/src/shred-fec-worker.ts +589 -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 +209 -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 +134 -0
- package/node_modules/@blockcast/mmt-base/dist/.build-stamp +0 -0
- package/node_modules/@blockcast/mmt-base/dist/fec-block-profile.d.ts +55 -0
- package/node_modules/@blockcast/mmt-base/dist/fec-block-profile.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-base/dist/fec-block-profile.js +128 -0
- package/node_modules/@blockcast/mmt-base/dist/fec-block-profile.js.map +1 -0
- package/node_modules/@blockcast/mmt-base/dist/index.d.ts +7 -0
- package/node_modules/@blockcast/mmt-base/dist/index.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-base/dist/index.js +7 -0
- package/node_modules/@blockcast/mmt-base/dist/index.js.map +1 -0
- package/node_modules/@blockcast/mmt-base/dist/mmtp.d.ts +292 -0
- package/node_modules/@blockcast/mmt-base/dist/mmtp.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-base/dist/mmtp.js +612 -0
- package/node_modules/@blockcast/mmt-base/dist/mmtp.js.map +1 -0
- package/node_modules/@blockcast/mmt-base/dist/net-constants.d.ts +18 -0
- package/node_modules/@blockcast/mmt-base/dist/net-constants.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-base/dist/net-constants.js +18 -0
- package/node_modules/@blockcast/mmt-base/dist/net-constants.js.map +1 -0
- package/node_modules/@blockcast/mmt-base/dist/ntp-short.d.ts +47 -0
- package/node_modules/@blockcast/mmt-base/dist/ntp-short.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-base/dist/ntp-short.js +54 -0
- package/node_modules/@blockcast/mmt-base/dist/ntp-short.js.map +1 -0
- package/node_modules/@blockcast/mmt-base/dist/serial-number.d.ts +57 -0
- package/node_modules/@blockcast/mmt-base/dist/serial-number.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-base/dist/serial-number.js +98 -0
- package/node_modules/@blockcast/mmt-base/dist/serial-number.js.map +1 -0
- package/node_modules/@blockcast/mmt-base/dist/signalling.d.ts +312 -0
- package/node_modules/@blockcast/mmt-base/dist/signalling.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-base/dist/signalling.js +637 -0
- package/node_modules/@blockcast/mmt-base/dist/signalling.js.map +1 -0
- package/node_modules/@blockcast/mmt-base/package.json +49 -0
- package/node_modules/@blockcast/mmt-base/src/fec-block-profile.ts +145 -0
- package/node_modules/@blockcast/mmt-base/src/index.ts +6 -0
- package/node_modules/@blockcast/mmt-base/src/mmtp.ts +892 -0
- package/node_modules/@blockcast/mmt-base/src/net-constants.ts +17 -0
- package/node_modules/@blockcast/mmt-base/src/ntp-short.ts +67 -0
- package/node_modules/@blockcast/mmt-base/src/serial-number.ts +107 -0
- package/node_modules/@blockcast/mmt-base/src/signalling.ts +862 -0
- package/node_modules/@blockcast/mmt-fec/README.md +271 -0
- package/node_modules/@blockcast/mmt-fec/dist/.build-stamp +0 -0
- package/node_modules/@blockcast/mmt-fec/dist/block-manager.d.ts +82 -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 +296 -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 +106 -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 +288 -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 +205 -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 +240 -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 +28 -0
- package/node_modules/@blockcast/mmt-fec/dist/index.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-fec/dist/index.js +28 -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 +258 -0
- package/node_modules/@blockcast/mmt-fec/dist/oti.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-fec/dist/oti.js +382 -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/dist/repair-group.d.ts +82 -0
- package/node_modules/@blockcast/mmt-fec/dist/repair-group.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-fec/dist/repair-group.js +170 -0
- package/node_modules/@blockcast/mmt-fec/dist/repair-group.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 +134 -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/fec-block-profile.d.ts +55 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/fec-block-profile.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/fec-block-profile.js +128 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/fec-block-profile.js.map +1 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/index.d.ts +7 -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 +7 -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 +292 -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 +612 -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/dist/net-constants.d.ts +18 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/net-constants.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/net-constants.js +18 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/net-constants.js.map +1 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/ntp-short.d.ts +47 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/ntp-short.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/ntp-short.js +54 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/ntp-short.js.map +1 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/serial-number.d.ts +57 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/serial-number.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/serial-number.js +98 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/serial-number.js.map +1 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/signalling.d.ts +312 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/signalling.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/signalling.js +637 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/signalling.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/fec-block-profile.ts +145 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/src/index.ts +6 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/src/mmtp.ts +892 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/src/net-constants.ts +17 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/src/ntp-short.ts +67 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/src/serial-number.ts +107 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/src/signalling.ts +862 -0
- package/node_modules/@blockcast/mmt-fec/package.json +79 -0
- package/node_modules/@blockcast/mmt-fec/src/block-manager.ts +371 -0
- package/node_modules/@blockcast/mmt-fec/src/block-processor.ts +439 -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 +310 -0
- package/node_modules/@blockcast/mmt-fec/src/index.ts +94 -0
- package/node_modules/@blockcast/mmt-fec/src/loc-symbols.ts +34 -0
- package/node_modules/@blockcast/mmt-fec/src/oti.ts +463 -0
- package/node_modules/@blockcast/mmt-fec/src/reorder-buffer.ts +101 -0
- package/node_modules/@blockcast/mmt-fec/src/repair-group.ts +195 -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 +99 -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 +492 -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 +669 -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 +179 -8
- package/schemas/catalog.schema.json +357 -0
- package/src/align.ts +239 -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/block-policy.ts +903 -0
- package/src/carp-catalog.ts +1065 -0
- package/src/catalog-fec-params.ts +729 -0
- package/src/catalog-network-source.ts +74 -0
- package/src/catalog-validator.ts +34 -0
- package/src/cmaf-block-assembler.ts +1255 -0
- package/src/cmaf-group-batcher.ts +104 -0
- package/src/cmcd-producer.ts +329 -0
- package/src/codec-utils.ts +1984 -0
- package/src/conceal-timeline.ts +293 -0
- package/src/delivery-gap.ts +147 -0
- package/src/duplicate-ledger.ts +372 -0
- package/src/fec-codec.ts +61 -0
- package/src/fec-manager.ts +4298 -0
- package/src/fec-starvation-detector.ts +128 -0
- package/src/fec-state.ts +219 -0
- package/src/fec-worker-setup.ts +283 -0
- package/src/fmp4-completion.ts +47 -0
- package/src/fmp4-reader.ts +112 -0
- package/src/index.ts +590 -21
- package/src/iso-block-locator.ts +329 -0
- package/src/iso-bmff-timing.ts +813 -0
- package/src/loc.ts +128 -154
- package/src/manifest-auth-plan.ts +107 -0
- package/src/media-router.ts +841 -0
- package/src/mfu-reassembler.ts +3480 -155
- package/src/mfu-reassembly-policy.ts +134 -0
- package/src/mmtp-container-parser.ts +2380 -0
- package/src/mmtp-decode-pipeline.ts +406 -0
- package/src/mmtp-router.ts +4860 -0
- package/src/mmtp-to-cmaf.ts +977 -0
- package/src/multicast-auth-catalog.ts +340 -0
- package/src/multicast-input.ts +793 -0
- package/src/multicast-manager.ts +2783 -0
- package/src/multicast-transport.ts +1058 -0
- package/src/multicast-unwrap.ts +132 -0
- package/src/no-modules.ts +21 -0
- package/src/phase14-catalog-override.ts +336 -0
- package/src/repair-fetch.ts +772 -0
- package/src/repair-layers.ts +533 -0
- package/src/sample-combiner.ts +938 -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 +205 -0
- package/src/track-pipeline.ts +332 -0
- package/src/track-session.ts +1010 -0
- package/src/transport-pool.ts +128 -0
- package/src/wasm-mfu-reassembler.ts +405 -0
- package/src/wasm-mmtp-container-parser.ts +23 -0
- package/test-vectors/align.json +199 -0
- package/test-vectors/catalog/README.md +106 -0
- package/test-vectors/catalog/negative/archive-origin-with-path.json +33 -0
- package/test-vectors/catalog/negative/archive-unknown-field.json +34 -0
- package/test-vectors/catalog/negative/fec-block-profile-missing.json +51 -0
- package/test-vectors/catalog/negative/fec-block-profile-unknown.json +52 -0
- package/test-vectors/catalog/negative/fec-enhancement-repair-removed.json +28 -0
- package/test-vectors/catalog/negative/fec-repair-layer-geometry.json +33 -0
- package/test-vectors/catalog/negative/fec-repair-layer-missing-symbols.json +31 -0
- package/test-vectors/catalog/negative/fec-repair-multiple-depends.json +32 -0
- package/test-vectors/catalog/negative/fec-repair-overlay-with-layer.json +34 -0
- package/test-vectors/catalog/negative/fec-repair-priority-out-of-band.json +24 -0
- package/test-vectors/catalog/negative/fec-repair-source-symbols-without-scope.json +33 -0
- package/test-vectors/catalog/negative/legacy-selection-params.json +15 -0
- package/test-vectors/catalog/negative/media-track-repair-layer.json +16 -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/multicast-network-source-empty.json +44 -0
- package/test-vectors/catalog/negative/multicast-packet-id-signaling.json +26 -0
- package/test-vectors/catalog/negative/network-source-object.json +25 -0
- package/test-vectors/catalog/negative/raptorq-source-symbols-over-max.json +24 -0
- package/test-vectors/catalog/negative/raptorq-unaligned-symbol.json +27 -0
- package/test-vectors/catalog/negative/repair-track-legacy-shape.json +19 -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/archive-origin.json +34 -0
- package/test-vectors/catalog/positive/fec-iso-ssbg1.json +52 -0
- package/test-vectors/catalog/positive/fec-layered-repair.json +106 -0
- package/test-vectors/catalog/positive/fec-multicast.json +52 -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/multicast-native-ssm-no-network-source.json +43 -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 +732 -0
- package/test-vectors/catalog-validator-public-api.mjs +25 -0
- package/test-vectors/generate-source-auth-fixture.mjs +114 -0
- package/test-vectors/hevc-x265-repeat-headers-v1.json +40 -0
- package/test-vectors/source-auth-v1.json +61 -0
- package/test-vectors/source-contiguity-v1.json +131 -0
- package/test-vectors/subsample-placement-v1.json +230 -0
- package/dist/mmtp.d.ts +0 -73
- package/dist/mmtp.d.ts.map +0 -1
- package/dist/mmtp.js +0 -210
- package/dist/mmtp.js.map +0 -1
- package/src/mmtp.ts +0 -277
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Receiver-measured multicast delivery gap (BLO-35597).
|
|
3
|
+
*
|
|
4
|
+
* The FEC layer gives a block's multicast symbols a late-symbol wait before it
|
|
5
|
+
* declares the block over: the catalog block span plus an allowance for the
|
|
6
|
+
* path's arrival jitter. The catalog can only signal a tolerance it knows in
|
|
7
|
+
* advance (`fec.reorderToleranceMs`); the path the receiver actually sits on
|
|
8
|
+
* is measured here, in-band, from the arrival times of the multicast
|
|
9
|
+
* datagrams themselves.
|
|
10
|
+
*
|
|
11
|
+
* Which statistic, and why not RFC 3550 interarrival jitter
|
|
12
|
+
* ---------------------------------------------------------
|
|
13
|
+
* The wait is an inactivity bound: a block fails when no symbol reaches it for
|
|
14
|
+
* the wait. What it has to outlast is therefore the longest silence the
|
|
15
|
+
* delivery path produces, not the path's average variation.
|
|
16
|
+
*
|
|
17
|
+
* RFC 3550 §6.4.1 `J` is a mean absolute transit-time difference smoothed with
|
|
18
|
+
* gain 1/16. It is the right number for sizing a playout buffer against steady
|
|
19
|
+
* jitter, and the wrong one for a bimodal path. On the path this was measured
|
|
20
|
+
* on (iPhone Safari over Wi-Fi, prod AMT, 2026-09-28, 36,657 datagrams in 57 s)
|
|
21
|
+
* arrivals were either back-to-back (p90 inter-arrival 2 ms) or stalled for
|
|
22
|
+
* one 802.11 power-save beacon interval (102.4 ms; 135 stalls of 50-110 ms,
|
|
23
|
+
* recurring every ~511 ms at the median). Applied to that trace, `J` has a p99
|
|
24
|
+
* of 6 ms: a wait of span + J expires inside every stall, and the stall's
|
|
25
|
+
* symbols then arrive at a block that has already been failed.
|
|
26
|
+
*
|
|
27
|
+
* So the estimator is the largest delivery gap observed over a trailing
|
|
28
|
+
* window: the time between consecutive multicast datagram arrivals, measured
|
|
29
|
+
* on the page thread where the FEC deadlines themselves run (a main-thread or
|
|
30
|
+
* bridge-batching delay is as real to those timers as a radio stall). It is
|
|
31
|
+
* receiver-wide rather than per stream because the stall is a property of the
|
|
32
|
+
* link every stream shares; a quiet stream learns the gap from a busy one.
|
|
33
|
+
*
|
|
34
|
+
* Only a gap that ended in delivery counts. A silence is closed by the first
|
|
35
|
+
* packet after it; if that packet is the in-sequence successor (MMTP
|
|
36
|
+
* packet_sequence_number + 1) of the last one its packet_id delivered, nothing
|
|
37
|
+
* of that flow was lost across the silence: its packets were held and then
|
|
38
|
+
* delivered, which is exactly the lateness a longer wait turns from a failed
|
|
39
|
+
* block into a completed one. If the sequence jumped, the silence was (at
|
|
40
|
+
* least partly) loss -- a tunnel outage, a publisher pause -- and waiting
|
|
41
|
+
* longer would not have delivered anything, so the gap is not taken as
|
|
42
|
+
* jitter.
|
|
43
|
+
*
|
|
44
|
+
* The trailing window is supplied by the caller from the catalog. It must be
|
|
45
|
+
* long enough to contain one recurrence of the stall it has to remember, and
|
|
46
|
+
* nothing here can know that recurrence in advance. The window is also the
|
|
47
|
+
* largest gap reported: a silence longer than the catalog horizon is outside
|
|
48
|
+
* what the estimator models (a backgrounded tab, a long GC), and every bound
|
|
49
|
+
* derived from the wait (block lifetime, terminal retention, the release
|
|
50
|
+
* gate's hold ceiling) must stay a catalog quantity rather than a measurement.
|
|
51
|
+
* `undefined` means no catalog horizon is known: nothing bounds the gap, so
|
|
52
|
+
* none is reported and the catalog tolerance alone applies.
|
|
53
|
+
*/
|
|
54
|
+
export declare class DeliveryGapEstimator {
|
|
55
|
+
#private;
|
|
56
|
+
/**
|
|
57
|
+
* @param windowMs trailing window in ms, which also caps the reported gap,
|
|
58
|
+
* or undefined when the catalog gives none (no gap is reported).
|
|
59
|
+
*/
|
|
60
|
+
setWindowMs(windowMs: number | undefined): void;
|
|
61
|
+
get windowMs(): number | undefined;
|
|
62
|
+
/**
|
|
63
|
+
* Record one multicast datagram arrival at receiver time `nowMs`, carrying
|
|
64
|
+
* MMTP `packetSequenceNumber` (32-bit, per packet_id) on `packetId`.
|
|
65
|
+
*/
|
|
66
|
+
noteArrival(nowMs: number, packetId: number, packetSequenceNumber: number): void;
|
|
67
|
+
/**
|
|
68
|
+
* Largest gap observed within the window ending at `nowMs`, at most the
|
|
69
|
+
* window itself; 0 if none or when no window is set.
|
|
70
|
+
*/
|
|
71
|
+
peakGapMs(nowMs: number): number;
|
|
72
|
+
/** Forget everything: a new delivery path starts with no measurement. */
|
|
73
|
+
reset(): void;
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=delivery-gap.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delivery-gap.d.ts","sourceRoot":"","sources":["../src/delivery-gap.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoDG;AACH,qBAAa,oBAAoB;;IAc/B;;;OAGG;IACH,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI;IAS/C,IAAI,QAAQ,IAAI,MAAM,GAAG,SAAS,CAEjC;IAED;;;OAGG;IACH,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,oBAAoB,EAAE,MAAM,GAAG,IAAI;IAsBhF;;;OAGG;IACH,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAOhC,yEAAyE;IACzE,KAAK,IAAI,IAAI;CAwBd"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
// src/delivery-gap.ts
|
|
2
|
+
var DeliveryGapEstimator = class {
|
|
3
|
+
/** Most recent arrival, or undefined before the first one since reset. */
|
|
4
|
+
#lastArrivalMs;
|
|
5
|
+
/** Last MMTP packet_sequence_number seen per packet_id. */
|
|
6
|
+
#lastSequence = /* @__PURE__ */ new Map();
|
|
7
|
+
/**
|
|
8
|
+
* Monotonic deque of (arrivalMs, gapMs): gaps strictly decrease from head to
|
|
9
|
+
* tail, so the head is the window maximum. Amortized O(1) per arrival.
|
|
10
|
+
*/
|
|
11
|
+
#times = [];
|
|
12
|
+
#gaps = [];
|
|
13
|
+
#head = 0;
|
|
14
|
+
#windowMs;
|
|
15
|
+
/**
|
|
16
|
+
* @param windowMs trailing window in ms, which also caps the reported gap,
|
|
17
|
+
* or undefined when the catalog gives none (no gap is reported).
|
|
18
|
+
*/
|
|
19
|
+
setWindowMs(windowMs) {
|
|
20
|
+
if (windowMs !== void 0 && !(Number.isFinite(windowMs) && windowMs > 0)) {
|
|
21
|
+
throw new Error(
|
|
22
|
+
`[DeliveryGap] window must be a finite positive ms value or undefined (got ${windowMs})`
|
|
23
|
+
);
|
|
24
|
+
}
|
|
25
|
+
this.#windowMs = windowMs;
|
|
26
|
+
}
|
|
27
|
+
get windowMs() {
|
|
28
|
+
return this.#windowMs;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Record one multicast datagram arrival at receiver time `nowMs`, carrying
|
|
32
|
+
* MMTP `packetSequenceNumber` (32-bit, per packet_id) on `packetId`.
|
|
33
|
+
*/
|
|
34
|
+
noteArrival(nowMs, packetId, packetSequenceNumber) {
|
|
35
|
+
const last = this.#lastArrivalMs;
|
|
36
|
+
const previousSequence = this.#lastSequence.get(packetId);
|
|
37
|
+
this.#lastArrivalMs = nowMs;
|
|
38
|
+
this.#lastSequence.set(packetId, packetSequenceNumber);
|
|
39
|
+
if (last === void 0 || previousSequence === void 0) return;
|
|
40
|
+
if (this.#windowMs === void 0) return;
|
|
41
|
+
if (previousSequence + 1 >>> 0 !== packetSequenceNumber >>> 0) return;
|
|
42
|
+
const gap = nowMs - last;
|
|
43
|
+
this.#evict(nowMs);
|
|
44
|
+
while (this.#gaps.length > this.#head && this.#gaps[this.#gaps.length - 1] <= gap) {
|
|
45
|
+
this.#gaps.pop();
|
|
46
|
+
this.#times.pop();
|
|
47
|
+
}
|
|
48
|
+
this.#gaps.push(gap);
|
|
49
|
+
this.#times.push(nowMs);
|
|
50
|
+
this.#compact();
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Largest gap observed within the window ending at `nowMs`, at most the
|
|
54
|
+
* window itself; 0 if none or when no window is set.
|
|
55
|
+
*/
|
|
56
|
+
peakGapMs(nowMs) {
|
|
57
|
+
const windowMs = this.#windowMs;
|
|
58
|
+
if (windowMs === void 0) return 0;
|
|
59
|
+
this.#evict(nowMs);
|
|
60
|
+
return this.#gaps.length > this.#head ? Math.min(this.#gaps[this.#head], windowMs) : 0;
|
|
61
|
+
}
|
|
62
|
+
/** Forget everything: a new delivery path starts with no measurement. */
|
|
63
|
+
reset() {
|
|
64
|
+
this.#lastArrivalMs = void 0;
|
|
65
|
+
this.#lastSequence.clear();
|
|
66
|
+
this.#times = [];
|
|
67
|
+
this.#gaps = [];
|
|
68
|
+
this.#head = 0;
|
|
69
|
+
}
|
|
70
|
+
#evict(nowMs) {
|
|
71
|
+
const windowMs = this.#windowMs;
|
|
72
|
+
if (windowMs === void 0) return;
|
|
73
|
+
while (this.#times.length > this.#head && this.#times[this.#head] < nowMs - windowMs) {
|
|
74
|
+
this.#head++;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
#compact() {
|
|
78
|
+
if (this.#head > 0 && this.#head * 2 >= this.#times.length) {
|
|
79
|
+
this.#times = this.#times.slice(this.#head);
|
|
80
|
+
this.#gaps = this.#gaps.slice(this.#head);
|
|
81
|
+
this.#head = 0;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
export {
|
|
86
|
+
DeliveryGapEstimator
|
|
87
|
+
};
|
|
88
|
+
//# sourceMappingURL=delivery-gap.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/delivery-gap.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Receiver-measured multicast delivery gap (BLO-35597).\n *\n * The FEC layer gives a block's multicast symbols a late-symbol wait before it\n * declares the block over: the catalog block span plus an allowance for the\n * path's arrival jitter. The catalog can only signal a tolerance it knows in\n * advance (`fec.reorderToleranceMs`); the path the receiver actually sits on\n * is measured here, in-band, from the arrival times of the multicast\n * datagrams themselves.\n *\n * Which statistic, and why not RFC 3550 interarrival jitter\n * ---------------------------------------------------------\n * The wait is an inactivity bound: a block fails when no symbol reaches it for\n * the wait. What it has to outlast is therefore the longest silence the\n * delivery path produces, not the path's average variation.\n *\n * RFC 3550 \u00A76.4.1 `J` is a mean absolute transit-time difference smoothed with\n * gain 1/16. It is the right number for sizing a playout buffer against steady\n * jitter, and the wrong one for a bimodal path. On the path this was measured\n * on (iPhone Safari over Wi-Fi, prod AMT, 2026-09-28, 36,657 datagrams in 57 s)\n * arrivals were either back-to-back (p90 inter-arrival 2 ms) or stalled for\n * one 802.11 power-save beacon interval (102.4 ms; 135 stalls of 50-110 ms,\n * recurring every ~511 ms at the median). Applied to that trace, `J` has a p99\n * of 6 ms: a wait of span + J expires inside every stall, and the stall's\n * symbols then arrive at a block that has already been failed.\n *\n * So the estimator is the largest delivery gap observed over a trailing\n * window: the time between consecutive multicast datagram arrivals, measured\n * on the page thread where the FEC deadlines themselves run (a main-thread or\n * bridge-batching delay is as real to those timers as a radio stall). It is\n * receiver-wide rather than per stream because the stall is a property of the\n * link every stream shares; a quiet stream learns the gap from a busy one.\n *\n * Only a gap that ended in delivery counts. A silence is closed by the first\n * packet after it; if that packet is the in-sequence successor (MMTP\n * packet_sequence_number + 1) of the last one its packet_id delivered, nothing\n * of that flow was lost across the silence: its packets were held and then\n * delivered, which is exactly the lateness a longer wait turns from a failed\n * block into a completed one. If the sequence jumped, the silence was (at\n * least partly) loss -- a tunnel outage, a publisher pause -- and waiting\n * longer would not have delivered anything, so the gap is not taken as\n * jitter.\n *\n * The trailing window is supplied by the caller from the catalog. It must be\n * long enough to contain one recurrence of the stall it has to remember, and\n * nothing here can know that recurrence in advance. The window is also the\n * largest gap reported: a silence longer than the catalog horizon is outside\n * what the estimator models (a backgrounded tab, a long GC), and every bound\n * derived from the wait (block lifetime, terminal retention, the release\n * gate's hold ceiling) must stay a catalog quantity rather than a measurement.\n * `undefined` means no catalog horizon is known: nothing bounds the gap, so\n * none is reported and the catalog tolerance alone applies.\n */\nexport class DeliveryGapEstimator {\n /** Most recent arrival, or undefined before the first one since reset. */\n #lastArrivalMs: number | undefined\n /** Last MMTP packet_sequence_number seen per packet_id. */\n #lastSequence = new Map<number, number>()\n /**\n * Monotonic deque of (arrivalMs, gapMs): gaps strictly decrease from head to\n * tail, so the head is the window maximum. Amortized O(1) per arrival.\n */\n #times: number[] = []\n #gaps: number[] = []\n #head = 0\n #windowMs: number | undefined\n\n /**\n * @param windowMs trailing window in ms, which also caps the reported gap,\n * or undefined when the catalog gives none (no gap is reported).\n */\n setWindowMs(windowMs: number | undefined): void {\n if (windowMs !== undefined && !(Number.isFinite(windowMs) && windowMs > 0)) {\n throw new Error(\n `[DeliveryGap] window must be a finite positive ms value or undefined (got ${windowMs})`,\n )\n }\n this.#windowMs = windowMs\n }\n\n get windowMs(): number | undefined {\n return this.#windowMs\n }\n\n /**\n * Record one multicast datagram arrival at receiver time `nowMs`, carrying\n * MMTP `packetSequenceNumber` (32-bit, per packet_id) on `packetId`.\n */\n noteArrival(nowMs: number, packetId: number, packetSequenceNumber: number): void {\n const last = this.#lastArrivalMs\n const previousSequence = this.#lastSequence.get(packetId)\n this.#lastArrivalMs = nowMs\n this.#lastSequence.set(packetId, packetSequenceNumber)\n if (last === undefined || previousSequence === undefined) return\n if (this.#windowMs === undefined) return\n // MMTP packet_sequence_number is a 32-bit counter that wraps.\n if (((previousSequence + 1) >>> 0) !== (packetSequenceNumber >>> 0)) return\n const gap = nowMs - last\n this.#evict(nowMs)\n // A gap no larger than the current tail can never become the maximum\n // while the tail is still in the window, except as the newest entry.\n while (this.#gaps.length > this.#head && this.#gaps[this.#gaps.length - 1] <= gap) {\n this.#gaps.pop()\n this.#times.pop()\n }\n this.#gaps.push(gap)\n this.#times.push(nowMs)\n this.#compact()\n }\n\n /**\n * Largest gap observed within the window ending at `nowMs`, at most the\n * window itself; 0 if none or when no window is set.\n */\n peakGapMs(nowMs: number): number {\n const windowMs = this.#windowMs\n if (windowMs === undefined) return 0\n this.#evict(nowMs)\n return this.#gaps.length > this.#head ? Math.min(this.#gaps[this.#head], windowMs) : 0\n }\n\n /** Forget everything: a new delivery path starts with no measurement. */\n reset(): void {\n this.#lastArrivalMs = undefined\n this.#lastSequence.clear()\n this.#times = []\n this.#gaps = []\n this.#head = 0\n }\n\n #evict(nowMs: number): void {\n const windowMs = this.#windowMs\n if (windowMs === undefined) return\n while (this.#times.length > this.#head && this.#times[this.#head] < nowMs - windowMs) {\n this.#head++\n }\n }\n\n #compact(): void {\n // Drop consumed head slots once they outnumber live ones.\n if (this.#head > 0 && this.#head * 2 >= this.#times.length) {\n this.#times = this.#times.slice(this.#head)\n this.#gaps = this.#gaps.slice(this.#head)\n this.#head = 0\n }\n }\n}\n"],
|
|
5
|
+
"mappings": ";AAqDO,IAAM,uBAAN,MAA2B;AAAA;AAAA,EAEhC;AAAA;AAAA,EAEA,gBAAgB,oBAAI,IAAoB;AAAA;AAAA;AAAA;AAAA;AAAA,EAKxC,SAAmB,CAAC;AAAA,EACpB,QAAkB,CAAC;AAAA,EACnB,QAAQ;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YAAY,UAAoC;AAC9C,QAAI,aAAa,UAAa,EAAE,OAAO,SAAS,QAAQ,KAAK,WAAW,IAAI;AAC1E,YAAM,IAAI;AAAA,QACR,6EAA6E,QAAQ;AAAA,MACvF;AAAA,IACF;AACA,SAAK,YAAY;AAAA,EACnB;AAAA,EAEA,IAAI,WAA+B;AACjC,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YAAY,OAAe,UAAkB,sBAAoC;AAC/E,UAAM,OAAO,KAAK;AAClB,UAAM,mBAAmB,KAAK,cAAc,IAAI,QAAQ;AACxD,SAAK,iBAAiB;AACtB,SAAK,cAAc,IAAI,UAAU,oBAAoB;AACrD,QAAI,SAAS,UAAa,qBAAqB,OAAW;AAC1D,QAAI,KAAK,cAAc,OAAW;AAElC,QAAM,mBAAmB,MAAO,MAAQ,yBAAyB,EAAI;AACrE,UAAM,MAAM,QAAQ;AACpB,SAAK,OAAO,KAAK;AAGjB,WAAO,KAAK,MAAM,SAAS,KAAK,SAAS,KAAK,MAAM,KAAK,MAAM,SAAS,CAAC,KAAK,KAAK;AACjF,WAAK,MAAM,IAAI;AACf,WAAK,OAAO,IAAI;AAAA,IAClB;AACA,SAAK,MAAM,KAAK,GAAG;AACnB,SAAK,OAAO,KAAK,KAAK;AACtB,SAAK,SAAS;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,UAAU,OAAuB;AAC/B,UAAM,WAAW,KAAK;AACtB,QAAI,aAAa,OAAW,QAAO;AACnC,SAAK,OAAO,KAAK;AACjB,WAAO,KAAK,MAAM,SAAS,KAAK,QAAQ,KAAK,IAAI,KAAK,MAAM,KAAK,KAAK,GAAG,QAAQ,IAAI;AAAA,EACvF;AAAA;AAAA,EAGA,QAAc;AACZ,SAAK,iBAAiB;AACtB,SAAK,cAAc,MAAM;AACzB,SAAK,SAAS,CAAC;AACf,SAAK,QAAQ,CAAC;AACd,SAAK,QAAQ;AAAA,EACf;AAAA,EAEA,OAAO,OAAqB;AAC1B,UAAM,WAAW,KAAK;AACtB,QAAI,aAAa,OAAW;AAC5B,WAAO,KAAK,OAAO,SAAS,KAAK,SAAS,KAAK,OAAO,KAAK,KAAK,IAAI,QAAQ,UAAU;AACpF,WAAK;AAAA,IACP;AAAA,EACF;AAAA,EAEA,WAAiB;AAEf,QAAI,KAAK,QAAQ,KAAK,KAAK,QAAQ,KAAK,KAAK,OAAO,QAAQ;AAC1D,WAAK,SAAS,KAAK,OAAO,MAAM,KAAK,KAAK;AAC1C,WAAK,QAAQ,KAAK,MAAM,MAAM,KAAK,KAAK;AACxC,WAAK,QAAQ;AAAA,IACf;AAAA,EACF;AACF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MmtpRouter's per-stream duplicate ledgers, retained for the stream's FEC
|
|
3
|
+
* horizon (BLO-36599).
|
|
4
|
+
*
|
|
5
|
+
* The router remembers three kinds of wire number per physical stream, so a
|
|
6
|
+
* second copy of a packet is not parsed or delivered twice:
|
|
7
|
+
*
|
|
8
|
+
* - packet_sequence_numbers received on the direct source path, which a
|
|
9
|
+
* recovered FEC block must not deliver again;
|
|
10
|
+
* - packet_sequence_numbers already handed to the track packet callback;
|
|
11
|
+
* - Source FEC Payload IDs (SS_ID) already parsed for playback, which dedup an
|
|
12
|
+
* overlap copy against its multicast twin.
|
|
13
|
+
*
|
|
14
|
+
* Each of these is useful for as long as FECManager can still re-deliver the
|
|
15
|
+
* number's packet, which ends when its FEC block goes terminal; the ledger
|
|
16
|
+
* keeps one further block lifetime of margin. A block's symbols all arrive
|
|
17
|
+
* within its span, the catalog's `interleaveDepthMs` (draft-ramadan-moq-fec
|
|
18
|
+
* §5.1). After its last symbol FECManager makes the block terminal within one
|
|
19
|
+
* block lifetime (the inactivity fail bound plus the D-28 repair grace, the
|
|
20
|
+
* value `blockLifetimeMsForPacket()` returns). FECManager keeps the terminal
|
|
21
|
+
* record longer than that (`terminalRetentionMsForPacket()`, for the in-order
|
|
22
|
+
* release gate), and that record itself counts late symbols as duplicates, so
|
|
23
|
+
* the ledger need not match it. Measured from a number's first arrival that is
|
|
24
|
+
*
|
|
25
|
+
* retention = interleaveDepthMs + blockLifetime + blockLifetime
|
|
26
|
+
*
|
|
27
|
+
* The bound is a time, not a count, on purpose. A count would need the
|
|
28
|
+
* stream's symbol rate, and the catalog does not give one: the producer closes
|
|
29
|
+
* a block after D media units or after K source symbols, whichever comes
|
|
30
|
+
* first, so one span can hold several blocks (every large keyframe does) and K
|
|
31
|
+
* per span is not an upper bound on the rate. The fixed 2000-entry window this
|
|
32
|
+
* replaces held about 4 s of the 467 packet/s AMT stream and about 40 s of a
|
|
33
|
+
* 47 packet/s audio stream; this one holds each stream for its own horizon.
|
|
34
|
+
*
|
|
35
|
+
* The clock is read only when a stream moves to a new FEC block (or for a
|
|
36
|
+
* packet without an FEC coordinate), never per packet, and no timer is armed:
|
|
37
|
+
* the ledgers rotate lazily.
|
|
38
|
+
*
|
|
39
|
+
* A stream whose horizon cannot be derived while FEC still runs (the FEC
|
|
40
|
+
* manager reports no per-stream geometry, or the catalog gives no block span,
|
|
41
|
+
* in which case FECManager falls back to its fail bound and still recovers
|
|
42
|
+
* blocks) is still re-delivered packets by recovery, so it keeps the count
|
|
43
|
+
* window the router kept for every stream before this change: each ledger
|
|
44
|
+
* holds its newest COUNT_BOUNDED_GENERATION to 2 * COUNT_BOUNDED_GENERATION
|
|
45
|
+
* numbers. Only a router without an FEC manager keeps no ledger: nothing
|
|
46
|
+
* re-delivers a packet.
|
|
47
|
+
*/
|
|
48
|
+
/**
|
|
49
|
+
* Generation length, in numbers, of a ledger whose stream has no derivable FEC
|
|
50
|
+
* horizon. This is not a new bound: it is the window every stream kept before
|
|
51
|
+
* BLO-36599 (trim to the newest 2000 once past 4000), kept for exactly the
|
|
52
|
+
* streams the FEC horizon cannot describe.
|
|
53
|
+
*/
|
|
54
|
+
export declare const COUNT_BOUNDED_GENERATION = 2000;
|
|
55
|
+
/**
|
|
56
|
+
* RFC 1982 serial-number order on a 32-bit wire counter (MMTP
|
|
57
|
+
* packet_sequence_number, SS_ID): true when `a` precedes `b`. The counters
|
|
58
|
+
* wrap, so plain `<` would report every wrap as a regression.
|
|
59
|
+
*/
|
|
60
|
+
export declare function serial32Precedes(a: number, b: number): boolean;
|
|
61
|
+
/** The two FECManager values a stream's duplicate retention is derived from. */
|
|
62
|
+
export interface DuplicateHorizonGeometry {
|
|
63
|
+
/** Catalog `fec.interleaveDepthMs`: the full FEC block span, in ms. */
|
|
64
|
+
readonly blockSpanMs: number;
|
|
65
|
+
/**
|
|
66
|
+
* FECManager's `blockLifetimeMsForPacket()`: the longest a block stays open
|
|
67
|
+
* after its last symbol. Its terminal record is kept at least this long.
|
|
68
|
+
*/
|
|
69
|
+
readonly blockLifetimeMs: number;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* How long a stream's duplicate ledgers keep a number, or why no FEC horizon
|
|
73
|
+
* is derivable. `'no-fec-manager'`: the router decodes no FEC, so nothing
|
|
74
|
+
* re-delivers a packet and the stream keeps no ledger. `'no-fec-geometry'`:
|
|
75
|
+
* the FEC manager cannot report per-stream geometry. `'no-block-span'`: the
|
|
76
|
+
* stream has no catalog FEC block span (FECManager reports interleaveDepthMs
|
|
77
|
+
* 0, which is also what a stream without FEC reports). FEC may still recover
|
|
78
|
+
* blocks in the last two cases, so they keep count-bounded ledgers.
|
|
79
|
+
*/
|
|
80
|
+
export type DuplicateHorizon = {
|
|
81
|
+
readonly kind: 'fec-horizon';
|
|
82
|
+
readonly retentionMs: number;
|
|
83
|
+
} | {
|
|
84
|
+
readonly kind: 'none';
|
|
85
|
+
readonly reason: 'no-fec-manager' | 'no-fec-geometry' | 'no-block-span';
|
|
86
|
+
};
|
|
87
|
+
/** Derive a stream's duplicate retention from its FEC geometry; see the module comment. */
|
|
88
|
+
export declare function duplicateRetentionMs(geometry: DuplicateHorizonGeometry): number;
|
|
89
|
+
/**
|
|
90
|
+
* A set of wire numbers kept in two generations. Rotating retires the older
|
|
91
|
+
* generation and starts a new one, so a number stays a member from the moment
|
|
92
|
+
* it is added until the second rotation after that: at least one full
|
|
93
|
+
* generation. A number already present keeps its first-arrival generation, as
|
|
94
|
+
* a duplicate must be timed from the original. Additions are dropped while
|
|
95
|
+
* `gate.retaining` is false. While `gate.countBounded` is true the set rotates
|
|
96
|
+
* itself each time its newer generation reaches COUNT_BOUNDED_GENERATION.
|
|
97
|
+
*
|
|
98
|
+
* One Set holds both generations. A number is added once, so the Set's
|
|
99
|
+
* insertion order is generation order and the older generation is exactly its
|
|
100
|
+
* first `#olderCount` members; rotating deletes those in place. Two Sets with
|
|
101
|
+
* a clear() per rotation would reallocate and regrow a Set every generation.
|
|
102
|
+
*/
|
|
103
|
+
export declare class GenerationalNumberSet {
|
|
104
|
+
#private;
|
|
105
|
+
constructor(gate: {
|
|
106
|
+
readonly retaining: boolean;
|
|
107
|
+
readonly countBounded: boolean;
|
|
108
|
+
});
|
|
109
|
+
has(value: number): boolean;
|
|
110
|
+
add(value: number): void;
|
|
111
|
+
/** Retire the older generation; the current one becomes the older. */
|
|
112
|
+
rotate(): void;
|
|
113
|
+
clear(): void;
|
|
114
|
+
/**
|
|
115
|
+
* Keep every member but forget how many rotations have passed, so no floor
|
|
116
|
+
* is reported until two more rotations. A stream that starts timing its
|
|
117
|
+
* generations calls this: generations rotated by count say nothing about
|
|
118
|
+
* how long ago their members arrived.
|
|
119
|
+
*/
|
|
120
|
+
restartAging(): void;
|
|
121
|
+
/**
|
|
122
|
+
* The earliest-arrived member, once it is known to have arrived at least one
|
|
123
|
+
* full generation ago; `undefined` before that.
|
|
124
|
+
*
|
|
125
|
+
* A rotation is triggered by an arriving packet, which is normally the
|
|
126
|
+
* first member of the new generation (a live stream adds its next packet
|
|
127
|
+
* within one packet interval otherwise). From the second rotation on, the
|
|
128
|
+
* older generation therefore began at a rotation, and its first member
|
|
129
|
+
* arrived about one generation length before now. Before the second
|
|
130
|
+
* rotation the first member may be a number that simply arrived early out of
|
|
131
|
+
* order, so no floor is reported.
|
|
132
|
+
*/
|
|
133
|
+
get horizonFloor(): number | undefined;
|
|
134
|
+
get size(): number;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* One physical stream's three duplicate ledgers and their shared generation
|
|
138
|
+
* clock. `advance()` runs once per packet (and once per recovered block) before
|
|
139
|
+
* any lookup, `predatesHorizon()` included. It does work only when the packet
|
|
140
|
+
* belongs to a different FEC block than the previous one, or carries no FEC
|
|
141
|
+
* coordinate on a stream with an FEC horizon; everything else is a Set lookup.
|
|
142
|
+
*/
|
|
143
|
+
export declare class StreamDuplicateLedgers {
|
|
144
|
+
#private;
|
|
145
|
+
/** packet_sequence_numbers received on the direct source path. */
|
|
146
|
+
readonly sourceSeqs: GenerationalNumberSet;
|
|
147
|
+
/** packet_sequence_numbers already handed to the track packet callback. */
|
|
148
|
+
readonly routedSeqs: GenerationalNumberSet;
|
|
149
|
+
/** SS_IDs already parsed for playback. */
|
|
150
|
+
readonly parsedSymbols: GenerationalNumberSet;
|
|
151
|
+
/**
|
|
152
|
+
* @param horizon resolves the stream's current horizon from its FEC
|
|
153
|
+
* geometry. It is read when the stream moves to a new block, so a catalog
|
|
154
|
+
* change applies from the next block.
|
|
155
|
+
* @param now the clock FECManager's deadlines use.
|
|
156
|
+
*/
|
|
157
|
+
constructor(horizon: () => DuplicateHorizon, now?: () => number);
|
|
158
|
+
/**
|
|
159
|
+
* Note the FEC block (SBN) of the packet about to be looked up, or
|
|
160
|
+
* `undefined` for a packet without a Source FEC Payload ID. Returns whether
|
|
161
|
+
* the stream keeps ledgers; while it does not, lookups find nothing and
|
|
162
|
+
* additions are dropped. The horizon is read on the first packet after
|
|
163
|
+
* construction or clear(), and again whenever the block changes; a packet
|
|
164
|
+
* without a coordinate never re-reads it, so a stream without FEC
|
|
165
|
+
* coordinates resolves its horizon once, not per packet.
|
|
166
|
+
*/
|
|
167
|
+
advance(sbn: number | undefined): boolean;
|
|
168
|
+
/**
|
|
169
|
+
* Whether a packet with these wire numbers predates every number the stream
|
|
170
|
+
* has kept for at least one full FEC horizon (BLO-36599).
|
|
171
|
+
*
|
|
172
|
+
* Within one publisher epoch this cannot happen to a usable packet: it
|
|
173
|
+
* would have been sent before a packet that arrived a whole horizon ago, so
|
|
174
|
+
* no FEC block could still recover it and no reorder window could still place
|
|
175
|
+
* it. A publisher that restarts resets packet_sequence_number and SS_ID,
|
|
176
|
+
* and its first packets land exactly here. The evidence is in-band: two
|
|
177
|
+
* wire counters compared against numbers the stream actually received, with
|
|
178
|
+
* the horizon derived from the catalog. No timer is armed and no count
|
|
179
|
+
* threshold is guessed.
|
|
180
|
+
*
|
|
181
|
+
* Limits, by construction: a stream without an FEC horizon (count-bounded
|
|
182
|
+
* ledgers, or none) reports nothing, and so does a stream younger than two
|
|
183
|
+
* timed generations; a restart whose new counters land inside the retained
|
|
184
|
+
* range is not evidence, and its old numbers age out of the ledgers within
|
|
185
|
+
* one horizon.
|
|
186
|
+
*/
|
|
187
|
+
predatesHorizon(packetSequenceNumber: number, ssId: number | undefined): boolean;
|
|
188
|
+
/** Whether the stream keeps ledgers, for its FEC horizon or by count. */
|
|
189
|
+
get retaining(): boolean;
|
|
190
|
+
/** Whether the ledgers are bounded by count because no FEC horizon is derivable. */
|
|
191
|
+
get countBounded(): boolean;
|
|
192
|
+
/** Current retention in ms, or null while the stream has no FEC horizon. */
|
|
193
|
+
get retentionMs(): number | null;
|
|
194
|
+
/** Forget every number (a track reset); the next packet re-derives the horizon. */
|
|
195
|
+
clear(): void;
|
|
196
|
+
}
|
|
197
|
+
//# sourceMappingURL=duplicate-ledger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"duplicate-ledger.d.ts","sourceRoot":"","sources":["../src/duplicate-ledger.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AAEH;;;;;GAKG;AACH,eAAO,MAAM,wBAAwB,OAAO,CAAA;AAE5C;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAG9D;AAED,gFAAgF;AAChF,MAAM,WAAW,wBAAwB;IACvC,uEAAuE;IACvE,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B;;;OAGG;IACH,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAA;CACjC;AAED;;;;;;;;GAQG;AACH,MAAM,MAAM,gBAAgB,GACxB;IAAE,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GAC9D;IACE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,MAAM,EAAE,gBAAgB,GAAG,iBAAiB,GAAG,eAAe,CAAA;CACxE,CAAA;AAWL,2FAA2F;AAC3F,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,wBAAwB,GAAG,MAAM,CAM/E;AAED;;;;;;;;;;;;;GAaG;AACH,qBAAa,qBAAqB;;gBAQpB,IAAI,EAAE;QAAE,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAA;KAAE;IAIjF,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAI3B,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAMxB,sEAAsE;IACtE,MAAM,IAAI,IAAI;IAqBd,KAAK,IAAI,IAAI;IAOb;;;;;OAKG;IACH,YAAY,IAAI,IAAI;IAKpB;;;;;;;;;;;OAWG;IACH,IAAI,YAAY,IAAI,MAAM,GAAG,SAAS,CAGrC;IAED,IAAI,IAAI,IAAI,MAAM,CAEjB;CACF;AAED;;;;;;GAMG;AACH,qBAAa,sBAAsB;;IACjC,kEAAkE;IAClE,QAAQ,CAAC,UAAU,EAAE,qBAAqB,CAAA;IAC1C,2EAA2E;IAC3E,QAAQ,CAAC,UAAU,EAAE,qBAAqB,CAAA;IAC1C,0CAA0C;IAC1C,QAAQ,CAAC,aAAa,EAAE,qBAAqB,CAAA;IAW7C;;;;;OAKG;gBACS,OAAO,EAAE,MAAM,gBAAgB,EAAE,GAAG,GAAE,MAAM,MAAgC;IAQxF;;;;;;;;OAQG;IACH,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO;IAwCzC;;;;;;;;;;;;;;;;;;OAkBG;IACH,eAAe,CAAC,oBAAoB,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO;IAmBhF,yEAAyE;IACzE,IAAI,SAAS,IAAI,OAAO,CAEvB;IAED,oFAAoF;IACpF,IAAI,YAAY,IAAI,OAAO,CAE1B;IAED,4EAA4E;IAC5E,IAAI,WAAW,IAAI,MAAM,GAAG,IAAI,CAE/B;IAED,mFAAmF;IACnF,KAAK,IAAI,IAAI;CAqBd"}
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
// src/duplicate-ledger.ts
|
|
2
|
+
var COUNT_BOUNDED_GENERATION = 2e3;
|
|
3
|
+
function serial32Precedes(a, b) {
|
|
4
|
+
const distance = b - a >>> 0;
|
|
5
|
+
return distance !== 0 && distance < 2147483648;
|
|
6
|
+
}
|
|
7
|
+
function assertPositiveMs(name, value) {
|
|
8
|
+
if (!Number.isFinite(value) || value <= 0) {
|
|
9
|
+
throw new Error(
|
|
10
|
+
`[DuplicateLedger] ${name}=${value}. Derive a positive ${name} from the stream catalog through FECManager.`
|
|
11
|
+
);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
function duplicateRetentionMs(geometry) {
|
|
15
|
+
assertPositiveMs("blockSpanMs", geometry.blockSpanMs);
|
|
16
|
+
assertPositiveMs("blockLifetimeMs", geometry.blockLifetimeMs);
|
|
17
|
+
const untilTerminalMs = geometry.blockLifetimeMs;
|
|
18
|
+
const terminalRecordMs = geometry.blockLifetimeMs;
|
|
19
|
+
return geometry.blockSpanMs + untilTerminalMs + terminalRecordMs;
|
|
20
|
+
}
|
|
21
|
+
var GenerationalNumberSet = class {
|
|
22
|
+
#members = /* @__PURE__ */ new Set();
|
|
23
|
+
#olderCount = 0;
|
|
24
|
+
#newerCount = 0;
|
|
25
|
+
#rotations = 0;
|
|
26
|
+
#floor = void 0;
|
|
27
|
+
#gate;
|
|
28
|
+
constructor(gate) {
|
|
29
|
+
this.#gate = gate;
|
|
30
|
+
}
|
|
31
|
+
has(value) {
|
|
32
|
+
return this.#members.has(value);
|
|
33
|
+
}
|
|
34
|
+
add(value) {
|
|
35
|
+
if (!this.#gate.retaining || this.#members.has(value)) return;
|
|
36
|
+
this.#members.add(value);
|
|
37
|
+
if (++this.#newerCount >= COUNT_BOUNDED_GENERATION && this.#gate.countBounded) this.rotate();
|
|
38
|
+
}
|
|
39
|
+
/** Retire the older generation; the current one becomes the older. */
|
|
40
|
+
rotate() {
|
|
41
|
+
let retiring = this.#olderCount;
|
|
42
|
+
if (retiring > 0) {
|
|
43
|
+
for (const value of this.#members) {
|
|
44
|
+
this.#members.delete(value);
|
|
45
|
+
if (--retiring === 0) break;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
this.#olderCount = this.#newerCount;
|
|
49
|
+
this.#newerCount = 0;
|
|
50
|
+
this.#rotations++;
|
|
51
|
+
this.#floor = void 0;
|
|
52
|
+
for (const value of this.#members) {
|
|
53
|
+
this.#floor = value;
|
|
54
|
+
break;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
clear() {
|
|
58
|
+
this.#members.clear();
|
|
59
|
+
this.#olderCount = 0;
|
|
60
|
+
this.#newerCount = 0;
|
|
61
|
+
this.restartAging();
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Keep every member but forget how many rotations have passed, so no floor
|
|
65
|
+
* is reported until two more rotations. A stream that starts timing its
|
|
66
|
+
* generations calls this: generations rotated by count say nothing about
|
|
67
|
+
* how long ago their members arrived.
|
|
68
|
+
*/
|
|
69
|
+
restartAging() {
|
|
70
|
+
this.#rotations = 0;
|
|
71
|
+
this.#floor = void 0;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* The earliest-arrived member, once it is known to have arrived at least one
|
|
75
|
+
* full generation ago; `undefined` before that.
|
|
76
|
+
*
|
|
77
|
+
* A rotation is triggered by an arriving packet, which is normally the
|
|
78
|
+
* first member of the new generation (a live stream adds its next packet
|
|
79
|
+
* within one packet interval otherwise). From the second rotation on, the
|
|
80
|
+
* older generation therefore began at a rotation, and its first member
|
|
81
|
+
* arrived about one generation length before now. Before the second
|
|
82
|
+
* rotation the first member may be a number that simply arrived early out of
|
|
83
|
+
* order, so no floor is reported.
|
|
84
|
+
*/
|
|
85
|
+
get horizonFloor() {
|
|
86
|
+
if (this.#rotations < 2 || this.#olderCount === 0) return void 0;
|
|
87
|
+
return this.#floor;
|
|
88
|
+
}
|
|
89
|
+
get size() {
|
|
90
|
+
return this.#members.size;
|
|
91
|
+
}
|
|
92
|
+
};
|
|
93
|
+
var StreamDuplicateLedgers = class {
|
|
94
|
+
#horizon;
|
|
95
|
+
#now;
|
|
96
|
+
#retentionMs = null;
|
|
97
|
+
#countBounded = false;
|
|
98
|
+
/** Whether the horizon was read since construction or the last clear(). */
|
|
99
|
+
#horizonRead = false;
|
|
100
|
+
#generationStartMs = 0;
|
|
101
|
+
#lastSbn = void 0;
|
|
102
|
+
/**
|
|
103
|
+
* @param horizon resolves the stream's current horizon from its FEC
|
|
104
|
+
* geometry. It is read when the stream moves to a new block, so a catalog
|
|
105
|
+
* change applies from the next block.
|
|
106
|
+
* @param now the clock FECManager's deadlines use.
|
|
107
|
+
*/
|
|
108
|
+
constructor(horizon, now = () => performance.now()) {
|
|
109
|
+
this.#horizon = horizon;
|
|
110
|
+
this.#now = now;
|
|
111
|
+
this.sourceSeqs = new GenerationalNumberSet(this);
|
|
112
|
+
this.routedSeqs = new GenerationalNumberSet(this);
|
|
113
|
+
this.parsedSymbols = new GenerationalNumberSet(this);
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Note the FEC block (SBN) of the packet about to be looked up, or
|
|
117
|
+
* `undefined` for a packet without a Source FEC Payload ID. Returns whether
|
|
118
|
+
* the stream keeps ledgers; while it does not, lookups find nothing and
|
|
119
|
+
* additions are dropped. The horizon is read on the first packet after
|
|
120
|
+
* construction or clear(), and again whenever the block changes; a packet
|
|
121
|
+
* without a coordinate never re-reads it, so a stream without FEC
|
|
122
|
+
* coordinates resolves its horizon once, not per packet.
|
|
123
|
+
*/
|
|
124
|
+
advance(sbn) {
|
|
125
|
+
if (sbn !== void 0) {
|
|
126
|
+
if (sbn === this.#lastSbn) return this.retaining;
|
|
127
|
+
this.#lastSbn = sbn;
|
|
128
|
+
} else if (this.#horizonRead) {
|
|
129
|
+
if (this.#retentionMs !== null) this.#rotateIfDue(this.#now());
|
|
130
|
+
return this.retaining;
|
|
131
|
+
}
|
|
132
|
+
this.#horizonRead = true;
|
|
133
|
+
const horizon = this.#horizon();
|
|
134
|
+
if (horizon.kind === "none") {
|
|
135
|
+
if (horizon.reason === "no-fec-manager") {
|
|
136
|
+
this.#forget();
|
|
137
|
+
} else {
|
|
138
|
+
this.#retentionMs = null;
|
|
139
|
+
this.#countBounded = true;
|
|
140
|
+
}
|
|
141
|
+
return this.retaining;
|
|
142
|
+
}
|
|
143
|
+
const nowMs = this.#now();
|
|
144
|
+
this.#countBounded = false;
|
|
145
|
+
if (this.#retentionMs === null) {
|
|
146
|
+
this.#retentionMs = horizon.retentionMs;
|
|
147
|
+
this.#generationStartMs = nowMs;
|
|
148
|
+
this.sourceSeqs.restartAging();
|
|
149
|
+
this.routedSeqs.restartAging();
|
|
150
|
+
this.parsedSymbols.restartAging();
|
|
151
|
+
return true;
|
|
152
|
+
}
|
|
153
|
+
this.#retentionMs = horizon.retentionMs;
|
|
154
|
+
this.#rotateIfDue(nowMs);
|
|
155
|
+
return true;
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Whether a packet with these wire numbers predates every number the stream
|
|
159
|
+
* has kept for at least one full FEC horizon (BLO-36599).
|
|
160
|
+
*
|
|
161
|
+
* Within one publisher epoch this cannot happen to a usable packet: it
|
|
162
|
+
* would have been sent before a packet that arrived a whole horizon ago, so
|
|
163
|
+
* no FEC block could still recover it and no reorder window could still place
|
|
164
|
+
* it. A publisher that restarts resets packet_sequence_number and SS_ID,
|
|
165
|
+
* and its first packets land exactly here. The evidence is in-band: two
|
|
166
|
+
* wire counters compared against numbers the stream actually received, with
|
|
167
|
+
* the horizon derived from the catalog. No timer is armed and no count
|
|
168
|
+
* threshold is guessed.
|
|
169
|
+
*
|
|
170
|
+
* Limits, by construction: a stream without an FEC horizon (count-bounded
|
|
171
|
+
* ledgers, or none) reports nothing, and so does a stream younger than two
|
|
172
|
+
* timed generations; a restart whose new counters land inside the retained
|
|
173
|
+
* range is not evidence, and its old numbers age out of the ledgers within
|
|
174
|
+
* one horizon.
|
|
175
|
+
*/
|
|
176
|
+
predatesHorizon(packetSequenceNumber, ssId) {
|
|
177
|
+
if (this.#retentionMs === null) return false;
|
|
178
|
+
const seqFloor = this.sourceSeqs.horizonFloor;
|
|
179
|
+
if (seqFloor !== void 0 && serial32Precedes(packetSequenceNumber, seqFloor) && !this.sourceSeqs.has(packetSequenceNumber)) {
|
|
180
|
+
return true;
|
|
181
|
+
}
|
|
182
|
+
if (ssId === void 0) return false;
|
|
183
|
+
const ssIdFloor = this.parsedSymbols.horizonFloor;
|
|
184
|
+
return ssIdFloor !== void 0 && serial32Precedes(ssId, ssIdFloor) && !this.parsedSymbols.has(ssId);
|
|
185
|
+
}
|
|
186
|
+
/** Whether the stream keeps ledgers, for its FEC horizon or by count. */
|
|
187
|
+
get retaining() {
|
|
188
|
+
return this.#retentionMs !== null || this.#countBounded;
|
|
189
|
+
}
|
|
190
|
+
/** Whether the ledgers are bounded by count because no FEC horizon is derivable. */
|
|
191
|
+
get countBounded() {
|
|
192
|
+
return this.#countBounded;
|
|
193
|
+
}
|
|
194
|
+
/** Current retention in ms, or null while the stream has no FEC horizon. */
|
|
195
|
+
get retentionMs() {
|
|
196
|
+
return this.#retentionMs;
|
|
197
|
+
}
|
|
198
|
+
/** Forget every number (a track reset); the next packet re-derives the horizon. */
|
|
199
|
+
clear() {
|
|
200
|
+
this.#forget();
|
|
201
|
+
this.#lastSbn = void 0;
|
|
202
|
+
this.#horizonRead = false;
|
|
203
|
+
}
|
|
204
|
+
#forget() {
|
|
205
|
+
this.sourceSeqs.clear();
|
|
206
|
+
this.routedSeqs.clear();
|
|
207
|
+
this.parsedSymbols.clear();
|
|
208
|
+
this.#retentionMs = null;
|
|
209
|
+
this.#countBounded = false;
|
|
210
|
+
}
|
|
211
|
+
#rotateIfDue(nowMs) {
|
|
212
|
+
if (this.#retentionMs === null || nowMs - this.#generationStartMs < this.#retentionMs) return;
|
|
213
|
+
this.sourceSeqs.rotate();
|
|
214
|
+
this.routedSeqs.rotate();
|
|
215
|
+
this.parsedSymbols.rotate();
|
|
216
|
+
this.#generationStartMs = nowMs;
|
|
217
|
+
}
|
|
218
|
+
};
|
|
219
|
+
export {
|
|
220
|
+
COUNT_BOUNDED_GENERATION,
|
|
221
|
+
GenerationalNumberSet,
|
|
222
|
+
StreamDuplicateLedgers,
|
|
223
|
+
duplicateRetentionMs,
|
|
224
|
+
serial32Precedes
|
|
225
|
+
};
|
|
226
|
+
//# sourceMappingURL=duplicate-ledger.js.map
|