@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
@@ -217,8 +217,8 @@ export type NetworkSource = {
217
217
  serviceId?: number;
218
218
  /**
219
219
  * SLS of the MMTP service, MP table included (A/331:2026-04 7.2). It
220
- * describes the MMTP session and nothing of this profile: manifestPort
221
- * and keys come from provisioning. libmmt does not fetch it.
220
+ * describes the MMTP session and nothing of this profile: the flow
221
+ * parameters and keys come from provisioning. libmmt does not fetch it.
222
222
  */
223
223
  slsUri?: string;
224
224
  };
@@ -367,12 +367,12 @@ export declare class CmsfCatalogValidationError extends Error {
367
367
  constructor(code: CmsfCatalogErrorCode, path: string, message: string);
368
368
  }
369
369
  /**
370
- * Validate the common CMSF shape and the MMTP required-field profile.
371
- * `catalogNamespace`, the namespace of the catalog track, sharpens the
372
- * foreign-namespace rule of draft -01 4.1; without it listed tracks are only
373
- * compared with each other.
370
+ * Validate the common CMSF shape and the MMTP required-field profile. It never
371
+ * throws on a draft -02 4.1 / 7.2.6 multicast rule: pass `catalogNamespace`
372
+ * (the namespace of the catalog track) to `admittedMulticastEndpoints` /
373
+ * `multicastCatalogIssues` instead. The option is accepted and unused.
374
374
  */
