@blockcast/mmt-container 0.3.0 → 0.4.0-main.1cd3cdea89da
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 +33 -16
- package/dist/browser-runtime.js +14814 -14255
- package/dist/browser-runtime.js.map +4 -4
- package/dist/carp-catalog.d.ts +24 -19
- package/dist/carp-catalog.d.ts.map +1 -1
- package/dist/carp-catalog.js +29 -14
- package/dist/carp-catalog.js.map +4 -4
- package/dist/catalog-fec-params.d.ts +88 -28
- package/dist/catalog-fec-params.d.ts.map +1 -1
- package/dist/catalog-fec-params.js +60 -23
- package/dist/catalog-fec-params.js.map +4 -4
- package/dist/catalog-network-source.js +1 -7
- package/dist/catalog-network-source.js.map +4 -4
- package/dist/cmaf-block-assembler.d.ts +0 -2
- package/dist/cmaf-block-assembler.d.ts.map +1 -1
- package/dist/cmaf-block-assembler.js +0 -1
- package/dist/cmaf-block-assembler.js.map +2 -2
- package/dist/cmcd-producer.d.ts.map +1 -1
- package/dist/cmcd-producer.js +0 -4
- package/dist/cmcd-producer.js.map +2 -2
- package/dist/delivery-catalog.d.ts +124 -0
- package/dist/delivery-catalog.d.ts.map +1 -0
- package/dist/delivery-catalog.js +1857 -0
- package/dist/delivery-catalog.js.map +7 -0
- package/dist/delta-fallback-config.d.ts +42 -0
- package/dist/delta-fallback-config.d.ts.map +1 -0
- package/dist/delta-fallback-config.js +59 -0
- package/dist/delta-fallback-config.js.map +7 -0
- package/dist/fec-manager.d.ts +52 -30
- package/dist/fec-manager.d.ts.map +1 -1
- package/dist/fec-manager.js +338 -293
- package/dist/fec-manager.js.map +4 -4
- package/dist/fec-state.d.ts +19 -31
- package/dist/fec-state.d.ts.map +1 -1
- package/dist/fec-state.js +4 -10
- package/dist/fec-state.js.map +4 -4
- package/dist/fec-worker-setup.d.ts +18 -14
- package/dist/fec-worker-setup.d.ts.map +1 -1
- package/dist/fec-worker-setup.js +81 -96
- package/dist/fec-worker-setup.js.map +4 -4
- package/dist/index.d.ts +5 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +16 -0
- package/dist/index.js.map +2 -2
- package/dist/iso-block-locator.js +1 -7
- package/dist/iso-block-locator.js.map +4 -4
- package/dist/media-router.d.ts +20 -8
- package/dist/media-router.d.ts.map +1 -1
- package/dist/media-router.js +46 -21
- package/dist/media-router.js.map +2 -2
- package/dist/mfu-reassembler.js +24 -30
- package/dist/mfu-reassembler.js.map +4 -4
- package/dist/mmtp-container-parser.d.ts +14 -11
- package/dist/mmtp-container-parser.d.ts.map +1 -1
- package/dist/mmtp-container-parser.js +126 -99
- package/dist/mmtp-container-parser.js.map +4 -4
- package/dist/mmtp-container-parser.no-modules.js +151 -108
- package/dist/mmtp-container-parser.no-modules.js.map +4 -4
- package/dist/mmtp-decode-pipeline.js +126 -99
- package/dist/mmtp-decode-pipeline.js.map +4 -4
- package/dist/mmtp-router.d.ts +51 -29
- package/dist/mmtp-router.d.ts.map +1 -1
- package/dist/mmtp-router.js +260 -326
- package/dist/mmtp-router.js.map +4 -4
- package/dist/multicast-input.js +1 -7
- package/dist/multicast-input.js.map +4 -4
- package/dist/multicast-manager.d.ts +72 -6
- package/dist/multicast-manager.d.ts.map +1 -1
- package/dist/multicast-manager.js +882 -673
- package/dist/multicast-manager.js.map +4 -4
- package/dist/multicast-transport.d.ts +1 -1
- package/dist/multicast-transport.d.ts.map +1 -1
- package/dist/multicast-transport.js +44 -26
- package/dist/multicast-transport.js.map +4 -4
- package/dist/multicast-unwrap.js +29 -35
- package/dist/multicast-unwrap.js.map +4 -4
- package/dist/no-modules.js +147 -106
- package/dist/no-modules.js.map +4 -4
- package/dist/repair-fetch.d.ts +116 -21
- package/dist/repair-fetch.d.ts.map +1 -1
- package/dist/repair-fetch.js +114 -34
- package/dist/repair-fetch.js.map +4 -4
- package/dist/repair-layers.d.ts +18 -7
- package/dist/repair-layers.d.ts.map +1 -1
- package/dist/repair-layers.js +12 -10
- package/dist/repair-layers.js.map +4 -4
- package/dist/signaling.js +2 -11
- package/dist/signaling.js.map +4 -4
- package/dist/timestamp-codec.js +24 -30
- package/dist/timestamp-codec.js.map +4 -4
- package/dist/track-session.d.ts +7 -0
- package/dist/track-session.d.ts.map +1 -1
- package/dist/track-session.js +15 -8
- package/dist/track-session.js.map +2 -2
- package/dist/wasm-mfu-reassembler.js +1 -7
- package/dist/wasm-mfu-reassembler.js.map +4 -4
- package/dist/wasm-mmtp-container-parser.js +126 -99
- package/dist/wasm-mmtp-container-parser.js.map +4 -4
- package/package.json +7 -14
- package/schemas/catalog.schema.json +3 -3
- package/src/carp-catalog.ts +46 -24
- package/src/catalog-fec-params.ts +173 -64
- package/src/cmaf-block-assembler.ts +1 -4
- package/src/cmcd-producer.ts +0 -6
- package/src/delivery-catalog.ts +498 -0
- package/src/delta-fallback-config.ts +72 -0
- package/src/fec-manager.ts +457 -334
- package/src/fec-state.ts +20 -32
- package/src/fec-worker-setup.ts +109 -90
- package/src/index.ts +32 -0
- package/src/media-router.ts +59 -21
- package/src/mmtp-container-parser.ts +106 -20
- package/src/mmtp-router.ts +189 -330
- package/src/multicast-manager.ts +265 -86
- package/src/multicast-transport.ts +16 -9
- package/src/repair-fetch.ts +273 -43
- package/src/repair-layers.ts +28 -8
- package/src/track-session.ts +28 -9
- package/test-vectors/catalog/README.md +37 -17
- package/test-vectors/catalog/negative/fec-block-profile-retired.json +52 -0
- package/test-vectors/catalog/negative/fec-enhancement-repair-removed.json +1 -1
- package/test-vectors/catalog/negative/fec-repair-layer-geometry.json +1 -1
- package/test-vectors/catalog/negative/fec-repair-layer-missing-symbols.json +1 -1
- package/test-vectors/catalog/negative/fec-repair-multiple-depends.json +1 -1
- package/test-vectors/catalog/negative/fec-repair-overlay-with-layer.json +1 -1
- package/test-vectors/catalog/negative/fec-repair-priority-out-of-band.json +1 -1
- package/test-vectors/catalog/negative/fec-repair-source-symbols-without-scope.json +1 -1
- package/test-vectors/catalog/negative/multicast-endpoint-relay-address.json +39 -0
- package/test-vectors/catalog/negative/multicast-network-source-empty.json +1 -1
- package/test-vectors/catalog/negative/raptorq-source-symbols-over-max.json +1 -1
- package/test-vectors/catalog/negative/raptorq-unaligned-symbol.json +1 -1
- package/test-vectors/catalog/positive/fec-layered-repair.json +2 -2
- package/test-vectors/catalog/positive/fec-multicast.json +2 -1
- package/test-vectors/catalog/positive/multicast-amt-manual-relay.json +38 -0
- package/test-vectors/catalog/positive/multicast-native-ssm-no-network-source.json +2 -1
- package/test-vectors/catalog-timing.json +356 -0
- package/test-vectors/catalog-validation.json +40 -5
- package/test-vectors/delivery-catalog/README.md +11 -0
- package/test-vectors/delivery-catalog/negative/missing-block-profile.json +58 -0
- package/test-vectors/delivery-catalog/negative/packet-id-signaling.json +59 -0
- package/test-vectors/delivery-catalog/negative/retired-k-padded-block-profile.json +59 -0
- package/test-vectors/delivery-catalog/positive/dash.json +56 -0
- package/test-vectors/delivery-catalog/positive/mmtp-source-only.json +43 -0
- package/node_modules/@blockcast/fec-worker/README.md +0 -223
- package/node_modules/@blockcast/fec-worker/dist/.build-stamp +0 -0
- package/node_modules/@blockcast/fec-worker/dist/block-order.d.ts +0 -38
- package/node_modules/@blockcast/fec-worker/dist/block-order.d.ts.map +0 -1
- package/node_modules/@blockcast/fec-worker/dist/block-order.js +0 -78
- package/node_modules/@blockcast/fec-worker/dist/block-order.js.map +0 -1
- package/node_modules/@blockcast/fec-worker/dist/fec-worker-client.d.ts +0 -93
- package/node_modules/@blockcast/fec-worker/dist/fec-worker-client.d.ts.map +0 -1
- package/node_modules/@blockcast/fec-worker/dist/fec-worker-client.js +0 -346
- package/node_modules/@blockcast/fec-worker/dist/fec-worker-client.js.map +0 -1
- package/node_modules/@blockcast/fec-worker/dist/fec-worker-types.d.ts +0 -380
- package/node_modules/@blockcast/fec-worker/dist/fec-worker-types.d.ts.map +0 -1
- package/node_modules/@blockcast/fec-worker/dist/fec-worker-types.js +0 -11
- package/node_modules/@blockcast/fec-worker/dist/fec-worker-types.js.map +0 -1
- package/node_modules/@blockcast/fec-worker/dist/fec-worker.d.ts +0 -14
- package/node_modules/@blockcast/fec-worker/dist/fec-worker.d.ts.map +0 -1
- package/node_modules/@blockcast/fec-worker/dist/fec-worker.js +0 -859
- package/node_modules/@blockcast/fec-worker/dist/fec-worker.js.map +0 -7
- package/node_modules/@blockcast/fec-worker/dist/index.d.ts +0 -10
- package/node_modules/@blockcast/fec-worker/dist/index.d.ts.map +0 -1
- package/node_modules/@blockcast/fec-worker/dist/index.js +0 -8
- package/node_modules/@blockcast/fec-worker/dist/index.js.map +0 -1
- package/node_modules/@blockcast/fec-worker/dist/shred-fec-worker.d.ts +0 -20
- package/node_modules/@blockcast/fec-worker/dist/shred-fec-worker.d.ts.map +0 -1
- package/node_modules/@blockcast/fec-worker/dist/shred-fec-worker.js +0 -370
- package/node_modules/@blockcast/fec-worker/dist/shred-fec-worker.js.map +0 -7
- package/node_modules/@blockcast/fec-worker/dist/shred-worker-client.d.ts +0 -104
- package/node_modules/@blockcast/fec-worker/dist/shred-worker-client.d.ts.map +0 -1
- package/node_modules/@blockcast/fec-worker/dist/shred-worker-client.js +0 -181
- package/node_modules/@blockcast/fec-worker/dist/shred-worker-client.js.map +0 -1
- package/node_modules/@blockcast/fec-worker/dist/shred-worker-types.d.ts +0 -194
- package/node_modules/@blockcast/fec-worker/dist/shred-worker-types.d.ts.map +0 -1
- package/node_modules/@blockcast/fec-worker/dist/shred-worker-types.js +0 -62
- package/node_modules/@blockcast/fec-worker/dist/shred-worker-types.js.map +0 -1
- package/node_modules/@blockcast/fec-worker/dist/transfer.d.ts +0 -9
- package/node_modules/@blockcast/fec-worker/dist/transfer.d.ts.map +0 -1
- package/node_modules/@blockcast/fec-worker/dist/transfer.js +0 -13
- package/node_modules/@blockcast/fec-worker/dist/transfer.js.map +0 -1
- package/node_modules/@blockcast/fec-worker/package.json +0 -59
- package/node_modules/@blockcast/fec-worker/src/block-order.ts +0 -93
- package/node_modules/@blockcast/fec-worker/src/fec-worker-client.ts +0 -392
- package/node_modules/@blockcast/fec-worker/src/fec-worker-types.ts +0 -399
- package/node_modules/@blockcast/fec-worker/src/fec-worker.ts +0 -1502
- package/node_modules/@blockcast/fec-worker/src/index.ts +0 -35
- package/node_modules/@blockcast/fec-worker/src/shred-fec-worker.ts +0 -589
- package/node_modules/@blockcast/fec-worker/src/shred-worker-client.ts +0 -222
- package/node_modules/@blockcast/fec-worker/src/shred-worker-types.ts +0 -209
- package/node_modules/@blockcast/fec-worker/src/transfer.ts +0 -12
- package/node_modules/@blockcast/mmt-alta-parse/README.md +0 -181
- package/node_modules/@blockcast/mmt-alta-parse/dist/.build-stamp +0 -0
- package/node_modules/@blockcast/mmt-alta-parse/dist/index.d.ts +0 -57
- package/node_modules/@blockcast/mmt-alta-parse/dist/index.d.ts.map +0 -1
- package/node_modules/@blockcast/mmt-alta-parse/dist/index.js +0 -115
- package/node_modules/@blockcast/mmt-alta-parse/dist/index.js.map +0 -1
- package/node_modules/@blockcast/mmt-alta-parse/package.json +0 -50
- package/node_modules/@blockcast/mmt-alta-parse/src/index.ts +0 -136
- package/node_modules/@blockcast/mmt-base/README.md +0 -134
- package/node_modules/@blockcast/mmt-base/dist/.build-stamp +0 -0
- package/node_modules/@blockcast/mmt-base/dist/fec-block-profile.d.ts +0 -55
- package/node_modules/@blockcast/mmt-base/dist/fec-block-profile.d.ts.map +0 -1
- package/node_modules/@blockcast/mmt-base/dist/fec-block-profile.js +0 -128
- package/node_modules/@blockcast/mmt-base/dist/fec-block-profile.js.map +0 -1
- package/node_modules/@blockcast/mmt-base/dist/index.d.ts +0 -7
- package/node_modules/@blockcast/mmt-base/dist/index.d.ts.map +0 -1
- package/node_modules/@blockcast/mmt-base/dist/index.js +0 -7
- package/node_modules/@blockcast/mmt-base/dist/index.js.map +0 -1
- package/node_modules/@blockcast/mmt-base/dist/mmtp.d.ts +0 -292
- package/node_modules/@blockcast/mmt-base/dist/mmtp.d.ts.map +0 -1
- package/node_modules/@blockcast/mmt-base/dist/mmtp.js +0 -612
- package/node_modules/@blockcast/mmt-base/dist/mmtp.js.map +0 -1
- package/node_modules/@blockcast/mmt-base/dist/net-constants.d.ts +0 -18
- package/node_modules/@blockcast/mmt-base/dist/net-constants.d.ts.map +0 -1
- package/node_modules/@blockcast/mmt-base/dist/net-constants.js +0 -18
- package/node_modules/@blockcast/mmt-base/dist/net-constants.js.map +0 -1
- package/node_modules/@blockcast/mmt-base/dist/ntp-short.d.ts +0 -47
- package/node_modules/@blockcast/mmt-base/dist/ntp-short.d.ts.map +0 -1
- package/node_modules/@blockcast/mmt-base/dist/ntp-short.js +0 -54
- package/node_modules/@blockcast/mmt-base/dist/ntp-short.js.map +0 -1
- package/node_modules/@blockcast/mmt-base/dist/serial-number.d.ts +0 -57
- package/node_modules/@blockcast/mmt-base/dist/serial-number.d.ts.map +0 -1
- package/node_modules/@blockcast/mmt-base/dist/serial-number.js +0 -98
- package/node_modules/@blockcast/mmt-base/dist/serial-number.js.map +0 -1
- package/node_modules/@blockcast/mmt-base/dist/signalling.d.ts +0 -312
- package/node_modules/@blockcast/mmt-base/dist/signalling.d.ts.map +0 -1
- package/node_modules/@blockcast/mmt-base/dist/signalling.js +0 -637
- package/node_modules/@blockcast/mmt-base/dist/signalling.js.map +0 -1
- package/node_modules/@blockcast/mmt-base/package.json +0 -49
- package/node_modules/@blockcast/mmt-base/src/fec-block-profile.ts +0 -145
- package/node_modules/@blockcast/mmt-base/src/index.ts +0 -6
- package/node_modules/@blockcast/mmt-base/src/mmtp.ts +0 -892
- package/node_modules/@blockcast/mmt-base/src/net-constants.ts +0 -17
- package/node_modules/@blockcast/mmt-base/src/ntp-short.ts +0 -67
- package/node_modules/@blockcast/mmt-base/src/serial-number.ts +0 -107
- package/node_modules/@blockcast/mmt-base/src/signalling.ts +0 -862
- package/node_modules/@blockcast/mmt-fec/README.md +0 -271
- package/node_modules/@blockcast/mmt-fec/dist/.build-stamp +0 -0
- package/node_modules/@blockcast/mmt-fec/dist/block-manager.d.ts +0 -82
- package/node_modules/@blockcast/mmt-fec/dist/block-manager.d.ts.map +0 -1
- package/node_modules/@blockcast/mmt-fec/dist/block-manager.js +0 -296
- package/node_modules/@blockcast/mmt-fec/dist/block-manager.js.map +0 -1
- package/node_modules/@blockcast/mmt-fec/dist/block-processor.d.ts +0 -106
- package/node_modules/@blockcast/mmt-fec/dist/block-processor.d.ts.map +0 -1
- package/node_modules/@blockcast/mmt-fec/dist/block-processor.js +0 -288
- package/node_modules/@blockcast/mmt-fec/dist/block-processor.js.map +0 -1
- package/node_modules/@blockcast/mmt-fec/dist/cmaf-recovery.d.ts +0 -46
- package/node_modules/@blockcast/mmt-fec/dist/cmaf-recovery.d.ts.map +0 -1
- package/node_modules/@blockcast/mmt-fec/dist/cmaf-recovery.js +0 -96
- package/node_modules/@blockcast/mmt-fec/dist/cmaf-recovery.js.map +0 -1
- package/node_modules/@blockcast/mmt-fec/dist/cmaf-symbols.d.ts +0 -33
- package/node_modules/@blockcast/mmt-fec/dist/cmaf-symbols.d.ts.map +0 -1
- package/node_modules/@blockcast/mmt-fec/dist/cmaf-symbols.js +0 -57
- package/node_modules/@blockcast/mmt-fec/dist/cmaf-symbols.js.map +0 -1
- package/node_modules/@blockcast/mmt-fec/dist/fec-block-mapper.d.ts +0 -205
- package/node_modules/@blockcast/mmt-fec/dist/fec-block-mapper.d.ts.map +0 -1
- package/node_modules/@blockcast/mmt-fec/dist/fec-block-mapper.js +0 -240
- package/node_modules/@blockcast/mmt-fec/dist/fec-block-mapper.js.map +0 -1
- package/node_modules/@blockcast/mmt-fec/dist/index.d.ts +0 -28
- package/node_modules/@blockcast/mmt-fec/dist/index.d.ts.map +0 -1
- package/node_modules/@blockcast/mmt-fec/dist/index.js +0 -28
- package/node_modules/@blockcast/mmt-fec/dist/index.js.map +0 -1
- package/node_modules/@blockcast/mmt-fec/dist/loc-symbols.d.ts +0 -20
- package/node_modules/@blockcast/mmt-fec/dist/loc-symbols.d.ts.map +0 -1
- package/node_modules/@blockcast/mmt-fec/dist/loc-symbols.js +0 -28
- package/node_modules/@blockcast/mmt-fec/dist/loc-symbols.js.map +0 -1
- package/node_modules/@blockcast/mmt-fec/dist/oti.d.ts +0 -258
- package/node_modules/@blockcast/mmt-fec/dist/oti.d.ts.map +0 -1
- package/node_modules/@blockcast/mmt-fec/dist/oti.js +0 -382
- package/node_modules/@blockcast/mmt-fec/dist/oti.js.map +0 -1
- package/node_modules/@blockcast/mmt-fec/dist/reorder-buffer.d.ts +0 -41
- package/node_modules/@blockcast/mmt-fec/dist/reorder-buffer.d.ts.map +0 -1
- package/node_modules/@blockcast/mmt-fec/dist/reorder-buffer.js +0 -81
- package/node_modules/@blockcast/mmt-fec/dist/reorder-buffer.js.map +0 -1
- package/node_modules/@blockcast/mmt-fec/dist/repair-group.d.ts +0 -82
- package/node_modules/@blockcast/mmt-fec/dist/repair-group.d.ts.map +0 -1
- package/node_modules/@blockcast/mmt-fec/dist/repair-group.js +0 -170
- package/node_modules/@blockcast/mmt-fec/dist/repair-group.js.map +0 -1
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/README.md +0 -181
- 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 +0 -57
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/dist/index.d.ts.map +0 -1
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/dist/index.js +0 -115
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/dist/index.js.map +0 -1
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/package.json +0 -50
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/src/index.ts +0 -136
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/README.md +0 -134
- 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 +0 -55
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/fec-block-profile.d.ts.map +0 -1
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/fec-block-profile.js +0 -128
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/fec-block-profile.js.map +0 -1
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/index.d.ts +0 -7
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/index.d.ts.map +0 -1
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/index.js +0 -7
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/index.js.map +0 -1
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/mmtp.d.ts +0 -292
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/mmtp.d.ts.map +0 -1
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/mmtp.js +0 -612
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/mmtp.js.map +0 -1
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/net-constants.d.ts +0 -18
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/net-constants.d.ts.map +0 -1
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/net-constants.js +0 -18
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/net-constants.js.map +0 -1
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/ntp-short.d.ts +0 -47
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/ntp-short.d.ts.map +0 -1
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/ntp-short.js +0 -54
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/ntp-short.js.map +0 -1
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/serial-number.d.ts +0 -57
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/serial-number.d.ts.map +0 -1
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/serial-number.js +0 -98
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/serial-number.js.map +0 -1
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/signalling.d.ts +0 -312
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/signalling.d.ts.map +0 -1
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/signalling.js +0 -637
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/signalling.js.map +0 -1
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/package.json +0 -49
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/src/fec-block-profile.ts +0 -145
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/src/index.ts +0 -6
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/src/mmtp.ts +0 -892
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/src/net-constants.ts +0 -17
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/src/ntp-short.ts +0 -67
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/src/serial-number.ts +0 -107
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/src/signalling.ts +0 -862
- package/node_modules/@blockcast/mmt-fec/package.json +0 -79
- package/node_modules/@blockcast/mmt-fec/src/block-manager.ts +0 -371
- package/node_modules/@blockcast/mmt-fec/src/block-processor.ts +0 -439
- package/node_modules/@blockcast/mmt-fec/src/cmaf-recovery.ts +0 -127
- package/node_modules/@blockcast/mmt-fec/src/cmaf-symbols.ts +0 -68
- package/node_modules/@blockcast/mmt-fec/src/fec-block-mapper.ts +0 -310
- package/node_modules/@blockcast/mmt-fec/src/index.ts +0 -94
- package/node_modules/@blockcast/mmt-fec/src/loc-symbols.ts +0 -34
- package/node_modules/@blockcast/mmt-fec/src/oti.ts +0 -463
- package/node_modules/@blockcast/mmt-fec/src/reorder-buffer.ts +0 -101
- package/node_modules/@blockcast/mmt-fec/src/repair-group.ts +0 -195
- package/node_modules/@blockcast/mmt-manifest-verify/dist/.build-stamp +0 -0
- package/node_modules/@blockcast/mmt-manifest-verify/dist/admission.d.ts +0 -28
- package/node_modules/@blockcast/mmt-manifest-verify/dist/admission.d.ts.map +0 -1
- package/node_modules/@blockcast/mmt-manifest-verify/dist/admission.js +0 -128
- package/node_modules/@blockcast/mmt-manifest-verify/dist/admission.js.map +0 -1
- package/node_modules/@blockcast/mmt-manifest-verify/dist/index.d.ts +0 -4
- package/node_modules/@blockcast/mmt-manifest-verify/dist/index.d.ts.map +0 -1
- package/node_modules/@blockcast/mmt-manifest-verify/dist/index.js +0 -4
- package/node_modules/@blockcast/mmt-manifest-verify/dist/index.js.map +0 -1
- package/node_modules/@blockcast/mmt-manifest-verify/dist/source-auth.d.ts +0 -37
- package/node_modules/@blockcast/mmt-manifest-verify/dist/source-auth.d.ts.map +0 -1
- package/node_modules/@blockcast/mmt-manifest-verify/dist/source-auth.js +0 -179
- package/node_modules/@blockcast/mmt-manifest-verify/dist/source-auth.js.map +0 -1
- package/node_modules/@blockcast/mmt-manifest-verify/dist/verifier.d.ts +0 -99
- package/node_modules/@blockcast/mmt-manifest-verify/dist/verifier.d.ts.map +0 -1
- package/node_modules/@blockcast/mmt-manifest-verify/dist/verifier.js +0 -492
- package/node_modules/@blockcast/mmt-manifest-verify/dist/verifier.js.map +0 -1
- package/node_modules/@blockcast/mmt-manifest-verify/package.json +0 -45
- package/node_modules/@blockcast/mmt-manifest-verify/src/admission.ts +0 -171
- package/node_modules/@blockcast/mmt-manifest-verify/src/index.ts +0 -3
- package/node_modules/@blockcast/mmt-manifest-verify/src/source-auth.ts +0 -230
- package/node_modules/@blockcast/mmt-manifest-verify/src/verifier.ts +0 -669
- package/node_modules/@noble/hashes/LICENSE +0 -21
- package/node_modules/@noble/hashes/README.md +0 -521
- package/node_modules/@noble/hashes/_assert.d.ts +0 -17
- package/node_modules/@noble/hashes/_assert.d.ts.map +0 -1
- package/node_modules/@noble/hashes/_assert.js +0 -18
- package/node_modules/@noble/hashes/_assert.js.map +0 -1
- package/node_modules/@noble/hashes/_blake.d.ts +0 -14
- package/node_modules/@noble/hashes/_blake.d.ts.map +0 -1
- package/node_modules/@noble/hashes/_blake.js +0 -50
- package/node_modules/@noble/hashes/_blake.js.map +0 -1
- package/node_modules/@noble/hashes/_md.d.ts +0 -51
- package/node_modules/@noble/hashes/_md.d.ts.map +0 -1
- package/node_modules/@noble/hashes/_md.js +0 -162
- package/node_modules/@noble/hashes/_md.js.map +0 -1
- package/node_modules/@noble/hashes/_u64.d.ts +0 -55
- package/node_modules/@noble/hashes/_u64.d.ts.map +0 -1
- package/node_modules/@noble/hashes/_u64.js +0 -90
- package/node_modules/@noble/hashes/_u64.js.map +0 -1
- package/node_modules/@noble/hashes/argon2.d.ts +0 -32
- package/node_modules/@noble/hashes/argon2.d.ts.map +0 -1
- package/node_modules/@noble/hashes/argon2.js +0 -401
- package/node_modules/@noble/hashes/argon2.js.map +0 -1
- package/node_modules/@noble/hashes/blake1.d.ts +0 -106
- package/node_modules/@noble/hashes/blake1.d.ts.map +0 -1
- package/node_modules/@noble/hashes/blake1.js +0 -459
- package/node_modules/@noble/hashes/blake1.js.map +0 -1
- package/node_modules/@noble/hashes/blake2.d.ts +0 -116
- package/node_modules/@noble/hashes/blake2.d.ts.map +0 -1
- package/node_modules/@noble/hashes/blake2.js +0 -420
- package/node_modules/@noble/hashes/blake2.js.map +0 -1
- package/node_modules/@noble/hashes/blake2b.d.ts +0 -11
- package/node_modules/@noble/hashes/blake2b.d.ts.map +0 -1
- package/node_modules/@noble/hashes/blake2b.js +0 -14
- package/node_modules/@noble/hashes/blake2b.js.map +0 -1
- package/node_modules/@noble/hashes/blake2s.d.ts +0 -20
- package/node_modules/@noble/hashes/blake2s.d.ts.map +0 -1
- package/node_modules/@noble/hashes/blake2s.js +0 -24
- package/node_modules/@noble/hashes/blake2s.js.map +0 -1
- package/node_modules/@noble/hashes/blake3.d.ts +0 -54
- package/node_modules/@noble/hashes/blake3.d.ts.map +0 -1
- package/node_modules/@noble/hashes/blake3.js +0 -255
- package/node_modules/@noble/hashes/blake3.js.map +0 -1
- package/node_modules/@noble/hashes/crypto.d.ts +0 -2
- package/node_modules/@noble/hashes/crypto.d.ts.map +0 -1
- package/node_modules/@noble/hashes/crypto.js +0 -5
- package/node_modules/@noble/hashes/crypto.js.map +0 -1
- package/node_modules/@noble/hashes/cryptoNode.d.ts +0 -2
- package/node_modules/@noble/hashes/cryptoNode.d.ts.map +0 -1
- package/node_modules/@noble/hashes/cryptoNode.js +0 -18
- package/node_modules/@noble/hashes/cryptoNode.js.map +0 -1
- package/node_modules/@noble/hashes/eskdf.d.ts +0 -47
- package/node_modules/@noble/hashes/eskdf.d.ts.map +0 -1
- package/node_modules/@noble/hashes/eskdf.js +0 -166
- package/node_modules/@noble/hashes/eskdf.js.map +0 -1
- package/node_modules/@noble/hashes/esm/_assert.d.ts +0 -17
- package/node_modules/@noble/hashes/esm/_assert.d.ts.map +0 -1
- package/node_modules/@noble/hashes/esm/_assert.js +0 -15
- package/node_modules/@noble/hashes/esm/_assert.js.map +0 -1
- package/node_modules/@noble/hashes/esm/_blake.d.ts +0 -14
- package/node_modules/@noble/hashes/esm/_blake.d.ts.map +0 -1
- package/node_modules/@noble/hashes/esm/_blake.js +0 -45
- package/node_modules/@noble/hashes/esm/_blake.js.map +0 -1
- package/node_modules/@noble/hashes/esm/_md.d.ts +0 -51
- package/node_modules/@noble/hashes/esm/_md.d.ts.map +0 -1
- package/node_modules/@noble/hashes/esm/_md.js +0 -155
- package/node_modules/@noble/hashes/esm/_md.js.map +0 -1
- package/node_modules/@noble/hashes/esm/_u64.d.ts +0 -55
- package/node_modules/@noble/hashes/esm/_u64.d.ts.map +0 -1
- package/node_modules/@noble/hashes/esm/_u64.js +0 -67
- package/node_modules/@noble/hashes/esm/_u64.js.map +0 -1
- package/node_modules/@noble/hashes/esm/argon2.d.ts +0 -32
- package/node_modules/@noble/hashes/esm/argon2.d.ts.map +0 -1
- package/node_modules/@noble/hashes/esm/argon2.js +0 -392
- package/node_modules/@noble/hashes/esm/argon2.js.map +0 -1
- package/node_modules/@noble/hashes/esm/blake1.d.ts +0 -106
- package/node_modules/@noble/hashes/esm/blake1.d.ts.map +0 -1
- package/node_modules/@noble/hashes/esm/blake1.js +0 -452
- package/node_modules/@noble/hashes/esm/blake1.js.map +0 -1
- package/node_modules/@noble/hashes/esm/blake2.d.ts +0 -116
- package/node_modules/@noble/hashes/esm/blake2.d.ts.map +0 -1
- package/node_modules/@noble/hashes/esm/blake2.js +0 -413
- package/node_modules/@noble/hashes/esm/blake2.js.map +0 -1
- package/node_modules/@noble/hashes/esm/blake2b.d.ts +0 -11
- package/node_modules/@noble/hashes/esm/blake2b.d.ts.map +0 -1
- package/node_modules/@noble/hashes/esm/blake2b.js +0 -11
- package/node_modules/@noble/hashes/esm/blake2b.js.map +0 -1
- package/node_modules/@noble/hashes/esm/blake2s.d.ts +0 -20
- package/node_modules/@noble/hashes/esm/blake2s.d.ts.map +0 -1
- package/node_modules/@noble/hashes/esm/blake2s.js +0 -21
- package/node_modules/@noble/hashes/esm/blake2s.js.map +0 -1
- package/node_modules/@noble/hashes/esm/blake3.d.ts +0 -54
- package/node_modules/@noble/hashes/esm/blake3.d.ts.map +0 -1
- package/node_modules/@noble/hashes/esm/blake3.js +0 -251
- package/node_modules/@noble/hashes/esm/blake3.js.map +0 -1
- package/node_modules/@noble/hashes/esm/crypto.d.ts +0 -2
- package/node_modules/@noble/hashes/esm/crypto.d.ts.map +0 -1
- package/node_modules/@noble/hashes/esm/crypto.js +0 -2
- package/node_modules/@noble/hashes/esm/crypto.js.map +0 -1
- package/node_modules/@noble/hashes/esm/cryptoNode.d.ts +0 -2
- package/node_modules/@noble/hashes/esm/cryptoNode.d.ts.map +0 -1
- package/node_modules/@noble/hashes/esm/cryptoNode.js +0 -15
- package/node_modules/@noble/hashes/esm/cryptoNode.js.map +0 -1
- package/node_modules/@noble/hashes/esm/eskdf.d.ts +0 -47
- package/node_modules/@noble/hashes/esm/eskdf.d.ts.map +0 -1
- package/node_modules/@noble/hashes/esm/eskdf.js +0 -160
- package/node_modules/@noble/hashes/esm/eskdf.js.map +0 -1
- package/node_modules/@noble/hashes/esm/hkdf.d.ts +0 -36
- package/node_modules/@noble/hashes/esm/hkdf.d.ts.map +0 -1
- package/node_modules/@noble/hashes/esm/hkdf.js +0 -82
- package/node_modules/@noble/hashes/esm/hkdf.js.map +0 -1
- package/node_modules/@noble/hashes/esm/hmac.d.ts +0 -35
- package/node_modules/@noble/hashes/esm/hmac.d.ts.map +0 -1
- package/node_modules/@noble/hashes/esm/hmac.js +0 -86
- package/node_modules/@noble/hashes/esm/hmac.js.map +0 -1
- package/node_modules/@noble/hashes/esm/index.d.ts +0 -2
- package/node_modules/@noble/hashes/esm/index.d.ts.map +0 -1
- package/node_modules/@noble/hashes/esm/index.js +0 -33
- package/node_modules/@noble/hashes/esm/index.js.map +0 -1
- package/node_modules/@noble/hashes/esm/legacy.d.ts +0 -71
- package/node_modules/@noble/hashes/esm/legacy.d.ts.map +0 -1
- package/node_modules/@noble/hashes/esm/legacy.js +0 -281
- package/node_modules/@noble/hashes/esm/legacy.js.map +0 -1
- package/node_modules/@noble/hashes/esm/package.json +0 -10
- package/node_modules/@noble/hashes/esm/pbkdf2.d.ts +0 -23
- package/node_modules/@noble/hashes/esm/pbkdf2.d.ts.map +0 -1
- package/node_modules/@noble/hashes/esm/pbkdf2.js +0 -97
- package/node_modules/@noble/hashes/esm/pbkdf2.js.map +0 -1
- package/node_modules/@noble/hashes/esm/ripemd160.d.ts +0 -13
- package/node_modules/@noble/hashes/esm/ripemd160.d.ts.map +0 -1
- package/node_modules/@noble/hashes/esm/ripemd160.js +0 -13
- package/node_modules/@noble/hashes/esm/ripemd160.js.map +0 -1
- package/node_modules/@noble/hashes/esm/scrypt.d.ts +0 -34
- package/node_modules/@noble/hashes/esm/scrypt.d.ts.map +0 -1
- package/node_modules/@noble/hashes/esm/scrypt.js +0 -228
- package/node_modules/@noble/hashes/esm/scrypt.js.map +0 -1
- package/node_modules/@noble/hashes/esm/sha1.d.ts +0 -11
- package/node_modules/@noble/hashes/esm/sha1.d.ts.map +0 -1
- package/node_modules/@noble/hashes/esm/sha1.js +0 -11
- package/node_modules/@noble/hashes/esm/sha1.js.map +0 -1
- package/node_modules/@noble/hashes/esm/sha2.d.ts +0 -159
- package/node_modules/@noble/hashes/esm/sha2.d.ts.map +0 -1
- package/node_modules/@noble/hashes/esm/sha2.js +0 -375
- package/node_modules/@noble/hashes/esm/sha2.js.map +0 -1
- package/node_modules/@noble/hashes/esm/sha256.d.ts +0 -20
- package/node_modules/@noble/hashes/esm/sha256.d.ts.map +0 -1
- package/node_modules/@noble/hashes/esm/sha256.js +0 -20
- package/node_modules/@noble/hashes/esm/sha256.js.map +0 -1
- package/node_modules/@noble/hashes/esm/sha3-addons.d.ts +0 -142
- package/node_modules/@noble/hashes/esm/sha3-addons.d.ts.map +0 -1
- package/node_modules/@noble/hashes/esm/sha3-addons.js +0 -393
- package/node_modules/@noble/hashes/esm/sha3-addons.js.map +0 -1
- package/node_modules/@noble/hashes/esm/sha3.d.ts +0 -53
- package/node_modules/@noble/hashes/esm/sha3.d.ts.map +0 -1
- package/node_modules/@noble/hashes/esm/sha3.js +0 -234
- package/node_modules/@noble/hashes/esm/sha3.js.map +0 -1
- package/node_modules/@noble/hashes/esm/sha512.d.ts +0 -26
- package/node_modules/@noble/hashes/esm/sha512.d.ts.map +0 -1
- package/node_modules/@noble/hashes/esm/sha512.js +0 -26
- package/node_modules/@noble/hashes/esm/sha512.js.map +0 -1
- package/node_modules/@noble/hashes/esm/utils.d.ts +0 -161
- package/node_modules/@noble/hashes/esm/utils.d.ts.map +0 -1
- package/node_modules/@noble/hashes/esm/utils.js +0 -281
- package/node_modules/@noble/hashes/esm/utils.js.map +0 -1
- package/node_modules/@noble/hashes/hkdf.d.ts +0 -36
- package/node_modules/@noble/hashes/hkdf.d.ts.map +0 -1
- package/node_modules/@noble/hashes/hkdf.js +0 -88
- package/node_modules/@noble/hashes/hkdf.js.map +0 -1
- package/node_modules/@noble/hashes/hmac.d.ts +0 -35
- package/node_modules/@noble/hashes/hmac.d.ts.map +0 -1
- package/node_modules/@noble/hashes/hmac.js +0 -91
- package/node_modules/@noble/hashes/hmac.js.map +0 -1
- package/node_modules/@noble/hashes/index.d.ts +0 -1
- package/node_modules/@noble/hashes/index.d.ts.map +0 -1
- package/node_modules/@noble/hashes/index.js +0 -33
- package/node_modules/@noble/hashes/index.js.map +0 -1
- package/node_modules/@noble/hashes/legacy.d.ts +0 -71
- package/node_modules/@noble/hashes/legacy.d.ts.map +0 -1
- package/node_modules/@noble/hashes/legacy.js +0 -287
- package/node_modules/@noble/hashes/legacy.js.map +0 -1
- package/node_modules/@noble/hashes/package.json +0 -266
- package/node_modules/@noble/hashes/pbkdf2.d.ts +0 -23
- package/node_modules/@noble/hashes/pbkdf2.d.ts.map +0 -1
- package/node_modules/@noble/hashes/pbkdf2.js +0 -101
- package/node_modules/@noble/hashes/pbkdf2.js.map +0 -1
- package/node_modules/@noble/hashes/ripemd160.d.ts +0 -13
- package/node_modules/@noble/hashes/ripemd160.d.ts.map +0 -1
- package/node_modules/@noble/hashes/ripemd160.js +0 -16
- package/node_modules/@noble/hashes/ripemd160.js.map +0 -1
- package/node_modules/@noble/hashes/scrypt.d.ts +0 -34
- package/node_modules/@noble/hashes/scrypt.d.ts.map +0 -1
- package/node_modules/@noble/hashes/scrypt.js +0 -232
- package/node_modules/@noble/hashes/scrypt.js.map +0 -1
- package/node_modules/@noble/hashes/sha1.d.ts +0 -11
- package/node_modules/@noble/hashes/sha1.d.ts.map +0 -1
- package/node_modules/@noble/hashes/sha1.js +0 -14
- package/node_modules/@noble/hashes/sha1.js.map +0 -1
- package/node_modules/@noble/hashes/sha2.d.ts +0 -159
- package/node_modules/@noble/hashes/sha2.d.ts.map +0 -1
- package/node_modules/@noble/hashes/sha2.js +0 -384
- package/node_modules/@noble/hashes/sha2.js.map +0 -1
- package/node_modules/@noble/hashes/sha256.d.ts +0 -20
- package/node_modules/@noble/hashes/sha256.d.ts.map +0 -1
- package/node_modules/@noble/hashes/sha256.js +0 -23
- package/node_modules/@noble/hashes/sha256.js.map +0 -1
- package/node_modules/@noble/hashes/sha3-addons.d.ts +0 -142
- package/node_modules/@noble/hashes/sha3-addons.d.ts.map +0 -1
- package/node_modules/@noble/hashes/sha3-addons.js +0 -402
- package/node_modules/@noble/hashes/sha3-addons.js.map +0 -1
- package/node_modules/@noble/hashes/sha3.d.ts +0 -53
- package/node_modules/@noble/hashes/sha3.d.ts.map +0 -1
- package/node_modules/@noble/hashes/sha3.js +0 -239
- package/node_modules/@noble/hashes/sha3.js.map +0 -1
- package/node_modules/@noble/hashes/sha512.d.ts +0 -26
- package/node_modules/@noble/hashes/sha512.d.ts.map +0 -1
- package/node_modules/@noble/hashes/sha512.js +0 -29
- package/node_modules/@noble/hashes/sha512.js.map +0 -1
- package/node_modules/@noble/hashes/src/_assert.ts +0 -22
- package/node_modules/@noble/hashes/src/_blake.ts +0 -50
- package/node_modules/@noble/hashes/src/_md.ts +0 -176
- package/node_modules/@noble/hashes/src/_u64.ts +0 -91
- package/node_modules/@noble/hashes/src/argon2.ts +0 -497
- package/node_modules/@noble/hashes/src/blake1.ts +0 -534
- package/node_modules/@noble/hashes/src/blake2.ts +0 -486
- package/node_modules/@noble/hashes/src/blake2b.ts +0 -10
- package/node_modules/@noble/hashes/src/blake2s.ts +0 -20
- package/node_modules/@noble/hashes/src/blake3.ts +0 -272
- package/node_modules/@noble/hashes/src/crypto.ts +0 -9
- package/node_modules/@noble/hashes/src/cryptoNode.ts +0 -15
- package/node_modules/@noble/hashes/src/eskdf.ts +0 -187
- package/node_modules/@noble/hashes/src/hkdf.ts +0 -88
- package/node_modules/@noble/hashes/src/hmac.ts +0 -94
- package/node_modules/@noble/hashes/src/index.ts +0 -31
- package/node_modules/@noble/hashes/src/legacy.ts +0 -293
- package/node_modules/@noble/hashes/src/pbkdf2.ts +0 -122
- package/node_modules/@noble/hashes/src/ripemd160.ts +0 -12
- package/node_modules/@noble/hashes/src/scrypt.ts +0 -257
- package/node_modules/@noble/hashes/src/sha1.ts +0 -10
- package/node_modules/@noble/hashes/src/sha2.ts +0 -402
- package/node_modules/@noble/hashes/src/sha256.ts +0 -24
- package/node_modules/@noble/hashes/src/sha3-addons.ts +0 -499
- package/node_modules/@noble/hashes/src/sha3.ts +0 -258
- package/node_modules/@noble/hashes/src/sha512.ts +0 -34
- package/node_modules/@noble/hashes/src/utils.ts +0 -395
- package/node_modules/@noble/hashes/utils.d.ts +0 -161
- package/node_modules/@noble/hashes/utils.d.ts.map +0 -1
- package/node_modules/@noble/hashes/utils.js +0 -313
- package/node_modules/@noble/hashes/utils.js.map +0 -1
package/src/fec-state.ts
CHANGED
|
@@ -15,20 +15,8 @@
|
|
|
15
15
|
|
|
16
16
|
import { isFecBlockProfile } from '@blockcast/mmt-base'
|
|
17
17
|
|
|
18
|
-
/**
|
|
19
|
-
|
|
20
|
-
* (the interactive/gaming floor; broadcast/ATSC 3.0 ranges up to 10000ms).
|
|
21
|
-
*
|
|
22
|
-
* A protocol constant, NOT a tuning knob. Values below this floor are almost
|
|
23
|
-
* certainly a raw frame count (e.g. `2`) that a caller passed when no framerate
|
|
24
|
-
* was available to convert to ms (common on audio tracks). Feeding such a value
|
|
25
|
-
* into computeFecTimeout treats it as `2ms`, yielding a near-zero FEC block
|
|
26
|
-
* timeout that abandons startup FEC blocks before their repair symbols arrive
|
|
27
|
-
* (measured: moqtail startupFailed=4, shaka dropped=5.8% on startup). Timing
|
|
28
|
-
* derivations MUST reject sub-floor values and fall back to the established
|
|
29
|
-
* timeout instead of collapsing.
|
|
30
|
-
*/
|
|
31
|
-
export const MIN_INTERLEAVE_DEPTH_MS = 33
|
|
18
|
+
/** Smallest positive catalog elapsed span; zero/absence means no elapsed deadline. */
|
|
19
|
+
export const MIN_INTERLEAVE_DEPTH_MS = 1
|
|
32
20
|
|
|
33
21
|
/** Why FEC is not protecting this session. */
|
|
34
22
|
export type FecInactiveReason = 'no-catalog-fec' | 'reliable-moq' | 'no-multicast-bridge'
|
|
@@ -112,8 +100,10 @@ function isPositiveSafeInteger(value: unknown): boolean {
|
|
|
112
100
|
* Whether one catalog `fec` block (a hang rendition's `fec` or an MSF/CMSF
|
|
113
101
|
* track's `fec`) declares an FEC instance a receiver can configure: source
|
|
114
102
|
* symbols per block (K) and a symbol size (T) are both positive integers, the
|
|
115
|
-
* algorithm is not `none`,
|
|
116
|
-
* (BLO-35597)
|
|
103
|
+
* algorithm is not `none`, `blockProfile` names the implemented profile
|
|
104
|
+
* `iso-ssbg1-v1` (BLO-35597), and the block carries that profile's usable
|
|
105
|
+
* span field (`isoBlockSpanUsable`); zero/absence still permits in-band FEC. Total: it never throws, and answers false for
|
|
106
|
+
* any other value.
|
|
117
107
|
*
|
|
118
108
|
* `resolveCatalogTrackFec` reads this predicate, so the players' parameters and
|
|
119
109
|
* this state never disagree. Of the blocks this rejects, it returns no FEC
|
|
@@ -127,14 +117,18 @@ function isPositiveSafeInteger(value: unknown): boolean {
|
|
|
127
117
|
* the track's repair subscription.
|
|
128
118
|
*
|
|
129
119
|
* The block profile is part of this predicate because the profile selects the
|
|
130
|
-
* block math and is never defaulted:
|
|
131
|
-
*
|
|
132
|
-
*
|
|
133
|
-
*
|
|
134
|
-
*
|
|
135
|
-
*
|
|
136
|
-
*
|
|
137
|
-
*
|
|
120
|
+
* block math and is never defaulted: draft-ramadan-moq-fec §5.1 defines one,
|
|
121
|
+
* `iso-ssbg1-v1`, and a receiver MUST NOT apply FEC under any other token. The
|
|
122
|
+
* retired `k-padded-v1` is simply not a known profile. `resolveCatalogTrackFec`
|
|
123
|
+
* and `MulticastManager.configureMultiTrack` resolve such a track to no FEC
|
|
124
|
+
* with a typed `TrackFecUnavailable` reason (`catalogFecUnavailable`: code
|
|
125
|
+
* `track_fec_block_profile_unimplemented` for an unimplemented token,
|
|
126
|
+
* `track_fec_block_profile` for an absent one), scoped to that track, so their
|
|
127
|
+
* parameters and this state still agree. The CMSF conformance validator
|
|
128
|
+
* (`validateCmsfMmtpCatalog`) rejects the catalog with the same code. An
|
|
129
|
+
* `iso-ssbg1-v1` instance with an invalid span is likewise unavailable for its
|
|
130
|
+
* track alone. Zero or absence supplies no elapsed deadline and uses bounded
|
|
131
|
+
* receiver-local state while decoding in-band FEC.
|
|
138
132
|
*
|
|
139
133
|
* The repair-contract resolvers (`resolveRepairLayers`) gate a `depends` target
|
|
140
134
|
* on `algorithm` alone and never read a source's `symbolSize`. They check its
|
|
@@ -153,18 +147,12 @@ export function catalogDeclaresFec(fec: unknown): boolean {
|
|
|
153
147
|
)
|
|
154
148
|
}
|
|
155
149
|
|
|
156
|
-
/**
|
|
157
|
-
* Whether a `fec` block that names `iso-ssbg1-v1` carries the block span its
|
|
158
|
-
* block location is bounded by: `interleaveDepthMs`, a finite number of
|
|
159
|
-
* milliseconds no smaller than `MIN_INTERLEAVE_DEPTH_MS`. Without it a receiver
|
|
160
|
-
* cannot bound the sources it holds before a repair states their block, so the
|
|
161
|
-
* instance cannot be configured (BLO-35597). Any other block needs no span here.
|
|
162
|
-
*/
|
|
150
|
+
/** Validate the optional elapsed span without requiring one for in-band FEC. */
|
|
163
151
|
export function isoBlockSpanUsable(fec: unknown): boolean {
|
|
164
152
|
const block = recordOf(fec)
|
|
165
153
|
if (block === undefined || block['blockProfile'] !== 'iso-ssbg1-v1') return true
|
|
166
154
|
const ms = block['interleaveDepthMs']
|
|
167
|
-
return typeof ms === 'number' && Number.
|
|
155
|
+
return ms === undefined || (typeof ms === 'number' && Number.isSafeInteger(ms) && ms >= 0)
|
|
168
156
|
}
|
|
169
157
|
|
|
170
158
|
function requireBoolean(value: unknown, field: string): boolean {
|
package/src/fec-worker-setup.ts
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Wires a FecWorkerClient into a MulticastManager for a specific track.
|
|
5
5
|
* Both moq-lib (`hang-mmt-fec/js/watch/src/element.ts`) and moqtail
|
|
6
6
|
* (`moqtail-private/apps/client-js/src/lib/player.ts`) call this from their
|
|
7
|
-
* SessionManager `fec-setup` handler so the Worker
|
|
7
|
+
* SessionManager `fec-setup` handler so the Worker setup lives in one
|
|
8
8
|
* place instead of being duplicated across ~80 lines per player.
|
|
9
9
|
*
|
|
10
10
|
* Callers are responsible for holding the returned `dispose()` and calling it
|
|
@@ -16,7 +16,11 @@
|
|
|
16
16
|
import { parseFecBlockProfile, type FecBlockProfile } from '@blockcast/mmt-base'
|
|
17
17
|
import type { FecWorkerClient, FecTrackConfig } from '@blockcast/fec-worker'
|
|
18
18
|
import type { MulticastManager } from './multicast-manager.js'
|
|
19
|
-
import {
|
|
19
|
+
import {
|
|
20
|
+
deriveFecRetentionBlocks,
|
|
21
|
+
LOCAL_FEC_RETENTION_BLOCKS,
|
|
22
|
+
LOCAL_FEC_TIMEOUT_MS,
|
|
23
|
+
} from '@blockcast/mmt-fec'
|
|
20
24
|
import { computeFecDeliveryWindowMs } from './track-session.js'
|
|
21
25
|
|
|
22
26
|
/** Asset URLs the helper needs. Callers pass the already-resolved set. */
|
|
@@ -25,8 +29,6 @@ export interface FecWorkerAssetUrls {
|
|
|
25
29
|
fecWorker: string
|
|
26
30
|
/** URL to the RaptorQ WASM module (compiled via compileStreaming). */
|
|
27
31
|
rqWasm: string
|
|
28
|
-
/** URL to the ALTA WASM module. Fetched only when an ALTA key is provided. */
|
|
29
|
-
altaWasm: string
|
|
30
32
|
}
|
|
31
33
|
|
|
32
34
|
export interface FecWorkerSetupOptions {
|
|
@@ -39,13 +41,19 @@ export interface FecWorkerSetupOptions {
|
|
|
39
41
|
/** Track type from catalog. Never inferred from name. */
|
|
40
42
|
trackType: 'video' | 'audio'
|
|
41
43
|
/**
|
|
42
|
-
* The catalog `fec.blockProfile` (BLO-35597). Required
|
|
43
|
-
* `iso-ssbg1-v1
|
|
44
|
+
* The catalog `fec.blockProfile` (BLO-35597). Required and validated with
|
|
45
|
+
* `parseFecBlockProfile`: `iso-ssbg1-v1` is the only FEC block profile, and
|
|
46
|
+
* any other token (the retired `k-padded-v1` included) throws before a
|
|
47
|
+
* Worker is created. Never defaulted, never inferred.
|
|
44
48
|
*/
|
|
45
49
|
fecBlockProfile: FecBlockProfile
|
|
46
|
-
/**
|
|
50
|
+
/**
|
|
51
|
+
* FEC K from catalog: the maximum SSB_length (K_max) of any block. Blocks
|
|
52
|
+
* are variable-length ssbg_mode1 blocks keyed by SS_Start, so K bounds
|
|
53
|
+
* block distance from below; it never strides SS_IDs into blocks.
|
|
54
|
+
*/
|
|
47
55
|
fecK: number
|
|
48
|
-
/** Symbol size in bytes (T)
|
|
56
|
+
/** Symbol size in bytes (T). */
|
|
49
57
|
fecSymbolSize: number
|
|
50
58
|
/** Repair symbols per block (P). */
|
|
51
59
|
fecRepairCount: number
|
|
@@ -57,12 +65,16 @@ export interface FecWorkerSetupOptions {
|
|
|
57
65
|
* `fecRepairCount`, which is the same value on a single-layer track.
|
|
58
66
|
*/
|
|
59
67
|
joinedRepairCount?: number
|
|
60
|
-
/**
|
|
68
|
+
/** Catalog interleave span in integer milliseconds; zero means no span. */
|
|
61
69
|
fecInterleaveMs: number
|
|
62
70
|
/** Explicit catalog jitter/reorder allowance in ms. */
|
|
63
71
|
fecReorderToleranceMs?: number
|
|
64
|
-
/**
|
|
65
|
-
|
|
72
|
+
/**
|
|
73
|
+
* Duration of one FEC media unit in ms (video frame or audio access unit).
|
|
74
|
+
* Required only when the catalog supplies a positive elapsed FEC span. A
|
|
75
|
+
* missing/zero span must not invent a media cadence for its local bound.
|
|
76
|
+
*/
|
|
77
|
+
mediaUnitDurationMs?: number
|
|
66
78
|
/** Optional repair track name (MoQ). Forwarded to FecTrackConfig. */
|
|
67
79
|
repairTrackName?: string
|
|
68
80
|
/** Audio sample rate (optional — audio tracks only). */
|
|
@@ -71,8 +83,6 @@ export interface FecWorkerSetupOptions {
|
|
|
71
83
|
codec?: string
|
|
72
84
|
/** Video framerate (optional metadata forwarded to the worker). */
|
|
73
85
|
framerate?: number
|
|
74
|
-
/** Base64 SPKI public key (optional). Accepts padded/unpadded, std or url-safe alphabet. */
|
|
75
|
-
altaPublicKeySpki?: string
|
|
76
86
|
/** Absolute or origin-relative asset URLs. */
|
|
77
87
|
assetUrls: FecWorkerAssetUrls
|
|
78
88
|
/** Optional FecWorkerClient factory — main use is test injection. */
|
|
@@ -82,8 +92,6 @@ export interface FecWorkerSetupOptions {
|
|
|
82
92
|
export interface FecWorkerSetupResult {
|
|
83
93
|
/** The configured client (already registered with MulticastManager). */
|
|
84
94
|
client: FecWorkerClient
|
|
85
|
-
/** True when the ALTA public key decoded and the ALTA WASM compiled. */
|
|
86
|
-
altaEnabled: boolean
|
|
87
95
|
/** Removes the Worker from MulticastManager routing, then releases it. */
|
|
88
96
|
dispose: () => void
|
|
89
97
|
}
|
|
@@ -100,50 +108,98 @@ export interface FecWorkerSetupResult {
|
|
|
100
108
|
export async function setupFecWorkerForTrack(
|
|
101
109
|
opts: FecWorkerSetupOptions,
|
|
102
110
|
): Promise<FecWorkerSetupResult> {
|
|
103
|
-
//
|
|
104
|
-
//
|
|
105
|
-
//
|
|
106
|
-
//
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
// The guard stays anyway — this is a trust boundary for a catalog-supplied
|
|
113
|
-
// value, and the test `rejects missing media-unit timing instead of using a
|
|
114
|
-
// hardcoded depth` pins it. Not dead code. Cite both by symbol, not by line:
|
|
115
|
-
// a line number here is invalidated by the next edit to the file it points
|
|
116
|
-
// at, and this comment is the guard's only stated defence.
|
|
117
|
-
if (!Number.isFinite(opts.fecInterleaveMs) || opts.fecInterleaveMs <= 0) {
|
|
118
|
-
// Names the catalog field (`fec.interleaveDepthMs`), not the local option
|
|
119
|
-
// (`opts.fecInterleaveMs`), because that is the knob an operator fixes.
|
|
111
|
+
// A zero span is the catalog's no-deadline signal. It still configures the
|
|
112
|
+
// decoder, but its retention and cleanup values are receiver-local. Do not
|
|
113
|
+
// pass it through a timing derivation: that would turn a missing media
|
|
114
|
+
// cadence into a made-up FEC deadline.
|
|
115
|
+
if (
|
|
116
|
+
!Number.isFinite(opts.fecInterleaveMs) ||
|
|
117
|
+
!Number.isSafeInteger(opts.fecInterleaveMs) ||
|
|
118
|
+
opts.fecInterleaveMs < 0
|
|
119
|
+
) {
|
|
120
120
|
throw new Error(
|
|
121
|
-
`[FEC] interleaveDepthMs (opts.fecInterleaveMs) must be finite
|
|
121
|
+
`[FEC] interleaveDepthMs (opts.fecInterleaveMs) must be a finite non-negative integer ` +
|
|
122
122
|
`(got ${opts.fecInterleaveMs})`,
|
|
123
123
|
)
|
|
124
124
|
}
|
|
125
|
-
if (
|
|
125
|
+
if (
|
|
126
|
+
opts.fecReorderToleranceMs !== undefined &&
|
|
127
|
+
(!Number.isFinite(opts.fecReorderToleranceMs) || opts.fecReorderToleranceMs < 0)
|
|
128
|
+
) {
|
|
126
129
|
throw new Error(
|
|
127
|
-
`[FEC]
|
|
130
|
+
`[FEC] fecReorderToleranceMs must be finite and >= 0 ` +
|
|
131
|
+
`(got ${opts.fecReorderToleranceMs})`,
|
|
132
|
+
)
|
|
133
|
+
}
|
|
134
|
+
const hasCatalogTiming = opts.fecInterleaveMs > 0
|
|
135
|
+
const validateWorkerGeometry = (): void => {
|
|
136
|
+
// `computeFecDeliveryWindowMs` used to reject a malformed K as a side
|
|
137
|
+
// effect. The no-span path intentionally skips that timing derivation, so
|
|
138
|
+
// keep decoder geometry validation at this trust boundary before creating
|
|
139
|
+
// a Worker. T is likewise checked here because the Worker receives it
|
|
140
|
+
// through the asynchronous configure message.
|
|
141
|
+
if (!Number.isSafeInteger(opts.fecK) || opts.fecK <= 0) {
|
|
142
|
+
throw new Error(`[FEC] fecK must be a finite positive integer (got ${opts.fecK})`)
|
|
143
|
+
}
|
|
144
|
+
if (
|
|
145
|
+
!Number.isSafeInteger(opts.fecSymbolSize) ||
|
|
146
|
+
opts.fecSymbolSize <= 0 ||
|
|
147
|
+
opts.fecSymbolSize % 8 !== 0
|
|
148
|
+
) {
|
|
149
|
+
throw new Error(
|
|
150
|
+
`[FEC] fecSymbolSize must be a positive 8-byte-aligned integer (got ${opts.fecSymbolSize})`,
|
|
151
|
+
)
|
|
152
|
+
}
|
|
153
|
+
if (!Number.isSafeInteger(opts.fecRepairCount) || opts.fecRepairCount <= 0) {
|
|
154
|
+
throw new Error(
|
|
155
|
+
`[FEC] fecRepairCount must be a finite positive integer (got ${opts.fecRepairCount})`,
|
|
156
|
+
)
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
let deliveryWindowMs: number
|
|
160
|
+
let interleaveDepthBlocks: number
|
|
161
|
+
if (!hasCatalogTiming) {
|
|
162
|
+
validateWorkerGeometry()
|
|
163
|
+
deliveryWindowMs = LOCAL_FEC_TIMEOUT_MS
|
|
164
|
+
interleaveDepthBlocks = LOCAL_FEC_RETENTION_BLOCKS
|
|
165
|
+
} else {
|
|
166
|
+
const mediaUnitDurationMs = opts.mediaUnitDurationMs
|
|
167
|
+
if (
|
|
168
|
+
typeof mediaUnitDurationMs !== 'number' ||
|
|
169
|
+
!Number.isFinite(mediaUnitDurationMs) ||
|
|
170
|
+
mediaUnitDurationMs <= 0
|
|
171
|
+
) {
|
|
172
|
+
throw new Error(
|
|
173
|
+
`[FEC] mediaUnitDurationMs must be finite and > 0 (got ${mediaUnitDurationMs})`,
|
|
174
|
+
)
|
|
175
|
+
}
|
|
176
|
+
validateWorkerGeometry()
|
|
177
|
+
deliveryWindowMs = computeFecDeliveryWindowMs({
|
|
178
|
+
interleaveDepthMs: opts.fecInterleaveMs,
|
|
179
|
+
sourceSymbols: opts.fecK,
|
|
180
|
+
repairSymbols: opts.fecRepairCount,
|
|
181
|
+
symbolSize: opts.fecSymbolSize,
|
|
182
|
+
mediaUnitsPerSecond: 1000 / mediaUnitDurationMs,
|
|
183
|
+
jitterBufferMs: opts.fecReorderToleranceMs,
|
|
184
|
+
})
|
|
185
|
+
// `interleaveDepth` is a decoder block count. It is derived only for a
|
|
186
|
+
// positive catalog span; no-span uses the fixed local count above.
|
|
187
|
+
interleaveDepthBlocks = deriveFecRetentionBlocks(
|
|
188
|
+
deliveryWindowMs,
|
|
189
|
+
opts.fecInterleaveMs,
|
|
128
190
|
)
|
|
129
191
|
}
|
|
130
192
|
const blockProfile = parseFecBlockProfile(
|
|
131
193
|
opts.fecBlockProfile,
|
|
132
194
|
`[FEC] ${opts.trackName} fec.blockProfile`,
|
|
133
195
|
)
|
|
134
|
-
const deliveryWindowMs = computeFecDeliveryWindowMs({
|
|
135
|
-
interleaveDepthMs: opts.fecInterleaveMs,
|
|
136
|
-
sourceSymbols: opts.fecK,
|
|
137
|
-
repairSymbols: opts.fecRepairCount,
|
|
138
|
-
symbolSize: opts.fecSymbolSize,
|
|
139
|
-
mediaUnitsPerSecond: 1000 / opts.mediaUnitDurationMs,
|
|
140
|
-
jitterBufferMs: opts.fecReorderToleranceMs,
|
|
141
|
-
})
|
|
142
196
|
// `FecTrackConfig.interleaveDepth` is a BLOCK COUNT, not D. Every consumer
|
|
143
|
-
// measures
|
|
144
|
-
//
|
|
145
|
-
//
|
|
146
|
-
//
|
|
197
|
+
// measures block distance with it: the worker's `advanceMediaHorizon`
|
|
198
|
+
// retires a block more than `interleaveDepth` blocks behind the live SS_ID
|
|
199
|
+
// (`isoBlocksBehind`, a lower bound from K_max), and `MmtFecDecoder::new`
|
|
200
|
+
// documents its argument as "the number of interleaved blocks" before
|
|
201
|
+
// `cleanup_by_ss_start` retires every block that far behind and counts it
|
|
202
|
+
// `blocks_failed`.
|
|
147
203
|
//
|
|
148
204
|
// `deriveFecInterleaveDepth` returns D — MEDIA UNITS per block — so feeding
|
|
149
205
|
// it here mixed units and sized the retention window in the wrong quantity.
|
|
@@ -161,19 +217,6 @@ export async function setupFecWorkerForTrack(
|
|
|
161
217
|
// On 720p and audio the decoder expired blocks — counting them failed — while
|
|
162
218
|
// the receiver's own deadline for them had not yet passed.
|
|
163
219
|
//
|
|
164
|
-
// Derive the count from the two quantities that define it, so retention
|
|
165
|
-
// always covers the deadline already armed for that block: the blocks that
|
|
166
|
-
// can be in flight within one block's budget, plus the one being filled.
|
|
167
|
-
//
|
|
168
|
-
// `deriveFecRetentionBlocks` is THE one derivation of this horizon -- the
|
|
169
|
-
// FECManager's ordered-relay settlement consumes the same function, so the
|
|
170
|
-
// two cannot drift apart again (BLO-35597 Decision E). It fails closed above
|
|
171
|
-
// the 255 the WASM decoder and the ISO/IEC 23008-1 AL-FEC signaling byte
|
|
172
|
-
// accept, rather than clamping to a retention shorter than this window.
|
|
173
|
-
const interleaveDepthBlocks = deriveFecRetentionBlocks(
|
|
174
|
-
deliveryWindowMs,
|
|
175
|
-
opts.fecInterleaveMs,
|
|
176
|
-
)
|
|
177
220
|
// Resolve URL against location.origin when available (browser runtime).
|
|
178
221
|
// Absolute URLs pass through unchanged per the URL() spec.
|
|
179
222
|
const origin =
|
|
@@ -185,32 +228,9 @@ export async function setupFecWorkerForTrack(
|
|
|
185
228
|
? opts.clientFactory(workerUrl)
|
|
186
229
|
: new FecWorkerCtor.FecWorkerClient(workerUrl)
|
|
187
230
|
|
|
188
|
-
// Compile RaptorQ WASM once
|
|
231
|
+
// Compile RaptorQ WASM once.
|
|
189
232
|
const rqWasm = await WebAssembly.compileStreaming(fetch(opts.assetUrls.rqWasm))
|
|
190
233
|
|
|
191
|
-
let altaKeyBuffer: ArrayBuffer | undefined
|
|
192
|
-
let altaWasmModule: WebAssembly.Module | undefined
|
|
193
|
-
if (opts.altaPublicKeySpki) {
|
|
194
|
-
const b64 = opts.altaPublicKeySpki.replace(/-/g, '+').replace(/_/g, '/')
|
|
195
|
-
const padded = b64.padEnd(Math.ceil(b64.length / 4) * 4, '=')
|
|
196
|
-
try {
|
|
197
|
-
const keyBytes = Uint8Array.from(atob(padded), c => c.charCodeAt(0))
|
|
198
|
-
// SPKI size range: Ed25519=44, P-256=91; tolerate 32..=256 for forward-compat.
|
|
199
|
-
if (keyBytes.length >= 32 && keyBytes.length <= 256) {
|
|
200
|
-
altaKeyBuffer = keyBytes.buffer
|
|
201
|
-
altaWasmModule = await WebAssembly.compileStreaming(fetch(opts.assetUrls.altaWasm))
|
|
202
|
-
} else {
|
|
203
|
-
console.warn(
|
|
204
|
-
`[fec-worker-setup] ALTA SPKI wrong length for "${opts.trackName}": ` +
|
|
205
|
-
`${keyBytes.length} (expected 32..256) — ALTA disabled`,
|
|
206
|
-
)
|
|
207
|
-
}
|
|
208
|
-
} catch (e) {
|
|
209
|
-
console.warn(`[fec-worker-setup] ALTA key decode / WASM compile failed for "${opts.trackName}":`, e)
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
const altaEnabled = !!(altaKeyBuffer && altaWasmModule)
|
|
214
234
|
const fecTrackConfig = {
|
|
215
235
|
codec: opts.codec ?? 'unknown',
|
|
216
236
|
trackName: opts.trackName,
|
|
@@ -229,20 +249,20 @@ export async function setupFecWorkerForTrack(
|
|
|
229
249
|
deliveryWindowMs,
|
|
230
250
|
fecMode: 'subframe' as const,
|
|
231
251
|
repairTrack: opts.repairTrackName,
|
|
232
|
-
altaEnabled,
|
|
233
252
|
relayBlockSigEnabled: false,
|
|
234
253
|
} as unknown as FecTrackConfig
|
|
235
254
|
|
|
236
|
-
client.configure(fecTrackConfig, rqWasm
|
|
255
|
+
client.configure(fecTrackConfig, rqWasm)
|
|
237
256
|
try {
|
|
238
257
|
opts.multicastManager.setFecWorker(opts.packetId, client, opts.trackType, {
|
|
239
258
|
blockProfile,
|
|
240
259
|
k: opts.fecK,
|
|
241
260
|
symbolSize: opts.fecSymbolSize,
|
|
242
261
|
interleaveDepthMs: opts.fecInterleaveMs,
|
|
243
|
-
//
|
|
244
|
-
//
|
|
245
|
-
|
|
262
|
+
// No-span tracks have no catalog media cadence. The manager still gets
|
|
263
|
+
// the local cleanup budget, but it must not use a guessed fps for timing
|
|
264
|
+
// or classification.
|
|
265
|
+
...(hasCatalogTiming ? { fps: 1000 / opts.mediaUnitDurationMs! } : {}),
|
|
246
266
|
timeoutMs: deliveryWindowMs,
|
|
247
267
|
}, opts.trackName)
|
|
248
268
|
} catch (e) {
|
|
@@ -260,7 +280,6 @@ export async function setupFecWorkerForTrack(
|
|
|
260
280
|
let disposed = false
|
|
261
281
|
return {
|
|
262
282
|
client,
|
|
263
|
-
altaEnabled,
|
|
264
283
|
dispose: () => {
|
|
265
284
|
if (disposed) return
|
|
266
285
|
disposed = true
|
package/src/index.ts
CHANGED
|
@@ -126,6 +126,7 @@ export {
|
|
|
126
126
|
type FecAlgorithm,
|
|
127
127
|
type FecCatalogConfig,
|
|
128
128
|
isFecCatalogConfig,
|
|
129
|
+
isFecCatalogGeometry,
|
|
129
130
|
type MulticastProtocol,
|
|
130
131
|
type MulticastTrack,
|
|
131
132
|
type MulticastTrackObject,
|
|
@@ -149,6 +150,28 @@ export {
|
|
|
149
150
|
archiveOrigin,
|
|
150
151
|
} from './carp-catalog.js'
|
|
151
152
|
|
|
153
|
+
// Strict v2 multicast delivery catalog (DASH/HLS/MMTP routes), moved from
|
|
154
|
+
// moqtail-private so players share one contract (BLO-47003).
|
|
155
|
+
export {
|
|
156
|
+
normalizeDeliveryCatalog,
|
|
157
|
+
type DeliveryPackaging,
|
|
158
|
+
type DeliveryContentType,
|
|
159
|
+
type DeliveryEndpoint,
|
|
160
|
+
type DeliveryPolicy,
|
|
161
|
+
type DeliveryObjectMapping,
|
|
162
|
+
type DeliveryFec,
|
|
163
|
+
type DeliveryRouteBase,
|
|
164
|
+
type DashDeliveryRoute,
|
|
165
|
+
type HlsDeliveryRoute,
|
|
166
|
+
type MmtpDeliveryRoute,
|
|
167
|
+
type DashDeliveryConfig,
|
|
168
|
+
type HlsDeliveryConfig,
|
|
169
|
+
type MmtpDeliveryConfig,
|
|
170
|
+
type DeliveryMulticastBase,
|
|
171
|
+
type DeliveryMulticastV2,
|
|
172
|
+
type DeliveryCatalogV2,
|
|
173
|
+
} from './delivery-catalog.js'
|
|
174
|
+
|
|
152
175
|
// Multicast input contract — validator + builder for publisher-emitted
|
|
153
176
|
// catalogs (draft-ramadan-moq-multicast-00 §4.1, BLO-3323 A.1).
|
|
154
177
|
// `multicastFromEnv` is the env-var helper used by FFmpeg and the
|
|
@@ -410,7 +433,13 @@ export {
|
|
|
410
433
|
type FrameMeta as RouterFrameMeta,
|
|
411
434
|
type FrameKind,
|
|
412
435
|
type SourceKind,
|
|
436
|
+
type DeltaFallbackConfig,
|
|
413
437
|
} from './media-router.js'
|
|
438
|
+
export {
|
|
439
|
+
resolveDeltaFallback,
|
|
440
|
+
type DeltaFallbackTrack,
|
|
441
|
+
type ResolvedDeltaFallback,
|
|
442
|
+
} from './delta-fallback-config.js'
|
|
414
443
|
|
|
415
444
|
// Group-alignment primitive — shared with Go sender + Rust relay.
|
|
416
445
|
// See align.ts docstring for cross-language contract. Authoritative form
|
|
@@ -522,7 +551,10 @@ export {
|
|
|
522
551
|
type KeyframeCadenceCatalog,
|
|
523
552
|
type TrackFecParams,
|
|
524
553
|
type TrackFecUnavailable,
|
|
554
|
+
catalogFecUnavailable,
|
|
525
555
|
catalogGroupDurationMs,
|
|
556
|
+
catalogKeyframeCadenceMs,
|
|
557
|
+
catalogFecMediaUnitsPerSecond,
|
|
526
558
|
type GroupDurationRendition,
|
|
527
559
|
resolveCatalogTrackGroupDurationMs,
|
|
528
560
|
joinedRepairSymbolCount,
|
package/src/media-router.ts
CHANGED
|
@@ -161,6 +161,51 @@ interface TrackSourceRecord {
|
|
|
161
161
|
emitCount: number
|
|
162
162
|
}
|
|
163
163
|
|
|
164
|
+
/** Catalog-derived inputs to {@link MediaRouter.configureDelta}. */
|
|
165
|
+
export interface DeltaFallbackConfig {
|
|
166
|
+
framerate: number
|
|
167
|
+
sourceSymbols: number
|
|
168
|
+
repairSymbols: number
|
|
169
|
+
deltaFailWindowBlocks?: number
|
|
170
|
+
deltaProbeIntervalMs?: number
|
|
171
|
+
interleaveDepthMs?: number
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/**
|
|
175
|
+
* The one admission check for {@link DeltaFallbackConfig}, shared by
|
|
176
|
+
* {@link MediaRouter.configureDelta} and `resolveDeltaFallback` so a config the
|
|
177
|
+
* resolver accepts is exactly one configureDelta accepts. Every present number
|
|
178
|
+
* must be finite and positive (`typeof NaN === 'number'`, and `NaN <= 0` is
|
|
179
|
+
* false, so a bare comparison admits it); the fail window is a block count and
|
|
180
|
+
* must be an integer; and a probe interval must be derivable.
|
|
181
|
+
*/
|
|
182
|
+
export function assertDeltaFallbackConfig(cfg: DeltaFallbackConfig, prefix: string): void {
|
|
183
|
+
if (!isPositiveFinite(cfg.framerate)) throw new Error(`${prefix}: framerate required and must be > 0`)
|
|
184
|
+
if (!isPositiveFinite(cfg.sourceSymbols))
|
|
185
|
+
throw new Error(`${prefix}: sourceSymbols (K_delta) required and must be > 0`)
|
|
186
|
+
if (!isPositiveFinite(cfg.repairSymbols))
|
|
187
|
+
throw new Error(`${prefix}: repairSymbols (P_delta) required and must be > 0`)
|
|
188
|
+
if (
|
|
189
|
+
cfg.deltaFailWindowBlocks !== undefined &&
|
|
190
|
+
!(Number.isInteger(cfg.deltaFailWindowBlocks) && cfg.deltaFailWindowBlocks > 0)
|
|
191
|
+
) {
|
|
192
|
+
throw new Error(`${prefix}: deltaFailWindowBlocks must be a positive integer when present`)
|
|
193
|
+
}
|
|
194
|
+
if (cfg.deltaProbeIntervalMs !== undefined && !isPositiveFinite(cfg.deltaProbeIntervalMs))
|
|
195
|
+
throw new Error(`${prefix}: deltaProbeIntervalMs must be > 0 when present`)
|
|
196
|
+
if (cfg.interleaveDepthMs !== undefined && !isPositiveFinite(cfg.interleaveDepthMs))
|
|
197
|
+
throw new Error(`${prefix}: interleaveDepthMs must be > 0 when present`)
|
|
198
|
+
if (cfg.deltaProbeIntervalMs === undefined && cfg.interleaveDepthMs === undefined) {
|
|
199
|
+
throw new Error(
|
|
200
|
+
`${prefix}: either deltaProbeIntervalMs or interleaveDepthMs required for probe interval derivation`
|
|
201
|
+
)
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
function isPositiveFinite(value: unknown): value is number {
|
|
206
|
+
return typeof value === 'number' && Number.isFinite(value) && value > 0
|
|
207
|
+
}
|
|
208
|
+
|
|
164
209
|
export class MediaRouter {
|
|
165
210
|
#active: SourceKind = 'moq'
|
|
166
211
|
#multicastVideoKeyed = false
|
|
@@ -339,29 +384,21 @@ export class MediaRouter {
|
|
|
339
384
|
* CLAUDE.md: error on bad init — throws if required inputs are absent.
|
|
340
385
|
*
|
|
341
386
|
* Calling again resets deltaActive=true and clears the window buffer (stream restart).
|
|
387
|
+
* Pass null on teardown or when a replacement catalog cannot configure this policy.
|
|
342
388
|
*/
|
|
343
|
-
configureDelta(cfg: {
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
if (typeof cfg.sourceSymbols !== 'number' || cfg.sourceSymbols <= 0) {
|
|
355
|
-
throw new Error('[MediaRouter] configureDelta: sourceSymbols (K_delta) required and must be > 0')
|
|
356
|
-
}
|
|
357
|
-
if (typeof cfg.repairSymbols !== 'number' || cfg.repairSymbols <= 0) {
|
|
358
|
-
throw new Error('[MediaRouter] configureDelta: repairSymbols (P_delta) required and must be > 0')
|
|
359
|
-
}
|
|
360
|
-
if (cfg.deltaProbeIntervalMs === undefined && cfg.interleaveDepthMs === undefined) {
|
|
361
|
-
throw new Error(
|
|
362
|
-
'[MediaRouter] configureDelta: either deltaProbeIntervalMs or interleaveDepthMs required for probe interval derivation'
|
|
363
|
-
)
|
|
389
|
+
configureDelta(cfg: DeltaFallbackConfig | null): void {
|
|
390
|
+
if (cfg === null) {
|
|
391
|
+
this.#deltaConfigured = false
|
|
392
|
+
this.#deltaActive = true
|
|
393
|
+
this.#deltaWindow = []
|
|
394
|
+
this.#deltaWindowSize = 0
|
|
395
|
+
this.#deltaFailThresholdRatio = 0
|
|
396
|
+
this.#deltaRecoverThresholdRatio = 0
|
|
397
|
+
this.#deltaProbeIntervalMs = 0
|
|
398
|
+
this.#lastProbeAt = 0
|
|
399
|
+
return
|
|
364
400
|
}
|
|
401
|
+
assertDeltaFallbackConfig(cfg, '[MediaRouter] configureDelta')
|
|
365
402
|
|
|
366
403
|
// Derivations — no magic floors, no hardcoded defaults (CLAUDE.md).
|
|
367
404
|
this.#deltaWindowSize = cfg.deltaFailWindowBlocks ?? Math.ceil(cfg.framerate)
|
|
@@ -791,6 +828,7 @@ export class MediaRouter {
|
|
|
791
828
|
/** Dispose timers and per-track sources. Call on teardown to prevent
|
|
792
829
|
* stale timer callbacks firing into garbage-collected closures (WR-03). */
|
|
793
830
|
dispose(): void {
|
|
831
|
+
this.configureDelta(null)
|
|
794
832
|
if (this.#audioFallbackTimer) {
|
|
795
833
|
clearTimeout(this.#audioFallbackTimer)
|
|
796
834
|
this.#audioFallbackTimer = null
|