@norskvideo/moq-net 0.1.2 → 0.1.4
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 +1 -0
- package/announced.d.ts +111 -21
- package/announced.d.ts.map +1 -1
- package/announced.js +213 -40
- package/announced.js.map +1 -1
- package/broadcast.d.ts +80 -25
- package/broadcast.d.ts.map +1 -1
- package/broadcast.js +270 -49
- package/broadcast.js.map +1 -1
- package/connection/accept.d.ts +6 -0
- package/connection/accept.d.ts.map +1 -1
- package/connection/accept.js +42 -13
- package/connection/accept.js.map +1 -1
- package/connection/browser.d.ts +5 -0
- package/connection/browser.d.ts.map +1 -0
- package/connection/browser.js +31 -0
- package/connection/browser.js.map +1 -0
- package/connection/connect.d.ts +43 -1
- package/connection/connect.d.ts.map +1 -1
- package/connection/connect.js +118 -123
- package/connection/connect.js.map +1 -1
- package/connection/established.d.ts +43 -16
- package/connection/established.d.ts.map +1 -1
- package/connection/established.js.map +1 -1
- package/connection/handshake.d.ts +12 -1
- package/connection/handshake.d.ts.map +1 -1
- package/connection/handshake.js +30 -14
- package/connection/handshake.js.map +1 -1
- package/connection/index.d.ts +8 -0
- package/connection/index.d.ts.map +1 -1
- package/connection/index.js +6 -0
- package/connection/index.js.map +1 -1
- package/connection/reload.d.ts +66 -9
- package/connection/reload.d.ts.map +1 -1
- package/connection/reload.js +192 -66
- package/connection/reload.js.map +1 -1
- package/connection/stats.d.ts +92 -0
- package/connection/stats.d.ts.map +1 -0
- package/connection/stats.js +35 -0
- package/connection/stats.js.map +1 -0
- package/connection/transport.d.ts +10 -0
- package/connection/transport.d.ts.map +1 -0
- package/connection/transport.js +12 -0
- package/connection/transport.js.map +1 -0
- package/consume.d.ts +44 -0
- package/consume.d.ts.map +1 -0
- package/consume.js +60 -0
- package/consume.js.map +1 -0
- package/datagram.d.ts +23 -0
- package/datagram.d.ts.map +1 -0
- package/datagram.js +3 -0
- package/datagram.js.map +1 -0
- package/error.d.ts +76 -0
- package/error.d.ts.map +1 -0
- package/error.js +107 -0
- package/error.js.map +1 -0
- package/group.d.ts +143 -38
- package/group.d.ts.map +1 -1
- package/group.js +270 -68
- package/group.js.map +1 -1
- package/ietf/adapter.d.ts +2 -2
- package/ietf/adapter.d.ts.map +1 -1
- package/ietf/adapter.js +20 -10
- package/ietf/adapter.js.map +1 -1
- package/ietf/aliases.d.ts +73 -5
- package/ietf/aliases.d.ts.map +1 -1
- package/ietf/aliases.js +121 -14
- package/ietf/aliases.js.map +1 -1
- package/ietf/cluster.d.ts +141 -0
- package/ietf/cluster.d.ts.map +1 -0
- package/ietf/cluster.js +204 -0
- package/ietf/cluster.js.map +1 -0
- package/ietf/connection.d.ts +39 -6
- package/ietf/connection.d.ts.map +1 -1
- package/ietf/connection.js +73 -12
- package/ietf/connection.js.map +1 -1
- package/ietf/fetch.d.ts +17 -0
- package/ietf/fetch.d.ts.map +1 -1
- package/ietf/fetch.js +21 -0
- package/ietf/fetch.js.map +1 -1
- package/ietf/filter.d.ts +87 -0
- package/ietf/filter.d.ts.map +1 -0
- package/ietf/filter.js +292 -0
- package/ietf/filter.js.map +1 -0
- package/ietf/index.d.ts +2 -0
- package/ietf/index.d.ts.map +1 -1
- package/ietf/index.js +3 -0
- package/ietf/index.js.map +1 -1
- package/ietf/namespace.d.ts +6 -0
- package/ietf/namespace.d.ts.map +1 -1
- package/ietf/namespace.js +27 -2
- package/ietf/namespace.js.map +1 -1
- package/ietf/object.d.ts +54 -6
- package/ietf/object.d.ts.map +1 -1
- package/ietf/object.js +178 -25
- package/ietf/object.js.map +1 -1
- package/ietf/parameters.d.ts +35 -10
- package/ietf/parameters.d.ts.map +1 -1
- package/ietf/parameters.js +236 -45
- package/ietf/parameters.js.map +1 -1
- package/ietf/priority.d.ts +5 -0
- package/ietf/priority.d.ts.map +1 -0
- package/ietf/priority.js +10 -0
- package/ietf/priority.js.map +1 -0
- package/ietf/properties.d.ts +13 -2
- package/ietf/properties.d.ts.map +1 -1
- package/ietf/properties.js +65 -8
- package/ietf/properties.js.map +1 -1
- package/ietf/publish.d.ts.map +1 -1
- package/ietf/publish.js +13 -3
- package/ietf/publish.js.map +1 -1
- package/ietf/publish_namespace.d.ts +16 -2
- package/ietf/publish_namespace.d.ts.map +1 -1
- package/ietf/publish_namespace.js +25 -6
- package/ietf/publish_namespace.js.map +1 -1
- package/ietf/publisher.d.ts +40 -7
- package/ietf/publisher.d.ts.map +1 -1
- package/ietf/publisher.js +751 -134
- package/ietf/publisher.js.map +1 -1
- package/ietf/request.js +1 -1
- package/ietf/request.js.map +1 -1
- package/ietf/solicit.d.ts +41 -0
- package/ietf/solicit.d.ts.map +1 -0
- package/ietf/solicit.js +47 -0
- package/ietf/solicit.js.map +1 -0
- package/ietf/subscribe.d.ts +41 -2
- package/ietf/subscribe.d.ts.map +1 -1
- package/ietf/subscribe.js +103 -22
- package/ietf/subscribe.js.map +1 -1
- package/ietf/subscribe_namespace.d.ts +21 -7
- package/ietf/subscribe_namespace.d.ts.map +1 -1
- package/ietf/subscribe_namespace.js +31 -14
- package/ietf/subscribe_namespace.js.map +1 -1
- package/ietf/subscriber.d.ts +20 -7
- package/ietf/subscriber.d.ts.map +1 -1
- package/ietf/subscriber.js +512 -142
- package/ietf/subscriber.js.map +1 -1
- package/ietf/version.d.ts +7 -1
- package/ietf/version.d.ts.map +1 -1
- package/ietf/version.js +7 -0
- package/ietf/version.js.map +1 -1
- package/index.d.ts +10 -5
- package/index.d.ts.map +1 -1
- package/index.js +10 -5
- package/index.js.map +1 -1
- package/internal.d.ts +29 -0
- package/internal.d.ts.map +1 -0
- package/internal.js +8 -0
- package/internal.js.map +1 -0
- package/lite/announce.d.ts +62 -15
- package/lite/announce.d.ts.map +1 -1
- package/lite/announce.js +230 -94
- package/lite/announce.js.map +1 -1
- package/lite/connection.d.ts +69 -20
- package/lite/connection.d.ts.map +1 -1
- package/lite/connection.js +128 -81
- package/lite/connection.js.map +1 -1
- package/lite/datagram.d.ts +23 -0
- package/lite/datagram.d.ts.map +1 -0
- package/lite/datagram.js +57 -0
- package/lite/datagram.js.map +1 -0
- package/lite/datagram_stream.d.ts +8 -0
- package/lite/datagram_stream.d.ts.map +1 -0
- package/lite/datagram_stream.js +44 -0
- package/lite/datagram_stream.js.map +1 -0
- package/lite/fetch.d.ts.map +1 -1
- package/lite/fetch.js +2 -2
- package/lite/fetch.js.map +1 -1
- package/lite/index.d.ts +3 -0
- package/lite/index.d.ts.map +1 -1
- package/lite/index.js +3 -0
- package/lite/index.js.map +1 -1
- package/lite/priority.d.ts +67 -0
- package/lite/priority.d.ts.map +1 -0
- package/lite/priority.js +114 -0
- package/lite/priority.js.map +1 -0
- package/lite/probe.d.ts +18 -2
- package/lite/probe.d.ts.map +1 -1
- package/lite/probe.js +24 -22
- package/lite/probe.js.map +1 -1
- package/lite/publisher.d.ts +14 -7
- package/lite/publisher.d.ts.map +1 -1
- package/lite/publisher.js +406 -84
- package/lite/publisher.js.map +1 -1
- package/lite/setup.d.ts +83 -6
- package/lite/setup.d.ts.map +1 -1
- package/lite/setup.js +203 -31
- package/lite/setup.js.map +1 -1
- package/lite/stream.d.ts +12 -3
- package/lite/stream.d.ts.map +1 -1
- package/lite/stream.js +7 -4
- package/lite/stream.js.map +1 -1
- package/lite/subscribe.d.ts +37 -23
- package/lite/subscribe.d.ts.map +1 -1
- package/lite/subscribe.js +70 -55
- package/lite/subscribe.js.map +1 -1
- package/lite/subscriber.d.ts +29 -23
- package/lite/subscriber.d.ts.map +1 -1
- package/lite/subscriber.js +689 -112
- package/lite/subscriber.js.map +1 -1
- package/lite/track.d.ts +25 -13
- package/lite/track.d.ts.map +1 -1
- package/lite/track.js +60 -35
- package/lite/track.js.map +1 -1
- package/lite/version.d.ts +39 -4
- package/lite/version.d.ts.map +1 -1
- package/lite/version.js +139 -17
- package/lite/version.js.map +1 -1
- package/mock.d.ts +53 -3
- package/mock.d.ts.map +1 -1
- package/mock.js +110 -21
- package/mock.js.map +1 -1
- package/{lite/origin.d.ts → origin.d.ts} +25 -1
- package/origin.d.ts.map +1 -0
- package/{lite/origin.js → origin.js} +25 -1
- package/origin.js.map +1 -0
- package/package.json +6 -4
- package/path.d.ts +67 -0
- package/path.d.ts.map +1 -1
- package/path.js +128 -0
- package/path.js.map +1 -1
- package/stream.d.ts +94 -4
- package/stream.d.ts.map +1 -1
- package/stream.js +128 -17
- package/stream.js.map +1 -1
- package/time.d.ts +109 -86
- package/time.d.ts.map +1 -1
- package/time.js +80 -30
- package/time.js.map +1 -1
- package/track.d.ts +298 -47
- package/track.d.ts.map +1 -1
- package/track.js +721 -109
- package/track.js.map +1 -1
- package/util/timeout.d.ts +5 -0
- package/util/timeout.d.ts.map +1 -0
- package/util/timeout.js +18 -0
- package/util/timeout.js.map +1 -0
- package/util/utf8.d.ts +3 -0
- package/util/utf8.d.ts.map +1 -0
- package/util/utf8.js +7 -0
- package/util/utf8.js.map +1 -0
- package/varint.d.ts +14 -3
- package/varint.d.ts.map +1 -1
- package/varint.js +23 -12
- package/varint.js.map +1 -1
- package/zod.d.ts +5 -5
- package/zod.d.ts.map +1 -1
- package/zod.js.map +1 -1
- package/bandwidth.d.ts +0 -11
- package/bandwidth.d.ts.map +0 -1
- package/bandwidth.js +0 -7
- package/bandwidth.js.map +0 -1
- package/connection/cert.test.d.ts +0 -2
- package/connection/cert.test.d.ts.map +0 -1
- package/connection/cert.test.js +0 -26
- package/connection/cert.test.js.map +0 -1
- package/connection/reload.test.d.ts +0 -2
- package/connection/reload.test.d.ts.map +0 -1
- package/connection/reload.test.js +0 -39
- package/connection/reload.test.js.map +0 -1
- package/group.test.d.ts +0 -2
- package/group.test.d.ts.map +0 -1
- package/group.test.js +0 -66
- package/group.test.js.map +0 -1
- package/ietf/aliases.test.d.ts +0 -2
- package/ietf/aliases.test.d.ts.map +0 -1
- package/ietf/aliases.test.js +0 -30
- package/ietf/aliases.test.js.map +0 -1
- package/ietf/ietf.test.d.ts +0 -2
- package/ietf/ietf.test.d.ts.map +0 -1
- package/ietf/ietf.test.js +0 -873
- package/ietf/ietf.test.js.map +0 -1
- package/integration.test.d.ts +0 -2
- package/integration.test.d.ts.map +0 -1
- package/integration.test.js +0 -90
- package/integration.test.js.map +0 -1
- package/lite/origin.d.ts.map +0 -1
- package/lite/origin.js.map +0 -1
- package/lite/subscriber.test.d.ts +0 -2
- package/lite/subscriber.test.d.ts.map +0 -1
- package/lite/subscriber.test.js +0 -30
- package/lite/subscriber.test.js.map +0 -1
- package/lite/track.test.d.ts +0 -2
- package/lite/track.test.d.ts.map +0 -1
- package/lite/track.test.js +0 -53
- package/lite/track.test.js.map +0 -1
- package/path.test.d.ts +0 -2
- package/path.test.d.ts.map +0 -1
- package/path.test.js +0 -169
- package/path.test.js.map +0 -1
- package/stream.test.d.ts +0 -2
- package/stream.test.d.ts.map +0 -1
- package/stream.test.js +0 -210
- package/stream.test.js.map +0 -1
- package/track.test.d.ts +0 -2
- package/track.test.d.ts.map +0 -1
- package/track.test.js +0 -56
- package/track.test.js.map +0 -1
- package/util/error.d.ts +0 -3
- package/util/error.d.ts.map +0 -1
- package/util/error.js +0 -9
- package/util/error.js.map +0 -1
- package/util/index.d.ts +0 -2
- package/util/index.d.ts.map +0 -1
- package/util/index.js +0 -3
- package/util/index.js.map +0 -1
- package/varint.test.d.ts +0 -2
- package/varint.test.d.ts.map +0 -1
- package/varint.test.js +0 -106
- package/varint.test.js.map +0 -1
package/lite/announce.js
CHANGED
|
@@ -1,89 +1,201 @@
|
|
|
1
1
|
/* @ts-self-types="./announce.d.ts" */
|
|
2
|
+
import { MAX_HOPS, OriginSchema, UNKNOWN_ORIGIN } from "../origin.js";
|
|
2
3
|
import * as Path from "../path.js";
|
|
3
4
|
import * as Message from "./message.js";
|
|
4
|
-
import {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
if (this.hops.length > MAX_HOPS) {
|
|
19
|
-
throw new Error(`hop count ${this.hops.length} exceeds maximum ${MAX_HOPS}`);
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
async #encode(w, version) {
|
|
23
|
-
await w.bool(this.active);
|
|
24
|
-
await w.string(Path.encode(this.suffix));
|
|
25
|
-
switch (version) {
|
|
26
|
-
case Version.DRAFT_01:
|
|
27
|
-
case Version.DRAFT_02:
|
|
28
|
-
break;
|
|
29
|
-
case Version.DRAFT_03:
|
|
30
|
-
await w.u53(this.hops.length);
|
|
31
|
-
break;
|
|
32
|
-
default:
|
|
33
|
-
// Lite04+: hop count + individual Origin varints.
|
|
34
|
-
await w.u53(this.hops.length);
|
|
35
|
-
for (const origin of this.hops) {
|
|
36
|
-
await w.u62(origin);
|
|
37
|
-
}
|
|
38
|
-
break;
|
|
39
|
-
}
|
|
5
|
+
import { hasAnnounceId, hasAnnounceOk, hasExcludeHop, hasRouteCost, Version } from "./version.js";
|
|
6
|
+
// Pre-lite-06 inner status values, carried inside the single ANNOUNCE_BROADCAST body.
|
|
7
|
+
const STATUS_ENDED = 0;
|
|
8
|
+
const STATUS_ACTIVE = 1;
|
|
9
|
+
const STATUS_RESTART = 2;
|
|
10
|
+
// lite-06 announce message types: an outer discriminator carried before the length
|
|
11
|
+
// prefix, so each announcement is an independently-typed, length-delimited message
|
|
12
|
+
// (mirroring SUBSCRIBE_START/END/DROP on the subscribe stream).
|
|
13
|
+
const ANNOUNCE_START = 0;
|
|
14
|
+
const ANNOUNCE_END = 1;
|
|
15
|
+
const ANNOUNCE_RESTART = 2;
|
|
16
|
+
function checkHops(hops) {
|
|
17
|
+
if (hops.length > MAX_HOPS) {
|
|
18
|
+
throw new Error(`hop count ${hops.length} exceeds maximum ${MAX_HOPS}`);
|
|
40
19
|
}
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
hops = new Array(count).fill(placeholder);
|
|
57
|
-
break;
|
|
20
|
+
}
|
|
21
|
+
async function encodeHops(w, version, hops) {
|
|
22
|
+
checkHops(hops);
|
|
23
|
+
switch (version) {
|
|
24
|
+
case Version.DRAFT_01:
|
|
25
|
+
case Version.DRAFT_02:
|
|
26
|
+
break;
|
|
27
|
+
case Version.DRAFT_03:
|
|
28
|
+
await w.u53(hops.length);
|
|
29
|
+
break;
|
|
30
|
+
default:
|
|
31
|
+
// Lite04+: hop count + individual Origin varints.
|
|
32
|
+
await w.u53(hops.length);
|
|
33
|
+
for (const origin of hops) {
|
|
34
|
+
await w.u62(origin);
|
|
58
35
|
}
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
36
|
+
break;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
async function decodeHops(r, version) {
|
|
40
|
+
switch (version) {
|
|
41
|
+
case Version.DRAFT_01:
|
|
42
|
+
case Version.DRAFT_02:
|
|
43
|
+
return [];
|
|
44
|
+
case Version.DRAFT_03: {
|
|
45
|
+
const count = await r.u53();
|
|
46
|
+
if (count > MAX_HOPS)
|
|
47
|
+
throw new Error(`hop count ${count} exceeds maximum ${MAX_HOPS}`);
|
|
48
|
+
// Lite03 carries only a hop count, not individual ids, so every entry is
|
|
49
|
+
// the reserved "no identity" id.
|
|
50
|
+
return new Array(count).fill(UNKNOWN_ORIGIN);
|
|
51
|
+
}
|
|
52
|
+
default: {
|
|
53
|
+
// Lite04+: hop count + individual Origin varints.
|
|
54
|
+
const count = await r.u53();
|
|
55
|
+
if (count > MAX_HOPS)
|
|
56
|
+
throw new Error(`hop count ${count} exceeds maximum ${MAX_HOPS}`);
|
|
57
|
+
const hops = [];
|
|
58
|
+
for (let i = 0; i < count; i++) {
|
|
59
|
+
hops.push(OriginSchema.parse(await r.u62()));
|
|
69
60
|
}
|
|
61
|
+
return hops;
|
|
70
62
|
}
|
|
71
|
-
return new Announce({ suffix, active, hops });
|
|
72
63
|
}
|
|
73
|
-
|
|
74
|
-
|
|
64
|
+
}
|
|
65
|
+
// The route cost rides lite-06+ announcements as a single varint; older
|
|
66
|
+
// versions carry nothing and decode as zero.
|
|
67
|
+
async function encodeRouteCost(w, version, cost) {
|
|
68
|
+
if (!hasRouteCost(version))
|
|
69
|
+
return;
|
|
70
|
+
await w.u62(cost ?? 0n);
|
|
71
|
+
}
|
|
72
|
+
async function decodeRouteCost(r, version) {
|
|
73
|
+
if (!hasRouteCost(version))
|
|
74
|
+
return 0n;
|
|
75
|
+
return await r.u62();
|
|
76
|
+
}
|
|
77
|
+
// lite-06 message body (no discriminator; the type is carried outside the length prefix).
|
|
78
|
+
async function encodeAnnounce06Body(w, msg, version) {
|
|
79
|
+
switch (msg.status) {
|
|
80
|
+
case "active":
|
|
81
|
+
await w.string(Path.encode(msg.suffix));
|
|
82
|
+
await encodeHops(w, version, msg.hops);
|
|
83
|
+
await encodeRouteCost(w, version, msg.cost);
|
|
84
|
+
break;
|
|
85
|
+
case "endedId":
|
|
86
|
+
await w.u62(msg.id);
|
|
87
|
+
break;
|
|
88
|
+
case "restart":
|
|
89
|
+
await w.u62(msg.id);
|
|
90
|
+
await encodeHops(w, version, msg.hops);
|
|
91
|
+
await encodeRouteCost(w, version, msg.cost);
|
|
92
|
+
break;
|
|
93
|
+
case "ended":
|
|
94
|
+
// The pre-lite-06 path-form retraction has no place on lite-06.
|
|
95
|
+
throw new Error("ended-by-path not supported for this version");
|
|
75
96
|
}
|
|
76
|
-
|
|
77
|
-
|
|
97
|
+
}
|
|
98
|
+
// lite-06 outer message type for a given announcement.
|
|
99
|
+
function announce06Type(msg) {
|
|
100
|
+
switch (msg.status) {
|
|
101
|
+
case "active":
|
|
102
|
+
return ANNOUNCE_START;
|
|
103
|
+
case "endedId":
|
|
104
|
+
return ANNOUNCE_END;
|
|
105
|
+
case "restart":
|
|
106
|
+
return ANNOUNCE_RESTART;
|
|
107
|
+
case "ended":
|
|
108
|
+
throw new Error("ended-by-path not supported for this version");
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
async function decodeAnnounce06Body(r, typ, version) {
|
|
112
|
+
switch (typ) {
|
|
113
|
+
case ANNOUNCE_START: {
|
|
114
|
+
const suffix = Path.decode(await r.string());
|
|
115
|
+
const hops = await decodeHops(r, version);
|
|
116
|
+
return { status: "active", suffix, hops, cost: await decodeRouteCost(r, version) };
|
|
117
|
+
}
|
|
118
|
+
case ANNOUNCE_END:
|
|
119
|
+
return { status: "endedId", id: await r.u62() };
|
|
120
|
+
case ANNOUNCE_RESTART: {
|
|
121
|
+
const id = await r.u62();
|
|
122
|
+
const hops = await decodeHops(r, version);
|
|
123
|
+
return { status: "restart", id, hops, cost: await decodeRouteCost(r, version) };
|
|
124
|
+
}
|
|
125
|
+
default:
|
|
126
|
+
throw new Error(`unknown announce message type: ${typ}`);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
// Pre-lite-06 single ANNOUNCE_BROADCAST body: an inner status byte, then path + hops.
|
|
130
|
+
async function encodeLegacyBody(w, msg, version) {
|
|
131
|
+
switch (msg.status) {
|
|
132
|
+
case "active":
|
|
133
|
+
await w.u8(STATUS_ACTIVE);
|
|
134
|
+
await w.string(Path.encode(msg.suffix));
|
|
135
|
+
await encodeHops(w, version, msg.hops);
|
|
136
|
+
break;
|
|
137
|
+
case "ended":
|
|
138
|
+
await w.u8(STATUS_ENDED);
|
|
139
|
+
await w.string(Path.encode(msg.suffix));
|
|
140
|
+
await encodeHops(w, version, []);
|
|
141
|
+
break;
|
|
142
|
+
case "endedId":
|
|
143
|
+
case "restart":
|
|
144
|
+
// The id-referencing forms only exist on lite-06+.
|
|
145
|
+
throw new Error("announce ids not supported for this version");
|
|
78
146
|
}
|
|
79
|
-
|
|
80
|
-
|
|
147
|
+
}
|
|
148
|
+
async function decodeLegacyBody(r, version) {
|
|
149
|
+
const status = await r.u8();
|
|
150
|
+
// On lite-05 a restart travels as a duplicate `active`, but the explicit restart
|
|
151
|
+
// status is accepted on decode and treated the same. Older versions never defined it.
|
|
152
|
+
const active = status === STATUS_ACTIVE || (status === STATUS_RESTART && hasAnnounceOk(version));
|
|
153
|
+
if (status !== STATUS_ENDED && !active) {
|
|
154
|
+
throw new Error("invalid announce status");
|
|
155
|
+
}
|
|
156
|
+
const suffix = Path.decode(await r.string());
|
|
157
|
+
const hops = await decodeHops(r, version);
|
|
158
|
+
return active ? { status: "active", suffix, hops } : { status: "ended", suffix };
|
|
159
|
+
}
|
|
160
|
+
/** Encode one announcement, including its type discriminator (lite-06+) and length prefix. */
|
|
161
|
+
export async function encodeAnnounceBroadcast(w, msg, version) {
|
|
162
|
+
if (hasAnnounceId(version)) {
|
|
163
|
+
// lite-06+: outer type discriminator, then a size-prefixed body (like the subscribe stream).
|
|
164
|
+
await w.u53(announce06Type(msg));
|
|
165
|
+
return Message.encode(w, (w) => encodeAnnounce06Body(w, msg, version));
|
|
166
|
+
}
|
|
167
|
+
return Message.encode(w, (w) => encodeLegacyBody(w, msg, version));
|
|
168
|
+
}
|
|
169
|
+
/** Decode one announcement, including its type discriminator (lite-06+) and length prefix. */
|
|
170
|
+
export async function decodeAnnounceBroadcast(r, version) {
|
|
171
|
+
if (hasAnnounceId(version)) {
|
|
172
|
+
const typ = await r.u53();
|
|
173
|
+
return Message.decode(r, (r) => decodeAnnounce06Body(r, typ, version));
|
|
81
174
|
}
|
|
175
|
+
return Message.decode(r, (r) => decodeLegacyBody(r, version));
|
|
82
176
|
}
|
|
83
|
-
|
|
177
|
+
/** Like {@link decodeAnnounceBroadcast} but resolves `undefined` on a clean FIN. */
|
|
178
|
+
export async function decodeAnnounceBroadcastMaybe(r, version) {
|
|
179
|
+
if (hasAnnounceId(version)) {
|
|
180
|
+
if (await r.done())
|
|
181
|
+
return undefined;
|
|
182
|
+
const typ = await r.u53();
|
|
183
|
+
return Message.decode(r, (r) => decodeAnnounce06Body(r, typ, version));
|
|
184
|
+
}
|
|
185
|
+
return Message.decodeMaybe(r, (r) => decodeLegacyBody(r, version));
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* ANNOUNCE_REQUEST: sent by the subscriber to request ANNOUNCE_BROADCAST messages
|
|
189
|
+
* for a path prefix. Renamed from `AnnounceInterest` in lite-05.
|
|
190
|
+
*/
|
|
191
|
+
export class AnnounceRequest {
|
|
84
192
|
prefix;
|
|
85
|
-
|
|
86
|
-
|
|
193
|
+
/** Lite04/05 only: the 62-bit Origin id of the peer asking for announces, which the
|
|
194
|
+
* publisher uses to skip announces that already passed through it. Zero means "no
|
|
195
|
+
* exclusion". Not on the wire elsewhere, so a value set here is ignored when encoding
|
|
196
|
+
* for another version and decodes as zero.
|
|
197
|
+
*
|
|
198
|
+
* Must be a bigint: peer origins are up to 62 bits and overflow u53. */
|
|
87
199
|
excludeHop;
|
|
88
200
|
constructor(prefix, excludeHop = 0n) {
|
|
89
201
|
this.prefix = prefix;
|
|
@@ -91,36 +203,20 @@ export class AnnounceInterest {
|
|
|
91
203
|
}
|
|
92
204
|
async #encode(w, version) {
|
|
93
205
|
await w.string(Path.encode(this.prefix));
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
case Version.DRAFT_02:
|
|
97
|
-
case Version.DRAFT_03:
|
|
98
|
-
break;
|
|
99
|
-
default:
|
|
100
|
-
// Lite04+: exclude_hop field (u62 varint).
|
|
101
|
-
await w.u62(this.excludeHop);
|
|
102
|
-
break;
|
|
206
|
+
if (hasExcludeHop(version)) {
|
|
207
|
+
await w.u62(this.excludeHop);
|
|
103
208
|
}
|
|
104
209
|
}
|
|
105
210
|
static async #decode(r, version) {
|
|
106
211
|
const prefix = Path.decode(await r.string());
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
case Version.DRAFT_01:
|
|
110
|
-
case Version.DRAFT_02:
|
|
111
|
-
case Version.DRAFT_03:
|
|
112
|
-
break;
|
|
113
|
-
default:
|
|
114
|
-
excludeHop = await r.u62();
|
|
115
|
-
break;
|
|
116
|
-
}
|
|
117
|
-
return new AnnounceInterest(prefix, excludeHop);
|
|
212
|
+
const excludeHop = hasExcludeHop(version) ? await r.u62() : 0n;
|
|
213
|
+
return new AnnounceRequest(prefix, excludeHop);
|
|
118
214
|
}
|
|
119
215
|
async encode(w, version) {
|
|
120
216
|
return Message.encode(w, (w) => this.#encode(w, version));
|
|
121
217
|
}
|
|
122
218
|
static async decode(r, version) {
|
|
123
|
-
return Message.decode(r, (r) =>
|
|
219
|
+
return Message.decode(r, (r) => AnnounceRequest.#decode(r, version));
|
|
124
220
|
}
|
|
125
221
|
}
|
|
126
222
|
/// Sent after setup to communicate the initially announced paths.
|
|
@@ -163,4 +259,44 @@ export class AnnounceInit {
|
|
|
163
259
|
return Message.decode(r, AnnounceInit.#decode);
|
|
164
260
|
}
|
|
165
261
|
}
|
|
262
|
+
/// Sent by the publisher as the first message on an announce stream, before any
|
|
263
|
+
/// individual Announce messages. Lite05+ only; the successor to AnnounceInit.
|
|
264
|
+
///
|
|
265
|
+
/// `origin` is the responder's origin id, which the subscriber stamps onto each
|
|
266
|
+
/// announce's hop chain (the publisher no longer stamps itself), or the reserved
|
|
267
|
+
/// {@link UNKNOWN_ORIGIN} when the responder has no identity to give. `active` is
|
|
268
|
+
/// the number of initial Announce messages that follow immediately.
|
|
269
|
+
export class AnnounceOk {
|
|
270
|
+
origin;
|
|
271
|
+
active;
|
|
272
|
+
constructor(origin, active) {
|
|
273
|
+
this.origin = origin;
|
|
274
|
+
this.active = active;
|
|
275
|
+
}
|
|
276
|
+
static #guard(version) {
|
|
277
|
+
if (!hasAnnounceOk(version)) {
|
|
278
|
+
throw new Error("announce ok not supported for this version");
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
async #encode(w) {
|
|
282
|
+
await w.u62(this.origin);
|
|
283
|
+
await w.u53(this.active);
|
|
284
|
+
}
|
|
285
|
+
static async #decode(r) {
|
|
286
|
+
// The draft reserves 0 for "unknown": the responder was never assigned an id, or
|
|
287
|
+
// withholds it to obscure its routing. It names nobody, so callers must not stamp
|
|
288
|
+
// it onto a hop chain, but it is a legal message and not grounds to drop the stream.
|
|
289
|
+
const origin = OriginSchema.parse(await r.u62());
|
|
290
|
+
const active = await r.u53();
|
|
291
|
+
return new AnnounceOk(origin, active);
|
|
292
|
+
}
|
|
293
|
+
async encode(w, version) {
|
|
294
|
+
AnnounceOk.#guard(version);
|
|
295
|
+
return Message.encode(w, this.#encode.bind(this));
|
|
296
|
+
}
|
|
297
|
+
static async decode(r, version) {
|
|
298
|
+
AnnounceOk.#guard(version);
|
|
299
|
+
return Message.decode(r, AnnounceOk.#decode);
|
|
300
|
+
}
|
|
301
|
+
}
|
|
166
302
|
//# sourceMappingURL=announce.js.map
|
package/lite/announce.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"announce.js","sourceRoot":"","sources":["../../src/lite/announce.ts"],"names":[],"mappings":"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","sourcesContent":["import * as Path from \"../path.ts\";\nimport type { Reader, Writer } from \"../stream.ts\";\nimport * as Message from \"./message.ts\";\nimport { type Origin, OriginSchema } from \"./origin.ts\";\nimport { Version } from \"./version.ts\";\n\n// Must match the MAX_HOPS in Rust's model/origin.rs. Broadcasts with longer\n// hop chains are rejected; this keeps loop-detection bounded and rejects\n// pathological announcements across clusters with unbounded forwarding.\nexport const MAX_HOPS = 32;\n\nexport class Announce {\n\tsuffix: Path.Valid;\n\tactive: boolean;\n\thops: Origin[];\n\n\tconstructor(props: { suffix: Path.Valid; active: boolean; hops?: Origin[] }) {\n\t\tthis.suffix = props.suffix;\n\t\tthis.active = props.active;\n\t\tthis.hops = props.hops ?? [];\n\t\tif (this.hops.length > MAX_HOPS) {\n\t\t\tthrow new Error(`hop count ${this.hops.length} exceeds maximum ${MAX_HOPS}`);\n\t\t}\n\t}\n\n\tasync #encode(w: Writer, version: Version) {\n\t\tawait w.bool(this.active);\n\t\tawait w.string(Path.encode(this.suffix));\n\n\t\tswitch (version) {\n\t\t\tcase Version.DRAFT_01:\n\t\t\tcase Version.DRAFT_02:\n\t\t\t\tbreak;\n\t\t\tcase Version.DRAFT_03:\n\t\t\t\tawait w.u53(this.hops.length);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\t// Lite04+: hop count + individual Origin varints.\n\t\t\t\tawait w.u53(this.hops.length);\n\t\t\t\tfor (const origin of this.hops) {\n\t\t\t\t\tawait w.u62(origin);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tstatic async #decode(r: Reader, version: Version): Promise<Announce> {\n\t\tconst active = await r.bool();\n\t\tconst suffix = Path.decode(await r.string());\n\n\t\tlet hops: Origin[] = [];\n\t\tswitch (version) {\n\t\t\tcase Version.DRAFT_01:\n\t\t\tcase Version.DRAFT_02:\n\t\t\t\tbreak;\n\t\t\tcase Version.DRAFT_03: {\n\t\t\t\tconst count = await r.u53();\n\t\t\t\tif (count > MAX_HOPS) throw new Error(`hop count ${count} exceeds maximum ${MAX_HOPS}`);\n\t\t\t\t// Lite03 carries only a hop count, not individual ids. Fill with\n\t\t\t\t// the zero placeholder (OriginSchema accepts 0 as valid on-wire).\n\t\t\t\tconst placeholder = OriginSchema.parse(0n);\n\t\t\t\thops = new Array<Origin>(count).fill(placeholder);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\t// Lite04+: hop count + individual Origin varints.\n\t\t\t\tconst count = await r.u53();\n\t\t\t\tif (count > MAX_HOPS) throw new Error(`hop count ${count} exceeds maximum ${MAX_HOPS}`);\n\t\t\t\thops = [];\n\t\t\t\tfor (let i = 0; i < count; i++) {\n\t\t\t\t\thops.push(OriginSchema.parse(await r.u62()));\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\treturn new Announce({ suffix, active, hops });\n\t}\n\n\tasync encode(w: Writer, version: Version): Promise<void> {\n\t\treturn Message.encode(w, (w) => this.#encode(w, version));\n\t}\n\n\tstatic async decode(r: Reader, version: Version): Promise<Announce> {\n\t\treturn Message.decode(r, (r) => Announce.#decode(r, version));\n\t}\n\n\tstatic async decodeMaybe(r: Reader, version: Version): Promise<Announce | undefined> {\n\t\treturn Message.decodeMaybe(r, (r) => Announce.#decode(r, version));\n\t}\n}\n\nexport class AnnounceInterest {\n\tprefix: Path.Valid;\n\t// 62-bit Origin id of the peer asking for announces. Zero means \"no exclusion\".\n\t// Must be a bigint: peer origins are up to 62 bits and overflow u53.\n\texcludeHop: bigint;\n\n\tconstructor(prefix: Path.Valid, excludeHop: bigint = 0n) {\n\t\tthis.prefix = prefix;\n\t\tthis.excludeHop = excludeHop;\n\t}\n\n\tasync #encode(w: Writer, version: Version) {\n\t\tawait w.string(Path.encode(this.prefix));\n\t\tswitch (version) {\n\t\t\tcase Version.DRAFT_01:\n\t\t\tcase Version.DRAFT_02:\n\t\t\tcase Version.DRAFT_03:\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\t// Lite04+: exclude_hop field (u62 varint).\n\t\t\t\tawait w.u62(this.excludeHop);\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tstatic async #decode(r: Reader, version: Version): Promise<AnnounceInterest> {\n\t\tconst prefix = Path.decode(await r.string());\n\t\tlet excludeHop = 0n;\n\t\tswitch (version) {\n\t\t\tcase Version.DRAFT_01:\n\t\t\tcase Version.DRAFT_02:\n\t\t\tcase Version.DRAFT_03:\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\texcludeHop = await r.u62();\n\t\t\t\tbreak;\n\t\t}\n\t\treturn new AnnounceInterest(prefix, excludeHop);\n\t}\n\n\tasync encode(w: Writer, version: Version): Promise<void> {\n\t\treturn Message.encode(w, (w) => this.#encode(w, version));\n\t}\n\n\tstatic async decode(r: Reader, version: Version): Promise<AnnounceInterest> {\n\t\treturn Message.decode(r, (r) => AnnounceInterest.#decode(r, version));\n\t}\n}\n\n/// Sent after setup to communicate the initially announced paths.\n///\n/// Used by Draft01/Draft02 only. Draft03+ uses individual Announce messages instead.\nexport class AnnounceInit {\n\tsuffixes: Path.Valid[];\n\n\tconstructor(paths: Path.Valid[]) {\n\t\tthis.suffixes = paths;\n\t}\n\n\tstatic #guard(version: Version) {\n\t\tswitch (version) {\n\t\t\tcase Version.DRAFT_01:\n\t\t\tcase Version.DRAFT_02:\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tthrow new Error(\"announce init not supported for this version\");\n\t\t}\n\t}\n\n\tasync #encode(w: Writer) {\n\t\tawait w.u53(this.suffixes.length);\n\t\tfor (const path of this.suffixes) {\n\t\t\tawait w.string(Path.encode(path));\n\t\t}\n\t}\n\n\tstatic async #decode(r: Reader): Promise<AnnounceInit> {\n\t\tconst count = await r.u53();\n\t\tconst suffixes: Path.Valid[] = [];\n\t\tfor (let i = 0; i < count; i++) {\n\t\t\tsuffixes.push(Path.decode(await r.string()));\n\t\t}\n\t\treturn new AnnounceInit(suffixes);\n\t}\n\n\tasync encode(w: Writer, version: Version): Promise<void> {\n\t\tAnnounceInit.#guard(version);\n\t\treturn Message.encode(w, this.#encode.bind(this));\n\t}\n\n\tstatic async decode(r: Reader, version: Version): Promise<AnnounceInit> {\n\t\tAnnounceInit.#guard(version);\n\t\treturn Message.decode(r, AnnounceInit.#decode);\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"announce.js","sourceRoot":"","sources":["../../src/lite/announce.ts"],"names":[],"mappings":"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","sourcesContent":["import { MAX_HOPS, type Origin, OriginSchema, UNKNOWN_ORIGIN } from \"../origin.ts\";\nimport * as Path from \"../path.ts\";\nimport type { Reader, Writer } from \"../stream.ts\";\nimport * as Message from \"./message.ts\";\nimport { hasAnnounceId, hasAnnounceOk, hasExcludeHop, hasRouteCost, Version } from \"./version.ts\";\n\n// Pre-lite-06 inner status values, carried inside the single ANNOUNCE_BROADCAST body.\nconst STATUS_ENDED = 0;\nconst STATUS_ACTIVE = 1;\nconst STATUS_RESTART = 2;\n\n// lite-06 announce message types: an outer discriminator carried before the length\n// prefix, so each announcement is an independently-typed, length-delimited message\n// (mirroring SUBSCRIBE_START/END/DROP on the subscribe stream).\nconst ANNOUNCE_START = 0;\nconst ANNOUNCE_END = 1;\nconst ANNOUNCE_RESTART = 2;\n\n/**\n * An announcement on the Announce Stream, advertising or retracting a broadcast.\n *\n * On lite-06+ these are three independently-typed messages (`ANNOUNCE_START`,\n * `ANNOUNCE_END`, `ANNOUNCE_RESTART`), each framed as `Type | Length | Body` like the\n * subscribe stream's responses. Each `active` (ANNOUNCE_START) implicitly assigns the\n * next announce id (a per-stream ordinal starting at 0); `endedId`/`restart` reference\n * that id instead of repeating the path. Older versions send a single ANNOUNCE_BROADCAST\n * message that retracts by path (`ended`).\n */\nexport type AnnounceBroadcast =\n\t/** A broadcast is now available, carrying the path suffix, the hop chain, and\n\t * (lite-06+) the route cost. An absent cost encodes as zero. */\n\t| { status: \"active\"; suffix: Path.Valid; hops: Origin[]; cost?: bigint }\n\t/** Pre-lite-06: a broadcast is no longer available, retracted by path. */\n\t| { status: \"ended\"; suffix: Path.Valid }\n\t/** Lite06+: a broadcast is no longer available, retracted by announce id.\n\t * The id is retired; referencing it again is a protocol violation. */\n\t| { status: \"endedId\"; id: bigint }\n\t/** Lite06+: atomically replace the announcement with this id (e.g. a new hop\n\t * chain after a relay failover, or a route whose cost moved). The id stays live. */\n\t| { status: \"restart\"; id: bigint; hops: Origin[]; cost?: bigint };\n\nfunction checkHops(hops: Origin[]) {\n\tif (hops.length > MAX_HOPS) {\n\t\tthrow new Error(`hop count ${hops.length} exceeds maximum ${MAX_HOPS}`);\n\t}\n}\n\nasync function encodeHops(w: Writer, version: Version, hops: Origin[]) {\n\tcheckHops(hops);\n\tswitch (version) {\n\t\tcase Version.DRAFT_01:\n\t\tcase Version.DRAFT_02:\n\t\t\tbreak;\n\t\tcase Version.DRAFT_03:\n\t\t\tawait w.u53(hops.length);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\t// Lite04+: hop count + individual Origin varints.\n\t\t\tawait w.u53(hops.length);\n\t\t\tfor (const origin of hops) {\n\t\t\t\tawait w.u62(origin);\n\t\t\t}\n\t\t\tbreak;\n\t}\n}\n\nasync function decodeHops(r: Reader, version: Version): Promise<Origin[]> {\n\tswitch (version) {\n\t\tcase Version.DRAFT_01:\n\t\tcase Version.DRAFT_02:\n\t\t\treturn [];\n\t\tcase Version.DRAFT_03: {\n\t\t\tconst count = await r.u53();\n\t\t\tif (count > MAX_HOPS) throw new Error(`hop count ${count} exceeds maximum ${MAX_HOPS}`);\n\t\t\t// Lite03 carries only a hop count, not individual ids, so every entry is\n\t\t\t// the reserved \"no identity\" id.\n\t\t\treturn new Array<Origin>(count).fill(UNKNOWN_ORIGIN);\n\t\t}\n\t\tdefault: {\n\t\t\t// Lite04+: hop count + individual Origin varints.\n\t\t\tconst count = await r.u53();\n\t\t\tif (count > MAX_HOPS) throw new Error(`hop count ${count} exceeds maximum ${MAX_HOPS}`);\n\t\t\tconst hops: Origin[] = [];\n\t\t\tfor (let i = 0; i < count; i++) {\n\t\t\t\thops.push(OriginSchema.parse(await r.u62()));\n\t\t\t}\n\t\t\treturn hops;\n\t\t}\n\t}\n}\n\n// The route cost rides lite-06+ announcements as a single varint; older\n// versions carry nothing and decode as zero.\nasync function encodeRouteCost(w: Writer, version: Version, cost: bigint | undefined) {\n\tif (!hasRouteCost(version)) return;\n\tawait w.u62(cost ?? 0n);\n}\n\nasync function decodeRouteCost(r: Reader, version: Version): Promise<bigint> {\n\tif (!hasRouteCost(version)) return 0n;\n\treturn await r.u62();\n}\n\n// lite-06 message body (no discriminator; the type is carried outside the length prefix).\nasync function encodeAnnounce06Body(w: Writer, msg: AnnounceBroadcast, version: Version) {\n\tswitch (msg.status) {\n\t\tcase \"active\":\n\t\t\tawait w.string(Path.encode(msg.suffix));\n\t\t\tawait encodeHops(w, version, msg.hops);\n\t\t\tawait encodeRouteCost(w, version, msg.cost);\n\t\t\tbreak;\n\t\tcase \"endedId\":\n\t\t\tawait w.u62(msg.id);\n\t\t\tbreak;\n\t\tcase \"restart\":\n\t\t\tawait w.u62(msg.id);\n\t\t\tawait encodeHops(w, version, msg.hops);\n\t\t\tawait encodeRouteCost(w, version, msg.cost);\n\t\t\tbreak;\n\t\tcase \"ended\":\n\t\t\t// The pre-lite-06 path-form retraction has no place on lite-06.\n\t\t\tthrow new Error(\"ended-by-path not supported for this version\");\n\t}\n}\n\n// lite-06 outer message type for a given announcement.\nfunction announce06Type(msg: AnnounceBroadcast): number {\n\tswitch (msg.status) {\n\t\tcase \"active\":\n\t\t\treturn ANNOUNCE_START;\n\t\tcase \"endedId\":\n\t\t\treturn ANNOUNCE_END;\n\t\tcase \"restart\":\n\t\t\treturn ANNOUNCE_RESTART;\n\t\tcase \"ended\":\n\t\t\tthrow new Error(\"ended-by-path not supported for this version\");\n\t}\n}\n\nasync function decodeAnnounce06Body(r: Reader, typ: number, version: Version): Promise<AnnounceBroadcast> {\n\tswitch (typ) {\n\t\tcase ANNOUNCE_START: {\n\t\t\tconst suffix = Path.decode(await r.string());\n\t\t\tconst hops = await decodeHops(r, version);\n\t\t\treturn { status: \"active\", suffix, hops, cost: await decodeRouteCost(r, version) };\n\t\t}\n\t\tcase ANNOUNCE_END:\n\t\t\treturn { status: \"endedId\", id: await r.u62() };\n\t\tcase ANNOUNCE_RESTART: {\n\t\t\tconst id = await r.u62();\n\t\t\tconst hops = await decodeHops(r, version);\n\t\t\treturn { status: \"restart\", id, hops, cost: await decodeRouteCost(r, version) };\n\t\t}\n\t\tdefault:\n\t\t\tthrow new Error(`unknown announce message type: ${typ}`);\n\t}\n}\n\n// Pre-lite-06 single ANNOUNCE_BROADCAST body: an inner status byte, then path + hops.\nasync function encodeLegacyBody(w: Writer, msg: AnnounceBroadcast, version: Version) {\n\tswitch (msg.status) {\n\t\tcase \"active\":\n\t\t\tawait w.u8(STATUS_ACTIVE);\n\t\t\tawait w.string(Path.encode(msg.suffix));\n\t\t\tawait encodeHops(w, version, msg.hops);\n\t\t\tbreak;\n\t\tcase \"ended\":\n\t\t\tawait w.u8(STATUS_ENDED);\n\t\t\tawait w.string(Path.encode(msg.suffix));\n\t\t\tawait encodeHops(w, version, []);\n\t\t\tbreak;\n\t\tcase \"endedId\":\n\t\tcase \"restart\":\n\t\t\t// The id-referencing forms only exist on lite-06+.\n\t\t\tthrow new Error(\"announce ids not supported for this version\");\n\t}\n}\n\nasync function decodeLegacyBody(r: Reader, version: Version): Promise<AnnounceBroadcast> {\n\tconst status = await r.u8();\n\t// On lite-05 a restart travels as a duplicate `active`, but the explicit restart\n\t// status is accepted on decode and treated the same. Older versions never defined it.\n\tconst active = status === STATUS_ACTIVE || (status === STATUS_RESTART && hasAnnounceOk(version));\n\tif (status !== STATUS_ENDED && !active) {\n\t\tthrow new Error(\"invalid announce status\");\n\t}\n\tconst suffix = Path.decode(await r.string());\n\tconst hops = await decodeHops(r, version);\n\treturn active ? { status: \"active\", suffix, hops } : { status: \"ended\", suffix };\n}\n\n/** Encode one announcement, including its type discriminator (lite-06+) and length prefix. */\nexport async function encodeAnnounceBroadcast(w: Writer, msg: AnnounceBroadcast, version: Version): Promise<void> {\n\tif (hasAnnounceId(version)) {\n\t\t// lite-06+: outer type discriminator, then a size-prefixed body (like the subscribe stream).\n\t\tawait w.u53(announce06Type(msg));\n\t\treturn Message.encode(w, (w) => encodeAnnounce06Body(w, msg, version));\n\t}\n\treturn Message.encode(w, (w) => encodeLegacyBody(w, msg, version));\n}\n\n/** Decode one announcement, including its type discriminator (lite-06+) and length prefix. */\nexport async function decodeAnnounceBroadcast(r: Reader, version: Version): Promise<AnnounceBroadcast> {\n\tif (hasAnnounceId(version)) {\n\t\tconst typ = await r.u53();\n\t\treturn Message.decode(r, (r) => decodeAnnounce06Body(r, typ, version));\n\t}\n\treturn Message.decode(r, (r) => decodeLegacyBody(r, version));\n}\n\n/** Like {@link decodeAnnounceBroadcast} but resolves `undefined` on a clean FIN. */\nexport async function decodeAnnounceBroadcastMaybe(\n\tr: Reader,\n\tversion: Version,\n): Promise<AnnounceBroadcast | undefined> {\n\tif (hasAnnounceId(version)) {\n\t\tif (await r.done()) return undefined;\n\t\tconst typ = await r.u53();\n\t\treturn Message.decode(r, (r) => decodeAnnounce06Body(r, typ, version));\n\t}\n\treturn Message.decodeMaybe(r, (r) => decodeLegacyBody(r, version));\n}\n\n/**\n * ANNOUNCE_REQUEST: sent by the subscriber to request ANNOUNCE_BROADCAST messages\n * for a path prefix. Renamed from `AnnounceInterest` in lite-05.\n */\nexport class AnnounceRequest {\n\tprefix: Path.Valid;\n\t/** Lite04/05 only: the 62-bit Origin id of the peer asking for announces, which the\n\t * publisher uses to skip announces that already passed through it. Zero means \"no\n\t * exclusion\". Not on the wire elsewhere, so a value set here is ignored when encoding\n\t * for another version and decodes as zero.\n\t *\n\t * Must be a bigint: peer origins are up to 62 bits and overflow u53. */\n\texcludeHop: bigint;\n\n\tconstructor(prefix: Path.Valid, excludeHop: bigint = 0n) {\n\t\tthis.prefix = prefix;\n\t\tthis.excludeHop = excludeHop;\n\t}\n\n\tasync #encode(w: Writer, version: Version) {\n\t\tawait w.string(Path.encode(this.prefix));\n\t\tif (hasExcludeHop(version)) {\n\t\t\tawait w.u62(this.excludeHop);\n\t\t}\n\t}\n\n\tstatic async #decode(r: Reader, version: Version): Promise<AnnounceRequest> {\n\t\tconst prefix = Path.decode(await r.string());\n\t\tconst excludeHop = hasExcludeHop(version) ? await r.u62() : 0n;\n\t\treturn new AnnounceRequest(prefix, excludeHop);\n\t}\n\n\tasync encode(w: Writer, version: Version): Promise<void> {\n\t\treturn Message.encode(w, (w) => this.#encode(w, version));\n\t}\n\n\tstatic async decode(r: Reader, version: Version): Promise<AnnounceRequest> {\n\t\treturn Message.decode(r, (r) => AnnounceRequest.#decode(r, version));\n\t}\n}\n\n/// Sent after setup to communicate the initially announced paths.\n///\n/// Used by Draft01/Draft02 only. Draft03+ uses individual Announce messages instead.\nexport class AnnounceInit {\n\tsuffixes: Path.Valid[];\n\n\tconstructor(paths: Path.Valid[]) {\n\t\tthis.suffixes = paths;\n\t}\n\n\tstatic #guard(version: Version) {\n\t\tswitch (version) {\n\t\t\tcase Version.DRAFT_01:\n\t\t\tcase Version.DRAFT_02:\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tthrow new Error(\"announce init not supported for this version\");\n\t\t}\n\t}\n\n\tasync #encode(w: Writer) {\n\t\tawait w.u53(this.suffixes.length);\n\t\tfor (const path of this.suffixes) {\n\t\t\tawait w.string(Path.encode(path));\n\t\t}\n\t}\n\n\tstatic async #decode(r: Reader): Promise<AnnounceInit> {\n\t\tconst count = await r.u53();\n\t\tconst suffixes: Path.Valid[] = [];\n\t\tfor (let i = 0; i < count; i++) {\n\t\t\tsuffixes.push(Path.decode(await r.string()));\n\t\t}\n\t\treturn new AnnounceInit(suffixes);\n\t}\n\n\tasync encode(w: Writer, version: Version): Promise<void> {\n\t\tAnnounceInit.#guard(version);\n\t\treturn Message.encode(w, this.#encode.bind(this));\n\t}\n\n\tstatic async decode(r: Reader, version: Version): Promise<AnnounceInit> {\n\t\tAnnounceInit.#guard(version);\n\t\treturn Message.decode(r, AnnounceInit.#decode);\n\t}\n}\n\n/// Sent by the publisher as the first message on an announce stream, before any\n/// individual Announce messages. Lite05+ only; the successor to AnnounceInit.\n///\n/// `origin` is the responder's origin id, which the subscriber stamps onto each\n/// announce's hop chain (the publisher no longer stamps itself), or the reserved\n/// {@link UNKNOWN_ORIGIN} when the responder has no identity to give. `active` is\n/// the number of initial Announce messages that follow immediately.\nexport class AnnounceOk {\n\torigin: Origin;\n\tactive: number;\n\n\tconstructor(origin: Origin, active: number) {\n\t\tthis.origin = origin;\n\t\tthis.active = active;\n\t}\n\n\tstatic #guard(version: Version) {\n\t\tif (!hasAnnounceOk(version)) {\n\t\t\tthrow new Error(\"announce ok not supported for this version\");\n\t\t}\n\t}\n\n\tasync #encode(w: Writer) {\n\t\tawait w.u62(this.origin);\n\t\tawait w.u53(this.active);\n\t}\n\n\tstatic async #decode(r: Reader): Promise<AnnounceOk> {\n\t\t// The draft reserves 0 for \"unknown\": the responder was never assigned an id, or\n\t\t// withholds it to obscure its routing. It names nobody, so callers must not stamp\n\t\t// it onto a hop chain, but it is a legal message and not grounds to drop the stream.\n\t\tconst origin = OriginSchema.parse(await r.u62());\n\t\tconst active = await r.u53();\n\t\treturn new AnnounceOk(origin, active);\n\t}\n\n\tasync encode(w: Writer, version: Version): Promise<void> {\n\t\tAnnounceOk.#guard(version);\n\t\treturn Message.encode(w, this.#encode.bind(this));\n\t}\n\n\tstatic async decode(r: Reader, version: Version): Promise<AnnounceOk> {\n\t\tAnnounceOk.#guard(version);\n\t\treturn Message.decode(r, AnnounceOk.#decode);\n\t}\n}\n"]}
|
package/lite/connection.d.ts
CHANGED
|
@@ -1,13 +1,31 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import
|
|
3
|
-
import
|
|
4
|
-
import type { Broadcast } from "../broadcast";
|
|
1
|
+
import { type Getter } from "@norskvideo/moq-signals";
|
|
2
|
+
import * as announce from "../announced";
|
|
3
|
+
import type * as broadcast from "../broadcast";
|
|
5
4
|
import type { Established } from "../connection/established";
|
|
5
|
+
import { type Probe, type Stats } from "../connection/stats";
|
|
6
|
+
import { type Transport } from "../connection/transport";
|
|
7
|
+
import { type Origin } from "../origin";
|
|
6
8
|
import * as Path from "../path";
|
|
7
9
|
import { Stream } from "../stream";
|
|
8
|
-
import type
|
|
9
|
-
import { type
|
|
10
|
-
|
|
10
|
+
import { ProbeLevel, type Role } from "./setup";
|
|
11
|
+
import { type Version } from "./version";
|
|
12
|
+
/**
|
|
13
|
+
* Constructor options for {@link Connection}.
|
|
14
|
+
*
|
|
15
|
+
* @internal
|
|
16
|
+
*/
|
|
17
|
+
export interface ConnectionProps {
|
|
18
|
+
/** The URL of the connection. */
|
|
19
|
+
url: URL;
|
|
20
|
+
/** The established WebTransport session. */
|
|
21
|
+
quic: WebTransport;
|
|
22
|
+
/** The negotiated wire version. */
|
|
23
|
+
version: Version;
|
|
24
|
+
/** The session stream, absent on drafts that have none. */
|
|
25
|
+
session?: Stream;
|
|
26
|
+
/** Whether the relay supports broadcast discovery. Defaults to true. */
|
|
27
|
+
discovery?: boolean;
|
|
28
|
+
}
|
|
11
29
|
/**
|
|
12
30
|
* Represents a connection to a MoQ server.
|
|
13
31
|
*
|
|
@@ -17,31 +35,62 @@ export declare class Connection implements Established {
|
|
|
17
35
|
#private;
|
|
18
36
|
readonly url: URL;
|
|
19
37
|
readonly version: string;
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
readonly rtt?: Signal<Time.Milli | undefined>;
|
|
38
|
+
readonly transport: Transport;
|
|
39
|
+
/** Whether the relay supports broadcast discovery; see {@link Established.discovery}. */
|
|
40
|
+
readonly discovery: boolean;
|
|
41
|
+
/** The peer's PROBE estimates; see {@link Established.probe}. */
|
|
42
|
+
readonly probe: Getter<Probe>;
|
|
26
43
|
/** Random per-connection origin id. Shared by Publisher (for outbound hop
|
|
27
44
|
* chains) and Subscriber (available for optional self-filtering on announces). */
|
|
28
45
|
readonly origin: Origin;
|
|
46
|
+
/**
|
|
47
|
+
* The {@link Role} the peer advertised in its SETUP, for a server deciding whether the
|
|
48
|
+
* peer's authorization grants the direction it intends to use.
|
|
49
|
+
*
|
|
50
|
+
* `undefined` until the peer's SETUP arrives, and forever on pre-lite-05 versions, which
|
|
51
|
+
* carry no in-band role. {@link Role.Both} is the absence of the parameter, so it is what
|
|
52
|
+
* a peer reports when it declines to declare a direction, sends a value we don't
|
|
53
|
+
* recognize, or is a server (which never sends one).
|
|
54
|
+
*/
|
|
55
|
+
get peerRole(): Getter<Role | undefined>;
|
|
29
56
|
/**
|
|
30
57
|
* Creates a new Connection instance.
|
|
31
|
-
* @param url - The URL of the connection
|
|
32
|
-
* @param quic - The WebTransport session
|
|
33
|
-
* @param session - The session stream
|
|
34
58
|
*
|
|
35
59
|
* @internal
|
|
36
60
|
*/
|
|
37
|
-
constructor(url
|
|
61
|
+
constructor({ url, quic, version, session, discovery }: ConnectionProps);
|
|
38
62
|
/**
|
|
39
63
|
* Closes the connection.
|
|
40
64
|
*/
|
|
41
65
|
close(): void;
|
|
42
|
-
publish(path: Path.Valid,
|
|
43
|
-
announced(prefix?: Path.Valid):
|
|
44
|
-
consume(
|
|
66
|
+
publish(path: Path.Valid, producer: broadcast.Producer): void;
|
|
67
|
+
announced(prefix?: Path.Valid): announce.Consumer;
|
|
68
|
+
consume(path: Path.Valid): broadcast.Consumer;
|
|
69
|
+
/**
|
|
70
|
+
* Watches a broadcast, live only while it is announced.
|
|
71
|
+
*
|
|
72
|
+
* @param path - The path of the broadcast to watch
|
|
73
|
+
* @returns A reactive handle to the broadcast
|
|
74
|
+
*/
|
|
75
|
+
announcedBroadcast(path: Path.Valid): announce.Broadcast;
|
|
76
|
+
/** Snapshot the transport's counters; see {@link Established.stats}. */
|
|
77
|
+
stats(): Promise<Stats>;
|
|
45
78
|
get closed(): Promise<void>;
|
|
46
79
|
}
|
|
80
|
+
/**
|
|
81
|
+
* The probe level to advertise in SETUP, from what the transport can measure.
|
|
82
|
+
*
|
|
83
|
+
* `Report` claims we can measure and periodically report, so it is only truthful
|
|
84
|
+
* when a metric this version can carry actually exists. The qmux/WebSocket fallback
|
|
85
|
+
* implements no `getStats()` at all, and even a transport that has one may report
|
|
86
|
+
* neither figure. Advertising `Report` and then holding the subscriber's PROBE
|
|
87
|
+
* stream open with nothing to send is the state this avoids; the subscriber's own
|
|
88
|
+
* gate then skips a stream it could not use.
|
|
89
|
+
*
|
|
90
|
+
* Mirrors `ProbeLevel::detect` in `moq-net`, including its limitation: a metric
|
|
91
|
+
* that only appears after SETUP reads as unsupported here.
|
|
92
|
+
*
|
|
93
|
+
* @internal
|
|
94
|
+
*/
|
|
95
|
+
export declare function probeLevel(quic: WebTransport, version: Version): Promise<ProbeLevel>;
|
|
47
96
|
//# sourceMappingURL=connection.d.ts.map
|
package/lite/connection.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../../src/lite/connection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../../src/lite/connection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,MAAM,EAAU,MAAM,cAAc,CAAC;AACnD,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAC;AAC5C,OAAO,KAAK,KAAK,SAAS,MAAM,iBAAiB,CAAC;AAClD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,KAAK,KAAK,EAAE,KAAK,KAAK,EAAkB,MAAM,wBAAwB,CAAC;AAChF,OAAO,EAAE,KAAK,SAAS,EAAe,MAAM,4BAA4B,CAAC;AACzE,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,cAAc,CAAC;AACzD,OAAO,KAAK,IAAI,MAAM,YAAY,CAAC;AACnC,OAAO,EAAwB,MAAM,EAAU,MAAM,cAAc,CAAC;AAOpE,OAAO,EAAE,UAAU,EAAE,KAAK,IAAI,EAAS,MAAM,YAAY,CAAC;AAK1D,OAAO,EAA6C,KAAK,OAAO,EAAe,MAAM,cAAc,CAAC;AAEpG;;;;GAIG;AACH,MAAM,WAAW,eAAe;IAC/B,iCAAiC;IACjC,GAAG,EAAE,GAAG,CAAC;IACT,4CAA4C;IAC5C,IAAI,EAAE,YAAY,CAAC;IACnB,mCAAmC;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,2DAA2D;IAC3D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,wEAAwE;IACxE,SAAS,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;;;GAIG;AACH,qBAAa,UAAW,YAAW,WAAW;;IAE7C,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC;IAGlB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAGzB,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAE9B,yFAAyF;IACzF,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAiB5B,iEAAiE;IACjE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;IAE9B;sFACkF;IAClF,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAcxB;;;;;;;;OAQG;IACH,IAAI,QAAQ,IAAI,MAAM,CAAC,IAAI,GAAG,SAAS,CAAC,CAEvC;IAED;;;;OAIG;IACH,YAAY,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,SAAgB,EAAE,EAAE,eAAe,EAgB7E;IAED;;OAEG;IACH,KAAK,SAUJ;IA0BD,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,SAAS,CAAC,QAAQ,QAErD;IAED,SAAS,CAAC,MAAM,aAAe,GAAG,QAAQ,CAAC,QAAQ,CAElD;IAED,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC,QAAQ,CAE5C;IAED;;;;;OAKG;IACH,kBAAkB,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC,SAAS,CAEvD;IAgHD,wEAAwE;IAClE,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC,CAE5B;IAED,IAAI,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAE1B;CACD;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,UAAU,CAAC,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,CAkB1F"}
|