@moqtap/codec 0.2.3 → 0.4.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 (313) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +100 -99
  3. package/dist/{chunk-RZHAPEXO.js → chunk-2A57DRXV.js} +36 -10
  4. package/dist/{chunk-73MWUKSJ.js → chunk-2UTVXWFF.js} +190 -102
  5. package/dist/{chunk-JTVCOMBI.cjs → chunk-3XKO6PCR.cjs} +290 -183
  6. package/dist/{chunk-ACQ4CUJP.cjs → chunk-4BDEU3D4.cjs} +237 -158
  7. package/dist/{chunk-4N4INRE7.cjs → chunk-4HBKHNU2.cjs} +144 -110
  8. package/dist/{chunk-2ZT6CVSE.js → chunk-4IVZZOY3.js} +269 -162
  9. package/dist/{chunk-GLBQDG4L.cjs → chunk-5O764MBD.cjs} +508 -117
  10. package/dist/chunk-7KBAWOBA.js +1212 -0
  11. package/dist/{chunk-JSQM2MG3.js → chunk-7QOPNSDF.js} +44 -12
  12. package/dist/{chunk-SYHW3FLI.cjs → chunk-7RE6KSIY.cjs} +28 -8
  13. package/dist/{chunk-YG5KJESI.js → chunk-AY6IAHUM.js} +28 -8
  14. package/dist/{chunk-EFM5T7OM.js → chunk-BLQDWOSG.js} +36 -10
  15. package/dist/{chunk-UYXTY6ZQ.cjs → chunk-E65QKRSN.cjs} +20 -12
  16. package/dist/{chunk-BISI45MN.cjs → chunk-EAHE3IOG.cjs} +44 -12
  17. package/dist/{chunk-PZBPH2D7.js → chunk-GCBFHZW6.js} +216 -137
  18. package/dist/{chunk-GXEW4COZ.cjs → chunk-H5NSL4MO.cjs} +36 -10
  19. package/dist/chunk-HZHSO7EW.cjs +1212 -0
  20. package/dist/{chunk-KZCYQ7ED.cjs → chunk-IILNSDEQ.cjs} +69 -41
  21. package/dist/{chunk-4XYGE53S.cjs → chunk-J3XCPBW3.cjs} +36 -10
  22. package/dist/{chunk-6AEHWULA.cjs → chunk-JKOEJZ5B.cjs} +28 -8
  23. package/dist/{chunk-RUPCJTC3.cjs → chunk-JL3NEW3O.cjs} +23 -1
  24. package/dist/{chunk-G7GI7LJA.js → chunk-LORZMJJB.js} +36 -10
  25. package/dist/{chunk-DUBCL3WF.cjs → chunk-LV5C6MEC.cjs} +36 -10
  26. package/dist/{chunk-ENURAVHI.cjs → chunk-MYXAD5JC.cjs} +44 -12
  27. package/dist/{chunk-FXZ2MYKJ.js → chunk-MZ7HUCGJ.js} +20 -12
  28. package/dist/{chunk-S74DWJE2.cjs → chunk-OKG2HT25.cjs} +277 -88
  29. package/dist/{chunk-BGWGVINJ.cjs → chunk-PKEOQSSZ.cjs} +144 -110
  30. package/dist/{chunk-2GODRVT5.js → chunk-Q46ZURKX.js} +325 -48
  31. package/dist/{chunk-UR6JKS56.js → chunk-Q7IGWV3P.js} +41 -9
  32. package/dist/{chunk-XSNX2IUJ.js → chunk-RW4UG7CN.js} +121 -87
  33. package/dist/{chunk-DWK5ZQZ4.js → chunk-RZTLQAKF.js} +28 -8
  34. package/dist/{chunk-UNS34PTA.cjs → chunk-S6IPIN66.cjs} +44 -12
  35. package/dist/{chunk-YIG2C3LF.cjs → chunk-SDWRXXOO.cjs} +214 -126
  36. package/dist/{chunk-CEH7ESNC.js → chunk-SHMA4PBY.js} +121 -87
  37. package/dist/{chunk-MC7W6PMI.js → chunk-U3ZVLT5L.js} +483 -135
  38. package/dist/{chunk-VJUUZ4W2.cjs → chunk-UJU63EFY.cjs} +374 -97
  39. package/dist/{chunk-7L43FE6P.js → chunk-VOU7PNHI.js} +23 -1
  40. package/dist/{chunk-E6E3NQYU.js → chunk-WRHGCVYN.js} +44 -12
  41. package/dist/{chunk-FPISPJ5N.cjs → chunk-XNWYLVGU.cjs} +529 -181
  42. package/dist/{chunk-U3IPZYPX.js → chunk-XS77RBY7.js} +228 -39
  43. package/dist/{chunk-JGG7CMSZ.cjs → chunk-XZE5R57R.cjs} +144 -110
  44. package/dist/{chunk-77MNXX3M.js → chunk-Y6KCSM3V.js} +121 -87
  45. package/dist/{chunk-TLYNOOQP.cjs → chunk-YTPZZI2M.cjs} +41 -9
  46. package/dist/{chunk-7DUBLRXC.js → chunk-YWRCSQBA.js} +44 -12
  47. package/dist/{chunk-MRJWLGYH.js → chunk-Z3VKP3PJ.js} +69 -41
  48. package/dist/{chunk-E6P74GDT.js → chunk-Z6U26IRI.js} +464 -73
  49. package/dist/{codec-FvGCxIhr.d.ts → codec-25u4_1HS.d.ts} +4 -4
  50. package/dist/{codec-DRcsBCsb.d.ts → codec-3Ppy_5Gd.d.ts} +4 -4
  51. package/dist/{codec-BdVMRMOI.d.ts → codec-BB0U8MF2.d.cts} +4 -4
  52. package/dist/{codec-B2cH-f5V.d.cts → codec-BHHfBTnV.d.ts} +4 -4
  53. package/dist/{codec-B5K73Bdj.d.ts → codec-BN6jk0Td.d.cts} +4 -4
  54. package/dist/{codec-R8GrCPt2.d.ts → codec-BU0gaSZm.d.ts} +4 -4
  55. package/dist/{codec-Bq-tLtfP.d.ts → codec-C-Yk2RNa.d.ts} +4 -4
  56. package/dist/codec-CFWQY9Lj.d.cts +18 -0
  57. package/dist/{codec-CPlK3Pi5.d.ts → codec-COy4uuPO.d.cts} +4 -4
  58. package/dist/codec-CewFCsEy.d.ts +18 -0
  59. package/dist/{codec-KXHvXZVb.d.cts → codec-Ck7ZwFF1.d.cts} +4 -4
  60. package/dist/{codec-DZhZSIii.d.cts → codec-D2QVSH9D.d.ts} +4 -4
  61. package/dist/{codec-BwFgpeQu.d.ts → codec-DDUBJGn0.d.cts} +4 -4
  62. package/dist/{codec-BFeliJFc.d.ts → codec-DNfml-se.d.ts} +4 -4
  63. package/dist/{codec-C4n1PS09.d.cts → codec-DoOGjjDq.d.cts} +4 -4
  64. package/dist/{codec-Bap882Fh.d.cts → codec-J7ekOSMc.d.ts} +4 -4
  65. package/dist/{codec-SKBeHQk7.d.ts → codec-R9TJCq-E.d.cts} +4 -4
  66. package/dist/{codec-DNUIgLqc.d.cts → codec-ZwV-Njt6.d.ts} +4 -4
  67. package/dist/{codec-HgBgHkFI.d.cts → codec-j819z_hL.d.cts} +4 -4
  68. package/dist/{codec-DY4QH364.d.cts → codec-w8z2j_uo.d.cts} +4 -4
  69. package/dist/{codec-CPvPq0sb.d.cts → codec-wtt6WF1K.d.ts} +4 -4
  70. package/dist/{codec-BUMjz0J4.d.cts → codec-z6_2PSzi.d.cts} +4 -4
  71. package/dist/{draft7-session.cjs → draft07-session.cjs} +2 -2
  72. package/dist/draft07-session.d.cts +8 -0
  73. package/dist/draft07-session.d.ts +8 -0
  74. package/dist/{draft7-session.js → draft07-session.js} +1 -1
  75. package/dist/draft07.cjs +129 -0
  76. package/dist/draft07.d.cts +67 -0
  77. package/dist/draft07.d.ts +67 -0
  78. package/dist/draft07.js +129 -0
  79. package/dist/draft08-session.cjs +6 -0
  80. package/dist/draft08-session.d.cts +8 -0
  81. package/dist/draft08-session.d.ts +8 -0
  82. package/dist/{draft8-session.js → draft08-session.js} +1 -1
  83. package/dist/draft08.cjs +119 -0
  84. package/dist/{draft8.d.cts → draft08.d.cts} +15 -13
  85. package/dist/{draft8.d.ts → draft08.d.ts} +15 -13
  86. package/dist/{draft8.js → draft08.js} +7 -4
  87. package/dist/draft09-session.cjs +6 -0
  88. package/dist/draft09-session.d.cts +8 -0
  89. package/dist/draft09-session.d.ts +8 -0
  90. package/dist/{draft9-session.js → draft09-session.js} +1 -1
  91. package/dist/draft09.cjs +119 -0
  92. package/dist/{draft9.d.cts → draft09.d.cts} +15 -13
  93. package/dist/{draft9.d.ts → draft09.d.ts} +15 -13
  94. package/dist/{draft9.js → draft09.js} +7 -4
  95. package/dist/draft10-session.cjs +2 -2
  96. package/dist/draft10-session.d.cts +6 -6
  97. package/dist/draft10-session.d.ts +6 -6
  98. package/dist/draft10-session.js +1 -1
  99. package/dist/draft10.cjs +8 -5
  100. package/dist/draft10.d.cts +14 -12
  101. package/dist/draft10.d.ts +14 -12
  102. package/dist/draft10.js +16 -13
  103. package/dist/draft11-session.cjs +2 -2
  104. package/dist/draft11-session.d.cts +6 -6
  105. package/dist/draft11-session.d.ts +6 -6
  106. package/dist/draft11-session.js +1 -1
  107. package/dist/draft11.cjs +8 -5
  108. package/dist/draft11.d.cts +14 -12
  109. package/dist/draft11.d.ts +14 -12
  110. package/dist/draft11.js +16 -13
  111. package/dist/draft12-session.cjs +2 -2
  112. package/dist/draft12-session.d.cts +6 -6
  113. package/dist/draft12-session.d.ts +6 -6
  114. package/dist/draft12-session.js +1 -1
  115. package/dist/draft12.cjs +8 -5
  116. package/dist/draft12.d.cts +16 -14
  117. package/dist/draft12.d.ts +16 -14
  118. package/dist/draft12.js +16 -13
  119. package/dist/draft13-session.cjs +2 -2
  120. package/dist/draft13-session.d.cts +6 -6
  121. package/dist/draft13-session.d.ts +6 -6
  122. package/dist/draft13-session.js +1 -1
  123. package/dist/draft13.cjs +8 -5
  124. package/dist/draft13.d.cts +16 -14
  125. package/dist/draft13.d.ts +16 -14
  126. package/dist/draft13.js +16 -13
  127. package/dist/draft14-session.cjs +2 -2
  128. package/dist/draft14-session.d.cts +6 -6
  129. package/dist/draft14-session.d.ts +6 -6
  130. package/dist/draft14-session.js +1 -1
  131. package/dist/draft14.cjs +14 -5
  132. package/dist/draft14.d.cts +14 -12
  133. package/dist/draft14.d.ts +14 -12
  134. package/dist/draft14.js +13 -4
  135. package/dist/draft15-session.cjs +2 -2
  136. package/dist/draft15-session.d.cts +6 -6
  137. package/dist/draft15-session.d.ts +6 -6
  138. package/dist/draft15-session.js +1 -1
  139. package/dist/draft15.cjs +8 -5
  140. package/dist/draft15.d.cts +14 -12
  141. package/dist/draft15.d.ts +14 -12
  142. package/dist/draft15.js +16 -13
  143. package/dist/draft16-session.cjs +2 -2
  144. package/dist/draft16-session.d.cts +6 -6
  145. package/dist/draft16-session.d.ts +6 -6
  146. package/dist/draft16-session.js +1 -1
  147. package/dist/draft16.cjs +8 -5
  148. package/dist/draft16.d.cts +14 -12
  149. package/dist/draft16.d.ts +14 -12
  150. package/dist/draft16.js +16 -13
  151. package/dist/draft17-session.cjs +2 -2
  152. package/dist/draft17-session.d.cts +7 -7
  153. package/dist/draft17-session.d.ts +7 -7
  154. package/dist/draft17-session.js +1 -1
  155. package/dist/draft17.cjs +8 -5
  156. package/dist/draft17.d.cts +11 -9
  157. package/dist/draft17.d.ts +11 -9
  158. package/dist/draft17.js +16 -13
  159. package/dist/index.cjs +52 -74
  160. package/dist/index.d.cts +41 -60
  161. package/dist/index.d.ts +41 -60
  162. package/dist/index.js +40 -62
  163. package/dist/{session-types-CJIFbTPd.d.ts → session-types-C7UONex5.d.cts} +28 -27
  164. package/dist/{session-types-Cbq8IGCP.d.cts → session-types-X-IYEGoG.d.ts} +28 -27
  165. package/dist/session.cjs +46 -13
  166. package/dist/session.d.cts +29 -11
  167. package/dist/session.d.ts +29 -11
  168. package/dist/session.js +46 -13
  169. package/dist/{types-DxSFvL2b.d.cts → types--Q7_DcvP.d.cts} +43 -39
  170. package/dist/{types-DxSFvL2b.d.ts → types--Q7_DcvP.d.ts} +43 -39
  171. package/dist/{types-B0FT5Qs2.d.cts → types-0IWbU9Z_.d.cts} +36 -36
  172. package/dist/{types-B0FT5Qs2.d.ts → types-0IWbU9Z_.d.ts} +36 -36
  173. package/dist/{types-gQsr0AAA.d.cts → types-B3g5G9KP.d.cts} +36 -36
  174. package/dist/{types-gQsr0AAA.d.ts → types-B3g5G9KP.d.ts} +36 -36
  175. package/dist/{types-Pme7sua0.d.cts → types-BFpFNM_m.d.cts} +57 -32
  176. package/dist/{types-Pme7sua0.d.ts → types-BFpFNM_m.d.ts} +57 -32
  177. package/dist/{types-8gUGeMgs.d.cts → types-Br7fm2mf.d.cts} +48 -26
  178. package/dist/{types-8gUGeMgs.d.ts → types-Br7fm2mf.d.ts} +48 -26
  179. package/dist/{types-BeAVNU-F.d.cts → types-C2qKTRR_.d.cts} +50 -45
  180. package/dist/{types-BeAVNU-F.d.ts → types-C2qKTRR_.d.ts} +50 -45
  181. package/dist/{types-DKpsfD3i.d.cts → types-DEaypVsD.d.cts} +115 -55
  182. package/dist/{types-DKpsfD3i.d.ts → types-DEaypVsD.d.ts} +115 -55
  183. package/dist/types-Dl4IaAHR.d.cts +282 -0
  184. package/dist/types-Dl4IaAHR.d.ts +282 -0
  185. package/dist/{types-CDa7F5ct.d.cts → types-DrQpTW1G.d.cts} +58 -50
  186. package/dist/{types-CDa7F5ct.d.ts → types-DrQpTW1G.d.ts} +58 -50
  187. package/dist/types-DuIO7cWK.d.cts +25 -0
  188. package/dist/types-DuIO7cWK.d.ts +25 -0
  189. package/dist/{types-B9A2g05r.d.cts → types-DuxfOYiO.d.cts} +47 -31
  190. package/dist/{types-B9A2g05r.d.ts → types-DuxfOYiO.d.ts} +47 -31
  191. package/dist/{types-D1dI_oTX.d.cts → types-jV1yDDBA.d.cts} +36 -36
  192. package/dist/{types-D1dI_oTX.d.ts → types-jV1yDDBA.d.ts} +36 -36
  193. package/package.json +192 -192
  194. package/src/core/buffer-reader.ts +130 -130
  195. package/src/core/buffer-writer.ts +100 -100
  196. package/src/core/errors.ts +1 -1
  197. package/src/core/hex.ts +21 -21
  198. package/src/core/session-types.ts +61 -59
  199. package/src/core/types.ts +18 -361
  200. package/src/drafts/draft07/codec.ts +1058 -938
  201. package/src/drafts/draft07/data-streams.ts +240 -240
  202. package/src/drafts/draft07/index.ts +124 -89
  203. package/src/drafts/draft07/messages.ts +76 -42
  204. package/src/drafts/draft07/rules.ts +107 -101
  205. package/src/drafts/draft07/session-fsm.ts +315 -287
  206. package/src/drafts/draft07/session.ts +8 -6
  207. package/src/drafts/draft07/types.ts +406 -72
  208. package/src/drafts/draft07/varint.ts +51 -51
  209. package/src/drafts/draft08/codec.ts +985 -953
  210. package/src/drafts/draft08/data-streams.ts +363 -359
  211. package/src/drafts/draft08/index.ts +10 -9
  212. package/src/drafts/draft08/messages.ts +59 -59
  213. package/src/drafts/draft08/rules.ts +73 -73
  214. package/src/drafts/draft08/session-fsm.ts +335 -303
  215. package/src/drafts/draft08/session.ts +6 -7
  216. package/src/drafts/draft08/types.ts +380 -384
  217. package/src/drafts/draft09/codec.ts +977 -945
  218. package/src/drafts/draft09/data-streams.ts +336 -332
  219. package/src/drafts/draft09/index.ts +10 -9
  220. package/src/drafts/draft09/messages.ts +59 -59
  221. package/src/drafts/draft09/rules.ts +73 -73
  222. package/src/drafts/draft09/session-fsm.ts +335 -303
  223. package/src/drafts/draft09/session.ts +6 -7
  224. package/src/drafts/draft09/types.ts +380 -384
  225. package/src/drafts/draft10/codec.ts +977 -945
  226. package/src/drafts/draft10/data-streams.ts +336 -332
  227. package/src/drafts/draft10/index.ts +10 -9
  228. package/src/drafts/draft10/messages.ts +59 -59
  229. package/src/drafts/draft10/rules.ts +73 -73
  230. package/src/drafts/draft10/session-fsm.ts +335 -303
  231. package/src/drafts/draft10/session.ts +6 -7
  232. package/src/drafts/draft10/types.ts +380 -384
  233. package/src/drafts/draft11/codec.ts +1054 -988
  234. package/src/drafts/draft11/data-streams.ts +316 -269
  235. package/src/drafts/draft11/index.ts +10 -9
  236. package/src/drafts/draft11/messages.ts +60 -59
  237. package/src/drafts/draft11/rules.ts +73 -73
  238. package/src/drafts/draft11/session-fsm.ts +359 -333
  239. package/src/drafts/draft11/session.ts +6 -7
  240. package/src/drafts/draft11/types.ts +385 -381
  241. package/src/drafts/draft12/codec.ts +1178 -1122
  242. package/src/drafts/draft12/data-streams.ts +324 -275
  243. package/src/drafts/draft12/index.ts +10 -9
  244. package/src/drafts/draft12/messages.ts +67 -66
  245. package/src/drafts/draft12/rules.ts +79 -79
  246. package/src/drafts/draft12/session-fsm.ts +384 -358
  247. package/src/drafts/draft12/session.ts +6 -7
  248. package/src/drafts/draft12/types.ts +424 -419
  249. package/src/drafts/draft13/codec.ts +1296 -1206
  250. package/src/drafts/draft13/data-streams.ts +326 -275
  251. package/src/drafts/draft13/index.ts +10 -9
  252. package/src/drafts/draft13/messages.ts +73 -68
  253. package/src/drafts/draft13/rules.ts +81 -81
  254. package/src/drafts/draft13/session-fsm.ts +392 -366
  255. package/src/drafts/draft13/session.ts +6 -7
  256. package/src/drafts/draft13/types.ts +447 -438
  257. package/src/drafts/draft14/codec.ts +1347 -1043
  258. package/src/drafts/draft14/data-streams.ts +831 -813
  259. package/src/drafts/draft14/index.ts +17 -9
  260. package/src/drafts/draft14/messages.ts +65 -65
  261. package/src/drafts/draft14/rules.ts +81 -81
  262. package/src/drafts/draft14/session-fsm.ts +415 -405
  263. package/src/drafts/draft14/session.ts +6 -7
  264. package/src/drafts/draft14/types.ts +451 -381
  265. package/src/drafts/draft15/codec.ts +1138 -978
  266. package/src/drafts/draft15/data-streams.ts +842 -794
  267. package/src/drafts/draft15/index.ts +10 -9
  268. package/src/drafts/draft15/messages.ts +54 -53
  269. package/src/drafts/draft15/rules.ts +67 -67
  270. package/src/drafts/draft15/session-fsm.ts +319 -299
  271. package/src/drafts/draft15/session.ts +6 -7
  272. package/src/drafts/draft15/types.ts +357 -339
  273. package/src/drafts/draft16/codec.ts +1242 -966
  274. package/src/drafts/draft16/data-streams.ts +835 -789
  275. package/src/drafts/draft16/index.ts +10 -9
  276. package/src/drafts/draft16/messages.ts +56 -55
  277. package/src/drafts/draft16/rules.ts +69 -69
  278. package/src/drafts/draft16/session-fsm.ts +319 -299
  279. package/src/drafts/draft16/session.ts +6 -7
  280. package/src/drafts/draft16/types.ts +386 -357
  281. package/src/drafts/draft17/codec.ts +1209 -971
  282. package/src/drafts/draft17/data-streams.ts +969 -758
  283. package/src/drafts/draft17/index.ts +9 -7
  284. package/src/drafts/draft17/messages.ts +43 -42
  285. package/src/drafts/draft17/rules.ts +58 -58
  286. package/src/drafts/draft17/session-fsm.ts +248 -216
  287. package/src/drafts/draft17/session.ts +5 -5
  288. package/src/drafts/draft17/types.ts +337 -313
  289. package/src/index.ts +85 -274
  290. package/src/session.ts +63 -25
  291. package/dist/chunk-FZDIEHQL.cjs +0 -1042
  292. package/dist/chunk-HDWJ2GDE.js +0 -24
  293. package/dist/chunk-KNDYS3DK.cjs +0 -24
  294. package/dist/chunk-N2KBF5Q2.js +0 -1042
  295. package/dist/draft7-session.d.cts +0 -7
  296. package/dist/draft7-session.d.ts +0 -7
  297. package/dist/draft7.cjs +0 -72
  298. package/dist/draft7.d.cts +0 -148
  299. package/dist/draft7.d.ts +0 -148
  300. package/dist/draft7.js +0 -72
  301. package/dist/draft8-session.cjs +0 -6
  302. package/dist/draft8-session.d.cts +0 -8
  303. package/dist/draft8-session.d.ts +0 -8
  304. package/dist/draft8.cjs +0 -116
  305. package/dist/draft9-session.cjs +0 -6
  306. package/dist/draft9-session.d.cts +0 -8
  307. package/dist/draft9-session.d.ts +0 -8
  308. package/dist/draft9.cjs +0 -116
  309. package/dist/types-QNXoxC9Y.d.cts +0 -236
  310. package/dist/types-QNXoxC9Y.d.ts +0 -236
  311. package/src/drafts/draft07/announce-fsm.ts +0 -2
  312. package/src/drafts/draft07/parameters.ts +0 -12
  313. package/src/drafts/draft07/subscription-fsm.ts +0 -3
