@blockcast/mmt-container 1.0.1 → 2.0.0-main.609e08d7e29f

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.
Files changed (101) hide show
  1. package/README.md +9 -7
  2. package/dist/browser-runtime.js +6972 -6693
  3. package/dist/browser-runtime.js.map +4 -4
  4. package/dist/carp-catalog.d.ts +7 -7
  5. package/dist/carp-catalog.d.ts.map +1 -1
  6. package/dist/carp-catalog.js +65 -230
  7. package/dist/carp-catalog.js.map +3 -3
  8. package/dist/catalog-fec-params.js.map +1 -1
  9. package/dist/catalog-network-source.js.map +1 -1
  10. package/dist/delivery-catalog.js +3 -0
  11. package/dist/delivery-catalog.js.map +2 -2
  12. package/dist/delta-fallback-config.js.map +1 -1
  13. package/dist/fec-manager.d.ts +25 -1
  14. package/dist/fec-manager.d.ts.map +1 -1
  15. package/dist/fec-manager.js +208 -15
  16. package/dist/fec-manager.js.map +2 -2
  17. package/dist/fec-state.js.map +1 -1
  18. package/dist/fec-worker-setup.js.map +1 -1
  19. package/dist/held-layer-admission.d.ts +8 -0
  20. package/dist/held-layer-admission.d.ts.map +1 -1
  21. package/dist/held-layer-admission.js +22 -1
  22. package/dist/held-layer-admission.js.map +2 -2
  23. package/dist/iso-block-locator.js.map +1 -1
  24. package/dist/mfu-reassembler.js.map +1 -1
  25. package/dist/mmtp-container-parser.js.map +1 -1
  26. package/dist/mmtp-container-parser.no-modules.js +146 -332
  27. package/dist/mmtp-container-parser.no-modules.js.map +4 -4
  28. package/dist/mmtp-decode-pipeline.js.map +1 -1
  29. package/dist/mmtp-fec-session.d.ts.map +1 -1
  30. package/dist/mmtp-fec-session.js +61 -15
  31. package/dist/mmtp-fec-session.js.map +3 -3
  32. package/dist/mmtp-router.d.ts +11 -6
  33. package/dist/mmtp-router.d.ts.map +1 -1
  34. package/dist/mmtp-router.js +47 -10
  35. package/dist/mmtp-router.js.map +3 -3
  36. package/dist/multicast-auth-catalog.d.ts +8 -8
  37. package/dist/multicast-auth-catalog.d.ts.map +1 -1
  38. package/dist/multicast-auth-catalog.js +171 -75
  39. package/dist/multicast-auth-catalog.js.map +4 -4
  40. package/dist/multicast-input.d.ts +5 -5
  41. package/dist/multicast-input.d.ts.map +1 -1
  42. package/dist/multicast-input.js +126 -49
  43. package/dist/multicast-input.js.map +3 -3
  44. package/dist/multicast-manager.d.ts +11 -4
  45. package/dist/multicast-manager.d.ts.map +1 -1
  46. package/dist/multicast-manager.js +7914 -7659
  47. package/dist/multicast-manager.js.map +4 -4
  48. package/dist/multicast-transport.d.ts +16 -1
  49. package/dist/multicast-transport.d.ts.map +1 -1
  50. package/dist/multicast-transport.js +120 -5
  51. package/dist/multicast-transport.js.map +4 -4
  52. package/dist/multicast-unwrap.js +2 -2
  53. package/dist/multicast-unwrap.js.map +2 -2
  54. package/dist/no-modules.js +100 -288
  55. package/dist/no-modules.js.map +4 -4
  56. package/dist/repair-fetch.js.map +1 -1
  57. package/dist/signaling.js.map +1 -1
  58. package/dist/timestamp-codec.js.map +1 -1
  59. package/dist/wasm-mfu-reassembler.js.map +1 -1
  60. package/dist/wasm-mmtp-container-parser.js.map +1 -1
  61. package/package.json +5 -5
  62. package/schemas/catalog.schema.json +15 -7
  63. package/src/carp-catalog.ts +14 -13
  64. package/src/fec-manager.ts +89 -14
  65. package/src/held-layer-admission.ts +38 -1
  66. package/src/mmtp-fec-session.ts +20 -12
  67. package/src/mmtp-router.ts +65 -16
  68. package/src/multicast-auth-catalog.ts +43 -36
  69. package/src/multicast-input.ts +28 -8
  70. package/src/multicast-manager.ts +38 -34
  71. package/src/multicast-transport.ts +74 -7
  72. package/test-vectors/bc-provenance-v2.json +614 -175
  73. package/test-vectors/catalog/README.md +24 -8
  74. package/test-vectors/catalog/negative/multicast-auth-asm-missing-sender-address.json +0 -2
  75. package/test-vectors/catalog/negative/{multicast-auth-manifest-port-equals-port.json → multicast-auth-draft01-manifest-port.json} +1 -1
  76. package/test-vectors/catalog/negative/multicast-auth-duplicate-first-epoch.json +0 -1
  77. package/test-vectors/catalog/negative/multicast-auth-duplicate-kid.json +0 -1
  78. package/test-vectors/catalog/negative/multicast-auth-endpoint-auth-without-object-auth.json +0 -1
  79. package/test-vectors/catalog/negative/multicast-auth-endpoint-missing-bandwidth.json +0 -1
  80. package/test-vectors/catalog/negative/multicast-auth-manifest-timer-out-of-range.json +0 -1
  81. package/test-vectors/catalog/negative/multicast-auth-sender-address-on-ssm.json +0 -1
  82. package/test-vectors/catalog/negative/multicast-auth-shared-sg-port.json +73 -0
  83. package/test-vectors/catalog/negative/multicast-auth-version-1.json +0 -1
  84. package/test-vectors/catalog/negative/multicast-auth-version-3.json +0 -1
  85. package/test-vectors/catalog/negative/multicast-auth-version-missing.json +0 -1
  86. package/test-vectors/catalog/negative/multicast-endpoint-address-family-mismatch.json +55 -0
  87. package/test-vectors/catalog/negative/multicast-endpoint-address-host-name.json +55 -0
  88. package/test-vectors/catalog/negative/multicast-endpoint-address-leading-zero.json +55 -0
  89. package/test-vectors/catalog/negative/multicast-endpoint-address-ls32-leading-zero.json +55 -0
  90. package/test-vectors/catalog/negative/multicast-endpoint-address-mapped-family-mismatch.json +55 -0
  91. package/test-vectors/catalog/negative/multicast-endpoint-address-zone-id.json +55 -0
  92. package/test-vectors/catalog/positive/multicast-auth-asm-sender.json +0 -2
  93. package/test-vectors/catalog/{negative/multicast-auth-max-auth-delay-above-max.json → positive/multicast-auth-max-auth-delay-above-max-clamped.json} +0 -1
  94. package/test-vectors/catalog/{negative/multicast-auth-max-auth-delay-below-min.json → positive/multicast-auth-max-auth-delay-below-min-clamped.json} +0 -1
  95. package/test-vectors/catalog/positive/multicast-auth-max-auth-delay-string.json +55 -0
  96. package/test-vectors/catalog/positive/multicast-auth-rotation.json +0 -1
  97. package/test-vectors/catalog/positive/multicast-draft01-7-2-6-example.json +0 -1
  98. package/test-vectors/catalog/section-codes.json +8 -3
  99. package/test-vectors/catalog-multicast-auth-v1.json +0 -1
  100. package/test-vectors/catalog-validation.json +3 -3
  101. package/test-vectors/generate-bc-provenance-v2.mjs +94 -14
