@norskvideo/moq-net 0.1.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 (274) hide show
  1. package/README.md +70 -0
  2. package/announced.d.ts +45 -0
  3. package/announced.d.ts.map +1 -0
  4. package/announced.js +70 -0
  5. package/announced.js.map +1 -0
  6. package/bandwidth.d.ts +11 -0
  7. package/bandwidth.d.ts.map +1 -0
  8. package/bandwidth.js +7 -0
  9. package/bandwidth.js.map +1 -0
  10. package/broadcast.d.ts +39 -0
  11. package/broadcast.d.ts.map +1 -0
  12. package/broadcast.js +76 -0
  13. package/broadcast.js.map +1 -0
  14. package/connection/accept.d.ts +15 -0
  15. package/connection/accept.d.ts.map +1 -0
  16. package/connection/accept.js +137 -0
  17. package/connection/accept.js.map +1 -0
  18. package/connection/cert.test.d.ts +2 -0
  19. package/connection/cert.test.d.ts.map +1 -0
  20. package/connection/cert.test.js +26 -0
  21. package/connection/cert.test.js.map +1 -0
  22. package/connection/connect.d.ts +37 -0
  23. package/connection/connect.d.ts.map +1 -0
  24. package/connection/connect.js +348 -0
  25. package/connection/connect.js.map +1 -0
  26. package/connection/established.d.ts +30 -0
  27. package/connection/established.d.ts.map +1 -0
  28. package/connection/established.js +3 -0
  29. package/connection/established.js.map +1 -0
  30. package/connection/handshake.d.ts +10 -0
  31. package/connection/handshake.d.ts.map +1 -0
  32. package/connection/handshake.js +48 -0
  33. package/connection/handshake.js.map +1 -0
  34. package/connection/index.d.ts +5 -0
  35. package/connection/index.d.ts.map +1 -0
  36. package/connection/index.js +6 -0
  37. package/connection/index.js.map +1 -0
  38. package/connection/reload.d.ts +47 -0
  39. package/connection/reload.d.ts.map +1 -0
  40. package/connection/reload.js +137 -0
  41. package/connection/reload.js.map +1 -0
  42. package/group.d.ts +66 -0
  43. package/group.d.ts.map +1 -0
  44. package/group.js +135 -0
  45. package/group.js.map +1 -0
  46. package/group.test.d.ts +2 -0
  47. package/group.test.d.ts.map +1 -0
  48. package/group.test.js +66 -0
  49. package/group.test.js.map +1 -0
  50. package/ietf/adapter.d.ts +65 -0
  51. package/ietf/adapter.d.ts.map +1 -0
  52. package/ietf/adapter.js +626 -0
  53. package/ietf/adapter.js.map +1 -0
  54. package/ietf/connection.d.ts +65 -0
  55. package/ietf/connection.d.ts.map +1 -0
  56. package/ietf/connection.js +248 -0
  57. package/ietf/connection.js.map +1 -0
  58. package/ietf/control.d.ts +135 -0
  59. package/ietf/control.d.ts.map +1 -0
  60. package/ietf/control.js +242 -0
  61. package/ietf/control.js.map +1 -0
  62. package/ietf/fetch.d.ts +64 -0
  63. package/ietf/fetch.d.ts.map +1 -0
  64. package/ietf/fetch.js +100 -0
  65. package/ietf/fetch.js.map +1 -0
  66. package/ietf/goaway.d.ts +15 -0
  67. package/ietf/goaway.d.ts.map +1 -0
  68. package/ietf/goaway.js +34 -0
  69. package/ietf/goaway.js.map +1 -0
  70. package/ietf/ietf.test.d.ts +2 -0
  71. package/ietf/ietf.test.d.ts.map +1 -0
  72. package/ietf/ietf.test.js +873 -0
  73. package/ietf/ietf.test.js.map +1 -0
  74. package/ietf/index.d.ts +18 -0
  75. package/ietf/index.d.ts.map +1 -0
  76. package/ietf/index.js +19 -0
  77. package/ietf/index.js.map +1 -0
  78. package/ietf/message.d.ts +4 -0
  79. package/ietf/message.d.ts.map +1 -0
  80. package/ietf/message.js +54 -0
  81. package/ietf/message.js.map +1 -0
  82. package/ietf/namespace.d.ts +5 -0
  83. package/ietf/namespace.d.ts.map +1 -0
  84. package/ietf/namespace.js +27 -0
  85. package/ietf/namespace.js.map +1 -0
  86. package/ietf/object.d.ts +40 -0
  87. package/ietf/object.d.ts.map +1 -0
  88. package/ietf/object.js +160 -0
  89. package/ietf/object.js.map +1 -0
  90. package/ietf/parameters.d.ts +56 -0
  91. package/ietf/parameters.d.ts.map +1 -0
  92. package/ietf/parameters.js +337 -0
  93. package/ietf/parameters.js.map +1 -0
  94. package/ietf/properties.d.ts +4 -0
  95. package/ietf/properties.d.ts.map +1 -0
  96. package/ietf/properties.js +33 -0
  97. package/ietf/properties.js.map +1 -0
  98. package/ietf/publish.d.ts +68 -0
  99. package/ietf/publish.d.ts.map +1 -0
  100. package/ietf/publish.js +192 -0
  101. package/ietf/publish.js.map +1 -0
  102. package/ietf/publish_namespace.d.ts +68 -0
  103. package/ietf/publish_namespace.d.ts.map +1 -0
  104. package/ietf/publish_namespace.js +176 -0
  105. package/ietf/publish_namespace.js.map +1 -0
  106. package/ietf/publisher.d.ts +50 -0
  107. package/ietf/publisher.d.ts.map +1 -0
  108. package/ietf/publisher.js +330 -0
  109. package/ietf/publisher.js.map +1 -0
  110. package/ietf/request.d.ts +52 -0
  111. package/ietf/request.d.ts.map +1 -0
  112. package/ietf/request.js +119 -0
  113. package/ietf/request.js.map +1 -0
  114. package/ietf/setup.d.ts +38 -0
  115. package/ietf/setup.d.ts.map +1 -0
  116. package/ietf/setup.js +129 -0
  117. package/ietf/setup.js.map +1 -0
  118. package/ietf/subscribe.d.ts +66 -0
  119. package/ietf/subscribe.d.ts.map +1 -0
  120. package/ietf/subscribe.js +276 -0
  121. package/ietf/subscribe.js.map +1 -0
  122. package/ietf/subscribe_namespace.d.ts +101 -0
  123. package/ietf/subscribe_namespace.d.ts.map +1 -0
  124. package/ietf/subscribe_namespace.js +256 -0
  125. package/ietf/subscribe_namespace.js.map +1 -0
  126. package/ietf/subscriber.d.ts +53 -0
  127. package/ietf/subscriber.d.ts.map +1 -0
  128. package/ietf/subscriber.js +404 -0
  129. package/ietf/subscriber.js.map +1 -0
  130. package/ietf/track.d.ts +40 -0
  131. package/ietf/track.d.ts.map +1 -0
  132. package/ietf/track.js +108 -0
  133. package/ietf/track.js.map +1 -0
  134. package/ietf/version.d.ts +56 -0
  135. package/ietf/version.d.ts.map +1 -0
  136. package/ietf/version.js +63 -0
  137. package/ietf/version.js.map +1 -0
  138. package/index.d.ts +22 -0
  139. package/index.d.ts.map +1 -0
  140. package/index.js +23 -0
  141. package/index.js.map +1 -0
  142. package/integration.test.d.ts +2 -0
  143. package/integration.test.d.ts.map +1 -0
  144. package/integration.test.js +90 -0
  145. package/integration.test.js.map +1 -0
  146. package/lite/announce.d.ts +35 -0
  147. package/lite/announce.d.ts.map +1 -0
  148. package/lite/announce.js +166 -0
  149. package/lite/announce.js.map +1 -0
  150. package/lite/connection.d.ts +47 -0
  151. package/lite/connection.d.ts.map +1 -0
  152. package/lite/connection.js +247 -0
  153. package/lite/connection.js.map +1 -0
  154. package/lite/fetch.d.ts +14 -0
  155. package/lite/fetch.d.ts.map +1 -0
  156. package/lite/fetch.js +47 -0
  157. package/lite/fetch.js.map +1 -0
  158. package/lite/goaway.d.ts +10 -0
  159. package/lite/goaway.d.ts.map +1 -0
  160. package/lite/goaway.js +37 -0
  161. package/lite/goaway.js.map +1 -0
  162. package/lite/group.d.ts +18 -0
  163. package/lite/group.d.ts.map +1 -0
  164. package/lite/group.js +46 -0
  165. package/lite/group.js.map +1 -0
  166. package/lite/index.d.ts +11 -0
  167. package/lite/index.d.ts.map +1 -0
  168. package/lite/index.js +12 -0
  169. package/lite/index.js.map +1 -0
  170. package/lite/message.d.ts +5 -0
  171. package/lite/message.d.ts.map +1 -0
  172. package/lite/message.js +51 -0
  173. package/lite/message.js.map +1 -0
  174. package/lite/origin.d.ts +25 -0
  175. package/lite/origin.d.ts.map +1 -0
  176. package/lite/origin.js +35 -0
  177. package/lite/origin.js.map +1 -0
  178. package/lite/probe.d.ts +12 -0
  179. package/lite/probe.d.ts.map +1 -0
  180. package/lite/probe.js +60 -0
  181. package/lite/probe.js.map +1 -0
  182. package/lite/publisher.d.ts +63 -0
  183. package/lite/publisher.d.ts.map +1 -0
  184. package/lite/publisher.js +350 -0
  185. package/lite/publisher.js.map +1 -0
  186. package/lite/session.d.ts +36 -0
  187. package/lite/session.d.ts.map +1 -0
  188. package/lite/session.js +130 -0
  189. package/lite/session.js.map +1 -0
  190. package/lite/setup.d.ts +18 -0
  191. package/lite/setup.d.ts.map +1 -0
  192. package/lite/setup.js +55 -0
  193. package/lite/setup.js.map +1 -0
  194. package/lite/stream.d.ts +23 -0
  195. package/lite/stream.d.ts.map +1 -0
  196. package/lite/stream.js +20 -0
  197. package/lite/stream.js.map +1 -0
  198. package/lite/subscribe.d.ts +111 -0
  199. package/lite/subscribe.d.ts.map +1 -0
  200. package/lite/subscribe.js +341 -0
  201. package/lite/subscribe.js.map +1 -0
  202. package/lite/subscriber.d.ts +80 -0
  203. package/lite/subscriber.d.ts.map +1 -0
  204. package/lite/subscriber.js +316 -0
  205. package/lite/subscriber.js.map +1 -0
  206. package/lite/track.d.ts +38 -0
  207. package/lite/track.d.ts.map +1 -0
  208. package/lite/track.js +81 -0
  209. package/lite/track.js.map +1 -0
  210. package/lite/track.test.d.ts +2 -0
  211. package/lite/track.test.d.ts.map +1 -0
  212. package/lite/track.test.js +53 -0
  213. package/lite/track.test.js.map +1 -0
  214. package/lite/version.d.ts +16 -0
  215. package/lite/version.d.ts.map +1 -0
  216. package/lite/version.js +41 -0
  217. package/lite/version.js.map +1 -0
  218. package/mock.d.ts +16 -0
  219. package/mock.d.ts.map +1 -0
  220. package/mock.js +154 -0
  221. package/mock.js.map +1 -0
  222. package/package.json +27 -0
  223. package/path.d.ts +111 -0
  224. package/path.d.ts.map +1 -0
  225. package/path.js +133 -0
  226. package/path.js.map +1 -0
  227. package/path.test.d.ts +2 -0
  228. package/path.test.d.ts.map +1 -0
  229. package/path.test.js +169 -0
  230. package/path.test.js.map +1 -0
  231. package/stream.d.ts +57 -0
  232. package/stream.d.ts.map +1 -0
  233. package/stream.js +326 -0
  234. package/stream.js.map +1 -0
  235. package/stream.test.d.ts +2 -0
  236. package/stream.test.d.ts.map +1 -0
  237. package/stream.test.js +210 -0
  238. package/stream.test.js.map +1 -0
  239. package/time.d.ts +109 -0
  240. package/time.d.ts.map +1 -0
  241. package/time.js +94 -0
  242. package/time.js.map +1 -0
  243. package/track.d.ts +85 -0
  244. package/track.d.ts.map +1 -0
  245. package/track.js +227 -0
  246. package/track.js.map +1 -0
  247. package/track.test.d.ts +2 -0
  248. package/track.test.d.ts.map +1 -0
  249. package/track.test.js +56 -0
  250. package/track.test.js.map +1 -0
  251. package/util/error.d.ts +3 -0
  252. package/util/error.d.ts.map +1 -0
  253. package/util/error.js +9 -0
  254. package/util/error.js.map +1 -0
  255. package/util/hex.d.ts +3 -0
  256. package/util/hex.d.ts.map +1 -0
  257. package/util/hex.js +16 -0
  258. package/util/hex.js.map +1 -0
  259. package/util/index.d.ts +2 -0
  260. package/util/index.d.ts.map +1 -0
  261. package/util/index.js +3 -0
  262. package/util/index.js.map +1 -0
  263. package/varint.d.ts +36 -0
  264. package/varint.d.ts.map +1 -0
  265. package/varint.js +288 -0
  266. package/varint.js.map +1 -0
  267. package/varint.test.d.ts +2 -0
  268. package/varint.test.d.ts.map +1 -0
  269. package/varint.test.js +106 -0
  270. package/varint.test.js.map +1 -0
  271. package/zod.d.ts +13 -0
  272. package/zod.d.ts.map +1 -0
  273. package/zod.js +19 -0
  274. package/zod.js.map +1 -0