@@ -7,84 +7,84 @@ import type {
7
7
  SubscriptionState,
8
8
  TransitionResult,
9
9
  ValidationResult,
10
- } from "../../core/session-types.js";
10
+ } from '../../core/session-types.js'
11
11
  import {
12
12
  CLIENT_ONLY_MESSAGES,
13
13
  getLegalIncoming,
14
14
  getLegalOutgoing,
15
15
  SERVER_ONLY_MESSAGES,
16
- } from "./rules.js";
17
- import type { Draft13Message, Draft13MessageType } from "./types.js";
16
+ } from './rules.js'
17
+ import type { Draft13Message, Draft13MessageType } from './types.js'
18
18
 
19
19
  function violation(
20
- code: ProtocolViolation<Draft13MessageType>["code"],
20
+ code: ProtocolViolation<Draft13MessageType>['code'],
21
21
  message: string,
22
22
  currentPhase: SessionPhase,
23
23
  offendingMessage: Draft13MessageType,
24
24
  ): ProtocolViolation<Draft13MessageType> {
25
- return { code, message, currentPhase, offendingMessage };
25
+ return { code, message, currentPhase, offendingMessage }
26
26
  }
27
27
 
28
28
  export class Draft13SessionFSM {
29
- private _phase: SessionPhase = "idle";
30
- private _role: "client" | "server";
31
- private _subscriptions = new Map<bigint, SubscriptionState>();
32
- private _announces = new Map<string, AnnounceState>();
33
- private _fetches = new Map<bigint, FetchState>();
34
- private _requestIds = new Set<bigint>();
29
+ private _phase: SessionPhase = 'idle'
30
+ private _role: 'client' | 'server'
31
+ private _subscriptions = new Map<bigint, SubscriptionState>()
32
+ private _announces = new Map<string, AnnounceState>()
33
+ private _fetches = new Map<bigint, FetchState>()
34
+ private _requestIds = new Set<bigint>()
35
35
 
36
- constructor(role: "client" | "server") {
37
- this._role = role;
36
+ constructor(role: 'client' | 'server') {
37
+ this._role = role
38
38
  }
39
39
 
40
40
  get phase(): SessionPhase {
41
- return this._phase;
41
+ return this._phase
42
42
  }
43
- get role(): "client" | "server" {
44
- return this._role;
43
+ get role(): 'client' | 'server' {
44
+ return this._role
45
45
  }
46
46
  get subscriptions(): ReadonlyMap<bigint, SubscriptionState> {
47
- return this._subscriptions;
47
+ return this._subscriptions
48
48
  }
49
49
  get announces(): ReadonlyMap<string, AnnounceState> {
50
- return this._announces;
50
+ return this._announces
51
51
  }
52
52
  get fetches(): ReadonlyMap<bigint, FetchState> {
53
- return this._fetches;
53
+ return this._fetches
54
54
  }
55
55
 
56
56
  get legalOutgoing(): ReadonlySet<Draft13MessageType> {
57
- return getLegalOutgoing(this._phase, this._role);
57
+ return getLegalOutgoing(this._phase, this._role)
58
58
  }
59
59
 
60
60
  get legalIncoming(): ReadonlySet<Draft13MessageType> {
61
- return getLegalIncoming(this._phase, this._role);
61
+ return getLegalIncoming(this._phase, this._role)
62
62
  }
63
63
 
64
64
  private checkRole(
65
65
  message: Draft13Message,
66
- direction: "inbound" | "outbound",
66
+ direction: 'inbound' | 'outbound',
67
67
  ): ProtocolViolation<Draft13MessageType> | null {
68
68
  const senderRole =
69
- direction === "outbound" ? this._role : this._role === "client" ? "server" : "client";
69
+ direction === 'outbound' ? this._role : this._role === 'client' ? 'server' : 'client'
70
70
 
71
- if (CLIENT_ONLY_MESSAGES.has(message.type) && senderRole !== "client") {
71
+ if (CLIENT_ONLY_MESSAGES.has(message.type) && senderRole !== 'client') {
72
72
  return violation(
73
- "ROLE_VIOLATION",
73
+ 'ROLE_VIOLATION',
74
74
  `${message.type} can only be sent by client`,
75
75
  this._phase,
76
76
  message.type,
77
- );
77
+ )
78
78
  }
79
- if (SERVER_ONLY_MESSAGES.has(message.type) && senderRole !== "server") {
79
+ if (SERVER_ONLY_MESSAGES.has(message.type) && senderRole !== 'server') {
80
80
  return violation(
81
- "ROLE_VIOLATION",
81
+ 'ROLE_VIOLATION',
82
82
  `${message.type} can only be sent by server`,
83
83
  this._phase,
84
84
  message.type,
85
- );
85
+ )
86
86
  }
87
- return null;
87
+ return null
88
88
  }
89
89
 
90
90
  private checkDuplicateRequestId(
@@ -93,13 +93,13 @@ export class Draft13SessionFSM {
93
93
  ): ProtocolViolation<Draft13MessageType> | null {
94
94
  if (this._requestIds.has(requestId)) {
95
95
  return violation(
96
- "DUPLICATE_REQUEST_ID",
96
+ 'DUPLICATE_REQUEST_ID',
97
97
  `Request ID ${requestId} already in use`,
98
98
  this._phase,
99
99
  msgType,
100
- );
100
+ )
101
101
  }
102
- return null;
102
+ return null
103
103
  }
104
104
 
105
105
  private checkKnownRequestId(
@@ -108,218 +108,225 @@ export class Draft13SessionFSM {
108
108
  ): ProtocolViolation<Draft13MessageType> | null {
109
109
  if (!this._requestIds.has(requestId)) {
110
110
  return violation(
111
- "UNKNOWN_REQUEST_ID",
111
+ 'UNKNOWN_REQUEST_ID',
112
112
  `No request with ID ${requestId}`,
113
113
  this._phase,
114
114
  msgType,
115
- );
115
+ )
116
116
  }
117
- return null;
117
+ return null
118
118
  }
119
119
 
120
120
  validateOutgoing(message: Draft13Message): ValidationResult<Draft13MessageType> {
121
- const roleViolation = this.checkRole(message, "outbound");
122
- if (roleViolation) return { ok: false, violation: roleViolation };
121
+ const roleViolation = this.checkRole(message, 'outbound')
122
+ if (roleViolation) return { ok: false, violation: roleViolation }
123
123
 
124
124
  if (!this.legalOutgoing.has(message.type)) {
125
125
  return {
126
126
  ok: false,
127
127
  violation: violation(
128
- this._phase === "idle" || this._phase === "setup"
129
- ? "MESSAGE_BEFORE_SETUP"
130
- : "UNEXPECTED_MESSAGE",
128
+ this._phase === 'idle' || this._phase === 'setup'
129
+ ? 'MESSAGE_BEFORE_SETUP'
130
+ : 'UNEXPECTED_MESSAGE',
131
131
  `Cannot send ${message.type} in phase ${this._phase}`,
132
132
  this._phase,
133
133
  message.type,
134
134
  ),
135
- };
135
+ }
136
136
  }
137
- return { ok: true };
137
+ return { ok: true }
138
138
  }
139
139
 
140
140
  receive(message: Draft13Message): TransitionResult<Draft13MessageType> {
141
- const roleViolation = this.checkRole(message, "inbound");
142
- if (roleViolation) return { ok: false, violation: roleViolation };
143
- return this.applyTransition(message, "inbound");
141
+ const roleViolation = this.checkRole(message, 'inbound')
142
+ if (roleViolation) return { ok: false, violation: roleViolation }
143
+ return this.applyTransition(message, 'inbound')
144
144
  }
145
145
 
146
146
  send(message: Draft13Message): TransitionResult<Draft13MessageType> {
147
- const roleViolation = this.checkRole(message, "outbound");
148
- if (roleViolation) return { ok: false, violation: roleViolation };
149
- return this.applyTransition(message, "outbound");
147
+ const roleViolation = this.checkRole(message, 'outbound')
148
+ if (roleViolation) return { ok: false, violation: roleViolation }
149
+ return this.applyTransition(message, 'outbound')
150
150
  }
151
151
 
152
152
  private applyTransition(
153
153
  message: Draft13Message,
154
- direction: "inbound" | "outbound",
154
+ direction: 'inbound' | 'outbound',
155
155
  ): TransitionResult<Draft13MessageType> {
156
- const sideEffects: SideEffect[] = [];
156
+ const sideEffects: SideEffect[] = []
157
157
 
158
158
  switch (message.type) {
159
- case "client_setup":
160
- return this.handleClientSetup(direction);
161
- case "server_setup":
162
- return this.handleServerSetup(direction);
163
- case "goaway":
164
- return this.handleGoAway(message, sideEffects);
159
+ case 'client_setup':
160
+ return this.handleClientSetup(direction)
161
+ case 'server_setup':
162
+ return this.handleServerSetup(direction)
163
+ case 'goaway':
164
+ return this.handleGoAway(message, sideEffects)
165
165
 
166
166
  // Subscribe lifecycle
167
- case "subscribe":
168
- return this.handleSubscribe(message, sideEffects);
169
- case "subscribe_ok":
170
- return this.handleSubscribeOk(message, sideEffects);
171
- case "subscribe_error":
172
- return this.handleSubscribeError(message, sideEffects);
173
- case "subscribe_update":
174
- return this.handleSubscribeUpdate(message, sideEffects);
175
- case "subscribe_done":
176
- return this.handleSubscribeDone(message, sideEffects);
177
- case "unsubscribe":
178
- return this.handleUnsubscribe(message, sideEffects);
167
+ case 'subscribe':
168
+ return this.handleSubscribe(message, sideEffects)
169
+ case 'subscribe_ok':
170
+ return this.handleSubscribeOk(message, sideEffects)
171
+ case 'subscribe_error':
172
+ return this.handleSubscribeError(message, sideEffects)
173
+ case 'subscribe_update':
174
+ return this.handleSubscribeUpdate(message, sideEffects)
175
+ case 'subscribe_done':
176
+ return this.handleSubscribeDone(message, sideEffects)
177
+ case 'unsubscribe':
178
+ return this.handleUnsubscribe(message, sideEffects)
179
179
 
180
180
  // Announce lifecycle
181
- case "announce":
182
- return this.handleAnnounce(message, sideEffects);
183
- case "announce_ok":
184
- return this.handleAnnounceOk(message, sideEffects);
185
- case "announce_error":
186
- return this.handleAnnounceError(message, sideEffects);
187
- case "unannounce":
188
- return this.handleUnannounce(message, sideEffects);
189
- case "announce_cancel":
190
- return this.handleAnnounceCancel(message, sideEffects);
181
+ case 'announce':
182
+ return this.handleAnnounce(message, sideEffects)
183
+ case 'announce_ok':
184
+ return this.handleAnnounceOk(message, sideEffects)
185
+ case 'announce_error':
186
+ return this.handleAnnounceError(message, sideEffects)
187
+ case 'unannounce':
188
+ return this.handleUnannounce(message, sideEffects)
189
+ case 'announce_cancel':
190
+ return this.handleAnnounceCancel(message, sideEffects)
191
191
 
192
192
  // Publish lifecycle
193
- case "publish":
194
- return this.handlePublish(message, sideEffects);
195
- case "publish_ok":
196
- return this.handlePublishOk(message, sideEffects);
197
- case "publish_error":
198
- return this.handlePublishError(message, sideEffects);
193
+ case 'publish':
194
+ return this.handlePublish(message, sideEffects)
195
+ case 'publish_ok':
196
+ return this.handlePublishOk(message, sideEffects)
197
+ case 'publish_error':
198
+ return this.handlePublishError(message, sideEffects)
199
199
 
200
200
  // Fetch lifecycle
201
- case "fetch":
202
- return this.handleFetch(message, sideEffects);
203
- case "fetch_ok":
204
- return this.handleFetchOk(message, sideEffects);
205
- case "fetch_error":
206
- return this.handleFetchError(message, sideEffects);
207
- case "fetch_cancel":
208
- return this.handleFetchCancel(message, sideEffects);
201
+ case 'fetch':
202
+ return this.handleFetch(message, sideEffects)
203
+ case 'fetch_ok':
204
+ return this.handleFetchOk(message, sideEffects)
205
+ case 'fetch_error':
206
+ return this.handleFetchError(message, sideEffects)
207
+ case 'fetch_cancel':
208
+ return this.handleFetchCancel(message, sideEffects)
209
209
 
210
210
  // Subscribe namespace lifecycle
211
- case "subscribe_namespace":
212
- return this.handleSubscribeNamespace(message, sideEffects);
213
- case "subscribe_namespace_ok":
214
- return this.handleSubscribeNamespaceOk(message, sideEffects);
215
- case "subscribe_namespace_error":
216
- return this.handleSubscribeNamespaceError(message, sideEffects);
211
+ case 'subscribe_namespace':
212
+ return this.handleSubscribeNamespace(message, sideEffects)
213
+ case 'subscribe_namespace_ok':
214
+ return this.handleSubscribeNamespaceOk(message, sideEffects)
215
+ case 'subscribe_namespace_error':
216
+ return this.handleSubscribeNamespaceError(message, sideEffects)
217
217
 
218
218
  // Track status lifecycle
219
- case "track_status":
220
- return this.handleTrackStatus(message, sideEffects);
221
- case "track_status_ok":
222
- return this.handleTrackStatusOk(message, sideEffects);
223
- case "track_status_error":
224
- return this.handleTrackStatusError(message, sideEffects);
219
+ case 'track_status':
220
+ return this.handleTrackStatus(message, sideEffects)
221
+ case 'track_status_ok':
222
+ return this.handleTrackStatusOk(message, sideEffects)
223
+ case 'track_status_error':
224
+ return this.handleTrackStatusError(message, sideEffects)
225
225
 
226
226
  // Other ready-phase messages
227
227
  default:
228
- return this.handleReadyPhaseMessage(message);
228
+ return this.handleReadyPhaseMessage(message)
229
229
  }
230
230
  }
231
231
 
232
232
  private handleClientSetup(
233
- direction: "inbound" | "outbound",
233
+ direction: 'inbound' | 'outbound',
234
234
  ): TransitionResult<Draft13MessageType> {
235
- if (this._phase !== "idle") {
235
+ if (this._phase !== 'idle') {
236
236
  return {
237
237
  ok: false,
238
238
  violation: violation(
239
- "SETUP_VIOLATION",
240
- "CLIENT_SETUP already sent/received",
239
+ 'SETUP_VIOLATION',
240
+ 'CLIENT_SETUP already sent/received',
241
241
  this._phase,
242
- "client_setup",
242
+ 'client_setup',
243
243
  ),
244
- };
244
+ }
245
245
  }
246
- if (direction === "outbound" && this._role !== "client") {
246
+ if (direction === 'outbound' && this._role !== 'client') {
247
247
  return {
248
248
  ok: false,
249
249
  violation: violation(
250
- "ROLE_VIOLATION",
251
- "Only client can send CLIENT_SETUP",
250
+ 'ROLE_VIOLATION',
251
+ 'Only client can send CLIENT_SETUP',
252
252
  this._phase,
253
- "client_setup",
253
+ 'client_setup',
254
254
  ),
255
- };
255
+ }
256
256
  }
257
- this._phase = "setup";
258
- return { ok: true, phase: this._phase, sideEffects: [] };
257
+ this._phase = 'setup'
258
+ return { ok: true, phase: this._phase, sideEffects: [] }
259
259
  }
260
260
 
261
261
  private handleServerSetup(
262
- direction: "inbound" | "outbound",
262
+ direction: 'inbound' | 'outbound',
263
263
  ): TransitionResult<Draft13MessageType> {
264
- if (this._phase !== "setup") {
264
+ if (this._phase !== 'setup') {
265
265
  return {
266
266
  ok: false,
267
267
  violation: violation(
268
- "SETUP_VIOLATION",
269
- "SERVER_SETUP before CLIENT_SETUP",
268
+ 'SETUP_VIOLATION',
269
+ 'SERVER_SETUP before CLIENT_SETUP',
270
270
  this._phase,
271
- "server_setup",
271
+ 'server_setup',
272
272
  ),
273
- };
273
+ }
274
274
  }
275
- if (direction === "outbound" && this._role !== "server") {
275
+ if (direction === 'outbound' && this._role !== 'server') {
276
276
  return {
277
277
  ok: false,
278
278
  violation: violation(
279
- "ROLE_VIOLATION",
280
- "Only server can send SERVER_SETUP",
279
+ 'ROLE_VIOLATION',
280
+ 'Only server can send SERVER_SETUP',
281
281
  this._phase,
282
- "server_setup",
282
+ 'server_setup',
283
283
  ),
284
- };
284
+ }
285
+ }
286
+ this._phase = 'ready'
287
+ return {
288
+ ok: true,
289
+ phase: this._phase,
290
+ sideEffects: [{ type: 'session-ready' }],
285
291
  }
286
- this._phase = "ready";
287
- return { ok: true, phase: this._phase, sideEffects: [{ type: "session-ready" }] };
288
292
  }
289
293
 
290
294
  private handleGoAway(
291
295
  message: Draft13Message,
292
296
  sideEffects: SideEffect[],
293
297
  ): TransitionResult<Draft13MessageType> {
294
- if (this._phase !== "ready" && this._phase !== "draining") {
298
+ if (this._phase !== 'ready' && this._phase !== 'draining') {
295
299
  return {
296
300
  ok: false,
297
301
  violation: violation(
298
- "UNEXPECTED_MESSAGE",
302
+ 'UNEXPECTED_MESSAGE',
299
303
  `GOAWAY not valid in phase ${this._phase}`,
300
304
  this._phase,
301
- "goaway",
305
+ 'goaway',
302
306
  ),
303
- };
307
+ }
304
308
  }
305
- this._phase = "draining";
306
- const goaway = message as import("./types.js").Draft13GoAway;
307
- sideEffects.push({ type: "session-draining", goAwayUri: goaway.new_session_uri });
308
- return { ok: true, phase: this._phase, sideEffects };
309
+ this._phase = 'draining'
310
+ const goaway = message as import('./types.js').Draft13GoAway
311
+ sideEffects.push({
312
+ type: 'session-draining',
313
+ goAwayUri: goaway.new_session_uri,
314
+ })
315
+ return { ok: true, phase: this._phase, sideEffects }
309
316
  }
310
317
 
311
318
  private requireReady(msgType: Draft13MessageType): ProtocolViolation<Draft13MessageType> | null {
312
- if (this._phase !== "ready" && this._phase !== "draining") {
319
+ if (this._phase !== 'ready' && this._phase !== 'draining') {
313
320
  return violation(
314
- this._phase === "idle" || this._phase === "setup"
315
- ? "MESSAGE_BEFORE_SETUP"
316
- : "UNEXPECTED_MESSAGE",
321
+ this._phase === 'idle' || this._phase === 'setup'
322
+ ? 'MESSAGE_BEFORE_SETUP'
323
+ : 'UNEXPECTED_MESSAGE',
317
324
  `${msgType} requires ready phase, current: ${this._phase}`,
318
325
  this._phase,
319
326
  msgType,
320
- );
327
+ )
321
328
  }
322
- return null;
329
+ return null
323
330
  }
324
331
 
325
332
  // ─── Subscribe lifecycle ───
@@ -328,184 +335,187 @@ export class Draft13SessionFSM {
328
335
  message: Draft13Message,
329
336
  sideEffects: SideEffect[],
330
337
  ): TransitionResult<Draft13MessageType> {
331
- const err = this.requireReady(message.type);
332
- if (err) return { ok: false, violation: err };
333
- const sub = message as import("./types.js").Draft13Subscribe;
334
- const dupErr = this.checkDuplicateRequestId(sub.request_id, message.type);
335
- if (dupErr) return { ok: false, violation: dupErr };
336
- this._requestIds.add(sub.request_id);
338
+ const err = this.requireReady(message.type)
339
+ if (err) return { ok: false, violation: err }
340
+ const sub = message as import('./types.js').Draft13Subscribe
341
+ const dupErr = this.checkDuplicateRequestId(sub.request_id, message.type)
342
+ if (dupErr) return { ok: false, violation: dupErr }
343
+ this._requestIds.add(sub.request_id)
337
344
  this._subscriptions.set(sub.request_id, {
338
345
  subscribeId: sub.request_id,
339
- phase: "pending",
346
+ phase: 'pending',
340
347
  trackNamespace: sub.track_namespace,
341
348
  trackName: sub.track_name,
342
- });
343
- return { ok: true, phase: this._phase, sideEffects };
349
+ })
350
+ return { ok: true, phase: this._phase, sideEffects }
344
351
  }
