@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.
- package/README.md +70 -0
- package/announced.d.ts +45 -0
- package/announced.d.ts.map +1 -0
- package/announced.js +70 -0
- package/announced.js.map +1 -0
- package/bandwidth.d.ts +11 -0
- package/bandwidth.d.ts.map +1 -0
- package/bandwidth.js +7 -0
- package/bandwidth.js.map +1 -0
- package/broadcast.d.ts +39 -0
- package/broadcast.d.ts.map +1 -0
- package/broadcast.js +76 -0
- package/broadcast.js.map +1 -0
- package/connection/accept.d.ts +15 -0
- package/connection/accept.d.ts.map +1 -0
- package/connection/accept.js +137 -0
- package/connection/accept.js.map +1 -0
- package/connection/cert.test.d.ts +2 -0
- package/connection/cert.test.d.ts.map +1 -0
- package/connection/cert.test.js +26 -0
- package/connection/cert.test.js.map +1 -0
- package/connection/connect.d.ts +37 -0
- package/connection/connect.d.ts.map +1 -0
- package/connection/connect.js +348 -0
- package/connection/connect.js.map +1 -0
- package/connection/established.d.ts +30 -0
- package/connection/established.d.ts.map +1 -0
- package/connection/established.js +3 -0
- package/connection/established.js.map +1 -0
- package/connection/handshake.d.ts +10 -0
- package/connection/handshake.d.ts.map +1 -0
- package/connection/handshake.js +48 -0
- package/connection/handshake.js.map +1 -0
- package/connection/index.d.ts +5 -0
- package/connection/index.d.ts.map +1 -0
- package/connection/index.js +6 -0
- package/connection/index.js.map +1 -0
- package/connection/reload.d.ts +47 -0
- package/connection/reload.d.ts.map +1 -0
- package/connection/reload.js +137 -0
- package/connection/reload.js.map +1 -0
- package/group.d.ts +66 -0
- package/group.d.ts.map +1 -0
- package/group.js +135 -0
- package/group.js.map +1 -0
- package/group.test.d.ts +2 -0
- package/group.test.d.ts.map +1 -0
- package/group.test.js +66 -0
- package/group.test.js.map +1 -0
- package/ietf/adapter.d.ts +65 -0
- package/ietf/adapter.d.ts.map +1 -0
- package/ietf/adapter.js +626 -0
- package/ietf/adapter.js.map +1 -0
- package/ietf/connection.d.ts +65 -0
- package/ietf/connection.d.ts.map +1 -0
- package/ietf/connection.js +248 -0
- package/ietf/connection.js.map +1 -0
- package/ietf/control.d.ts +135 -0
- package/ietf/control.d.ts.map +1 -0
- package/ietf/control.js +242 -0
- package/ietf/control.js.map +1 -0
- package/ietf/fetch.d.ts +64 -0
- package/ietf/fetch.d.ts.map +1 -0
- package/ietf/fetch.js +100 -0
- package/ietf/fetch.js.map +1 -0
- package/ietf/goaway.d.ts +15 -0
- package/ietf/goaway.d.ts.map +1 -0
- package/ietf/goaway.js +34 -0
- package/ietf/goaway.js.map +1 -0
- package/ietf/ietf.test.d.ts +2 -0
- package/ietf/ietf.test.d.ts.map +1 -0
- package/ietf/ietf.test.js +873 -0
- package/ietf/ietf.test.js.map +1 -0
- package/ietf/index.d.ts +18 -0
- package/ietf/index.d.ts.map +1 -0
- package/ietf/index.js +19 -0
- package/ietf/index.js.map +1 -0
- package/ietf/message.d.ts +4 -0
- package/ietf/message.d.ts.map +1 -0
- package/ietf/message.js +54 -0
- package/ietf/message.js.map +1 -0
- package/ietf/namespace.d.ts +5 -0
- package/ietf/namespace.d.ts.map +1 -0
- package/ietf/namespace.js +27 -0
- package/ietf/namespace.js.map +1 -0
- package/ietf/object.d.ts +40 -0
- package/ietf/object.d.ts.map +1 -0
- package/ietf/object.js +160 -0
- package/ietf/object.js.map +1 -0
- package/ietf/parameters.d.ts +56 -0
- package/ietf/parameters.d.ts.map +1 -0
- package/ietf/parameters.js +337 -0
- package/ietf/parameters.js.map +1 -0
- package/ietf/properties.d.ts +4 -0
- package/ietf/properties.d.ts.map +1 -0
- package/ietf/properties.js +33 -0
- package/ietf/properties.js.map +1 -0
- package/ietf/publish.d.ts +68 -0
- package/ietf/publish.d.ts.map +1 -0
- package/ietf/publish.js +192 -0
- package/ietf/publish.js.map +1 -0
- package/ietf/publish_namespace.d.ts +68 -0
- package/ietf/publish_namespace.d.ts.map +1 -0
- package/ietf/publish_namespace.js +176 -0
- package/ietf/publish_namespace.js.map +1 -0
- package/ietf/publisher.d.ts +50 -0
- package/ietf/publisher.d.ts.map +1 -0
- package/ietf/publisher.js +330 -0
- package/ietf/publisher.js.map +1 -0
- package/ietf/request.d.ts +52 -0
- package/ietf/request.d.ts.map +1 -0
- package/ietf/request.js +119 -0
- package/ietf/request.js.map +1 -0
- package/ietf/setup.d.ts +38 -0
- package/ietf/setup.d.ts.map +1 -0
- package/ietf/setup.js +129 -0
- package/ietf/setup.js.map +1 -0
- package/ietf/subscribe.d.ts +66 -0
- package/ietf/subscribe.d.ts.map +1 -0
- package/ietf/subscribe.js +276 -0
- package/ietf/subscribe.js.map +1 -0
- package/ietf/subscribe_namespace.d.ts +101 -0
- package/ietf/subscribe_namespace.d.ts.map +1 -0
- package/ietf/subscribe_namespace.js +256 -0
- package/ietf/subscribe_namespace.js.map +1 -0
- package/ietf/subscriber.d.ts +53 -0
- package/ietf/subscriber.d.ts.map +1 -0
- package/ietf/subscriber.js +404 -0
- package/ietf/subscriber.js.map +1 -0
- package/ietf/track.d.ts +40 -0
- package/ietf/track.d.ts.map +1 -0
- package/ietf/track.js +108 -0
- package/ietf/track.js.map +1 -0
- package/ietf/version.d.ts +56 -0
- package/ietf/version.d.ts.map +1 -0
- package/ietf/version.js +63 -0
- package/ietf/version.js.map +1 -0
- package/index.d.ts +22 -0
- package/index.d.ts.map +1 -0
- package/index.js +23 -0
- package/index.js.map +1 -0
- package/integration.test.d.ts +2 -0
- package/integration.test.d.ts.map +1 -0
- package/integration.test.js +90 -0
- package/integration.test.js.map +1 -0
- package/lite/announce.d.ts +35 -0
- package/lite/announce.d.ts.map +1 -0
- package/lite/announce.js +166 -0
- package/lite/announce.js.map +1 -0
- package/lite/connection.d.ts +47 -0
- package/lite/connection.d.ts.map +1 -0
- package/lite/connection.js +247 -0
- package/lite/connection.js.map +1 -0
- package/lite/fetch.d.ts +14 -0
- package/lite/fetch.d.ts.map +1 -0
- package/lite/fetch.js +47 -0
- package/lite/fetch.js.map +1 -0
- package/lite/goaway.d.ts +10 -0
- package/lite/goaway.d.ts.map +1 -0
- package/lite/goaway.js +37 -0
- package/lite/goaway.js.map +1 -0
- package/lite/group.d.ts +18 -0
- package/lite/group.d.ts.map +1 -0
- package/lite/group.js +46 -0
- package/lite/group.js.map +1 -0
- package/lite/index.d.ts +11 -0
- package/lite/index.d.ts.map +1 -0
- package/lite/index.js +12 -0
- package/lite/index.js.map +1 -0
- package/lite/message.d.ts +5 -0
- package/lite/message.d.ts.map +1 -0
- package/lite/message.js +51 -0
- package/lite/message.js.map +1 -0
- package/lite/origin.d.ts +25 -0
- package/lite/origin.d.ts.map +1 -0
- package/lite/origin.js +35 -0
- package/lite/origin.js.map +1 -0
- package/lite/probe.d.ts +12 -0
- package/lite/probe.d.ts.map +1 -0
- package/lite/probe.js +60 -0
- package/lite/probe.js.map +1 -0
- package/lite/publisher.d.ts +63 -0
- package/lite/publisher.d.ts.map +1 -0
- package/lite/publisher.js +350 -0
- package/lite/publisher.js.map +1 -0
- package/lite/session.d.ts +36 -0
- package/lite/session.d.ts.map +1 -0
- package/lite/session.js +130 -0
- package/lite/session.js.map +1 -0
- package/lite/setup.d.ts +18 -0
- package/lite/setup.d.ts.map +1 -0
- package/lite/setup.js +55 -0
- package/lite/setup.js.map +1 -0
- package/lite/stream.d.ts +23 -0
- package/lite/stream.d.ts.map +1 -0
- package/lite/stream.js +20 -0
- package/lite/stream.js.map +1 -0
- package/lite/subscribe.d.ts +111 -0
- package/lite/subscribe.d.ts.map +1 -0
- package/lite/subscribe.js +341 -0
- package/lite/subscribe.js.map +1 -0
- package/lite/subscriber.d.ts +80 -0
- package/lite/subscriber.d.ts.map +1 -0
- package/lite/subscriber.js +316 -0
- package/lite/subscriber.js.map +1 -0
- package/lite/track.d.ts +38 -0
- package/lite/track.d.ts.map +1 -0
- package/lite/track.js +81 -0
- package/lite/track.js.map +1 -0
- package/lite/track.test.d.ts +2 -0
- package/lite/track.test.d.ts.map +1 -0
- package/lite/track.test.js +53 -0
- package/lite/track.test.js.map +1 -0
- package/lite/version.d.ts +16 -0
- package/lite/version.d.ts.map +1 -0
- package/lite/version.js +41 -0
- package/lite/version.js.map +1 -0
- package/mock.d.ts +16 -0
- package/mock.d.ts.map +1 -0
- package/mock.js +154 -0
- package/mock.js.map +1 -0
- package/package.json +27 -0
- package/path.d.ts +111 -0
- package/path.d.ts.map +1 -0
- package/path.js +133 -0
- package/path.js.map +1 -0
- package/path.test.d.ts +2 -0
- package/path.test.d.ts.map +1 -0
- package/path.test.js +169 -0
- package/path.test.js.map +1 -0
- package/stream.d.ts +57 -0
- package/stream.d.ts.map +1 -0
- package/stream.js +326 -0
- package/stream.js.map +1 -0
- package/stream.test.d.ts +2 -0
- package/stream.test.d.ts.map +1 -0
- package/stream.test.js +210 -0
- package/stream.test.js.map +1 -0
- package/time.d.ts +109 -0
- package/time.d.ts.map +1 -0
- package/time.js +94 -0
- package/time.js.map +1 -0
- package/track.d.ts +85 -0
- package/track.d.ts.map +1 -0
- package/track.js +227 -0
- package/track.js.map +1 -0
- package/track.test.d.ts +2 -0
- package/track.test.d.ts.map +1 -0
- package/track.test.js +56 -0
- package/track.test.js.map +1 -0
- package/util/error.d.ts +3 -0
- package/util/error.d.ts.map +1 -0
- package/util/error.js +9 -0
- package/util/error.js.map +1 -0
- package/util/hex.d.ts +3 -0
- package/util/hex.d.ts.map +1 -0
- package/util/hex.js +16 -0
- package/util/hex.js.map +1 -0
- package/util/index.d.ts +2 -0
- package/util/index.d.ts.map +1 -0
- package/util/index.js +3 -0
- package/util/index.js.map +1 -0
- package/varint.d.ts +36 -0
- package/varint.d.ts.map +1 -0
- package/varint.js +288 -0
- package/varint.js.map +1 -0
- package/varint.test.d.ts +2 -0
- package/varint.test.d.ts.map +1 -0
- package/varint.test.js +106 -0
- package/varint.test.js.map +1 -0
- package/zod.d.ts +13 -0
- package/zod.d.ts.map +1 -0
- package/zod.js +19 -0
- package/zod.js.map +1 -0
|
@@ -0,0 +1,330 @@
|
|
|
1
|
+
/* @ts-self-types="./publisher.d.ts" */
|
|
2
|
+
import { Announced } from "../announced.js";
|
|
3
|
+
import * as Path from "../path.js";
|
|
4
|
+
import { Writer } from "../stream.js";
|
|
5
|
+
import { error } from "../util/error.js";
|
|
6
|
+
import { Frame, Group as GroupMessage } from "./object.js";
|
|
7
|
+
import { PublishDone } from "./publish.js";
|
|
8
|
+
import { PublishNamespace, PublishNamespaceDone, PublishNamespaceOk } from "./publish_namespace.js";
|
|
9
|
+
import { RequestError, RequestOk } from "./request.js";
|
|
10
|
+
import { SubscribeError, SubscribeOk } from "./subscribe.js";
|
|
11
|
+
import { SubscribeNamespaceEntry, SubscribeNamespaceEntryDone, SubscribeNamespaceOk, } from "./subscribe_namespace.js";
|
|
12
|
+
import { TrackStatus } from "./track.js";
|
|
13
|
+
import { Version } from "./version.js";
|
|
14
|
+
/**
|
|
15
|
+
* Handles publishing broadcasts using moq-transport protocol.
|
|
16
|
+
* Uses the stream-per-request pattern (real bidi streams for v17, virtual for v14-v16).
|
|
17
|
+
*
|
|
18
|
+
* @internal
|
|
19
|
+
*/
|
|
20
|
+
export class Publisher {
|
|
21
|
+
#quic;
|
|
22
|
+
#session;
|
|
23
|
+
// Our published broadcasts.
|
|
24
|
+
#broadcasts = new Map();
|
|
25
|
+
// Any consumers that want each new announcement.
|
|
26
|
+
#announcedConsumers = new Set();
|
|
27
|
+
/**
|
|
28
|
+
* Creates a new Publisher instance.
|
|
29
|
+
* @param quic - The WebTransport session (for uni streams)
|
|
30
|
+
* @param session - The session abstraction for bidi streams and request IDs
|
|
31
|
+
*
|
|
32
|
+
* @internal
|
|
33
|
+
*/
|
|
34
|
+
constructor(quic, session) {
|
|
35
|
+
this.#quic = quic;
|
|
36
|
+
this.#session = session;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Publishes a broadcast with any associated tracks.
|
|
40
|
+
* Opens a bidi stream to send PublishNamespace and waits for response.
|
|
41
|
+
*/
|
|
42
|
+
publish(path, broadcast) {
|
|
43
|
+
this.#broadcasts.set(path, broadcast);
|
|
44
|
+
this.#notifyConsumers(path, true);
|
|
45
|
+
void this.#runPublish(path, broadcast);
|
|
46
|
+
}
|
|
47
|
+
async #runPublish(path, broadcast) {
|
|
48
|
+
try {
|
|
49
|
+
const requestId = await this.#session.nextRequestId();
|
|
50
|
+
if (requestId === undefined)
|
|
51
|
+
return;
|
|
52
|
+
const stream = await this.#session.openBi();
|
|
53
|
+
try {
|
|
54
|
+
// Write PublishNamespace
|
|
55
|
+
await stream.writer.u53(PublishNamespace.id);
|
|
56
|
+
const msg = new PublishNamespace({ requestId, trackNamespace: path });
|
|
57
|
+
await msg.encode(stream.writer, this.#session.version);
|
|
58
|
+
// Read response (RequestOk and PublishNamespaceOk share 0x07)
|
|
59
|
+
const respTypeId = await stream.reader.u53();
|
|
60
|
+
if (respTypeId === RequestOk.id) {
|
|
61
|
+
// Draft-14 sends PublishNamespaceOk (requestId only, no parameters)
|
|
62
|
+
if (this.#session.version === Version.DRAFT_14) {
|
|
63
|
+
await PublishNamespaceOk.decode(stream.reader, this.#session.version);
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
await RequestOk.decode(stream.reader, this.#session.version);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
throw new Error(`PublishNamespace rejected: typeId=0x${respTypeId.toString(16)}`);
|
|
71
|
+
}
|
|
72
|
+
// Wait for broadcast to close or stream to close (peer cancelled)
|
|
73
|
+
await Promise.race([broadcast.closed, stream.reader.closed]);
|
|
74
|
+
// For v14-v16: send explicit PublishNamespaceDone (removed in v17+)
|
|
75
|
+
if (this.#session.version === Version.DRAFT_14 ||
|
|
76
|
+
this.#session.version === Version.DRAFT_15 ||
|
|
77
|
+
this.#session.version === Version.DRAFT_16) {
|
|
78
|
+
try {
|
|
79
|
+
await stream.writer.u53(PublishNamespaceDone.id);
|
|
80
|
+
const done = new PublishNamespaceDone({ trackNamespace: path, requestId });
|
|
81
|
+
await done.encode(stream.writer, this.#session.version);
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
// Stream might already be closed
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
stream.close();
|
|
88
|
+
}
|
|
89
|
+
catch (err) {
|
|
90
|
+
stream.abort(error(err));
|
|
91
|
+
throw err;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
catch (err) {
|
|
95
|
+
const e = error(err);
|
|
96
|
+
console.warn(`announce failed: broadcast=${path} error=${e.message}`);
|
|
97
|
+
}
|
|
98
|
+
finally {
|
|
99
|
+
broadcast.close();
|
|
100
|
+
this.#broadcasts.delete(path);
|
|
101
|
+
this.#notifyConsumers(path, false);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Handles an incoming SUBSCRIBE request on a bidi stream.
|
|
106
|
+
* Owns the full lifecycle: sends response, serves track data, waits for close.
|
|
107
|
+
*
|
|
108
|
+
* @internal
|
|
109
|
+
*/
|
|
110
|
+
async runSubscribe(msg, stream) {
|
|
111
|
+
const version = this.#session.version;
|
|
112
|
+
const name = msg.trackNamespace;
|
|
113
|
+
const broadcast = this.#broadcasts.get(name);
|
|
114
|
+
if (!broadcast) {
|
|
115
|
+
// Write error response
|
|
116
|
+
if (version === Version.DRAFT_14) {
|
|
117
|
+
await stream.writer.u53(SubscribeError.id);
|
|
118
|
+
const err = new SubscribeError({
|
|
119
|
+
requestId: msg.requestId,
|
|
120
|
+
errorCode: 404,
|
|
121
|
+
reasonPhrase: "Broadcast not found",
|
|
122
|
+
});
|
|
123
|
+
await err.encode(stream.writer, version);
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
await stream.writer.u53(RequestError.id);
|
|
127
|
+
const err = new RequestError({
|
|
128
|
+
requestId: version === Version.DRAFT_15 || version === Version.DRAFT_16 ? msg.requestId : undefined,
|
|
129
|
+
errorCode: 404,
|
|
130
|
+
reasonPhrase: "Broadcast not found",
|
|
131
|
+
});
|
|
132
|
+
await err.encode(stream.writer, version);
|
|
133
|
+
}
|
|
134
|
+
stream.close();
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
const track = broadcast.subscribe(msg.trackName, msg.subscriberPriority);
|
|
138
|
+
try {
|
|
139
|
+
// Send SUBSCRIBE_OK
|
|
140
|
+
await stream.writer.u53(SubscribeOk.id);
|
|
141
|
+
const ok = new SubscribeOk({
|
|
142
|
+
requestId: version === Version.DRAFT_14 || version === Version.DRAFT_15 || version === Version.DRAFT_16
|
|
143
|
+
? msg.requestId
|
|
144
|
+
: undefined,
|
|
145
|
+
trackAlias: msg.requestId,
|
|
146
|
+
});
|
|
147
|
+
await ok.encode(stream.writer, version);
|
|
148
|
+
console.debug(`publish ok: broadcast=${name} track=${track.name}`);
|
|
149
|
+
// Serve track groups, racing with stream close (= Unsubscribe)
|
|
150
|
+
const serving = (async () => {
|
|
151
|
+
for (;;) {
|
|
152
|
+
const group = await track.recvGroup();
|
|
153
|
+
if (!group)
|
|
154
|
+
return;
|
|
155
|
+
void this.#runGroup(msg.requestId, group);
|
|
156
|
+
}
|
|
157
|
+
})();
|
|
158
|
+
await Promise.race([serving, stream.reader.closed]);
|
|
159
|
+
console.debug(`publish done: broadcast=${name} track=${track.name}`);
|
|
160
|
+
// v14-v16: send PublishDone before closing
|
|
161
|
+
if (version === Version.DRAFT_14 || version === Version.DRAFT_15 || version === Version.DRAFT_16) {
|
|
162
|
+
try {
|
|
163
|
+
await stream.writer.u53(PublishDone.id);
|
|
164
|
+
const done = new PublishDone({
|
|
165
|
+
requestId: msg.requestId,
|
|
166
|
+
statusCode: 200,
|
|
167
|
+
reasonPhrase: "OK",
|
|
168
|
+
});
|
|
169
|
+
await done.encode(stream.writer, version);
|
|
170
|
+
}
|
|
171
|
+
catch {
|
|
172
|
+
// Stream might already be closed by peer
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
stream.close();
|
|
176
|
+
}
|
|
177
|
+
catch (err) {
|
|
178
|
+
const e = error(err);
|
|
179
|
+
console.warn(`publish error: broadcast=${name} track=${track.name} error=${e.message}`);
|
|
180
|
+
stream.abort(e);
|
|
181
|
+
}
|
|
182
|
+
finally {
|
|
183
|
+
track.close();
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Runs a group and sends its frames using ObjectStream (Subgroup delivery mode).
|
|
188
|
+
*/
|
|
189
|
+
async #runGroup(requestId, group) {
|
|
190
|
+
try {
|
|
191
|
+
const stream = await Writer.open(this.#quic, this.#session.version);
|
|
192
|
+
const header = new GroupMessage({
|
|
193
|
+
trackAlias: requestId,
|
|
194
|
+
groupId: group.sequence,
|
|
195
|
+
subGroupId: 0,
|
|
196
|
+
publisherPriority: 0,
|
|
197
|
+
flags: {
|
|
198
|
+
hasExtensions: false,
|
|
199
|
+
hasSubgroup: false,
|
|
200
|
+
hasSubgroupObject: false,
|
|
201
|
+
hasEnd: true,
|
|
202
|
+
hasPriority: true,
|
|
203
|
+
},
|
|
204
|
+
});
|
|
205
|
+
await header.encode(stream, this.#session.version);
|
|
206
|
+
try {
|
|
207
|
+
for (;;) {
|
|
208
|
+
const frame = await Promise.race([group.readFrame(), stream.closed]);
|
|
209
|
+
if (!frame)
|
|
210
|
+
break;
|
|
211
|
+
const obj = new Frame({ payload: frame });
|
|
212
|
+
await obj.encode(stream, header.flags);
|
|
213
|
+
}
|
|
214
|
+
stream.close();
|
|
215
|
+
}
|
|
216
|
+
catch (err) {
|
|
217
|
+
stream.reset(error(err));
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
finally {
|
|
221
|
+
group.close();
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Handles an incoming SUBSCRIBE_NAMESPACE on a bidi stream.
|
|
226
|
+
* Sends RequestOk, then streams Namespace/NamespaceDone entries.
|
|
227
|
+
*
|
|
228
|
+
* @internal
|
|
229
|
+
*/
|
|
230
|
+
async runSubscribeNamespace(msg, stream) {
|
|
231
|
+
const version = this.#session.version;
|
|
232
|
+
const prefix = msg.namespace;
|
|
233
|
+
try {
|
|
234
|
+
// Send OK response
|
|
235
|
+
if (version === Version.DRAFT_14) {
|
|
236
|
+
await stream.writer.u53(SubscribeNamespaceOk.id);
|
|
237
|
+
const ok = new SubscribeNamespaceOk({ requestId: msg.requestId });
|
|
238
|
+
await ok.encode(stream.writer, version);
|
|
239
|
+
}
|
|
240
|
+
else {
|
|
241
|
+
await stream.writer.u53(RequestOk.id);
|
|
242
|
+
const ok = new RequestOk({
|
|
243
|
+
requestId: version === Version.DRAFT_15 || version === Version.DRAFT_16 ? msg.requestId : undefined,
|
|
244
|
+
});
|
|
245
|
+
await ok.encode(stream.writer, version);
|
|
246
|
+
}
|
|
247
|
+
// Create an Announced consumer and seed it with current broadcasts
|
|
248
|
+
const announced = new Announced(prefix);
|
|
249
|
+
for (const name of this.#broadcasts.keys()) {
|
|
250
|
+
const suffix = Path.stripPrefix(prefix, name);
|
|
251
|
+
if (suffix === null)
|
|
252
|
+
continue;
|
|
253
|
+
announced.append({ path: suffix, active: true });
|
|
254
|
+
}
|
|
255
|
+
this.#announcedConsumers.add(announced);
|
|
256
|
+
// Close the consumer when the stream closes
|
|
257
|
+
stream.reader.closed.then(() => announced.close(), () => announced.close());
|
|
258
|
+
try {
|
|
259
|
+
for (;;) {
|
|
260
|
+
const entry = await announced.next();
|
|
261
|
+
if (!entry)
|
|
262
|
+
break;
|
|
263
|
+
if (entry.active) {
|
|
264
|
+
await stream.writer.u53(SubscribeNamespaceEntry.id);
|
|
265
|
+
const e = new SubscribeNamespaceEntry({ suffix: entry.path });
|
|
266
|
+
await e.encode(stream.writer, version);
|
|
267
|
+
}
|
|
268
|
+
else {
|
|
269
|
+
await stream.writer.u53(SubscribeNamespaceEntryDone.id);
|
|
270
|
+
const e = new SubscribeNamespaceEntryDone({ suffix: entry.path });
|
|
271
|
+
await e.encode(stream.writer, version);
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
finally {
|
|
276
|
+
announced.close();
|
|
277
|
+
this.#announcedConsumers.delete(announced);
|
|
278
|
+
}
|
|
279
|
+
stream.close();
|
|
280
|
+
}
|
|
281
|
+
catch (err) {
|
|
282
|
+
const e = error(err);
|
|
283
|
+
console.debug(`subscribe_namespace stream error: ${e.message}`);
|
|
284
|
+
stream.abort(e);
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
/**
|
|
288
|
+
* Handles an incoming TRACK_STATUS_REQUEST on a bidi stream.
|
|
289
|
+
*
|
|
290
|
+
* @internal
|
|
291
|
+
*/
|
|
292
|
+
async runTrackStatusRequest(msg, stream) {
|
|
293
|
+
const version = this.#session.version;
|
|
294
|
+
if (version === Version.DRAFT_14) {
|
|
295
|
+
// v14: respond with TrackStatus (0x0E = TRACK_STATUS_OK)
|
|
296
|
+
await stream.writer.u53(TrackStatus.id);
|
|
297
|
+
const status = new TrackStatus({
|
|
298
|
+
trackNamespace: msg.trackNamespace,
|
|
299
|
+
trackName: msg.trackName,
|
|
300
|
+
statusCode: TrackStatus.STATUS_NOT_FOUND,
|
|
301
|
+
lastGroupId: 0n,
|
|
302
|
+
lastObjectId: 0n,
|
|
303
|
+
});
|
|
304
|
+
await status.encode(stream.writer, version);
|
|
305
|
+
}
|
|
306
|
+
else {
|
|
307
|
+
// v15+: respond with RequestOk (0x07)
|
|
308
|
+
await stream.writer.u53(RequestOk.id);
|
|
309
|
+
const ok = new RequestOk({
|
|
310
|
+
requestId: version === Version.DRAFT_15 || version === Version.DRAFT_16 ? msg.requestId : undefined,
|
|
311
|
+
});
|
|
312
|
+
await ok.encode(stream.writer, version);
|
|
313
|
+
}
|
|
314
|
+
stream.close();
|
|
315
|
+
}
|
|
316
|
+
#notifyConsumers(path, active) {
|
|
317
|
+
for (const consumer of this.#announcedConsumers) {
|
|
318
|
+
const suffix = Path.stripPrefix(consumer.prefix, path);
|
|
319
|
+
if (suffix === null)
|
|
320
|
+
continue;
|
|
321
|
+
try {
|
|
322
|
+
consumer.append({ path: suffix, active });
|
|
323
|
+
}
|
|
324
|
+
catch {
|
|
325
|
+
// Consumer already closed, will be cleaned up
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
//# sourceMappingURL=publisher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"publisher.js","sourceRoot":"","sources":["../../src/ietf/publisher.ts"],"names":[],"mappings":"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","sourcesContent":["import { Announced } from \"../announced.ts\";\nimport type { Broadcast } from \"../broadcast.ts\";\nimport type { Group } from \"../group.ts\";\nimport * as Path from \"../path.ts\";\nimport { type Stream, Writer } from \"../stream.ts\";\nimport { error } from \"../util/error.ts\";\nimport type { Session } from \"./adapter.ts\";\nimport { Frame, Group as GroupMessage } from \"./object.ts\";\nimport { PublishDone } from \"./publish.ts\";\nimport { PublishNamespace, PublishNamespaceDone, PublishNamespaceOk } from \"./publish_namespace.ts\";\nimport { RequestError, RequestOk } from \"./request.ts\";\nimport { type Subscribe, SubscribeError, SubscribeOk } from \"./subscribe.ts\";\nimport {\n\ttype SubscribeNamespace,\n\tSubscribeNamespaceEntry,\n\tSubscribeNamespaceEntryDone,\n\tSubscribeNamespaceOk,\n} from \"./subscribe_namespace.ts\";\nimport { TrackStatus, type TrackStatusRequest } from \"./track.ts\";\nimport { Version } from \"./version.ts\";\n\n/**\n * Handles publishing broadcasts using moq-transport protocol.\n * Uses the stream-per-request pattern (real bidi streams for v17, virtual for v14-v16).\n *\n * @internal\n */\nexport class Publisher {\n\t#quic: WebTransport;\n\t#session: Session;\n\n\t// Our published broadcasts.\n\t#broadcasts: Map<Path.Valid, Broadcast> = new Map();\n\n\t// Any consumers that want each new announcement.\n\t#announcedConsumers = new Set<Announced>();\n\n\t/**\n\t * Creates a new Publisher instance.\n\t * @param quic - The WebTransport session (for uni streams)\n\t * @param session - The session abstraction for bidi streams and request IDs\n\t *\n\t * @internal\n\t */\n\tconstructor(quic: WebTransport, session: Session) {\n\t\tthis.#quic = quic;\n\t\tthis.#session = session;\n\t}\n\n\t/**\n\t * Publishes a broadcast with any associated tracks.\n\t * Opens a bidi stream to send PublishNamespace and waits for response.\n\t */\n\tpublish(path: Path.Valid, broadcast: Broadcast) {\n\t\tthis.#broadcasts.set(path, broadcast);\n\t\tthis.#notifyConsumers(path, true);\n\t\tvoid this.#runPublish(path, broadcast);\n\t}\n\n\tasync #runPublish(path: Path.Valid, broadcast: Broadcast) {\n\t\ttry {\n\t\t\tconst requestId = await this.#session.nextRequestId();\n\t\t\tif (requestId === undefined) return;\n\n\t\t\tconst stream = await this.#session.openBi();\n\n\t\t\ttry {\n\t\t\t\t// Write PublishNamespace\n\t\t\t\tawait stream.writer.u53(PublishNamespace.id);\n\t\t\t\tconst msg = new PublishNamespace({ requestId, trackNamespace: path });\n\t\t\t\tawait msg.encode(stream.writer, this.#session.version);\n\n\t\t\t\t// Read response (RequestOk and PublishNamespaceOk share 0x07)\n\t\t\t\tconst respTypeId = await stream.reader.u53();\n\t\t\t\tif (respTypeId === RequestOk.id) {\n\t\t\t\t\t// Draft-14 sends PublishNamespaceOk (requestId only, no parameters)\n\t\t\t\t\tif (this.#session.version === Version.DRAFT_14) {\n\t\t\t\t\t\tawait PublishNamespaceOk.decode(stream.reader, this.#session.version);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tawait RequestOk.decode(stream.reader, this.#session.version);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tthrow new Error(`PublishNamespace rejected: typeId=0x${respTypeId.toString(16)}`);\n\t\t\t\t}\n\n\t\t\t\t// Wait for broadcast to close or stream to close (peer cancelled)\n\t\t\t\tawait Promise.race([broadcast.closed, stream.reader.closed]);\n\n\t\t\t\t// For v14-v16: send explicit PublishNamespaceDone (removed in v17+)\n\t\t\t\tif (\n\t\t\t\t\tthis.#session.version === Version.DRAFT_14 ||\n\t\t\t\t\tthis.#session.version === Version.DRAFT_15 ||\n\t\t\t\t\tthis.#session.version === Version.DRAFT_16\n\t\t\t\t) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait stream.writer.u53(PublishNamespaceDone.id);\n\t\t\t\t\t\tconst done = new PublishNamespaceDone({ trackNamespace: path, requestId });\n\t\t\t\t\t\tawait done.encode(stream.writer, this.#session.version);\n\t\t\t\t\t} catch {\n\t\t\t\t\t\t// Stream might already be closed\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tstream.close();\n\t\t\t} catch (err) {\n\t\t\t\tstream.abort(error(err));\n\t\t\t\tthrow err;\n\t\t\t}\n\t\t} catch (err: unknown) {\n\t\t\tconst e = error(err);\n\t\t\tconsole.warn(`announce failed: broadcast=${path} error=${e.message}`);\n\t\t} finally {\n\t\t\tbroadcast.close();\n\t\t\tthis.#broadcasts.delete(path);\n\t\t\tthis.#notifyConsumers(path, false);\n\t\t}\n\t}\n\n\t/**\n\t * Handles an incoming SUBSCRIBE request on a bidi stream.\n\t * Owns the full lifecycle: sends response, serves track data, waits for close.\n\t *\n\t * @internal\n\t */\n\tasync runSubscribe(msg: Subscribe, stream: Stream) {\n\t\tconst version = this.#session.version;\n\t\tconst name = msg.trackNamespace;\n\t\tconst broadcast = this.#broadcasts.get(name);\n\n\t\tif (!broadcast) {\n\t\t\t// Write error response\n\t\t\tif (version === Version.DRAFT_14) {\n\t\t\t\tawait stream.writer.u53(SubscribeError.id);\n\t\t\t\tconst err = new SubscribeError({\n\t\t\t\t\trequestId: msg.requestId,\n\t\t\t\t\terrorCode: 404,\n\t\t\t\t\treasonPhrase: \"Broadcast not found\",\n\t\t\t\t});\n\t\t\t\tawait err.encode(stream.writer, version);\n\t\t\t} else {\n\t\t\t\tawait stream.writer.u53(RequestError.id);\n\t\t\t\tconst err = new RequestError({\n\t\t\t\t\trequestId: version === Version.DRAFT_15 || version === Version.DRAFT_16 ? msg.requestId : undefined,\n\t\t\t\t\terrorCode: 404,\n\t\t\t\t\treasonPhrase: \"Broadcast not found\",\n\t\t\t\t});\n\t\t\t\tawait err.encode(stream.writer, version);\n\t\t\t}\n\t\t\tstream.close();\n\t\t\treturn;\n\t\t}\n\n\t\tconst track = broadcast.subscribe(msg.trackName, msg.subscriberPriority);\n\n\t\ttry {\n\t\t\t// Send SUBSCRIBE_OK\n\t\t\tawait stream.writer.u53(SubscribeOk.id);\n\t\t\tconst ok = new SubscribeOk({\n\t\t\t\trequestId:\n\t\t\t\t\tversion === Version.DRAFT_14 || version === Version.DRAFT_15 || version === Version.DRAFT_16\n\t\t\t\t\t\t? msg.requestId\n\t\t\t\t\t\t: undefined,\n\t\t\t\ttrackAlias: msg.requestId,\n\t\t\t});\n\t\t\tawait ok.encode(stream.writer, version);\n\t\t\tconsole.debug(`publish ok: broadcast=${name} track=${track.name}`);\n\n\t\t\t// Serve track groups, racing with stream close (= Unsubscribe)\n\t\t\tconst serving = (async () => {\n\t\t\t\tfor (;;) {\n\t\t\t\t\tconst group = await track.recvGroup();\n\t\t\t\t\tif (!group) return;\n\t\t\t\t\tvoid this.#runGroup(msg.requestId, group);\n\t\t\t\t}\n\t\t\t})();\n\n\t\t\tawait Promise.race([serving, stream.reader.closed]);\n\n\t\t\tconsole.debug(`publish done: broadcast=${name} track=${track.name}`);\n\n\t\t\t// v14-v16: send PublishDone before closing\n\t\t\tif (version === Version.DRAFT_14 || version === Version.DRAFT_15 || version === Version.DRAFT_16) {\n\t\t\t\ttry {\n\t\t\t\t\tawait stream.writer.u53(PublishDone.id);\n\t\t\t\t\tconst done = new PublishDone({\n\t\t\t\t\t\trequestId: msg.requestId,\n\t\t\t\t\t\tstatusCode: 200,\n\t\t\t\t\t\treasonPhrase: \"OK\",\n\t\t\t\t\t});\n\t\t\t\t\tawait done.encode(stream.writer, version);\n\t\t\t\t} catch {\n\t\t\t\t\t// Stream might already be closed by peer\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tstream.close();\n\t\t} catch (err: unknown) {\n\t\t\tconst e = error(err);\n\t\t\tconsole.warn(`publish error: broadcast=${name} track=${track.name} error=${e.message}`);\n\t\t\tstream.abort(e);\n\t\t} finally {\n\t\t\ttrack.close();\n\t\t}\n\t}\n\n\t/**\n\t * Runs a group and sends its frames using ObjectStream (Subgroup delivery mode).\n\t */\n\tasync #runGroup(requestId: bigint, group: Group) {\n\t\ttry {\n\t\t\tconst stream = await Writer.open(this.#quic, this.#session.version);\n\n\t\t\tconst header = new GroupMessage({\n\t\t\t\ttrackAlias: requestId,\n\t\t\t\tgroupId: group.sequence,\n\t\t\t\tsubGroupId: 0,\n\t\t\t\tpublisherPriority: 0,\n\t\t\t\tflags: {\n\t\t\t\t\thasExtensions: false,\n\t\t\t\t\thasSubgroup: false,\n\t\t\t\t\thasSubgroupObject: false,\n\t\t\t\t\thasEnd: true,\n\t\t\t\t\thasPriority: true,\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tawait header.encode(stream, this.#session.version);\n\n\t\t\ttry {\n\t\t\t\tfor (;;) {\n\t\t\t\t\tconst frame = await Promise.race([group.readFrame(), stream.closed]);\n\t\t\t\t\tif (!frame) break;\n\n\t\t\t\t\tconst obj = new Frame({ payload: frame });\n\t\t\t\t\tawait obj.encode(stream, header.flags);\n\t\t\t\t}\n\n\t\t\t\tstream.close();\n\t\t\t} catch (err: unknown) {\n\t\t\t\tstream.reset(error(err));\n\t\t\t}\n\t\t} finally {\n\t\t\tgroup.close();\n\t\t}\n\t}\n\n\t/**\n\t * Handles an incoming SUBSCRIBE_NAMESPACE on a bidi stream.\n\t * Sends RequestOk, then streams Namespace/NamespaceDone entries.\n\t *\n\t * @internal\n\t */\n\tasync runSubscribeNamespace(msg: SubscribeNamespace, stream: Stream) {\n\t\tconst version = this.#session.version;\n\t\tconst prefix = msg.namespace;\n\n\t\ttry {\n\t\t\t// Send OK response\n\t\t\tif (version === Version.DRAFT_14) {\n\t\t\t\tawait stream.writer.u53(SubscribeNamespaceOk.id);\n\t\t\t\tconst ok = new SubscribeNamespaceOk({ requestId: msg.requestId });\n\t\t\t\tawait ok.encode(stream.writer, version);\n\t\t\t} else {\n\t\t\t\tawait stream.writer.u53(RequestOk.id);\n\t\t\t\tconst ok = new RequestOk({\n\t\t\t\t\trequestId: version === Version.DRAFT_15 || version === Version.DRAFT_16 ? msg.requestId : undefined,\n\t\t\t\t});\n\t\t\t\tawait ok.encode(stream.writer, version);\n\t\t\t}\n\n\t\t\t// Create an Announced consumer and seed it with current broadcasts\n\t\t\tconst announced = new Announced(prefix);\n\t\t\tfor (const name of this.#broadcasts.keys()) {\n\t\t\t\tconst suffix = Path.stripPrefix(prefix, name);\n\t\t\t\tif (suffix === null) continue;\n\t\t\t\tannounced.append({ path: suffix, active: true });\n\t\t\t}\n\t\t\tthis.#announcedConsumers.add(announced);\n\n\t\t\t// Close the consumer when the stream closes\n\t\t\tstream.reader.closed.then(\n\t\t\t\t() => announced.close(),\n\t\t\t\t() => announced.close(),\n\t\t\t);\n\n\t\t\ttry {\n\t\t\t\tfor (;;) {\n\t\t\t\t\tconst entry = await announced.next();\n\t\t\t\t\tif (!entry) break;\n\n\t\t\t\t\tif (entry.active) {\n\t\t\t\t\t\tawait stream.writer.u53(SubscribeNamespaceEntry.id);\n\t\t\t\t\t\tconst e = new SubscribeNamespaceEntry({ suffix: entry.path });\n\t\t\t\t\t\tawait e.encode(stream.writer, version);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tawait stream.writer.u53(SubscribeNamespaceEntryDone.id);\n\t\t\t\t\t\tconst e = new SubscribeNamespaceEntryDone({ suffix: entry.path });\n\t\t\t\t\t\tawait e.encode(stream.writer, version);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} finally {\n\t\t\t\tannounced.close();\n\t\t\t\tthis.#announcedConsumers.delete(announced);\n\t\t\t}\n\n\t\t\tstream.close();\n\t\t} catch (err: unknown) {\n\t\t\tconst e = error(err);\n\t\t\tconsole.debug(`subscribe_namespace stream error: ${e.message}`);\n\t\t\tstream.abort(e);\n\t\t}\n\t}\n\n\t/**\n\t * Handles an incoming TRACK_STATUS_REQUEST on a bidi stream.\n\t *\n\t * @internal\n\t */\n\tasync runTrackStatusRequest(msg: TrackStatusRequest, stream: Stream) {\n\t\tconst version = this.#session.version;\n\n\t\tif (version === Version.DRAFT_14) {\n\t\t\t// v14: respond with TrackStatus (0x0E = TRACK_STATUS_OK)\n\t\t\tawait stream.writer.u53(TrackStatus.id);\n\t\t\tconst status = new TrackStatus({\n\t\t\t\ttrackNamespace: msg.trackNamespace,\n\t\t\t\ttrackName: msg.trackName,\n\t\t\t\tstatusCode: TrackStatus.STATUS_NOT_FOUND,\n\t\t\t\tlastGroupId: 0n,\n\t\t\t\tlastObjectId: 0n,\n\t\t\t});\n\t\t\tawait status.encode(stream.writer, version);\n\t\t} else {\n\t\t\t// v15+: respond with RequestOk (0x07)\n\t\t\tawait stream.writer.u53(RequestOk.id);\n\t\t\tconst ok = new RequestOk({\n\t\t\t\trequestId: version === Version.DRAFT_15 || version === Version.DRAFT_16 ? msg.requestId : undefined,\n\t\t\t});\n\t\t\tawait ok.encode(stream.writer, version);\n\t\t}\n\t\tstream.close();\n\t}\n\n\t#notifyConsumers(path: Path.Valid, active: boolean) {\n\t\tfor (const consumer of this.#announcedConsumers) {\n\t\t\tconst suffix = Path.stripPrefix(consumer.prefix, path);\n\t\t\tif (suffix === null) continue;\n\t\t\ttry {\n\t\t\t\tconsumer.append({ path: suffix, active });\n\t\t\t} catch {\n\t\t\t\t// Consumer already closed, will be cleaned up\n\t\t\t}\n\t\t}\n\t}\n}\n"]}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import type { Reader, Writer } from "../stream";
|
|
2
|
+
import { Parameters } from "./parameters";
|
|
3
|
+
import { type IetfVersion } from "./version";
|
|
4
|
+
export declare class MaxRequestId {
|
|
5
|
+
#private;
|
|
6
|
+
static id: number;
|
|
7
|
+
requestId: bigint;
|
|
8
|
+
constructor({ requestId }: {
|
|
9
|
+
requestId: bigint;
|
|
10
|
+
});
|
|
11
|
+
encode(w: Writer, _version: IetfVersion): Promise<void>;
|
|
12
|
+
static decode(r: Reader, _version: IetfVersion): Promise<MaxRequestId>;
|
|
13
|
+
}
|
|
14
|
+
export declare class RequestsBlocked {
|
|
15
|
+
#private;
|
|
16
|
+
static id: number;
|
|
17
|
+
requestId: bigint;
|
|
18
|
+
constructor({ requestId }: {
|
|
19
|
+
requestId: bigint;
|
|
20
|
+
});
|
|
21
|
+
encode(w: Writer, _version: IetfVersion): Promise<void>;
|
|
22
|
+
static decode(r: Reader, _version: IetfVersion): Promise<RequestsBlocked>;
|
|
23
|
+
}
|
|
24
|
+
export declare class RequestOk {
|
|
25
|
+
#private;
|
|
26
|
+
static id: number;
|
|
27
|
+
requestId: bigint | undefined;
|
|
28
|
+
parameters: Parameters;
|
|
29
|
+
constructor({ requestId, parameters }: {
|
|
30
|
+
requestId?: bigint;
|
|
31
|
+
parameters?: Parameters;
|
|
32
|
+
});
|
|
33
|
+
encode(w: Writer, version: IetfVersion): Promise<void>;
|
|
34
|
+
static decode(r: Reader, version: IetfVersion): Promise<RequestOk>;
|
|
35
|
+
}
|
|
36
|
+
export declare class RequestError {
|
|
37
|
+
#private;
|
|
38
|
+
static id: number;
|
|
39
|
+
requestId: bigint | undefined;
|
|
40
|
+
errorCode: number;
|
|
41
|
+
reasonPhrase: string;
|
|
42
|
+
retryInterval: bigint;
|
|
43
|
+
constructor({ requestId, errorCode, reasonPhrase, retryInterval, }: {
|
|
44
|
+
requestId?: bigint;
|
|
45
|
+
errorCode: number;
|
|
46
|
+
reasonPhrase: string;
|
|
47
|
+
retryInterval?: bigint;
|
|
48
|
+
});
|
|
49
|
+
encode(w: Writer, version: IetfVersion): Promise<void>;
|
|
50
|
+
static decode(r: Reader, version: IetfVersion): Promise<RequestError>;
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=request.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"request.d.ts","sourceRoot":"","sources":["../../src/ietf/request.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAEnD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,OAAO,EAAE,KAAK,WAAW,EAAW,MAAM,cAAc,CAAC;AAEzD,qBAAa,YAAY;;IACxB,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;IAMD,OAAa,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC,CAE3E;CACD;AAED,qBAAa,eAAe;;IAC3B,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;IAMD,OAAa,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,GAAG,OAAO,CAAC,eAAe,CAAC,CAE9E;CACD;AAID,qBAAa,SAAS;;IACrB,MAAM,CAAC,EAAE,SAAQ;IAEjB,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,UAAU,EAAE,UAAU,CAAC;IAEvB,YAAY,EAAE,SAAS,EAAE,UAA6B,EAAE,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,UAAU,CAAA;KAAE,EAGxG;IAUK,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAE3D;IAYD,OAAa,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,SAAS,CAAC,CAEvE;CACD;AAID,qBAAa,YAAY;;IACxB,MAAM,CAAC,EAAE,SAAQ;IAEjB,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IAEtB,YAAY,EACX,SAAS,EACT,SAAS,EACT,YAAY,EACZ,aAAkB,GAClB,EAAE;QACF,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,SAAS,EAAE,MAAM,CAAC;QAClB,YAAY,EAAE,MAAM,CAAC;QACrB,aAAa,CAAC,EAAE,MAAM,CAAC;KACvB,EAKA;IAcK,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAE3D;IAaD,OAAa,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC,CAE1E;CACD"}
|
package/ietf/request.js
ADDED
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/* @ts-self-types="./request.d.ts" */
|
|
2
|
+
import * as Message from "./message.js";
|
|
3
|
+
import { Parameters } from "./parameters.js";
|
|
4
|
+
import * as Properties from "./properties.js";
|
|
5
|
+
import { Version } from "./version.js";
|
|
6
|
+
export class MaxRequestId {
|
|
7
|
+
static id = 0x15;
|
|
8
|
+
requestId;
|
|
9
|
+
constructor({ requestId }) {
|
|
10
|
+
this.requestId = requestId;
|
|
11
|
+
}
|
|
12
|
+
async #encode(w) {
|
|
13
|
+
await w.u62(this.requestId);
|
|
14
|
+
}
|
|
15
|
+
async encode(w, _version) {
|
|
16
|
+
return Message.encode(w, this.#encode.bind(this));
|
|
17
|
+
}
|
|
18
|
+
static async #decode(r) {
|
|
19
|
+
return new MaxRequestId({ requestId: await r.u62() });
|
|
20
|
+
}
|
|
21
|
+
static async decode(r, _version) {
|
|
22
|
+
return Message.decode(r, MaxRequestId.#decode);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
export class RequestsBlocked {
|
|
26
|
+
static id = 0x1a;
|
|
27
|
+
requestId;
|
|
28
|
+
constructor({ requestId }) {
|
|
29
|
+
this.requestId = requestId;
|
|
30
|
+
}
|
|
31
|
+
async #encode(w) {
|
|
32
|
+
await w.u62(this.requestId);
|
|
33
|
+
}
|
|
34
|
+
async encode(w, _version) {
|
|
35
|
+
return Message.encode(w, this.#encode.bind(this));
|
|
36
|
+
}
|
|
37
|
+
static async #decode(r) {
|
|
38
|
+
return new RequestsBlocked({ requestId: await r.u62() });
|
|
39
|
+
}
|
|
40
|
+
static async decode(r, _version) {
|
|
41
|
+
return Message.decode(r, RequestsBlocked.#decode);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/// REQUEST_OK (0x07 in v15) - Generic success response for any request.
|
|
45
|
+
/// Replaces PublishNamespaceOk, SubscribeNamespaceOk in v15.
|
|
46
|
+
export class RequestOk {
|
|
47
|
+
static id = 0x07;
|
|
48
|
+
requestId;
|
|
49
|
+
parameters;
|
|
50
|
+
constructor({ requestId, parameters = new Parameters() }) {
|
|
51
|
+
this.requestId = requestId;
|
|
52
|
+
this.parameters = parameters;
|
|
53
|
+
}
|
|
54
|
+
async #encode(w, version) {
|
|
55
|
+
if (version === Version.DRAFT_14 || version === Version.DRAFT_15 || version === Version.DRAFT_16) {
|
|
56
|
+
if (this.requestId === undefined)
|
|
57
|
+
throw new Error("requestId required for draft14-16");
|
|
58
|
+
await w.u62(this.requestId);
|
|
59
|
+
}
|
|
60
|
+
await this.parameters.encode(w, version);
|
|
61
|
+
}
|
|
62
|
+
async encode(w, version) {
|
|
63
|
+
return Message.encode(w, (wr) => this.#encode(wr, version));
|
|
64
|
+
}
|
|
65
|
+
static async #decode(r, version) {
|
|
66
|
+
const requestId = version === Version.DRAFT_14 || version === Version.DRAFT_15 || version === Version.DRAFT_16
|
|
67
|
+
? await r.u62()
|
|
68
|
+
: undefined;
|
|
69
|
+
const parameters = await Parameters.decode(r, version);
|
|
70
|
+
await Properties.skip(r, version);
|
|
71
|
+
return new RequestOk({ requestId, parameters });
|
|
72
|
+
}
|
|
73
|
+
static async decode(r, version) {
|
|
74
|
+
return Message.decode(r, (rd) => RequestOk.#decode(rd, version));
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
/// REQUEST_ERROR (0x05 in v15) - Generic error response for any request.
|
|
78
|
+
/// Replaces SubscribeError, PublishError, PublishNamespaceError, etc. in v15.
|
|
79
|
+
export class RequestError {
|
|
80
|
+
static id = 0x05;
|
|
81
|
+
requestId;
|
|
82
|
+
errorCode;
|
|
83
|
+
reasonPhrase;
|
|
84
|
+
retryInterval;
|
|
85
|
+
constructor({ requestId, errorCode, reasonPhrase, retryInterval = 0n, }) {
|
|
86
|
+
this.requestId = requestId;
|
|
87
|
+
this.errorCode = errorCode;
|
|
88
|
+
this.reasonPhrase = reasonPhrase;
|
|
89
|
+
this.retryInterval = retryInterval;
|
|
90
|
+
}
|
|
91
|
+
async #encode(w, version) {
|
|
92
|
+
if (version === Version.DRAFT_14 || version === Version.DRAFT_15 || version === Version.DRAFT_16) {
|
|
93
|
+
if (this.requestId === undefined)
|
|
94
|
+
throw new Error("requestId required for draft14-16");
|
|
95
|
+
await w.u62(this.requestId);
|
|
96
|
+
}
|
|
97
|
+
await w.u62(BigInt(this.errorCode));
|
|
98
|
+
if (version !== Version.DRAFT_14 && version !== Version.DRAFT_15) {
|
|
99
|
+
await w.u62(this.retryInterval);
|
|
100
|
+
}
|
|
101
|
+
await w.string(this.reasonPhrase);
|
|
102
|
+
}
|
|
103
|
+
async encode(w, version) {
|
|
104
|
+
return Message.encode(w, (wr) => this.#encode(wr, version));
|
|
105
|
+
}
|
|
106
|
+
static async #decode(r, version) {
|
|
107
|
+
const requestId = version === Version.DRAFT_14 || version === Version.DRAFT_15 || version === Version.DRAFT_16
|
|
108
|
+
? await r.u62()
|
|
109
|
+
: undefined;
|
|
110
|
+
const errorCode = Number(await r.u62());
|
|
111
|
+
const retryInterval = version === Version.DRAFT_14 || version === Version.DRAFT_15 ? 0n : await r.u62();
|
|
112
|
+
const reasonPhrase = await r.string();
|
|
113
|
+
return new RequestError({ requestId, errorCode, reasonPhrase, retryInterval });
|
|
114
|
+
}
|
|
115
|
+
static async decode(r, version) {
|
|
116
|
+
return Message.decode(r, (rd) => RequestError.#decode(rd, version));
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=request.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"request.js","sourceRoot":"","sources":["../../src/ietf/request.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Reader, Writer } from \"../stream.ts\";\nimport * as Message from \"./message.ts\";\nimport { Parameters } from \"./parameters.ts\";\nimport * as Properties from \"./properties.ts\";\nimport { type IetfVersion, Version } from \"./version.ts\";\n\nexport class MaxRequestId {\n\tstatic id = 0x15;\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\tawait w.u62(this.requestId);\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): Promise<MaxRequestId> {\n\t\treturn new MaxRequestId({ requestId: await r.u62() });\n\t}\n\n\tstatic async decode(r: Reader, _version: IetfVersion): Promise<MaxRequestId> {\n\t\treturn Message.decode(r, MaxRequestId.#decode);\n\t}\n}\n\nexport class RequestsBlocked {\n\tstatic id = 0x1a;\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\tawait w.u62(this.requestId);\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): Promise<RequestsBlocked> {\n\t\treturn new RequestsBlocked({ requestId: await r.u62() });\n\t}\n\n\tstatic async decode(r: Reader, _version: IetfVersion): Promise<RequestsBlocked> {\n\t\treturn Message.decode(r, RequestsBlocked.#decode);\n\t}\n}\n\n/// REQUEST_OK (0x07 in v15) - Generic success response for any request.\n/// Replaces PublishNamespaceOk, SubscribeNamespaceOk in v15.\nexport class RequestOk {\n\tstatic id = 0x07;\n\n\trequestId: bigint | undefined;\n\tparameters: Parameters;\n\n\tconstructor({ requestId, parameters = new Parameters() }: { requestId?: bigint; parameters?: Parameters }) {\n\t\tthis.requestId = requestId;\n\t\tthis.parameters = parameters;\n\t}\n\n\tasync #encode(w: Writer, version: IetfVersion): Promise<void> {\n\t\tif (version === Version.DRAFT_14 || version === Version.DRAFT_15 || version === Version.DRAFT_16) {\n\t\t\tif (this.requestId === undefined) throw new Error(\"requestId required for draft14-16\");\n\t\t\tawait w.u62(this.requestId);\n\t\t}\n\t\tawait this.parameters.encode(w, version);\n\t}\n\n\tasync encode(w: Writer, version: IetfVersion): Promise<void> {\n\t\treturn Message.encode(w, (wr) => this.#encode(wr, version));\n\t}\n\n\tstatic async #decode(r: Reader, version: IetfVersion): Promise<RequestOk> {\n\t\tconst requestId =\n\t\t\tversion === Version.DRAFT_14 || version === Version.DRAFT_15 || version === Version.DRAFT_16\n\t\t\t\t? await r.u62()\n\t\t\t\t: undefined;\n\t\tconst parameters = await Parameters.decode(r, version);\n\t\tawait Properties.skip(r, version);\n\t\treturn new RequestOk({ requestId, parameters });\n\t}\n\n\tstatic async decode(r: Reader, version: IetfVersion): Promise<RequestOk> {\n\t\treturn Message.decode(r, (rd) => RequestOk.#decode(rd, version));\n\t}\n}\n\n/// REQUEST_ERROR (0x05 in v15) - Generic error response for any request.\n/// Replaces SubscribeError, PublishError, PublishNamespaceError, etc. in v15.\nexport class RequestError {\n\tstatic id = 0x05;\n\n\trequestId: bigint | undefined;\n\terrorCode: number;\n\treasonPhrase: string;\n\tretryInterval: bigint;\n\n\tconstructor({\n\t\trequestId,\n\t\terrorCode,\n\t\treasonPhrase,\n\t\tretryInterval = 0n,\n\t}: {\n\t\trequestId?: bigint;\n\t\terrorCode: number;\n\t\treasonPhrase: string;\n\t\tretryInterval?: bigint;\n\t}) {\n\t\tthis.requestId = requestId;\n\t\tthis.errorCode = errorCode;\n\t\tthis.reasonPhrase = reasonPhrase;\n\t\tthis.retryInterval = retryInterval;\n\t}\n\n\tasync #encode(w: Writer, version: IetfVersion): Promise<void> {\n\t\tif (version === Version.DRAFT_14 || version === Version.DRAFT_15 || version === Version.DRAFT_16) {\n\t\t\tif (this.requestId === undefined) throw new Error(\"requestId required for draft14-16\");\n\t\t\tawait w.u62(this.requestId);\n\t\t}\n\t\tawait w.u62(BigInt(this.errorCode));\n\t\tif (version !== Version.DRAFT_14 && version !== Version.DRAFT_15) {\n\t\t\tawait w.u62(this.retryInterval);\n\t\t}\n\t\tawait w.string(this.reasonPhrase);\n\t}\n\n\tasync encode(w: Writer, version: IetfVersion): Promise<void> {\n\t\treturn Message.encode(w, (wr) => this.#encode(wr, version));\n\t}\n\n\tstatic async #decode(r: Reader, version: IetfVersion): Promise<RequestError> {\n\t\tconst requestId =\n\t\t\tversion === Version.DRAFT_14 || version === Version.DRAFT_15 || version === Version.DRAFT_16\n\t\t\t\t? await r.u62()\n\t\t\t\t: undefined;\n\t\tconst errorCode = Number(await r.u62());\n\t\tconst retryInterval = version === Version.DRAFT_14 || version === Version.DRAFT_15 ? 0n : await r.u62();\n\t\tconst reasonPhrase = await r.string();\n\t\treturn new RequestError({ requestId, errorCode, reasonPhrase, retryInterval });\n\t}\n\n\tstatic async decode(r: Reader, version: IetfVersion): Promise<RequestError> {\n\t\treturn Message.decode(r, (rd) => RequestError.#decode(rd, version));\n\t}\n}\n"]}
|
package/ietf/setup.d.ts
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { Reader, Writer } from "../stream";
|
|
2
|
+
import { SetupOptions } from "./parameters";
|
|
3
|
+
import { type IetfVersion } from "./version";
|
|
4
|
+
export declare class Setup {
|
|
5
|
+
#private;
|
|
6
|
+
static id: number;
|
|
7
|
+
parameters: SetupOptions;
|
|
8
|
+
constructor({ parameters }?: {
|
|
9
|
+
parameters?: SetupOptions;
|
|
10
|
+
});
|
|
11
|
+
encode(w: Writer, version: IetfVersion): Promise<void>;
|
|
12
|
+
static decode(r: Reader, version: IetfVersion): Promise<Setup>;
|
|
13
|
+
}
|
|
14
|
+
export declare class ClientSetup {
|
|
15
|
+
#private;
|
|
16
|
+
static id: number;
|
|
17
|
+
versions: number[];
|
|
18
|
+
parameters: SetupOptions;
|
|
19
|
+
constructor({ versions, parameters }: {
|
|
20
|
+
versions: number[];
|
|
21
|
+
parameters?: SetupOptions;
|
|
22
|
+
});
|
|
23
|
+
encode(w: Writer, version: IetfVersion): Promise<void>;
|
|
24
|
+
static decode(r: Reader, version: IetfVersion): Promise<ClientSetup>;
|
|
25
|
+
}
|
|
26
|
+
export declare class ServerSetup {
|
|
27
|
+
#private;
|
|
28
|
+
static id: number;
|
|
29
|
+
version: number;
|
|
30
|
+
parameters: SetupOptions;
|
|
31
|
+
constructor({ version, parameters }: {
|
|
32
|
+
version: number;
|
|
33
|
+
parameters?: SetupOptions;
|
|
34
|
+
});
|
|
35
|
+
encode(w: Writer, version: IetfVersion): Promise<void>;
|
|
36
|
+
static decode(r: Reader, version: IetfVersion): Promise<ServerSetup>;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=setup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/ietf/setup.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAEnD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,KAAK,WAAW,EAAW,MAAM,cAAc,CAAC;AAGzD,qBAAa,KAAK;;IACjB,MAAM,CAAC,EAAE,SAAU;IAEnB,UAAU,EAAE,YAAY,CAAC;IAEzB,YAAY,EAAE,UAA+B,EAAE,GAAE;QAAE,UAAU,CAAC,EAAE,YAAY,CAAA;KAAO,EAElF;IAMK,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAE3D;IAOD,OAAa,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,CAEnE;CACD;AAID,qBAAa,WAAW;;IACvB,MAAM,CAAC,EAAE,SAAQ;IAEjB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,UAAU,EAAE,YAAY,CAAC;IAEzB,YAAY,EAAE,QAAQ,EAAE,UAA+B,EAAE,EAAE;QAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;QAAC,UAAU,CAAC,EAAE,YAAY,CAAA;KAAE,EAG3G;IAkBK,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAE3D;IA8BD,OAAa,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CAEzE;CACD;AAED,qBAAa,WAAW;;IACvB,MAAM,CAAC,EAAE,SAAQ;IAEjB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,YAAY,CAAC;IAEzB,YAAY,EAAE,OAAO,EAAE,UAA+B,EAAE,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,YAAY,CAAA;KAAE,EAGvG;IAeK,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAE3D;IAiBD,OAAa,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CAEzE;CACD"}
|