@blockcast/mmt-container 0.3.0 → 0.4.0-main.71d61b2a53f2
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 +14743 -14412
- 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 +36 -30
- package/dist/fec-manager.d.ts.map +1 -1
- package/dist/fec-manager.js +303 -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 +6 -11
- package/dist/mmtp-container-parser.d.ts.map +1 -1
- package/dist/mmtp-container-parser.js +56 -97
- package/dist/mmtp-container-parser.js.map +4 -4
- package/dist/mmtp-container-parser.no-modules.js +78 -105
- package/dist/mmtp-container-parser.no-modules.js.map +4 -4
- package/dist/mmtp-decode-pipeline.js +56 -97
- package/dist/mmtp-decode-pipeline.js.map +4 -4
- package/dist/mmtp-router.d.ts +37 -26
- package/dist/mmtp-router.d.ts.map +1 -1
- package/dist/mmtp-router.js +162 -313
- 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 +34 -6
- package/dist/multicast-manager.d.ts.map +1 -1
- package/dist/multicast-manager.js +709 -658
- 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 +77 -104
- package/dist/no-modules.js.map +4 -4
- package/dist/repair-fetch.d.ts +30 -19
- package/dist/repair-fetch.d.ts.map +1 -1
- package/dist/repair-fetch.js +33 -24
- 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 +56 -97
- 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 +414 -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 +27 -18
- package/src/mmtp-router.ts +146 -313
- package/src/multicast-manager.ts +184 -83
- package/src/multicast-transport.ts +16 -9
- package/src/repair-fetch.ts +46 -27
- 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
|
@@ -0,0 +1,498 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Strict v2 multicast delivery catalog: the DASH/HLS/MMTP routes a receiver
|
|
3
|
+
* joins, their SSM endpoints, FEC geometry and MMTP packet-ID bindings.
|
|
4
|
+
*
|
|
5
|
+
* Moved from moqtail-private `libs/moqtail-ts/src/model/catalog/delivery.ts`
|
|
6
|
+
* (BLO-47003) so every player reads one contract. Two rules are stricter than
|
|
7
|
+
* the copy it replaces, both libmmt invariants rather than local choices:
|
|
8
|
+
* `fec.blockProfile` is required and must be `iso-ssbg1-v1` (BLO-35597), and a
|
|
9
|
+
* DASH route's `mmtp.packetId` is refused when it is the signaling flow 0
|
|
10
|
+
* (`isMulticastTrackPacketId`).
|
|
11
|
+
*/
|
|
12
|
+
import { parseFecBlockProfile, type FecBlockProfile } from '@blockcast/mmt-base'
|
|
13
|
+
import { isMulticastTrackPacketId } from '@blockcast/mmt-transport'
|
|
14
|
+
|
|
15
|
+
export type DeliveryPackaging = 'mmtp' | 'dash' | 'hls'
|
|
16
|
+
export type DeliveryContentType = 'video' | 'audio' | 'text'
|
|
17
|
+
|
|
18
|
+
export interface DeliveryEndpoint {
|
|
19
|
+
source: string
|
|
20
|
+
group: string
|
|
21
|
+
port: number
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export interface DeliveryPolicy {
|
|
25
|
+
bufferWindowSegments: number
|
|
26
|
+
requestTimeoutMs: number
|
|
27
|
+
missPolicy: 'fail'
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export interface DeliveryObjectMapping {
|
|
31
|
+
namespace: string
|
|
32
|
+
initObject: string
|
|
33
|
+
mediaObjectTemplate: string
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export interface DeliveryFec {
|
|
37
|
+
K: number
|
|
38
|
+
/** Repair symbols per source block. Zero means source-only delivery. */
|
|
39
|
+
P: number
|
|
40
|
+
T: number
|
|
41
|
+
/** Full FEC block span in milliseconds (draft-ramadan-moq-fec §5.1). */
|
|
42
|
+
interleaveDepthMs: number
|
|
43
|
+
/**
|
|
44
|
+
* The catalog `fec.blockProfile` (BLO-35597). Required and never
|
|
45
|
+
* defaulted; `parseFecBlockProfile` refuses anything but `iso-ssbg1-v1`,
|
|
46
|
+
* including the retired `k-padded-v1`.
|
|
47
|
+
*/
|
|
48
|
+
blockProfile: FecBlockProfile
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export interface DeliveryRouteBase {
|
|
52
|
+
id: string
|
|
53
|
+
contentType: DeliveryContentType
|
|
54
|
+
endpointRef: string
|
|
55
|
+
initUri: string
|
|
56
|
+
mediaUriTemplate: string
|
|
57
|
+
objects: DeliveryObjectMapping
|
|
58
|
+
fec: DeliveryFec
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export interface DashDeliveryRoute extends DeliveryRouteBase {
|
|
62
|
+
representationId: string
|
|
63
|
+
/**
|
|
64
|
+
* Authoritative MMTP binding used to assemble the DASH objects carried by
|
|
65
|
+
* this route. The current source accepts MFU-mode MMTP only; the init MPU is
|
|
66
|
+
* the representation init segment. MMTP-backed DASH URI and object templates
|
|
67
|
+
* contain exactly one $Number$ and may also contain $RepresentationID$;
|
|
68
|
+
* $Time$ is rejected because the catalog has no publisher-authored first-time
|
|
69
|
+
* anchor. Publishers explicitly anchor MMTP MPU sequence numbers to DASH
|
|
70
|
+
* $Number$ values so receivers never infer object boundaries from cadence.
|
|
71
|
+
*/
|
|
72
|
+
mmtp: {
|
|
73
|
+
trackName: string
|
|
74
|
+
packetId: number
|
|
75
|
+
mode: 'mfu'
|
|
76
|
+
codec: string
|
|
77
|
+
/** fMP4 media timescale used by Shaka's MMTP transmuxer. */
|
|
78
|
+
timescale: number
|
|
79
|
+
/** Exact duration of one MFU in that timescale, from publisher timing. */
|
|
80
|
+
mediaUnitDurationTicks: number
|
|
81
|
+
/** Exact MFU count carried by each numbered DASH media object. */
|
|
82
|
+
mediaUnitsPerObject: number
|
|
83
|
+
/** First publisher MMTP MPU sequence represented by this route. */
|
|
84
|
+
firstMpuSequenceNumber: number
|
|
85
|
+
/** DASH $Number$ containing firstMpuSequenceNumber. */
|
|
86
|
+
firstObjectNumber: number
|
|
87
|
+
/** Consecutive MMTP MPU sequence numbers carried by each DASH object. */
|
|
88
|
+
mpuSequencesPerObject: number
|
|
89
|
+
/** Optional reliable repair-track name under objects.namespace. */
|
|
90
|
+
repairTrack?: string
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
export interface HlsDeliveryRoute extends DeliveryRouteBase {
|
|
95
|
+
variantId: string
|
|
96
|
+
trackId: string
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
export interface MmtpDeliveryRoute extends DeliveryRouteBase {
|
|
100
|
+
trackName: string
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
export interface DashDeliveryConfig {
|
|
104
|
+
manifestUrl: string
|
|
105
|
+
routes: DashDeliveryRoute[]
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
export interface HlsDeliveryConfig {
|
|
109
|
+
manifestUrl: string
|
|
110
|
+
routes: HlsDeliveryRoute[]
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
export interface MmtpDeliveryConfig {
|
|
114
|
+
routes: MmtpDeliveryRoute[]
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
export interface DeliveryMulticastBase {
|
|
118
|
+
endpoints: Record<string, DeliveryEndpoint>
|
|
119
|
+
deliveryPolicy: DeliveryPolicy
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
export type DeliveryMulticastV2 = DeliveryMulticastBase &
|
|
123
|
+
(
|
|
124
|
+
| { packaging: 'dash'; dash: DashDeliveryConfig }
|
|
125
|
+
| { packaging: 'hls'; hls: HlsDeliveryConfig }
|
|
126
|
+
| { packaging: 'mmtp'; mmtp: MmtpDeliveryConfig }
|
|
127
|
+
)
|
|
128
|
+
|
|
129
|
+
export interface DeliveryCatalogV2 {
|
|
130
|
+
schemaVersion: 2
|
|
131
|
+
channelId: string
|
|
132
|
+
multicast: DeliveryMulticastV2
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
const TEMPLATE_VARIABLE = /\$([A-Za-z][A-Za-z0-9]*)\$/g
|
|
136
|
+
const ALLOWED_TEMPLATE_VARIABLES = new Set(['Number', 'Time', 'RepresentationID', 'VariantID', 'TrackID'])
|
|
137
|
+
|
|
138
|
+
function object(value: unknown, path: string): Record<string, unknown> {
|
|
139
|
+
if (typeof value !== 'object' || value === null || Array.isArray(value)) {
|
|
140
|
+
throw new Error(`${path} must be an object`)
|
|
141
|
+
}
|
|
142
|
+
return value as Record<string, unknown>
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
function string(value: unknown, path: string): string {
|
|
146
|
+
if (typeof value !== 'string' || value.trim().length === 0) {
|
|
147
|
+
throw new Error(`${path} must be a non-empty string`)
|
|
148
|
+
}
|
|
149
|
+
return value
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
function positiveInteger(value: unknown, path: string): number {
|
|
153
|
+
if (typeof value !== 'number' || !Number.isInteger(value) || value <= 0) {
|
|
154
|
+
throw new Error(`${path} must be a positive integer`)
|
|
155
|
+
}
|
|
156
|
+
return value
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
function nonNegativeInteger(value: unknown, path: string): number {
|
|
160
|
+
if (typeof value !== 'number' || !Number.isInteger(value) || value < 0) {
|
|
161
|
+
throw new Error(`${path} must be a non-negative integer`)
|
|
162
|
+
}
|
|
163
|
+
return value
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
function nonNegativeSafeInteger(value: unknown, path: string): number {
|
|
167
|
+
const parsed = nonNegativeInteger(value, path)
|
|
168
|
+
if (!Number.isSafeInteger(parsed)) throw new Error(`${path} must be a safe integer`)
|
|
169
|
+
return parsed
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
function mpuSequenceNumber(value: unknown, path: string): number {
|
|
173
|
+
const parsed = nonNegativeSafeInteger(value, path)
|
|
174
|
+
if (parsed > 0xffffffff) throw new Error(`${path} must be between 0 and 4294967295`)
|
|
175
|
+
return parsed
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
function port(value: unknown, path: string): number {
|
|
179
|
+
const parsed = positiveInteger(value, path)
|
|
180
|
+
if (parsed > 65535) throw new Error(`${path} must be between 1 and 65535`)
|
|
181
|
+
return parsed
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
function httpUrl(value: unknown, path: string): string {
|
|
185
|
+
const raw = string(value, path)
|
|
186
|
+
let parsed: URL
|
|
187
|
+
try {
|
|
188
|
+
parsed = new URL(raw)
|
|
189
|
+
} catch {
|
|
190
|
+
throw new Error(`${path} must be an absolute HTTP(S) URL`)
|
|
191
|
+
}
|
|
192
|
+
if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') {
|
|
193
|
+
throw new Error(`${path} must be an absolute HTTP(S) URL`)
|
|
194
|
+
}
|
|
195
|
+
return raw
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
function templateVariables(template: string, path: string): Set<string> {
|
|
199
|
+
const variables = new Set<string>()
|
|
200
|
+
for (const match of template.matchAll(TEMPLATE_VARIABLE)) {
|
|
201
|
+
const variable = match[1]
|
|
202
|
+
if (variable === undefined || !ALLOWED_TEMPLATE_VARIABLES.has(variable)) {
|
|
203
|
+
throw new Error(`${path} contains unsupported template variable $${variable ?? ''}$`)
|
|
204
|
+
}
|
|
205
|
+
variables.add(variable)
|
|
206
|
+
}
|
|
207
|
+
if (template.includes('$') && template.replace(TEMPLATE_VARIABLE, '').includes('$')) {
|
|
208
|
+
throw new Error(`${path} contains a malformed template variable`)
|
|
209
|
+
}
|
|
210
|
+
return variables
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
function validateTemplatePair(mediaUriTemplate: string, mediaObjectTemplate: string, path: string): void {
|
|
214
|
+
const uriVariables = templateVariables(mediaUriTemplate, `${path}.mediaUriTemplate`)
|
|
215
|
+
const objectVariables = templateVariables(mediaObjectTemplate, `${path}.objects.mediaObjectTemplate`)
|
|
216
|
+
if (uriVariables.size === 0) {
|
|
217
|
+
throw new Error(`${path}.mediaUriTemplate must contain a segment template variable`)
|
|
218
|
+
}
|
|
219
|
+
if (
|
|
220
|
+
uriVariables.size !== objectVariables.size ||
|
|
221
|
+
[...uriVariables].some((variable) => !objectVariables.has(variable))
|
|
222
|
+
) {
|
|
223
|
+
throw new Error(`${path} URI and object templates must use the same variables`)
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
function validateMmtpDashTemplate(template: string, path: string): void {
|
|
228
|
+
const variables = [...template.matchAll(TEMPLATE_VARIABLE)].map((match) => match[1])
|
|
229
|
+
const unsupported = variables.find((variable) => variable !== 'Number' && variable !== 'RepresentationID')
|
|
230
|
+
if (unsupported !== undefined) {
|
|
231
|
+
throw new Error(`${path} contains unsupported MMTP-backed DASH template variable $${unsupported}$`)
|
|
232
|
+
}
|
|
233
|
+
if (variables.filter((variable) => variable === 'Number').length !== 1) {
|
|
234
|
+
throw new Error(`${path} must contain exactly one $Number$ for MMTP-backed DASH`)
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
function validateMmtpDashTemplates(route: DeliveryRouteBase, path: string): void {
|
|
239
|
+
validateMmtpDashTemplate(route.mediaUriTemplate, `${path}.mediaUriTemplate`)
|
|
240
|
+
validateMmtpDashTemplate(route.objects.mediaObjectTemplate, `${path}.objects.mediaObjectTemplate`)
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
function validateEndpoint(value: unknown, path: string): DeliveryEndpoint {
|
|
244
|
+
const endpoint = object(value, path)
|
|
245
|
+
return {
|
|
246
|
+
source: string(endpoint['source'], `${path}.source`),
|
|
247
|
+
group: string(endpoint['group'], `${path}.group`),
|
|
248
|
+
port: port(endpoint['port'], `${path}.port`),
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
function validateEndpoints(value: unknown): Record<string, DeliveryEndpoint> {
|
|
253
|
+
const endpoints = object(value, 'multicast.endpoints')
|
|
254
|
+
const entries = Object.entries(endpoints)
|
|
255
|
+
if (entries.length === 0) throw new Error('multicast.endpoints must not be empty')
|
|
256
|
+
return Object.fromEntries(
|
|
257
|
+
entries.map(([id, endpoint]) => [
|
|
258
|
+
string(id, 'multicast endpoint id'),
|
|
259
|
+
validateEndpoint(endpoint, `multicast.endpoints.${id}`),
|
|
260
|
+
]),
|
|
261
|
+
)
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
function validateDeliveryPolicy(value: unknown): DeliveryPolicy {
|
|
265
|
+
const policy = object(value, 'multicast.deliveryPolicy')
|
|
266
|
+
const missPolicy = policy['missPolicy']
|
|
267
|
+
if (missPolicy !== 'fail') {
|
|
268
|
+
throw new Error("multicast.deliveryPolicy.missPolicy must be 'fail'")
|
|
269
|
+
}
|
|
270
|
+
return {
|
|
271
|
+
bufferWindowSegments: positiveInteger(
|
|
272
|
+
policy['bufferWindowSegments'],
|
|
273
|
+
'multicast.deliveryPolicy.bufferWindowSegments',
|
|
274
|
+
),
|
|
275
|
+
requestTimeoutMs: positiveInteger(policy['requestTimeoutMs'], 'multicast.deliveryPolicy.requestTimeoutMs'),
|
|
276
|
+
missPolicy,
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
function validateRouteBase(
|
|
281
|
+
value: unknown,
|
|
282
|
+
path: string,
|
|
283
|
+
endpoints: Record<string, DeliveryEndpoint>,
|
|
284
|
+
): DeliveryRouteBase {
|
|
285
|
+
const route = object(value, path)
|
|
286
|
+
const endpointRef = string(route['endpointRef'], `${path}.endpointRef`)
|
|
287
|
+
if (!(endpointRef in endpoints)) throw new Error(`${path}.endpointRef does not resolve: ${endpointRef}`)
|
|
288
|
+
|
|
289
|
+
const objects = object(route['objects'], `${path}.objects`)
|
|
290
|
+
const fec = object(route['fec'], `${path}.fec`)
|
|
291
|
+
if ('interleaveDepth' in fec || 'interleaveMs' in fec) {
|
|
292
|
+
throw new Error(`${path}.fec.interleaveDepthMs is the only supported interleave field`)
|
|
293
|
+
}
|
|
294
|
+
const mediaUriTemplate = httpUrl(route['mediaUriTemplate'], `${path}.mediaUriTemplate`)
|
|
295
|
+
const mediaObjectTemplate = string(objects['mediaObjectTemplate'], `${path}.objects.mediaObjectTemplate`)
|
|
296
|
+
validateTemplatePair(mediaUriTemplate, mediaObjectTemplate, path)
|
|
297
|
+
|
|
298
|
+
return {
|
|
299
|
+
id: string(route['id'], `${path}.id`),
|
|
300
|
+
contentType: validateContentType(route['contentType'], `${path}.contentType`),
|
|
301
|
+
endpointRef,
|
|
302
|
+
initUri: httpUrl(route['initUri'], `${path}.initUri`),
|
|
303
|
+
mediaUriTemplate,
|
|
304
|
+
objects: {
|
|
305
|
+
namespace: string(objects['namespace'], `${path}.objects.namespace`),
|
|
306
|
+
initObject: string(objects['initObject'], `${path}.objects.initObject`),
|
|
307
|
+
mediaObjectTemplate,
|
|
308
|
+
},
|
|
309
|
+
fec: {
|
|
310
|
+
K: positiveInteger(fec['K'], `${path}.fec.K`),
|
|
311
|
+
P: nonNegativeInteger(fec['P'], `${path}.fec.P`),
|
|
312
|
+
T: positiveInteger(fec['T'], `${path}.fec.T`),
|
|
313
|
+
interleaveDepthMs: positiveInteger(fec['interleaveDepthMs'], `${path}.fec.interleaveDepthMs`),
|
|
314
|
+
blockProfile: parseFecBlockProfile(fec['blockProfile'], `${path}.fec.blockProfile`),
|
|
315
|
+
},
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
function validateContentType(value: unknown, path: string): DeliveryContentType {
|
|
320
|
+
if (value !== 'video' && value !== 'audio' && value !== 'text') {
|
|
321
|
+
throw new Error(`${path} must be 'video', 'audio', or 'text'`)
|
|
322
|
+
}
|
|
323
|
+
return value
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
function templateShape(template: string): string {
|
|
327
|
+
return template.replace(TEMPLATE_VARIABLE, '$variable$')
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
function validateRouteUniqueness(
|
|
331
|
+
routes: DeliveryRouteBase[],
|
|
332
|
+
selectorKeys: string[],
|
|
333
|
+
rawRoutes: Record<string, unknown>[],
|
|
334
|
+
): void {
|
|
335
|
+
const ids = new Set<string>()
|
|
336
|
+
const selectors = new Set<string>()
|
|
337
|
+
const initUris = new Set<string>()
|
|
338
|
+
const mediaShapes = new Set<string>()
|
|
339
|
+
routes.forEach((route, index) => {
|
|
340
|
+
if (ids.has(route.id)) throw new Error(`duplicate route id: ${route.id}`)
|
|
341
|
+
ids.add(route.id)
|
|
342
|
+
|
|
343
|
+
const selector = selectorKeys.map((key) => String(rawRoutes[index]?.[key])).join('\u0000')
|
|
344
|
+
if (selectors.has(selector)) throw new Error(`duplicate route selector: ${selectorKeys.join(', ')}`)
|
|
345
|
+
selectors.add(selector)
|
|
346
|
+
|
|
347
|
+
if (initUris.has(route.initUri)) throw new Error(`ambiguous init URI mapping: ${route.initUri}`)
|
|
348
|
+
initUris.add(route.initUri)
|
|
349
|
+
|
|
350
|
+
const mediaShape = templateShape(route.mediaUriTemplate)
|
|
351
|
+
if (mediaShapes.has(mediaShape)) {
|
|
352
|
+
throw new Error(`ambiguous media URI mapping: ${route.mediaUriTemplate}`)
|
|
353
|
+
}
|
|
354
|
+
mediaShapes.add(mediaShape)
|
|
355
|
+
})
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
function validateRoutes(value: unknown, kind: 'dash', endpoints: Record<string, DeliveryEndpoint>): DashDeliveryRoute[]
|
|
359
|
+
function validateRoutes(value: unknown, kind: 'hls', endpoints: Record<string, DeliveryEndpoint>): HlsDeliveryRoute[]
|
|
360
|
+
function validateRoutes(value: unknown, kind: 'mmtp', endpoints: Record<string, DeliveryEndpoint>): MmtpDeliveryRoute[]
|
|
361
|
+
function validateRoutes(
|
|
362
|
+
value: unknown,
|
|
363
|
+
kind: DeliveryPackaging,
|
|
364
|
+
endpoints: Record<string, DeliveryEndpoint>,
|
|
365
|
+
): (DashDeliveryRoute | HlsDeliveryRoute | MmtpDeliveryRoute)[] {
|
|
366
|
+
if (!Array.isArray(value) || value.length === 0) throw new Error(`multicast.${kind}.routes must not be empty`)
|
|
367
|
+
const rawRoutes = value.map((route, index) => object(route, `multicast.${kind}.routes[${index}]`))
|
|
368
|
+
const routes = rawRoutes.map((route, index) => {
|
|
369
|
+
const path = `multicast.${kind}.routes[${index}]`
|
|
370
|
+
const base = validateRouteBase(route, path, endpoints)
|
|
371
|
+
if (kind === 'dash') {
|
|
372
|
+
validateMmtpDashTemplates(base, path)
|
|
373
|
+
const mmtp = object(route['mmtp'], `${path}.mmtp`)
|
|
374
|
+
if (mmtp['mode'] !== 'mfu') throw new Error(`${path}.mmtp.mode must be 'mfu'`)
|
|
375
|
+
const mode = 'mfu' as const
|
|
376
|
+
const packetId = mmtp['packetId']
|
|
377
|
+
if (!isMulticastTrackPacketId(packetId)) {
|
|
378
|
+
throw new Error(`${path}.mmtp.packetId must be an integer from 1 to 65535 (0 is the MMTP signaling flow)`)
|
|
379
|
+
}
|
|
380
|
+
const repairTrack = mmtp['repairTrack']
|
|
381
|
+
if (repairTrack !== undefined && (typeof repairTrack !== 'string' || repairTrack.trim().length === 0)) {
|
|
382
|
+
throw new Error(`${path}.mmtp.repairTrack must be a non-empty string when provided`)
|
|
383
|
+
}
|
|
384
|
+
const mediaUnitsPerObject = positiveInteger(mmtp['mediaUnitsPerObject'], `${path}.mmtp.mediaUnitsPerObject`)
|
|
385
|
+
const firstMpuSequenceNumber = mpuSequenceNumber(
|
|
386
|
+
mmtp['firstMpuSequenceNumber'],
|
|
387
|
+
`${path}.mmtp.firstMpuSequenceNumber`,
|
|
388
|
+
)
|
|
389
|
+
const firstObjectNumber = nonNegativeSafeInteger(mmtp['firstObjectNumber'], `${path}.mmtp.firstObjectNumber`)
|
|
390
|
+
const mpuSequencesPerObject = positiveInteger(mmtp['mpuSequencesPerObject'], `${path}.mmtp.mpuSequencesPerObject`)
|
|
391
|
+
if (mpuSequencesPerObject > mediaUnitsPerObject) {
|
|
392
|
+
throw new Error(`${path}.mmtp.mpuSequencesPerObject must not exceed mediaUnitsPerObject`)
|
|
393
|
+
}
|
|
394
|
+
if (firstMpuSequenceNumber + mpuSequencesPerObject - 1 > 0xffffffff) {
|
|
395
|
+
throw new Error(`${path}.mmtp first object exceeds the MMTP MPU sequence-number range`)
|
|
396
|
+
}
|
|
397
|
+
return {
|
|
398
|
+
...base,
|
|
399
|
+
representationId: string(route['representationId'], `${path}.representationId`),
|
|
400
|
+
mmtp: {
|
|
401
|
+
trackName: string(mmtp['trackName'], `${path}.mmtp.trackName`),
|
|
402
|
+
packetId,
|
|
403
|
+
mode,
|
|
404
|
+
codec: string(mmtp['codec'], `${path}.mmtp.codec`),
|
|
405
|
+
timescale: positiveInteger(mmtp['timescale'], `${path}.mmtp.timescale`),
|
|
406
|
+
mediaUnitDurationTicks: positiveInteger(
|
|
407
|
+
mmtp['mediaUnitDurationTicks'],
|
|
408
|
+
`${path}.mmtp.mediaUnitDurationTicks`,
|
|
409
|
+
),
|
|
410
|
+
mediaUnitsPerObject,
|
|
411
|
+
firstMpuSequenceNumber,
|
|
412
|
+
firstObjectNumber,
|
|
413
|
+
mpuSequencesPerObject,
|
|
414
|
+
...(repairTrack === undefined ? {} : { repairTrack }),
|
|
415
|
+
},
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
if (kind === 'hls') {
|
|
419
|
+
return {
|
|
420
|
+
...base,
|
|
421
|
+
variantId: string(route['variantId'], `${path}.variantId`),
|
|
422
|
+
trackId: string(route['trackId'], `${path}.trackId`),
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
return { ...base, trackName: string(route['trackName'], `${path}.trackName`) }
|
|
426
|
+
})
|
|
427
|
+
validateRouteUniqueness(
|
|
428
|
+
routes,
|
|
429
|
+
kind === 'dash' ? ['representationId', 'contentType'] : kind === 'hls' ? ['variantId', 'trackId'] : ['trackName'],
|
|
430
|
+
rawRoutes,
|
|
431
|
+
)
|
|
432
|
+
return routes
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
function validateV2Catalog(value: unknown): DeliveryCatalogV2 {
|
|
436
|
+
const catalog = object(value, 'catalog')
|
|
437
|
+
if (catalog['schemaVersion'] !== 2) throw new Error('catalog.schemaVersion must be 2')
|
|
438
|
+
const multicast = object(catalog['multicast'], 'multicast')
|
|
439
|
+
const packaging = multicast['packaging']
|
|
440
|
+
if (packaging !== 'dash' && packaging !== 'hls' && packaging !== 'mmtp') {
|
|
441
|
+
throw new Error("multicast.packaging must be 'dash', 'hls', or 'mmtp'")
|
|
442
|
+
}
|
|
443
|
+
const endpoints = validateEndpoints(multicast['endpoints'])
|
|
444
|
+
const deliveryPolicy = validateDeliveryPolicy(multicast['deliveryPolicy'])
|
|
445
|
+
const common = {
|
|
446
|
+
schemaVersion: 2 as const,
|
|
447
|
+
channelId: string(catalog['channelId'], 'catalog.channelId'),
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
if (packaging === 'dash') {
|
|
451
|
+
const dash = object(multicast['dash'], 'multicast.dash')
|
|
452
|
+
return {
|
|
453
|
+
...common,
|
|
454
|
+
multicast: {
|
|
455
|
+
packaging,
|
|
456
|
+
endpoints,
|
|
457
|
+
deliveryPolicy,
|
|
458
|
+
dash: {
|
|
459
|
+
manifestUrl: httpUrl(dash['manifestUrl'], 'multicast.dash.manifestUrl'),
|
|
460
|
+
routes: validateRoutes(dash['routes'], packaging, endpoints),
|
|
461
|
+
},
|
|
462
|
+
},
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
if (packaging === 'hls') {
|
|
466
|
+
const hls = object(multicast['hls'], 'multicast.hls')
|
|
467
|
+
return {
|
|
468
|
+
...common,
|
|
469
|
+
multicast: {
|
|
470
|
+
packaging,
|
|
471
|
+
endpoints,
|
|
472
|
+
deliveryPolicy,
|
|
473
|
+
hls: {
|
|
474
|
+
manifestUrl: httpUrl(hls['manifestUrl'], 'multicast.hls.manifestUrl'),
|
|
475
|
+
routes: validateRoutes(hls['routes'], packaging, endpoints),
|
|
476
|
+
},
|
|
477
|
+
},
|
|
478
|
+
}
|
|
479
|
+
}
|
|
480
|
+
const mmtp = object(multicast['mmtp'], 'multicast.mmtp')
|
|
481
|
+
return {
|
|
482
|
+
...common,
|
|
483
|
+
multicast: {
|
|
484
|
+
packaging,
|
|
485
|
+
endpoints,
|
|
486
|
+
deliveryPolicy,
|
|
487
|
+
mmtp: { routes: validateRoutes(mmtp['routes'], packaging, endpoints) },
|
|
488
|
+
},
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
/** Parse and normalize the strict v2 delivery-catalog contract. */
|
|
493
|
+
export function normalizeDeliveryCatalog(value: unknown): DeliveryCatalogV2 {
|
|
494
|
+
const catalog = object(value, 'catalog')
|
|
495
|
+
if (catalog['schemaVersion'] === 2) return validateV2Catalog(catalog)
|
|
496
|
+
if (catalog['schemaVersion'] === undefined) throw new Error('catalog.schemaVersion is required')
|
|
497
|
+
throw new Error(`unsupported catalog.schemaVersion: ${String(catalog['schemaVersion'])}`)
|
|
498
|
+
}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Maps one base/delta switching group's catalog FEC metadata onto
|
|
3
|
+
* {@link MediaRouter.configureDelta} (BLO-45475).
|
|
4
|
+
*
|
|
5
|
+
* Generic client policy selects WHICH group to admit (roles, groups, endpoint
|
|
6
|
+
* availability); this module owns the MMTP/FEC half of that decision — the
|
|
7
|
+
* shared repair pointer and the delta block geometry — so no player re-states
|
|
8
|
+
* the catalog FEC schema. It validates and never defaults: a group whose
|
|
9
|
+
* required metadata is absent or contradictory throws, and the caller decides
|
|
10
|
+
* that such a group invalidates the catalog rather than being skipped.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import { assertDeltaFallbackConfig, type DeltaFallbackConfig } from './media-router.js'
|
|
14
|
+
|
|
15
|
+
/** The catalog fields this mapping reads from one base or delta track. */
|
|
16
|
+
export interface DeltaFallbackTrack {
|
|
17
|
+
name: string
|
|
18
|
+
framerate?: number
|
|
19
|
+
fec?: {
|
|
20
|
+
repairTrack?: string
|
|
21
|
+
sourceSymbols?: number
|
|
22
|
+
repairSymbols?: number
|
|
23
|
+
interleaveDepthMs?: number
|
|
24
|
+
deltaFailWindowBlocks?: number
|
|
25
|
+
deltaProbeIntervalMs?: number
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export interface ResolvedDeltaFallback {
|
|
30
|
+
/** The repair track both base and delta name; required at the endpoint. */
|
|
31
|
+
repairTrackName: string
|
|
32
|
+
config: DeltaFallbackConfig
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Resolve one switching group. Throws when either track omits
|
|
37
|
+
* `fec.repairTrack`, when the two pointers differ, when the base framerate is
|
|
38
|
+
* not positive, or when the delta omits `fec.sourceSymbols`/`repairSymbols`.
|
|
39
|
+
* Fallback-window, probe and interleave fields are read from the base first
|
|
40
|
+
* (where the catalog places them), then the delta. The assembled config is then
|
|
41
|
+
* held to {@link assertDeltaFallbackConfig}, the same check configureDelta
|
|
42
|
+
* runs, so a group this resolves is a group configureDelta accepts — including
|
|
43
|
+
* the requirement that a probe interval or an interleave depth be present.
|
|
44
|
+
*/
|
|
45
|
+
export function resolveDeltaFallback(base: DeltaFallbackTrack, delta: DeltaFallbackTrack): ResolvedDeltaFallback {
|
|
46
|
+
const repair = base.fec?.repairTrack
|
|
47
|
+
if (!repair) throw new Error(`[delta-fallback] base track "${base.name}" missing fec.repairTrack`)
|
|
48
|
+
const deltaFec = delta.fec
|
|
49
|
+
if (!deltaFec?.repairTrack) throw new Error(`[delta-fallback] delta track "${delta.name}" missing fec.repairTrack`)
|
|
50
|
+
if (deltaFec.repairTrack !== repair)
|
|
51
|
+
throw new Error(
|
|
52
|
+
`[delta-fallback] inconsistent repair tracks: ${base.name} references "${repair}" but ${delta.name} references "${deltaFec.repairTrack}"`
|
|
53
|
+
)
|
|
54
|
+
if (!(typeof base.framerate === 'number' && Number.isFinite(base.framerate) && base.framerate > 0))
|
|
55
|
+
throw new Error(`[delta-fallback] base track "${base.name}" missing positive framerate`)
|
|
56
|
+
if (!(isPositive(deltaFec.sourceSymbols) && isPositive(deltaFec.repairSymbols)))
|
|
57
|
+
throw new Error(`[delta-fallback] delta track "${delta.name}" missing positive fec.sourceSymbols/repairSymbols`)
|
|
58
|
+
const config: DeltaFallbackConfig = {
|
|
59
|
+
framerate: base.framerate,
|
|
60
|
+
sourceSymbols: deltaFec.sourceSymbols,
|
|
61
|
+
repairSymbols: deltaFec.repairSymbols,
|
|
62
|
+
deltaFailWindowBlocks: base.fec?.deltaFailWindowBlocks ?? deltaFec.deltaFailWindowBlocks,
|
|
63
|
+
deltaProbeIntervalMs: base.fec?.deltaProbeIntervalMs ?? deltaFec.deltaProbeIntervalMs,
|
|
64
|
+
interleaveDepthMs: base.fec?.interleaveDepthMs ?? deltaFec.interleaveDepthMs,
|
|
65
|
+
}
|
|
66
|
+
assertDeltaFallbackConfig(config, `[delta-fallback] group ${base.name}/${delta.name}`)
|
|
67
|
+
return { repairTrackName: repair, config }
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
function isPositive(value: unknown): value is number {
|
|
71
|
+
return typeof value === 'number' && Number.isFinite(value) && value > 0
|
|
72
|
+
}
|