345
352
 
346
353
  private handleSubscribeOk(
347
354
  message: Draft13Message,
348
355
  sideEffects: SideEffect[],
349
356
  ): TransitionResult<Draft13MessageType> {
350
- const err = this.requireReady(message.type);
351
- if (err) return { ok: false, violation: err };
352
- const ok = message as import("./types.js").Draft13SubscribeOk;
353
- const idErr = this.checkKnownRequestId(ok.request_id, message.type);
354
- if (idErr) return { ok: false, violation: idErr };
355
- const existing = this._subscriptions.get(ok.request_id);
357
+ const err = this.requireReady(message.type)
358
+ if (err) return { ok: false, violation: err }
359
+ const ok = message as import('./types.js').Draft13SubscribeOk
360
+ const idErr = this.checkKnownRequestId(ok.request_id, message.type)
361
+ if (idErr) return { ok: false, violation: idErr }
362
+ const existing = this._subscriptions.get(ok.request_id)
356
363
  if (!existing)
357
364
  return {
358
365
  ok: false,
359
366
  violation: violation(
360
- "UNKNOWN_REQUEST_ID",
367
+ 'UNKNOWN_REQUEST_ID',
361
368
  `No subscription with request ID ${ok.request_id}`,
362
369
  this._phase,
363
370
  message.type,
364
371
  ),
365
- };
366
- if (existing.phase !== "pending")
372
+ }
373
+ if (existing.phase !== 'pending')
367
374
  return {
368
375
  ok: false,
369
376
  violation: violation(
370
- "STATE_VIOLATION",
377
+ 'STATE_VIOLATION',
371
378
  `Subscription ${ok.request_id} is ${existing.phase}, not pending`,
372
379
  this._phase,
373
380
  message.type,
374
381
  ),
375
- };
376
- this._subscriptions.set(ok.request_id, { ...existing, phase: "active" });
377
- sideEffects.push({ type: "subscription-activated", subscribeId: ok.request_id });
378
- return { ok: true, phase: this._phase, sideEffects };
382
+ }
383
+ this._subscriptions.set(ok.request_id, { ...existing, phase: 'active' })
384
+ sideEffects.push({
385
+ type: 'subscription-activated',
386
+ subscribeId: ok.request_id,
387
+ })
388
+ return { ok: true, phase: this._phase, sideEffects }
379
389
  }
