@moqtap/codec 0.8.0 → 0.9.0

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 (160) hide show
  1. package/CHANGELOG.md +49 -0
  2. package/README.md +16 -4
  3. package/dist/{chunk-5XZKO2U5.js → chunk-2XH6PHXR.js} +62 -51
  4. package/dist/{chunk-BQHLUT37.cjs → chunk-7ENEWAMZ.cjs} +2 -6
  5. package/dist/chunk-BMJMY6FX.cjs +868 -0
  6. package/dist/{chunk-MD2OA7SE.js → chunk-BV6MITLO.js} +15 -8
  7. package/dist/{chunk-B56AG5HU.cjs → chunk-EVCPBFSR.cjs} +6 -4
  8. package/dist/{chunk-KNLPX3YA.js → chunk-H6DTAIWM.js} +6 -4
  9. package/dist/{chunk-J3ASFPCX.cjs → chunk-IADVBKEJ.cjs} +15 -8
  10. package/dist/chunk-MAXEHYVB.cjs +2362 -0
  11. package/dist/{chunk-I55J3KXD.js → chunk-NH4L6NIY.js} +48 -33
  12. package/dist/{chunk-EQAYMCXO.cjs → chunk-PU2KV7VP.cjs} +48 -33
  13. package/dist/{chunk-APTV6F72.js → chunk-Q7NSUXXB.js} +70 -52
  14. package/dist/{chunk-HEO2JG6C.js → chunk-TMXRYOBS.js} +100 -92
  15. package/dist/{chunk-MH7537FB.cjs → chunk-TVSFDQYE.cjs} +70 -52
  16. package/dist/{chunk-IEJULBKB.cjs → chunk-UA5XFP4O.cjs} +100 -92
  17. package/dist/{chunk-KTVN4P6J.cjs → chunk-UZO5Z2XT.cjs} +62 -51
  18. package/dist/chunk-WX5PU7HF.js +868 -0
  19. package/dist/{chunk-JJEN2VG5.js → chunk-XQGEOFGE.js} +2 -6
  20. package/dist/chunk-YJGOD3Y4.js +2362 -0
  21. package/dist/{codec-BLYAy2OP.d.ts → codec--CVeqGQv.d.ts} +1 -1
  22. package/dist/{codec-DujHf55Z.d.ts → codec-BJ7BHuiZ.d.ts} +1 -1
  23. package/dist/{codec-D47r_-Rl.d.ts → codec-BKsVu3Fr.d.ts} +1 -1
  24. package/dist/{codec-BNS3gS77.d.ts → codec-BMwgZIgG.d.ts} +1 -1
  25. package/dist/{codec-CI0BjmHc.d.ts → codec-BNy5syCU.d.ts} +1 -1
  26. package/dist/{codec-CFhUGTu2.d.ts → codec-BQa6Qsav.d.ts} +2 -2
  27. package/dist/codec-Bym-K2q2.d.cts +49 -0
  28. package/dist/{codec-D2JbI2tp.d.ts → codec-C006F75E.d.ts} +1 -1
  29. package/dist/codec-C5evFHL-.d.ts +49 -0
  30. package/dist/{codec-DQWQSam3.d.cts → codec-C6Mx4bwz.d.cts} +1 -1
  31. package/dist/{codec-DL0njGkL.d.ts → codec-CA6nbbEk.d.ts} +1 -1
  32. package/dist/{codec-D89DWXbv.d.cts → codec-CSBFdPgP.d.cts} +1 -1
  33. package/dist/{codec-DvcJgYKq.d.cts → codec-CXCjya_G.d.cts} +1 -1
  34. package/dist/{codec-hvkJfCF5.d.cts → codec-C_xxsbKy.d.cts} +1 -1
  35. package/dist/{codec-BOyrk_C9.d.cts → codec-Cfo_z5ET.d.cts} +1 -1
  36. package/dist/{codec-xeuGZY77.d.cts → codec-CgZdadPt.d.cts} +2 -2
  37. package/dist/{codec-WwwUipaU.d.ts → codec-Cl73EfRW.d.ts} +1 -1
  38. package/dist/{codec-BOtv3R5j.d.cts → codec-CtvFK4aV.d.cts} +1 -1
  39. package/dist/{codec-DAePx2NL.d.ts → codec-CviAa4lp.d.ts} +2 -2
  40. package/dist/{codec-DJmV04i0.d.ts → codec-D4RvFQmu.d.ts} +1 -1
  41. package/dist/{codec-cou9XBMF.d.cts → codec-DAyiF5sq.d.cts} +1 -1
  42. package/dist/{codec-CyApDKwf.d.cts → codec-DJmqoIsp.d.cts} +1 -1
  43. package/dist/{codec-NMsTK0GX.d.cts → codec-DchsPfr3.d.cts} +1 -1
  44. package/dist/{codec-DplRgIKq.d.ts → codec-Dl_QIXMz.d.ts} +1 -1
  45. package/dist/{codec-BnamSx7L.d.cts → codec-DzLvG8Wb.d.cts} +2 -2
  46. package/dist/{codec-D95gT98n.d.cts → codec-DzkdW4kO.d.cts} +1 -1
  47. package/dist/{codec-CWj5iTxA.d.ts → codec-O-1Js7h4.d.ts} +1 -1
  48. package/dist/{codec-BqqoYdh_.d.cts → codec-vddqy0KY.d.cts} +1 -1
  49. package/dist/draft07-session.d.cts +3 -3
  50. package/dist/draft07-session.d.ts +3 -3
  51. package/dist/draft07.d.cts +3 -3
  52. package/dist/draft07.d.ts +3 -3
  53. package/dist/draft08-session.d.cts +3 -3
  54. package/dist/draft08-session.d.ts +3 -3
  55. package/dist/draft08.d.cts +4 -4
  56. package/dist/draft08.d.ts +4 -4
  57. package/dist/draft09-session.d.cts +3 -3
  58. package/dist/draft09-session.d.ts +3 -3
  59. package/dist/draft09.d.cts +4 -4
  60. package/dist/draft09.d.ts +4 -4
  61. package/dist/draft10-session.d.cts +3 -3
  62. package/dist/draft10-session.d.ts +3 -3
  63. package/dist/draft10.d.cts +4 -4
  64. package/dist/draft10.d.ts +4 -4
  65. package/dist/draft11-session.d.cts +3 -3
  66. package/dist/draft11-session.d.ts +3 -3
  67. package/dist/draft11.d.cts +4 -4
  68. package/dist/draft11.d.ts +4 -4
  69. package/dist/draft12-session.d.cts +3 -3
  70. package/dist/draft12-session.d.ts +3 -3
  71. package/dist/draft12.cjs +2 -2
  72. package/dist/draft12.d.cts +4 -4
  73. package/dist/draft12.d.ts +4 -4
  74. package/dist/draft12.js +1 -1
  75. package/dist/draft13-session.d.cts +3 -3
  76. package/dist/draft13-session.d.ts +3 -3
  77. package/dist/draft13.d.cts +4 -4
  78. package/dist/draft13.d.ts +4 -4
  79. package/dist/draft14-session.d.cts +4 -4
  80. package/dist/draft14-session.d.ts +4 -4
  81. package/dist/draft14.cjs +2 -2
  82. package/dist/draft14.d.cts +6 -6
  83. package/dist/draft14.d.ts +6 -6
  84. package/dist/draft14.js +1 -1
  85. package/dist/draft15-session.d.cts +3 -3
  86. package/dist/draft15-session.d.ts +3 -3
  87. package/dist/draft15.cjs +2 -2
  88. package/dist/draft15.d.cts +4 -4
  89. package/dist/draft15.d.ts +4 -4
  90. package/dist/draft15.js +1 -1
  91. package/dist/draft16-session.d.cts +3 -3
  92. package/dist/draft16-session.d.ts +3 -3
  93. package/dist/draft16.cjs +2 -2
  94. package/dist/draft16.d.cts +4 -4
  95. package/dist/draft16.d.ts +4 -4
  96. package/dist/draft16.js +1 -1
  97. package/dist/draft17-session.d.cts +3 -3
  98. package/dist/draft17-session.d.ts +3 -3
  99. package/dist/draft17.cjs +2 -2
  100. package/dist/draft17.d.cts +3 -3
  101. package/dist/draft17.d.ts +3 -3
  102. package/dist/draft17.js +1 -1
  103. package/dist/draft18-session.d.cts +3 -3
  104. package/dist/draft18-session.d.ts +3 -3
  105. package/dist/draft18.cjs +2 -2
  106. package/dist/draft18.d.cts +3 -3
  107. package/dist/draft18.d.ts +3 -3
  108. package/dist/draft18.js +1 -1
  109. package/dist/draft19-session.d.cts +3 -3
  110. package/dist/draft19-session.d.ts +3 -3
  111. package/dist/draft19.cjs +2 -2
  112. package/dist/draft19.d.cts +3 -3
  113. package/dist/draft19.d.ts +3 -3
  114. package/dist/draft19.js +1 -1
  115. package/dist/draft20-session.cjs +8 -0
  116. package/dist/draft20-session.d.cts +195 -0
  117. package/dist/draft20-session.d.ts +195 -0
  118. package/dist/draft20-session.js +8 -0
  119. package/dist/draft20.cjs +217 -0
  120. package/dist/draft20.d.cts +175 -0
  121. package/dist/draft20.d.ts +175 -0
  122. package/dist/draft20.js +217 -0
  123. package/dist/index.cjs +21 -15
  124. package/dist/index.d.cts +33 -18
  125. package/dist/index.d.ts +33 -18
  126. package/dist/index.js +14 -8
  127. package/dist/{session-types-KsqyVp6y.d.cts → session-types-B9idsih-.d.cts} +13 -1
  128. package/dist/{session-types-C0l_-Ups.d.ts → session-types-Dn7b3RZM.d.ts} +13 -1
  129. package/dist/session.cjs +5 -1
  130. package/dist/session.d.cts +6 -4
  131. package/dist/session.d.ts +6 -4
  132. package/dist/session.js +5 -1
  133. package/dist/types-CWCQwuvy.d.cts +359 -0
  134. package/dist/types-CWCQwuvy.d.ts +359 -0
  135. package/dist/{types-CdCSIfvI.d.cts → types-DG5_iKuv.d.cts} +1 -1
  136. package/dist/{types-CdCSIfvI.d.ts → types-DG5_iKuv.d.ts} +1 -1
  137. package/dist/{types-CVeKIk7A.d.cts → types-HI_bbXka.d.cts} +0 -2
  138. package/dist/{types-CVeKIk7A.d.ts → types-HI_bbXka.d.ts} +0 -2
  139. package/package.json +16 -3
  140. package/src/core/session-types.ts +7 -0
  141. package/src/core/types.ts +1 -0
  142. package/src/drafts/draft12/data-streams.ts +13 -4
  143. package/src/drafts/draft14/codec.ts +2 -6
  144. package/src/drafts/draft14/types.ts +0 -2
  145. package/src/drafts/draft15/data-streams.ts +30 -16
  146. package/src/drafts/draft16/codec.ts +116 -93
  147. package/src/drafts/draft17/codec.ts +72 -35
  148. package/src/drafts/draft18/codec.ts +89 -53
  149. package/src/drafts/draft19/codec.ts +98 -55
  150. package/src/drafts/draft20/codec.ts +1737 -0
  151. package/src/drafts/draft20/data-streams.ts +1291 -0
  152. package/src/drafts/draft20/error-codes.ts +135 -0
  153. package/src/drafts/draft20/index.ts +165 -0
  154. package/src/drafts/draft20/messages.ts +68 -0
  155. package/src/drafts/draft20/rules.ts +107 -0
  156. package/src/drafts/draft20/session-fsm.ts +1063 -0
  157. package/src/drafts/draft20/session.ts +21 -0
  158. package/src/drafts/draft20/types.ts +455 -0
  159. package/src/index.ts +20 -2
  160. package/src/session.ts +4 -0