@@ -0,0 +1,242 @@
1
+ /* @ts-self-types="./control.d.ts" */
2
+ import { Mutex } from "async-mutex";
3
+ import { Fetch, FetchCancel, FetchError, FetchOk } from "./fetch.js";
4
+ import { GoAway } from "./goaway.js";
5
+ import { Publish, PublishDone, PublishError, PublishOk } from "./publish.js";
6
+ import { PublishNamespace, PublishNamespaceCancel, PublishNamespaceDone, PublishNamespaceError, PublishNamespaceOk, } from "./publish_namespace.js";
7
+ import { MaxRequestId, RequestError, RequestOk, RequestsBlocked } from "./request.js";
8
+ import * as Setup from "./setup.js";
9
+ import { Subscribe, SubscribeError, SubscribeOk, SubscribeUpdate, Unsubscribe } from "./subscribe.js";
10
+ import { SUBSCRIBE_TRACKS_ID, SubscribeNamespaceError, SubscribeNamespaceLegacy, SubscribeNamespaceOk, UnsubscribeNamespace, } from "./subscribe_namespace.js";
11
+ import { TrackStatus, TrackStatusRequest } from "./track.js";
12
+ import { Version } from "./version.js";
13
+ // v14 message map — IDs that have different meanings in v15 are handled specially
14
+ const MessagesV14 = {
15
+ [Setup.ClientSetup.id]: Setup.ClientSetup,
16
+ [Setup.ServerSetup.id]: Setup.ServerSetup,
17
+ [SubscribeUpdate.id]: SubscribeUpdate,
18
+ [Subscribe.id]: Subscribe,
19
+ [SubscribeOk.id]: SubscribeOk,
20
+ [SubscribeError.id]: SubscribeError,
21
+ [PublishNamespace.id]: PublishNamespace,
22
+ [PublishNamespaceOk.id]: PublishNamespaceOk,
23
+ [PublishNamespaceError.id]: PublishNamespaceError,
24
+ [PublishNamespaceDone.id]: PublishNamespaceDone,
25
+ [Unsubscribe.id]: Unsubscribe,
26
+ [PublishDone.id]: PublishDone,
27
+ [PublishNamespaceCancel.id]: PublishNamespaceCancel,
28
+ [TrackStatusRequest.id]: TrackStatusRequest,
29
+ [TrackStatus.id]: TrackStatus,
30
+ [GoAway.id]: GoAway,
31
+ [Fetch.id]: Fetch,
32
+ [FetchCancel.id]: FetchCancel,
33
+ [FetchOk.id]: FetchOk,
34
+ [FetchError.id]: FetchError,
35
+ [SubscribeNamespaceLegacy.id]: SubscribeNamespaceLegacy,
36
+ [SubscribeNamespaceOk.id]: SubscribeNamespaceOk,
37
+ [SubscribeNamespaceError.id]: SubscribeNamespaceError,
38
+ [UnsubscribeNamespace.id]: UnsubscribeNamespace,
39
+ [Publish.id]: Publish,
40
+ [PublishOk.id]: PublishOk,
41
+ [PublishError.id]: PublishError,
42
+ [MaxRequestId.id]: MaxRequestId,
43
+ [RequestsBlocked.id]: RequestsBlocked,
44
+ };
45
+ // v15 message map — 0x05 → RequestError, 0x07 → RequestOk (different wire format)
46
+ // Messages removed in v15 (0x08, 0x0E, 0x12, 0x13, 0x19, 0x1E, 0x1F) are excluded and will be rejected
47
+ const MessagesV15 = {
48
+ [Setup.ClientSetup.id]: Setup.ClientSetup,
49
+ [Setup.ServerSetup.id]: Setup.ServerSetup,
50
+ [SubscribeUpdate.id]: SubscribeUpdate,
51
+ [Subscribe.id]: Subscribe,
52
+ [SubscribeOk.id]: SubscribeOk,
53
+ [RequestError.id]: RequestError, // 0x05 → RequestError instead of SubscribeError
54
+ [PublishNamespace.id]: PublishNamespace,
55
+ [RequestOk.id]: RequestOk, // 0x07 → RequestOk instead of PublishNamespaceOk
56
+ [PublishNamespaceDone.id]: PublishNamespaceDone,
57
+ [Unsubscribe.id]: Unsubscribe,
58
+ [PublishDone.id]: PublishDone,
59
+ [PublishNamespaceCancel.id]: PublishNamespaceCancel,
60
+ [TrackStatusRequest.id]: TrackStatusRequest,
61
+ [GoAway.id]: GoAway,
62
+ [Fetch.id]: Fetch,
63
+ [FetchCancel.id]: FetchCancel,
64
+ [FetchOk.id]: FetchOk,
65
+ [SubscribeNamespaceLegacy.id]: SubscribeNamespaceLegacy,
66
+ [UnsubscribeNamespace.id]: UnsubscribeNamespace,
67
+ [Publish.id]: Publish,
68
+ [MaxRequestId.id]: MaxRequestId,
69
+ [RequestsBlocked.id]: RequestsBlocked,
70
+ };
71
+ // v16 message map — SubscribeNamespace (0x11) and UnsubscribeNamespace (0x14) move to bidi streams
72
+ const MessagesV16 = {
73
+ [Setup.ClientSetup.id]: Setup.ClientSetup,
74
+ [Setup.ServerSetup.id]: Setup.ServerSetup,
75
+ [SubscribeUpdate.id]: SubscribeUpdate,
76
+ [Subscribe.id]: Subscribe,
77
+ [SubscribeOk.id]: SubscribeOk,
78
+ [RequestError.id]: RequestError, // 0x05 → RequestError
79
+ [PublishNamespace.id]: PublishNamespace,
80
+ [RequestOk.id]: RequestOk, // 0x07 → RequestOk
81
+ [PublishNamespaceDone.id]: PublishNamespaceDone,
82
+ [Unsubscribe.id]: Unsubscribe,
83
+ [PublishDone.id]: PublishDone,
84
+ [PublishNamespaceCancel.id]: PublishNamespaceCancel,
85
+ [TrackStatusRequest.id]: TrackStatusRequest,
86
+ [GoAway.id]: GoAway,
87
+ [Fetch.id]: Fetch,
88
+ [FetchCancel.id]: FetchCancel,
89
+ [FetchOk.id]: FetchOk,
90
+ // SubscribeNamespace (0x11) removed — now on bidi stream
91
+ // UnsubscribeNamespace (0x14) removed — now use stream close
92
+ [Publish.id]: Publish,
93
+ [MaxRequestId.id]: MaxRequestId,
94
+ [RequestsBlocked.id]: RequestsBlocked,
95
+ };
96
+ // v17 message map — uses unified Setup (0x2F00), removes several messages
97
+ const MessagesV17 = {
98
+ [Setup.Setup.id]: Setup.Setup, // 0x2F00: unified SETUP
99
+ [SubscribeUpdate.id]: SubscribeUpdate, // 0x02: REQUEST_UPDATE
100
+ [Subscribe.id]: Subscribe,
101
+ [SubscribeOk.id]: SubscribeOk,
102
+ [RequestError.id]: RequestError, // 0x05
103
+ [PublishNamespace.id]: PublishNamespace,
104
+ [RequestOk.id]: RequestOk, // 0x07
105
+ // 0x08: NAMESPACE (bidi stream only)
106
+ // 0x09: removed in d17
107
+ // 0x0a: removed in d17
108
+ [PublishDone.id]: PublishDone,
109
+ // 0x0c: removed in d17
110
+ [TrackStatusRequest.id]: TrackStatusRequest,
111
+ // 0x0e: NAMESPACE_DONE (bidi stream only), NOT TrackStatus
112
+ // 0x0f: PUBLISH_BLOCKED (bidi stream only)
113
+ [GoAway.id]: GoAway,
114
+ [Fetch.id]: Fetch,
115
+ // FetchCancel (0x17) removed in d17
116
+ [FetchOk.id]: FetchOk,
117
+ [SubscribeNamespaceLegacy.id]: SubscribeNamespaceLegacy,
118
+ [Publish.id]: Publish,
119
+ // MaxRequestId (0x15) removed in d17
120
+ // RequestsBlocked (0x1a) removed in d17
121
+ };
122
+ // v18 message map — same as v17 with these spec changes:
123
+ // * #1615 removes Required Request ID (transparent on the wire for messages here)
124
+ // * #1542 splits SUBSCRIBE_NAMESPACE into SUBSCRIBE_NAMESPACE + SUBSCRIBE_TRACKS (0x51).
125
+ // moq-lite does not implement track subscription via PUBLISH replication, so 0x51
126
+ // is rejected as an explicit error rather than silently ignored.
127
+ //
128
+ // draft-19 (#1765 range filters, #1613 MAX_REQUEST_UPDATES, GOAWAY request-id
129
+ // removal, etc.) makes no wire changes to the messages moq-lite exchanges, so it
130
+ // reuses the same map.
131
+ const MessagesV18 = MessagesV17;
132
+ export class Stream {
133
+ stream;
134
+ version;
135
+ // The client always starts at 0.
136
+ #requestId = 0n;
137
+ #maxRequestId;
138
+ #maxRequestIdUpdate;
139
+ #writeLock = new Mutex();
140
+ #readLock = new Mutex();
141
+ constructor({ stream, maxRequestId, version = Version.DRAFT_14, }) {
142
+ this.stream = stream;
143
+ this.version = version;
144
+ // Set version on reader/writer so varint encoding is version-aware
145
+ this.stream.reader.version = version;
146
+ this.stream.writer.version = version;
147
+ this.#maxRequestId = maxRequestId;
148
+ this.#maxRequestIdUpdate = Promise.withResolvers();
149
+ }
150
+ /**
151
+ * Writes a control message to the control stream with proper framing.
152
+ * Format: Message Type (varint) + Message Length (u16) + Message Payload
153
+ */
154
+ async write(message) {
155
+ console.debug("message write", message);
156
+ await this.#writeLock.runExclusive(async () => {
157
+ // Write message type
158
+ await this.stream.writer.u53(message.constructor.id);
159
+ // Write message payload with u16 size prefix
160
+ await message.encode(this.stream.writer, this.version);
161
+ });
162
+ }
163
+ /**
164
+ * Reads a control message from the control stream.
165
+ * Returns the message type and a reader for the payload.
166
+ */
167
+ async read() {
168
+ return await this.#readLock.runExclusive(async () => {
169
+ const messageType = await this.stream.reader.u53();
170
+ // Draft-18+ (#1542) splits SUBSCRIBE_NAMESPACE into SUBSCRIBE_NAMESPACE +
171
+ // SUBSCRIBE_TRACKS (0x51). moq-lite does not support track subscription
172
+ // via PUBLISH replication, so reject loudly rather than wait forever.
173
+ if (this.version >= Version.DRAFT_18 && messageType === SUBSCRIBE_TRACKS_ID) {
174
+ throw new Error("SUBSCRIBE_TRACKS (0x51) is not supported in moq-lite (no PUBLISH replication)");
175
+ }
176
+ let messages;
177
+ if (this.version === Version.DRAFT_14) {
178
+ messages = MessagesV14;
179
+ }
180
+ else if (this.version === Version.DRAFT_15) {
181
+ messages = MessagesV15;
182
+ }
183
+ else if (this.version === Version.DRAFT_16) {
184
+ messages = MessagesV16;
185
+ }
186
+ else if (this.version === Version.DRAFT_17) {
187
+ messages = MessagesV17;
188
+ }
189
+ else {
190
+ messages = MessagesV18;
191
+ }
192
+ if (!(messageType in messages)) {
193
+ throw new Error(`Unknown control message type: ${messageType}`);
194
+ }
195
+ try {
196
+ const msgClass = messages[messageType];
197
+ const msg = await msgClass.decode(this.stream.reader, this.version);
198
+ return msg;
199
+ }
200
+ catch (err) {
201
+ console.error("failed to decode message", messageType, err);
202
+ throw err;
203
+ }
204
+ });
205
+ }
206
+ maxRequestId(max) {
207
+ if (max <= this.#maxRequestId) {
208
+ throw new Error(`max request id must be greater than current max request id: max=${max} current=${this.#maxRequestId}`);
209
+ }
210
+ this.#maxRequestId = max;
211
+ this.#maxRequestIdUpdate?.resolve();
212
+ this.#maxRequestIdUpdate = Promise.withResolvers();
213
+ }
214
+ async nextRequestId() {
215
+ while (true) {
216
+ const id = this.#requestId;
217
+ // d14-d16 use MAX_REQUEST_ID flow control; d17+ removed it.
218
+ if (this.version === Version.DRAFT_14 ||
219
+ this.version === Version.DRAFT_15 ||
220
+ this.version === Version.DRAFT_16) {
221
+ if (id < this.#maxRequestId) {
222
+ this.#requestId += 2n;
223
+ return id;
224
+ }
225
+ }
226
+ else {
227
+ this.#requestId += 2n;
228
+ return id;
229
+ }
230
+ if (!this.#maxRequestIdUpdate) {
231
+ return undefined;
232
+ }
233
+ console.warn("blocked on max request id");
234
+ await this.#maxRequestIdUpdate.promise;
235
+ }
236
+ }
237
+ close() {
238
+ this.#maxRequestIdUpdate?.resolve();
239
+ this.#maxRequestIdUpdate = undefined;
240
+ }
241
+ }
242
+ //# sourceMappingURL=control.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"control.js","sourceRoot":"","sources":["../../src/ietf/control.ts"],"names":[],"mappings":"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","sourcesContent":["import { Mutex } from \"async-mutex\";\nimport type { Stream as StreamInner, Writer } from \"../stream.ts\";\nimport { Fetch, FetchCancel, FetchError, FetchOk } from \"./fetch.ts\";\nimport { GoAway } from \"./goaway.ts\";\nimport { Publish, PublishDone, PublishError, PublishOk } from \"./publish.ts\";\nimport {\n\tPublishNamespace,\n\tPublishNamespaceCancel,\n\tPublishNamespaceDone,\n\tPublishNamespaceError,\n\tPublishNamespaceOk,\n} from \"./publish_namespace.ts\";\nimport { MaxRequestId, RequestError, RequestOk, RequestsBlocked } from \"./request.ts\";\nimport * as Setup from \"./setup.ts\";\nimport { Subscribe, SubscribeError, SubscribeOk, SubscribeUpdate, Unsubscribe } from \"./subscribe.ts\";\nimport {\n\tSUBSCRIBE_TRACKS_ID,\n\tSubscribeNamespaceError,\n\tSubscribeNamespaceLegacy,\n\tSubscribeNamespaceOk,\n\tUnsubscribeNamespace,\n} from \"./subscribe_namespace.ts\";\nimport { TrackStatus, TrackStatusRequest } from \"./track.ts\";\nimport { type IetfVersion, Version } from \"./version.ts\";\n\n// v14 message map — IDs that have different meanings in v15 are handled specially\nconst MessagesV14 = {\n\t[Setup.ClientSetup.id]: Setup.ClientSetup,\n\t[Setup.ServerSetup.id]: Setup.ServerSetup,\n\t[SubscribeUpdate.id]: SubscribeUpdate,\n\t[Subscribe.id]: Subscribe,\n\t[SubscribeOk.id]: SubscribeOk,\n\t[SubscribeError.id]: SubscribeError,\n\t[PublishNamespace.id]: PublishNamespace,\n\t[PublishNamespaceOk.id]: PublishNamespaceOk,\n\t[PublishNamespaceError.id]: PublishNamespaceError,\n\t[PublishNamespaceDone.id]: PublishNamespaceDone,\n\t[Unsubscribe.id]: Unsubscribe,\n\t[PublishDone.id]: PublishDone,\n\t[PublishNamespaceCancel.id]: PublishNamespaceCancel,\n\t[TrackStatusRequest.id]: TrackStatusRequest,\n\t[TrackStatus.id]: TrackStatus,\n\t[GoAway.id]: GoAway,\n\t[Fetch.id]: Fetch,\n\t[FetchCancel.id]: FetchCancel,\n\t[FetchOk.id]: FetchOk,\n\t[FetchError.id]: FetchError,\n\t[SubscribeNamespaceLegacy.id]: SubscribeNamespaceLegacy,\n\t[SubscribeNamespaceOk.id]: SubscribeNamespaceOk,\n\t[SubscribeNamespaceError.id]: SubscribeNamespaceError,\n\t[UnsubscribeNamespace.id]: UnsubscribeNamespace,\n\t[Publish.id]: Publish,\n\t[PublishOk.id]: PublishOk,\n\t[PublishError.id]: PublishError,\n\t[MaxRequestId.id]: MaxRequestId,\n\t[RequestsBlocked.id]: RequestsBlocked,\n} as const;\n\n// v15 message map — 0x05 → RequestError, 0x07 → RequestOk (different wire format)\n// Messages removed in v15 (0x08, 0x0E, 0x12, 0x13, 0x19, 0x1E, 0x1F) are excluded and will be rejected\nconst MessagesV15 = {\n\t[Setup.ClientSetup.id]: Setup.ClientSetup,\n\t[Setup.ServerSetup.id]: Setup.ServerSetup,\n\t[SubscribeUpdate.id]: SubscribeUpdate,\n\t[Subscribe.id]: Subscribe,\n\t[SubscribeOk.id]: SubscribeOk,\n\t[RequestError.id]: RequestError, // 0x05 → RequestError instead of SubscribeError\n\t[PublishNamespace.id]: PublishNamespace,\n\t[RequestOk.id]: RequestOk, // 0x07 → RequestOk instead of PublishNamespaceOk\n\t[PublishNamespaceDone.id]: PublishNamespaceDone,\n\t[Unsubscribe.id]: Unsubscribe,\n\t[PublishDone.id]: PublishDone,\n\t[PublishNamespaceCancel.id]: PublishNamespaceCancel,\n\t[TrackStatusRequest.id]: TrackStatusRequest,\n\t[GoAway.id]: GoAway,\n\t[Fetch.id]: Fetch,\n\t[FetchCancel.id]: FetchCancel,\n\t[FetchOk.id]: FetchOk,\n\t[SubscribeNamespaceLegacy.id]: SubscribeNamespaceLegacy,\n\t[UnsubscribeNamespace.id]: UnsubscribeNamespace,\n\t[Publish.id]: Publish,\n\t[MaxRequestId.id]: MaxRequestId,\n\t[RequestsBlocked.id]: RequestsBlocked,\n} as const;\n\n// v16 message map — SubscribeNamespace (0x11) and UnsubscribeNamespace (0x14) move to bidi streams\nconst MessagesV16 = {\n\t[Setup.ClientSetup.id]: Setup.ClientSetup,\n\t[Setup.ServerSetup.id]: Setup.ServerSetup,\n\t[SubscribeUpdate.id]: SubscribeUpdate,\n\t[Subscribe.id]: Subscribe,\n\t[SubscribeOk.id]: SubscribeOk,\n\t[RequestError.id]: RequestError, // 0x05 → RequestError\n\t[PublishNamespace.id]: PublishNamespace,\n\t[RequestOk.id]: RequestOk, // 0x07 → RequestOk\n\t[PublishNamespaceDone.id]: PublishNamespaceDone,\n\t[Unsubscribe.id]: Unsubscribe,\n\t[PublishDone.id]: PublishDone,\n\t[PublishNamespaceCancel.id]: PublishNamespaceCancel,\n\t[TrackStatusRequest.id]: TrackStatusRequest,\n\t[GoAway.id]: GoAway,\n\t[Fetch.id]: Fetch,\n\t[FetchCancel.id]: FetchCancel,\n\t[FetchOk.id]: FetchOk,\n\t// SubscribeNamespace (0x11) removed — now on bidi stream\n\t// UnsubscribeNamespace (0x14) removed — now use stream close\n\t[Publish.id]: Publish,\n\t[MaxRequestId.id]: MaxRequestId,\n\t[RequestsBlocked.id]: RequestsBlocked,\n} as const;\n\n// v17 message map — uses unified Setup (0x2F00), removes several messages\nconst MessagesV17 = {\n\t[Setup.Setup.id]: Setup.Setup, // 0x2F00: unified SETUP\n\t[SubscribeUpdate.id]: SubscribeUpdate, // 0x02: REQUEST_UPDATE\n\t[Subscribe.id]: Subscribe,\n\t[SubscribeOk.id]: SubscribeOk,\n\t[RequestError.id]: RequestError, // 0x05\n\t[PublishNamespace.id]: PublishNamespace,\n\t[RequestOk.id]: RequestOk, // 0x07\n\t// 0x08: NAMESPACE (bidi stream only)\n\t// 0x09: removed in d17\n\t// 0x0a: removed in d17\n\t[PublishDone.id]: PublishDone,\n\t// 0x0c: removed in d17\n\t[TrackStatusRequest.id]: TrackStatusRequest,\n\t// 0x0e: NAMESPACE_DONE (bidi stream only), NOT TrackStatus\n\t// 0x0f: PUBLISH_BLOCKED (bidi stream only)\n\t[GoAway.id]: GoAway,\n\t[Fetch.id]: Fetch,\n\t// FetchCancel (0x17) removed in d17\n\t[FetchOk.id]: FetchOk,\n\t[SubscribeNamespaceLegacy.id]: SubscribeNamespaceLegacy,\n\t[Publish.id]: Publish,\n\t// MaxRequestId (0x15) removed in d17\n\t// RequestsBlocked (0x1a) removed in d17\n} as const;\n\n// v18 message map — same as v17 with these spec changes:\n// * #1615 removes Required Request ID (transparent on the wire for messages here)\n// * #1542 splits SUBSCRIBE_NAMESPACE into SUBSCRIBE_NAMESPACE + SUBSCRIBE_TRACKS (0x51).\n// moq-lite does not implement track subscription via PUBLISH replication, so 0x51\n// is rejected as an explicit error rather than silently ignored.\n//\n// draft-19 (#1765 range filters, #1613 MAX_REQUEST_UPDATES, GOAWAY request-id\n// removal, etc.) makes no wire changes to the messages moq-lite exchanges, so it\n// reuses the same map.\nconst MessagesV18 = MessagesV17;\n\ntype V14MessageType = (typeof MessagesV14)[keyof typeof MessagesV14];\ntype V15MessageType = (typeof MessagesV15)[keyof typeof MessagesV15];\ntype V16MessageType = (typeof MessagesV16)[keyof typeof MessagesV16];\ntype V17MessageType = (typeof MessagesV17)[keyof typeof MessagesV17];\ntype MessageType = V14MessageType | V15MessageType | V16MessageType | V17MessageType;\n\n// Type for control message instances (not constructors)\nexport type Message = InstanceType<MessageType>;\n\nexport class Stream {\n\tstream: StreamInner;\n\tversion: IetfVersion;\n\n\t// The client always starts at 0.\n\t#requestId = 0n;\n\n\t#maxRequestId: bigint;\n\n\t#maxRequestIdUpdate?: PromiseWithResolvers<void>;\n\n\t#writeLock = new Mutex();\n\t#readLock = new Mutex();\n\n\tconstructor({\n\t\tstream,\n\t\tmaxRequestId,\n\t\tversion = Version.DRAFT_14,\n\t}: {\n\t\tstream: StreamInner;\n\t\tmaxRequestId: bigint;\n\t\tversion?: IetfVersion;\n\t}) {\n\t\tthis.stream = stream;\n\t\tthis.version = version;\n\t\t// Set version on reader/writer so varint encoding is version-aware\n\t\tthis.stream.reader.version = version;\n\t\tthis.stream.writer.version = version;\n\t\tthis.#maxRequestId = maxRequestId;\n\t\tthis.#maxRequestIdUpdate = Promise.withResolvers();\n\t}\n\n\t/**\n\t * Writes a control message to the control stream with proper framing.\n\t * Format: Message Type (varint) + Message Length (u16) + Message Payload\n\t */\n\tasync write<T extends Message>(message: T): Promise<void> {\n\t\tconsole.debug(\"message write\", message);\n\n\t\tawait this.#writeLock.runExclusive(async () => {\n\t\t\t// Write message type\n\t\t\tawait this.stream.writer.u53((message.constructor as MessageType).id);\n\n\t\t\t// Write message payload with u16 size prefix\n\t\t\tawait (message.encode as (w: Writer, v: IetfVersion) => Promise<void>)(this.stream.writer, this.version);\n\t\t});\n\t}\n\n\t/**\n\t * Reads a control message from the control stream.\n\t * Returns the message type and a reader for the payload.\n\t */\n\tasync read(): Promise<Message> {\n\t\treturn await this.#readLock.runExclusive(async () => {\n\t\t\tconst messageType = await this.stream.reader.u53();\n\n\t\t\t// Draft-18+ (#1542) splits SUBSCRIBE_NAMESPACE into SUBSCRIBE_NAMESPACE +\n\t\t\t// SUBSCRIBE_TRACKS (0x51). moq-lite does not support track subscription\n\t\t\t// via PUBLISH replication, so reject loudly rather than wait forever.\n\t\t\tif (this.version >= Version.DRAFT_18 && messageType === SUBSCRIBE_TRACKS_ID) {\n\t\t\t\tthrow new Error(\"SUBSCRIBE_TRACKS (0x51) is not supported in moq-lite (no PUBLISH replication)\");\n\t\t\t}\n\n\t\t\tlet messages: Record<number, MessageType>;\n\t\t\tif (this.version === Version.DRAFT_14) {\n\t\t\t\tmessages = MessagesV14 as unknown as Record<number, MessageType>;\n\t\t\t} else if (this.version === Version.DRAFT_15) {\n\t\t\t\tmessages = MessagesV15 as unknown as Record<number, MessageType>;\n\t\t\t} else if (this.version === Version.DRAFT_16) {\n\t\t\t\tmessages = MessagesV16 as unknown as Record<number, MessageType>;\n\t\t\t} else if (this.version === Version.DRAFT_17) {\n\t\t\t\tmessages = MessagesV17 as unknown as Record<number, MessageType>;\n\t\t\t} else {\n\t\t\t\tmessages = MessagesV18 as unknown as Record<number, MessageType>;\n\t\t\t}\n\n\t\t\tif (!(messageType in messages)) {\n\t\t\t\tthrow new Error(`Unknown control message type: ${messageType}`);\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst msgClass = messages[messageType];\n\t\t\t\tconst msg = await msgClass.decode(this.stream.reader, this.version);\n\t\t\t\treturn msg;\n\t\t\t} catch (err) {\n\t\t\t\tconsole.error(\"failed to decode message\", messageType, err);\n\t\t\t\tthrow err;\n\t\t\t}\n\t\t});\n\t}\n\n\tmaxRequestId(max: bigint): void {\n\t\tif (max <= this.#maxRequestId) {\n\t\t\tthrow new Error(\n\t\t\t\t`max request id must be greater than current max request id: max=${max} current=${this.#maxRequestId}`,\n\t\t\t);\n\t\t}\n\n\t\tthis.#maxRequestId = max;\n\t\tthis.#maxRequestIdUpdate?.resolve();\n\t\tthis.#maxRequestIdUpdate = Promise.withResolvers();\n\t}\n\n\tasync nextRequestId(): Promise<bigint | undefined> {\n\t\twhile (true) {\n\t\t\tconst id = this.#requestId;\n\n\t\t\t// d14-d16 use MAX_REQUEST_ID flow control; d17+ removed it.\n\t\t\tif (\n\t\t\t\tthis.version === Version.DRAFT_14 ||\n\t\t\t\tthis.version === Version.DRAFT_15 ||\n\t\t\t\tthis.version === Version.DRAFT_16\n\t\t\t) {\n\t\t\t\tif (id < this.#maxRequestId) {\n\t\t\t\t\tthis.#requestId += 2n;\n\t\t\t\t\treturn id;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tthis.#requestId += 2n;\n\t\t\t\treturn id;\n\t\t\t}\n\n\t\t\tif (!this.#maxRequestIdUpdate) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\n\t\t\tconsole.warn(\"blocked on max request id\");\n\t\t\tawait this.#maxRequestIdUpdate.promise;\n\t\t}\n\t}\n\n\tclose(): void {\n\t\tthis.#maxRequestIdUpdate?.resolve();\n\t\tthis.#maxRequestIdUpdate = undefined;\n\t}\n}\n"]}
@@ -0,0 +1,64 @@
1
+ import type * as Path from "../path";
2
+ import type { Reader, Writer } from "../stream";
3
+ import type { IetfVersion } from "./version";
4
+ export declare class Fetch {
5
+ #private;
6
+ static id: number;
7
+ requestId: bigint;
8
+ trackNamespace: Path.Valid;
9
+ trackName: string;
10
+ subscriberPriority: number;
11
+ groupOrder: number;
12
+ startGroup: bigint;
13
+ startObject: bigint;
14
+ endGroup: bigint;
15
+ endObject: bigint;
16
+ constructor({ requestId, trackNamespace, trackName, subscriberPriority, groupOrder, startGroup, startObject, endGroup, endObject, }: {
17
+ requestId: bigint;
18
+ trackNamespace: Path.Valid;
19
+ trackName: string;
20
+ subscriberPriority: number;
21
+ groupOrder: number;
22
+ startGroup: bigint;
23
+ startObject: bigint;
24
+ endGroup: bigint;
25
+ endObject: bigint;
26
+ });
27
+ encode(w: Writer, _version: IetfVersion): Promise<void>;
28
+ static decode(r: Reader, _version: IetfVersion): Promise<Fetch>;
29
+ }
30
+ export declare class FetchOk {
31
+ #private;
32
+ static id: number;
33
+ requestId: bigint | undefined;
34
+ constructor({ requestId }: {
35
+ requestId?: bigint;
36
+ });
37
+ encode(w: Writer, _version: IetfVersion): Promise<void>;
38
+ static decode(r: Reader, _version: IetfVersion): Promise<FetchOk>;
39
+ }
40
+ export declare class FetchError {
41
+ #private;
42
+ static id: number;
43
+ requestId: bigint;
44
+ errorCode: number;
45
+ reasonPhrase: string;
46
+ constructor({ requestId, errorCode, reasonPhrase, }: {
47
+ requestId: bigint;
48
+ errorCode: number;
49
+ reasonPhrase: string;
50
+ });
51
+ encode(w: Writer, _version: IetfVersion): Promise<void>;
52
+ static decode(r: Reader, _version: IetfVersion): Promise<FetchError>;
53
+ }
54
+ export declare class FetchCancel {
55
+ #private;
56
+ static id: number;
57
+ requestId: bigint;
58
+ constructor({ requestId }: {
59
+ requestId: bigint;
60
+ });
61
+ encode(w: Writer, _version: IetfVersion): Promise<void>;
62
+ static decode(r: Reader, _version: IetfVersion): Promise<FetchCancel>;
63
+ }
64
+ //# sourceMappingURL=fetch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetch.d.ts","sourceRoot":"","sources":["../../src/ietf/fetch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,IAAI,MAAM,YAAY,CAAC;AACxC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAEnD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEhD,qBAAa,KAAK;;IACjB,MAAM,CAAC,EAAE,SAAQ;IAEjB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAElB,YAAY,EACX,SAAS,EACT,cAAc,EACd,SAAS,EACT,kBAAkB,EAClB,UAAU,EACV,UAAU,EACV,WAAW,EACX,QAAQ,EACR,SAAS,GACT,EAAE;QACF,SAAS,EAAE,MAAM,CAAC;QAClB,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC;QAC3B,SAAS,EAAE,MAAM,CAAC;QAClB,kBAAkB,EAAE,MAAM,CAAC;QAC3B,UAAU,EAAE,MAAM,CAAC;QACnB,UAAU,EAAE,MAAM,CAAC;QACnB,WAAW,EAAE,MAAM,CAAC;QACpB,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,MAAM,CAAC;KAClB,EAUA;IAMK,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAE5D;IAED,OAAa,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,CAEpE;CAKD;AAED,qBAAa,OAAO;;IACnB,MAAM,CAAC,EAAE,SAAQ;IAEjB,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAE9B,YAAY,EAAE,SAAS,EAAE,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,EAEhD;IAMK,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAE5D;IAED,OAAa,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAEtE;CAKD;AAED,qBAAa,UAAU;;IACtB,MAAM,CAAC,EAAE,SAAQ;IAEjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IAErB,YAAY,EACX,SAAS,EACT,SAAS,EACT,YAAY,GACZ,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,EAIhE;IAMK,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAE5D;IAED,OAAa,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CAEzE;CAKD;AAGD,qBAAa,WAAW;;IACvB,MAAM,CAAC,EAAE,SAAQ;IAEjB,SAAS,EAAE,MAAM,CAAC;IAElB,YAAY,EAAE,SAAS,EAAE,EAAE;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,EAE/C;IAMK,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAE5D;IAED,OAAa,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CAE1E;CAKD"}
package/ietf/fetch.js ADDED
@@ -0,0 +1,100 @@
1
+ /* @ts-self-types="./fetch.d.ts" */
2
+ import * as Message from "./message.js";
3
+ export class Fetch {
4
+ static id = 0x16;
5
+ requestId;
6
+ trackNamespace;
7
+ trackName;
8
+ subscriberPriority;
9
+ groupOrder;
10
+ startGroup;
11
+ startObject;
12
+ endGroup;
13
+ endObject;
14
+ constructor({ requestId, trackNamespace, trackName, subscriberPriority, groupOrder, startGroup, startObject, endGroup, endObject, }) {
15
+ this.requestId = requestId;
16
+ this.trackNamespace = trackNamespace;
17
+ this.trackName = trackName;
18
+ this.subscriberPriority = subscriberPriority;
19
+ this.groupOrder = groupOrder;
20
+ this.startGroup = startGroup;
21
+ this.startObject = startObject;
22
+ this.endGroup = endGroup;
23
+ this.endObject = endObject;
24
+ }
25
+ async #encode(_w) {
26
+ throw new Error("FETCH messages are not supported");
27
+ }
28
+ async encode(w, _version) {
29
+ return Message.encode(w, this.#encode.bind(this));
30
+ }
31
+ static async decode(r, _version) {
32
+ return Message.decode(r, Fetch.#decode);
33
+ }
34
+ static async #decode(_r) {
35
+ throw new Error("FETCH messages are not supported");
36
+ }
37
+ }
38
+ export class FetchOk {
39
+ static id = 0x18;
40
+ requestId;
41
+ constructor({ requestId }) {
42
+ this.requestId = requestId;
43
+ }
44
+ async #encode(_w) {
45
+ throw new Error("FETCH_OK messages are not supported");
46
+ }
47
+ async encode(w, _version) {
48
+ return Message.encode(w, this.#encode.bind(this));
49
+ }
50
+ static async decode(r, _version) {
51
+ return Message.decode(r, FetchOk.#decode);
52
+ }
53
+ static async #decode(_r) {
54
+ throw new Error("FETCH_OK messages are not supported");
55
+ }
56
+ }
57
+ export class FetchError {
58
+ static id = 0x19;
59
+ requestId;
60
+ errorCode;
61
+ reasonPhrase;
62
+ constructor({ requestId, errorCode, reasonPhrase, }) {
63
+ this.requestId = requestId;
64
+ this.errorCode = errorCode;
65
+ this.reasonPhrase = reasonPhrase;
66
+ }
67
+ async #encode(_w) {
68
+ throw new Error("FETCH_ERROR messages are not supported");
69
+ }
70
+ async encode(w, _version) {
71
+ return Message.encode(w, this.#encode.bind(this));
72
+ }
73
+ static async decode(r, _version) {
74
+ return Message.decode(r, FetchError.#decode);
75
+ }
76
+ static async #decode(_r) {
77
+ throw new Error("FETCH_ERROR messages are not supported");
78
+ }
79
+ }
80
+ // Removed in d17
81
+ export class FetchCancel {
82
+ static id = 0x17;
83
+ requestId;
84
+ constructor({ requestId }) {
85
+ this.requestId = requestId;
86
+ }
87
+ async #encode(_w) {
88
+ throw new Error("FETCH_CANCEL messages are not supported");
89
+ }
90
+ async encode(w, _version) {
91
+ return Message.encode(w, this.#encode.bind(this));
92
+ }
93
+ static async decode(r, _version) {
94
+ return Message.decode(r, FetchCancel.#decode);
95
+ }
96
+ static async #decode(_r) {
97
+ throw new Error("FETCH_CANCEL messages are not supported");
98
+ }
99
+ }
100
+ //# sourceMappingURL=fetch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetch.js","sourceRoot":"","sources":["../../src/ietf/fetch.ts"],"names":[],"mappings":"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","sourcesContent":["import type * as Path from \"../path.ts\";\nimport type { Reader, Writer } from \"../stream.ts\";\nimport * as Message from \"./message.ts\";\nimport type { IetfVersion } from \"./version.ts\";\n\nexport class Fetch {\n\tstatic id = 0x16;\n\n\trequestId: bigint;\n\ttrackNamespace: Path.Valid;\n\ttrackName: string;\n\tsubscriberPriority: number;\n\tgroupOrder: number;\n\tstartGroup: bigint;\n\tstartObject: bigint;\n\tendGroup: bigint;\n\tendObject: bigint;\n\n\tconstructor({\n\t\trequestId,\n\t\ttrackNamespace,\n\t\ttrackName,\n\t\tsubscriberPriority,\n\t\tgroupOrder,\n\t\tstartGroup,\n\t\tstartObject,\n\t\tendGroup,\n\t\tendObject,\n\t}: {\n\t\trequestId: bigint;\n\t\ttrackNamespace: Path.Valid;\n\t\ttrackName: string;\n\t\tsubscriberPriority: number;\n\t\tgroupOrder: number;\n\t\tstartGroup: bigint;\n\t\tstartObject: bigint;\n\t\tendGroup: bigint;\n\t\tendObject: bigint;\n\t}) {\n\t\tthis.requestId = requestId;\n\t\tthis.trackNamespace = trackNamespace;\n\t\tthis.trackName = trackName;\n\t\tthis.subscriberPriority = subscriberPriority;\n\t\tthis.groupOrder = groupOrder;\n\t\tthis.startGroup = startGroup;\n\t\tthis.startObject = startObject;\n\t\tthis.endGroup = endGroup;\n\t\tthis.endObject = endObject;\n\t}\n\n\tasync #encode(_w: Writer): Promise<void> {\n\t\tthrow new Error(\"FETCH messages are not supported\");\n\t}\n\n\tasync encode(w: Writer, _version: IetfVersion): Promise<void> {\n\t\treturn Message.encode(w, this.#encode.bind(this));\n\t}\n\n\tstatic async decode(r: Reader, _version: IetfVersion): Promise<Fetch> {\n\t\treturn Message.decode(r, Fetch.#decode);\n\t}\n\n\tstatic async #decode(_r: Reader): Promise<Fetch> {\n\t\tthrow new Error(\"FETCH messages are not supported\");\n\t}\n}\n\nexport class FetchOk {\n\tstatic id = 0x18;\n\n\trequestId: bigint | undefined;\n\n\tconstructor({ requestId }: { requestId?: bigint }) {\n\t\tthis.requestId = requestId;\n\t}\n\n\tasync #encode(_w: Writer): Promise<void> {\n\t\tthrow new Error(\"FETCH_OK messages are not supported\");\n\t}\n\n\tasync encode(w: Writer, _version: IetfVersion): Promise<void> {\n\t\treturn Message.encode(w, this.#encode.bind(this));\n\t}\n\n\tstatic async decode(r: Reader, _version: IetfVersion): Promise<FetchOk> {\n\t\treturn Message.decode(r, FetchOk.#decode);\n\t}\n\n\tstatic async #decode(_r: Reader): Promise<FetchOk> {\n\t\tthrow new Error(\"FETCH_OK messages are not supported\");\n\t}\n}\n\nexport class FetchError {\n\tstatic id = 0x19;\n\n\trequestId: bigint;\n\terrorCode: number;\n\treasonPhrase: string;\n\n\tconstructor({\n\t\trequestId,\n\t\terrorCode,\n\t\treasonPhrase,\n\t}: { requestId: bigint; errorCode: number; reasonPhrase: string }) {\n\t\tthis.requestId = requestId;\n\t\tthis.errorCode = errorCode;\n\t\tthis.reasonPhrase = reasonPhrase;\n\t}\n\n\tasync #encode(_w: Writer): Promise<void> {\n\t\tthrow new Error(\"FETCH_ERROR messages are not supported\");\n\t}\n\n\tasync encode(w: Writer, _version: IetfVersion): Promise<void> {\n\t\treturn Message.encode(w, this.#encode.bind(this));\n\t}\n\n\tstatic async decode(r: Reader, _version: IetfVersion): Promise<FetchError> {\n\t\treturn Message.decode(r, FetchError.#decode);\n\t}\n\n\tstatic async #decode(_r: Reader): Promise<FetchError> {\n\t\tthrow new Error(\"FETCH_ERROR messages are not supported\");\n\t}\n}\n\n// Removed in d17\nexport class FetchCancel {\n\tstatic id = 0x17;\n\n\trequestId: bigint;\n\n\tconstructor({ requestId }: { requestId: bigint }) {\n\t\tthis.requestId = requestId;\n\t}\n\n\tasync #encode(_w: Writer): Promise<void> {\n\t\tthrow new Error(\"FETCH_CANCEL messages are not supported\");\n\t}\n\n\tasync encode(w: Writer, _version: IetfVersion): Promise<void> {\n\t\treturn Message.encode(w, this.#encode.bind(this));\n\t}\n\n\tstatic async decode(r: Reader, _version: IetfVersion): Promise<FetchCancel> {\n\t\treturn Message.decode(r, FetchCancel.#decode);\n\t}\n\n\tstatic async #decode(_r: Reader): Promise<FetchCancel> {\n\t\tthrow new Error(\"FETCH_CANCEL messages are not supported\");\n\t}\n}\n"]}
@@ -0,0 +1,15 @@
1
+ import type { Reader, Writer } from "../stream";
2
+ import { type IetfVersion } from "./version";
3
+ export declare class GoAway {
4
+ #private;
5
+ static id: number;
6
+ newSessionUri: string;
7
+ timeout: bigint;
8
+ constructor({ newSessionUri, timeout }: {
9
+ newSessionUri: string;
10
+ timeout?: bigint;
11
+ });
12
+ encode(w: Writer, version: IetfVersion): Promise<void>;
13
+ static decode(r: Reader, version: IetfVersion): Promise<GoAway>;
14
+ }
15
+ //# sourceMappingURL=goaway.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"goaway.d.ts","sourceRoot":"","sources":["../../src/ietf/goaway.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAEnD,OAAO,EAAE,KAAK,WAAW,EAAW,MAAM,cAAc,CAAC;AAEzD,qBAAa,MAAM;;IAClB,MAAM,CAAC,EAAE,SAAQ;IAEjB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAEhB,YAAY,EAAE,aAAa,EAAE,OAAY,EAAE,EAAE;QAAE,aAAa,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,EAGvF;IAUK,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAE3D;IAED,OAAa,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAEpE;CAWD"}
package/ietf/goaway.js ADDED
@@ -0,0 +1,34 @@
1
+ /* @ts-self-types="./goaway.d.ts" */
2
+ import * as Message from "./message.js";
3
+ import { Version } from "./version.js";
4
+ export class GoAway {
5
+ static id = 0x10;
6
+ newSessionUri;
7
+ timeout;
8
+ constructor({ newSessionUri, timeout = 0n }) {
9
+ this.newSessionUri = newSessionUri;
10
+ this.timeout = timeout;
11
+ }
12
+ async #encode(w, version) {
13
+ await w.string(this.newSessionUri);
14
+ if (version !== Version.DRAFT_14 && version !== Version.DRAFT_15 && version !== Version.DRAFT_16) {
15
+ await w.u62(this.timeout);
16
+ // Draft-18 adds an optional trailing Request ID (#1559). We never emit it.
17
+ }
18
+ }
19
+ async encode(w, version) {
20
+ return Message.encode(w, (mw) => this.#encode(mw, version));
21
+ }
22
+ static async decode(r, version) {
23
+ return Message.decode(r, (mr) => GoAway.#decode(mr, version));
24
+ }
25
+ static async #decode(r, version) {
26
+ const newSessionUri = await r.string();
27
+ const timeout = version === Version.DRAFT_14 || version === Version.DRAFT_15 || version === Version.DRAFT_16
28
+ ? 0n
29
+ : await r.u62();
30
+ // Draft-18 optional trailing Request ID (#1559) — read and discard if present.
31
+ return new GoAway({ newSessionUri, timeout });
32
+ }
33
+ }
34
+ //# sourceMappingURL=goaway.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"goaway.js","sourceRoot":"","sources":["../../src/ietf/goaway.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,OAAO,MAAM,cAAc,CAAC;AACxC,OAAO,EAAoB,OAAO,EAAE,MAAM,cAAc,CAAC;AAEzD,MAAM,OAAO,MAAM;IAClB,MAAM,CAAC,EAAE,GAAG,IAAI,CAAC;IAEjB,aAAa,CAAS;IACtB,OAAO,CAAS;IAEhB,YAAY,EAAE,aAAa,EAAE,OAAO,GAAG,EAAE,EAA+C;QACvF,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;QACnC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACxB,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,CAAS,EAAE,OAAoB;QAC5C,MAAM,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACnC,IAAI,OAAO,KAAK,OAAO,CAAC,QAAQ,IAAI,OAAO,KAAK,OAAO,CAAC,QAAQ,IAAI,OAAO,KAAK,OAAO,CAAC,QAAQ,EAAE,CAAC;YAClG,MAAM,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC1B,2EAA2E;QAC5E,CAAC;IACF,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,CAAS,EAAE,OAAoB;QAC3C,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC;IAC7D,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAS,EAAE,OAAoB;QAClD,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC;IAC/D,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAS,EAAE,OAAoB;QACnD,MAAM,aAAa,GAAG,MAAM,CAAC,CAAC,MAAM,EAAE,CAAC;QACvC,MAAM,OAAO,GACZ,OAAO,KAAK,OAAO,CAAC,QAAQ,IAAI,OAAO,KAAK,OAAO,CAAC,QAAQ,IAAI,OAAO,KAAK,OAAO,CAAC,QAAQ;YAC3F,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC;QAClB,+EAA+E;QAC/E,OAAO,IAAI,MAAM,CAAC,EAAE,aAAa,EAAE,OAAO,EAAE,CAAC,CAAC;IAC/C,CAAC;CACD","sourcesContent":["import type { Reader, Writer } from \"../stream.ts\";\nimport * as Message from \"./message.ts\";\nimport { type IetfVersion, Version } from \"./version.ts\";\n\nexport class GoAway {\n\tstatic id = 0x10;\n\n\tnewSessionUri: string;\n\ttimeout: bigint;\n\n\tconstructor({ newSessionUri, timeout = 0n }: { newSessionUri: string; timeout?: bigint }) {\n\t\tthis.newSessionUri = newSessionUri;\n\t\tthis.timeout = timeout;\n\t}\n\n\tasync #encode(w: Writer, version: IetfVersion): Promise<void> {\n\t\tawait w.string(this.newSessionUri);\n\t\tif (version !== Version.DRAFT_14 && version !== Version.DRAFT_15 && version !== Version.DRAFT_16) {\n\t\t\tawait w.u62(this.timeout);\n\t\t\t// Draft-18 adds an optional trailing Request ID (#1559). We never emit it.\n\t\t}\n\t}\n\n\tasync encode(w: Writer, version: IetfVersion): Promise<void> {\n\t\treturn Message.encode(w, (mw) => this.#encode(mw, version));\n\t}\n\n\tstatic async decode(r: Reader, version: IetfVersion): Promise<GoAway> {\n\t\treturn Message.decode(r, (mr) => GoAway.#decode(mr, version));\n\t}\n\n\tstatic async #decode(r: Reader, version: IetfVersion): Promise<GoAway> {\n\t\tconst newSessionUri = await r.string();\n\t\tconst timeout =\n\t\t\tversion === Version.DRAFT_14 || version === Version.DRAFT_15 || version === Version.DRAFT_16\n\t\t\t\t? 0n\n\t\t\t\t: await r.u62();\n\t\t// Draft-18 optional trailing Request ID (#1559) — read and discard if present.\n\t\treturn new GoAway({ newSessionUri, timeout });\n\t}\n}\n"]}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=ietf.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ietf.test.d.ts","sourceRoot":"","sources":["../../src/ietf/ietf.test.ts"],"names":[],"mappings":""}