380
390
 
381
391
  private handleSubscribeError(
382
392
  message: Draft13Message,
383
393
  sideEffects: SideEffect[],
384
394
  ): TransitionResult<Draft13MessageType> {
385
- const err = this.requireReady(message.type);
386
- if (err) return { ok: false, violation: err };
387
- const subErr = message as import("./types.js").Draft13SubscribeError;
388
- const idErr = this.checkKnownRequestId(subErr.request_id, message.type);
389
- if (idErr) return { ok: false, violation: idErr };
390
- const existing = this._subscriptions.get(subErr.request_id);
395
+ const err = this.requireReady(message.type)
396
+ if (err) return { ok: false, violation: err }
397
+ const subErr = message as import('./types.js').Draft13SubscribeError
398
+ const idErr = this.checkKnownRequestId(subErr.request_id, message.type)
399
+ if (idErr) return { ok: false, violation: idErr }
400
+ const existing = this._subscriptions.get(subErr.request_id)
391
401
  if (!existing)
392
402
  return {
393
403
  ok: false,
394
404
  violation: violation(
395
- "UNKNOWN_REQUEST_ID",
405
+ 'UNKNOWN_REQUEST_ID',
396
406
  `No subscription with request ID ${subErr.request_id}`,
397
407
  this._phase,
398
408
  message.type,
399
409
  ),
400
- };
401
- if (existing.phase !== "pending")
410
+ }
411
+ if (existing.phase !== 'pending')
402
412
  return {
403
413
  ok: false,
404
414
  violation: violation(
405
- "STATE_VIOLATION",
415
+ 'STATE_VIOLATION',
406
416
  `Subscription ${subErr.request_id} is ${existing.phase}, not pending`,
407
417
  this._phase,
408
418
  message.type,
409
419
  ),
410
- };
411
- this._subscriptions.set(subErr.request_id, { ...existing, phase: "error" });
420
+ }
421
+ this._subscriptions.set(subErr.request_id, { ...existing, phase: 'error' })
412
422
  sideEffects.push({
413
- type: "subscription-ended",
423
+ type: 'subscription-ended',
414
424
  subscribeId: subErr.request_id,
415
425
  reason: subErr.reason_phrase,
416
- });
417
- return { ok: true, phase: this._phase, sideEffects };
426
+ })
427
+ return { ok: true, phase: this._phase, sideEffects }
418
428
  }
