@honeybbq/teamspeak-client 0.2.2 → 0.3.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 +1 -0
- package/dist/address-BR-5unVo.cjs +2 -0
- package/dist/address-BR-5unVo.cjs.map +1 -0
- package/dist/address-BfmovVpp.js +65 -0
- package/dist/address-BfmovVpp.js.map +1 -0
- package/dist/address.d.ts +9 -0
- package/dist/address.d.ts.map +1 -0
- package/dist/address.test.d.ts +2 -0
- package/dist/address.test.d.ts.map +1 -0
- package/dist/api.d.ts.map +1 -1
- package/dist/api.test.d.ts +2 -0
- package/dist/api.test.d.ts.map +1 -0
- package/dist/client.d.ts +2 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/command/index.cjs +1 -1
- package/dist/command/index.mjs +2 -2
- package/dist/{command-caXc4h0n.js → command-BLe-C2L2.js} +2 -4
- package/dist/{command-caXc4h0n.js.map → command-BLe-C2L2.js.map} +1 -1
- package/dist/command-DAK4pUBP.cjs +4 -0
- package/dist/{command-Cu2v-5-K.cjs.map → command-DAK4pUBP.cjs.map} +1 -1
- package/dist/crypt-handshake-CQkQreLx.cjs +2 -0
- package/dist/{crypt-handshake-Dbj2cSBZ.cjs.map → crypt-handshake-CQkQreLx.cjs.map} +1 -1
- package/dist/crypt-handshake-DziOY4Lq.js +55 -0
- package/dist/{crypt-handshake-CHmvZ2qs.js.map → crypt-handshake-DziOY4Lq.js.map} +1 -1
- package/dist/{crypt-init2-DWX7Tp-_.js → crypt-init2-D70ha4LB.js} +25 -27
- package/dist/{crypt-init2-DWX7Tp-_.js.map → crypt-init2-D70ha4LB.js.map} +1 -1
- package/dist/crypt-init2-DparLekm.cjs +2 -0
- package/dist/{crypt-init2-C2oihZ7e.cjs.map → crypt-init2-DparLekm.cjs.map} +1 -1
- package/dist/crypto/identity.d.ts.map +1 -1
- package/dist/crypto/index.cjs +1 -1
- package/dist/crypto/index.mjs +2 -2
- package/dist/{crypto-VC7n6YJb.js → crypto-Bg02m4ZE.js} +9 -9
- package/dist/crypto-Bg02m4ZE.js.map +1 -0
- package/dist/crypto-CDlweUL3.cjs +2 -0
- package/dist/crypto-CDlweUL3.cjs.map +1 -0
- package/dist/discovery/index.cjs +1 -1
- package/dist/discovery/index.mjs +1 -1
- package/dist/discovery/resolver.d.ts.map +1 -1
- package/dist/{handler-C_JhqGTd.js → handler-DI_abe9c.js} +159 -131
- package/dist/handler-DI_abe9c.js.map +1 -0
- package/dist/handler-DuwoO5RC.cjs +2 -0
- package/dist/handler-DuwoO5RC.cjs.map +1 -0
- package/dist/handshake/index.cjs +1 -1
- package/dist/handshake/index.mjs +2 -2
- package/dist/helpers.d.ts.map +1 -1
- package/dist/index.cjs +2 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.mjs +155 -141
- package/dist/index.mjs.map +1 -1
- package/dist/{parser-DhAWj-TI.cjs → parser-CL33R9tr.cjs} +2 -2
- package/dist/{parser-DhAWj-TI.cjs.map → parser-CL33R9tr.cjs.map} +1 -1
- package/dist/{parser-CJjP3LlO.js → parser-DZMv3Jm-.js} +2 -2
- package/dist/{parser-CJjP3LlO.js.map → parser-DZMv3Jm-.js.map} +1 -1
- package/dist/primitives-cNNAeFCo.cjs +2 -0
- package/dist/primitives-cNNAeFCo.cjs.map +1 -0
- package/dist/primitives-xIr6Tjk4.js +1457 -0
- package/dist/primitives-xIr6Tjk4.js.map +1 -0
- package/dist/resolver-6B8dI9gr.js +141 -0
- package/dist/resolver-6B8dI9gr.js.map +1 -0
- package/dist/resolver-DCcmyWSK.cjs +4 -0
- package/dist/resolver-DCcmyWSK.cjs.map +1 -0
- package/dist/transport/handler.d.ts +2 -0
- package/dist/transport/handler.d.ts.map +1 -1
- package/dist/transport/index.cjs +1 -1
- package/dist/transport/index.mjs +1 -1
- package/dist/transport/whisper.test.d.ts +2 -0
- package/dist/transport/whisper.test.d.ts.map +1 -0
- package/dist/types.d.ts +2 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +5 -5
- package/dist/command-Cu2v-5-K.cjs +0 -4
- package/dist/crypt-handshake-CHmvZ2qs.js +0 -55
- package/dist/crypt-handshake-Dbj2cSBZ.cjs +0 -2
- package/dist/crypt-init2-C2oihZ7e.cjs +0 -2
- package/dist/crypto-2veVY1fC.cjs +0 -2
- package/dist/crypto-2veVY1fC.cjs.map +0 -1
- package/dist/crypto-VC7n6YJb.js.map +0 -1
- package/dist/handler-C_JhqGTd.js.map +0 -1
- package/dist/handler-CqCD93f0.cjs +0 -2
- package/dist/handler-CqCD93f0.cjs.map +0 -1
- package/dist/primitives-BIAYfJ2Y.js +0 -1842
- package/dist/primitives-BIAYfJ2Y.js.map +0 -1
- package/dist/primitives-bj-ml31v.cjs +0 -2
- package/dist/primitives-bj-ml31v.cjs.map +0 -1
- package/dist/resolver-Br0QefWx.js +0 -162
- package/dist/resolver-Br0QefWx.js.map +0 -1
- package/dist/resolver-DDD2FFhD.cjs +0 -4
- package/dist/resolver-DDD2FFhD.cjs.map +0 -1
- package/dist/types-CGKgXvpG.js +0 -18
- package/dist/types-CGKgXvpG.js.map +0 -1
- package/dist/types-DrnoCdSW.cjs +0 -2
- package/dist/types-DrnoCdSW.cjs.map +0 -1
|
@@ -1,32 +1,33 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { n
|
|
3
|
-
import {
|
|
1
|
+
import { o as e, r as t } from "./address-BfmovVpp.js";
|
|
2
|
+
import { n } from "./crypt-handshake-DziOY4Lq.js";
|
|
3
|
+
import { isIP as r } from "node:net";
|
|
4
|
+
import { createSocket as i } from "node:dgram";
|
|
4
5
|
//#region src/transport/packet.ts
|
|
5
|
-
var
|
|
6
|
+
var a = /* @__PURE__ */ function(e) {
|
|
6
7
|
return e[e.Voice = 0] = "Voice", e[e.VoiceWhisper = 1] = "VoiceWhisper", e[e.Command = 2] = "Command", e[e.CommandLow = 3] = "CommandLow", e[e.Ping = 4] = "Ping", e[e.Pong = 5] = "Pong", e[e.Ack = 6] = "Ack", e[e.AckLow = 7] = "AckLow", e[e.Init1 = 8] = "Init1", e;
|
|
7
|
-
}({}),
|
|
8
|
+
}({}), o = /* @__PURE__ */ function(e) {
|
|
8
9
|
return e[e.Fragmented = 16] = "Fragmented", e[e.NewProtocol = 32] = "NewProtocol", e[e.Compressed = 64] = "Compressed", e[e.Unencrypted = 128] = "Unencrypted", e;
|
|
9
10
|
}({});
|
|
10
|
-
function
|
|
11
|
+
function s(e) {
|
|
11
12
|
return e.typeFlagged & 15;
|
|
12
13
|
}
|
|
13
|
-
function
|
|
14
|
+
function c(e) {
|
|
14
15
|
return e.typeFlagged & 240;
|
|
15
16
|
}
|
|
16
|
-
function
|
|
17
|
-
return (
|
|
17
|
+
function l(e) {
|
|
18
|
+
return !!(c(e) & 128);
|
|
18
19
|
}
|
|
19
|
-
function
|
|
20
|
-
let t = new Uint8Array(5), n = new DataView(t.buffer);
|
|
20
|
+
function u(e) {
|
|
21
|
+
let t = /* @__PURE__ */ new Uint8Array(5), n = new DataView(t.buffer);
|
|
21
22
|
return n.setUint16(0, e.id, !1), n.setUint16(2, e.clientID, !1), t[4] = e.typeFlagged, t;
|
|
22
23
|
}
|
|
23
|
-
function
|
|
24
|
+
function d(e) {
|
|
24
25
|
return {
|
|
25
26
|
id: new DataView(e.buffer, e.byteOffset, e.byteLength).getUint16(0, !1),
|
|
26
27
|
typeFlagged: e[2]
|
|
27
28
|
};
|
|
28
29
|
}
|
|
29
|
-
function
|
|
30
|
+
function f(e) {
|
|
30
31
|
let t = new DataView(e.buffer, e.byteOffset, e.byteLength);
|
|
31
32
|
return {
|
|
32
33
|
id: t.getUint16(0, !1),
|
|
@@ -36,7 +37,7 @@ function u(e) {
|
|
|
36
37
|
}
|
|
37
38
|
//#endregion
|
|
38
39
|
//#region src/transport/generation-window.ts
|
|
39
|
-
var
|
|
40
|
+
var p = class {
|
|
40
41
|
#e = 0;
|
|
41
42
|
#t = 0;
|
|
42
43
|
#n;
|
|
@@ -82,10 +83,10 @@ var d = class {
|
|
|
82
83
|
reset() {
|
|
83
84
|
this.#e = 0, this.#t = 0;
|
|
84
85
|
}
|
|
85
|
-
},
|
|
86
|
-
#e = new Int32Array(
|
|
86
|
+
}, m = 4096, h = class {
|
|
87
|
+
#e = new Int32Array(m);
|
|
87
88
|
decompress(e) {
|
|
88
|
-
let { headerLen: t, decompressedSize: n, flags: r } =
|
|
89
|
+
let { headerLen: t, decompressedSize: n, flags: r } = g(e), i = new Uint8Array(n);
|
|
89
90
|
if (!(r & 1)) return i.set(e.slice(t, t + n)), i;
|
|
90
91
|
this.#e.fill(0);
|
|
91
92
|
let a = {
|
|
@@ -142,7 +143,7 @@ var d = class {
|
|
|
142
143
|
}
|
|
143
144
|
}
|
|
144
145
|
};
|
|
145
|
-
function
|
|
146
|
+
function g(e) {
|
|
146
147
|
if (e.length < 3) throw Error("QuickLZ: data too short");
|
|
147
148
|
let t = e[0];
|
|
148
149
|
if ((t >> 2 & 3) != 1) throw Error("QuickLZ: only level 1 is supported");
|
|
@@ -157,7 +158,7 @@ function m(e) {
|
|
|
157
158
|
}
|
|
158
159
|
//#endregion
|
|
159
160
|
//#region src/transport/handler.ts
|
|
160
|
-
var
|
|
161
|
+
var _ = 1024, v = 5e3, y = 6e4, b = 1e3, x = 8, S = 3, C = 5, w = 500, T = 100, E = class {
|
|
161
162
|
onPacket = null;
|
|
162
163
|
onClosed = null;
|
|
163
164
|
#e;
|
|
@@ -168,12 +169,12 @@ var h = 500, g = 1024, _ = 5e3, v = 6e4, y = 1e3, b = 5, x = 8, S = 3, C = 500,
|
|
|
168
169
|
#a = null;
|
|
169
170
|
#o = null;
|
|
170
171
|
#s = Date.now();
|
|
171
|
-
#c = new Uint16Array(9);
|
|
172
|
-
#l = new Uint32Array(9);
|
|
173
|
-
#u = new
|
|
174
|
-
#d = new
|
|
175
|
-
#f = new
|
|
176
|
-
#p = new
|
|
172
|
+
#c = /* @__PURE__ */ new Uint16Array(9);
|
|
173
|
+
#l = /* @__PURE__ */ new Uint32Array(9);
|
|
174
|
+
#u = new p(65536, _);
|
|
175
|
+
#d = new p(65536, _);
|
|
176
|
+
#f = new p(65536, _);
|
|
177
|
+
#p = new p(65536, _);
|
|
177
178
|
#m = /* @__PURE__ */ new Map();
|
|
178
179
|
#h = /* @__PURE__ */ new Map();
|
|
179
180
|
#g = /* @__PURE__ */ new Map();
|
|
@@ -185,10 +186,12 @@ var h = 500, g = 1024, _ = 5e3, v = 6e4, y = 1e3, b = 5, x = 8, S = 3, C = 500,
|
|
|
185
186
|
this.#r = e;
|
|
186
187
|
}
|
|
187
188
|
connect(e) {
|
|
188
|
-
return new Promise((
|
|
189
|
-
let
|
|
190
|
-
|
|
191
|
-
|
|
189
|
+
return new Promise((n, a) => {
|
|
190
|
+
let { host: o, port: s } = t(e), c = i(r(o) === 6 ? "udp6" : "udp4"), l = (e) => {
|
|
191
|
+
c.close(), a(e);
|
|
192
|
+
};
|
|
193
|
+
c.once("error", l), c.connect(parseInt(s, 10), o, () => {
|
|
194
|
+
c.off("error", l), this.start(c), n();
|
|
192
195
|
});
|
|
193
196
|
});
|
|
194
197
|
}
|
|
@@ -197,123 +200,148 @@ var h = 500, g = 1024, _ = 5e3, v = 6e4, y = 1e3, b = 5, x = 8, S = 3, C = 500,
|
|
|
197
200
|
this.#s = Date.now(), this.#x(new Uint8Array(e.buffer, e.byteOffset, e.byteLength));
|
|
198
201
|
}), e.on("error", (e) => {
|
|
199
202
|
this.#t.error("udp error", e), this.#R(e);
|
|
200
|
-
}), e.on("close", () => this.#R(null)), this.#c[
|
|
201
|
-
let
|
|
202
|
-
|
|
203
|
-
let
|
|
204
|
-
this.#e.cryptoInitComplete && this.sendPacket(
|
|
205
|
-
},
|
|
206
|
-
this.#a = () => clearInterval(
|
|
207
|
-
let
|
|
208
|
-
this.#o = () => clearInterval(
|
|
203
|
+
}), e.on("close", () => this.#R(null)), this.#c[a.Command] = 1, this.#c[a.Init1] = 101;
|
|
204
|
+
let t = n(this.#e, null);
|
|
205
|
+
t && this.#y(a.Init1, t, 0);
|
|
206
|
+
let r = setInterval(() => {
|
|
207
|
+
this.#e.cryptoInitComplete && this.sendPacket(a.Ping, /* @__PURE__ */ new Uint8Array(), o.Unencrypted);
|
|
208
|
+
}, v);
|
|
209
|
+
this.#a = () => clearInterval(r);
|
|
210
|
+
let i = setInterval(() => this.#I(), T);
|
|
211
|
+
this.#o = () => clearInterval(i);
|
|
209
212
|
}
|
|
210
213
|
receivedFinalInitAck() {
|
|
211
214
|
this.#_ = null;
|
|
212
215
|
}
|
|
213
216
|
sendPacket(e, t, n) {
|
|
214
|
-
let
|
|
215
|
-
if (t.length > 487 && e !==
|
|
216
|
-
this.#v(e, t, n,
|
|
217
|
+
let r = !this.#e.cryptoInitComplete;
|
|
218
|
+
if (t.length > 487 && e !== a.Voice && e !== a.VoiceWhisper) {
|
|
219
|
+
this.#v(e, t, n, r);
|
|
217
220
|
return;
|
|
218
221
|
}
|
|
219
|
-
this.#y(e, t, n,
|
|
222
|
+
this.#y(e, t, n, r);
|
|
220
223
|
}
|
|
221
224
|
sendVoicePacket(e, t) {
|
|
222
|
-
let n = this.#c[
|
|
223
|
-
this.#c[
|
|
224
|
-
let
|
|
225
|
+
let n = this.#c[a.Voice], r = this.#l[a.Voice];
|
|
226
|
+
this.#c[a.Voice] = n + 1 & 65535, this.#c[a.Voice] === 0 && this.#l[a.Voice]++;
|
|
227
|
+
let i = S + e.length, s = new Uint8Array(i);
|
|
225
228
|
new DataView(s.buffer).setUint16(0, n, !1), s[2] = t, s.set(e, S);
|
|
226
|
-
let
|
|
227
|
-
typeFlagged:
|
|
229
|
+
let c = u({
|
|
230
|
+
typeFlagged: a.Voice | o.Unencrypted,
|
|
228
231
|
id: n,
|
|
229
232
|
clientID: this.#r,
|
|
230
|
-
generationID:
|
|
233
|
+
generationID: r,
|
|
231
234
|
data: s,
|
|
232
235
|
receivedAt: 0
|
|
233
|
-
}),
|
|
234
|
-
|
|
236
|
+
}), l = new Uint8Array(13 + i);
|
|
237
|
+
l.set(this.#e.fakeSignature, 0), l.set(c, x), l.set(s, 13), this.#b(l);
|
|
238
|
+
}
|
|
239
|
+
sendWhisperPacket(e, t, n) {
|
|
240
|
+
if (t.length === 0) throw Error("whisper requires at least one target");
|
|
241
|
+
if (t.length > 32) throw Error("too many whisper targets");
|
|
242
|
+
if (t.some((e) => !Number.isInteger(e) || e < 0 || e > 65535)) throw RangeError("invalid whisper target");
|
|
243
|
+
let r = this.#c[a.VoiceWhisper], i = this.#l[a.VoiceWhisper];
|
|
244
|
+
this.#c[a.VoiceWhisper] = r + 1 & 65535, this.#c[a.VoiceWhisper] === 0 && (this.#l[a.VoiceWhisper] = i + 1 >>> 0);
|
|
245
|
+
let s = C + t.length * 2 + e.length, c = new Uint8Array(s), l = new DataView(c.buffer);
|
|
246
|
+
l.setUint16(0, r, !1), c[2] = n, c[3] = 0, c[4] = t.length;
|
|
247
|
+
for (let e = 0; e < t.length; e++) l.setUint16(C + e * 2, t[e], !1);
|
|
248
|
+
c.set(e, C + t.length * 2);
|
|
249
|
+
let d = u({
|
|
250
|
+
typeFlagged: a.VoiceWhisper | o.Unencrypted,
|
|
251
|
+
id: r,
|
|
252
|
+
clientID: this.#r,
|
|
253
|
+
generationID: i,
|
|
254
|
+
data: c,
|
|
255
|
+
receivedAt: 0
|
|
256
|
+
}), f = new Uint8Array(13 + s);
|
|
257
|
+
f.set(this.#e.fakeSignature, 0), f.set(d, x), f.set(c, 13), this.#b(f);
|
|
235
258
|
}
|
|
236
259
|
close() {
|
|
237
260
|
this.#i || (this.#i = !0, this.#a?.(), this.#o?.(), this.#n?.close());
|
|
238
261
|
}
|
|
239
262
|
#v(e, t, n, r) {
|
|
240
|
-
let
|
|
241
|
-
for (;
|
|
242
|
-
let
|
|
243
|
-
|
|
263
|
+
let i = 0, a = !0;
|
|
264
|
+
for (; i < t.length;) {
|
|
265
|
+
let s = Math.min(t.length - i, 487), c = i + s === t.length, l = n;
|
|
266
|
+
a !== c && (l |= o.Fragmented), this.#y(e, t.slice(i, i + s), l, r), i += s, a = !1;
|
|
244
267
|
}
|
|
245
268
|
}
|
|
246
269
|
#y(e, t, n, r = !this.#e.cryptoInitComplete) {
|
|
247
|
-
n =
|
|
248
|
-
let [
|
|
270
|
+
n = D(e, n);
|
|
271
|
+
let [i, a] = this.#P(e), s = {
|
|
249
272
|
typeFlagged: e | n,
|
|
250
|
-
id:
|
|
273
|
+
id: i,
|
|
251
274
|
clientID: this.#r,
|
|
252
|
-
generationID:
|
|
275
|
+
generationID: a,
|
|
253
276
|
data: t,
|
|
254
277
|
receivedAt: 0
|
|
255
|
-
},
|
|
256
|
-
p.set(f.slice(0, x), 0), p.set(
|
|
278
|
+
}, c = (n & o.Unencrypted) !== 0, l = u(s), [d, f] = this.#e.encrypt(e, i, a, l, t, r, c), p = new Uint8Array(13 + d.length);
|
|
279
|
+
p.set(f.slice(0, x), 0), p.set(l, x), p.set(d, 13), this.#b(p);
|
|
257
280
|
let m = {
|
|
258
281
|
packet: s,
|
|
259
282
|
firstSend: Date.now(),
|
|
260
283
|
lastSend: Date.now(),
|
|
261
284
|
retryCount: 0,
|
|
262
|
-
nextInterval:
|
|
285
|
+
nextInterval: w
|
|
263
286
|
};
|
|
264
287
|
this.#F(e, s, m);
|
|
265
288
|
}
|
|
266
289
|
#b(e) {
|
|
267
|
-
this.#n
|
|
268
|
-
|
|
269
|
-
|
|
290
|
+
if (this.#n) try {
|
|
291
|
+
this.#n.send(Buffer.from(e), (e) => {
|
|
292
|
+
e && this.#t.warn("udp send error", e);
|
|
293
|
+
});
|
|
294
|
+
} catch (e) {
|
|
295
|
+
let t = e instanceof Error ? e : Error(String(e));
|
|
296
|
+
this.#t.error("udp send failed", t), this.#R(t);
|
|
297
|
+
}
|
|
270
298
|
}
|
|
271
299
|
#x(e) {
|
|
272
300
|
if (e.length < 11) return;
|
|
273
|
-
let t = e.slice(0, x), n = e.slice(x,
|
|
274
|
-
...
|
|
301
|
+
let t = e.slice(0, x), n = e.slice(x, 11), r = e.slice(11), i = d(n), o = {
|
|
302
|
+
...i,
|
|
275
303
|
clientID: 0,
|
|
276
|
-
generationID: this.#S(
|
|
277
|
-
data: new Uint8Array(),
|
|
304
|
+
generationID: this.#S(i.id, i.typeFlagged & 15),
|
|
305
|
+
data: /* @__PURE__ */ new Uint8Array(),
|
|
278
306
|
receivedAt: Date.now()
|
|
279
|
-
}, c = this.#C(
|
|
307
|
+
}, c = this.#C(o, n, r, t);
|
|
280
308
|
if (c !== null) {
|
|
281
|
-
if (
|
|
282
|
-
this.#E(
|
|
309
|
+
if (o.data = c.plaintext, s(o) === a.Ping) {
|
|
310
|
+
this.#E(o.id, c.dummyUsed);
|
|
283
311
|
return;
|
|
284
312
|
}
|
|
285
|
-
this.#w(
|
|
313
|
+
this.#w(o, c.dummyUsed) && (this.#D(o), this.#N(o));
|
|
286
314
|
}
|
|
287
315
|
}
|
|
288
316
|
#S(e, t) {
|
|
289
317
|
switch (t) {
|
|
290
|
-
case
|
|
291
|
-
case
|
|
292
|
-
case
|
|
293
|
-
case
|
|
318
|
+
case a.Command: return this.#u.getGeneration(e);
|
|
319
|
+
case a.CommandLow: return this.#d.getGeneration(e);
|
|
320
|
+
case a.Ack: return this.#f.getGeneration(e);
|
|
321
|
+
case a.AckLow: return this.#p.getGeneration(e);
|
|
294
322
|
default: return 0;
|
|
295
323
|
}
|
|
296
324
|
}
|
|
297
|
-
#C(e, t, n,
|
|
298
|
-
let
|
|
325
|
+
#C(e, t, n, r) {
|
|
326
|
+
let i = (c(e) & o.Unencrypted) !== 0, l = !this.#e.cryptoInitComplete, u = l, d = s(e), f = e.generationID;
|
|
299
327
|
try {
|
|
300
328
|
return {
|
|
301
|
-
plaintext: this.#e.decrypt(d, e.id, f, t, n,
|
|
329
|
+
plaintext: this.#e.decrypt(d, e.id, f, t, n, r, l, i),
|
|
302
330
|
dummyUsed: u
|
|
303
331
|
};
|
|
304
332
|
} catch {
|
|
305
|
-
for (let
|
|
306
|
-
let
|
|
307
|
-
if (!(
|
|
333
|
+
for (let i of [-1, 1]) {
|
|
334
|
+
let a = f + i;
|
|
335
|
+
if (!(a < 0)) try {
|
|
308
336
|
return {
|
|
309
|
-
plaintext: this.#e.decrypt(d, e.id,
|
|
337
|
+
plaintext: this.#e.decrypt(d, e.id, a, t, n, r, !1, !1),
|
|
310
338
|
dummyUsed: !1
|
|
311
339
|
};
|
|
312
340
|
} catch {}
|
|
313
341
|
}
|
|
314
|
-
if (d ===
|
|
342
|
+
if (d === a.Command || d === a.CommandLow || d === a.Ack) try {
|
|
315
343
|
return {
|
|
316
|
-
plaintext: this.#e.decrypt(d, e.id, f, t, n,
|
|
344
|
+
plaintext: this.#e.decrypt(d, e.id, f, t, n, r, !0, i),
|
|
317
345
|
dummyUsed: !0
|
|
318
346
|
};
|
|
319
347
|
} catch {}
|
|
@@ -321,50 +349,50 @@ var h = 500, g = 1024, _ = 5e3, v = 6e4, y = 1e3, b = 5, x = 8, S = 3, C = 500,
|
|
|
321
349
|
}
|
|
322
350
|
}
|
|
323
351
|
#w(e, t) {
|
|
324
|
-
let n =
|
|
325
|
-
if (n !==
|
|
326
|
-
let
|
|
327
|
-
return
|
|
352
|
+
let n = s(e);
|
|
353
|
+
if (n !== a.Command && n !== a.CommandLow) return !0;
|
|
354
|
+
let r = n === a.Command ? this.#u : this.#d, i = n === a.Command ? a.Ack : a.AckLow;
|
|
355
|
+
return r.isInWindow(e.id) ? (this.#T(e.id, i, t), !0) : (r.isOldPacket(e.id) && this.#T(e.id, i, t), !1);
|
|
328
356
|
}
|
|
329
357
|
#T(e, t, n) {
|
|
330
|
-
let r = new Uint8Array(2);
|
|
358
|
+
let r = /* @__PURE__ */ new Uint8Array(2);
|
|
331
359
|
new DataView(r.buffer).setUint16(0, e, !1), this.#y(t, r, 0, n);
|
|
332
360
|
}
|
|
333
361
|
#E(e, t) {
|
|
334
|
-
let n = new Uint8Array(2);
|
|
335
|
-
new DataView(n.buffer).setUint16(0, e, !1), this.#y(
|
|
362
|
+
let n = /* @__PURE__ */ new Uint8Array(2);
|
|
363
|
+
new DataView(n.buffer).setUint16(0, e, !1), this.#y(a.Pong, n, o.Unencrypted, t);
|
|
336
364
|
}
|
|
337
365
|
#D(e) {
|
|
338
|
-
let t =
|
|
339
|
-
if (t !==
|
|
366
|
+
let t = s(e);
|
|
367
|
+
if (t !== a.Command && t !== a.CommandLow) {
|
|
340
368
|
this.onPacket?.(e);
|
|
341
369
|
return;
|
|
342
370
|
}
|
|
343
|
-
let n = t ===
|
|
344
|
-
for (
|
|
345
|
-
let e = n ? this.#O : this.#k, t =
|
|
371
|
+
let n = t === a.Command, r = n ? this.#m : this.#h, i = n ? this.#u : this.#d;
|
|
372
|
+
for (r.set(e.id, e), n ? this.#A(r, i, !0) : this.#A(r, i, !1);;) {
|
|
373
|
+
let e = n ? this.#O : this.#k, t = r.get(e);
|
|
346
374
|
if (t === void 0) break;
|
|
347
|
-
let
|
|
348
|
-
if (!
|
|
349
|
-
let [
|
|
350
|
-
n ? this.#O = s : this.#k = s, this.#M(
|
|
375
|
+
let a = this.#j(t, r, e, i);
|
|
376
|
+
if (!a) break;
|
|
377
|
+
let [o, s] = a;
|
|
378
|
+
n ? this.#O = s : this.#k = s, this.#M(o), this.onPacket?.(o);
|
|
351
379
|
}
|
|
352
380
|
}
|
|
353
381
|
#O = 0;
|
|
354
382
|
#k = 0;
|
|
355
383
|
#A(e, t, n) {
|
|
356
384
|
let r = n ? this.#O : this.#k;
|
|
357
|
-
for (; !e.has(r) &&
|
|
385
|
+
for (; !e.has(r) && O(e, r);) r = r + 1 & 65535, t.advance(1);
|
|
358
386
|
n ? this.#O = r : this.#k = r;
|
|
359
387
|
}
|
|
360
388
|
#j(e, t, n, r) {
|
|
361
|
-
if ((
|
|
362
|
-
let
|
|
389
|
+
if ((c(e) & o.Fragmented) === 0) return t.delete(n), r.advance(1), [e, n + 1 & 65535];
|
|
390
|
+
let i = [], a = 0, s = n, l = !1, u = !1;
|
|
363
391
|
for (;;) {
|
|
364
|
-
let e = t.get(
|
|
392
|
+
let e = t.get(s);
|
|
365
393
|
if (!e) return null;
|
|
366
|
-
|
|
367
|
-
let n = (
|
|
394
|
+
i.push(e), a += e.data.length;
|
|
395
|
+
let n = (c(e) & o.Fragmented) !== 0;
|
|
368
396
|
if (!l) {
|
|
369
397
|
if (l = !0, !n) {
|
|
370
398
|
u = !0;
|
|
@@ -374,16 +402,16 @@ var h = 500, g = 1024, _ = 5e3, v = 6e4, y = 1e3, b = 5, x = 8, S = 3, C = 500,
|
|
|
374
402
|
u = !0;
|
|
375
403
|
break;
|
|
376
404
|
}
|
|
377
|
-
|
|
405
|
+
s = s + 1 & 65535;
|
|
378
406
|
}
|
|
379
407
|
if (!u) return null;
|
|
380
|
-
let d = new Uint8Array(
|
|
381
|
-
for (let e of
|
|
382
|
-
return e.data = d, e.typeFlagged &= ~
|
|
408
|
+
let d = new Uint8Array(a), f = 0;
|
|
409
|
+
for (let e of i) d.set(e.data, f), f += e.data.length, t.delete(n), r.advance(1), n = n + 1 & 65535;
|
|
410
|
+
return e.data = d, e.typeFlagged &= ~o.Fragmented, [e, n];
|
|
383
411
|
}
|
|
384
412
|
#M(e) {
|
|
385
|
-
if ((
|
|
386
|
-
e.data = new
|
|
413
|
+
if ((c(e) & o.Compressed) !== 0) try {
|
|
414
|
+
e.data = new h().decompress(e.data), e.typeFlagged &= ~o.Compressed;
|
|
387
415
|
} catch (t) {
|
|
388
416
|
this.#t.debug("decompression failed", {
|
|
389
417
|
id: e.id,
|
|
@@ -392,39 +420,39 @@ var h = 500, g = 1024, _ = 5e3, v = 6e4, y = 1e3, b = 5, x = 8, S = 3, C = 500,
|
|
|
392
420
|
}
|
|
393
421
|
}
|
|
394
422
|
#N(e) {
|
|
395
|
-
let t =
|
|
396
|
-
if (t ===
|
|
423
|
+
let t = s(e);
|
|
424
|
+
if (t === a.Init1) {
|
|
397
425
|
this.#_ = null;
|
|
398
426
|
return;
|
|
399
427
|
}
|
|
400
|
-
if ((t ===
|
|
401
|
-
let n = new DataView(e.data.buffer, e.data.byteOffset).getUint16(0, !1),
|
|
402
|
-
this.#g.delete(
|
|
428
|
+
if ((t === a.Ack || t === a.AckLow) && e.data.length >= 2) {
|
|
429
|
+
let n = new DataView(e.data.buffer, e.data.byteOffset).getUint16(0, !1), r = (t === a.Ack ? a.Command : a.CommandLow) << 16 | n;
|
|
430
|
+
this.#g.delete(r);
|
|
403
431
|
}
|
|
404
432
|
}
|
|
405
433
|
#P(e) {
|
|
406
434
|
let t = this.#c[e], n = this.#l[e];
|
|
407
|
-
return e ===
|
|
435
|
+
return e === a.Init1 ? [t, n] : (this.#c[e] = t + 1 & 65535, this.#c[e] === 0 && (this.#l[e] = n + 1 >>> 0), e === a.Command ? this.#f.advanceToExcluded(t) : e === a.CommandLow && this.#p.advanceToExcluded(t), [t, n]);
|
|
408
436
|
}
|
|
409
437
|
#F(e, t, n) {
|
|
410
|
-
if (e ===
|
|
438
|
+
if (e === a.Init1) {
|
|
411
439
|
this.#_ = n;
|
|
412
440
|
return;
|
|
413
441
|
}
|
|
414
|
-
if (e ===
|
|
442
|
+
if (e === a.Command || e === a.CommandLow) {
|
|
415
443
|
let r = e << 16 | t.id;
|
|
416
444
|
this.#g.set(r, n);
|
|
417
445
|
}
|
|
418
446
|
}
|
|
419
447
|
#I() {
|
|
420
448
|
let e = Date.now();
|
|
421
|
-
if (e - this.#s >
|
|
449
|
+
if (e - this.#s > y) {
|
|
422
450
|
this.#t.warn("idle timeout"), this.#R(/* @__PURE__ */ Error("idle timeout"));
|
|
423
451
|
return;
|
|
424
452
|
}
|
|
425
453
|
this.#_ && this.#L(this.#_, e);
|
|
426
454
|
for (let [t, n] of this.#g) {
|
|
427
|
-
if (e - n.firstSend >
|
|
455
|
+
if (e - n.firstSend > y) {
|
|
428
456
|
this.#g.delete(t), this.#R(/* @__PURE__ */ Error("packet ack timeout"));
|
|
429
457
|
return;
|
|
430
458
|
}
|
|
@@ -433,23 +461,23 @@ var h = 500, g = 1024, _ = 5e3, v = 6e4, y = 1e3, b = 5, x = 8, S = 3, C = 500,
|
|
|
433
461
|
}
|
|
434
462
|
#L(e, t) {
|
|
435
463
|
if (t - e.lastSend < e.nextInterval) return;
|
|
436
|
-
e.lastSend = t, e.retryCount++, e.nextInterval = Math.min(e.nextInterval * 2,
|
|
437
|
-
let n = !this.#e.cryptoInitComplete, r = (
|
|
438
|
-
f.set(d.slice(0, x), 0), f.set(
|
|
464
|
+
e.lastSend = t, e.retryCount++, e.nextInterval = Math.min(e.nextInterval * 2, b);
|
|
465
|
+
let n = !this.#e.cryptoInitComplete, r = (c(e.packet) & o.Unencrypted) !== 0, i = u(e.packet), a = s(e.packet), [l, d] = this.#e.encrypt(a, e.packet.id, e.packet.generationID, i, e.packet.data, n, r), f = new Uint8Array(13 + l.length);
|
|
466
|
+
f.set(d.slice(0, x), 0), f.set(i, x), f.set(l, 13), this.#b(f);
|
|
439
467
|
}
|
|
440
468
|
#R(e) {
|
|
441
469
|
this.#i || (this.close(), this.onClosed?.(e));
|
|
442
470
|
}
|
|
443
471
|
};
|
|
444
|
-
function E(e, t) {
|
|
445
|
-
return e === r.Command || e === r.CommandLow ? t | i.NewProtocol : t;
|
|
446
|
-
}
|
|
447
472
|
function D(e, t) {
|
|
473
|
+
return e === a.Command || e === a.CommandLow ? t | o.NewProtocol : t;
|
|
474
|
+
}
|
|
475
|
+
function O(e, t) {
|
|
448
476
|
let n = Date.now();
|
|
449
477
|
for (let [r, i] of e) if ((r - t + 65536 & 65535) < 32768 && n - i.receivedAt > 5e3) return !0;
|
|
450
478
|
return !1;
|
|
451
479
|
}
|
|
452
480
|
//#endregion
|
|
453
|
-
export {
|
|
481
|
+
export { a, c, d, o as i, s as l, h as n, u as o, p as r, l as s, E as t, f as u };
|
|
454
482
|
|
|
455
|
-
//# sourceMappingURL=handler-
|
|
483
|
+
//# sourceMappingURL=handler-DI_abe9c.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handler-DI_abe9c.js","names":[],"sources":["../src/transport/packet.ts","../src/transport/generation-window.ts","../src/transport/quicklz.ts","../src/transport/handler.ts"],"sourcesContent":["export const enum PacketType {\n Voice = 0,\n VoiceWhisper = 1,\n Command = 2,\n CommandLow = 3,\n Ping = 4,\n Pong = 5,\n Ack = 6,\n AckLow = 7,\n Init1 = 8,\n}\n\nexport const enum PacketFlags {\n Fragmented = 0x10,\n NewProtocol = 0x20,\n Compressed = 0x40,\n Unencrypted = 0x80,\n}\n\nexport interface Packet {\n /** Type byte combined with flags (low nibble = type, high nibble = flags). */\n typeFlagged: number;\n id: number;\n clientID: number;\n generationID: number;\n data: Uint8Array;\n receivedAt: number; // Date.now()\n}\n\nexport function packetType(p: Packet): PacketType {\n return (p.typeFlagged & 0x0f) as PacketType;\n}\n\nexport function packetFlags(p: Packet): number {\n return p.typeFlagged & 0xf0;\n}\n\nexport function isUnencrypted(p: Packet): boolean {\n return (packetFlags(p) & PacketFlags.Unencrypted) !== 0;\n}\n\n/** Build the 5-byte client-to-server header: [packetID(2), clientID(2), typeFlagged(1)]. */\nexport function buildC2SHeader(p: Packet): Uint8Array {\n const header = new Uint8Array(5);\n const view = new DataView(header.buffer);\n view.setUint16(0, p.id, false);\n view.setUint16(2, p.clientID, false);\n header[4] = p.typeFlagged;\n return header;\n}\n\n/** Parse a 3-byte server-to-client header. */\nexport function parseS2CHeader(raw: Uint8Array): Pick<Packet, \"id\" | \"typeFlagged\"> {\n const view = new DataView(raw.buffer, raw.byteOffset, raw.byteLength);\n return {\n id: view.getUint16(0, false),\n typeFlagged: raw[2]!,\n };\n}\n\n/** Parse a 5-byte client-to-server header. */\nexport function parseC2SHeader(raw: Uint8Array): Pick<Packet, \"id\" | \"clientID\" | \"typeFlagged\"> {\n const view = new DataView(raw.buffer, raw.byteOffset, raw.byteLength);\n return {\n id: view.getUint16(0, false),\n clientID: view.getUint16(2, false),\n typeFlagged: raw[4]!,\n };\n}\n","export class GenerationWindow {\n #mappedBaseOffset = 0;\n #generation = 0;\n readonly #mod: number;\n readonly #receiveWindow: number;\n\n constructor(mod: number, windowSize: number) {\n this.#mod = mod;\n this.#receiveWindow = windowSize;\n }\n\n get generation(): number {\n return this.#generation;\n }\n\n advance(amount: number): void {\n if (amount <= 0) return;\n const newBaseOffset = this.#mappedBaseOffset + amount;\n const genStep = Math.floor(newBaseOffset / this.#mod);\n if (genStep > 0) {\n this.#generation = Math.min(this.#generation + genStep, 0xffff_ffff);\n }\n this.#mappedBaseOffset = newBaseOffset % this.#mod;\n }\n\n advanceToExcluded(mappedValue: number): void {\n let moveDist = mappedValue - this.#mappedBaseOffset;\n if (moveDist < 0) moveDist += this.#mod;\n this.advance(moveDist + 1);\n }\n\n syncTo(mappedValue: number): void {\n let moveDist = mappedValue - this.#mappedBaseOffset;\n if (moveDist < 0) moveDist += this.#mod;\n this.advance(moveDist);\n }\n\n isInWindow(mappedValue: number): boolean {\n const maxOffset = this.#mappedBaseOffset + this.#receiveWindow;\n if (maxOffset < this.#mod) {\n return mappedValue >= this.#mappedBaseOffset && mappedValue < maxOffset;\n }\n return mappedValue >= this.#mappedBaseOffset || mappedValue < maxOffset - this.#mod;\n }\n\n mappedToIndex(mappedValue: number): number {\n if (this.#isNextGen(mappedValue)) {\n return mappedValue + this.#mod - this.#mappedBaseOffset;\n }\n return mappedValue - this.#mappedBaseOffset;\n }\n\n isOldPacket(mappedValue: number): boolean {\n return this.mappedToIndex(mappedValue) < 0;\n }\n\n isFuturePacket(mappedValue: number): boolean {\n return this.mappedToIndex(mappedValue) >= this.#receiveWindow;\n }\n\n #isNextGen(mappedValue: number): boolean {\n return (\n this.#mappedBaseOffset > this.#mod - this.#receiveWindow &&\n mappedValue < this.#mappedBaseOffset + this.#receiveWindow - this.#mod\n );\n }\n\n getGeneration(mappedValue: number): number {\n if (this.#isNextGen(mappedValue)) return this.#generation + 1;\n return this.#generation;\n }\n\n reset(): void {\n this.#mappedBaseOffset = 0;\n this.#generation = 0;\n }\n}\n","const TABLE_SIZE = 4096;\n\ninterface QlzState {\n control: number;\n sourcePos: number;\n destPos: number;\n nextHashed: number;\n}\n\nexport class Qlz {\n #hashtable = new Int32Array(TABLE_SIZE);\n\n decompress(data: Uint8Array): Uint8Array {\n const { headerLen, decompressedSize, flags } = parseQlzHeader(data);\n\n const dest = new Uint8Array(decompressedSize);\n\n if ((flags & 0x01) === 0) {\n dest.set(data.slice(headerLen, headerLen + decompressedSize));\n return dest;\n }\n\n this.#hashtable.fill(0);\n\n const state: QlzState = {\n control: 1,\n sourcePos: headerLen,\n destPos: 0,\n nextHashed: 0,\n };\n\n while (this.#ensureControl(data, state)) {\n if ((state.control & 1) !== 0) {\n if (!this.#processReference(data, dest, state)) break;\n } else {\n if (this.#processLiteral(data, dest, decompressedSize, state)) break;\n }\n }\n\n return dest;\n }\n\n #ensureControl(data: Uint8Array, st: QlzState): boolean {\n if (st.control !== 1) return true;\n if (st.sourcePos + 4 > data.length) return false;\n st.control =\n (data[st.sourcePos]! |\n (data[st.sourcePos + 1]! << 8) |\n (data[st.sourcePos + 2]! << 16) |\n (data[st.sourcePos + 3]! << 24)) >>>\n 0;\n st.sourcePos += 4;\n return true;\n }\n\n #processReference(data: Uint8Array, dest: Uint8Array, st: QlzState): boolean {\n st.control = (st.control >>> 1) >>> 0;\n if (st.sourcePos + 2 > data.length) return false;\n\n const b1 = data[st.sourcePos]!;\n const b2 = data[st.sourcePos + 1]!;\n st.sourcePos += 2;\n\n const hash = (b1 >> 4) | (b2 << 4);\n let matchlen = b1 & 0x0f;\n if (matchlen !== 0) {\n matchlen += 2;\n } else {\n if (st.sourcePos >= data.length) return false;\n matchlen = data[st.sourcePos]!;\n st.sourcePos++;\n }\n\n const offset = this.#hashtable[hash]!;\n for (let i = 0; i < matchlen; i++) {\n if (st.destPos < dest.length && offset + i < st.destPos) {\n dest[st.destPos] = dest[offset + i]!;\n st.destPos++;\n }\n }\n\n const end = st.destPos + 1 - matchlen;\n this.#updateHashtable(dest, st, end);\n st.nextHashed = st.destPos;\n\n return true;\n }\n\n #processLiteral(\n data: Uint8Array,\n dest: Uint8Array,\n decompressedSize: number,\n st: QlzState,\n ): boolean {\n const threshold = Math.max(decompressedSize, 10) - 10;\n if (st.destPos >= threshold) {\n while (st.destPos < decompressedSize) {\n if (st.control === 1) {\n st.sourcePos += 4;\n if (st.sourcePos > data.length) break;\n st.control =\n (data[st.sourcePos - 4]! |\n (data[st.sourcePos - 3]! << 8) |\n (data[st.sourcePos - 2]! << 16) |\n (data[st.sourcePos - 1]! << 24)) >>>\n 0;\n }\n if (st.sourcePos >= data.length) break;\n dest[st.destPos++] = data[st.sourcePos++]!;\n st.control = (st.control >>> 1) >>> 0;\n }\n return true;\n }\n\n if (st.sourcePos >= data.length || st.destPos >= dest.length) return true;\n\n dest[st.destPos++] = data[st.sourcePos++]!;\n st.control = (st.control >>> 1) >>> 0;\n\n const end = Math.max(st.destPos - 2, 0);\n this.#updateHashtable(dest, st, end);\n if (st.nextHashed < end) st.nextHashed = end;\n\n return false;\n }\n\n #updateHashtable(dest: Uint8Array, st: QlzState, end: number): void {\n while (st.nextHashed < end) {\n if (st.nextHashed + 3 > dest.length) break;\n const v =\n (dest[st.nextHashed]! |\n (dest[st.nextHashed + 1]! << 8) |\n (dest[st.nextHashed + 2]! << 16)) >>>\n 0;\n const hash = ((v >> 12) ^ v) & 0xfff;\n this.#hashtable[hash] = st.nextHashed;\n st.nextHashed++;\n }\n }\n}\n\nfunction parseQlzHeader(data: Uint8Array): {\n headerLen: number;\n decompressedSize: number;\n flags: number;\n} {\n if (data.length < 3) throw new Error(\"QuickLZ: data too short\");\n\n const flags = data[0]!;\n const level = (flags >> 2) & 0x03;\n if (level !== 1) throw new Error(\"QuickLZ: only level 1 is supported\");\n\n const headerLen = (flags & 0x02) !== 0 ? 9 : 3;\n if (data.length < headerLen) throw new Error(\"QuickLZ: data too short for header\");\n\n let decompressedSize: number;\n if ((flags & 0x02) !== 0) {\n decompressedSize = (data[5]! | (data[6]! << 8) | (data[7]! << 16) | (data[8]! << 24)) >>> 0;\n } else {\n decompressedSize = data[2]!;\n }\n\n return { headerLen, decompressedSize, flags };\n}\n","import { createSocket, type Socket as UdpSocket } from \"node:dgram\";\nimport { isIP } from \"node:net\";\nimport { splitHostPort } from \"../address.js\";\nimport type { Crypt } from \"../crypto/crypt.js\";\nimport type { Logger } from \"../types.js\";\nimport { noopLogger } from \"../types.js\";\nimport {\n type Packet,\n PacketType,\n PacketFlags,\n packetType,\n packetFlags,\n buildC2SHeader,\n parseS2CHeader,\n} from \"./packet.js\";\nimport { GenerationWindow } from \"./generation-window.js\";\nimport { Qlz } from \"./quicklz.js\";\nimport { processInit1 } from \"../handshake/crypt-handshake.js\";\n\nconst MAX_OUT_PACKET_SIZE = 500;\nconst RECEIVE_PACKET_WINDOW_SIZE = 1024;\nconst PING_INTERVAL_MS = 5_000;\nconst PACKET_TIMEOUT_MS = 60_000;\nconst MAX_RETRY_INTERVAL_MS = 1_000;\nconst HEADER_SIZE = 5;\nconst TAG_SIZE = 8;\nconst VOICE_HEADER_SIZE = 3;\nconst WHISPER_HEADER_SIZE = 5;\nconst RESEND_BASE_INTERVAL_MS = 500;\nconst RESEND_LOOP_INTERVAL_MS = 100;\n\ninterface ResendPacket {\n packet: Packet;\n firstSend: number;\n lastSend: number;\n retryCount: number;\n nextInterval: number;\n}\n\nexport class PacketHandler {\n onPacket: ((p: Packet) => void) | null = null;\n onClosed: ((err: Error | null) => void) | null = null;\n\n readonly #crypt: Crypt;\n readonly #logger: Logger;\n\n #conn: UdpSocket | null = null;\n #clientID = 0;\n #closed = false;\n #stopPing: (() => void) | null = null;\n #stopResend: (() => void) | null = null;\n #lastMessageReceived = Date.now();\n\n #packetCounter = new Uint16Array(9);\n #generationCounter = new Uint32Array(9);\n\n #recvWindowCommand = new GenerationWindow(1 << 16, RECEIVE_PACKET_WINDOW_SIZE);\n #recvWindowCommandLow = new GenerationWindow(1 << 16, RECEIVE_PACKET_WINDOW_SIZE);\n #sendWindowCommand = new GenerationWindow(1 << 16, RECEIVE_PACKET_WINDOW_SIZE);\n #sendWindowCommandLow = new GenerationWindow(1 << 16, RECEIVE_PACKET_WINDOW_SIZE);\n\n #commandQueue = new Map<number, Packet>();\n #commandLowQueue = new Map<number, Packet>();\n #ackManager = new Map<number, ResendPacket>();\n #initPacketCheck: ResendPacket | null = null;\n\n constructor(crypt: Crypt, logger: Logger = noopLogger) {\n this.#crypt = crypt;\n this.#logger = logger;\n }\n\n setClientID(id: number): void {\n this.#clientID = id;\n }\n\n connect(addr: string): Promise<void> {\n return new Promise((resolve, reject) => {\n const { host, port } = splitHostPort(addr);\n\n const socket = createSocket(isIP(host) === 6 ? \"udp6\" : \"udp4\");\n const onError = (error: Error) => {\n socket.close();\n reject(error);\n };\n socket.once(\"error\", onError);\n socket.connect(parseInt(port, 10), host, () => {\n socket.off(\"error\", onError);\n this.start(socket);\n resolve();\n });\n });\n }\n\n start(conn: UdpSocket): void {\n this.#conn = conn;\n this.#closed = false;\n this.#lastMessageReceived = Date.now();\n\n conn.on(\"message\", (msg) => {\n this.#lastMessageReceived = Date.now();\n this.#handleRawPacket(new Uint8Array(msg.buffer, msg.byteOffset, msg.byteLength));\n });\n conn.on(\"error\", (err) => {\n this.#logger.error(\"udp error\", err);\n this.#triggerClose(err);\n });\n conn.on(\"close\", () => this.#triggerClose(null));\n\n this.#packetCounter[PacketType.Command] = 1;\n this.#packetCounter[PacketType.Init1] = 101;\n\n const init1Data = processInit1(this.#crypt, null);\n if (init1Data) this.#sendPacketRaw(PacketType.Init1, init1Data, 0);\n\n // Ping loop\n const pingTimer = setInterval(() => {\n if (this.#crypt.cryptoInitComplete) {\n this.sendPacket(PacketType.Ping, new Uint8Array(0), PacketFlags.Unencrypted);\n }\n }, PING_INTERVAL_MS);\n this.#stopPing = () => clearInterval(pingTimer);\n\n // Resend loop\n const resendTimer = setInterval(() => this.#checkResends(), RESEND_LOOP_INTERVAL_MS);\n this.#stopResend = () => clearInterval(resendTimer);\n }\n\n receivedFinalInitAck(): void {\n this.#initPacketCheck = null;\n }\n\n sendPacket(pType: PacketType, data: Uint8Array, flags: number): void {\n const dummy = !this.#crypt.cryptoInitComplete;\n if (data.length > 487 && pType !== PacketType.Voice && pType !== PacketType.VoiceWhisper) {\n this.#sendSplitPacket(pType, data, flags, dummy);\n return;\n }\n this.#sendPacketRaw(pType, data, flags, dummy);\n }\n\n sendVoicePacket(data: Uint8Array, codec: number): void {\n const pID = this.#packetCounter[PacketType.Voice]!;\n const pGen = this.#generationCounter[PacketType.Voice]!;\n this.#packetCounter[PacketType.Voice] = (pID + 1) & 0xffff;\n if (this.#packetCounter[PacketType.Voice] === 0) {\n this.#generationCounter[PacketType.Voice]!++;\n }\n\n const payloadLen = VOICE_HEADER_SIZE + data.length;\n const voicePayload = new Uint8Array(payloadLen);\n new DataView(voicePayload.buffer).setUint16(0, pID, false);\n voicePayload[2] = codec;\n voicePayload.set(data, VOICE_HEADER_SIZE);\n\n const p: Packet = {\n typeFlagged: PacketType.Voice | PacketFlags.Unencrypted,\n id: pID,\n clientID: this.#clientID,\n generationID: pGen,\n data: voicePayload,\n receivedAt: 0,\n };\n\n const header = buildC2SHeader(p);\n const final = new Uint8Array(TAG_SIZE + HEADER_SIZE + payloadLen);\n final.set(this.#crypt.fakeSignature, 0);\n final.set(header, TAG_SIZE);\n final.set(voicePayload, TAG_SIZE + HEADER_SIZE);\n this.#write(final);\n }\n\n /** Send an unencrypted TeamSpeak voice whisper packet to up to 32 clients. */\n sendWhisperPacket(data: Uint8Array, targetClientIds: number[], codec: number): void {\n if (targetClientIds.length === 0) throw new Error(\"whisper requires at least one target\");\n if (targetClientIds.length > 32) throw new Error(\"too many whisper targets\");\n if (targetClientIds.some((id) => !Number.isInteger(id) || id < 0 || id > 0xffff)) {\n throw new RangeError(\"invalid whisper target\");\n }\n\n const pID = this.#packetCounter[PacketType.VoiceWhisper]!;\n const pGen = this.#generationCounter[PacketType.VoiceWhisper]!;\n this.#packetCounter[PacketType.VoiceWhisper] = (pID + 1) & 0xffff;\n if (this.#packetCounter[PacketType.VoiceWhisper] === 0) {\n this.#generationCounter[PacketType.VoiceWhisper] = (pGen + 1) >>> 0;\n }\n\n const payloadLen = WHISPER_HEADER_SIZE + targetClientIds.length * 2 + data.length;\n const whisperPayload = new Uint8Array(payloadLen);\n const view = new DataView(whisperPayload.buffer);\n view.setUint16(0, pID, false);\n whisperPayload[2] = codec;\n whisperPayload[3] = 0;\n whisperPayload[4] = targetClientIds.length;\n for (let index = 0; index < targetClientIds.length; index++) {\n view.setUint16(WHISPER_HEADER_SIZE + index * 2, targetClientIds[index]!, false);\n }\n whisperPayload.set(data, WHISPER_HEADER_SIZE + targetClientIds.length * 2);\n\n const packet: Packet = {\n typeFlagged: PacketType.VoiceWhisper | PacketFlags.Unencrypted,\n id: pID,\n clientID: this.#clientID,\n generationID: pGen,\n data: whisperPayload,\n receivedAt: 0,\n };\n const header = buildC2SHeader(packet);\n const final = new Uint8Array(TAG_SIZE + HEADER_SIZE + payloadLen);\n final.set(this.#crypt.fakeSignature, 0);\n final.set(header, TAG_SIZE);\n final.set(whisperPayload, TAG_SIZE + HEADER_SIZE);\n this.#write(final);\n }\n\n close(): void {\n if (this.#closed) return;\n this.#closed = true;\n this.#stopPing?.();\n this.#stopResend?.();\n this.#conn?.close();\n }\n\n // ---- Private ---------------------------------------------------------------\n\n #sendSplitPacket(pType: PacketType, data: Uint8Array, flags: number, dummy: boolean): void {\n const maxSize = MAX_OUT_PACKET_SIZE - HEADER_SIZE - TAG_SIZE; // 487\n let pos = 0;\n let first = true;\n\n while (pos < data.length) {\n const blockSize = Math.min(data.length - pos, maxSize);\n const last = pos + blockSize === data.length;\n\n let pFlags = flags;\n if (first !== last) pFlags |= PacketFlags.Fragmented;\n\n this.#sendPacketRaw(pType, data.slice(pos, pos + blockSize), pFlags, dummy);\n pos += blockSize;\n first = false;\n }\n }\n\n #sendPacketRaw(\n pType: PacketType,\n data: Uint8Array,\n flags: number,\n dummy = !this.#crypt.cryptoInitComplete,\n ): void {\n flags = applyProtocolFlags(pType, flags);\n const [pID, pGen] = this.#nextPacketIdentity(pType);\n const p: Packet = {\n typeFlagged: pType | flags,\n id: pID,\n clientID: this.#clientID,\n generationID: pGen,\n data,\n receivedAt: 0,\n };\n\n const unencrypted = (flags & PacketFlags.Unencrypted) !== 0;\n const header = buildC2SHeader(p);\n const [ciphertext, tag] = this.#crypt.encrypt(\n pType,\n pID,\n pGen,\n header,\n data,\n dummy,\n unencrypted,\n );\n\n const final = new Uint8Array(TAG_SIZE + HEADER_SIZE + ciphertext.length);\n final.set(tag.slice(0, TAG_SIZE), 0);\n final.set(header, TAG_SIZE);\n final.set(ciphertext, TAG_SIZE + HEADER_SIZE);\n this.#write(final);\n\n const rp: ResendPacket = {\n packet: p,\n firstSend: Date.now(),\n lastSend: Date.now(),\n retryCount: 0,\n nextInterval: RESEND_BASE_INTERVAL_MS,\n };\n this.#trackResend(pType, p, rp);\n }\n\n #write(data: Uint8Array): void {\n if (!this.#conn) return;\n try {\n this.#conn.send(Buffer.from(data), (err) => {\n if (err) this.#logger.warn(\"udp send error\", err);\n });\n } catch (error: unknown) {\n const normalized = error instanceof Error ? error : new Error(String(error));\n // dgram can throw synchronously for an invalid family/address pair. A\n // malformed remote target must close this session, never escape from an\n // async socket callback and terminate the gateway process.\n this.#logger.error(\"udp send failed\", normalized);\n this.#triggerClose(normalized);\n }\n }\n\n #handleRawPacket(raw: Uint8Array): void {\n if (raw.length < 11) return;\n\n const tag = raw.slice(0, TAG_SIZE);\n const header = raw.slice(TAG_SIZE, TAG_SIZE + 3);\n const ciphertext = raw.slice(TAG_SIZE + 3);\n\n const parsed = parseS2CHeader(header);\n const p: Packet = {\n ...parsed,\n clientID: 0,\n generationID: this.#resolveGeneration(parsed.id, parsed.typeFlagged & 0x0f),\n data: new Uint8Array(0),\n receivedAt: Date.now(),\n };\n\n const decrypted = this.#decryptPacketData(p, header, ciphertext, tag);\n if (decrypted === null) return;\n p.data = decrypted.plaintext;\n\n const pType = packetType(p);\n\n if (pType === PacketType.Ping) {\n this.#sendPong(p.id, decrypted.dummyUsed);\n return;\n }\n\n if (!this.#handleCommandWindowAndAck(p, decrypted.dummyUsed)) return;\n\n this.#handlePacketQueue(p);\n this.#updatePostReceiveState(p);\n }\n\n #resolveGeneration(id: number, pType: number): number {\n switch (pType as PacketType) {\n case PacketType.Command:\n return this.#recvWindowCommand.getGeneration(id);\n case PacketType.CommandLow:\n return this.#recvWindowCommandLow.getGeneration(id);\n case PacketType.Ack:\n return this.#sendWindowCommand.getGeneration(id);\n case PacketType.AckLow:\n return this.#sendWindowCommandLow.getGeneration(id);\n default:\n return 0;\n }\n }\n\n #decryptPacketData(\n p: Packet,\n header: Uint8Array,\n ciphertext: Uint8Array,\n tag: Uint8Array,\n ): { plaintext: Uint8Array; dummyUsed: boolean } | null {\n const unencrypted = (packetFlags(p) & PacketFlags.Unencrypted) !== 0;\n const dummy = !this.#crypt.cryptoInitComplete;\n let dummyUsed = dummy;\n const pType = packetType(p);\n const gen = p.generationID;\n\n try {\n const plaintext = this.#crypt.decrypt(\n pType,\n p.id,\n gen,\n header,\n ciphertext,\n tag,\n dummy,\n unencrypted,\n );\n return { plaintext, dummyUsed };\n } catch {\n // Try adjacent generations\n for (const offset of [-1, 1]) {\n const guessGen = gen + offset;\n if (guessGen < 0) continue;\n try {\n const plaintext = this.#crypt.decrypt(\n pType,\n p.id,\n guessGen,\n header,\n ciphertext,\n tag,\n false,\n false,\n );\n return { plaintext, dummyUsed: false };\n } catch {\n // continue\n }\n }\n\n // Try dummy fallback for command/ack types\n if (\n pType === PacketType.Command ||\n pType === PacketType.CommandLow ||\n pType === PacketType.Ack\n ) {\n try {\n const plaintext = this.#crypt.decrypt(\n pType,\n p.id,\n gen,\n header,\n ciphertext,\n tag,\n true,\n unencrypted,\n );\n return { plaintext, dummyUsed: true };\n } catch {\n // fall through\n }\n }\n\n return null;\n }\n }\n\n #handleCommandWindowAndAck(p: Packet, dummyUsed: boolean): boolean {\n const pType = packetType(p);\n if (pType !== PacketType.Command && pType !== PacketType.CommandLow) return true;\n\n const win = pType === PacketType.Command ? this.#recvWindowCommand : this.#recvWindowCommandLow;\n const ackType = pType === PacketType.Command ? PacketType.Ack : PacketType.AckLow;\n\n if (!win.isInWindow(p.id)) {\n if (win.isOldPacket(p.id)) {\n this.#sendAck(p.id, ackType, dummyUsed);\n }\n return false;\n }\n this.#sendAck(p.id, ackType, dummyUsed);\n return true;\n }\n\n #sendAck(packetID: number, ackType: PacketType, dummyUsed: boolean): void {\n const ackData = new Uint8Array(2);\n new DataView(ackData.buffer).setUint16(0, packetID, false);\n this.#sendPacketRaw(ackType, ackData, 0, dummyUsed);\n }\n\n #sendPong(pID: number, dummyUsed: boolean): void {\n const pongData = new Uint8Array(2);\n new DataView(pongData.buffer).setUint16(0, pID, false);\n this.#sendPacketRaw(PacketType.Pong, pongData, PacketFlags.Unencrypted, dummyUsed);\n }\n\n #handlePacketQueue(p: Packet): void {\n const pType = packetType(p);\n if (pType !== PacketType.Command && pType !== PacketType.CommandLow) {\n this.onPacket?.(p);\n return;\n }\n\n const isCommand = pType === PacketType.Command;\n const queue = isCommand ? this.#commandQueue : this.#commandLowQueue;\n const win = isCommand ? this.#recvWindowCommand : this.#recvWindowCommandLow;\n\n queue.set(p.id, p);\n\n if (isCommand) {\n this.#fastForwardMissingPackets(queue, win, true);\n } else {\n this.#fastForwardMissingPackets(queue, win, false);\n }\n\n while (true) {\n const current = isCommand ? this.#_nextCommandID : this.#_nextCommandLowID;\n const packet = queue.get(current);\n if (packet === undefined) break;\n\n const result = this.#tryReassemble(packet, queue, current, win);\n if (!result) break;\n\n const [reassembled, newNext] = result;\n if (isCommand) this.#_nextCommandID = newNext;\n else this.#_nextCommandLowID = newNext;\n\n this.#tryDecompress(reassembled);\n this.onPacket?.(reassembled);\n }\n }\n\n #_nextCommandID = 0;\n #_nextCommandLowID = 0;\n\n #fastForwardMissingPackets(\n queue: Map<number, Packet>,\n win: GenerationWindow,\n isCommand: boolean,\n ): void {\n let nextID = isCommand ? this.#_nextCommandID : this.#_nextCommandLowID;\n while (!queue.has(nextID) && hasOldNewerPacket(queue, nextID)) {\n nextID = (nextID + 1) & 0xffff;\n win.advance(1);\n }\n if (isCommand) this.#_nextCommandID = nextID;\n else this.#_nextCommandLowID = nextID;\n }\n\n #tryReassemble(\n startPacket: Packet,\n queue: Map<number, Packet>,\n nextID: number,\n win: GenerationWindow,\n ): [reassembled: Packet, newNextID: number] | null {\n if ((packetFlags(startPacket) & PacketFlags.Fragmented) === 0) {\n queue.delete(nextID);\n win.advance(1);\n return [startPacket, (nextID + 1) & 0xffff];\n }\n\n const fragments: Packet[] = [];\n let totalSize = 0;\n let currID = nextID;\n let startSeen = false;\n let complete = false;\n\n while (true) {\n const frag = queue.get(currID);\n if (!frag) return null;\n fragments.push(frag);\n totalSize += frag.data.length;\n\n const fragmented = (packetFlags(frag) & PacketFlags.Fragmented) !== 0;\n if (!startSeen) {\n startSeen = true;\n if (!fragmented) {\n complete = true;\n break;\n }\n } else if (fragmented) {\n complete = true;\n break;\n }\n currID = (currID + 1) & 0xffff;\n }\n\n if (!complete) return null;\n\n const combined = new Uint8Array(totalSize);\n let pos = 0;\n for (const frag of fragments) {\n combined.set(frag.data, pos);\n pos += frag.data.length;\n queue.delete(nextID);\n win.advance(1);\n nextID = (nextID + 1) & 0xffff;\n }\n\n startPacket.data = combined;\n startPacket.typeFlagged &= ~PacketFlags.Fragmented;\n return [startPacket, nextID];\n }\n\n #tryDecompress(packet: Packet): void {\n if ((packetFlags(packet) & PacketFlags.Compressed) === 0) return;\n try {\n const qlz = new Qlz();\n packet.data = qlz.decompress(packet.data);\n packet.typeFlagged &= ~PacketFlags.Compressed;\n } catch (err) {\n this.#logger.debug(\"decompression failed\", { id: packet.id, err });\n }\n }\n\n #updatePostReceiveState(p: Packet): void {\n const pType = packetType(p);\n\n if (pType === PacketType.Init1) {\n this.#initPacketCheck = null;\n return;\n }\n\n if ((pType === PacketType.Ack || pType === PacketType.AckLow) && p.data.length >= 2) {\n const ackID = new DataView(p.data.buffer, p.data.byteOffset).getUint16(0, false);\n const targetType = pType === PacketType.Ack ? PacketType.Command : PacketType.CommandLow;\n const key = (targetType << 16) | ackID;\n this.#ackManager.delete(key);\n }\n }\n\n #nextPacketIdentity(pType: PacketType): [id: number, gen: number] {\n const pID = this.#packetCounter[pType]!;\n const pGen = this.#generationCounter[pType]!;\n\n if (pType === PacketType.Init1) return [pID, pGen];\n\n this.#packetCounter[pType] = (pID + 1) & 0xffff;\n if (this.#packetCounter[pType] === 0) {\n this.#generationCounter[pType] = (pGen + 1) >>> 0;\n }\n\n if (pType === PacketType.Command) {\n this.#sendWindowCommand.advanceToExcluded(pID);\n } else if (pType === PacketType.CommandLow) {\n this.#sendWindowCommandLow.advanceToExcluded(pID);\n }\n\n return [pID, pGen];\n }\n\n #trackResend(pType: PacketType, p: Packet, rp: ResendPacket): void {\n if (pType === PacketType.Init1) {\n this.#initPacketCheck = rp;\n return;\n }\n if (pType === PacketType.Command || pType === PacketType.CommandLow) {\n const key = (pType << 16) | p.id;\n this.#ackManager.set(key, rp);\n }\n }\n\n #checkResends(): void {\n const now = Date.now();\n\n if (now - this.#lastMessageReceived > PACKET_TIMEOUT_MS) {\n this.#logger.warn(\"idle timeout\");\n this.#triggerClose(new Error(\"idle timeout\"));\n return;\n }\n\n if (this.#initPacketCheck) {\n this.#doResend(this.#initPacketCheck, now);\n }\n\n for (const [key, rp] of this.#ackManager) {\n if (now - rp.firstSend > PACKET_TIMEOUT_MS) {\n this.#ackManager.delete(key);\n this.#triggerClose(new Error(\"packet ack timeout\"));\n return;\n }\n this.#doResend(rp, now);\n }\n }\n\n #doResend(rp: ResendPacket, now: number): void {\n if (now - rp.lastSend < rp.nextInterval) return;\n\n rp.lastSend = now;\n rp.retryCount++;\n rp.nextInterval = Math.min(rp.nextInterval * 2, MAX_RETRY_INTERVAL_MS);\n\n const dummy = !this.#crypt.cryptoInitComplete;\n const unencrypted = (packetFlags(rp.packet) & PacketFlags.Unencrypted) !== 0;\n const header = buildC2SHeader(rp.packet);\n const pType = packetType(rp.packet);\n\n const [ciphertext, tag] = this.#crypt.encrypt(\n pType,\n rp.packet.id,\n rp.packet.generationID,\n header,\n rp.packet.data,\n dummy,\n unencrypted,\n );\n\n const final = new Uint8Array(TAG_SIZE + HEADER_SIZE + ciphertext.length);\n final.set(tag.slice(0, TAG_SIZE), 0);\n final.set(header, TAG_SIZE);\n final.set(ciphertext, TAG_SIZE + HEADER_SIZE);\n this.#write(final);\n }\n\n #triggerClose(err: Error | null): void {\n if (this.#closed) return;\n this.close();\n this.onClosed?.(err);\n }\n}\n\n// ---- Helpers ----------------------------------------------------------------\n\nfunction applyProtocolFlags(pType: PacketType, flags: number): number {\n if (pType === PacketType.Command || pType === PacketType.CommandLow) {\n return flags | PacketFlags.NewProtocol;\n }\n return flags;\n}\n\nfunction hasOldNewerPacket(queue: Map<number, Packet>, nextID: number): boolean {\n const now = Date.now();\n for (const [id, pkg] of queue) {\n const diff = (id - nextID + 0x10000) & 0xffff;\n if (diff < 0x8000 && now - pkg.receivedAt > 5_000) {\n return true;\n }\n }\n return false;\n}\n"],"mappings":"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"}
|