@blockcast/mmt-container 0.3.0 → 0.4.0-main.1e94b11199ea
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 +14816 -14254
- 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 +32 -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 +154 -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 +150 -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 +51 -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 +44 -18
- 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 +2 -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/section-codes.json +33 -0
- 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
|
@@ -269,7 +269,7 @@ export class MulticastTransport<TPacketContext = never> {
|
|
|
269
269
|
// inside the window, instead of a clear+set pair on every packet.
|
|
270
270
|
#watchdog: ReturnType<typeof setTimeout> | null = null
|
|
271
271
|
#lastPacketAtMs = 0
|
|
272
|
-
#failbackWindowMs: number | null
|
|
272
|
+
#failbackWindowMs: number | null | undefined
|
|
273
273
|
#onTakeover: (() => void) | null = null
|
|
274
274
|
#onFailback: ((reason: MulticastFailbackReason) => void) | null = null
|
|
275
275
|
// Data-plane-live edge: the first packet this join accepted. Everything
|
|
@@ -644,18 +644,24 @@ export class MulticastTransport<TPacketContext = never> {
|
|
|
644
644
|
return this.#dataPlaneLive
|
|
645
645
|
}
|
|
646
646
|
|
|
647
|
-
setFailbackWindowMs(windowMs: number): void {
|
|
648
|
-
if (!Number.isFinite(windowMs) || windowMs <= 0) {
|
|
647
|
+
setFailbackWindowMs(windowMs: number | null): void {
|
|
648
|
+
if (windowMs !== null && (!Number.isFinite(windowMs) || windowMs <= 0)) {
|
|
649
649
|
throw new Error(
|
|
650
650
|
`[MulticastTransport] failbackWindowMs=${windowMs}. ` +
|
|
651
651
|
`Derive a positive failback window from the stream catalog.`,
|
|
652
652
|
)
|
|
653
653
|
}
|
|
654
654
|
this.#failbackWindowMs = windowMs
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
655
|
+
if (windowMs === null) {
|
|
656
|
+
if (this.#watchdog !== null) clearTimeout(this.#watchdog)
|
|
657
|
+
this.#watchdog = null
|
|
658
|
+
return
|
|
659
|
+
}
|
|
660
|
+
// Re-enable against the last packet even when the previous policy disabled
|
|
661
|
+
// the watchdog: a silent live stream may never deliver another packet.
|
|
662
|
+
if (this.#watchdog !== null) clearTimeout(this.#watchdog)
|
|
663
|
+
this.#watchdog = null
|
|
664
|
+
if (this.#dataPlaneLive && this.#onFailback) {
|
|
659
665
|
const silentMs = performance.now() - this.#lastPacketAtMs
|
|
660
666
|
this.#armWatchdog(Math.max(0, Math.ceil(windowMs - silentMs)))
|
|
661
667
|
}
|
|
@@ -1022,7 +1028,8 @@ export class MulticastTransport<TPacketContext = never> {
|
|
|
1022
1028
|
}
|
|
1023
1029
|
if (this.#watchdog !== null) return
|
|
1024
1030
|
if (!this.#onFailback) return
|
|
1025
|
-
if (this.#failbackWindowMs === null)
|
|
1031
|
+
if (this.#failbackWindowMs === null) return
|
|
1032
|
+
if (this.#failbackWindowMs === undefined) {
|
|
1026
1033
|
throw new Error(
|
|
1027
1034
|
'[MulticastTransport] Failback watchdog requires a catalog-derived window',
|
|
1028
1035
|
)
|
|
@@ -1033,7 +1040,7 @@ export class MulticastTransport<TPacketContext = never> {
|
|
|
1033
1040
|
#armWatchdog(delayMs: number): void {
|
|
1034
1041
|
this.#watchdog = setTimeout(() => {
|
|
1035
1042
|
this.#watchdog = null
|
|
1036
|
-
if (this.#disposed || !this.#onFailback || this.#failbackWindowMs
|
|
1043
|
+
if (this.#disposed || !this.#onFailback || this.#failbackWindowMs == null) return
|
|
1037
1044
|
const silentMs = performance.now() - this.#lastPacketAtMs
|
|
1038
1045
|
if (silentMs < this.#failbackWindowMs) {
|
|
1039
1046
|
this.#armWatchdog(Math.ceil(this.#failbackWindowMs - silentMs))
|
package/src/repair-fetch.ts
CHANGED
|
@@ -1,14 +1,19 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* D-28 shared repair-fetch scheduler.
|
|
3
3
|
*
|
|
4
|
-
* Player-agnostic orchestration for per-
|
|
4
|
+
* Player-agnostic orchestration for per-block on-demand MoQ FEC repair
|
|
5
5
|
* backfill. Each player (moqtail client, hang watch, Shaka MSF bridge)
|
|
6
|
-
* supplies only its protocol verb via {@link RepairFetchTransport}
|
|
6
|
+
* supplies only its protocol verb via {@link RepairFetchTransport}, fetching
|
|
7
|
+
* one block's repair group. Blocks are `iso-ssbg1-v1` (ISO/IEC 23008-1
|
|
8
|
+
* ssbg_mode1, the only FEC block profile), so that group's MoQ id is the
|
|
9
|
+
* 62-bit wrap-epoch-extended SS_Start, `extSsStart(wrapEpoch, ssStart)` from
|
|
10
|
+
* `@blockcast/mmt-fec` -- never the 32-bit block key itself (see
|
|
11
|
+
* `RepairFetchRequest.sbn`):
|
|
7
12
|
*
|
|
8
|
-
* - moqtail: standalone FETCH (FetchType.Standalone)
|
|
9
|
-
* - moq-lite/hang: Subscribe with startGroup=
|
|
10
|
-
* propagates startGroup upstream to pull the past group from the
|
|
11
|
-
* producer cache)
|
|
13
|
+
* - moqtail: standalone FETCH (FetchType.Standalone) of that one group
|
|
14
|
+
* - moq-lite/hang: Subscribe with startGroup = endGroup = that group (the
|
|
15
|
+
* relay propagates startGroup upstream to pull the past group from the
|
|
16
|
+
* origin's producer cache)
|
|
12
17
|
*
|
|
13
18
|
* Everything else — registration, fire-time repair-track resolution,
|
|
14
19
|
* keyframe-first admission, preemption, feeding symbols, and in-flight slot
|
|
@@ -52,14 +57,42 @@
|
|
|
52
57
|
* than sent and cancelled -- and an admitted FETCH holds the block open to
|
|
53
58
|
* that deadline, so the multicast span elapsing never aborts it.
|
|
54
59
|
*
|
|
60
|
+
* Keyframe late-repair budget: a block that may hold a RAP may be given a
|
|
61
|
+
* longer deadline than the playout budget (`keyframeRepairBudgetMs`). Losing
|
|
62
|
+
* such a block costs every frame up to the next keyframe, so holding it open
|
|
63
|
+
* for a FETCH that lands within the budget trades a short hold for a GOP-long
|
|
64
|
+
* freeze. At a small playout budget (a low-latency target) the presentation
|
|
65
|
+
* deadline alone leaves less than one round trip by the time the multicast
|
|
66
|
+
* wait gives up on the block, so every keyframe request would be refused
|
|
67
|
+
* (`rtt-exceeds-budget`). Eligible (`keyframeBudgetEligible`): a `keyframe`
|
|
68
|
+
* block (in-band RAP evidence), and an `unknown` block only while its
|
|
69
|
+
* stream's classifier is `classifying`, where `unknown` means the window rule
|
|
70
|
+
* could not exclude a RAP. Under `all-protected` every block reads `unknown`
|
|
71
|
+
* whatever it holds, so there only RAP evidence earns the budget. Never
|
|
72
|
+
* audio (P1) or delta (P2), and never a block its repair group cannot
|
|
73
|
+
* complete (received sources + RSB_length < K'). The hold ends when its
|
|
74
|
+
* FETCH ends without making the block decodable, not at the budget.
|
|
75
|
+
*
|
|
76
|
+
* Every deadline is capped by the release gate's hold ceiling measured the
|
|
77
|
+
* way the gate measures it: from the earliest frame it holds for the stream
|
|
78
|
+
* (a surviving frame of the block itself is routed before a repair symbol
|
|
79
|
+
* states the block, so before its anchor), never later than from the anchor.
|
|
80
|
+
* A FETCH landing after the gate forced that frame out would recover media
|
|
81
|
+
* the gate then drops as stale.
|
|
82
|
+
*
|
|
55
83
|
* The scheduler arms no timers. A fetch ends when its transport completes or
|
|
56
84
|
* throws, when it is preempted, when any later scheduling event finds it past
|
|
57
85
|
* its presentation deadline, when its block resolves (recovered, or failed at
|
|
58
86
|
* that deadline), on track reset, or on dispose.
|
|
59
87
|
*/
|
|
60
88
|
|
|
61
|
-
import type
|
|
62
|
-
import {
|
|
89
|
+
import { parseFecBlockProfile, type FecBlockProfile } from '@blockcast/mmt-base'
|
|
90
|
+
import {
|
|
91
|
+
repairPriorityForClass,
|
|
92
|
+
type BlockClass,
|
|
93
|
+
type ClassifierMode,
|
|
94
|
+
type RepairPriority,
|
|
95
|
+
} from './block-policy.js'
|
|
63
96
|
import type { RepairLifecycleObserver } from './multicast-manager.js'
|
|
64
97
|
import { REPAIR_PRIORITY_MIN } from './repair-layers.js'
|
|
65
98
|
|
|
@@ -112,18 +145,24 @@ export interface RepairFetchRequest {
|
|
|
112
145
|
/** Repair track whose block `sbn` is fetched. */
|
|
113
146
|
readonly repairTrack: string
|
|
114
147
|
/**
|
|
115
|
-
* The block's key
|
|
116
|
-
*
|
|
117
|
-
*
|
|
118
|
-
*
|
|
119
|
-
*
|
|
120
|
-
*
|
|
121
|
-
*
|
|
122
|
-
*
|
|
123
|
-
*
|
|
148
|
+
* The block's key: its 32-bit SS_Start (ISO/IEC 23008-1 C.5.3). The field
|
|
149
|
+
* keeps its historical name, but ssbg_mode1 blocks have no source block
|
|
150
|
+
* number (BLO-35597 D2a). The repair group's MoQ id is the 62-bit
|
|
151
|
+
* `extSsStart(wrapEpoch, sbn)`; a receiver that knows only a lost SS_ID
|
|
152
|
+
* fetches `repairFetchRange(lostSsId, kMax, anchor)`, where `anchor` is
|
|
153
|
+
* `{ previousBlockStart }` (the extended start of the last block delimited
|
|
154
|
+
* before it) or `{ reference }` (an epoch reference). Never use it as a
|
|
155
|
+
* group id directly: SS_Start wraps at 2^32, a MoQ group id never goes
|
|
156
|
+
* backwards.
|
|
124
157
|
*/
|
|
125
158
|
readonly sbn: number
|
|
126
|
-
/**
|
|
159
|
+
/**
|
|
160
|
+
* The block profile `sbn` is keyed by: the catalog `fec.blockProfile`,
|
|
161
|
+
* which is always `iso-ssbg1-v1`. Required, and validated with
|
|
162
|
+
* `parseFecBlockProfile` when the request is queued, so a stream configured
|
|
163
|
+
* with any other token (the retired `k-padded-v1` included) never reaches
|
|
164
|
+
* the transport.
|
|
165
|
+
*/
|
|
127
166
|
readonly blockProfile: FecBlockProfile
|
|
128
167
|
/** The source packetId the block belongs to. */
|
|
129
168
|
readonly packetId: number
|
|
@@ -224,6 +263,30 @@ export function repairFetchSubscriberPriority(
|
|
|
224
263
|
return { kind: 'carry', subscriberPriority: Math.max(repair, REPAIR_PRIORITY_MIN) }
|
|
225
264
|
}
|
|
226
265
|
|
|
266
|
+
/** What `RepairFetchHost.fecManager.blockSymbolCounts` reports for one open block. */
|
|
267
|
+
export interface BlockSymbolCounts {
|
|
268
|
+
readonly sources: number
|
|
269
|
+
readonly repairs: number
|
|
270
|
+
readonly authoredLength: number | undefined
|
|
271
|
+
readonly repairGroupLength: number | undefined
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
/**
|
|
275
|
+
* Whether a block of `blockClass` may get the keyframe late-repair budget:
|
|
276
|
+
* a `keyframe` block always (in-band RAP evidence), an `unknown` block only
|
|
277
|
+
* while its stream's classifier is `classifying` (the window rule could not
|
|
278
|
+
* exclude a RAP). An `all-protected` stream reads `unknown` for every block,
|
|
279
|
+
* delta-only ones included, so there `unknown` is no evidence of a RAP and
|
|
280
|
+
* earns no hold. Audio and delta never do.
|
|
281
|
+
*/
|
|
282
|
+
export function keyframeBudgetEligible(
|
|
283
|
+
blockClass: BlockClass,
|
|
284
|
+
classifierMode: ClassifierMode | undefined,
|
|
285
|
+
): boolean {
|
|
286
|
+
if (blockClass === 'keyframe') return true
|
|
287
|
+
return blockClass === 'unknown' && classifierMode === 'classifying'
|
|
288
|
+
}
|
|
289
|
+
|
|
227
290
|
export interface WireRepairFetchOptions {
|
|
228
291
|
resolveTarget: ResolveRepairTarget
|
|
229
292
|
transport: RepairFetchTransport
|
|
@@ -250,6 +313,20 @@ export interface WireRepairFetchOptions {
|
|
|
250
313
|
* (`presentation-delay-unavailable`).
|
|
251
314
|
*/
|
|
252
315
|
presentationDelayMs: (packetId: number, catalogTrackName?: string) => number
|
|
316
|
+
/**
|
|
317
|
+
* How long after the first symbol of a block that may hold a RAP a repair
|
|
318
|
+
* FETCH of it may still land, in ms (optional). Such a block
|
|
319
|
+
* (`keyframeBudgetEligible`) gets the larger of this and
|
|
320
|
+
* `presentationDelayMs`, still never later than the release gate's hold
|
|
321
|
+
* ceiling and never earlier than the multicast wait; RTT admission is
|
|
322
|
+
* unchanged. Losing a keyframe block costs the rest of its GOP, so a player
|
|
323
|
+
* may hold the block (and the frames released after it) while its FETCH is
|
|
324
|
+
* in flight rather than freeze to the next keyframe. Absent, throwing, or
|
|
325
|
+
* not finite and positive: every block gets the presentation deadline
|
|
326
|
+
* alone. Never applied to audio, delta, or an `unknown` block of an
|
|
327
|
+
* `all-protected` stream.
|
|
328
|
+
*/
|
|
329
|
+
keyframeRepairBudgetMs?: (packetId: number, catalogTrackName?: string) => number
|
|
253
330
|
}
|
|
254
331
|
|
|
255
332
|
/** Why the D-28 layer asked for a repair: the block's class at its deadline. */
|
|
@@ -273,11 +350,25 @@ export type RepairSkipReason =
|
|
|
273
350
|
export interface RepairFetchHost {
|
|
274
351
|
readonly fecManager: {
|
|
275
352
|
blockProfileForPacket(packetId: number): FecBlockProfile | undefined
|
|
276
|
-
repairFetchTimeoutMsForBlock(sbn: number, packetId: number, catalogTrackName?: string): number
|
|
353
|
+
repairFetchTimeoutMsForBlock(sbn: number, packetId: number, catalogTrackName?: string): number | undefined
|
|
277
354
|
/** Receiver-local time of the block's first accepted symbol, if any. */
|
|
278
355
|
blockAnchorAtMs(sbn: number, packetId: number, catalogTrackName?: string): number | undefined
|
|
356
|
+
/** The stream's classifier mode (optional; absent reads as unknown). */
|
|
357
|
+
classifierModeFor?(packetId: number, catalogTrackName?: string): { readonly mode: ClassifierMode }
|
|
358
|
+
/**
|
|
359
|
+
* An open block's received sources and distinct repair symbols, its K'
|
|
360
|
+
* (SSB_length) and RSB_length (optional). The repair group carries
|
|
361
|
+
* RSB_length symbols, so it can complete the block only when
|
|
362
|
+
* sources + RSB_length >= K'; a FETCH that ended leaving fewer than K'
|
|
363
|
+
* distinct symbols cannot be decoding it.
|
|
364
|
+
*/
|
|
365
|
+
blockSymbolCounts?(
|
|
366
|
+
sbn: number,
|
|
367
|
+
packetId: number,
|
|
368
|
+
catalogTrackName?: string,
|
|
369
|
+
): BlockSymbolCounts | undefined
|
|
279
370
|
/** How long a terminal block stays authoritative: the release-gate hold ceiling. */
|
|
280
|
-
terminalRetentionMsForPacket(packetId: number): number
|
|
371
|
+
terminalRetentionMsForPacket(packetId: number): number | undefined
|
|
281
372
|
/** Keep the block open to `untilAtMs` for an admitted FETCH. */
|
|
282
373
|
holdBlockForRepair(
|
|
283
374
|
sbn: number,
|
|
@@ -289,6 +380,20 @@ export interface RepairFetchHost {
|
|
|
289
380
|
releaseRepairHold(sbn: number, packetId: number, catalogTrackName?: string): void
|
|
290
381
|
}
|
|
291
382
|
onRepairSubscribe(cb: RepairSubscribeCallback): void
|
|
383
|
+
/**
|
|
384
|
+
* Arrival time of the earliest frame the in-order release gate holds for
|
|
385
|
+
* the stream, or undefined (optional; absent, the block's anchor bounds the
|
|
386
|
+
* ceiling alone). The gate releases that frame `terminalRetentionMsForPacket`
|
|
387
|
+
* after it, whatever its blocks are doing.
|
|
388
|
+
*/
|
|
389
|
+
earliestGatedFrameAtMs?(packetId: number, catalogTrackName?: string): number | undefined
|
|
390
|
+
/** The keyframe budget extended a request's deadline by `extensionMs` (optional). */
|
|
391
|
+
noteKeyframeBudgetGranted?(
|
|
392
|
+
extensionMs: number,
|
|
393
|
+
sbn: number,
|
|
394
|
+
packetId: number,
|
|
395
|
+
catalogTrackName?: string,
|
|
396
|
+
): void
|
|
292
397
|
addRepairLifecycleObserver(observer: RepairLifecycleObserver): () => void
|
|
293
398
|
addTrackResetObserver(observer: (packetId: number, catalogTrackName: string) => void): () => void
|
|
294
399
|
clearRepairForBlock(sbn: number, packetId: number, catalogTrackName?: string): void
|
|
@@ -308,10 +413,24 @@ export interface RepairFetchHost {
|
|
|
308
413
|
packetId: number,
|
|
309
414
|
catalogTrackName?: string,
|
|
310
415
|
): void
|
|
311
|
-
/**
|
|
416
|
+
/**
|
|
417
|
+
* A request the scheduler did not send (see RepairSkipReason).
|
|
418
|
+
* `measurement.priority` is the request's repair priority (0 keyframe or
|
|
419
|
+
* unknown, 1 audio, 2 delta).
|
|
420
|
+
*/
|
|
312
421
|
noteRepairSkipped(
|
|
313
422
|
reason: RepairSkipReason,
|
|
314
|
-
measurement: { readonly rttMs: number | null; readonly budgetMs: number },
|
|
423
|
+
measurement: { readonly rttMs: number | null; readonly budgetMs: number; readonly priority?: RepairPriority },
|
|
424
|
+
sbn: number,
|
|
425
|
+
packetId: number,
|
|
426
|
+
catalogTrackName?: string,
|
|
427
|
+
): void
|
|
428
|
+
/**
|
|
429
|
+
* A FETCH the scheduler admitted and handed to the transport (optional):
|
|
430
|
+
* every attempt, a retry or a reprioritised restart included.
|
|
431
|
+
*/
|
|
432
|
+
noteRepairFetchSent?(
|
|
433
|
+
priority: RepairPriority,
|
|
315
434
|
sbn: number,
|
|
316
435
|
packetId: number,
|
|
317
436
|
catalogTrackName?: string,
|
|
@@ -339,9 +458,10 @@ interface RepairEntry {
|
|
|
339
458
|
subscriberPriority: number | undefined
|
|
340
459
|
/**
|
|
341
460
|
* Absolute `performance.now()` millisecond by which a FETCH must land: the
|
|
342
|
-
* block's presentation deadline (see the module note).
|
|
461
|
+
* block's presentation deadline (see the module note). Only ever moves
|
|
462
|
+
* later: a block reclassified from delta can gain the keyframe budget.
|
|
343
463
|
*/
|
|
344
|
-
|
|
464
|
+
deadlineAt: number
|
|
345
465
|
/** Monotonic enqueue order, the EDF tie-break. */
|
|
346
466
|
readonly order: number
|
|
347
467
|
attempts: number
|
|
@@ -404,6 +524,18 @@ export function wireRepairFetch(mc: RepairFetchHost, opts: WireRepairFetchOption
|
|
|
404
524
|
if (reason === 'preempted') releaseHold(entry)
|
|
405
525
|
}
|
|
406
526
|
|
|
527
|
+
/** The keyframe budget for a P0 block, or null: absent, throwing or not positive. */
|
|
528
|
+
const readKeyframeBudget = (packetId: number, catalogTrackName: string | undefined): number | null => {
|
|
529
|
+
const reader = opts.keyframeRepairBudgetMs
|
|
530
|
+
if (reader === undefined) return null
|
|
531
|
+
try {
|
|
532
|
+
const budgetMs = reader(packetId, catalogTrackName)
|
|
533
|
+
return Number.isFinite(budgetMs) && budgetMs > 0 ? budgetMs : null
|
|
534
|
+
} catch {
|
|
535
|
+
return null
|
|
536
|
+
}
|
|
537
|
+
}
|
|
538
|
+
|
|
407
539
|
const readRtt = (): number | null => {
|
|
408
540
|
try {
|
|
409
541
|
const rtt = opts.reliableRttMs()
|
|
@@ -427,7 +559,7 @@ export function wireRepairFetch(mc: RepairFetchHost, opts: WireRepairFetchOption
|
|
|
427
559
|
clearRepair(entry.sbn, entry.packetId, entry.catalogTrackName)
|
|
428
560
|
mc.noteRepairSkipped(
|
|
429
561
|
rttMs === null ? 'rtt-unmeasured' : 'rtt-exceeds-budget',
|
|
430
|
-
{ rttMs, budgetMs },
|
|
562
|
+
{ rttMs, budgetMs, priority: entry.priority },
|
|
431
563
|
entry.sbn,
|
|
432
564
|
entry.packetId,
|
|
433
565
|
entry.catalogTrackName,
|
|
@@ -479,6 +611,7 @@ export function wireRepairFetch(mc: RepairFetchHost, opts: WireRepairFetchOption
|
|
|
479
611
|
const start = (entry: RepairEntry, counted = true): void => {
|
|
480
612
|
if (!admit(entry, performance.now())) return
|
|
481
613
|
if (counted) entry.attempts++
|
|
614
|
+
mc.noteRepairFetchSent?.(entry.priority, entry.sbn, entry.packetId, entry.catalogTrackName)
|
|
482
615
|
const run: FetchRun = { controller: new AbortController(), stopped: null }
|
|
483
616
|
entry.running = run
|
|
484
617
|
// Hold the block open to the presentation deadline while this FETCH can
|
|
@@ -529,6 +662,45 @@ export function wireRepairFetch(mc: RepairFetchHost, opts: WireRepairFetchOption
|
|
|
529
662
|
.forEach((entry) => start(entry))
|
|
530
663
|
}
|
|
531
664
|
|
|
665
|
+
/**
|
|
666
|
+
* Whether the block may still be decoding from what it holds: false only
|
|
667
|
+
* when the host shows fewer distinct symbols than its K'. A FETCH that
|
|
668
|
+
* ended leaving it short delivered all it could (its group carries no more
|
|
669
|
+
* symbols), so holding the block, and every frame behind it, longer buys
|
|
670
|
+
* nothing: it goes back to its multicast wait. Unknown counts read as
|
|
671
|
+
* decodable (the FEC layer resolves the block).
|
|
672
|
+
*/
|
|
673
|
+
const symbolCounts = (
|
|
674
|
+
sbn: number,
|
|
675
|
+
packetId: number,
|
|
676
|
+
catalogTrackName: string | undefined,
|
|
677
|
+
): BlockSymbolCounts | undefined => {
|
|
678
|
+
try {
|
|
679
|
+
return mc.fecManager.blockSymbolCounts?.(sbn, packetId, catalogTrackName)
|
|
680
|
+
} catch {
|
|
681
|
+
return undefined
|
|
682
|
+
}
|
|
683
|
+
}
|
|
684
|
+
const decodable = (entry: RepairEntry): boolean => {
|
|
685
|
+
const counts = symbolCounts(entry.sbn, entry.packetId, entry.catalogTrackName)
|
|
686
|
+
if (counts === undefined || counts.authoredLength === undefined) return true
|
|
687
|
+
return counts.sources + counts.repairs >= counts.authoredLength
|
|
688
|
+
}
|
|
689
|
+
/**
|
|
690
|
+
* Whether the block's repair group can complete it: its received sources
|
|
691
|
+
* plus every symbol the group carries reach K'. A loss of more sources than
|
|
692
|
+
* the group has repair symbols (every source-only loss among them: the
|
|
693
|
+
* block then already holds the whole group) gets no FETCH-length hold. True
|
|
694
|
+
* while the counts are not known (no repair stated the block yet).
|
|
695
|
+
*/
|
|
696
|
+
const groupCanComplete = (sbn: number, packetId: number, catalogTrackName: string | undefined): boolean => {
|
|
697
|
+
const counts = symbolCounts(sbn, packetId, catalogTrackName)
|
|
698
|
+
if (counts === undefined || counts.authoredLength === undefined || counts.repairGroupLength === undefined) {
|
|
699
|
+
return true
|
|
700
|
+
}
|
|
701
|
+
return counts.sources + counts.repairGroupLength >= counts.authoredLength
|
|
702
|
+
}
|
|
703
|
+
|
|
532
704
|
const finish = (entry: RepairEntry, run: FetchRun, fed: number, error: unknown): void => {
|
|
533
705
|
if (run.stopped !== null || entry.running !== run || entries.get(entry.key) !== entry) {
|
|
534
706
|
return
|
|
@@ -539,7 +711,7 @@ export function wireRepairFetch(mc: RepairFetchHost, opts: WireRepairFetchOption
|
|
|
539
711
|
// A fetch that ended without feeding anything cannot resolve the block;
|
|
540
712
|
// release the slot and the hold so failure accounting is not wedged. A
|
|
541
713
|
// fetch that fed symbols leaves resolution to the FEC layer.
|
|
542
|
-
if (fed === 0) {
|
|
714
|
+
if (fed === 0 || !decodable(entry)) {
|
|
543
715
|
releaseHold(entry)
|
|
544
716
|
clearRepair(entry.sbn, entry.packetId, entry.catalogTrackName)
|
|
545
717
|
}
|
|
@@ -568,15 +740,18 @@ export function wireRepairFetch(mc: RepairFetchHost, opts: WireRepairFetchOption
|
|
|
568
740
|
|
|
569
741
|
// The profile the block key is in; a stream reaching repair was configured
|
|
570
742
|
// from its catalog, so an absent profile is a wiring fault, not a default.
|
|
571
|
-
//
|
|
572
|
-
//
|
|
573
|
-
//
|
|
743
|
+
// Any token other than `iso-ssbg1-v1` (the retired `k-padded-v1` included)
|
|
744
|
+
// is one too: `parseFecBlockProfile` refuses it, whatever an untyped host
|
|
745
|
+
// returns. Resolved when the request arrives (onRepairSubscribe below),
|
|
746
|
+
// never inside execute: there its throw would read as an ordinary fetch
|
|
747
|
+
// failure, warned once per block while the stream silently lost unicast
|
|
748
|
+
// repair.
|
|
574
749
|
const blockProfileOf = (packetId: number): FecBlockProfile => {
|
|
575
|
-
const profile = mc.fecManager.blockProfileForPacket(packetId)
|
|
750
|
+
const profile: unknown = mc.fecManager.blockProfileForPacket(packetId)
|
|
576
751
|
if (profile === undefined) {
|
|
577
752
|
throw new Error(`[RepairFetch] packetId=${packetId} has no configured fec.blockProfile`)
|
|
578
753
|
}
|
|
579
|
-
return profile
|
|
754
|
+
return parseFecBlockProfile(profile, `[RepairFetch] packetId=${packetId} fec.blockProfile`)
|
|
580
755
|
}
|
|
581
756
|
|
|
582
757
|
const execute = async (entry: RepairEntry, run: FetchRun): Promise<void> => {
|
|
@@ -630,6 +805,19 @@ export function wireRepairFetch(mc: RepairFetchHost, opts: WireRepairFetchOption
|
|
|
630
805
|
if (wire === null) return
|
|
631
806
|
entry.priority = promoted
|
|
632
807
|
entry.subscriberPriority = wire.subscriberPriority
|
|
808
|
+
// A block that turned out to carry a keyframe gets the keyframe budget
|
|
809
|
+
// its request would have had (never a shorter deadline than it had).
|
|
810
|
+
const promotedDeadline = presentationDeadlineAt(
|
|
811
|
+
entry.sbn,
|
|
812
|
+
entry.packetId,
|
|
813
|
+
entry.catalogTrackName,
|
|
814
|
+
performance.now(),
|
|
815
|
+
event.to,
|
|
816
|
+
)
|
|
817
|
+
if (promotedDeadline !== null && promotedDeadline.deadlineAt > entry.deadlineAt) {
|
|
818
|
+
entry.deadlineAt = promotedDeadline.deadlineAt
|
|
819
|
+
noteBudget(entry, promotedDeadline.extensionMs)
|
|
820
|
+
}
|
|
633
821
|
if (entry.running) {
|
|
634
822
|
// The running FETCH carries the delta priority. Cancel it and send
|
|
635
823
|
// the block's repair again under its new class (§11.4.5): a keyframe
|
|
@@ -659,18 +847,26 @@ export function wireRepairFetch(mc: RepairFetchHost, opts: WireRepairFetchOption
|
|
|
659
847
|
* is open that long whatever happens, so a FETCH landing inside it still
|
|
660
848
|
* counts) and above by anchor + the release gate's hold ceiling (a successor
|
|
661
849
|
* frame may not wait behind a block longer than that). A block no symbol
|
|
662
|
-
* reached has no anchor; its deadline is the multicast wait.
|
|
850
|
+
* reached has no anchor; its deadline is the multicast wait. The ceiling is
|
|
851
|
+
* measured from the earlier of the anchor and the earliest frame the gate
|
|
852
|
+
* holds for the stream (see the module note). A block that may hold a RAP
|
|
853
|
+
* (`keyframeBudgetEligible`) uses the larger of the presentation delay and
|
|
854
|
+
* the keyframe budget; `extensionMs` is how much later that made it.
|
|
663
855
|
*/
|
|
664
856
|
const presentationDeadlineAt = (
|
|
665
857
|
sbn: number,
|
|
666
858
|
packetId: number,
|
|
667
859
|
catalogTrackName: string | undefined,
|
|
668
860
|
now: number,
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
861
|
+
blockClass: BlockClass,
|
|
862
|
+
): { readonly deadlineAt: number; readonly extensionMs: number } | null => {
|
|
863
|
+
// Undefined: the packetId is no longer configured (released), so it has
|
|
864
|
+
// no repair budget.
|
|
865
|
+
const waitMs = mc.fecManager.repairFetchTimeoutMsForBlock(sbn, packetId, catalogTrackName)
|
|
866
|
+
if (waitMs === undefined) return null
|
|
867
|
+
const waitDeadlineAt = now + waitMs
|
|
672
868
|
const anchor = mc.fecManager.blockAnchorAtMs(sbn, packetId, catalogTrackName)
|
|
673
|
-
if (anchor === undefined) return waitDeadlineAt
|
|
869
|
+
if (anchor === undefined) return { deadlineAt: waitDeadlineAt, extensionMs: 0 }
|
|
674
870
|
let delayMs: number
|
|
675
871
|
try {
|
|
676
872
|
delayMs = opts.presentationDelayMs(packetId, catalogTrackName)
|
|
@@ -678,8 +874,40 @@ export function wireRepairFetch(mc: RepairFetchHost, opts: WireRepairFetchOption
|
|
|
678
874
|
return null
|
|
679
875
|
}
|
|
680
876
|
if (!(Number.isFinite(delayMs) && delayMs > 0)) return null
|
|
681
|
-
const
|
|
682
|
-
|
|
877
|
+
const retentionMs = mc.fecManager.terminalRetentionMsForPacket(packetId)
|
|
878
|
+
if (retentionMs === undefined) return null
|
|
879
|
+
const ceilingAt = Math.min(anchor, earliestGatedFrameAt(packetId, catalogTrackName) ?? anchor) + retentionMs
|
|
880
|
+
const deadlineAt = (delay: number): number => Math.max(waitDeadlineAt, Math.min(anchor + delay, ceilingAt))
|
|
881
|
+
const base = deadlineAt(delayMs)
|
|
882
|
+
const budgetMs =
|
|
883
|
+
keyframeBudgetEligible(blockClass, classifierMode(packetId, catalogTrackName)) &&
|
|
884
|
+
groupCanComplete(sbn, packetId, catalogTrackName)
|
|
885
|
+
? readKeyframeBudget(packetId, catalogTrackName)
|
|
886
|
+
: null
|
|
887
|
+
if (budgetMs === null || budgetMs <= delayMs) return { deadlineAt: base, extensionMs: 0 }
|
|
888
|
+
const extended = deadlineAt(budgetMs)
|
|
889
|
+
return { deadlineAt: extended, extensionMs: extended - base }
|
|
890
|
+
}
|
|
891
|
+
|
|
892
|
+
const earliestGatedFrameAt = (packetId: number, catalogTrackName: string | undefined): number | undefined => {
|
|
893
|
+
try {
|
|
894
|
+
const at = mc.earliestGatedFrameAtMs?.(packetId, catalogTrackName)
|
|
895
|
+
return at !== undefined && Number.isFinite(at) ? at : undefined
|
|
896
|
+
} catch {
|
|
897
|
+
return undefined
|
|
898
|
+
}
|
|
899
|
+
}
|
|
900
|
+
|
|
901
|
+
const classifierMode = (packetId: number, catalogTrackName: string | undefined): ClassifierMode | undefined => {
|
|
902
|
+
try {
|
|
903
|
+
return mc.fecManager.classifierModeFor?.(packetId, catalogTrackName).mode
|
|
904
|
+
} catch {
|
|
905
|
+
return undefined
|
|
906
|
+
}
|
|
907
|
+
}
|
|
908
|
+
|
|
909
|
+
const noteBudget = (entry: Pick<RepairEntry, 'sbn' | 'packetId' | 'catalogTrackName'>, extensionMs: number): void => {
|
|
910
|
+
if (extensionMs > 0) mc.noteKeyframeBudgetGranted?.(extensionMs, entry.sbn, entry.packetId, entry.catalogTrackName)
|
|
683
911
|
}
|
|
684
912
|
|
|
685
913
|
mc.onRepairSubscribe((sbn, packetId, catalogTrackName, blockClass) => {
|
|
@@ -729,12 +957,13 @@ export function wireRepairFetch(mc: RepairFetchHost, opts: WireRepairFetchOption
|
|
|
729
957
|
return
|
|
730
958
|
}
|
|
731
959
|
const now = performance.now()
|
|
732
|
-
const
|
|
733
|
-
|
|
960
|
+
const priority = repairPriorityForClass(blockClass)
|
|
961
|
+
const deadline = presentationDeadlineAt(sbn, packetId, catalogTrackName, now, blockClass)
|
|
962
|
+
if (deadline === null) {
|
|
734
963
|
clearRepair(sbn, packetId, catalogTrackName)
|
|
735
964
|
mc.noteRepairSkipped(
|
|
736
965
|
'presentation-delay-unavailable',
|
|
737
|
-
{ rttMs: readRtt(), budgetMs: 0 },
|
|
966
|
+
{ rttMs: readRtt(), budgetMs: 0, priority },
|
|
738
967
|
sbn,
|
|
739
968
|
packetId,
|
|
740
969
|
catalogTrackName,
|
|
@@ -746,14 +975,15 @@ export function wireRepairFetch(mc: RepairFetchHost, opts: WireRepairFetchOption
|
|
|
746
975
|
...identity,
|
|
747
976
|
repairTrack: target.repairTrack,
|
|
748
977
|
blockProfile,
|
|
749
|
-
priority
|
|
978
|
+
priority,
|
|
750
979
|
subscriberPriority: wire.subscriberPriority,
|
|
751
|
-
deadlineAt,
|
|
980
|
+
deadlineAt: deadline.deadlineAt,
|
|
752
981
|
order: enqueueOrder++,
|
|
753
982
|
attempts: 0,
|
|
754
983
|
running: null,
|
|
755
984
|
}
|
|
756
985
|
entries.set(key, entry)
|
|
986
|
+
noteBudget(entry, deadline.extensionMs)
|
|
757
987
|
if (entry.priority < 2) preemptDeltas()
|
|
758
988
|
dispatch()
|
|
759
989
|
})
|
package/src/repair-layers.ts
CHANGED
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
// rendition's `fec.repairTrack` and needs no `repair.renditions` entry; an
|
|
21
21
|
// entry there is optional and, when present, must agree with the source.
|
|
22
22
|
|
|
23
|
-
import { parseFecBlockProfile, type FecBlockProfile } from "@blockcast/mmt-base";
|
|
23
|
+
import { isFecBlockProfile, parseFecBlockProfile, type FecBlockProfile } from "@blockcast/mmt-base";
|
|
24
24
|
|
|
25
25
|
/** Lowest MoQT-scale priority a repair track may declare. */
|
|
26
26
|
export const REPAIR_PRIORITY_MIN = 192;
|
|
@@ -44,7 +44,8 @@ export type RepairContractCode =
|
|
|
44
44
|
| "track_repair_overlay"
|
|
45
45
|
| "track_repair_geometry"
|
|
46
46
|
| "track_fec_bounds"
|
|
47
|
-
| "track_fec_block_profile"
|
|
47
|
+
| "track_fec_block_profile"
|
|
48
|
+
| "track_fec_block_profile_unimplemented";
|
|
48
49
|
|
|
49
50
|
/** Reports one contract violation and never returns. */
|
|
50
51
|
export type RepairContractFail = (code: RepairContractCode, path: string, message: string) => never;
|
|
@@ -69,12 +70,23 @@ export const throwRepairContractError: RepairContractFail = (code, path, message
|
|
|
69
70
|
* the one rule both catalog dialects, the CMSF validator and the per-track
|
|
70
71
|
* resolver apply.
|
|
71
72
|
*
|
|
72
|
-
*
|
|
73
|
-
*
|
|
74
|
-
*
|
|
75
|
-
* may omit
|
|
76
|
-
*
|
|
77
|
-
*
|
|
73
|
+
* draft-ramadan-moq-fec §5.1 defines exactly one profile, `iso-ssbg1-v1`, and
|
|
74
|
+
* it is the only one this library implements. A `fec` block that declares an
|
|
75
|
+
* FEC instance (any `algorithm` other than `"none"`) MUST name it; a block
|
|
76
|
+
* declaring no FEC instance may omit the token (returns undefined), but a token
|
|
77
|
+
* it does carry must be implemented. Failures are reported at `path`:
|
|
78
|
+
*
|
|
79
|
+
* - `track_fec_block_profile_unimplemented`: a non-empty string that names no
|
|
80
|
+
* implemented profile. The retired Blockcast-private `k-padded-v1` is one
|
|
81
|
+
* such token; a near-miss such as `"iso-ssbg1"` is another, never
|
|
82
|
+
* normalized.
|
|
83
|
+
* - `track_fec_block_profile`: no token on a declared FEC instance, or a value
|
|
84
|
+
* that is not a non-empty string.
|
|
85
|
+
*
|
|
86
|
+
* The token is never defaulted and never inferred from the wire. A receiver
|
|
87
|
+
* treats either failure as "FEC unavailable" for that track alone (it consumes
|
|
88
|
+
* the source without FEC and joins none of its repair tracks); a conformance
|
|
89
|
+
* validator rejects the catalog.
|
|
78
90
|
*
|
|
79
91
|
* @param path JSON path of the `blockProfile` field, for the error.
|
|
80
92
|
*/
|
|
@@ -97,6 +109,14 @@ export function readFecBlockProfile(
|
|
|
97
109
|
fail: RepairContractFail,
|
|
98
110
|
): FecBlockProfile | undefined {
|
|
99
111
|
if (value === undefined && !declaresFecInstance) return undefined;
|
|
112
|
+
if (isFecBlockProfile(value)) return value;
|
|
113
|
+
if (typeof value === "string" && value.length > 0) {
|
|
114
|
+
return fail(
|
|
115
|
+
"track_fec_block_profile_unimplemented",
|
|
116
|
+
path,
|
|
117
|
+
`${JSON.stringify(value)} is not an implemented FEC block profile; only "iso-ssbg1-v1" is implemented`,
|
|
118
|
+
);
|
|
119
|
+
}
|
|
100
120
|
try {
|
|
101
121
|
return parseFecBlockProfile(value, "blockProfile");
|
|
102
122
|
} catch (error) {
|