419
429
 
420
430
  private handleSubscribeUpdate(
421
431
  message: Draft13Message,
422
432
  sideEffects: SideEffect[],
423
433
  ): TransitionResult<Draft13MessageType> {
424
- const err = this.requireReady(message.type);
425
- if (err) return { ok: false, violation: err };
426
- const update = message as import("./types.js").Draft13SubscribeUpdate;
427
- const idErr = this.checkKnownRequestId(update.request_id, message.type);
428
- if (idErr) return { ok: false, violation: idErr };
429
- const existing = this._subscriptions.get(update.request_id);
434
+ const err = this.requireReady(message.type)
435
+ if (err) return { ok: false, violation: err }
436
+ const update = message as import('./types.js').Draft13SubscribeUpdate
437
+ const idErr = this.checkKnownRequestId(update.request_id, message.type)
438
+ if (idErr) return { ok: false, violation: idErr }
439
+ const existing = this._subscriptions.get(update.request_id)
430
440
  if (!existing)
431
441
  return {
432
442
  ok: false,
433
443
  violation: violation(
434
- "UNKNOWN_REQUEST_ID",
444
+ 'UNKNOWN_REQUEST_ID',
435
445
  `No subscription with request ID ${update.request_id}`,
436
446
  this._phase,
437
447
  message.type,
438
448
  ),
439
- };
440
- if (existing.phase !== "active")
449
+ }
450
+ if (existing.phase !== 'active')
441
451
  return {
442
452
  ok: false,
443
453
  violation: violation(
444
- "STATE_VIOLATION",
454
+ 'STATE_VIOLATION',
445
455
  `Subscription ${update.request_id} is ${existing.phase}, not active`,
446
456
  this._phase,
447
457
  message.type,
448
458
  ),
449
- };
450
- return { ok: true, phase: this._phase, sideEffects };
459
+ }
460
+ return { ok: true, phase: this._phase, sideEffects }
451
461
  }