@@ -1 +1 @@
1
- {"version":3,"file":"mmtp-fec-session.d.ts","sourceRoot":"","sources":["../src/mmtp-fec-session.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mmtp-fec-session.d.ts","sourceRoot":"","sources":["../src/mmtp-fec-session.ts"],"names":[],"mappings":"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"}
@@ -90,14 +90,11 @@ function readRepairFecPayloadIdFields(mmtpPacket, parsedHeader) {
90
90
  dataOffset: off + REPAIR_FEC_PID_SIZE
91
91
  };
92
92
  }
93
- function parseMoqRepairFrameWithHeader(frame, header) {
94
- return moqRepairFrameFrom(frame, readRepairFecPayloadIdFields(frame, header));
95
- }
96
- function moqRepairFrameFrom(frame, repairId) {
93
+ function moqRepairFrameFrom(frame, repairId, checkRsId = true) {
97
94
  if (!repairId)
98
95
  return null;
99
96
  const symbolData = frame.subarray(repairId.dataOffset);
100
- if (repairId.rsbLength === 0 || repairId.ssbLength === 0 || repairId.rsId >= repairId.rsbLength || symbolData.length === 0)
97
+ if (repairId.ssbLength === 0 || checkRsId && repairId.rsId >= repairId.rsbLength || symbolData.length === 0)
101
98
  return null;
102
99
  return {
103
100
  packetId: repairId.packetId,
@@ -108,6 +105,23 @@ function moqRepairFrameFrom(frame, repairId) {
108
105
  symbolData
109
106
  };
110
107
  }
108
+ function admitMmtpRepairObject(packet, header, symbolSize, algorithm) {
109
+ if (header.packetType !== PACKET_TYPE_REPAIR || header.fecType !== 2)
110
+ return null;
111
+ if (header.headerLength !== MMTP_HEADER_SIZE || packet.length !== MMTP_HEADER_SIZE + REPAIR_FEC_PID_SIZE + symbolSize) {
112
+ return { reject: "repairLength" };
113
+ }
114
+ const frame = moqRepairFrameFrom(packet, readRepairFecPayloadIdFields(packet, header), false);
115
+ if (!frame)
116
+ return null;
117
+ if (frame.rsId >= frame.rsbLength)
118
+ return { frame, reject: "repairRsId" };
119
+ const blockSymbols = frame.ssbLength + frame.rsbLength;
120
+ if (algorithm === "reed-solomon" ? blockSymbols > 255 : algorithm === "raptorq" && blockSymbols - 1 > 16777215) {
121
+ return { frame, reject: "repairSchemeBound" };
122
+ }
123
+ return { frame };
124
+ }
111
125
 
112
126
  // ../mmt-base/dist/ntp-short.js
113
127
  var NTP_SHORT_BITS = 32;
@@ -216,6 +230,9 @@ var HeldLayerAdmission = class {
216
230
  * @returns undefined to admit, `'discard'`, or the fail-closed reason.
217
231
  */
218
232
  admit(repairTrackName, ssStart, rsbLength, horizon, sourceFrontier) {
233
+ return this.#admit(repairTrackName, ssStart, rsbLength, horizon, sourceFrontier, true);
234
+ }
235
+ #admit(repairTrackName, ssStart, rsbLength, horizon, sourceFrontier, retroactive) {
219
236
  if (repairTrackName !== void 0 && !this.#layerNames.has(repairTrackName)) return "discard";
220
237
  const farAhead = sourceFrontier !== void 0 && serial32Precedes(sourceFrontier, ssStart) && serial32Distance(sourceFrontier, ssStart) > horizon;
221
238
  for (const state of this.#states) {
@@ -243,7 +260,7 @@ var HeldLayerAdmission = class {
243
260
  }
244
261
  } else if (!state.settled && !stale(ssStart)) {
245
262
  if (state.anchor === void 0 || serial32Precedes(ssStart, state.anchor)) state.anchor = ssStart;
246
- if (state.latestBelow !== void 0 && !serial32Precedes(state.latestBelow, state.anchor)) {
263
+ if (retroactive && state.latestBelow !== void 0 && !serial32Precedes(state.latestBelow, state.anchor)) {
247
264
  code = "below_anchored_total";
248
265
  ssStart = state.latestBelow;
249
266
  rsbLength = state.latestBelowRsb;
@@ -263,6 +280,24 @@ var HeldLayerAdmission = class {
263
280
  }
264
281
  return void 0;
265
282
  }
283
+ /**
284
+ * The core-00 7.5 carve-out for a repair object about to be discarded
285
+ * (RS_ID or scheme bound): whether its own RSB_length, below a held layer's
286
+ * total on that layer's track or on an anchored block, fails the instance
287
+ * closed under 7.3.2. Leaves the anchored state as it was: a discarded
288
+ * object anchors nothing.
289
+ */
290
+ failsClosed(repairTrackName, ssStart, rsbLength, horizon, sourceFrontier) {
291
+ const saved = this.#states.map((state) => ({ ...state }));
292
+ try {
293
+ const verdict = this.#admit(repairTrackName, ssStart, rsbLength, horizon, sourceFrontier, false);
294
+ return typeof verdict === "object" ? verdict : void 0;
295
+ } finally {
296
+ saved.forEach((state, i) => {
297
+ this.#states[i] = state;
298
+ });
299
+ }
300
+ }
266
301
  };
267
302
 
268
303
  // src/mmtp-fec-session.ts
@@ -433,18 +468,29 @@ var MmtpFecSession = class {
433
468
  } catch {
434
469
  return this.#drop("repair:malformed");
435
470
  }
436
- const frame = parseMoqRepairFrameWithHeader(packet, header);
437
- if (!frame) return this.#drop("repair:malformed");
438
- if (this.#repairPacketId === void 0) {
439
- this.#repairPacketId = frame.packetId;
440
- } else if (frame.packetId !== this.#repairPacketId) {
471
+ const admission = admitMmtpRepairObject(packet, header, this.symbolSize, this.algorithm);
472
+ if (!admission) return this.#drop("repair:malformed");
473
+ if (!("frame" in admission)) return this.#drop("repair:length");
474
+ const frame = admission.frame;
475
+ if (this.#repairPacketId !== void 0 && frame.packetId !== this.#repairPacketId) {
441
476
  return this.#drop("repair:foreign-packet-id");
442
477
  }
443
- if (frame.symbolData.byteLength !== this.symbolSize) return this.#drop("repair:symbol-size");
444
- if (frame.ssbLength > this.sourceSymbols) return this.#drop("repair:ssb-length");
445
- if (this.algorithm === "reed-solomon" && frame.ssbLength + frame.rsbLength > 255) {
446
- return this.#drop("repair:rs-block-length");
478
+ if (admission.reject) {
479
+ const verdict2 = this.#heldLayers.failsClosed(
480
+ repairTrackName,
481
+ frame.ssStart,
482
+ frame.rsbLength,
483
+ this.#anchorHorizon,
484
+ this.#newestSource
485
+ );
486
+ if (verdict2) {
487
+ this.#stats.failClosed = verdict2;
488
+ return this.#drop("repair:fail-closed");
489
+ }
490
+ return this.#drop(admission.reject === "repairRsId" ? "repair:rs-id" : "repair:scheme-bound");
447
491
  }
492
+ this.#repairPacketId ??= frame.packetId;
493
+ if (frame.ssbLength > this.sourceSymbols) return this.#drop("repair:ssb-length");
448
494
  const verdict = this.#heldLayers.admit(
449
495
  repairTrackName,
450
496
  frame.ssStart,