@moqtap/codec 0.1.1 → 0.2.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 +99 -95
- package/dist/chunk-4RIXXEII.js +1275 -0
- package/dist/chunk-4XYGE53S.cjs +698 -0
- package/dist/chunk-4YJANAXU.cjs +1109 -0
- package/dist/chunk-6AEHWULA.cjs +641 -0
- package/dist/chunk-7DUBLRXC.js +680 -0
- package/dist/{chunk-YBZD3DU5.cjs → chunk-7IVGHMKJ.cjs} +44 -42
- package/dist/chunk-BISI45MN.cjs +680 -0
- package/dist/{chunk-NLYTRGXA.cjs → chunk-BPNL5YFQ.cjs} +5 -5
- package/dist/chunk-CXDHOMHG.js +1097 -0
- package/dist/chunk-DUBCL3WF.cjs +749 -0
- package/dist/chunk-DWK5ZQZ4.js +642 -0
- package/dist/chunk-E6E3NQYU.js +680 -0
- package/dist/chunk-EFM5T7OM.js +698 -0
- package/dist/chunk-ENURAVHI.cjs +680 -0
- package/dist/{chunk-Z66WDWHI.js → chunk-FXZ2MYKJ.js} +127 -1
- package/dist/chunk-G26SJ6XS.cjs +1341 -0
- package/dist/chunk-G7GI7LJA.js +737 -0
- package/dist/chunk-GXEW4COZ.cjs +737 -0
- package/dist/chunk-HSVYF6XX.cjs +1361 -0
- package/dist/chunk-IBVM4DMJ.cjs +1097 -0
- package/dist/chunk-IV2H5CFI.cjs +1275 -0
- package/dist/chunk-IV2HRJVT.js +1198 -0
- package/dist/chunk-JSQM2MG3.js +680 -0
- package/dist/chunk-K4OLITS2.cjs +1055 -0
- package/dist/{chunk-UOBWHJA5.js → chunk-KFTCU2P6.js} +2 -3
- package/dist/chunk-LH4NTURO.js +1361 -0
- package/dist/{chunk-YTXLWKOR.js → chunk-MFAP7R6L.js} +1 -1
- package/dist/chunk-NGVE2RZT.js +1097 -0
- package/dist/chunk-NUX5BHWO.js +1341 -0
- package/dist/chunk-PJRA2TQ5.js +1055 -0
- package/dist/chunk-RVJAGE4S.cjs +1198 -0
- package/dist/{chunk-QYG6KGOV.cjs → chunk-RWQ43Z4F.cjs} +2 -3
- package/dist/chunk-RZHAPEXO.js +749 -0
- package/dist/chunk-ST24APEO.js +1109 -0
- package/dist/chunk-SYHW3FLI.cjs +642 -0
- package/dist/chunk-TLYNOOQP.cjs +432 -0
- package/dist/{chunk-IXHOBNXA.js → chunk-TMNGRIPL.js} +43 -41
- package/dist/chunk-UNS34PTA.cjs +680 -0
- package/dist/chunk-UR6JKS56.js +432 -0
- package/dist/{chunk-NPWHHWXT.cjs → chunk-UYXTY6ZQ.cjs} +127 -1
- package/dist/chunk-XUUCOLWU.cjs +1097 -0
- package/dist/chunk-YG5KJESI.js +641 -0
- package/dist/chunk-ZBKE2QRQ.js +1401 -0
- package/dist/chunk-ZSPO2GF2.cjs +1401 -0
- package/dist/codec-95k8CAu5.d.cts +35 -0
- package/dist/codec-AFuOxfsO.d.ts +60 -0
- package/dist/codec-B-UJ5Iow.d.cts +75 -0
- package/dist/codec-BC5jfvMb.d.ts +35 -0
- package/dist/codec-BECYPfY8.d.ts +35 -0
- package/dist/codec-BsPU1vNC.d.ts +39 -0
- package/dist/codec-BvpuF-6u.d.cts +39 -0
- package/dist/codec-C8jZI5Cx.d.cts +39 -0
- package/dist/codec-CAevkgf5.d.cts +33 -0
- package/dist/codec-CSUqCrRs.d.ts +39 -0
- package/dist/codec-C_HMXNK_.d.ts +33 -0
- package/dist/{codec-Bvr7rFtj.d.cts → codec-CpuvYTSV.d.cts} +1 -1
- package/dist/codec-D0x8-SCw.d.cts +35 -0
- package/dist/codec-D7ARhpG1.d.ts +75 -0
- package/dist/codec-DNAUGshO.d.cts +60 -0
- package/dist/codec-DPx_QNn0.d.ts +31 -0
- package/dist/{codec-B2mc2g3i.d.ts → codec-DRhCx_hw.d.ts} +1 -1
- package/dist/codec-Db7YPe3l.d.ts +31 -0
- package/dist/codec-axkJpb7D.d.cts +31 -0
- package/dist/codec-ujAbFaep.d.cts +31 -0
- package/dist/draft10-session.cjs +6 -0
- package/dist/draft10-session.d.cts +8 -0
- package/dist/draft10-session.d.ts +8 -0
- package/dist/draft10-session.js +6 -0
- package/dist/draft10.cjs +115 -0
- package/dist/draft10.d.cts +95 -0
- package/dist/draft10.d.ts +95 -0
- package/dist/draft10.js +115 -0
- package/dist/draft11-session.cjs +6 -0
- package/dist/draft11-session.d.cts +8 -0
- package/dist/draft11-session.d.ts +8 -0
- package/dist/draft11-session.js +6 -0
- package/dist/draft11.cjs +109 -0
- package/dist/draft11.d.cts +99 -0
- package/dist/draft11.d.ts +99 -0
- package/dist/draft11.js +109 -0
- package/dist/draft12-session.cjs +6 -0
- package/dist/draft12-session.d.cts +8 -0
- package/dist/draft12-session.d.ts +8 -0
- package/dist/draft12-session.js +6 -0
- package/dist/draft12.cjs +117 -0
- package/dist/draft12.d.cts +106 -0
- package/dist/draft12.d.ts +106 -0
- package/dist/draft12.js +117 -0
- package/dist/draft13-session.cjs +6 -0
- package/dist/draft13-session.d.cts +8 -0
- package/dist/draft13-session.d.ts +8 -0
- package/dist/draft13-session.js +6 -0
- package/dist/draft13.cjs +119 -0
- package/dist/draft13.d.cts +108 -0
- package/dist/draft13.d.ts +108 -0
- package/dist/draft13.js +119 -0
- package/dist/draft14-session.cjs +2 -2
- package/dist/draft14-session.d.cts +3 -3
- package/dist/draft14-session.d.ts +3 -3
- package/dist/draft14-session.js +1 -1
- package/dist/draft14.cjs +3 -3
- package/dist/draft14.d.cts +16 -4
- package/dist/draft14.d.ts +16 -4
- package/dist/draft14.js +2 -2
- package/dist/draft15-session.cjs +6 -0
- package/dist/draft15-session.d.cts +8 -0
- package/dist/draft15-session.d.ts +8 -0
- package/dist/draft15-session.js +6 -0
- package/dist/draft15.cjs +111 -0
- package/dist/draft15.d.cts +93 -0
- package/dist/draft15.d.ts +93 -0
- package/dist/draft15.js +111 -0
- package/dist/draft16-session.cjs +6 -0
- package/dist/draft16-session.d.cts +8 -0
- package/dist/draft16-session.d.ts +8 -0
- package/dist/draft16-session.js +6 -0
- package/dist/draft16.cjs +113 -0
- package/dist/draft16.d.cts +94 -0
- package/dist/draft16.d.ts +94 -0
- package/dist/draft16.js +113 -0
- package/dist/draft17-session.cjs +8 -0
- package/dist/draft17-session.d.cts +51 -0
- package/dist/draft17-session.d.ts +51 -0
- package/dist/draft17-session.js +8 -0
- package/dist/draft17.cjs +99 -0
- package/dist/draft17.d.cts +40 -0
- package/dist/draft17.d.ts +40 -0
- package/dist/draft17.js +99 -0
- package/dist/draft7-session.cjs +3 -3
- package/dist/draft7-session.d.cts +3 -3
- package/dist/draft7-session.d.ts +3 -3
- package/dist/draft7-session.js +2 -2
- package/dist/draft7.cjs +4 -4
- package/dist/draft7.d.cts +2 -2
- package/dist/draft7.d.ts +2 -2
- package/dist/draft7.js +2 -2
- package/dist/draft8-session.cjs +6 -0
- package/dist/draft8-session.d.cts +8 -0
- package/dist/draft8-session.d.ts +8 -0
- package/dist/draft8-session.js +6 -0
- package/dist/draft8.cjs +115 -0
- package/dist/draft8.d.cts +95 -0
- package/dist/draft8.d.ts +95 -0
- package/dist/draft8.js +115 -0
- package/dist/draft9-session.cjs +6 -0
- package/dist/draft9-session.d.cts +8 -0
- package/dist/draft9-session.d.ts +8 -0
- package/dist/draft9-session.js +6 -0
- package/dist/draft9.cjs +115 -0
- package/dist/draft9.d.cts +95 -0
- package/dist/draft9.d.ts +95 -0
- package/dist/draft9.js +115 -0
- package/dist/index.cjs +76 -4
- package/dist/index.d.cts +68 -5
- package/dist/index.d.ts +68 -5
- package/dist/index.js +76 -4
- package/dist/{session-types-DFjMk4HH.d.ts → session-types-CJIFbTPd.d.ts} +1 -1
- package/dist/{session-types-DW1RSZX_.d.cts → session-types-Cbq8IGCP.d.cts} +1 -1
- package/dist/session.cjs +5 -5
- package/dist/session.d.cts +3 -3
- package/dist/session.d.ts +3 -3
- package/dist/session.js +5 -5
- package/dist/types-4VxSL2Ho.d.cts +261 -0
- package/dist/types-4VxSL2Ho.d.ts +261 -0
- package/dist/types-B2afJZM-.d.cts +236 -0
- package/dist/types-B2afJZM-.d.ts +236 -0
- package/dist/types-Bg6QYNVt.d.cts +290 -0
- package/dist/types-Bg6QYNVt.d.ts +290 -0
- package/dist/types-C_1HrqBl.d.cts +306 -0
- package/dist/types-C_1HrqBl.d.ts +306 -0
- package/dist/types-Cw4WE9dh.d.cts +261 -0
- package/dist/types-Cw4WE9dh.d.ts +261 -0
- package/dist/types-D5gNQiDj.d.cts +261 -0
- package/dist/types-D5gNQiDj.d.ts +261 -0
- package/dist/types-DqCDFqgB.d.cts +230 -0
- package/dist/types-DqCDFqgB.d.ts +230 -0
- package/dist/types-ERexTpT8.d.cts +217 -0
- package/dist/types-ERexTpT8.d.ts +217 -0
- package/dist/{types-DPYE49t0.d.cts → types-QNXoxC9Y.d.cts} +2 -7
- package/dist/{types-DPYE49t0.d.ts → types-QNXoxC9Y.d.ts} +2 -7
- package/dist/types-r-CasCf1.d.cts +262 -0
- package/dist/types-r-CasCf1.d.ts +262 -0
- package/package.json +110 -2
- package/src/core/types.ts +24 -7
- package/src/drafts/draft07/codec.ts +49 -41
- package/src/drafts/draft07/rules.ts +1 -3
- package/src/drafts/draft08/codec.ts +1254 -0
- package/src/drafts/draft08/index.ts +125 -0
- package/src/drafts/draft08/messages.ts +72 -0
- package/src/drafts/draft08/rules.ts +91 -0
- package/src/drafts/draft08/session-fsm.ts +718 -0
- package/src/drafts/draft08/session.ts +26 -0
- package/src/drafts/draft08/types.ts +377 -0
- package/src/drafts/draft09/codec.ts +1235 -0
- package/src/drafts/draft09/index.ts +125 -0
- package/src/drafts/draft09/messages.ts +72 -0
- package/src/drafts/draft09/rules.ts +91 -0
- package/src/drafts/draft09/session-fsm.ts +718 -0
- package/src/drafts/draft09/session.ts +26 -0
- package/src/drafts/draft09/types.ts +376 -0
- package/src/drafts/draft10/codec.ts +1235 -0
- package/src/drafts/draft10/index.ts +125 -0
- package/src/drafts/draft10/messages.ts +72 -0
- package/src/drafts/draft10/rules.ts +91 -0
- package/src/drafts/draft10/session-fsm.ts +718 -0
- package/src/drafts/draft10/session.ts +26 -0
- package/src/drafts/draft10/types.ts +376 -0
- package/src/drafts/draft11/codec.ts +1198 -0
- package/src/drafts/draft11/index.ts +123 -0
- package/src/drafts/draft11/messages.ts +71 -0
- package/src/drafts/draft11/rules.ts +100 -0
- package/src/drafts/draft11/session-fsm.ts +758 -0
- package/src/drafts/draft11/session.ts +26 -0
- package/src/drafts/draft11/types.ts +375 -0
- package/src/drafts/draft12/codec.ts +1354 -0
- package/src/drafts/draft12/index.ts +130 -0
- package/src/drafts/draft12/messages.ts +84 -0
- package/src/drafts/draft12/rules.ts +106 -0
- package/src/drafts/draft12/session-fsm.ts +805 -0
- package/src/drafts/draft12/session.ts +26 -0
- package/src/drafts/draft12/types.ts +414 -0
- package/src/drafts/draft13/codec.ts +1438 -0
- package/src/drafts/draft13/index.ts +132 -0
- package/src/drafts/draft13/messages.ts +86 -0
- package/src/drafts/draft13/rules.ts +108 -0
- package/src/drafts/draft13/session-fsm.ts +819 -0
- package/src/drafts/draft13/session.ts +26 -0
- package/src/drafts/draft13/types.ts +433 -0
- package/src/drafts/draft14/session-fsm.ts +182 -1
- package/src/drafts/draft15/codec.ts +1661 -0
- package/src/drafts/draft15/index.ts +121 -0
- package/src/drafts/draft15/messages.ts +64 -0
- package/src/drafts/draft15/rules.ts +95 -0
- package/src/drafts/draft15/session-fsm.ts +687 -0
- package/src/drafts/draft15/session.ts +26 -0
- package/src/drafts/draft15/types.ts +336 -0
- package/src/drafts/draft16/codec.ts +1623 -0
- package/src/drafts/draft16/index.ts +123 -0
- package/src/drafts/draft16/messages.ts +67 -0
- package/src/drafts/draft16/rules.ts +96 -0
- package/src/drafts/draft16/session-fsm.ts +682 -0
- package/src/drafts/draft16/session.ts +26 -0
- package/src/drafts/draft16/types.ts +354 -0
- package/src/drafts/draft17/codec.ts +1621 -0
- package/src/drafts/draft17/index.ts +105 -0
- package/src/drafts/draft17/messages.ts +53 -0
- package/src/drafts/draft17/rules.ts +85 -0
- package/src/drafts/draft17/session-fsm.ts +437 -0
- package/src/drafts/draft17/session.ts +15 -0
- package/src/drafts/draft17/types.ts +310 -0
- package/src/index.ts +217 -2
|
@@ -0,0 +1,1198 @@
|
|
|
1
|
+
import {
|
|
2
|
+
BufferReader,
|
|
3
|
+
BufferWriter,
|
|
4
|
+
DecodeError
|
|
5
|
+
} from "./chunk-A27S7HW7.js";
|
|
6
|
+
|
|
7
|
+
// src/drafts/draft12/messages.ts
|
|
8
|
+
var MSG_SUBSCRIBE_UPDATE = 0x02n;
|
|
9
|
+
var MSG_SUBSCRIBE = 0x03n;
|
|
10
|
+
var MSG_SUBSCRIBE_OK = 0x04n;
|
|
11
|
+
var MSG_SUBSCRIBE_ERROR = 0x05n;
|
|
12
|
+
var MSG_ANNOUNCE = 0x06n;
|
|
13
|
+
var MSG_ANNOUNCE_OK = 0x07n;
|
|
14
|
+
var MSG_ANNOUNCE_ERROR = 0x08n;
|
|
15
|
+
var MSG_UNANNOUNCE = 0x09n;
|
|
16
|
+
var MSG_UNSUBSCRIBE = 0x0an;
|
|
17
|
+
var MSG_SUBSCRIBE_DONE = 0x0bn;
|
|
18
|
+
var MSG_ANNOUNCE_CANCEL = 0x0cn;
|
|
19
|
+
var MSG_TRACK_STATUS_REQUEST = 0x0dn;
|
|
20
|
+
var MSG_TRACK_STATUS = 0x0en;
|
|
21
|
+
var MSG_GOAWAY = 0x10n;
|
|
22
|
+
var MSG_SUBSCRIBE_ANNOUNCES = 0x11n;
|
|
23
|
+
var MSG_SUBSCRIBE_ANNOUNCES_OK = 0x12n;
|
|
24
|
+
var MSG_SUBSCRIBE_ANNOUNCES_ERROR = 0x13n;
|
|
25
|
+
var MSG_UNSUBSCRIBE_ANNOUNCES = 0x14n;
|
|
26
|
+
var MSG_MAX_REQUEST_ID = 0x15n;
|
|
27
|
+
var MSG_FETCH = 0x16n;
|
|
28
|
+
var MSG_FETCH_CANCEL = 0x17n;
|
|
29
|
+
var MSG_FETCH_OK = 0x18n;
|
|
30
|
+
var MSG_FETCH_ERROR = 0x19n;
|
|
31
|
+
var MSG_REQUESTS_BLOCKED = 0x1an;
|
|
32
|
+
var MSG_PUBLISH = 0x1dn;
|
|
33
|
+
var MSG_PUBLISH_OK = 0x1en;
|
|
34
|
+
var MSG_PUBLISH_ERROR = 0x1fn;
|
|
35
|
+
var MSG_CLIENT_SETUP = 0x20n;
|
|
36
|
+
var MSG_SERVER_SETUP = 0x21n;
|
|
37
|
+
var SETUP_PARAM_PATH = 0x01n;
|
|
38
|
+
var SETUP_PARAM_MAX_REQUEST_ID = 0x02n;
|
|
39
|
+
var PARAM_AUTHORIZATION_TOKEN = 0x01n;
|
|
40
|
+
var PARAM_DELIVERY_TIMEOUT = 0x03n;
|
|
41
|
+
var VARINT_FRAMED_MESSAGES = /* @__PURE__ */ new Set([
|
|
42
|
+
MSG_PUBLISH,
|
|
43
|
+
MSG_PUBLISH_OK,
|
|
44
|
+
MSG_PUBLISH_ERROR
|
|
45
|
+
]);
|
|
46
|
+
var MESSAGE_TYPE_MAP = /* @__PURE__ */ new Map([
|
|
47
|
+
[MSG_CLIENT_SETUP, "client_setup"],
|
|
48
|
+
[MSG_SERVER_SETUP, "server_setup"],
|
|
49
|
+
[MSG_SUBSCRIBE, "subscribe"],
|
|
50
|
+
[MSG_SUBSCRIBE_OK, "subscribe_ok"],
|
|
51
|
+
[MSG_SUBSCRIBE_ERROR, "subscribe_error"],
|
|
52
|
+
[MSG_SUBSCRIBE_UPDATE, "subscribe_update"],
|
|
53
|
+
[MSG_SUBSCRIBE_DONE, "subscribe_done"],
|
|
54
|
+
[MSG_UNSUBSCRIBE, "unsubscribe"],
|
|
55
|
+
[MSG_ANNOUNCE, "announce"],
|
|
56
|
+
[MSG_ANNOUNCE_OK, "announce_ok"],
|
|
57
|
+
[MSG_ANNOUNCE_ERROR, "announce_error"],
|
|
58
|
+
[MSG_UNANNOUNCE, "unannounce"],
|
|
59
|
+
[MSG_ANNOUNCE_CANCEL, "announce_cancel"],
|
|
60
|
+
[MSG_SUBSCRIBE_ANNOUNCES, "subscribe_announces"],
|
|
61
|
+
[MSG_SUBSCRIBE_ANNOUNCES_OK, "subscribe_announces_ok"],
|
|
62
|
+
[MSG_SUBSCRIBE_ANNOUNCES_ERROR, "subscribe_announces_error"],
|
|
63
|
+
[MSG_UNSUBSCRIBE_ANNOUNCES, "unsubscribe_announces"],
|
|
64
|
+
[MSG_FETCH, "fetch"],
|
|
65
|
+
[MSG_FETCH_OK, "fetch_ok"],
|
|
66
|
+
[MSG_FETCH_ERROR, "fetch_error"],
|
|
67
|
+
[MSG_FETCH_CANCEL, "fetch_cancel"],
|
|
68
|
+
[MSG_PUBLISH, "publish"],
|
|
69
|
+
[MSG_PUBLISH_OK, "publish_ok"],
|
|
70
|
+
[MSG_PUBLISH_ERROR, "publish_error"],
|
|
71
|
+
[MSG_TRACK_STATUS_REQUEST, "track_status_request"],
|
|
72
|
+
[MSG_TRACK_STATUS, "track_status"],
|
|
73
|
+
[MSG_GOAWAY, "goaway"],
|
|
74
|
+
[MSG_MAX_REQUEST_ID, "max_request_id"],
|
|
75
|
+
[MSG_REQUESTS_BLOCKED, "requests_blocked"]
|
|
76
|
+
]);
|
|
77
|
+
var MESSAGE_ID_MAP = new Map(
|
|
78
|
+
[...MESSAGE_TYPE_MAP.entries()].map(([id, name]) => [name, id])
|
|
79
|
+
);
|
|
80
|
+
|
|
81
|
+
// src/drafts/draft12/codec.ts
|
|
82
|
+
function bytesToHex(bytes) {
|
|
83
|
+
let hex = "";
|
|
84
|
+
for (let i = 0; i < bytes.byteLength; i++) {
|
|
85
|
+
hex += bytes[i].toString(16).padStart(2, "0");
|
|
86
|
+
}
|
|
87
|
+
return hex;
|
|
88
|
+
}
|
|
89
|
+
function hexToBytes(hex) {
|
|
90
|
+
const bytes = new Uint8Array(hex.length / 2);
|
|
91
|
+
for (let i = 0; i < hex.length; i += 2) {
|
|
92
|
+
bytes[i / 2] = parseInt(hex.substring(i, i + 2), 16);
|
|
93
|
+
}
|
|
94
|
+
return bytes;
|
|
95
|
+
}
|
|
96
|
+
function encodeSetupParams(params, w) {
|
|
97
|
+
let count = 0;
|
|
98
|
+
if (params.path !== void 0) count++;
|
|
99
|
+
if (params.max_request_id !== void 0) count++;
|
|
100
|
+
if (params.unknown) count += params.unknown.length;
|
|
101
|
+
w.writeVarInt(count);
|
|
102
|
+
if (params.path !== void 0) {
|
|
103
|
+
w.writeVarInt(SETUP_PARAM_PATH);
|
|
104
|
+
const encoded = new TextEncoder().encode(params.path);
|
|
105
|
+
w.writeVarInt(encoded.byteLength);
|
|
106
|
+
w.writeBytes(encoded);
|
|
107
|
+
}
|
|
108
|
+
if (params.max_request_id !== void 0) {
|
|
109
|
+
w.writeVarInt(SETUP_PARAM_MAX_REQUEST_ID);
|
|
110
|
+
w.writeVarInt(params.max_request_id);
|
|
111
|
+
}
|
|
112
|
+
if (params.unknown) {
|
|
113
|
+
for (const u of params.unknown) {
|
|
114
|
+
const id = BigInt(u.id);
|
|
115
|
+
w.writeVarInt(id);
|
|
116
|
+
if (id % 2n === 0n) {
|
|
117
|
+
const raw = hexToBytes(u.raw_hex);
|
|
118
|
+
const tmpReader = new BufferReader(raw);
|
|
119
|
+
w.writeVarInt(tmpReader.readVarInt());
|
|
120
|
+
} else {
|
|
121
|
+
const raw = hexToBytes(u.raw_hex);
|
|
122
|
+
w.writeVarInt(raw.byteLength);
|
|
123
|
+
w.writeBytes(raw);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
function decodeSetupParams(r) {
|
|
129
|
+
const count = Number(r.readVarInt());
|
|
130
|
+
const result = {};
|
|
131
|
+
const unknown = [];
|
|
132
|
+
for (let i = 0; i < count; i++) {
|
|
133
|
+
const paramType = r.readVarInt();
|
|
134
|
+
if (paramType % 2n === 0n) {
|
|
135
|
+
const value = r.readVarInt();
|
|
136
|
+
if (paramType === SETUP_PARAM_MAX_REQUEST_ID) {
|
|
137
|
+
result.max_request_id = value;
|
|
138
|
+
} else {
|
|
139
|
+
const tmpW = new BufferWriter(16);
|
|
140
|
+
tmpW.writeVarInt(value);
|
|
141
|
+
const raw = tmpW.finish();
|
|
142
|
+
unknown.push({
|
|
143
|
+
id: `0x${paramType.toString(16)}`,
|
|
144
|
+
length: raw.byteLength,
|
|
145
|
+
raw_hex: bytesToHex(raw)
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
} else {
|
|
149
|
+
const length = Number(r.readVarInt());
|
|
150
|
+
const bytes = r.readBytes(length);
|
|
151
|
+
if (paramType === SETUP_PARAM_PATH) {
|
|
152
|
+
result.path = new TextDecoder().decode(bytes);
|
|
153
|
+
} else {
|
|
154
|
+
unknown.push({ id: `0x${paramType.toString(16)}`, length, raw_hex: bytesToHex(bytes) });
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
if (unknown.length > 0) result.unknown = unknown;
|
|
159
|
+
return result;
|
|
160
|
+
}
|
|
161
|
+
function encodeParams(params, w) {
|
|
162
|
+
let count = params.unknown ? params.unknown.length : 0;
|
|
163
|
+
if (params.authorization_token !== void 0) count++;
|
|
164
|
+
if (params.delivery_timeout !== void 0) count++;
|
|
165
|
+
w.writeVarInt(count);
|
|
166
|
+
if (params.authorization_token !== void 0) {
|
|
167
|
+
w.writeVarInt(PARAM_AUTHORIZATION_TOKEN);
|
|
168
|
+
const at = params.authorization_token;
|
|
169
|
+
const tmpW = new BufferWriter(64);
|
|
170
|
+
tmpW.writeVarInt(at.alias_type);
|
|
171
|
+
tmpW.writeVarInt(at.token_type);
|
|
172
|
+
const tokenBytes = new TextEncoder().encode(at.token_value);
|
|
173
|
+
tmpW.writeBytes(tokenBytes);
|
|
174
|
+
const raw = tmpW.finish();
|
|
175
|
+
w.writeVarInt(raw.byteLength);
|
|
176
|
+
w.writeBytes(raw);
|
|
177
|
+
}
|
|
178
|
+
if (params.delivery_timeout !== void 0) {
|
|
179
|
+
w.writeVarInt(PARAM_DELIVERY_TIMEOUT);
|
|
180
|
+
const tmpW = new BufferWriter(16);
|
|
181
|
+
tmpW.writeVarInt(params.delivery_timeout);
|
|
182
|
+
const raw = tmpW.finish();
|
|
183
|
+
w.writeVarInt(raw.byteLength);
|
|
184
|
+
w.writeBytes(raw);
|
|
185
|
+
}
|
|
186
|
+
if (params.unknown) {
|
|
187
|
+
for (const u of params.unknown) {
|
|
188
|
+
const id = BigInt(u.id);
|
|
189
|
+
w.writeVarInt(id);
|
|
190
|
+
if (id % 2n === 0n) {
|
|
191
|
+
const raw = hexToBytes(u.raw_hex);
|
|
192
|
+
const tmpReader = new BufferReader(raw);
|
|
193
|
+
w.writeVarInt(tmpReader.readVarInt());
|
|
194
|
+
} else {
|
|
195
|
+
const raw = hexToBytes(u.raw_hex);
|
|
196
|
+
w.writeVarInt(raw.byteLength);
|
|
197
|
+
w.writeBytes(raw);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
function decodeParams(r) {
|
|
203
|
+
const count = Number(r.readVarInt());
|
|
204
|
+
const result = {};
|
|
205
|
+
const unknown = [];
|
|
206
|
+
for (let i = 0; i < count; i++) {
|
|
207
|
+
const paramType = r.readVarInt();
|
|
208
|
+
if (paramType % 2n === 0n) {
|
|
209
|
+
const value = r.readVarInt();
|
|
210
|
+
const tmpW = new BufferWriter(16);
|
|
211
|
+
tmpW.writeVarInt(value);
|
|
212
|
+
const raw = tmpW.finish();
|
|
213
|
+
unknown.push({
|
|
214
|
+
id: `0x${paramType.toString(16)}`,
|
|
215
|
+
length: raw.byteLength,
|
|
216
|
+
raw_hex: bytesToHex(raw)
|
|
217
|
+
});
|
|
218
|
+
} else {
|
|
219
|
+
const length = Number(r.readVarInt());
|
|
220
|
+
const startOff = r.offset;
|
|
221
|
+
if (paramType === PARAM_AUTHORIZATION_TOKEN) {
|
|
222
|
+
const alias_type = r.readVarInt();
|
|
223
|
+
const token_type = r.readVarInt();
|
|
224
|
+
const tokenBytesLen = length - (r.offset - startOff);
|
|
225
|
+
const tokenBytes = r.readBytes(tokenBytesLen);
|
|
226
|
+
result.authorization_token = {
|
|
227
|
+
alias_type,
|
|
228
|
+
token_type,
|
|
229
|
+
token_value: new TextDecoder().decode(tokenBytes)
|
|
230
|
+
};
|
|
231
|
+
} else if (paramType === PARAM_DELIVERY_TIMEOUT) {
|
|
232
|
+
const blob = r.readBytes(length);
|
|
233
|
+
const tmpReader = new BufferReader(blob);
|
|
234
|
+
result.delivery_timeout = tmpReader.readVarInt();
|
|
235
|
+
} else {
|
|
236
|
+
const bytes = r.readBytes(length);
|
|
237
|
+
unknown.push({ id: `0x${paramType.toString(16)}`, length, raw_hex: bytesToHex(bytes) });
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
if (unknown.length > 0) result.unknown = unknown;
|
|
242
|
+
return result;
|
|
243
|
+
}
|
|
244
|
+
function encodeClientSetupPayload(msg, w) {
|
|
245
|
+
w.writeVarInt(msg.supported_versions.length);
|
|
246
|
+
for (const v of msg.supported_versions) w.writeVarInt(v);
|
|
247
|
+
encodeSetupParams(msg.parameters, w);
|
|
248
|
+
}
|
|
249
|
+
function encodeServerSetupPayload(msg, w) {
|
|
250
|
+
w.writeVarInt(msg.selected_version);
|
|
251
|
+
encodeSetupParams(msg.parameters, w);
|
|
252
|
+
}
|
|
253
|
+
function encodeSubscribePayload(msg, w) {
|
|
254
|
+
w.writeVarInt(msg.request_id);
|
|
255
|
+
w.writeTuple(msg.track_namespace);
|
|
256
|
+
w.writeString(msg.track_name);
|
|
257
|
+
w.writeUint8(msg.subscriber_priority);
|
|
258
|
+
w.writeVarInt(msg.group_order);
|
|
259
|
+
w.writeVarInt(msg.forward);
|
|
260
|
+
w.writeVarInt(msg.filter_type);
|
|
261
|
+
const ft = Number(msg.filter_type);
|
|
262
|
+
if (ft === 3 || ft === 4) {
|
|
263
|
+
w.writeVarInt(msg.start_group);
|
|
264
|
+
w.writeVarInt(msg.start_object);
|
|
265
|
+
}
|
|
266
|
+
if (ft === 4) {
|
|
267
|
+
w.writeVarInt(msg.end_group);
|
|
268
|
+
}
|
|
269
|
+
encodeParams(msg.parameters, w);
|
|
270
|
+
}
|
|
271
|
+
function encodeSubscribeOkPayload(msg, w) {
|
|
272
|
+
w.writeVarInt(msg.request_id);
|
|
273
|
+
w.writeVarInt(msg.track_alias);
|
|
274
|
+
w.writeVarInt(msg.expires);
|
|
275
|
+
w.writeVarInt(msg.group_order);
|
|
276
|
+
w.writeVarInt(msg.content_exists);
|
|
277
|
+
if (msg.content_exists === 1n && msg.largest_location) {
|
|
278
|
+
w.writeVarInt(msg.largest_location.group);
|
|
279
|
+
w.writeVarInt(msg.largest_location.object);
|
|
280
|
+
}
|
|
281
|
+
encodeParams(msg.parameters, w);
|
|
282
|
+
}
|
|
283
|
+
function encodeSubscribeErrorPayload(msg, w) {
|
|
284
|
+
w.writeVarInt(msg.request_id);
|
|
285
|
+
w.writeVarInt(msg.error_code);
|
|
286
|
+
w.writeString(msg.reason_phrase);
|
|
287
|
+
}
|
|
288
|
+
function encodeSubscribeUpdatePayload(msg, w) {
|
|
289
|
+
w.writeVarInt(msg.request_id);
|
|
290
|
+
w.writeVarInt(msg.start_group);
|
|
291
|
+
w.writeVarInt(msg.start_object);
|
|
292
|
+
w.writeVarInt(msg.end_group);
|
|
293
|
+
w.writeUint8(msg.subscriber_priority);
|
|
294
|
+
w.writeVarInt(msg.forward);
|
|
295
|
+
encodeParams(msg.parameters, w);
|
|
296
|
+
}
|
|
297
|
+
function encodeSubscribeDonePayload(msg, w) {
|
|
298
|
+
w.writeVarInt(msg.request_id);
|
|
299
|
+
w.writeVarInt(msg.status_code);
|
|
300
|
+
w.writeVarInt(msg.stream_count);
|
|
301
|
+
w.writeString(msg.reason_phrase);
|
|
302
|
+
}
|
|
303
|
+
function encodeUnsubscribePayload(msg, w) {
|
|
304
|
+
w.writeVarInt(msg.request_id);
|
|
305
|
+
}
|
|
306
|
+
function encodeAnnouncePayload(msg, w) {
|
|
307
|
+
w.writeVarInt(msg.request_id);
|
|
308
|
+
w.writeTuple(msg.track_namespace);
|
|
309
|
+
encodeParams(msg.parameters, w);
|
|
310
|
+
}
|
|
311
|
+
function encodeAnnounceOkPayload(msg, w) {
|
|
312
|
+
w.writeVarInt(msg.request_id);
|
|
313
|
+
}
|
|
314
|
+
function encodeAnnounceErrorPayload(msg, w) {
|
|
315
|
+
w.writeVarInt(msg.request_id);
|
|
316
|
+
w.writeVarInt(msg.error_code);
|
|
317
|
+
w.writeString(msg.reason_phrase);
|
|
318
|
+
}
|
|
319
|
+
function encodeUnannouncePayload(msg, w) {
|
|
320
|
+
w.writeTuple(msg.track_namespace);
|
|
321
|
+
}
|
|
322
|
+
function encodeAnnounceCancelPayload(msg, w) {
|
|
323
|
+
w.writeTuple(msg.track_namespace);
|
|
324
|
+
w.writeVarInt(msg.error_code);
|
|
325
|
+
w.writeString(msg.reason_phrase);
|
|
326
|
+
}
|
|
327
|
+
function encodeSubscribeAnnouncesPayload(msg, w) {
|
|
328
|
+
w.writeVarInt(msg.request_id);
|
|
329
|
+
w.writeTuple(msg.track_namespace_prefix);
|
|
330
|
+
encodeParams(msg.parameters, w);
|
|
331
|
+
}
|
|
332
|
+
function encodeSubscribeAnnouncesOkPayload(msg, w) {
|
|
333
|
+
w.writeVarInt(msg.request_id);
|
|
334
|
+
}
|
|
335
|
+
function encodeSubscribeAnnouncesErrorPayload(msg, w) {
|
|
336
|
+
w.writeVarInt(msg.request_id);
|
|
337
|
+
w.writeVarInt(msg.error_code);
|
|
338
|
+
w.writeString(msg.reason_phrase);
|
|
339
|
+
}
|
|
340
|
+
function encodeUnsubscribeAnnouncesPayload(msg, w) {
|
|
341
|
+
w.writeTuple(msg.track_namespace_prefix);
|
|
342
|
+
}
|
|
343
|
+
function encodePublishPayload(msg, w) {
|
|
344
|
+
w.writeVarInt(msg.request_id);
|
|
345
|
+
w.writeTuple(msg.track_namespace);
|
|
346
|
+
w.writeString(msg.track_name);
|
|
347
|
+
w.writeVarInt(msg.track_alias);
|
|
348
|
+
w.writeVarInt(msg.group_order);
|
|
349
|
+
w.writeVarInt(msg.content_exists);
|
|
350
|
+
if (msg.content_exists === 1n && msg.largest_location) {
|
|
351
|
+
w.writeVarInt(msg.largest_location.group);
|
|
352
|
+
w.writeVarInt(msg.largest_location.object);
|
|
353
|
+
}
|
|
354
|
+
w.writeVarInt(msg.forward);
|
|
355
|
+
encodeParams(msg.parameters, w);
|
|
356
|
+
}
|
|
357
|
+
function encodePublishOkPayload(msg, w) {
|
|
358
|
+
w.writeVarInt(msg.request_id);
|
|
359
|
+
w.writeVarInt(msg.forward);
|
|
360
|
+
w.writeUint8(msg.subscriber_priority);
|
|
361
|
+
w.writeVarInt(msg.group_order);
|
|
362
|
+
w.writeVarInt(msg.filter_type);
|
|
363
|
+
const ft = Number(msg.filter_type);
|
|
364
|
+
if (ft === 3 || ft === 4) {
|
|
365
|
+
w.writeVarInt(msg.start_group);
|
|
366
|
+
w.writeVarInt(msg.start_object);
|
|
367
|
+
}
|
|
368
|
+
if (ft === 4) {
|
|
369
|
+
w.writeVarInt(msg.end_group);
|
|
370
|
+
}
|
|
371
|
+
encodeParams(msg.parameters, w);
|
|
372
|
+
}
|
|
373
|
+
function encodePublishErrorPayload(msg, w) {
|
|
374
|
+
w.writeVarInt(msg.request_id);
|
|
375
|
+
w.writeVarInt(msg.error_code);
|
|
376
|
+
w.writeString(msg.reason_phrase);
|
|
377
|
+
}
|
|
378
|
+
function encodeFetchPayload(msg, w) {
|
|
379
|
+
w.writeVarInt(msg.request_id);
|
|
380
|
+
w.writeUint8(msg.subscriber_priority);
|
|
381
|
+
w.writeVarInt(msg.group_order);
|
|
382
|
+
w.writeVarInt(msg.fetch_type);
|
|
383
|
+
const ft = Number(msg.fetch_type);
|
|
384
|
+
if (ft === 1 && msg.standalone) {
|
|
385
|
+
w.writeTuple(msg.standalone.track_namespace);
|
|
386
|
+
w.writeString(msg.standalone.track_name);
|
|
387
|
+
w.writeVarInt(msg.standalone.start_group);
|
|
388
|
+
w.writeVarInt(msg.standalone.start_object);
|
|
389
|
+
w.writeVarInt(msg.standalone.end_group);
|
|
390
|
+
w.writeVarInt(msg.standalone.end_object);
|
|
391
|
+
} else if ((ft === 2 || ft === 3) && msg.joining) {
|
|
392
|
+
w.writeVarInt(msg.joining.joining_subscribe_id);
|
|
393
|
+
w.writeVarInt(msg.joining.joining_start);
|
|
394
|
+
}
|
|
395
|
+
encodeParams(msg.parameters, w);
|
|
396
|
+
}
|
|
397
|
+
function encodeFetchOkPayload(msg, w) {
|
|
398
|
+
w.writeVarInt(msg.request_id);
|
|
399
|
+
w.writeVarInt(msg.group_order);
|
|
400
|
+
w.writeVarInt(msg.end_of_track);
|
|
401
|
+
w.writeVarInt(msg.end_location.group);
|
|
402
|
+
w.writeVarInt(msg.end_location.object);
|
|
403
|
+
encodeParams(msg.parameters, w);
|
|
404
|
+
}
|
|
405
|
+
function encodeFetchErrorPayload(msg, w) {
|
|
406
|
+
w.writeVarInt(msg.request_id);
|
|
407
|
+
w.writeVarInt(msg.error_code);
|
|
408
|
+
w.writeString(msg.reason_phrase);
|
|
409
|
+
}
|
|
410
|
+
function encodeFetchCancelPayload(msg, w) {
|
|
411
|
+
w.writeVarInt(msg.request_id);
|
|
412
|
+
}
|
|
413
|
+
function encodeTrackStatusRequestPayload(msg, w) {
|
|
414
|
+
w.writeVarInt(msg.request_id);
|
|
415
|
+
w.writeTuple(msg.track_namespace);
|
|
416
|
+
w.writeString(msg.track_name);
|
|
417
|
+
encodeParams(msg.parameters, w);
|
|
418
|
+
}
|
|
419
|
+
function encodeTrackStatusPayload(msg, w) {
|
|
420
|
+
w.writeVarInt(msg.request_id);
|
|
421
|
+
w.writeVarInt(msg.status_code);
|
|
422
|
+
w.writeVarInt(msg.largest_location.group);
|
|
423
|
+
w.writeVarInt(msg.largest_location.object);
|
|
424
|
+
encodeParams(msg.parameters, w);
|
|
425
|
+
}
|
|
426
|
+
function encodeGoAwayPayload(msg, w) {
|
|
427
|
+
w.writeString(msg.new_session_uri);
|
|
428
|
+
}
|
|
429
|
+
function encodeMaxRequestIdPayload(msg, w) {
|
|
430
|
+
w.writeVarInt(msg.request_id);
|
|
431
|
+
}
|
|
432
|
+
function encodeRequestsBlockedPayload(msg, w) {
|
|
433
|
+
w.writeVarInt(msg.maximum_request_id);
|
|
434
|
+
}
|
|
435
|
+
function decodeClientSetupPayload(r) {
|
|
436
|
+
const numVersions = Number(r.readVarInt());
|
|
437
|
+
if (numVersions === 0) {
|
|
438
|
+
throw new DecodeError("CONSTRAINT_VIOLATION", "supported_versions must not be empty", r.offset);
|
|
439
|
+
}
|
|
440
|
+
const supported_versions = [];
|
|
441
|
+
for (let i = 0; i < numVersions; i++) supported_versions.push(r.readVarInt());
|
|
442
|
+
const parameters = decodeSetupParams(r);
|
|
443
|
+
return { type: "client_setup", supported_versions, parameters };
|
|
444
|
+
}
|
|
445
|
+
function decodeServerSetupPayload(r) {
|
|
446
|
+
const selected_version = r.readVarInt();
|
|
447
|
+
const parameters = decodeSetupParams(r);
|
|
448
|
+
return { type: "server_setup", selected_version, parameters };
|
|
449
|
+
}
|
|
450
|
+
function decodeSubscribePayload(r) {
|
|
451
|
+
const request_id = r.readVarInt();
|
|
452
|
+
const track_namespace = r.readTuple();
|
|
453
|
+
const track_name = r.readString();
|
|
454
|
+
const subscriber_priority = r.readUint8();
|
|
455
|
+
const group_order = r.readVarInt();
|
|
456
|
+
const forward = r.readVarInt();
|
|
457
|
+
const filter_type = r.readVarInt();
|
|
458
|
+
const ft = Number(filter_type);
|
|
459
|
+
if (ft < 1 || ft > 4) {
|
|
460
|
+
throw new DecodeError("CONSTRAINT_VIOLATION", `Invalid filter_type: ${ft}`, r.offset);
|
|
461
|
+
}
|
|
462
|
+
let start_group;
|
|
463
|
+
let start_object;
|
|
464
|
+
let end_group;
|
|
465
|
+
if (ft === 3 || ft === 4) {
|
|
466
|
+
start_group = r.readVarInt();
|
|
467
|
+
start_object = r.readVarInt();
|
|
468
|
+
}
|
|
469
|
+
if (ft === 4) {
|
|
470
|
+
end_group = r.readVarInt();
|
|
471
|
+
}
|
|
472
|
+
const parameters = decodeParams(r);
|
|
473
|
+
const msg = {
|
|
474
|
+
type: "subscribe",
|
|
475
|
+
request_id,
|
|
476
|
+
track_namespace,
|
|
477
|
+
track_name,
|
|
478
|
+
subscriber_priority,
|
|
479
|
+
group_order,
|
|
480
|
+
forward,
|
|
481
|
+
filter_type,
|
|
482
|
+
parameters
|
|
483
|
+
};
|
|
484
|
+
if (start_group !== void 0) msg.start_group = start_group;
|
|
485
|
+
if (start_object !== void 0) msg.start_object = start_object;
|
|
486
|
+
if (end_group !== void 0) msg.end_group = end_group;
|
|
487
|
+
return msg;
|
|
488
|
+
}
|
|
489
|
+
function decodeSubscribeOkPayload(r) {
|
|
490
|
+
const request_id = r.readVarInt();
|
|
491
|
+
const track_alias = r.readVarInt();
|
|
492
|
+
const expires = r.readVarInt();
|
|
493
|
+
const group_order = r.readVarInt();
|
|
494
|
+
const content_exists = r.readVarInt();
|
|
495
|
+
let largest_location;
|
|
496
|
+
if (content_exists === 1n) {
|
|
497
|
+
const group = r.readVarInt();
|
|
498
|
+
const object = r.readVarInt();
|
|
499
|
+
largest_location = { group, object };
|
|
500
|
+
}
|
|
501
|
+
const parameters = decodeParams(r);
|
|
502
|
+
const msg = {
|
|
503
|
+
type: "subscribe_ok",
|
|
504
|
+
request_id,
|
|
505
|
+
track_alias,
|
|
506
|
+
expires,
|
|
507
|
+
group_order,
|
|
508
|
+
content_exists,
|
|
509
|
+
parameters
|
|
510
|
+
};
|
|
511
|
+
if (largest_location) msg.largest_location = largest_location;
|
|
512
|
+
return msg;
|
|
513
|
+
}
|
|
514
|
+
function decodeSubscribeErrorPayload(r) {
|
|
515
|
+
const request_id = r.readVarInt();
|
|
516
|
+
const error_code = r.readVarInt();
|
|
517
|
+
const reason_phrase = r.readString();
|
|
518
|
+
return { type: "subscribe_error", request_id, error_code, reason_phrase };
|
|
519
|
+
}
|
|
520
|
+
function decodeSubscribeUpdatePayload(r) {
|
|
521
|
+
const request_id = r.readVarInt();
|
|
522
|
+
const start_group = r.readVarInt();
|
|
523
|
+
const start_object = r.readVarInt();
|
|
524
|
+
const end_group = r.readVarInt();
|
|
525
|
+
const subscriber_priority = r.readUint8();
|
|
526
|
+
const forward = r.readVarInt();
|
|
527
|
+
const parameters = decodeParams(r);
|
|
528
|
+
return {
|
|
529
|
+
type: "subscribe_update",
|
|
530
|
+
request_id,
|
|
531
|
+
start_group,
|
|
532
|
+
start_object,
|
|
533
|
+
end_group,
|
|
534
|
+
subscriber_priority,
|
|
535
|
+
forward,
|
|
536
|
+
parameters
|
|
537
|
+
};
|
|
538
|
+
}
|
|
539
|
+
function decodeSubscribeDonePayload(r) {
|
|
540
|
+
const request_id = r.readVarInt();
|
|
541
|
+
const status_code = r.readVarInt();
|
|
542
|
+
const stream_count = r.readVarInt();
|
|
543
|
+
const reason_phrase = r.readString();
|
|
544
|
+
return { type: "subscribe_done", request_id, status_code, stream_count, reason_phrase };
|
|
545
|
+
}
|
|
546
|
+
function decodeUnsubscribePayload(r) {
|
|
547
|
+
const request_id = r.readVarInt();
|
|
548
|
+
return { type: "unsubscribe", request_id };
|
|
549
|
+
}
|
|
550
|
+
function decodeAnnouncePayload(r) {
|
|
551
|
+
const request_id = r.readVarInt();
|
|
552
|
+
const track_namespace = r.readTuple();
|
|
553
|
+
const parameters = decodeParams(r);
|
|
554
|
+
return { type: "announce", request_id, track_namespace, parameters };
|
|
555
|
+
}
|
|
556
|
+
function decodeAnnounceOkPayload(r) {
|
|
557
|
+
const request_id = r.readVarInt();
|
|
558
|
+
return { type: "announce_ok", request_id };
|
|
559
|
+
}
|
|
560
|
+
function decodeAnnounceErrorPayload(r) {
|
|
561
|
+
const request_id = r.readVarInt();
|
|
562
|
+
const error_code = r.readVarInt();
|
|
563
|
+
const reason_phrase = r.readString();
|
|
564
|
+
return { type: "announce_error", request_id, error_code, reason_phrase };
|
|
565
|
+
}
|
|
566
|
+
function decodeUnannouncePayload(r) {
|
|
567
|
+
const track_namespace = r.readTuple();
|
|
568
|
+
return { type: "unannounce", track_namespace };
|
|
569
|
+
}
|
|
570
|
+
function decodeAnnounceCancelPayload(r) {
|
|
571
|
+
const track_namespace = r.readTuple();
|
|
572
|
+
const error_code = r.readVarInt();
|
|
573
|
+
const reason_phrase = r.readString();
|
|
574
|
+
return { type: "announce_cancel", track_namespace, error_code, reason_phrase };
|
|
575
|
+
}
|
|
576
|
+
function decodeSubscribeAnnouncesPayload(r) {
|
|
577
|
+
const request_id = r.readVarInt();
|
|
578
|
+
const track_namespace_prefix = r.readTuple();
|
|
579
|
+
const parameters = decodeParams(r);
|
|
580
|
+
return { type: "subscribe_announces", request_id, track_namespace_prefix, parameters };
|
|
581
|
+
}
|
|
582
|
+
function decodeSubscribeAnnouncesOkPayload(r) {
|
|
583
|
+
const request_id = r.readVarInt();
|
|
584
|
+
return { type: "subscribe_announces_ok", request_id };
|
|
585
|
+
}
|
|
586
|
+
function decodeSubscribeAnnouncesErrorPayload(r) {
|
|
587
|
+
const request_id = r.readVarInt();
|
|
588
|
+
const error_code = r.readVarInt();
|
|
589
|
+
const reason_phrase = r.readString();
|
|
590
|
+
return { type: "subscribe_announces_error", request_id, error_code, reason_phrase };
|
|
591
|
+
}
|
|
592
|
+
function decodeUnsubscribeAnnouncesPayload(r) {
|
|
593
|
+
const track_namespace_prefix = r.readTuple();
|
|
594
|
+
return { type: "unsubscribe_announces", track_namespace_prefix };
|
|
595
|
+
}
|
|
596
|
+
function decodePublishPayload(r) {
|
|
597
|
+
const request_id = r.readVarInt();
|
|
598
|
+
const track_namespace = r.readTuple();
|
|
599
|
+
const track_name = r.readString();
|
|
600
|
+
const track_alias = r.readVarInt();
|
|
601
|
+
const group_order = r.readVarInt();
|
|
602
|
+
const content_exists = r.readVarInt();
|
|
603
|
+
let largest_location;
|
|
604
|
+
if (content_exists === 1n) {
|
|
605
|
+
const group = r.readVarInt();
|
|
606
|
+
const object = r.readVarInt();
|
|
607
|
+
largest_location = { group, object };
|
|
608
|
+
}
|
|
609
|
+
const forward = r.readVarInt();
|
|
610
|
+
const parameters = decodeParams(r);
|
|
611
|
+
const msg = {
|
|
612
|
+
type: "publish",
|
|
613
|
+
request_id,
|
|
614
|
+
track_namespace,
|
|
615
|
+
track_name,
|
|
616
|
+
track_alias,
|
|
617
|
+
group_order,
|
|
618
|
+
content_exists,
|
|
619
|
+
forward,
|
|
620
|
+
parameters
|
|
621
|
+
};
|
|
622
|
+
if (largest_location) msg.largest_location = largest_location;
|
|
623
|
+
return msg;
|
|
624
|
+
}
|
|
625
|
+
function decodePublishOkPayload(r) {
|
|
626
|
+
const request_id = r.readVarInt();
|
|
627
|
+
const forward = r.readVarInt();
|
|
628
|
+
const subscriber_priority = r.readUint8();
|
|
629
|
+
const group_order = r.readVarInt();
|
|
630
|
+
const filter_type = r.readVarInt();
|
|
631
|
+
const ft = Number(filter_type);
|
|
632
|
+
let start_group;
|
|
633
|
+
let start_object;
|
|
634
|
+
let end_group;
|
|
635
|
+
if (ft === 3 || ft === 4) {
|
|
636
|
+
start_group = r.readVarInt();
|
|
637
|
+
start_object = r.readVarInt();
|
|
638
|
+
}
|
|
639
|
+
if (ft === 4) {
|
|
640
|
+
end_group = r.readVarInt();
|
|
641
|
+
}
|
|
642
|
+
const parameters = decodeParams(r);
|
|
643
|
+
const msg = {
|
|
644
|
+
type: "publish_ok",
|
|
645
|
+
request_id,
|
|
646
|
+
forward,
|
|
647
|
+
subscriber_priority,
|
|
648
|
+
group_order,
|
|
649
|
+
filter_type,
|
|
650
|
+
parameters
|
|
651
|
+
};
|
|
652
|
+
if (start_group !== void 0) msg.start_group = start_group;
|
|
653
|
+
if (start_object !== void 0) msg.start_object = start_object;
|
|
654
|
+
if (end_group !== void 0) msg.end_group = end_group;
|
|
655
|
+
return msg;
|
|
656
|
+
}
|
|
657
|
+
function decodePublishErrorPayload(r) {
|
|
658
|
+
const request_id = r.readVarInt();
|
|
659
|
+
const error_code = r.readVarInt();
|
|
660
|
+
const reason_phrase = r.readString();
|
|
661
|
+
return { type: "publish_error", request_id, error_code, reason_phrase };
|
|
662
|
+
}
|
|
663
|
+
function decodeFetchPayload(r) {
|
|
664
|
+
const request_id = r.readVarInt();
|
|
665
|
+
const subscriber_priority = r.readUint8();
|
|
666
|
+
const group_order = r.readVarInt();
|
|
667
|
+
const fetch_type = r.readVarInt();
|
|
668
|
+
const ft = Number(fetch_type);
|
|
669
|
+
if (ft < 1 || ft > 3) {
|
|
670
|
+
throw new DecodeError("CONSTRAINT_VIOLATION", `Invalid fetch_type: ${ft}`, r.offset);
|
|
671
|
+
}
|
|
672
|
+
let standalone;
|
|
673
|
+
let joining;
|
|
674
|
+
if (ft === 1) {
|
|
675
|
+
const track_namespace = r.readTuple();
|
|
676
|
+
const track_name = r.readString();
|
|
677
|
+
const start_group = r.readVarInt();
|
|
678
|
+
const start_object = r.readVarInt();
|
|
679
|
+
const end_group = r.readVarInt();
|
|
680
|
+
const end_object = r.readVarInt();
|
|
681
|
+
standalone = { track_namespace, track_name, start_group, start_object, end_group, end_object };
|
|
682
|
+
} else {
|
|
683
|
+
const joining_subscribe_id = r.readVarInt();
|
|
684
|
+
const joining_start = r.readVarInt();
|
|
685
|
+
joining = { joining_subscribe_id, joining_start };
|
|
686
|
+
}
|
|
687
|
+
const parameters = decodeParams(r);
|
|
688
|
+
return {
|
|
689
|
+
type: "fetch",
|
|
690
|
+
request_id,
|
|
691
|
+
subscriber_priority,
|
|
692
|
+
group_order,
|
|
693
|
+
fetch_type,
|
|
694
|
+
standalone,
|
|
695
|
+
joining,
|
|
696
|
+
parameters
|
|
697
|
+
};
|
|
698
|
+
}
|
|
699
|
+
function decodeFetchOkPayload(r) {
|
|
700
|
+
const request_id = r.readVarInt();
|
|
701
|
+
const group_order = r.readVarInt();
|
|
702
|
+
const end_of_track = r.readVarInt();
|
|
703
|
+
const group = r.readVarInt();
|
|
704
|
+
const object = r.readVarInt();
|
|
705
|
+
const parameters = decodeParams(r);
|
|
706
|
+
return {
|
|
707
|
+
type: "fetch_ok",
|
|
708
|
+
request_id,
|
|
709
|
+
group_order,
|
|
710
|
+
end_of_track,
|
|
711
|
+
end_location: { group, object },
|
|
712
|
+
parameters
|
|
713
|
+
};
|
|
714
|
+
}
|
|
715
|
+
function decodeFetchErrorPayload(r) {
|
|
716
|
+
const request_id = r.readVarInt();
|
|
717
|
+
const error_code = r.readVarInt();
|
|
718
|
+
const reason_phrase = r.readString();
|
|
719
|
+
return { type: "fetch_error", request_id, error_code, reason_phrase };
|
|
720
|
+
}
|
|
721
|
+
function decodeFetchCancelPayload(r) {
|
|
722
|
+
const request_id = r.readVarInt();
|
|
723
|
+
return { type: "fetch_cancel", request_id };
|
|
724
|
+
}
|
|
725
|
+
function decodeTrackStatusRequestPayload(r) {
|
|
726
|
+
const request_id = r.readVarInt();
|
|
727
|
+
const track_namespace = r.readTuple();
|
|
728
|
+
const track_name = r.readString();
|
|
729
|
+
const parameters = decodeParams(r);
|
|
730
|
+
return { type: "track_status_request", request_id, track_namespace, track_name, parameters };
|
|
731
|
+
}
|
|
732
|
+
function decodeTrackStatusPayload(r) {
|
|
733
|
+
const request_id = r.readVarInt();
|
|
734
|
+
const status_code = r.readVarInt();
|
|
735
|
+
const group = r.readVarInt();
|
|
736
|
+
const object = r.readVarInt();
|
|
737
|
+
const parameters = decodeParams(r);
|
|
738
|
+
return {
|
|
739
|
+
type: "track_status",
|
|
740
|
+
request_id,
|
|
741
|
+
status_code,
|
|
742
|
+
largest_location: { group, object },
|
|
743
|
+
parameters
|
|
744
|
+
};
|
|
745
|
+
}
|
|
746
|
+
function decodeGoAwayPayload(r) {
|
|
747
|
+
const new_session_uri = r.readString();
|
|
748
|
+
return { type: "goaway", new_session_uri };
|
|
749
|
+
}
|
|
750
|
+
function decodeMaxRequestIdPayload(r) {
|
|
751
|
+
const request_id = r.readVarInt();
|
|
752
|
+
return { type: "max_request_id", request_id };
|
|
753
|
+
}
|
|
754
|
+
function decodeRequestsBlockedPayload(r) {
|
|
755
|
+
const maximum_request_id = r.readVarInt();
|
|
756
|
+
return { type: "requests_blocked", maximum_request_id };
|
|
757
|
+
}
|
|
758
|
+
var payloadDecoders = /* @__PURE__ */ new Map([
|
|
759
|
+
[MSG_CLIENT_SETUP, decodeClientSetupPayload],
|
|
760
|
+
[MSG_SERVER_SETUP, decodeServerSetupPayload],
|
|
761
|
+
[MSG_SUBSCRIBE, decodeSubscribePayload],
|
|
762
|
+
[MSG_SUBSCRIBE_OK, decodeSubscribeOkPayload],
|
|
763
|
+
[MSG_SUBSCRIBE_ERROR, decodeSubscribeErrorPayload],
|
|
764
|
+
[MSG_SUBSCRIBE_UPDATE, decodeSubscribeUpdatePayload],
|
|
765
|
+
[MSG_SUBSCRIBE_DONE, decodeSubscribeDonePayload],
|
|
766
|
+
[MSG_UNSUBSCRIBE, decodeUnsubscribePayload],
|
|
767
|
+
[MSG_ANNOUNCE, decodeAnnouncePayload],
|
|
768
|
+
[MSG_ANNOUNCE_OK, decodeAnnounceOkPayload],
|
|
769
|
+
[MSG_ANNOUNCE_ERROR, decodeAnnounceErrorPayload],
|
|
770
|
+
[MSG_UNANNOUNCE, decodeUnannouncePayload],
|
|
771
|
+
[MSG_ANNOUNCE_CANCEL, decodeAnnounceCancelPayload],
|
|
772
|
+
[MSG_SUBSCRIBE_ANNOUNCES, decodeSubscribeAnnouncesPayload],
|
|
773
|
+
[MSG_SUBSCRIBE_ANNOUNCES_OK, decodeSubscribeAnnouncesOkPayload],
|
|
774
|
+
[MSG_SUBSCRIBE_ANNOUNCES_ERROR, decodeSubscribeAnnouncesErrorPayload],
|
|
775
|
+
[MSG_UNSUBSCRIBE_ANNOUNCES, decodeUnsubscribeAnnouncesPayload],
|
|
776
|
+
[MSG_PUBLISH, decodePublishPayload],
|
|
777
|
+
[MSG_PUBLISH_OK, decodePublishOkPayload],
|
|
778
|
+
[MSG_PUBLISH_ERROR, decodePublishErrorPayload],
|
|
779
|
+
[MSG_FETCH, decodeFetchPayload],
|
|
780
|
+
[MSG_FETCH_OK, decodeFetchOkPayload],
|
|
781
|
+
[MSG_FETCH_ERROR, decodeFetchErrorPayload],
|
|
782
|
+
[MSG_FETCH_CANCEL, decodeFetchCancelPayload],
|
|
783
|
+
[MSG_TRACK_STATUS_REQUEST, decodeTrackStatusRequestPayload],
|
|
784
|
+
[MSG_TRACK_STATUS, decodeTrackStatusPayload],
|
|
785
|
+
[MSG_GOAWAY, decodeGoAwayPayload],
|
|
786
|
+
[MSG_MAX_REQUEST_ID, decodeMaxRequestIdPayload],
|
|
787
|
+
[MSG_REQUESTS_BLOCKED, decodeRequestsBlockedPayload]
|
|
788
|
+
]);
|
|
789
|
+
function encodeMessage(message) {
|
|
790
|
+
const typeId = MESSAGE_ID_MAP.get(message.type);
|
|
791
|
+
if (typeId === void 0) throw new Error(`Unknown message type: ${message.type}`);
|
|
792
|
+
const payloadWriter = new BufferWriter();
|
|
793
|
+
encodePayload(message, payloadWriter);
|
|
794
|
+
const payload = payloadWriter.finish();
|
|
795
|
+
const writer = new BufferWriter();
|
|
796
|
+
writer.writeVarInt(typeId);
|
|
797
|
+
if (VARINT_FRAMED_MESSAGES.has(typeId)) {
|
|
798
|
+
writer.writeVarInt(payload.byteLength);
|
|
799
|
+
} else {
|
|
800
|
+
if (payload.byteLength > 65535) {
|
|
801
|
+
throw new Error(`Payload too large for 16-bit length: ${payload.byteLength}`);
|
|
802
|
+
}
|
|
803
|
+
writer.writeUint8(payload.byteLength >> 8 & 255);
|
|
804
|
+
writer.writeUint8(payload.byteLength & 255);
|
|
805
|
+
}
|
|
806
|
+
writer.writeBytes(payload);
|
|
807
|
+
return writer.finish();
|
|
808
|
+
}
|
|
809
|
+
function encodePayload(msg, w) {
|
|
810
|
+
switch (msg.type) {
|
|
811
|
+
case "client_setup":
|
|
812
|
+
return encodeClientSetupPayload(msg, w);
|
|
813
|
+
case "server_setup":
|
|
814
|
+
return encodeServerSetupPayload(msg, w);
|
|
815
|
+
case "subscribe":
|
|
816
|
+
return encodeSubscribePayload(msg, w);
|
|
817
|
+
case "subscribe_ok":
|
|
818
|
+
return encodeSubscribeOkPayload(msg, w);
|
|
819
|
+
case "subscribe_error":
|
|
820
|
+
return encodeSubscribeErrorPayload(msg, w);
|
|
821
|
+
case "subscribe_update":
|
|
822
|
+
return encodeSubscribeUpdatePayload(msg, w);
|
|
823
|
+
case "subscribe_done":
|
|
824
|
+
return encodeSubscribeDonePayload(msg, w);
|
|
825
|
+
case "unsubscribe":
|
|
826
|
+
return encodeUnsubscribePayload(msg, w);
|
|
827
|
+
case "announce":
|
|
828
|
+
return encodeAnnouncePayload(msg, w);
|
|
829
|
+
case "announce_ok":
|
|
830
|
+
return encodeAnnounceOkPayload(msg, w);
|
|
831
|
+
case "announce_error":
|
|
832
|
+
return encodeAnnounceErrorPayload(msg, w);
|
|
833
|
+
case "unannounce":
|
|
834
|
+
return encodeUnannouncePayload(msg, w);
|
|
835
|
+
case "announce_cancel":
|
|
836
|
+
return encodeAnnounceCancelPayload(msg, w);
|
|
837
|
+
case "subscribe_announces":
|
|
838
|
+
return encodeSubscribeAnnouncesPayload(msg, w);
|
|
839
|
+
case "subscribe_announces_ok":
|
|
840
|
+
return encodeSubscribeAnnouncesOkPayload(msg, w);
|
|
841
|
+
case "subscribe_announces_error":
|
|
842
|
+
return encodeSubscribeAnnouncesErrorPayload(msg, w);
|
|
843
|
+
case "unsubscribe_announces":
|
|
844
|
+
return encodeUnsubscribeAnnouncesPayload(msg, w);
|
|
845
|
+
case "publish":
|
|
846
|
+
return encodePublishPayload(msg, w);
|
|
847
|
+
case "publish_ok":
|
|
848
|
+
return encodePublishOkPayload(msg, w);
|
|
849
|
+
case "publish_error":
|
|
850
|
+
return encodePublishErrorPayload(msg, w);
|
|
851
|
+
case "fetch":
|
|
852
|
+
return encodeFetchPayload(msg, w);
|
|
853
|
+
case "fetch_ok":
|
|
854
|
+
return encodeFetchOkPayload(msg, w);
|
|
855
|
+
case "fetch_error":
|
|
856
|
+
return encodeFetchErrorPayload(msg, w);
|
|
857
|
+
case "fetch_cancel":
|
|
858
|
+
return encodeFetchCancelPayload(msg, w);
|
|
859
|
+
case "track_status_request":
|
|
860
|
+
return encodeTrackStatusRequestPayload(msg, w);
|
|
861
|
+
case "track_status":
|
|
862
|
+
return encodeTrackStatusPayload(msg, w);
|
|
863
|
+
case "goaway":
|
|
864
|
+
return encodeGoAwayPayload(msg, w);
|
|
865
|
+
case "max_request_id":
|
|
866
|
+
return encodeMaxRequestIdPayload(msg, w);
|
|
867
|
+
case "requests_blocked":
|
|
868
|
+
return encodeRequestsBlockedPayload(msg, w);
|
|
869
|
+
default: {
|
|
870
|
+
const _exhaustive = msg;
|
|
871
|
+
throw new Error(`Unhandled message type: ${_exhaustive.type}`);
|
|
872
|
+
}
|
|
873
|
+
}
|
|
874
|
+
}
|
|
875
|
+
function decodeMessage(bytes) {
|
|
876
|
+
try {
|
|
877
|
+
const reader = new BufferReader(bytes);
|
|
878
|
+
const typeId = reader.readVarInt();
|
|
879
|
+
let payloadLength;
|
|
880
|
+
if (VARINT_FRAMED_MESSAGES.has(typeId)) {
|
|
881
|
+
payloadLength = Number(reader.readVarInt());
|
|
882
|
+
} else {
|
|
883
|
+
const lenHi = reader.readUint8();
|
|
884
|
+
const lenLo = reader.readUint8();
|
|
885
|
+
payloadLength = lenHi << 8 | lenLo;
|
|
886
|
+
}
|
|
887
|
+
const payloadBytes = reader.readBytes(payloadLength);
|
|
888
|
+
const payloadReader = new BufferReader(payloadBytes);
|
|
889
|
+
const decoder = payloadDecoders.get(typeId);
|
|
890
|
+
if (!decoder) {
|
|
891
|
+
return {
|
|
892
|
+
ok: false,
|
|
893
|
+
error: new DecodeError(
|
|
894
|
+
"UNKNOWN_MESSAGE_TYPE",
|
|
895
|
+
`Unknown message type ID: 0x${typeId.toString(16)}`,
|
|
896
|
+
0
|
|
897
|
+
)
|
|
898
|
+
};
|
|
899
|
+
}
|
|
900
|
+
const message = decoder(payloadReader);
|
|
901
|
+
return { ok: true, value: message, bytesRead: reader.offset };
|
|
902
|
+
} catch (e) {
|
|
903
|
+
if (e instanceof DecodeError) return { ok: false, error: e };
|
|
904
|
+
throw e;
|
|
905
|
+
}
|
|
906
|
+
}
|
|
907
|
+
var FETCH_STREAM_TYPE = 0x05n;
|
|
908
|
+
function encodeSubgroupStream(stream) {
|
|
909
|
+
const w = new BufferWriter();
|
|
910
|
+
const typeId = stream.streamTypeId;
|
|
911
|
+
w.writeVarInt(BigInt(typeId));
|
|
912
|
+
w.writeVarInt(stream.trackAlias);
|
|
913
|
+
w.writeVarInt(stream.groupId);
|
|
914
|
+
if (typeId === 12) w.writeVarInt(stream.subgroupId);
|
|
915
|
+
w.writeUint8(stream.publisherPriority);
|
|
916
|
+
for (const obj of stream.objects) {
|
|
917
|
+
w.writeVarInt(obj.objectId);
|
|
918
|
+
w.writeVarInt(obj.payloadLength);
|
|
919
|
+
if (obj.payloadLength === 0 && obj.status !== void 0) {
|
|
920
|
+
w.writeVarInt(obj.status);
|
|
921
|
+
} else {
|
|
922
|
+
w.writeBytes(obj.payload);
|
|
923
|
+
}
|
|
924
|
+
}
|
|
925
|
+
return w.finish();
|
|
926
|
+
}
|
|
927
|
+
function encodeDatagram(dg) {
|
|
928
|
+
const w = new BufferWriter();
|
|
929
|
+
w.writeVarInt(BigInt(dg.streamTypeId));
|
|
930
|
+
w.writeVarInt(dg.trackAlias);
|
|
931
|
+
w.writeVarInt(dg.groupId);
|
|
932
|
+
w.writeVarInt(dg.objectId);
|
|
933
|
+
w.writeUint8(dg.publisherPriority);
|
|
934
|
+
if (dg.streamTypeId === 2) {
|
|
935
|
+
w.writeVarInt(dg.objectStatus ?? 0n);
|
|
936
|
+
} else {
|
|
937
|
+
w.writeBytes(dg.payload);
|
|
938
|
+
}
|
|
939
|
+
return w.finish();
|
|
940
|
+
}
|
|
941
|
+
function encodeFetchStream(stream) {
|
|
942
|
+
const w = new BufferWriter();
|
|
943
|
+
w.writeVarInt(FETCH_STREAM_TYPE);
|
|
944
|
+
w.writeVarInt(stream.requestId);
|
|
945
|
+
for (const obj of stream.objects) {
|
|
946
|
+
w.writeVarInt(obj.groupId);
|
|
947
|
+
w.writeVarInt(obj.subgroupId);
|
|
948
|
+
w.writeVarInt(obj.objectId);
|
|
949
|
+
w.writeUint8(obj.publisherPriority);
|
|
950
|
+
w.writeVarInt(obj.extensionHeadersLength);
|
|
951
|
+
w.writeVarInt(obj.payloadLength);
|
|
952
|
+
w.writeBytes(obj.payload);
|
|
953
|
+
}
|
|
954
|
+
return w.finish();
|
|
955
|
+
}
|
|
956
|
+
function decodeSubgroupStream(bytes) {
|
|
957
|
+
try {
|
|
958
|
+
const r = new BufferReader(bytes);
|
|
959
|
+
const streamTypeId = Number(r.readVarInt());
|
|
960
|
+
if (streamTypeId !== 8 && streamTypeId !== 12) {
|
|
961
|
+
return {
|
|
962
|
+
ok: false,
|
|
963
|
+
error: new DecodeError(
|
|
964
|
+
"CONSTRAINT_VIOLATION",
|
|
965
|
+
`Expected subgroup type 0x08 or 0x0C, got 0x${streamTypeId.toString(16)}`,
|
|
966
|
+
0
|
|
967
|
+
)
|
|
968
|
+
};
|
|
969
|
+
}
|
|
970
|
+
const trackAlias = r.readVarInt();
|
|
971
|
+
const groupId = r.readVarInt();
|
|
972
|
+
let subgroupId = 0n;
|
|
973
|
+
if (streamTypeId === 12) subgroupId = r.readVarInt();
|
|
974
|
+
const publisherPriority = r.readUint8();
|
|
975
|
+
const objects = [];
|
|
976
|
+
while (r.remaining > 0) {
|
|
977
|
+
const objectId = r.readVarInt();
|
|
978
|
+
const payloadLength = Number(r.readVarInt());
|
|
979
|
+
let payload;
|
|
980
|
+
let status;
|
|
981
|
+
if (payloadLength === 0) {
|
|
982
|
+
status = r.readVarInt();
|
|
983
|
+
payload = new Uint8Array(0);
|
|
984
|
+
} else {
|
|
985
|
+
payload = r.readBytes(payloadLength);
|
|
986
|
+
}
|
|
987
|
+
const obj = { type: "object", objectId, payloadLength, payload };
|
|
988
|
+
if (status !== void 0) obj.status = status;
|
|
989
|
+
objects.push(obj);
|
|
990
|
+
}
|
|
991
|
+
return {
|
|
992
|
+
ok: true,
|
|
993
|
+
value: {
|
|
994
|
+
type: "subgroup",
|
|
995
|
+
streamTypeId,
|
|
996
|
+
trackAlias,
|
|
997
|
+
groupId,
|
|
998
|
+
subgroupId,
|
|
999
|
+
publisherPriority,
|
|
1000
|
+
objects
|
|
1001
|
+
},
|
|
1002
|
+
bytesRead: r.offset
|
|
1003
|
+
};
|
|
1004
|
+
} catch (e) {
|
|
1005
|
+
if (e instanceof DecodeError) return { ok: false, error: e };
|
|
1006
|
+
throw e;
|
|
1007
|
+
}
|
|
1008
|
+
}
|
|
1009
|
+
function decodeDatagram(bytes) {
|
|
1010
|
+
try {
|
|
1011
|
+
const r = new BufferReader(bytes);
|
|
1012
|
+
const streamTypeId = Number(r.readVarInt());
|
|
1013
|
+
if (streamTypeId !== 0 && streamTypeId !== 2) {
|
|
1014
|
+
return {
|
|
1015
|
+
ok: false,
|
|
1016
|
+
error: new DecodeError(
|
|
1017
|
+
"CONSTRAINT_VIOLATION",
|
|
1018
|
+
`Expected datagram type 0x00 or 0x02, got 0x${streamTypeId.toString(16)}`,
|
|
1019
|
+
0
|
|
1020
|
+
)
|
|
1021
|
+
};
|
|
1022
|
+
}
|
|
1023
|
+
const trackAlias = r.readVarInt();
|
|
1024
|
+
const groupId = r.readVarInt();
|
|
1025
|
+
const objectId = r.readVarInt();
|
|
1026
|
+
const publisherPriority = r.readUint8();
|
|
1027
|
+
let objectStatus;
|
|
1028
|
+
let payload;
|
|
1029
|
+
if (streamTypeId === 2) {
|
|
1030
|
+
objectStatus = r.readVarInt();
|
|
1031
|
+
payload = new Uint8Array(0);
|
|
1032
|
+
} else {
|
|
1033
|
+
payload = r.readBytes(r.remaining);
|
|
1034
|
+
}
|
|
1035
|
+
const result = {
|
|
1036
|
+
type: "datagram",
|
|
1037
|
+
streamTypeId,
|
|
1038
|
+
trackAlias,
|
|
1039
|
+
groupId,
|
|
1040
|
+
objectId,
|
|
1041
|
+
publisherPriority,
|
|
1042
|
+
payloadLength: payload.byteLength,
|
|
1043
|
+
payload
|
|
1044
|
+
};
|
|
1045
|
+
if (objectStatus !== void 0)
|
|
1046
|
+
result.objectStatus = objectStatus;
|
|
1047
|
+
return { ok: true, value: result, bytesRead: r.offset };
|
|
1048
|
+
} catch (e) {
|
|
1049
|
+
if (e instanceof DecodeError) return { ok: false, error: e };
|
|
1050
|
+
throw e;
|
|
1051
|
+
}
|
|
1052
|
+
}
|
|
1053
|
+
function decodeFetchStream(bytes) {
|
|
1054
|
+
try {
|
|
1055
|
+
const r = new BufferReader(bytes);
|
|
1056
|
+
const streamType = r.readVarInt();
|
|
1057
|
+
if (streamType !== FETCH_STREAM_TYPE) {
|
|
1058
|
+
return {
|
|
1059
|
+
ok: false,
|
|
1060
|
+
error: new DecodeError(
|
|
1061
|
+
"CONSTRAINT_VIOLATION",
|
|
1062
|
+
`Expected fetch type 0x05, got 0x${streamType.toString(16)}`,
|
|
1063
|
+
0
|
|
1064
|
+
)
|
|
1065
|
+
};
|
|
1066
|
+
}
|
|
1067
|
+
const requestId = r.readVarInt();
|
|
1068
|
+
const objects = [];
|
|
1069
|
+
while (r.remaining > 0) {
|
|
1070
|
+
const groupId = r.readVarInt();
|
|
1071
|
+
const subgroupId = r.readVarInt();
|
|
1072
|
+
const objectId = r.readVarInt();
|
|
1073
|
+
const publisherPriority = r.readUint8();
|
|
1074
|
+
const extensionHeadersLength = r.readVarInt();
|
|
1075
|
+
if (extensionHeadersLength > 0n) r.readBytes(Number(extensionHeadersLength));
|
|
1076
|
+
const payloadLength = Number(r.readVarInt());
|
|
1077
|
+
const payload = payloadLength > 0 ? r.readBytes(payloadLength) : new Uint8Array(0);
|
|
1078
|
+
objects.push({
|
|
1079
|
+
type: "object",
|
|
1080
|
+
groupId,
|
|
1081
|
+
subgroupId,
|
|
1082
|
+
objectId,
|
|
1083
|
+
publisherPriority,
|
|
1084
|
+
extensionHeadersLength,
|
|
1085
|
+
payloadLength,
|
|
1086
|
+
payload
|
|
1087
|
+
});
|
|
1088
|
+
}
|
|
1089
|
+
return { ok: true, value: { type: "fetch", requestId, objects }, bytesRead: r.offset };
|
|
1090
|
+
} catch (e) {
|
|
1091
|
+
if (e instanceof DecodeError) return { ok: false, error: e };
|
|
1092
|
+
throw e;
|
|
1093
|
+
}
|
|
1094
|
+
}
|
|
1095
|
+
function decodeDataStream(streamType, bytes) {
|
|
1096
|
+
switch (streamType) {
|
|
1097
|
+
case "subgroup":
|
|
1098
|
+
return decodeSubgroupStream(bytes);
|
|
1099
|
+
case "datagram":
|
|
1100
|
+
return decodeDatagram(bytes);
|
|
1101
|
+
case "fetch":
|
|
1102
|
+
return decodeFetchStream(bytes);
|
|
1103
|
+
default: {
|
|
1104
|
+
const _ = streamType;
|
|
1105
|
+
throw new Error(`Unknown: ${_}`);
|
|
1106
|
+
}
|
|
1107
|
+
}
|
|
1108
|
+
}
|
|
1109
|
+
function createStreamDecoder() {
|
|
1110
|
+
let buffer = new Uint8Array(0);
|
|
1111
|
+
return new TransformStream({
|
|
1112
|
+
transform(chunk, controller) {
|
|
1113
|
+
const newBuffer = new Uint8Array(buffer.length + chunk.length);
|
|
1114
|
+
newBuffer.set(buffer, 0);
|
|
1115
|
+
newBuffer.set(chunk, buffer.length);
|
|
1116
|
+
buffer = newBuffer;
|
|
1117
|
+
while (buffer.length > 0) {
|
|
1118
|
+
const result = decodeMessage(buffer);
|
|
1119
|
+
if (!result.ok) {
|
|
1120
|
+
if (result.error.code === "UNEXPECTED_END") break;
|
|
1121
|
+
controller.error(result.error);
|
|
1122
|
+
return;
|
|
1123
|
+
}
|
|
1124
|
+
controller.enqueue(result.value);
|
|
1125
|
+
buffer = buffer.slice(result.bytesRead);
|
|
1126
|
+
}
|
|
1127
|
+
},
|
|
1128
|
+
flush(controller) {
|
|
1129
|
+
if (buffer.length > 0)
|
|
1130
|
+
controller.error(new DecodeError("UNEXPECTED_END", "Stream ended with incomplete data", 0));
|
|
1131
|
+
}
|
|
1132
|
+
});
|
|
1133
|
+
}
|
|
1134
|
+
function createDraft12Codec() {
|
|
1135
|
+
return {
|
|
1136
|
+
draft: "draft-ietf-moq-transport-12",
|
|
1137
|
+
encodeMessage,
|
|
1138
|
+
decodeMessage,
|
|
1139
|
+
encodeSubgroupStream,
|
|
1140
|
+
encodeDatagram,
|
|
1141
|
+
encodeFetchStream,
|
|
1142
|
+
decodeSubgroupStream,
|
|
1143
|
+
decodeDatagram,
|
|
1144
|
+
decodeFetchStream,
|
|
1145
|
+
decodeDataStream,
|
|
1146
|
+
createStreamDecoder
|
|
1147
|
+
};
|
|
1148
|
+
}
|
|
1149
|
+
|
|
1150
|
+
export {
|
|
1151
|
+
MSG_SUBSCRIBE_UPDATE,
|
|
1152
|
+
MSG_SUBSCRIBE,
|
|
1153
|
+
MSG_SUBSCRIBE_OK,
|
|
1154
|
+
MSG_SUBSCRIBE_ERROR,
|
|
1155
|
+
MSG_ANNOUNCE,
|
|
1156
|
+
MSG_ANNOUNCE_OK,
|
|
1157
|
+
MSG_ANNOUNCE_ERROR,
|
|
1158
|
+
MSG_UNANNOUNCE,
|
|
1159
|
+
MSG_UNSUBSCRIBE,
|
|
1160
|
+
MSG_SUBSCRIBE_DONE,
|
|
1161
|
+
MSG_ANNOUNCE_CANCEL,
|
|
1162
|
+
MSG_TRACK_STATUS_REQUEST,
|
|
1163
|
+
MSG_TRACK_STATUS,
|
|
1164
|
+
MSG_GOAWAY,
|
|
1165
|
+
MSG_SUBSCRIBE_ANNOUNCES,
|
|
1166
|
+
MSG_SUBSCRIBE_ANNOUNCES_OK,
|
|
1167
|
+
MSG_SUBSCRIBE_ANNOUNCES_ERROR,
|
|
1168
|
+
MSG_UNSUBSCRIBE_ANNOUNCES,
|
|
1169
|
+
MSG_MAX_REQUEST_ID,
|
|
1170
|
+
MSG_FETCH,
|
|
1171
|
+
MSG_FETCH_CANCEL,
|
|
1172
|
+
MSG_FETCH_OK,
|
|
1173
|
+
MSG_FETCH_ERROR,
|
|
1174
|
+
MSG_REQUESTS_BLOCKED,
|
|
1175
|
+
MSG_PUBLISH,
|
|
1176
|
+
MSG_PUBLISH_OK,
|
|
1177
|
+
MSG_PUBLISH_ERROR,
|
|
1178
|
+
MSG_CLIENT_SETUP,
|
|
1179
|
+
MSG_SERVER_SETUP,
|
|
1180
|
+
SETUP_PARAM_PATH,
|
|
1181
|
+
SETUP_PARAM_MAX_REQUEST_ID,
|
|
1182
|
+
PARAM_AUTHORIZATION_TOKEN,
|
|
1183
|
+
PARAM_DELIVERY_TIMEOUT,
|
|
1184
|
+
VARINT_FRAMED_MESSAGES,
|
|
1185
|
+
MESSAGE_TYPE_MAP,
|
|
1186
|
+
MESSAGE_ID_MAP,
|
|
1187
|
+
encodeMessage,
|
|
1188
|
+
decodeMessage,
|
|
1189
|
+
encodeSubgroupStream,
|
|
1190
|
+
encodeDatagram,
|
|
1191
|
+
encodeFetchStream,
|
|
1192
|
+
decodeSubgroupStream,
|
|
1193
|
+
decodeDatagram,
|
|
1194
|
+
decodeFetchStream,
|
|
1195
|
+
decodeDataStream,
|
|
1196
|
+
createStreamDecoder,
|
|
1197
|
+
createDraft12Codec
|
|
1198
|
+
};
|