375
- export declare function validateCmsfMmtpCatalog(value: unknown, options?: {
375
+ export declare function validateCmsfMmtpCatalog(value: unknown, _options?: {
376
376
  catalogNamespace?: string;
377
377
  }): CmsfCatalog;
378
378
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"carp-catalog.d.ts","sourceRoot":"","sources":["../src/carp-catalog.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"carp-catalog.d.ts","sourceRoot":"","sources":["../src/carp-catalog.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAGN,KAAK,eAAe,EACpB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,KAAK,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAI3F;;;;;;;;;;;GAWG;AACH,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAI/D;;;;;;;;;;;GAWG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,CAsC3D;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAO5D;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,oBAAoB,CACnC,UAAU,EAAE,MAAM,EAAE,GAClB;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,SAAS,EAAE,CAAA;CAAE,CAsBpD;AAID;;;;;;;GAOG;AACH,MAAM,WAAW,iBAAiB;IACjC,gDAAgD;IAChD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;oEACgE;IAChE,MAAM,EAAE,MAAM,CAAC;IACf;mEAC+D;IAC/D,YAAY,EAAE,eAAe,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;IAC9C,SAAS;IACT,aAAa,EAAE,MAAM,CAAC;IACtB,0BAA0B;IAC1B,aAAa,EAAE,MAAM,CAAC;IACtB,2BAA2B;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,8EAA8E;IAC9E,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B;iFAC6E;IAC7E,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,4CAA4C;IAC5C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;4DAEwD;IACxD,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B;+BAC2B;IAC3B,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,mEAAmE;AACnE,MAAM,MAAM,gBAAgB,GAAG,SAAS,iBAAiB,EAAE,CAAC;AAI5D;;;;;;;GAOG;AACH,MAAM,MAAM,iBAAiB,GAAG,KAAK,GAAG,KAAK,CAAC;AAE9C;;;;;;;;;GASG;AACH,MAAM,WAAW,oBAAoB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;CACjB;AAED,8EAA8E;AAC9E,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,oBAAoB,CAAC;AAE3D,MAAM,WAAW,iBAAiB;IACjC,4FAA4F;IAC5F,QAAQ,CAAC,EAAE,iBAAiB,CAAC;IAC7B,mDAAmD;IACnD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,0CAA0C;IAC1C,YAAY,EAAE,MAAM,CAAC;IACrB,kCAAkC;IAClC,IAAI,EAAE,MAAM,CAAC;IACb;;;;;;;OAOG;IACH,MAAM,EAAE,cAAc,EAAE,CAAC;IACzB;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,IAAI,CAAC,EAAE,kBAAkB,CAAC;IAC1B,2FAA2F;IAC3F,aAAa,CAAC,EAAE,aAAa,EAAE,CAAC;CAChC;AAED,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,CAAC;AAEtD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,MAAM,MAAM,aAAa,GACtB;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,SAAS,CAAC,EAAE,YAAY,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GACxE;IACA,IAAI,EAAE,OAAO,CAAC;IACd,oFAAoF;IACpF,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEL,MAAM,WAAW,sBAAsB;IACtC,yDAAyD;IACzD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,sCAAsC;IACtC,SAAS,EAAE,iBAAiB,EAAE,CAAC;IAC/B;;;;OAIG;IACH,aAAa,CAAC,EAAE,aAAa,EAAE,CAAC;IAChC,wDAAwD;IACxD,IAAI,CAAC,EAAE,mBAAmB,CAAC;IAC3B;;;;;;OAMG;IACH,WAAW,CAAC,EAAE;QACb,SAAS,EAAE,YAAY,CAAC;QACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;IACF;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,oBAAoB,CAIhF;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,iBAAiB,CAU1E;AAED,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,sBAAsB,CAmBpF;AAID;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,WAAW,iBAAiB;IACjC;sDACkD;IAClD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;uDAEmD;IACnD,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,iBAAiB,CAY1E;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CACrC,MAAM,EAAE,iBAAiB,EACzB,SAAS,EAAE,MAAM,GACf,MAAM,CAuBR;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,MAAM,WAAW,aAAa;IAC7B,MAAM,EAAE,MAAM,CAAC;CACf;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,GAAG,SAAS,CAEtE;AA4ED,MAAM,MAAM,WAAW,GAAG;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpC,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAC7B,gBAAgB,GAChB,iBAAiB,GACjB,gBAAgB,GAChB,6BAA6B,GAC7B,cAAc,GACd,YAAY,GACZ,iBAAiB,GACjB,wBAAwB,GACxB,eAAe,GACf,aAAa,GACb,iBAAiB,GACjB,2BAA2B,GAC3B,gBAAgB,GAChB,wBAAwB,GACxB,iBAAiB,GACjB,yBAAyB,GACzB,4BAA4B,GAC5B,4BAA4B,GAC5B,yBAAyB,GACzB,WAAW,GACX,kBAAkB,GAClB,yBAAyB,GACzB,uCAAuC,GACvC,oBAAoB,GACpB,sBAAsB,GACtB,oBAAoB,GACpB,uBAAuB,GACvB,sBAAsB,GACtB,uBAAuB,GACvB,qBAAqB,GACrB,gBAAgB,GAChB,oBAAoB,GACpB,yBAAyB,GACzB,iBAAiB,GACjB,qBAAqB,GACrB,yBAAyB,GACzB,0BAA0B,GAC1B,gBAAgB,GAChB,gBAAgB,CAAC;AAEpB,qBAAa,0BAA2B,SAAQ,KAAK;aAEnC,IAAI,EAAE,oBAAoB;aAC1B,IAAI,EAAE,MAAM;gBADZ,IAAI,EAAE,oBAAoB,EAC1B,IAAI,EAAE,MAAM,EAC5B,OAAO,EAAE,MAAM;CAKhB;AAkBD;;;;;GAKG;AACH,wBAAgB,uBAAuB,CACtC,KAAK,EAAE,OAAO,EACd,QAAQ,GAAE;IAAE,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAAO,GAC1C,WAAW,CA+Pb;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,yBAAyB,CACxC,MAAM,EAAE,iBAAiB,EACzB,SAAS,EAAE,MAAM,GACf,MAAM,CA2BR;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,0BAA0B,CACzC,MAAM,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,iBAAiB,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,GAE3E;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GACZ;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAmB1F"}
@@ -15,33 +15,77 @@ var FEC_BLOCK_PROFILES = Object.freeze([
15
15
  "iso-ssbg1-v1"
16
16
  ]);
17
17
 
18
+ // ../mmt-base/dist/ip-address.js
19
+ var DEC_OCTET = /^(?:0|[1-9]\d{0,2})$/;
20
+ var H16 = /^[0-9A-Fa-f]{1,4}$/;
21
+ function parseIpv4(text) {
22
+ const fields = text.split(".");
23
+ if (fields.length !== 4)
24
+ return void 0;
25
+ const octets = [];
26
+ for (const field of fields) {
27
+ if (!DEC_OCTET.test(field))
28
+ return void 0;
29
+ const value = Number(field);
30
+ if (value > 255)
31
+ return void 0;
32
+ octets.push(value);
33
+ }
34
+ return octets;
35
+ }
36
+ function parseIpv6(text) {
37
+ const halves = text.split("::");
38
+ if (halves.length > 2)
39
+ return void 0;
40
+ const groupsOf = (part) => part === "" ? [] : part.split(":");
41
+ const left = groupsOf(halves[0]);
42
+ const right = halves.length === 2 ? groupsOf(halves[1]) : [];
43
+ const words = [];
44
+ const all = [...left, ...right];
45
+ const last = halves.length === 2 && right.length === 0 ? -1 : all.length - 1;
46
+ for (let index = 0; index < all.length; index++) {
47
+ const group = all[index];
48
+ if (index === last && group.includes(".")) {
49
+ const v4 = parseIpv4(group);
50
+ if (!v4)
51
+ return void 0;
52
+ words.push([v4[0] << 8 | v4[1], v4[2] << 8 | v4[3]]);
53
+ } else if (H16.test(group)) {
54
+ words.push([Number.parseInt(group, 16)]);
55
+ } else {
56
+ return void 0;
57
+ }
58
+ }
59
+ const leftWords = words.slice(0, left.length).flat();
60
+ const rightWords = words.slice(left.length).flat();
61
+ const missing = 8 - leftWords.length - rightWords.length;
62
+ if (halves.length === 2 ? missing < 1 : missing !== 0)
63
+ return void 0;
64
+ const out = new Uint8Array(16);
65
+ [...leftWords, ...new Array(missing).fill(0), ...rightWords].forEach((word, index) => {
66
+ out[index * 2] = word >> 8;
67
+ out[index * 2 + 1] = word & 255;
68
+ });
69
+ return out;
70
+ }
71
+ function parseIpAddressLiteral(text) {
72
+ if (typeof text !== "string")
73
+ return void 0;
74
+ if (text.includes(":"))
75
+ return parseIpv6(text);
76
+ const v4 = parseIpv4(text);
77
+ return v4 ? Uint8Array.from(v4) : void 0;
78
+ }
79
+
18
80
  // ../mmt-base/dist/multicast-catalog.js
19
- var ED25519_PUBLIC_KEY_BASE64URL = /^[A-Za-z0-9_-]{42}[AEIMQUYcgkosw048]$/;
20
- var UINT32_MAX = 4294967295;
21
- var AUTH_MEMBERS = /* @__PURE__ */ new Set(["scheme", "version", "sig", "keys", "minEpoch"]);
22
- var KEY_MEMBERS = /* @__PURE__ */ new Set(["kid", "publicKey", "firstEpoch"]);
23
- var ENDPOINT_AUTH_MEMBERS = /* @__PURE__ */ new Set([
24
- "manifestPort",
25
- "streamId",
26
- "senderAddress",
27
- "maxAuthDelayMs",
28
- "manifestTimerMs",
29
- "manifestTrack"
30
- ]);
31
81
  function isObject(value) {
32
82
  return typeof value === "object" && value !== null && !Array.isArray(value);
33
83
  }
34
- function isNonEmptyString(value) {
35
- return typeof value === "string" && value.trim().length > 0;
36
- }
37
- function isIntegerIn(value, min, max) {
38
- return Number.isSafeInteger(value) && value >= min && value <= max;
39
- }
40
84
  function multicastEndpointSource(endpoint) {
41
85
  if (!isObject(endpoint))
42
86
  return void 0;
43
87
  const sourceAddress = endpoint["sourceAddress"];
44
- if (sourceAddress !== void 0 && !isNonEmptyString(sourceAddress))
88
+ if (sourceAddress !== void 0 && !parseIpAddressLiteral(sourceAddress))
45
89
  return void 0;
46
90
  const mode = sourceAddress === void 0 ? "asm" : "ssm";
47
91
  const protocol = endpoint["protocol"];
@@ -53,214 +97,7 @@ function multicastEndpointSource(endpoint) {
53
97
  return senderAddress === void 0 ? { mode, source: sourceAddress } : void 0;
54
98
  if (auth === void 0)
55
99
  return { mode };
56
- return isNonEmptyString(senderAddress) ? { mode, source: senderAddress } : void 0;
57
- }
58
- function authIssues(auth) {
59
- const base = "$.multicast.auth";
60
- const issue = (path, message) => [
61
- { code: "multicast_auth", path: `${base}${path}`, message }
62
- ];
63
- if (!isObject(auth))
64
- return issue("", "auth must be an object");
65
- const unknown = Object.keys(auth).filter((key) => !AUTH_MEMBERS.has(key));
66
- if (unknown.length > 0) {
67
- return issue("", `auth has unknown member(s) ${unknown.join(", ")}; draft -01 7.2.6 defines scheme, version, sig, keys and minEpoch`);
68
- }
69
- if (auth["scheme"] !== "bc-provenance")
70
- return issue(".scheme", 'scheme must be "bc-provenance"');
71
- if (auth["version"] !== 2)
72
- return issue(".version", "version must be 2 (bc-provenance version 2, draft -01 7.2)");
73
- if (auth["sig"] !== "ed25519")
74
- return issue(".sig", 'sig must be "ed25519"');
75
- const keys = auth["keys"];
76
- if (!Array.isArray(keys) || keys.length < 1 || keys.length > 4) {
77
- return issue(".keys", "keys must be an array of one to four {kid, publicKey, firstEpoch} objects");
78
- }
79
- const kids = /* @__PURE__ */ new Set();
80
- const firstEpochs = /* @__PURE__ */ new Set();
81
- for (let index = 0; index < keys.length; index++) {
82
- const key = keys[index];
83
- const at = `.keys[${index}]`;
84
- if (!isObject(key) || Object.keys(key).some((member) => !KEY_MEMBERS.has(member))) {
85
- return issue(at, "a key is exactly {kid, publicKey, firstEpoch}");
86
- }
87
- if (!isIntegerIn(key["kid"], 0, UINT32_MAX))
88
- return issue(`${at}.kid`, "kid must be an unsigned 32-bit integer");
89
- if (typeof key["publicKey"] !== "string" || !ED25519_PUBLIC_KEY_BASE64URL.test(key["publicKey"])) {
90
- return issue(`${at}.publicKey`, "publicKey must be a 32-octet Ed25519 key in canonical unpadded base64url");
91
- }
92
- if (!isIntegerIn(key["firstEpoch"], 0, UINT32_MAX)) {
93
- return issue(`${at}.firstEpoch`, "firstEpoch must be an unsigned 32-bit integer");
94
- }
95
- if (kids.has(key["kid"]))
96
- return issue(`${at}.kid`, `kid ${key["kid"]} is repeated; the catalog holds no key set`);
97
- if (firstEpochs.has(key["firstEpoch"])) {
98
- return issue(`${at}.firstEpoch`, `firstEpoch ${key["firstEpoch"]} is repeated; the catalog holds no key set`);
99
- }
100
- kids.add(key["kid"]);
101
- firstEpochs.add(key["firstEpoch"]);
102
- }
103
- if (!isIntegerIn(auth["minEpoch"], 0, UINT32_MAX)) {
104
- return issue(".minEpoch", "minEpoch must be an unsigned 32-bit integer");
105
- }
106
- return [];
107
- }
108
- function endpointAuthIssue(endpoint, mode, at) {
109
- const auth = endpoint["auth"];
110
- if (!isObject(auth))
111
- return { path: `${at}.auth`, message: "auth must be an object" };
112
- const unknown = Object.keys(auth).filter((key) => !ENDPOINT_AUTH_MEMBERS.has(key));
113
- if (unknown.length > 0)
114
- return { path: `${at}.auth`, message: `auth has unknown member(s) ${unknown.join(", ")}` };
115
- if (!isIntegerIn(auth["manifestPort"], 1, 65535)) {
116
- return { path: `${at}.auth.manifestPort`, message: "manifestPort must be an integer from 1 to 65535" };
117
- }
118
- if (!isIntegerIn(auth["streamId"], 0, UINT32_MAX)) {
119
- return { path: `${at}.auth.streamId`, message: "streamId must be an unsigned 32-bit integer" };
120
- }
121
- if (mode === "ssm" && auth["senderAddress"] !== void 0) {
122
- return { path: `${at}.auth.senderAddress`, message: "senderAddress must not appear on an SSM endpoint; S is sourceAddress" };
123
- }
124
- if (mode === "asm" && !isNonEmptyString(auth["senderAddress"])) {
125
- return { path: `${at}.auth.senderAddress`, message: "a protected ASM endpoint requires senderAddress" };
126
- }
127
- if (auth["maxAuthDelayMs"] !== void 0 && !isIntegerIn(auth["maxAuthDelayMs"], 50, 1e3)) {
128
- return { path: `${at}.auth.maxAuthDelayMs`, message: "maxAuthDelayMs must be an integer from 50 to 1000" };
129
- }
130
- if (auth["manifestTimerMs"] !== void 0 && !isIntegerIn(auth["manifestTimerMs"], 1, Number.MAX_SAFE_INTEGER)) {
131
- return { path: `${at}.auth.manifestTimerMs`, message: "manifestTimerMs must be an integer of at least 1" };
132
- }
133
- if (auth["manifestTrack"] !== void 0 && !isNonEmptyString(auth["manifestTrack"])) {
134
- return { path: `${at}.auth.manifestTrack`, message: "manifestTrack must be a non-empty string" };
135
- }
136
- if (!isIntegerIn(endpoint["bandwidth"], 1, Number.MAX_SAFE_INTEGER)) {
137
- return { path: `${at}.bandwidth`, message: "a protected endpoint requires bandwidth, which bounds the receiver's hold queues" };
138
- }
139
- return void 0;
140
- }
141
- var CATALOG_NAMESPACE = /* @__PURE__ */ Symbol.for("@blockcast/mmt-base/catalogNamespace");
142
- function multicastCatalogIssues(catalog, options = {}) {
143
- if (!isObject(catalog))
144
- return [];
145
- const issues = [];
146
- if ("multicast.auth" in catalog) {
147
- issues.push({
148
- code: "multicast_auth",
149
- path: '$["multicast.auth"]',
150
- message: 'the root "multicast.auth" key is retired; declare auth as multicast.auth (draft -01 7.2.6)'
151
- });
152
- }
153
- const multicast = catalog["multicast"];
154
- if (!isObject(multicast))
155
- return issues;
156
- const protectedCatalog = multicast["auth"] !== void 0;
157
- if (protectedCatalog)
158
- issues.push(...authIssues(multicast["auth"]));
159
- const endpoints = multicast["endpoints"];
160
- if (!Array.isArray(endpoints))
161
- return issues;
162
- const tracks = Array.isArray(catalog["tracks"]) ? catalog["tracks"] : [];
163
- const namespaceOf = /* @__PURE__ */ new Map();
164
- for (const track of tracks) {
165
- if (isObject(track) && typeof track["name"] === "string")
166
- namespaceOf.set(track["name"], track["namespace"]);
167
- }
168
- const tagged = catalog[CATALOG_NAMESPACE];
169
- let referenceNamespace = options.catalogNamespace ?? (typeof tagged === "string" ? tagged : void 0);
170
- const sources = [];
171
- for (let index = 0; index < endpoints.length; index++) {
172
- const endpoint = endpoints[index];
173
- const at = `$.multicast.endpoints[${index}]`;
174
- const fail = (code, path, message) => {
175
- issues.push({ code, path, message, endpointIndex: index });
176
- };
177
- sources.push(void 0);
178
- if (!isObject(endpoint)) {
179
- fail("multicast_endpoint", at, "endpoint must be an object");
180
- continue;
181
- }
182
- const protocol = endpoint["protocol"];
183
- if (protocol !== void 0 && protocol !== "ssm" && protocol !== "asm") {
184
- fail("multicast_endpoint", `${at}.protocol`, `protocol must be "ssm" or "asm"; a bearer such as ${JSON.stringify(protocol)} is a networkSource entry (draft -01 4.2)`);
185
- continue;
186
- }
187
- const hasAuth = endpoint["auth"] !== void 0;
188
- if (protectedCatalog !== hasAuth) {
189
- fail("multicast_endpoint_auth", `${at}.auth`, protectedCatalog ? "every endpoint requires auth when multicast carries auth; a receiver ignores this endpoint" : "auth names no key without multicast.auth; a receiver ignores this endpoint");
190
- continue;
191
- }
192
- const sourceAddress = endpoint["sourceAddress"];
193
- if (sourceAddress !== void 0 && !isNonEmptyString(sourceAddress)) {
194
- fail("multicast_endpoint", `${at}.sourceAddress`, "sourceAddress must be a non-empty string");
195
- continue;
196
- }
197
- const mode = sourceAddress === void 0 ? "asm" : "ssm";
198
- if (protocol !== void 0 && protocol !== mode) {
199
- fail("multicast_endpoint", `${at}.protocol`, `protocol ${JSON.stringify(protocol)} disagrees with sourceAddress, which selects ${mode}`);
200
- continue;
201
- }
202
- if (!isIntegerIn(endpoint["port"], 1, 65535)) {
203
- fail("multicast_endpoint", `${at}.port`, "port must be an integer from 1 to 65535");
204
- continue;
205
- }
206
- if (hasAuth) {
207
- const authIssue = endpointAuthIssue(endpoint, mode, at);
208
- if (authIssue) {
209
- fail("multicast_endpoint_auth", authIssue.path, authIssue.message);
210
- continue;
211
- }
212
- }
213
- sources[index] = multicastEndpointSource(endpoint);
214
- const refs = Array.isArray(endpoint["tracks"]) ? endpoint["tracks"] : [];
215
- for (let refIndex = 0; refIndex < refs.length; refIndex++) {
216
- const ref = refs[refIndex];
217
- const name = isObject(ref) ? ref["name"] : ref;
218
- if (typeof name !== "string")
219
- continue;
220
- const namespace = namespaceOf.get(name);
221
- if (typeof namespace !== "string")
222
- continue;
223
- referenceNamespace ??= namespace;
224
- if (namespace !== referenceNamespace) {
225
- fail("multicast_track", `${at}.tracks[${refIndex}].name`, `track ${JSON.stringify(name)} declares namespace ${JSON.stringify(namespace)}, not the catalog track's ${JSON.stringify(referenceNamespace)}`);
226
- }
227
- }
228
- }
229
- const tupleOf = (index) => {
230
- const endpoint = endpoints[index];
231
- const auth = endpoint["auth"];
232
- return {
233
- sg: JSON.stringify([sources[index].source ?? null, endpoint["groupAddress"]]),
234
- port: endpoint["port"],
235
- manifestPort: isObject(auth) ? auth["manifestPort"] : void 0
236
- };
237
- };
238
- for (let index = 0; index < endpoints.length; index++) {
239
- if (!sources[index])
240
- continue;
241
- const own = tupleOf(index);
242
- const at = `$.multicast.endpoints[${index}]`;
243
- if (own.manifestPort !== void 0 && own.manifestPort === own.port) {
244
- issues.push({ code: "multicast_endpoint_auth", path: `${at}.auth.manifestPort`, message: "manifestPort must differ from the endpoint's own port", endpointIndex: index });
245
- continue;
246
- }
247
- for (let other = 0; other < endpoints.length; other++) {
248
- if (other === index || !sources[other])
249
- continue;
250
- const peer = tupleOf(other);
251
- if (peer.sg !== own.sg)
252
- continue;
253
- if (peer.port === own.port) {
254
- issues.push({ code: "multicast_endpoint", path: `${at}.port`, message: `(S, G, port) is shared with endpoint ${other}; one endpoint object per multicast tuple`, endpointIndex: index });
255
- break;
256
- }
257
- if (own.manifestPort !== void 0 && (own.manifestPort === peer.port || own.manifestPort === peer.manifestPort)) {
258
- issues.push({ code: "multicast_endpoint_auth", path: `${at}.auth.manifestPort`, message: `manifestPort is a port or manifestPort of endpoint ${other} on the same (S, G)`, endpointIndex: index });
259
- break;
260
- }
261
- }
262
- }
263
- return issues;
100
+ return parseIpAddressLiteral(senderAddress) ? { mode, source: senderAddress } : void 0;
264
101
  }
265
102
 
266
103
  // ../mmt-base/dist/fec-bindings.js
@@ -444,7 +281,7 @@ function validateNetworkSourceRelays(sources, path) {
444
281
  }
445
282
  });
446
283
  }
447
- function validateCmsfMmtpCatalog(value, options = {}) {
284
+ function validateCmsfMmtpCatalog(value, _options = {}) {
448
285
  if (typeof value !== "object" || value === null || Array.isArray(value)) {
449
286
  catalogError("catalog_object", "$", "catalog must be an object");
450
287
  }
@@ -635,8 +472,6 @@ function validateCmsfMmtpCatalog(value, options = {}) {
635
472
  }
636
473
  }
637
474
  }
638
- const [multicastIssue] = multicastCatalogIssues(catalog, options);
639
- if (multicastIssue) catalogError(multicastIssue.code, multicastIssue.path, multicastIssue.message);
640
475
  validateArchive(catalog);
641
476
  return catalog;
642
477
  }