452
462
 
453
463
  private handleSubscribeDone(
454
464
  message: Draft13Message,
455
465
  sideEffects: SideEffect[],
456
466
  ): TransitionResult<Draft13MessageType> {
457
- const err = this.requireReady(message.type);
458
- if (err) return { ok: false, violation: err };
459
- const done = message as import("./types.js").Draft13SubscribeDone;
460
- const idErr = this.checkKnownRequestId(done.request_id, message.type);
461
- if (idErr) return { ok: false, violation: idErr };
462
- const existing = this._subscriptions.get(done.request_id);
467
+ const err = this.requireReady(message.type)
468
+ if (err) return { ok: false, violation: err }
469
+ const done = message as import('./types.js').Draft13SubscribeDone
470
+ const idErr = this.checkKnownRequestId(done.request_id, message.type)
471
+ if (idErr) return { ok: false, violation: idErr }
472
+ const existing = this._subscriptions.get(done.request_id)
463
473
  if (!existing)
464
474
  return {
465
475
  ok: false,
466
476
  violation: violation(
467
- "UNKNOWN_REQUEST_ID",
477
+ 'UNKNOWN_REQUEST_ID',
468
478
  `No subscription with request ID ${done.request_id}`,
469
479
  this._phase,
470
480
  message.type,
471
481
  ),
472
- };
473
- this._subscriptions.set(done.request_id, { ...existing, phase: "done" });
482
+ }
483
+ this._subscriptions.set(done.request_id, { ...existing, phase: 'done' })
474
484
  sideEffects.push({
475
- type: "subscription-ended",
485
+ type: 'subscription-ended',
476
486
  subscribeId: done.request_id,
477
487
  reason: done.reason_phrase,
478
- });
479
- return { ok: true, phase: this._phase, sideEffects };
488
+ })
489
+ return { ok: true, phase: this._phase, sideEffects }
480
490
  }
481
491
 
482
492
  private handleUnsubscribe(
483
493
  message: Draft13Message,
484
494
  sideEffects: SideEffect[],
485
495
  ): TransitionResult<Draft13MessageType> {
486
- const err = this.requireReady(message.type);
487
- if (err) return { ok: false, violation: err };
488
- const unsub = message as import("./types.js").Draft13Unsubscribe;
489
- const idErr = this.checkKnownRequestId(unsub.request_id, message.type);
490
- if (idErr) return { ok: false, violation: idErr };
491
- const existing = this._subscriptions.get(unsub.request_id);
496
+ const err = this.requireReady(message.type)
497
+ if (err) return { ok: false, violation: err }
498
+ const unsub = message as import('./types.js').Draft13Unsubscribe
499
+ const idErr = this.checkKnownRequestId(unsub.request_id, message.type)
500
+ if (idErr) return { ok: false, violation: idErr }
501
+ const existing = this._subscriptions.get(unsub.request_id)
492
502
  if (!existing)
493
503
  return {
494
504
  ok: false,
495
505
  violation: violation(
496
- "UNKNOWN_REQUEST_ID",
506
+ 'UNKNOWN_REQUEST_ID',
497
507
  `No subscription with request ID ${unsub.request_id}`,
498
508
  this._phase,
499
509
  message.type,
500
510
  ),
501
- };
502
- this._subscriptions.set(unsub.request_id, { ...existing, phase: "done" });
511
+ }
512
+ this._subscriptions.set(unsub.request_id, { ...existing, phase: 'done' })
503
513
  sideEffects.push({
504
- type: "subscription-ended",
514
+ type: 'subscription-ended',
505
515
  subscribeId: unsub.request_id,
506
- reason: "unsubscribed",
507
- });
508
- return { ok: true, phase: this._phase, sideEffects };
516
+ reason: 'unsubscribed',
517
+ })
518
+ return { ok: true, phase: this._phase, sideEffects }
509
519
  }
510
520
 
511
521
  // ─── Announce lifecycle ───
@@ -514,69 +524,78 @@ export class Draft13SessionFSM {
514
524
  message: Draft13Message,
515
525
  sideEffects: SideEffect[],
516
526
  ): TransitionResult<Draft13MessageType> {
517
- const err = this.requireReady(message.type);
518
- if (err) return { ok: false, violation: err };
519
- const ann = message as import("./types.js").Draft13Announce;
520
- const nsKey = ann.track_namespace.join("/");
521
- this._requestIds.add(ann.request_id);
522
- this._announces.set(nsKey, { namespace: ann.track_namespace, phase: "pending" });
523
- return { ok: true, phase: this._phase, sideEffects };
527
+ const err = this.requireReady(message.type)
528
+ if (err) return { ok: false, violation: err }
529
+ const ann = message as import('./types.js').Draft13Announce
530
+ const nsKey = ann.track_namespace.join('/')
531
+ this._requestIds.add(ann.request_id)
532
+ this._announces.set(nsKey, {
533
+ namespace: ann.track_namespace,
534
+ phase: 'pending',
535
+ })
536
+ return { ok: true, phase: this._phase, sideEffects }
524
537
  }
525
538
 
526
539
  private handleAnnounceOk(
527
540
  message: Draft13Message,
528
541
  sideEffects: SideEffect[],
529
542
  ): TransitionResult<Draft13MessageType> {
530
- const err = this.requireReady(message.type);
531
- if (err) return { ok: false, violation: err };
532
- const ok = message as import("./types.js").Draft13AnnounceOk;
533
- const idErr = this.checkKnownRequestId(ok.request_id, message.type);
534
- if (idErr) return { ok: false, violation: idErr };
535
- return { ok: true, phase: this._phase, sideEffects };
543
+ const err = this.requireReady(message.type)
544
+ if (err) return { ok: false, violation: err }
545
+ const ok = message as import('./types.js').Draft13AnnounceOk
546
+ const idErr = this.checkKnownRequestId(ok.request_id, message.type)
547
+ if (idErr) return { ok: false, violation: idErr }
548
+ return { ok: true, phase: this._phase, sideEffects }
536
549
  }
537
550
 
538
551
  private handleAnnounceError(
539
552
  message: Draft13Message,
540
553
  sideEffects: SideEffect[],
541
554
  ): TransitionResult<Draft13MessageType> {
542
- const err = this.requireReady(message.type);
543
- if (err) return { ok: false, violation: err };
544
- const annErr = message as import("./types.js").Draft13AnnounceError;
545
- const idErr = this.checkKnownRequestId(annErr.request_id, message.type);
546
- if (idErr) return { ok: false, violation: idErr };
547
- return { ok: true, phase: this._phase, sideEffects };
555
+ const err = this.requireReady(message.type)
556
+ if (err) return { ok: false, violation: err }
557
+ const annErr = message as import('./types.js').Draft13AnnounceError
558
+ const idErr = this.checkKnownRequestId(annErr.request_id, message.type)
559
+ if (idErr) return { ok: false, violation: idErr }
560
+ return { ok: true, phase: this._phase, sideEffects }
548
561
  }
549
562
 
550
563
  private handleUnannounce(
551
564
  message: Draft13Message,
552
565
  sideEffects: SideEffect[],
553
566
  ): TransitionResult<Draft13MessageType> {
554
- const err = this.requireReady(message.type);
555
- if (err) return { ok: false, violation: err };
556
- const unann = message as import("./types.js").Draft13Unannounce;
557
- const nsKey = unann.track_namespace.join("/");
558
- const existing = this._announces.get(nsKey);
567
+ const err = this.requireReady(message.type)
568
+ if (err) return { ok: false, violation: err }
569
+ const unann = message as import('./types.js').Draft13Unannounce
570
+ const nsKey = unann.track_namespace.join('/')
571
+ const existing = this._announces.get(nsKey)
559
572
  if (existing) {
560
- this._announces.delete(nsKey);
561
- sideEffects.push({ type: "announce-ended", namespace: unann.track_namespace });
573
+ this._announces.delete(nsKey)
574
+ sideEffects.push({
575
+ type: 'announce-ended',
576
+ namespace: unann.track_namespace,
577
+ })
562
578
  }
563
- return { ok: true, phase: this._phase, sideEffects };
579
+ return { ok: true, phase: this._phase, sideEffects }
564
580
  }