@@ -1060,6 +1060,29 @@ var PARAM_SUBSCRIBER_PRIORITY = 0x20n;
1060
1060
  var PARAM_SUBSCRIPTION_FILTER = 0x21n;
1061
1061
  var PARAM_GROUP_ORDER = 0x22n;
1062
1062
  var PARAM_NEW_GROUP_REQUEST = 0x32n;
1063
+ var PARAMETER_SCOPE = /* @__PURE__ */ new Map([
1064
+ [0x02n, /* @__PURE__ */ new Set(["publish_ok", "subscribe", "request_update"])],
1065
+ [
1066
+ 0x03n,
1067
+ /* @__PURE__ */ new Set([
1068
+ "publish",
1069
+ "subscribe",
1070
+ "request_update",
1071
+ "subscribe_namespace",
1072
+ "publish_namespace",
1073
+ "track_status",
1074
+ "fetch"
1075
+ ])
1076
+ ],
1077
+ [0x04n, /* @__PURE__ */ new Set(["subscribe"])],
1078
+ [0x08n, /* @__PURE__ */ new Set(["subscribe_ok", "publish", "publish_ok", "request_ok"])],
1079
+ [0x09n, /* @__PURE__ */ new Set(["subscribe_ok", "publish", "request_ok"])],
1080
+ [0x10n, /* @__PURE__ */ new Set(["subscribe", "request_update", "publish", "publish_ok", "subscribe_namespace"])],
1081
+ [0x20n, /* @__PURE__ */ new Set(["subscribe", "fetch", "request_update", "publish_ok"])],
1082
+ [0x21n, /* @__PURE__ */ new Set(["subscribe", "publish_ok", "request_update"])],
1083
+ [0x22n, /* @__PURE__ */ new Set(["subscribe", "publish_ok", "fetch"])],
1084
+ [0x32n, /* @__PURE__ */ new Set(["publish_ok", "subscribe", "request_update"])]
1085
+ ]);
1063
1086
  function encodeParams(params, writer) {
1064
1087
  const entries = [];
1065
1088
  if (params.delivery_timeout !== void 0) {
@@ -1166,15 +1189,22 @@ function encodeParams(params, writer) {
1166
1189
  prevType = entry.type;
1167
1190
  }
1168
1191
  }
1169
- function decodeParams(reader) {
1192
+ function decodeParams(reader, messageType) {
1170
1193
  const count = Number(reader.readVarInt());
1171
1194
  const result = {};
1172
- const unknown = [];
1173
1195
  let prevType = 0n;
1174
1196
  for (let i = 0; i < count; i++) {
1175
1197
  const delta = reader.readVarInt();
1176
1198
  const paramType = prevType + delta;
1177
1199
  prevType = paramType;
1200
+ const scope = PARAMETER_SCOPE.get(paramType);
1201
+ if (scope !== void 0 && !scope.has(messageType)) {
1202
+ throw new DecodeError(
1203
+ "CONSTRAINT_VIOLATION",
1204
+ `Message Parameter 0x${paramType.toString(16)} may not appear in ${messageType}`,
1205
+ reader.offset
1206
+ );
1207
+ }
1178
1208
  if (paramType === PARAM_DELIVERY_TIMEOUT) {
1179
1209
  result.delivery_timeout = reader.readVarInt();
1180
1210
  } else if (paramType === PARAM_AUTHORIZATION_TOKEN) {
@@ -1213,28 +1243,13 @@ function decodeParams(reader) {
1213
1243
  } else if (paramType === PARAM_NEW_GROUP_REQUEST) {
1214
1244
  result.new_group_request = reader.readVarInt();
1215
1245
  } else {
1216
- if (paramType % 2n === 0n) {
1217
- const value = reader.readVarInt();
1218
- const tmpWriter = new Draft17BufferWriter(16);
1219
- tmpWriter.writeVarInt(value);
1220
- const raw = tmpWriter.finish();
1221
- unknown.push({
1222
- id: `0x${paramType.toString(16)}`,
1223
- length: raw.byteLength,
1224
- raw_hex: bytesToHex(raw)
1225
- });
1226
- } else {
1227
- const length = Number(reader.readVarInt());
1228
- const bytes = reader.readBytes(length);
1229
- unknown.push({
1230
- id: `0x${paramType.toString(16)}`,
1231
- length,
1232
- raw_hex: bytesToHex(bytes)
1233
- });
1234
- }
1246
+ throw new DecodeError(
1247
+ "INVALID_PARAMETER",
1248
+ `Unknown Message Parameter type 0x${paramType.toString(16)}`,
1249
+ reader.offset
1250
+ );
1235
1251
  }
1236
1252
  }
1237
- if (unknown.length > 0) result.unknown = unknown;
1238
1253
  return result;
1239
1254
  }
1240
1255
  var TPROP_DELIVERY_TIMEOUT = 0x02n;
@@ -1472,7 +1487,7 @@ function decodeSubscribePayload(r) {
1472
1487
  const required_request_id_delta = r.readVarInt();
1473
1488
  const track_namespace = r.readTuple();
1474
1489
  const track_name = r.readString();
1475
- const parameters = decodeParams(r);
1490
+ const parameters = decodeParams(r, "subscribe");
1476
1491
  return {
1477
1492
  type: "subscribe",
1478
1493
  request_id,
@@ -1484,14 +1499,14 @@ function decodeSubscribePayload(r) {
1484
1499
  }
1485
1500
  function decodeSubscribeOkPayload(r, payloadEnd) {
1486
1501
  const track_alias = r.readVarInt();
1487
- const parameters = decodeParams(r);
1502
+ const parameters = decodeParams(r, "subscribe_ok");
1488
1503
  const track_properties = decodeTrackProperties(r, payloadEnd);
1489
1504
  return { type: "subscribe_ok", track_alias, parameters, track_properties };
1490
1505
  }
1491
1506
  function decodeRequestUpdatePayload(r) {
1492
1507
  const request_id = r.readVarInt();
1493
1508
  const required_request_id_delta = r.readVarInt();
1494
- const parameters = decodeParams(r);
1509
+ const parameters = decodeParams(r, "request_update");
1495
1510
  return {
1496
1511
  type: "request_update",
1497
1512
  request_id,
@@ -1505,7 +1520,7 @@ function decodePublishPayload(r, payloadEnd) {
1505
1520
  const track_namespace = r.readTuple();
1506
1521
  const track_name = r.readString();
1507
1522
  const track_alias = r.readVarInt();
1508
- const parameters = decodeParams(r);
1523
+ const parameters = decodeParams(r, "publish");
1509
1524
  const track_properties = decodeTrackProperties(r, payloadEnd);
1510
1525
  return {
1511
1526
  type: "publish",
@@ -1519,7 +1534,7 @@ function decodePublishPayload(r, payloadEnd) {
1519
1534
  };
1520
1535
  }
1521
1536
  function decodePublishOkPayload(r) {
1522
- const parameters = decodeParams(r);
1537
+ const parameters = decodeParams(r, "publish_ok");
1523
1538
  return { type: "publish_ok", parameters };
1524
1539
  }
1525
1540
  function decodePublishDonePayload(r) {
@@ -1532,7 +1547,7 @@ function decodePublishNamespacePayload(r) {
1532
1547
  const request_id = r.readVarInt();
1533
1548
  const required_request_id_delta = r.readVarInt();
1534
1549
  const track_namespace = r.readTuple();
1535
- const parameters = decodeParams(r);
1550
+ const parameters = decodeParams(r, "publish_namespace");
1536
1551
  return {
1537
1552
  type: "publish_namespace",
1538
1553
  request_id,
@@ -1554,7 +1569,7 @@ function decodeSubscribeNamespacePayload(r) {
1554
1569
  const required_request_id_delta = r.readVarInt();
1555
1570
  const namespace_prefix = r.readTuple();
1556
1571
  const subscribe_options = r.readVarInt();
1557
- const parameters = decodeParams(r);
1572
+ const parameters = decodeParams(r, "subscribe_namespace");
1558
1573
  return {
1559
1574
  type: "subscribe_namespace",
1560
1575
  request_id,
@@ -1599,7 +1614,7 @@ function decodeFetchPayload(r) {
1599
1614
  const joining_start = r.readVarInt();
1600
1615
  joining = { joining_request_id, joining_start };
1601
1616
  }
1602
- const parameters = decodeParams(r);
1617
+ const parameters = decodeParams(r, "fetch");
1603
1618
  return {
1604
1619
  type: "fetch",
1605
1620
  request_id,
@@ -1614,7 +1629,7 @@ function decodeFetchOkPayload(r, payloadEnd) {
1614
1629
  const end_of_track = r.readUint8();
1615
1630
  const end_group = r.readVarInt();
1616
1631
  const end_object = r.readVarInt();
1617
- const parameters = decodeParams(r);
1632
+ const parameters = decodeParams(r, "fetch_ok");
1618
1633
  const track_properties = decodeTrackProperties(r, payloadEnd);
1619
1634
  return {
1620
1635
  type: "fetch_ok",
@@ -1630,7 +1645,7 @@ function decodeTrackStatusPayload(r) {
1630
1645
  const required_request_id_delta = r.readVarInt();
1631
1646
  const track_namespace = r.readTuple();
1632
1647
  const track_name = r.readString();
1633
- const parameters = decodeParams(r);
1648
+ const parameters = decodeParams(r, "track_status");
1634
1649
  return {
1635
1650
  type: "track_status",
1636
1651
  request_id,
@@ -1641,7 +1656,7 @@ function decodeTrackStatusPayload(r) {
1641
1656
  };
1642
1657
  }
1643
1658
  function decodeRequestOkPayload(r) {
1644
- const parameters = decodeParams(r);
1659
+ const parameters = decodeParams(r, "request_ok");
1645
1660
  return { type: "request_ok", parameters };
1646
1661
  }
1647
1662
  function decodeRequestErrorPayload(r) {
@@ -1060,6 +1060,29 @@ var PARAM_SUBSCRIBER_PRIORITY = 0x20n;
1060
1060
  var PARAM_SUBSCRIPTION_FILTER = 0x21n;
1061
1061
  var PARAM_GROUP_ORDER = 0x22n;
1062
1062
  var PARAM_NEW_GROUP_REQUEST = 0x32n;
1063
+ var PARAMETER_SCOPE = /* @__PURE__ */ new Map([
1064
+ [0x02n, /* @__PURE__ */ new Set(["publish_ok", "subscribe", "request_update"])],
1065
+ [
1066
+ 0x03n,
1067
+ /* @__PURE__ */ new Set([
1068
+ "publish",
1069
+ "subscribe",
1070
+ "request_update",
1071
+ "subscribe_namespace",
1072
+ "publish_namespace",
1073
+ "track_status",
1074
+ "fetch"
1075
+ ])
1076
+ ],
1077
+ [0x04n, /* @__PURE__ */ new Set(["subscribe"])],
1078
+ [0x08n, /* @__PURE__ */ new Set(["subscribe_ok", "publish", "publish_ok", "request_ok"])],
1079
+ [0x09n, /* @__PURE__ */ new Set(["subscribe_ok", "publish", "request_ok"])],
1080
+ [0x10n, /* @__PURE__ */ new Set(["subscribe", "request_update", "publish", "publish_ok", "subscribe_namespace"])],
1081
+ [0x20n, /* @__PURE__ */ new Set(["subscribe", "fetch", "request_update", "publish_ok"])],
1082
+ [0x21n, /* @__PURE__ */ new Set(["subscribe", "publish_ok", "request_update"])],
1083
+ [0x22n, /* @__PURE__ */ new Set(["subscribe", "publish_ok", "fetch"])],
1084
+ [0x32n, /* @__PURE__ */ new Set(["publish_ok", "subscribe", "request_update"])]
1085
+ ]);
1063
1086
  function encodeParams(params, writer) {
1064
1087
  const entries = [];
1065
1088
  if (params.delivery_timeout !== void 0) {
@@ -1166,15 +1189,22 @@ function encodeParams(params, writer) {
1166
1189
  prevType = entry.type;
1167
1190
  }
1168
1191
  }
1169
- function decodeParams(reader) {
1192
+ function decodeParams(reader, messageType) {
1170
1193
  const count = Number(reader.readVarInt());
1171
1194
  const result = {};
1172
- const unknown = [];
1173
1195
  let prevType = 0n;
1174
1196
  for (let i = 0; i < count; i++) {
1175
1197
  const delta = reader.readVarInt();
1176
1198
  const paramType = prevType + delta;
1177
1199
  prevType = paramType;
1200
+ const scope = PARAMETER_SCOPE.get(paramType);
1201
+ if (scope !== void 0 && !scope.has(messageType)) {
1202
+ throw new (0, _chunk4XLYCT5Qcjs.DecodeError)(
1203
+ "CONSTRAINT_VIOLATION",
1204
+ `Message Parameter 0x${paramType.toString(16)} may not appear in ${messageType}`,
1205
+ reader.offset
1206
+ );
1207
+ }
1178
1208
  if (paramType === PARAM_DELIVERY_TIMEOUT) {
1179
1209
  result.delivery_timeout = reader.readVarInt();
1180
1210
  } else if (paramType === PARAM_AUTHORIZATION_TOKEN) {
@@ -1213,28 +1243,13 @@ function decodeParams(reader) {
1213
1243
  } else if (paramType === PARAM_NEW_GROUP_REQUEST) {
1214
1244
  result.new_group_request = reader.readVarInt();
1215
1245
  } else {
1216
- if (paramType % 2n === 0n) {
1217
- const value = reader.readVarInt();
1218
- const tmpWriter = new (0, _chunk4XLYCT5Qcjs.Draft17BufferWriter)(16);
1219
- tmpWriter.writeVarInt(value);
1220
- const raw = tmpWriter.finish();
1221
- unknown.push({
1222
- id: `0x${paramType.toString(16)}`,
1223
- length: raw.byteLength,
1224
- raw_hex: _chunk4XLYCT5Qcjs.bytesToHex.call(void 0, raw)
1225
- });
1226
- } else {
1227
- const length = Number(reader.readVarInt());
1228
- const bytes = reader.readBytes(length);
1229
- unknown.push({
1230
- id: `0x${paramType.toString(16)}`,
1231
- length,
1232
- raw_hex: _chunk4XLYCT5Qcjs.bytesToHex.call(void 0, bytes)
1233
- });
1234
- }
1246
+ throw new (0, _chunk4XLYCT5Qcjs.DecodeError)(
1247
+ "INVALID_PARAMETER",
1248
+ `Unknown Message Parameter type 0x${paramType.toString(16)}`,
1249
+ reader.offset
1250
+ );
1235
1251
  }
1236
1252
  }
1237
- if (unknown.length > 0) result.unknown = unknown;
1238
1253
  return result;
1239
1254
  }
1240
1255
  var TPROP_DELIVERY_TIMEOUT = 0x02n;
@@ -1472,7 +1487,7 @@ function decodeSubscribePayload(r) {
1472
1487
  const required_request_id_delta = r.readVarInt();
1473
1488
  const track_namespace = r.readTuple();
1474
1489
  const track_name = r.readString();
1475
- const parameters = decodeParams(r);
1490
+ const parameters = decodeParams(r, "subscribe");
1476
1491
  return {
1477
1492
  type: "subscribe",
1478
1493
  request_id,
@@ -1484,14 +1499,14 @@ function decodeSubscribePayload(r) {
1484
1499
  }
1485
1500
  function decodeSubscribeOkPayload(r, payloadEnd) {
1486
1501
  const track_alias = r.readVarInt();
1487
- const parameters = decodeParams(r);
1502
+ const parameters = decodeParams(r, "subscribe_ok");
1488
1503
  const track_properties = decodeTrackProperties(r, payloadEnd);
1489
1504
  return { type: "subscribe_ok", track_alias, parameters, track_properties };
1490
1505
  }
1491
1506
  function decodeRequestUpdatePayload(r) {
1492
1507
  const request_id = r.readVarInt();
1493
1508
  const required_request_id_delta = r.readVarInt();
1494
- const parameters = decodeParams(r);
1509
+ const parameters = decodeParams(r, "request_update");
1495
1510
  return {
1496
1511
  type: "request_update",
1497
1512
  request_id,
@@ -1505,7 +1520,7 @@ function decodePublishPayload(r, payloadEnd) {
1505
1520
  const track_namespace = r.readTuple();
1506
1521
  const track_name = r.readString();
1507
1522
  const track_alias = r.readVarInt();
1508
- const parameters = decodeParams(r);
1523
+ const parameters = decodeParams(r, "publish");
1509
1524
  const track_properties = decodeTrackProperties(r, payloadEnd);
1510
1525
  return {
1511
1526
  type: "publish",
@@ -1519,7 +1534,7 @@ function decodePublishPayload(r, payloadEnd) {
1519
1534
  };
1520
1535
  }
1521
1536
  function decodePublishOkPayload(r) {
1522
- const parameters = decodeParams(r);
1537
+ const parameters = decodeParams(r, "publish_ok");
1523
1538
  return { type: "publish_ok", parameters };
1524
1539
  }
1525
1540
  function decodePublishDonePayload(r) {
@@ -1532,7 +1547,7 @@ function decodePublishNamespacePayload(r) {
1532
1547
  const request_id = r.readVarInt();
1533
1548
  const required_request_id_delta = r.readVarInt();
1534
1549
  const track_namespace = r.readTuple();
1535
- const parameters = decodeParams(r);
1550
+ const parameters = decodeParams(r, "publish_namespace");
1536
1551
  return {
1537
1552
  type: "publish_namespace",
1538
1553
  request_id,
@@ -1554,7 +1569,7 @@ function decodeSubscribeNamespacePayload(r) {
1554
1569
  const required_request_id_delta = r.readVarInt();
1555
1570
  const namespace_prefix = r.readTuple();
1556
1571
  const subscribe_options = r.readVarInt();
1557
- const parameters = decodeParams(r);
1572
+ const parameters = decodeParams(r, "subscribe_namespace");
1558
1573
  return {
1559
1574
  type: "subscribe_namespace",
1560
1575
  request_id,
@@ -1599,7 +1614,7 @@ function decodeFetchPayload(r) {
1599
1614
  const joining_start = r.readVarInt();
1600
1615
  joining = { joining_request_id, joining_start };
1601
1616
  }
1602
- const parameters = decodeParams(r);
1617
+ const parameters = decodeParams(r, "fetch");
1603
1618
  return {
1604
1619
  type: "fetch",
1605
1620
  request_id,
@@ -1614,7 +1629,7 @@ function decodeFetchOkPayload(r, payloadEnd) {
1614
1629
  const end_of_track = r.readUint8();
1615
1630
  const end_group = r.readVarInt();
1616
1631
  const end_object = r.readVarInt();
1617
- const parameters = decodeParams(r);
1632
+ const parameters = decodeParams(r, "fetch_ok");
1618
1633
  const track_properties = decodeTrackProperties(r, payloadEnd);
1619
1634
  return {
1620
1635
  type: "fetch_ok",
@@ -1630,7 +1645,7 @@ function decodeTrackStatusPayload(r) {
1630
1645
  const required_request_id_delta = r.readVarInt();
1631
1646
  const track_namespace = r.readTuple();
1632
1647
  const track_name = r.readString();
1633
- const parameters = decodeParams(r);
1648
+ const parameters = decodeParams(r, "track_status");
1634
1649
  return {
1635
1650
  type: "track_status",
1636
1651
  request_id,
@@ -1641,7 +1656,7 @@ function decodeTrackStatusPayload(r) {
1641
1656
  };
1642
1657
  }
1643
1658
  function decodeRequestOkPayload(r) {
1644
- const parameters = decodeParams(r);
1659
+ const parameters = decodeParams(r, "request_ok");
1645
1660
  return { type: "request_ok", parameters };
1646
1661
  }
1647
1662
  function decodeRequestErrorPayload(r) {
@@ -1173,6 +1173,38 @@ function decodeRangeFilter(reader, hasProperty) {
1173
1173
  }
1174
1174
  return property_type !== void 0 ? { set_id, property_type, ranges } : { set_id, ranges };
1175
1175
  }
1176
+ var PARAMETER_SCOPE = /* @__PURE__ */ new Map([
1177
+ [0x02n, /* @__PURE__ */ new Set(["request_ok", "subscribe", "request_update", "subscribe_tracks"])],
1178
+ [
1179
+ 0x03n,
1180
+ /* @__PURE__ */ new Set([
1181
+ "publish",
1182
+ "subscribe",
1183
+ "request_update",
1184
+ "subscribe_namespace",
1185
+ "subscribe_tracks",
1186
+ "publish_namespace",
1187
+ "track_status",
1188
+ "fetch"
1189
+ ])
1190
+ ],
1191
+ [0x04n, /* @__PURE__ */ new Set(["subscribe", "subscribe_tracks"])],
1192
+ [0x06n, /* @__PURE__ */ new Set(["request_ok", "subscribe", "request_update", "subscribe_tracks"])],
1193
+ [0x08n, /* @__PURE__ */ new Set(["subscribe_ok", "publish", "request_ok"])],
1194
+ [0x09n, /* @__PURE__ */ new Set(["subscribe_ok", "publish", "request_ok"])],
1195
+ [0x0an, /* @__PURE__ */ new Set(["fetch"])],
1196
+ [0x10n, /* @__PURE__ */ new Set(["subscribe", "request_update", "publish", "request_ok", "subscribe_tracks"])],
1197
+ [0x20n, /* @__PURE__ */ new Set(["subscribe", "fetch", "request_update", "request_ok", "subscribe_tracks"])],
1198
+ [0x21n, /* @__PURE__ */ new Set(["subscribe", "request_ok", "request_update", "subscribe_tracks"])],
1199
+ [0x22n, /* @__PURE__ */ new Set(["subscribe", "subscribe_tracks", "fetch"])],
1200
+ [0x25n, /* @__PURE__ */ new Set(["fetch", "subscribe", "subscribe_tracks", "request_ok", "request_update"])],
1201
+ [0x26n, /* @__PURE__ */ new Set(["fetch", "subscribe", "subscribe_tracks", "request_ok", "request_update"])],
1202
+ [0x27n, /* @__PURE__ */ new Set(["fetch", "subscribe", "subscribe_tracks", "request_ok", "request_update"])],
1203
+ [0x28n, /* @__PURE__ */ new Set(["fetch", "subscribe", "subscribe_tracks", "request_ok", "request_update"])],
1204
+ [0x29n, /* @__PURE__ */ new Set(["subscribe_tracks", "request_update"])],
1205
+ [0x32n, /* @__PURE__ */ new Set(["request_ok", "subscribe", "request_update", "subscribe_tracks"])],
1206
+ [0x34n, /* @__PURE__ */ new Set(["request_update"])]
1207
+ ]);
1176
1208
  function encodeParams(params, writer) {
1177
1209
  const entries = [];
1178
1210
  if (params.object_delivery_timeout !== void 0) {
@@ -1214,13 +1246,12 @@ function encodeParams(params, writer) {
1214
1246
  if (params.largest_object !== void 0) {
1215
1247
  entries.push({
1216
1248
  type: PARAM_LARGEST_OBJECT,
1249
+ // A Location is "Two consecutive varints (Group, Object)", which is a
1250
+ // different value encoding from "Length-prefixed". Nothing states the
1251
+ // length, so nothing writes one.
1217
1252
  encode: (w) => {
1218
- const tmpW = new MoqtBufferWriter(16);
1219
- tmpW.writeVarInt(params.largest_object.group);
1220
- tmpW.writeVarInt(params.largest_object.object);
1221
- const raw = tmpW.finish();
1222
- w.writeVarInt(BigInt(raw.byteLength));
1223
- w.writeBytes(raw);
1253
+ w.writeVarInt(params.largest_object.group);
1254
+ w.writeVarInt(params.largest_object.object);
1224
1255
  }
1225
1256
  });
1226
1257
  }
@@ -1307,12 +1338,11 @@ function encodeParams(params, writer) {
1307
1338
  if (params.track_namespace_prefix !== void 0) {
1308
1339
  entries.push({
1309
1340
  type: PARAM_TRACK_NAMESPACE_PREFIX,
1341
+ // The parameter "uses the Track Namespace encoding", which is a tuple
1342
+ // that states its own field count. That is not the Length-prefixed
1343
+ // encoding, so there is no byte length ahead of it.
1310
1344
  encode: (w) => {
1311
- const tmpW = new MoqtBufferWriter(32);
1312
- encodeNamespaceTuple(params.track_namespace_prefix, tmpW);
1313
- const raw = tmpW.finish();
1314
- w.writeVarInt(BigInt(raw.byteLength));
1315
- w.writeBytes(raw);
1345
+ encodeNamespaceTuple(params.track_namespace_prefix, w);
1316
1346
  }
1317
1347
  });
1318
1348
  }
@@ -1337,15 +1367,22 @@ function encodeParams(params, writer) {
1337
1367
  prevType = entry.type;
1338
1368
  }
1339
1369
  }
1340
- function decodeParams(reader) {
1370
+ function decodeParams(reader, messageType) {
1341
1371
  const count = Number(reader.readVarInt());
1342
1372
  const result = {};
1343
- const unknown = [];
1344
1373
  let prevType = 0n;
1345
1374
  for (let i = 0; i < count; i++) {
1346
1375
  const delta = reader.readVarInt();
1347
1376
  const paramType = prevType + delta;
1348
1377
  prevType = paramType;
1378
+ const scope = PARAMETER_SCOPE.get(paramType);
1379
+ if (scope !== void 0 && !scope.has(messageType)) {
1380
+ throw new DecodeError(
1381
+ "CONSTRAINT_VIOLATION",
1382
+ `Message Parameter 0x${paramType.toString(16)} may not appear in ${messageType}`,
1383
+ reader.offset
1384
+ );
1385
+ }
1349
1386
  if (paramType === PARAM_OBJECT_DELIVERY_TIMEOUT) {
1350
1387
  result.object_delivery_timeout = reader.readVarInt();
1351
1388
  } else if (paramType === PARAM_AUTHORIZATION_TOKEN) {
@@ -1359,12 +1396,8 @@ function decodeParams(reader) {
1359
1396
  } else if (paramType === PARAM_EXPIRES) {
1360
1397
  result.expires = reader.readVarInt();
1361
1398
  } else if (paramType === PARAM_LARGEST_OBJECT) {
1362
- const length = Number(reader.readVarInt());
1363
- const startOff = reader.offset;
1364
1399
  const group = reader.readVarInt();
1365
1400
  const object = reader.readVarInt();
1366
- const consumed = reader.offset - startOff;
1367
- if (consumed < length) reader.readBytes(length - consumed);
1368
1401
  result.largest_object = { group, object };
1369
1402
  } else if (paramType === PARAM_FILL_TIMEOUT) {
1370
1403
  result.fill_timeout = reader.readVarInt();
@@ -1402,32 +1435,15 @@ function decodeParams(reader) {
1402
1435
  } else if (paramType === PARAM_NEW_GROUP_REQUEST) {
1403
1436
  result.new_group_request = reader.readVarInt();
1404
1437
  } else if (paramType === PARAM_TRACK_NAMESPACE_PREFIX) {
1405
- const length = Number(reader.readVarInt());
1406
- const bytes = reader.readBytes(length);
1407
- result.track_namespace_prefix = decodeNamespaceTuple(new MoqtBufferReader(bytes));
1438
+ result.track_namespace_prefix = decodeNamespaceTuple(reader);
1408
1439
  } else {
1409
- if (paramType % 2n === 0n) {
1410
- const value = reader.readVarInt();
1411
- const tmpWriter = new MoqtBufferWriter(16);
1412
- tmpWriter.writeVarInt(value);
1413
- const raw = tmpWriter.finish();
1414
- unknown.push({
1415
- id: `0x${paramType.toString(16)}`,
1416
- length: raw.byteLength,
1417
- raw_hex: bytesToHex(raw)
1418
- });
1419
- } else {
1420
- const length = Number(reader.readVarInt());
1421
- const bytes = reader.readBytes(length);
1422
- unknown.push({
1423
- id: `0x${paramType.toString(16)}`,
1424
- length,
1425
- raw_hex: bytesToHex(bytes)
1426
- });
1427
- }
1440
+ throw new DecodeError(
1441
+ "INVALID_PARAMETER",
1442
+ `Unknown Message Parameter type 0x${paramType.toString(16)}`,
1443
+ reader.offset
1444
+ );
1428
1445
  }
1429
1446
  }
1430
- if (unknown.length > 0) result.unknown = unknown;
1431
1447
  return result;
1432
1448
  }
1433
1449
  var TPROP_OBJECT_DELIVERY_TIMEOUT = 0x02n;
@@ -1686,7 +1702,7 @@ function decodeSubscribePayload(r) {
1686
1702
  const request_id = r.readVarInt();
1687
1703
  const track_namespace = r.readTuple();
1688
1704
  const track_name = r.readString();
1689
- const parameters = decodeParams(r);
1705
+ const parameters = decodeParams(r, "subscribe");
1690
1706
  return {
1691
1707
  type: "subscribe",
1692
1708
  request_id,
@@ -1697,13 +1713,13 @@ function decodeSubscribePayload(r) {
1697
1713
  }
1698
1714
  function decodeSubscribeOkPayload(r, payloadEnd) {
1699
1715
  const track_alias = r.readVarInt();
1700
- const parameters = decodeParams(r);
1716
+ const parameters = decodeParams(r, "subscribe_ok");
1701
1717
  const track_properties = decodeTrackProperties(r, payloadEnd);
1702
1718
  return { type: "subscribe_ok", track_alias, parameters, track_properties };
1703
1719
  }
1704
1720
  function decodeRequestUpdatePayload(r) {
1705
1721
  const request_id = r.readVarInt();
1706
- const parameters = decodeParams(r);
1722
+ const parameters = decodeParams(r, "request_update");
1707
1723
  return {
1708
1724
  type: "request_update",
1709
1725
  request_id,
@@ -1715,7 +1731,7 @@ function decodePublishPayload(r, payloadEnd) {
1715
1731
  const track_namespace = r.readTuple();
1716
1732
  const track_name = r.readString();
1717
1733
  const track_alias = r.readVarInt();
1718
- const parameters = decodeParams(r);
1734
+ const parameters = decodeParams(r, "publish");
1719
1735
  const track_properties = decodeTrackProperties(r, payloadEnd);
1720
1736
  return {
1721
1737
  type: "publish",
@@ -1736,7 +1752,7 @@ function decodePublishDonePayload(r) {
1736
1752
  function decodePublishNamespacePayload(r) {
1737
1753
  const request_id = r.readVarInt();
1738
1754
  const track_namespace = r.readTuple();
1739
- const parameters = decodeParams(r);
1755
+ const parameters = decodeParams(r, "publish_namespace");
1740
1756
  return {
1741
1757
  type: "publish_namespace",
1742
1758
  request_id,
@@ -1755,7 +1771,7 @@ function decodeNamespaceDonePayload(r) {
1755
1771
  function decodeSubscribeNamespacePayload(r) {
1756
1772
  const request_id = r.readVarInt();
1757
1773
  const namespace_prefix = r.readTuple();
1758
- const parameters = decodeParams(r);
1774
+ const parameters = decodeParams(r, "subscribe_namespace");
1759
1775
  return {
1760
1776
  type: "subscribe_namespace",
1761
1777
  request_id,
@@ -1766,7 +1782,7 @@ function decodeSubscribeNamespacePayload(r) {
1766
1782
  function decodeSubscribeTracksPayload(r) {
1767
1783
  const request_id = r.readVarInt();
1768
1784
  const namespace_prefix = r.readTuple();
1769
- const parameters = decodeParams(r);
1785
+ const parameters = decodeParams(r, "subscribe_tracks");
1770
1786
  return {
1771
1787
  type: "subscribe_tracks",
1772
1788
  request_id,
@@ -1808,7 +1824,7 @@ function decodeFetchPayload(r) {
1808
1824
  const joining_start = r.readVarInt();
1809
1825
  joining = { joining_request_id, joining_start };
1810
1826
  }
1811
- const parameters = decodeParams(r);
1827
+ const parameters = decodeParams(r, "fetch");
1812
1828
  return {
1813
1829
  type: "fetch",
1814
1830
  request_id,
@@ -1822,7 +1838,7 @@ function decodeFetchOkPayload(r, payloadEnd) {
1822
1838
  const end_of_track = r.readUint8();
1823
1839
  const end_group = r.readVarInt();
1824
1840
  const end_object = r.readVarInt();
1825
- const parameters = decodeParams(r);
1841
+ const parameters = decodeParams(r, "fetch_ok");
1826
1842
  const track_properties = decodeTrackProperties(r, payloadEnd);
1827
1843
  return {
1828
1844
  type: "fetch_ok",
@@ -1837,7 +1853,7 @@ function decodeTrackStatusPayload(r) {
1837
1853
  const request_id = r.readVarInt();
1838
1854
  const track_namespace = r.readTuple();
1839
1855
  const track_name = r.readString();
1840
- const parameters = decodeParams(r);
1856
+ const parameters = decodeParams(r, "track_status");
1841
1857
  return {
1842
1858
  type: "track_status",
1843
1859
  request_id,
@@ -1847,7 +1863,7 @@ function decodeTrackStatusPayload(r) {
1847
1863
  };
1848
1864
  }
1849
1865
  function decodeRequestOkPayload(r, payloadEnd) {
1850
- const parameters = decodeParams(r);
1866
+ const parameters = decodeParams(r, "request_ok");
1851
1867
  const track_properties = decodeTrackProperties(r, payloadEnd);
1852
1868
  return { type: "request_ok", parameters, track_properties };
1853
1869
  }
@@ -2032,7 +2048,9 @@ function createStreamDecoder() {
2032
2048
  }
2033
2049
  function createDraft19Codec() {
2034
2050
  return {
2035
- draft: "18",
2051
+ // Was '18' — a copy-paste from draft18/codec.ts. createSessionState() keys
2052
+ // off codec.draft, so a draft-19 codec was handing back a draft-18 FSM.
2053
+ draft: "19",
2036
2054
  encodeMessage,
2037
2055
  decodeMessage,
2038
2056
  encodeSubgroupStream,