@moqtap/codec 0.5.0 → 0.7.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 (170) hide show
  1. package/README.md +4 -2
  2. package/dist/{chunk-CXFAQKL3.js → chunk-23KRITJ6.js} +1 -1
  3. package/dist/{chunk-JL3NEW3O.cjs → chunk-4XLYCT5Q.cjs} +90 -1
  4. package/dist/{chunk-DLSGOZ6P.js → chunk-5XZKO2U5.js} +34 -34
  5. package/dist/chunk-APTV6F72.js +2095 -0
  6. package/dist/{chunk-JB5VDJ2V.cjs → chunk-B56AG5HU.cjs} +37 -37
  7. package/dist/chunk-CQ65LKPQ.cjs +446 -0
  8. package/dist/{chunk-4HBKHNU2.cjs → chunk-CZNW3R5E.cjs} +37 -37
  9. package/dist/{chunk-Q5D6OW6Q.js → chunk-DORX55MO.js} +1 -1
  10. package/dist/{chunk-OGZTQA24.cjs → chunk-EQAYMCXO.cjs} +64 -64
  11. package/dist/{chunk-HYI6LFMD.js → chunk-HEO2JG6C.js} +1 -1
  12. package/dist/{chunk-UP4XPH4J.js → chunk-I55J3KXD.js} +31 -31
  13. package/dist/{chunk-HZHSO7EW.cjs → chunk-IDV2JYJ6.cjs} +39 -39
  14. package/dist/{chunk-BAG6YWCP.cjs → chunk-IEJULBKB.cjs} +63 -63
  15. package/dist/{chunk-Y6KCSM3V.js → chunk-IJAF6PAY.js} +1 -1
  16. package/dist/{chunk-WMJVSBBE.cjs → chunk-J3ASFPCX.cjs} +57 -57
  17. package/dist/{chunk-COWGGUL4.js → chunk-JKMYAUGY.js} +1 -1
  18. package/dist/{chunk-SIYYMFCC.cjs → chunk-KCH4BQXK.cjs} +37 -37
  19. package/dist/{chunk-VOU7PNHI.js → chunk-KLPWJU6W.js} +89 -0
  20. package/dist/{chunk-NZ7GYEMT.js → chunk-KNLPX3YA.js} +1 -1
  21. package/dist/{chunk-A33U4WVS.cjs → chunk-KTVN4P6J.cjs} +67 -67
  22. package/dist/{chunk-7KBAWOBA.js → chunk-KYVTM5VI.js} +1 -1
  23. package/dist/{chunk-RZ3UML47.js → chunk-MD2OA7SE.js} +1 -1
  24. package/dist/chunk-MH7537FB.cjs +2095 -0
  25. package/dist/{chunk-SHMA4PBY.js → chunk-N2V7Z37J.js} +1 -1
  26. package/dist/chunk-O5DQ44TM.js +446 -0
  27. package/dist/{chunk-HO44OANK.cjs → chunk-QGIHC6BA.cjs} +36 -36
  28. package/dist/{chunk-PKEOQSSZ.cjs → chunk-RIIA4ALQ.cjs} +37 -37
  29. package/dist/{chunk-XZE5R57R.cjs → chunk-VZHL2U2N.cjs} +37 -37
  30. package/dist/{chunk-RW4UG7CN.js → chunk-XHAP2YST.js} +1 -1
  31. package/dist/{chunk-JTRU76JN.cjs → chunk-Y4FRXYX6.cjs} +59 -59
  32. package/dist/{codec-yJ_axwtp.d.cts → codec-B1snaM9L.d.cts} +1 -1
  33. package/dist/{codec-Tdey03Bo.d.ts → codec-BLYAy2OP.d.ts} +1 -1
  34. package/dist/{codec-DqHwYWM-.d.ts → codec-BNS3gS77.d.ts} +1 -1
  35. package/dist/{codec-CBLLytyP.d.cts → codec-BOtv3R5j.d.cts} +1 -1
  36. package/dist/{codec-C17JvsEU.d.cts → codec-BOyrk_C9.d.cts} +1 -1
  37. package/dist/{codec-BsSNjvB3.d.cts → codec-BqqoYdh_.d.cts} +1 -1
  38. package/dist/{codec-BhW5CGZq.d.ts → codec-CI0BjmHc.d.ts} +1 -1
  39. package/dist/{codec-BvzKRqiP.d.ts → codec-CWj5iTxA.d.ts} +1 -1
  40. package/dist/{codec-DbpLHKXN.d.cts → codec-CyApDKwf.d.cts} +1 -1
  41. package/dist/{codec-6s9d5yZm.d.ts → codec-D2JbI2tp.d.ts} +1 -1
  42. package/dist/{codec-BzRIVIzS.d.ts → codec-D47r_-Rl.d.ts} +1 -1
  43. package/dist/{codec-GayA_uN0.d.ts → codec-D49OofBr.d.ts} +1 -1
  44. package/dist/{codec-MxIhLDR5.d.cts → codec-D89DWXbv.d.cts} +1 -1
  45. package/dist/{codec-CzBmYisK.d.cts → codec-D95gT98n.d.cts} +1 -1
  46. package/dist/codec-DAePx2NL.d.ts +30 -0
  47. package/dist/{codec-D_9X0i31.d.ts → codec-DJmV04i0.d.ts} +1 -1
  48. package/dist/{codec-Cbv3sG2y.d.ts → codec-DL0njGkL.d.ts} +1 -1
  49. package/dist/{codec-D2YMCU11.d.cts → codec-DQWQSam3.d.cts} +1 -1
  50. package/dist/{codec-Bp4HPezr.d.ts → codec-DplRgIKq.d.ts} +1 -1
  51. package/dist/{codec-3ZgEK-Yj.d.ts → codec-DujHf55Z.d.ts} +1 -1
  52. package/dist/{codec-DS-As0Pp.d.cts → codec-DvcJgYKq.d.cts} +1 -1
  53. package/dist/{codec-D5Ss123f.d.cts → codec-NMsTK0GX.d.cts} +1 -1
  54. package/dist/{codec-BvSmr-Jp.d.ts → codec-WwwUipaU.d.ts} +1 -1
  55. package/dist/{codec-B6ouUJrm.d.cts → codec-cou9XBMF.d.cts} +1 -1
  56. package/dist/{codec-R28KwiGM.d.cts → codec-hvkJfCF5.d.cts} +1 -1
  57. package/dist/codec-xeuGZY77.d.cts +30 -0
  58. package/dist/draft07-session.d.cts +3 -3
  59. package/dist/draft07-session.d.ts +3 -3
  60. package/dist/draft07.cjs +4 -4
  61. package/dist/draft07.d.cts +3 -3
  62. package/dist/draft07.d.ts +3 -3
  63. package/dist/draft07.js +2 -2
  64. package/dist/draft08-session.d.cts +3 -3
  65. package/dist/draft08-session.d.ts +3 -3
  66. package/dist/draft08.cjs +3 -3
  67. package/dist/draft08.d.cts +4 -4
  68. package/dist/draft08.d.ts +4 -4
  69. package/dist/draft08.js +2 -2
  70. package/dist/draft09-session.d.cts +3 -3
  71. package/dist/draft09-session.d.ts +3 -3
  72. package/dist/draft09.cjs +3 -3
  73. package/dist/draft09.d.cts +4 -4
  74. package/dist/draft09.d.ts +4 -4
  75. package/dist/draft09.js +2 -2
  76. package/dist/draft10-session.d.cts +3 -3
  77. package/dist/draft10-session.d.ts +3 -3
  78. package/dist/draft10.cjs +3 -3
  79. package/dist/draft10.d.cts +4 -4
  80. package/dist/draft10.d.ts +4 -4
  81. package/dist/draft10.js +2 -2
  82. package/dist/draft11-session.d.cts +3 -3
  83. package/dist/draft11-session.d.ts +3 -3
  84. package/dist/draft11.cjs +3 -3
  85. package/dist/draft11.d.cts +4 -4
  86. package/dist/draft11.d.ts +4 -4
  87. package/dist/draft11.js +2 -2
  88. package/dist/draft12-session.d.cts +3 -3
  89. package/dist/draft12-session.d.ts +3 -3
  90. package/dist/draft12.cjs +3 -3
  91. package/dist/draft12.d.cts +4 -4
  92. package/dist/draft12.d.ts +4 -4
  93. package/dist/draft12.js +2 -2
  94. package/dist/draft13-session.d.cts +3 -3
  95. package/dist/draft13-session.d.ts +3 -3
  96. package/dist/draft13.cjs +3 -3
  97. package/dist/draft13.d.cts +4 -4
  98. package/dist/draft13.d.ts +4 -4
  99. package/dist/draft13.js +2 -2
  100. package/dist/draft14-session.d.cts +3 -3
  101. package/dist/draft14-session.d.ts +3 -3
  102. package/dist/draft14.cjs +3 -3
  103. package/dist/draft14.d.cts +4 -4
  104. package/dist/draft14.d.ts +4 -4
  105. package/dist/draft14.js +2 -2
  106. package/dist/draft15-session.d.cts +3 -3
  107. package/dist/draft15-session.d.ts +3 -3
  108. package/dist/draft15.cjs +3 -3
  109. package/dist/draft15.d.cts +4 -4
  110. package/dist/draft15.d.ts +4 -4
  111. package/dist/draft15.js +2 -2
  112. package/dist/draft16-session.d.cts +3 -3
  113. package/dist/draft16-session.d.ts +3 -3
  114. package/dist/draft16.cjs +3 -3
  115. package/dist/draft16.d.cts +4 -4
  116. package/dist/draft16.d.ts +4 -4
  117. package/dist/draft16.js +2 -2
  118. package/dist/draft17-session.d.cts +3 -3
  119. package/dist/draft17-session.d.ts +3 -3
  120. package/dist/draft17.cjs +3 -3
  121. package/dist/draft17.d.cts +3 -3
  122. package/dist/draft17.d.ts +3 -3
  123. package/dist/draft17.js +2 -2
  124. package/dist/draft18-session.d.cts +3 -3
  125. package/dist/draft18-session.d.ts +3 -3
  126. package/dist/draft18.cjs +3 -3
  127. package/dist/draft18.d.cts +3 -3
  128. package/dist/draft18.d.ts +3 -3
  129. package/dist/draft18.js +2 -2
  130. package/dist/draft19-session.cjs +8 -0
  131. package/dist/draft19-session.d.cts +50 -0
  132. package/dist/draft19-session.d.ts +50 -0
  133. package/dist/draft19-session.js +8 -0
  134. package/dist/draft19.cjs +189 -0
  135. package/dist/draft19.d.cts +130 -0
  136. package/dist/draft19.d.ts +130 -0
  137. package/dist/draft19.js +189 -0
  138. package/dist/index.cjs +33 -27
  139. package/dist/index.d.cts +20 -15
  140. package/dist/index.d.ts +20 -15
  141. package/dist/index.js +20 -14
  142. package/dist/{session-types-DBpCRtrL.d.ts → session-types-C0l_-Ups.d.ts} +1 -1
  143. package/dist/{session-types-sBaTRwDh.d.cts → session-types-KsqyVp6y.d.cts} +1 -1
  144. package/dist/session.cjs +5 -1
  145. package/dist/session.d.cts +5 -3
  146. package/dist/session.d.ts +5 -3
  147. package/dist/session.js +5 -1
  148. package/dist/{types-CnBuq68e.d.cts → types-CdCSIfvI.d.cts} +1 -1
  149. package/dist/{types-CnBuq68e.d.ts → types-CdCSIfvI.d.ts} +1 -1
  150. package/dist/types-zHgCS6o5.d.cts +265 -0
  151. package/dist/types-zHgCS6o5.d.ts +265 -0
  152. package/package.json +14 -2
  153. package/src/core/buffer-reader.ts +74 -2
  154. package/src/core/buffer-writer.ts +56 -4
  155. package/src/core/types.ts +1 -0
  156. package/src/drafts/draft17/codec.ts +2 -2
  157. package/src/drafts/draft17/data-streams.ts +2 -2
  158. package/src/drafts/draft18/codec.ts +2 -2
  159. package/src/drafts/draft18/data-streams.ts +2 -2
  160. package/src/drafts/draft19/codec.ts +1425 -0
  161. package/src/drafts/draft19/data-streams.ts +996 -0
  162. package/src/drafts/draft19/error-codes.ts +78 -0
  163. package/src/drafts/draft19/index.ts +126 -0
  164. package/src/drafts/draft19/messages.ts +58 -0
  165. package/src/drafts/draft19/rules.ts +85 -0
  166. package/src/drafts/draft19/session-fsm.ts +451 -0
  167. package/src/drafts/draft19/session.ts +15 -0
  168. package/src/drafts/draft19/types.ts +368 -0
  169. package/src/index.ts +9 -1
  170. package/src/session.ts +4 -0