565
581
 
566
582
  private handleAnnounceCancel(
567
583
  message: Draft13Message,
568
584
  sideEffects: SideEffect[],
569
585
  ): TransitionResult<Draft13MessageType> {
570
- const err = this.requireReady(message.type);
571
- if (err) return { ok: false, violation: err };
572
- const cancel = message as import("./types.js").Draft13AnnounceCancel;
573
- const nsKey = cancel.track_namespace.join("/");
574
- const existing = this._announces.get(nsKey);
586
+ const err = this.requireReady(message.type)
587
+ if (err) return { ok: false, violation: err }
588
+ const cancel = message as import('./types.js').Draft13AnnounceCancel
589
+ const nsKey = cancel.track_namespace.join('/')
590
+ const existing = this._announces.get(nsKey)
575
591
  if (existing) {
576
- this._announces.delete(nsKey);
577
- sideEffects.push({ type: "announce-ended", namespace: cancel.track_namespace });
592
+ this._announces.delete(nsKey)
593
+ sideEffects.push({
594
+ type: 'announce-ended',
595
+ namespace: cancel.track_namespace,
596
+ })
578
597
  }
579
- return { ok: true, phase: this._phase, sideEffects };
598
+ return { ok: true, phase: this._phase, sideEffects }
580
599
  }
581
600
 
582
601
  // ─── Publish lifecycle ───
@@ -585,37 +604,37 @@ export class Draft13SessionFSM {
585
604
  message: Draft13Message,
586
605
  sideEffects: SideEffect[],
587
606
  ): TransitionResult<Draft13MessageType> {
588
- const err = this.requireReady(message.type);
589
- if (err) return { ok: false, violation: err };
590
- const pub = message as import("./types.js").Draft13Publish;
591
- const dupErr = this.checkDuplicateRequestId(pub.request_id, message.type);
592
- if (dupErr) return { ok: false, violation: dupErr };
593
- this._requestIds.add(pub.request_id);
594
- return { ok: true, phase: this._phase, sideEffects };
607
+ const err = this.requireReady(message.type)
608
+ if (err) return { ok: false, violation: err }
609
+ const pub = message as import('./types.js').Draft13Publish
610
+ const dupErr = this.checkDuplicateRequestId(pub.request_id, message.type)
611
+ if (dupErr) return { ok: false, violation: dupErr }
612
+ this._requestIds.add(pub.request_id)
613
+ return { ok: true, phase: this._phase, sideEffects }
595
614
  }
596
615
 
597
616
  private handlePublishOk(
598
617
  message: Draft13Message,
599
618
  sideEffects: SideEffect[],
600
619
  ): TransitionResult<Draft13MessageType> {
601
- const err = this.requireReady(message.type);
602
- if (err) return { ok: false, violation: err };
603
- const ok = message as import("./types.js").Draft13PublishOk;
604
- const idErr = this.checkKnownRequestId(ok.request_id, message.type);
605
- if (idErr) return { ok: false, violation: idErr };
606
- return { ok: true, phase: this._phase, sideEffects };
620
+ const err = this.requireReady(message.type)
621
+ if (err) return { ok: false, violation: err }
622
+ const ok = message as import('./types.js').Draft13PublishOk
623
+ const idErr = this.checkKnownRequestId(ok.request_id, message.type)
624
+ if (idErr) return { ok: false, violation: idErr }
625
+ return { ok: true, phase: this._phase, sideEffects }
607
626
  }
608
627
 
609
628
  private handlePublishError(
610
629
  message: Draft13Message,
611
630
  sideEffects: SideEffect[],
612
631
  ): TransitionResult<Draft13MessageType> {
613
- const err = this.requireReady(message.type);
614
- if (err) return { ok: false, violation: err };
615
- const pubErr = message as import("./types.js").Draft13PublishError;
616
- const idErr = this.checkKnownRequestId(pubErr.request_id, message.type);
617
- if (idErr) return { ok: false, violation: idErr };
618
- return { ok: true, phase: this._phase, sideEffects };
632
+ const err = this.requireReady(message.type)
633
+ if (err) return { ok: false, violation: err }
634
+ const pubErr = message as import('./types.js').Draft13PublishError
635
+ const idErr = this.checkKnownRequestId(pubErr.request_id, message.type)
636
+ if (idErr) return { ok: false, violation: idErr }
637
+ return { ok: true, phase: this._phase, sideEffects }
619
638
  }
620
639
 
621
640
  // ─── Fetch lifecycle ───
@@ -624,103 +643,110 @@ export class Draft13SessionFSM {
624
643
  message: Draft13Message,
625
644
  sideEffects: SideEffect[],
626
645
  ): TransitionResult<Draft13MessageType> {
627
- const err = this.requireReady(message.type);
628
- if (err) return { ok: false, violation: err };
629
- const fetch = message as import("./types.js").Draft13Fetch;
630
- const dupErr = this.checkDuplicateRequestId(fetch.request_id, message.type);
631
- if (dupErr) return { ok: false, violation: dupErr };
632
- this._requestIds.add(fetch.request_id);
633
- this._fetches.set(fetch.request_id, { requestId: fetch.request_id, phase: "pending" });
634
- return { ok: true, phase: this._phase, sideEffects };
646
+ const err = this.requireReady(message.type)
647
+ if (err) return { ok: false, violation: err }
648
+ const fetch = message as import('./types.js').Draft13Fetch
649
+ const dupErr = this.checkDuplicateRequestId(fetch.request_id, message.type)
650
+ if (dupErr) return { ok: false, violation: dupErr }
651
+ this._requestIds.add(fetch.request_id)
652
+ this._fetches.set(fetch.request_id, {
653
+ requestId: fetch.request_id,
654
+ phase: 'pending',
655
+ })
656
+ return { ok: true, phase: this._phase, sideEffects }
635
657
  }
636
658
 
637
659
  private handleFetchOk(
638
660
  message: Draft13Message,
639
661
  sideEffects: SideEffect[],
640
662
  ): TransitionResult<Draft13MessageType> {
641
- const err = this.requireReady(message.type);
642
- if (err) return { ok: false, violation: err };
643
- const ok = message as import("./types.js").Draft13FetchOk;
644
- const idErr = this.checkKnownRequestId(ok.request_id, message.type);
645
- if (idErr) return { ok: false, violation: idErr };
646
- const existing = this._fetches.get(ok.request_id);
663
+ const err = this.requireReady(message.type)
664
+ if (err) return { ok: false, violation: err }
665
+ const ok = message as import('./types.js').Draft13FetchOk
666
+ const idErr = this.checkKnownRequestId(ok.request_id, message.type)
667
+ if (idErr) return { ok: false, violation: idErr }
668
+ const existing = this._fetches.get(ok.request_id)
647
669
  if (!existing)
648
670
  return {
649
671
  ok: false,
650
672
  violation: violation(
651
- "UNKNOWN_REQUEST_ID",
673
+ 'UNKNOWN_REQUEST_ID',
652
674
  `No fetch with request ID ${ok.request_id}`,
653
675
  this._phase,
654
676
  message.type,
655
677
  ),
656
- };
657
- if (existing.phase !== "pending")
678
+ }
679
+ if (existing.phase !== 'pending')
658
680
  return {
659
681
  ok: false,
660
682
  violation: violation(
661
- "STATE_VIOLATION",
683
+ 'STATE_VIOLATION',
662
684
  `Fetch ${ok.request_id} is ${existing.phase}, not pending`,
663
685
  this._phase,
664
686
  message.type,
665
687
  ),
666
- };
667
- this._fetches.set(ok.request_id, { ...existing, phase: "active" });
668
- sideEffects.push({ type: "fetch-activated", requestId: ok.request_id });
669
- return { ok: true, phase: this._phase, sideEffects };
688
+ }
689
+ this._fetches.set(ok.request_id, { ...existing, phase: 'active' })
690
+ sideEffects.push({ type: 'fetch-activated', requestId: ok.request_id })
691
+ return { ok: true, phase: this._phase, sideEffects }
670
692
  }
671
693
 
672
694
  private handleFetchError(
673
695
  message: Draft13Message,
674
696
  sideEffects: SideEffect[],
675
697
  ): TransitionResult<Draft13MessageType> {
676
- const err = this.requireReady(message.type);
677
- if (err) return { ok: false, violation: err };
678
- const fetchErr = message as import("./types.js").Draft13FetchError;
679
- const idErr = this.checkKnownRequestId(fetchErr.request_id, message.type);
680
- if (idErr) return { ok: false, violation: idErr };
681
- const existing = this._fetches.get(fetchErr.request_id);
698
+ const err = this.requireReady(message.type)
699
+ if (err) return { ok: false, violation: err }
700
+ const fetchErr = message as import('./types.js').Draft13FetchError
701
+ const idErr = this.checkKnownRequestId(fetchErr.request_id, message.type)
702
+ if (idErr) return { ok: false, violation: idErr }
703
+ const existing = this._fetches.get(fetchErr.request_id)
682
704
  if (!existing)
683
705
  return {
684
706
  ok: false,
685
707
  violation: violation(
686
- "UNKNOWN_REQUEST_ID",
708
+ 'UNKNOWN_REQUEST_ID',
687
709
  `No fetch with request ID ${fetchErr.request_id}`,
688
710
  this._phase,
689
711
  message.type,
690
712
  ),
691
- };
692
- this._fetches.set(fetchErr.request_id, { ...existing, phase: "error" });
713
+ }
714
+ this._fetches.set(fetchErr.request_id, { ...existing, phase: 'error' })
693
715
  sideEffects.push({
694
- type: "fetch-ended",
716
+ type: 'fetch-ended',
695
717
  requestId: fetchErr.request_id,
696
718
  reason: fetchErr.reason_phrase,
697
- });
698
- return { ok: true, phase: this._phase, sideEffects };
719
+ })
720
+ return { ok: true, phase: this._phase, sideEffects }
699
721
  }
700
722
 
701
723
  private handleFetchCancel(
702
724
  message: Draft13Message,
703
725
  sideEffects: SideEffect[],
704
726
  ): TransitionResult<Draft13MessageType> {
705
- const err = this.requireReady(message.type);
706
- if (err) return { ok: false, violation: err };
707
- const cancel = message as import("./types.js").Draft13FetchCancel;
708
- const idErr = this.checkKnownRequestId(cancel.request_id, message.type);
709
- if (idErr) return { ok: false, violation: idErr };
710
- const existing = this._fetches.get(cancel.request_id);
727
+ const err = this.requireReady(message.type)
728
+ if (err) return { ok: false, violation: err }
729
+ const cancel = message as import('./types.js').Draft13FetchCancel
730
+ const idErr = this.checkKnownRequestId(cancel.request_id, message.type)
731
+ if (idErr) return { ok: false, violation: idErr }
732
+ const existing = this._fetches.get(cancel.request_id)
711
733
  if (!existing)
712
734
  return {
713
735
  ok: false,
714
736
  violation: violation(
715
- "UNKNOWN_REQUEST_ID",
737
+ 'UNKNOWN_REQUEST_ID',
716
738
  `No fetch with request ID ${cancel.request_id}`,
717
739
  this._phase,
718
740
  message.type,
719
741
  ),
720
- };
721
- this._fetches.set(cancel.request_id, { ...existing, phase: "cancelled" });
722
- sideEffects.push({ type: "fetch-ended", requestId: cancel.request_id, reason: "cancelled" });
723
- return { ok: true, phase: this._phase, sideEffects };
742
+ }
743
+ this._fetches.set(cancel.request_id, { ...existing, phase: 'cancelled' })
744
+ sideEffects.push({
745
+ type: 'fetch-ended',
746
+ requestId: cancel.request_id,
747
+ reason: 'cancelled',
748
+ })
749
+ return { ok: true, phase: this._phase, sideEffects }
724
750
  }
725
751
 
726
752
  // ─── Track status lifecycle ───
@@ -729,37 +755,37 @@ export class Draft13SessionFSM {
729
755
  message: Draft13Message,
730
756
  sideEffects: SideEffect[],
731
757
  ): TransitionResult<Draft13MessageType> {
732
- const err = this.requireReady(message.type);
733
- if (err) return { ok: false, violation: err };
734
- const ts = message as import("./types.js").Draft13TrackStatus;
735
- const dupErr = this.checkDuplicateRequestId(ts.request_id, message.type);
736
- if (dupErr) return { ok: false, violation: dupErr };
737
- this._requestIds.add(ts.request_id);
738
- return { ok: true, phase: this._phase, sideEffects };
758
+ const err = this.requireReady(message.type)
759
+ if (err) return { ok: false, violation: err }
760
+ const ts = message as import('./types.js').Draft13TrackStatus
761
+ const dupErr = this.checkDuplicateRequestId(ts.request_id, message.type)
762
+ if (dupErr) return { ok: false, violation: dupErr }
763
+ this._requestIds.add(ts.request_id)
764
+ return { ok: true, phase: this._phase, sideEffects }
739
765
  }
740
766
 
741
767
  private handleTrackStatusOk(
742
768
  message: Draft13Message,
743
769
  sideEffects: SideEffect[],
744
770
  ): TransitionResult<Draft13MessageType> {
745
- const err = this.requireReady(message.type);
746
- if (err) return { ok: false, violation: err };
747
- const ok = message as import("./types.js").Draft13TrackStatusOk;
748
- const idErr = this.checkKnownRequestId(ok.request_id, message.type);
749
- if (idErr) return { ok: false, violation: idErr };
750
- return { ok: true, phase: this._phase, sideEffects };
771
+ const err = this.requireReady(message.type)
772
+ if (err) return { ok: false, violation: err }
773
+ const ok = message as import('./types.js').Draft13TrackStatusOk
774
+ const idErr = this.checkKnownRequestId(ok.request_id, message.type)
775
+ if (idErr) return { ok: false, violation: idErr }
776
+ return { ok: true, phase: this._phase, sideEffects }
751
777
  }
752
778
 
753
779
  private handleTrackStatusError(
754
780
  message: Draft13Message,
755
781
  sideEffects: SideEffect[],
756
782
  ): TransitionResult<Draft13MessageType> {
757
- const err = this.requireReady(message.type);
758
- if (err) return { ok: false, violation: err };
759
- const tsErr = message as import("./types.js").Draft13TrackStatusError;
760
- const idErr = this.checkKnownRequestId(tsErr.request_id, message.type);
761
- if (idErr) return { ok: false, violation: idErr };
762
- return { ok: true, phase: this._phase, sideEffects };
783
+ const err = this.requireReady(message.type)
784
+ if (err) return { ok: false, violation: err }
785
+ const tsErr = message as import('./types.js').Draft13TrackStatusError
786
+ const idErr = this.checkKnownRequestId(tsErr.request_id, message.type)
787
+ if (idErr) return { ok: false, violation: idErr }
788
+ return { ok: true, phase: this._phase, sideEffects }
763
789
  }
764
790
 
765
791
  // ─── Subscribe namespace lifecycle ───
@@ -768,52 +794,52 @@ export class Draft13SessionFSM {
768
794
  message: Draft13Message,
769
795
  sideEffects: SideEffect[],
770
796
  ): TransitionResult<Draft13MessageType> {
771
- const err = this.requireReady(message.type);
772
- if (err) return { ok: false, violation: err };
773
- const sn = message as import("./types.js").Draft13SubscribeNamespace;
774
- const dupErr = this.checkDuplicateRequestId(sn.request_id, message.type);
775
- if (dupErr) return { ok: false, violation: dupErr };
776
- this._requestIds.add(sn.request_id);
777
- return { ok: true, phase: this._phase, sideEffects };
797
+ const err = this.requireReady(message.type)
798
+ if (err) return { ok: false, violation: err }
799
+ const sn = message as import('./types.js').Draft13SubscribeNamespace
800
+ const dupErr = this.checkDuplicateRequestId(sn.request_id, message.type)
801
+ if (dupErr) return { ok: false, violation: dupErr }
802
+ this._requestIds.add(sn.request_id)
803
+ return { ok: true, phase: this._phase, sideEffects }
778
804
  }
779
805
 
780
806
  private handleSubscribeNamespaceOk(
781
807
  message: Draft13Message,
782
808
  sideEffects: SideEffect[],
783
809
  ): TransitionResult<Draft13MessageType> {
784
- const err = this.requireReady(message.type);
785
- if (err) return { ok: false, violation: err };
786
- const ok = message as import("./types.js").Draft13SubscribeNamespaceOk;
787
- const idErr = this.checkKnownRequestId(ok.request_id, message.type);
788
- if (idErr) return { ok: false, violation: idErr };
789
- return { ok: true, phase: this._phase, sideEffects };
810
+ const err = this.requireReady(message.type)
811
+ if (err) return { ok: false, violation: err }
812
+ const ok = message as import('./types.js').Draft13SubscribeNamespaceOk
813
+ const idErr = this.checkKnownRequestId(ok.request_id, message.type)
814
+ if (idErr) return { ok: false, violation: idErr }
815
+ return { ok: true, phase: this._phase, sideEffects }
790
816
  }
791
817
 
792
818
  private handleSubscribeNamespaceError(
793
819
  message: Draft13Message,
794
820
  sideEffects: SideEffect[],
795
821
  ): TransitionResult<Draft13MessageType> {
796
- const err = this.requireReady(message.type);
797
- if (err) return { ok: false, violation: err };
798
- const snErr = message as import("./types.js").Draft13SubscribeNamespaceError;
799
- const idErr = this.checkKnownRequestId(snErr.request_id, message.type);
800
- if (idErr) return { ok: false, violation: idErr };
801
- return { ok: true, phase: this._phase, sideEffects };
822
+ const err = this.requireReady(message.type)
823
+ if (err) return { ok: false, violation: err }
824
+ const snErr = message as import('./types.js').Draft13SubscribeNamespaceError
825
+ const idErr = this.checkKnownRequestId(snErr.request_id, message.type)
826
+ if (idErr) return { ok: false, violation: idErr }
827
+ return { ok: true, phase: this._phase, sideEffects }
802
828
  }
803
829
 
804
830
  // ─── Generic ready-phase handler ───
805
831
 
806
832
  private handleReadyPhaseMessage(message: Draft13Message): TransitionResult<Draft13MessageType> {
807
- const err = this.requireReady(message.type);
808
- if (err) return { ok: false, violation: err };
809
- return { ok: true, phase: this._phase, sideEffects: [] };
833
+ const err = this.requireReady(message.type)
834
+ if (err) return { ok: false, violation: err }
835
+ return { ok: true, phase: this._phase, sideEffects: [] }
810
836
  }
811
837
 
812
838
  reset(): void {
813
- this._phase = "idle";
814
- this._subscriptions.clear();
815
- this._announces.clear();
816
- this._fetches.clear();
817
- this._requestIds.clear();
839
+ this._phase = 'idle'
840
+ this._subscriptions.clear()
841
+ this._announces.clear()
842
+ this._fetches.clear()
843
+ this._requestIds.clear()
818
844
  }
819
845
  }