@@ -4,7 +4,7 @@ import {
4
4
  DecodeError,
5
5
  bytesToHex,
6
6
  hexToBytes
7
- } from "./chunk-VOU7PNHI.js";
7
+ } from "./chunk-KLPWJU6W.js";
8
8
 
9
9
  // src/drafts/draft10/data-streams.ts
10
10
  var SUBGROUP_STREAM_TYPE = 0x04n;
@@ -0,0 +1,446 @@
1
+ // src/drafts/draft19/rules.ts
2
+ var CONTROL_MESSAGES = /* @__PURE__ */ new Set([
3
+ "setup",
4
+ "subscribe",
5
+ "subscribe_ok",
6
+ "request_update",
7
+ "publish",
8
+ "publish_done",
9
+ "publish_namespace",
10
+ "namespace",
11
+ "namespace_done",
12
+ "subscribe_namespace",
13
+ "subscribe_tracks",
14
+ "publish_skipped",
15
+ "fetch",
16
+ "fetch_ok",
17
+ "track_status",
18
+ "request_ok",
19
+ "request_error",
20
+ "goaway"
21
+ ]);
22
+ var CLIENT_ONLY_MESSAGES = /* @__PURE__ */ new Set();
23
+ var SERVER_ONLY_MESSAGES = /* @__PURE__ */ new Set();
24
+ var BIDIRECTIONAL_MESSAGES = /* @__PURE__ */ new Set([
25
+ "setup",
26
+ "subscribe",
27
+ "subscribe_ok",
28
+ "request_update",
29
+ "publish",
30
+ "publish_done",
31
+ "publish_namespace",
32
+ "namespace",
33
+ "namespace_done",
34
+ "subscribe_namespace",
35
+ "subscribe_tracks",
36
+ "publish_skipped",
37
+ "fetch",
38
+ "fetch_ok",
39
+ "track_status",
40
+ "request_ok",
41
+ "request_error",
42
+ "goaway"
43
+ ]);
44
+ function getLegalOutgoing(phase, _role) {
45
+ const legal = /* @__PURE__ */ new Set();
46
+ switch (phase) {
47
+ case "idle":
48
+ legal.add("setup");
49
+ break;
50
+ case "setup":
51
+ legal.add("setup");
52
+ break;
53
+ case "ready": {
54
+ for (const msg of BIDIRECTIONAL_MESSAGES) {
55
+ legal.add(msg);
56
+ }
57
+ break;
58
+ }
59
+ case "draining":
60
+ break;
61
+ }
62
+ return legal;
63
+ }
64
+ function getLegalIncoming(phase, role) {
65
+ const remoteRole = role === "client" ? "server" : "client";
66
+ return getLegalOutgoing(phase, remoteRole);
67
+ }
68
+
69
+ // src/drafts/draft19/session-fsm.ts
70
+ function violation(code, message, currentPhase, offendingMessage) {
71
+ return { code, message, currentPhase, offendingMessage };
72
+ }
73
+ var Draft19SessionFSM = class {
74
+ _phase = "idle";
75
+ _role;
76
+ _setupDirection = null;
77
+ _subscriptions = /* @__PURE__ */ new Map();
78
+ _publishes = /* @__PURE__ */ new Map();
79
+ _fetches = /* @__PURE__ */ new Map();
80
+ _requestIds = /* @__PURE__ */ new Set();
81
+ _pendingSubscribes = [];
82
+ _pendingPublishes = [];
83
+ _pendingFetches = [];
84
+ constructor(role) {
85
+ this._role = role;
86
+ }
87
+ get phase() {
88
+ return this._phase;
89
+ }
90
+ get role() {
91
+ return this._role;
92
+ }
93
+ get subscriptions() {
94
+ return this._subscriptions;
95
+ }
96
+ get announces() {
97
+ return /* @__PURE__ */ new Map();
98
+ }
99
+ get publishes() {
100
+ return this._publishes;
101
+ }
102
+ get fetches() {
103
+ return this._fetches;
104
+ }
105
+ get legalOutgoing() {
106
+ return getLegalOutgoing(this._phase, this._role);
107
+ }
108
+ get legalIncoming() {
109
+ return getLegalIncoming(this._phase, this._role);
110
+ }
111
+ checkDuplicateRequestId(requestId, msgType) {
112
+ if (this._requestIds.has(requestId)) {
113
+ return violation(
114
+ "DUPLICATE_REQUEST_ID",
115
+ `Request ID ${requestId} already in use`,
116
+ this._phase,
117
+ msgType
118
+ );
119
+ }
120
+ return null;
121
+ }
122
+ validateOutgoing(message) {
123
+ if (!this.legalOutgoing.has(message.type)) {
124
+ return {
125
+ ok: false,
126
+ violation: violation(
127
+ this._phase === "idle" || this._phase === "setup" ? "MESSAGE_BEFORE_SETUP" : "UNEXPECTED_MESSAGE",
128
+ `Cannot send ${message.type} in phase ${this._phase}`,
129
+ this._phase,
130
+ message.type
131
+ )
132
+ };
133
+ }
134
+ return { ok: true };
135
+ }
136
+ receive(message) {
137
+ return this.applyTransition(message, "inbound");
138
+ }
139
+ send(message) {
140
+ return this.applyTransition(message, "outbound");
141
+ }
142
+ applyTransition(message, direction) {
143
+ const sideEffects = [];
144
+ switch (message.type) {
145
+ case "setup":
146
+ return this.handleSetup(direction);
147
+ case "goaway":
148
+ return this.handleGoAway(message, sideEffects);
149
+ case "subscribe":
150
+ return this.handleSubscribe(message, sideEffects);
151
+ case "subscribe_ok":
152
+ return this.handleSubscribeOk(message, sideEffects);
153
+ case "request_update":
154
+ return this.handleRequestUpdate(message, sideEffects);
155
+ case "publish":
156
+ return this.handlePublish(message, sideEffects);
157
+ case "publish_done":
158
+ return this.handlePublishDone(message, sideEffects);
159
+ case "fetch":
160
+ return this.handleFetch(message, sideEffects);
161
+ case "fetch_ok":
162
+ return this.handleFetchOk(sideEffects);
163
+ case "request_ok":
164
+ return this.handleRequestOk(sideEffects);
165
+ case "request_error":
166
+ return this.handleRequestError(sideEffects);
167
+ default:
168
+ return this.handleReadyPhaseMessage(message);
169
+ }
170
+ }
171
+ handleSetup(direction) {
172
+ if (this._phase === "idle") {
173
+ this._setupDirection = direction;
174
+ this._phase = "setup";
175
+ return { ok: true, phase: this._phase, sideEffects: [] };
176
+ }
177
+ if (this._phase === "setup") {
178
+ if (direction === this._setupDirection) {
179
+ return {
180
+ ok: false,
181
+ violation: violation(
182
+ "SETUP_VIOLATION",
183
+ `Second SETUP must be ${this._setupDirection === "inbound" ? "outbound" : "inbound"}, got ${direction}`,
184
+ this._phase,
185
+ "setup"
186
+ )
187
+ };
188
+ }
189
+ this._phase = "ready";
190
+ return {
191
+ ok: true,
192
+ phase: this._phase,
193
+ sideEffects: [{ type: "session-ready" }]
194
+ };
195
+ }
196
+ return {
197
+ ok: false,
198
+ violation: violation(
199
+ "SETUP_VIOLATION",
200
+ "SETUP not valid in current phase",
201
+ this._phase,
202
+ "setup"
203
+ )
204
+ };
205
+ }
206
+ handleGoAway(message, sideEffects) {
207
+ if (this._phase !== "ready" && this._phase !== "draining") {
208
+ return {
209
+ ok: false,
210
+ violation: violation(
211
+ "UNEXPECTED_MESSAGE",
212
+ `GOAWAY not valid in phase ${this._phase}`,
213
+ this._phase,
214
+ "goaway"
215
+ )
216
+ };
217
+ }
218
+ this._phase = "draining";
219
+ const goaway = message;
220
+ sideEffects.push({
221
+ type: "session-draining",
222
+ goAwayUri: goaway.new_session_uri
223
+ });
224
+ return { ok: true, phase: this._phase, sideEffects };
225
+ }
226
+ requireReady(msgType) {
227
+ if (this._phase !== "ready" && this._phase !== "draining") {
228
+ return violation(
229
+ this._phase === "idle" || this._phase === "setup" ? "MESSAGE_BEFORE_SETUP" : "UNEXPECTED_MESSAGE",
230
+ `${msgType} requires ready phase, current: ${this._phase}`,
231
+ this._phase,
232
+ msgType
233
+ );
234
+ }
235
+ return null;
236
+ }
237
+ handleSubscribe(message, sideEffects) {
238
+ const err = this.requireReady(message.type);
239
+ if (err) return { ok: false, violation: err };
240
+ const sub = message;
241
+ const dupErr = this.checkDuplicateRequestId(sub.request_id, message.type);
242
+ if (dupErr) return { ok: false, violation: dupErr };
243
+ this._requestIds.add(sub.request_id);
244
+ this._subscriptions.set(sub.request_id, {
245
+ subscribeId: sub.request_id,
246
+ phase: "pending",
247
+ trackNamespace: sub.track_namespace,
248
+ trackName: sub.track_name
249
+ });
250
+ this._pendingSubscribes.push(sub.request_id);
251
+ return { ok: true, phase: this._phase, sideEffects };
252
+ }
253
+ handleSubscribeOk(_message, sideEffects) {
254
+ const err = this.requireReady("subscribe_ok");
255
+ if (err) return { ok: false, violation: err };
256
+ const requestId = this._pendingSubscribes.shift();
257
+ if (requestId === void 0) {
258
+ return {
259
+ ok: false,
260
+ violation: violation(
261
+ "UNEXPECTED_MESSAGE",
262
+ "SUBSCRIBE_OK with no pending subscribe",
263
+ this._phase,
264
+ "subscribe_ok"
265
+ )
266
+ };
267
+ }
268
+ const existing = this._subscriptions.get(requestId);
269
+ if (existing && existing.phase === "pending") {
270
+ this._subscriptions.set(requestId, { ...existing, phase: "active" });
271
+ sideEffects.push({
272
+ type: "subscription-activated",
273
+ subscribeId: requestId
274
+ });
275
+ }
276
+ return { ok: true, phase: this._phase, sideEffects };
277
+ }
278
+ handleRequestUpdate(message, sideEffects) {
279
+ const err = this.requireReady(message.type);
280
+ if (err) return { ok: false, violation: err };
281
+ const update = message;
282
+ const dupErr = this.checkDuplicateRequestId(update.request_id, message.type);
283
+ if (dupErr) return { ok: false, violation: dupErr };
284
+ this._requestIds.add(update.request_id);
285
+ return { ok: true, phase: this._phase, sideEffects };
286
+ }
287
+ handlePublish(message, sideEffects) {
288
+ const err = this.requireReady(message.type);
289
+ if (err) return { ok: false, violation: err };
290
+ const pub = message;
291
+ const dupErr = this.checkDuplicateRequestId(pub.request_id, message.type);
292
+ if (dupErr) return { ok: false, violation: dupErr };
293
+ this._requestIds.add(pub.request_id);
294
+ this._publishes.set(pub.request_id, {
295
+ requestId: pub.request_id,
296
+ phase: "pending"
297
+ });
298
+ this._pendingPublishes.push(pub.request_id);
299
+ return { ok: true, phase: this._phase, sideEffects };
300
+ }
301
+ handlePublishDone(_message, sideEffects) {
302
+ const err = this.requireReady("publish_done");
303
+ if (err) return { ok: false, violation: err };
304
+ for (const [reqId, pub] of this._publishes) {
305
+ if (pub.phase === "active") {
306
+ this._publishes.set(reqId, { ...pub, phase: "done" });
307
+ sideEffects.push({
308
+ type: "publish-ended",
309
+ requestId: reqId,
310
+ reason: "done"
311
+ });
312
+ break;
313
+ }
314
+ }
315
+ return { ok: true, phase: this._phase, sideEffects };
316
+ }
317
+ handleFetch(message, sideEffects) {
318
+ const err = this.requireReady(message.type);
319
+ if (err) return { ok: false, violation: err };
320
+ const fetch = message;
321
+ const dupErr = this.checkDuplicateRequestId(fetch.request_id, message.type);
322
+ if (dupErr) return { ok: false, violation: dupErr };
323
+ this._requestIds.add(fetch.request_id);
324
+ this._fetches.set(fetch.request_id, {
325
+ requestId: fetch.request_id,
326
+ phase: "pending"
327
+ });
328
+ this._pendingFetches.push(fetch.request_id);
329
+ return { ok: true, phase: this._phase, sideEffects };
330
+ }
331
+ handleFetchOk(sideEffects) {
332
+ const err = this.requireReady("fetch_ok");
333
+ if (err) return { ok: false, violation: err };
334
+ const requestId = this._pendingFetches.shift();
335
+ if (requestId === void 0) {
336
+ return {
337
+ ok: false,
338
+ violation: violation(
339
+ "UNEXPECTED_MESSAGE",
340
+ "FETCH_OK with no pending fetch",
341
+ this._phase,
342
+ "fetch_ok"
343
+ )
344
+ };
345
+ }
346
+ const existing = this._fetches.get(requestId);
347
+ if (existing && existing.phase === "pending") {
348
+ this._fetches.set(requestId, { ...existing, phase: "active" });
349
+ sideEffects.push({ type: "fetch-activated", requestId });
350
+ }
351
+ return { ok: true, phase: this._phase, sideEffects };
352
+ }
353
+ handleRequestError(sideEffects) {
354
+ const err = this.requireReady("request_error");
355
+ if (err) return { ok: false, violation: err };
356
+ const subId = this.dequeuePending(this._pendingSubscribes, this._subscriptions);
357
+ if (subId !== void 0) {
358
+ const sub = this._subscriptions.get(subId);
359
+ this._subscriptions.set(subId, { ...sub, phase: "error" });
360
+ sideEffects.push({
361
+ type: "subscription-ended",
362
+ subscribeId: subId,
363
+ reason: "request_error"
364
+ });
365
+ return { ok: true, phase: this._phase, sideEffects };
366
+ }
367
+ const pubId = this.dequeuePending(this._pendingPublishes, this._publishes);
368
+ if (pubId !== void 0) {
369
+ const pub = this._publishes.get(pubId);
370
+ this._publishes.set(pubId, { ...pub, phase: "error" });
371
+ sideEffects.push({
372
+ type: "publish-ended",
373
+ requestId: pubId,
374
+ reason: "request_error"
375
+ });
376
+ return { ok: true, phase: this._phase, sideEffects };
377
+ }
378
+ const fetchId = this.dequeuePending(this._pendingFetches, this._fetches);
379
+ if (fetchId !== void 0) {
380
+ const f = this._fetches.get(fetchId);
381
+ this._fetches.set(fetchId, { ...f, phase: "error" });
382
+ sideEffects.push({
383
+ type: "fetch-ended",
384
+ requestId: fetchId,
385
+ reason: "request_error"
386
+ });
387
+ return { ok: true, phase: this._phase, sideEffects };
388
+ }
389
+ return { ok: true, phase: this._phase, sideEffects };
390
+ }
391
+ handleRequestOk(sideEffects) {
392
+ const err = this.requireReady("request_ok");
393
+ if (err) return { ok: false, violation: err };
394
+ const pubId = this.dequeuePending(this._pendingPublishes, this._publishes);
395
+ if (pubId !== void 0) {
396
+ const pub = this._publishes.get(pubId);
397
+ this._publishes.set(pubId, { ...pub, phase: "active" });
398
+ sideEffects.push({ type: "publish-activated", requestId: pubId });
399
+ }
400
+ return { ok: true, phase: this._phase, sideEffects };
401
+ }
402
+ dequeuePending(queue, stateMap) {
403
+ while (queue.length > 0) {
404
+ const id = queue[0];
405
+ const state = stateMap.get(id);
406
+ if (state && state.phase === "pending") {
407
+ queue.shift();
408
+ return id;
409
+ }
410
+ queue.shift();
411
+ }
412
+ return void 0;
413
+ }
414
+ handleReadyPhaseMessage(message) {
415
+ const err = this.requireReady(message.type);
416
+ if (err) return { ok: false, violation: err };
417
+ return { ok: true, phase: this._phase, sideEffects: [] };
418
+ }
419
+ reset() {
420
+ this._phase = "idle";
421
+ this._setupDirection = null;
422
+ this._subscriptions.clear();
423
+ this._publishes.clear();
424
+ this._fetches.clear();
425
+ this._requestIds.clear();
426
+ this._pendingSubscribes.length = 0;
427
+ this._pendingPublishes.length = 0;
428
+ this._pendingFetches.length = 0;
429
+ }
430
+ };
431
+
432
+ // src/drafts/draft19/session.ts
433
+ function createDraft19SessionState(role) {
434
+ return new Draft19SessionFSM(role);
435
+ }
436
+
437
+ export {
438
+ CONTROL_MESSAGES,
439
+ CLIENT_ONLY_MESSAGES,
440
+ SERVER_ONLY_MESSAGES,
441
+ BIDIRECTIONAL_MESSAGES,
442
+ getLegalOutgoing,
443
+ getLegalIncoming,
444
+ Draft19SessionFSM,
445
+ createDraft19SessionState
446
+ };