@honeybbq/teamspeak-client 0.3.1 → 1.0.0-beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (151) hide show
  1. package/README.md +345 -64
  2. package/dist/abort.d.ts +5 -0
  3. package/dist/abort.d.ts.map +1 -0
  4. package/dist/address.d.ts +8 -0
  5. package/dist/address.d.ts.map +1 -1
  6. package/dist/api/voice.d.ts +24 -0
  7. package/dist/api/voice.d.ts.map +1 -0
  8. package/dist/capabilities.d.ts +62 -0
  9. package/dist/capabilities.d.ts.map +1 -0
  10. package/dist/client.d.ts +173 -39
  11. package/dist/client.d.ts.map +1 -1
  12. package/dist/commands.d.ts +45 -27
  13. package/dist/commands.d.ts.map +1 -1
  14. package/dist/crypto/crypt.d.ts +19 -4
  15. package/dist/crypto/crypt.d.ts.map +1 -1
  16. package/dist/crypto/identity.d.ts +87 -8
  17. package/dist/crypto/identity.d.ts.map +1 -1
  18. package/dist/crypto/index.d.ts +2 -1
  19. package/dist/crypto/index.d.ts.map +1 -1
  20. package/dist/diagnostics.d.ts +45 -0
  21. package/dist/diagnostics.d.ts.map +1 -0
  22. package/dist/discovery/resolver.d.ts +21 -3
  23. package/dist/discovery/resolver.d.ts.map +1 -1
  24. package/dist/errors.d.ts +70 -16
  25. package/dist/errors.d.ts.map +1 -1
  26. package/dist/events.d.ts +4 -5
  27. package/dist/events.d.ts.map +1 -1
  28. package/dist/handshake/crypt-handshake.d.ts +1 -0
  29. package/dist/handshake/crypt-handshake.d.ts.map +1 -1
  30. package/dist/handshake/crypt-init2.d.ts.map +1 -1
  31. package/dist/handshake/license.d.ts +7 -0
  32. package/dist/handshake/license.d.ts.map +1 -1
  33. package/dist/handshake.d.ts +14 -5
  34. package/dist/handshake.d.ts.map +1 -1
  35. package/dist/helpers.d.ts +0 -8
  36. package/dist/helpers.d.ts.map +1 -1
  37. package/dist/index.d.ts +20 -6
  38. package/dist/index.d.ts.map +1 -1
  39. package/dist/index.js +3996 -0
  40. package/dist/index.js.map +1 -0
  41. package/dist/notifications.d.ts +7 -15
  42. package/dist/notifications.d.ts.map +1 -1
  43. package/dist/reconnect.d.ts +69 -0
  44. package/dist/reconnect.d.ts.map +1 -0
  45. package/dist/throttle.d.ts +9 -0
  46. package/dist/throttle.d.ts.map +1 -1
  47. package/dist/transfer.d.ts +27 -25
  48. package/dist/transfer.d.ts.map +1 -1
  49. package/dist/transport/generation-window.d.ts +15 -0
  50. package/dist/transport/generation-window.d.ts.map +1 -1
  51. package/dist/transport/handler.d.ts +44 -5
  52. package/dist/transport/handler.d.ts.map +1 -1
  53. package/dist/transport/quicklz.d.ts +19 -0
  54. package/dist/transport/quicklz.d.ts.map +1 -1
  55. package/dist/types.d.ts +277 -97
  56. package/dist/types.d.ts.map +1 -1
  57. package/package.json +21 -56
  58. package/src/abort.ts +24 -0
  59. package/src/address.ts +74 -0
  60. package/src/api/voice.ts +61 -0
  61. package/src/capabilities.ts +92 -0
  62. package/src/client.ts +1393 -0
  63. package/src/commands.ts +193 -0
  64. package/src/crypto/crypt-ops.ts +6 -0
  65. package/src/crypto/crypt.ts +274 -0
  66. package/src/crypto/eax.ts +152 -0
  67. package/src/crypto/identity.ts +484 -0
  68. package/src/crypto/index.ts +21 -0
  69. package/src/crypto/primitives.ts +141 -0
  70. package/src/diagnostics.ts +58 -0
  71. package/src/discovery/index.ts +1 -0
  72. package/src/discovery/resolver.ts +272 -0
  73. package/src/errors.ts +156 -0
  74. package/src/events.ts +28 -0
  75. package/src/handshake/crypt-handshake.ts +135 -0
  76. package/src/handshake/crypt-init2.ts +48 -0
  77. package/src/handshake/index.ts +3 -0
  78. package/src/handshake/license.fuzz.test.ts +87 -0
  79. package/src/handshake/license.test.ts +49 -0
  80. package/src/handshake/license.ts +208 -0
  81. package/src/handshake.ts +137 -0
  82. package/src/helpers.ts +10 -0
  83. package/src/index.ts +74 -0
  84. package/src/notifications.ts +136 -0
  85. package/src/reconnect.ts +141 -0
  86. package/src/throttle.ts +92 -0
  87. package/src/transfer.ts +127 -0
  88. package/src/transport/generation-window.ts +108 -0
  89. package/src/transport/handler.ts +917 -0
  90. package/src/transport/index.ts +14 -0
  91. package/src/transport/packet.ts +69 -0
  92. package/src/transport/quicklz.ts +209 -0
  93. package/src/types.ts +350 -0
  94. package/dist/address-BR-5unVo.cjs +0 -2
  95. package/dist/address-BR-5unVo.cjs.map +0 -1
  96. package/dist/address-BfmovVpp.js +0 -65
  97. package/dist/address-BfmovVpp.js.map +0 -1
  98. package/dist/api.d.ts +0 -17
  99. package/dist/api.d.ts.map +0 -1
  100. package/dist/command/command.d.ts +0 -12
  101. package/dist/command/command.d.ts.map +0 -1
  102. package/dist/command/index.cjs +0 -1
  103. package/dist/command/index.d.ts +0 -4
  104. package/dist/command/index.d.ts.map +0 -1
  105. package/dist/command/index.mjs +0 -3
  106. package/dist/command/parser.d.ts +0 -3
  107. package/dist/command/parser.d.ts.map +0 -1
  108. package/dist/command-BLe-C2L2.js +0 -74
  109. package/dist/command-BLe-C2L2.js.map +0 -1
  110. package/dist/command-DAK4pUBP.cjs +0 -4
  111. package/dist/command-DAK4pUBP.cjs.map +0 -1
  112. package/dist/crypt-handshake-CQkQreLx.cjs +0 -2
  113. package/dist/crypt-handshake-CQkQreLx.cjs.map +0 -1
  114. package/dist/crypt-handshake-DziOY4Lq.js +0 -55
  115. package/dist/crypt-handshake-DziOY4Lq.js.map +0 -1
  116. package/dist/crypt-init2-D70ha4LB.js +0 -158
  117. package/dist/crypt-init2-D70ha4LB.js.map +0 -1
  118. package/dist/crypt-init2-DparLekm.cjs +0 -2
  119. package/dist/crypt-init2-DparLekm.cjs.map +0 -1
  120. package/dist/crypto/index.cjs +0 -1
  121. package/dist/crypto/index.mjs +0 -3
  122. package/dist/crypto-Bg02m4ZE.js +0 -165
  123. package/dist/crypto-Bg02m4ZE.js.map +0 -1
  124. package/dist/crypto-CDlweUL3.cjs +0 -2
  125. package/dist/crypto-CDlweUL3.cjs.map +0 -1
  126. package/dist/discovery/index.cjs +0 -1
  127. package/dist/discovery/index.mjs +0 -2
  128. package/dist/handler-DI_abe9c.js +0 -483
  129. package/dist/handler-DI_abe9c.js.map +0 -1
  130. package/dist/handler-DuwoO5RC.cjs +0 -2
  131. package/dist/handler-DuwoO5RC.cjs.map +0 -1
  132. package/dist/handshake/index.cjs +0 -1
  133. package/dist/handshake/index.mjs +0 -3
  134. package/dist/index.cjs +0 -4
  135. package/dist/index.cjs.map +0 -1
  136. package/dist/index.mjs +0 -827
  137. package/dist/index.mjs.map +0 -1
  138. package/dist/parser-CL33R9tr.cjs +0 -2
  139. package/dist/parser-CL33R9tr.cjs.map +0 -1
  140. package/dist/parser-DZMv3Jm-.js +0 -33
  141. package/dist/parser-DZMv3Jm-.js.map +0 -1
  142. package/dist/primitives-cNNAeFCo.cjs +0 -2
  143. package/dist/primitives-cNNAeFCo.cjs.map +0 -1
  144. package/dist/primitives-xIr6Tjk4.js +0 -1457
  145. package/dist/primitives-xIr6Tjk4.js.map +0 -1
  146. package/dist/resolver-6B8dI9gr.js +0 -141
  147. package/dist/resolver-6B8dI9gr.js.map +0 -1
  148. package/dist/resolver-DCcmyWSK.cjs +0 -4
  149. package/dist/resolver-DCcmyWSK.cjs.map +0 -1
  150. package/dist/transport/index.cjs +0 -1
  151. package/dist/transport/index.mjs +0 -2
@@ -1,483 +0,0 @@
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";
5
- //#region src/transport/packet.ts
6
- var a = /* @__PURE__ */ function(e) {
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;
8
- }({}), o = /* @__PURE__ */ function(e) {
9
- return e[e.Fragmented = 16] = "Fragmented", e[e.NewProtocol = 32] = "NewProtocol", e[e.Compressed = 64] = "Compressed", e[e.Unencrypted = 128] = "Unencrypted", e;
10
- }({});
11
- function s(e) {
12
- return e.typeFlagged & 15;
13
- }
14
- function c(e) {
15
- return e.typeFlagged & 240;
16
- }
17
- function l(e) {
18
- return !!(c(e) & 128);
19
- }
20
- function u(e) {
21
- let t = /* @__PURE__ */ new Uint8Array(5), n = new DataView(t.buffer);
22
- return n.setUint16(0, e.id, !1), n.setUint16(2, e.clientID, !1), t[4] = e.typeFlagged, t;
23
- }
24
- function d(e) {
25
- return {
26
- id: new DataView(e.buffer, e.byteOffset, e.byteLength).getUint16(0, !1),
27
- typeFlagged: e[2]
28
- };
29
- }
30
- function f(e) {
31
- let t = new DataView(e.buffer, e.byteOffset, e.byteLength);
32
- return {
33
- id: t.getUint16(0, !1),
34
- clientID: t.getUint16(2, !1),
35
- typeFlagged: e[4]
36
- };
37
- }
38
- //#endregion
39
- //#region src/transport/generation-window.ts
40
- var p = class {
41
- #e = 0;
42
- #t = 0;
43
- #n;
44
- #r;
45
- constructor(e, t) {
46
- this.#n = e, this.#r = t;
47
- }
48
- get generation() {
49
- return this.#t;
50
- }
51
- advance(e) {
52
- if (e <= 0) return;
53
- let t = this.#e + e, n = Math.floor(t / this.#n);
54
- n > 0 && (this.#t = Math.min(this.#t + n, 4294967295)), this.#e = t % this.#n;
55
- }
56
- advanceToExcluded(e) {
57
- let t = e - this.#e;
58
- t < 0 && (t += this.#n), this.advance(t + 1);
59
- }
60
- syncTo(e) {
61
- let t = e - this.#e;
62
- t < 0 && (t += this.#n), this.advance(t);
63
- }
64
- isInWindow(e) {
65
- let t = this.#e + this.#r;
66
- return t < this.#n ? e >= this.#e && e < t : e >= this.#e || e < t - this.#n;
67
- }
68
- mappedToIndex(e) {
69
- return this.#i(e) ? e + this.#n - this.#e : e - this.#e;
70
- }
71
- isOldPacket(e) {
72
- return this.mappedToIndex(e) < 0;
73
- }
74
- isFuturePacket(e) {
75
- return this.mappedToIndex(e) >= this.#r;
76
- }
77
- #i(e) {
78
- return this.#e > this.#n - this.#r && e < this.#e + this.#r - this.#n;
79
- }
80
- getGeneration(e) {
81
- return this.#i(e) ? this.#t + 1 : this.#t;
82
- }
83
- reset() {
84
- this.#e = 0, this.#t = 0;
85
- }
86
- }, m = 4096, h = class {
87
- #e = new Int32Array(m);
88
- decompress(e) {
89
- let { headerLen: t, decompressedSize: n, flags: r } = g(e), i = new Uint8Array(n);
90
- if (!(r & 1)) return i.set(e.slice(t, t + n)), i;
91
- this.#e.fill(0);
92
- let a = {
93
- control: 1,
94
- sourcePos: t,
95
- destPos: 0,
96
- nextHashed: 0
97
- };
98
- for (; this.#t(e, a);) if (a.control & 1) {
99
- if (!this.#n(e, i, a)) break;
100
- } else if (this.#r(e, i, n, a)) break;
101
- return i;
102
- }
103
- #t(e, t) {
104
- return t.control === 1 ? t.sourcePos + 4 > e.length ? !1 : (t.control = (e[t.sourcePos] | e[t.sourcePos + 1] << 8 | e[t.sourcePos + 2] << 16 | e[t.sourcePos + 3] << 24) >>> 0, t.sourcePos += 4, !0) : !0;
105
- }
106
- #n(e, t, n) {
107
- if (n.control = n.control >>> 1 >>> 0, n.sourcePos + 2 > e.length) return !1;
108
- let r = e[n.sourcePos], i = e[n.sourcePos + 1];
109
- n.sourcePos += 2;
110
- let a = r >> 4 | i << 4, o = r & 15;
111
- if (o !== 0) o += 2;
112
- else {
113
- if (n.sourcePos >= e.length) return !1;
114
- o = e[n.sourcePos], n.sourcePos++;
115
- }
116
- let s = this.#e[a];
117
- for (let e = 0; e < o; e++) n.destPos < t.length && s + e < n.destPos && (t[n.destPos] = t[s + e], n.destPos++);
118
- let c = n.destPos + 1 - o;
119
- return this.#i(t, n, c), n.nextHashed = n.destPos, !0;
120
- }
121
- #r(e, t, n, r) {
122
- let i = Math.max(n, 10) - 10;
123
- if (r.destPos >= i) {
124
- for (; r.destPos < n;) {
125
- if (r.control === 1) {
126
- if (r.sourcePos += 4, r.sourcePos > e.length) break;
127
- r.control = (e[r.sourcePos - 4] | e[r.sourcePos - 3] << 8 | e[r.sourcePos - 2] << 16 | e[r.sourcePos - 1] << 24) >>> 0;
128
- }
129
- if (r.sourcePos >= e.length) break;
130
- t[r.destPos++] = e[r.sourcePos++], r.control = r.control >>> 1 >>> 0;
131
- }
132
- return !0;
133
- }
134
- if (r.sourcePos >= e.length || r.destPos >= t.length) return !0;
135
- t[r.destPos++] = e[r.sourcePos++], r.control = r.control >>> 1 >>> 0;
136
- let a = Math.max(r.destPos - 2, 0);
137
- return this.#i(t, r, a), r.nextHashed < a && (r.nextHashed = a), !1;
138
- }
139
- #i(e, t, n) {
140
- for (; t.nextHashed < n && !(t.nextHashed + 3 > e.length);) {
141
- let n = (e[t.nextHashed] | e[t.nextHashed + 1] << 8 | e[t.nextHashed + 2] << 16) >>> 0, r = (n >> 12 ^ n) & 4095;
142
- this.#e[r] = t.nextHashed, t.nextHashed++;
143
- }
144
- }
145
- };
146
- function g(e) {
147
- if (e.length < 3) throw Error("QuickLZ: data too short");
148
- let t = e[0];
149
- if ((t >> 2 & 3) != 1) throw Error("QuickLZ: only level 1 is supported");
150
- let n = t & 2 ? 9 : 3;
151
- if (e.length < n) throw Error("QuickLZ: data too short for header");
152
- let r;
153
- return r = t & 2 ? (e[5] | e[6] << 8 | e[7] << 16 | e[8] << 24) >>> 0 : e[2], {
154
- headerLen: n,
155
- decompressedSize: r,
156
- flags: t
157
- };
158
- }
159
- //#endregion
160
- //#region src/transport/handler.ts
161
- var _ = 1024, v = 5e3, y = 6e4, b = 1e3, x = 8, S = 3, C = 5, w = 500, T = 100, E = class {
162
- onPacket = null;
163
- onClosed = null;
164
- #e;
165
- #t;
166
- #n = null;
167
- #r = 0;
168
- #i = !1;
169
- #a = null;
170
- #o = null;
171
- #s = Date.now();
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, _);
178
- #m = /* @__PURE__ */ new Map();
179
- #h = /* @__PURE__ */ new Map();
180
- #g = /* @__PURE__ */ new Map();
181
- #_ = null;
182
- constructor(t, n = e) {
183
- this.#e = t, this.#t = n;
184
- }
185
- setClientID(e) {
186
- this.#r = e;
187
- }
188
- connect(e) {
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();
195
- });
196
- });
197
- }
198
- start(e) {
199
- this.#n = e, this.#i = !1, this.#s = Date.now(), e.on("message", (e) => {
200
- this.#s = Date.now(), this.#x(new Uint8Array(e.buffer, e.byteOffset, e.byteLength));
201
- }), e.on("error", (e) => {
202
- this.#t.error("udp error", e), this.#R(e);
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);
212
- }
213
- receivedFinalInitAck() {
214
- this.#_ = null;
215
- }
216
- sendPacket(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);
220
- return;
221
- }
222
- this.#y(e, t, n, r);
223
- }
224
- sendVoicePacket(e, t) {
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);
228
- new DataView(s.buffer).setUint16(0, n, !1), s[2] = t, s.set(e, S);
229
- let c = u({
230
- typeFlagged: a.Voice | o.Unencrypted,
231
- id: n,
232
- clientID: this.#r,
233
- generationID: r,
234
- data: s,
235
- receivedAt: 0
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);
258
- }
259
- close() {
260
- this.#i || (this.#i = !0, this.#a?.(), this.#o?.(), this.#n?.close());
261
- }
262
- #v(e, t, n, r) {
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;
267
- }
268
- }
269
- #y(e, t, n, r = !this.#e.cryptoInitComplete) {
270
- n = D(e, n);
271
- let [i, a] = this.#P(e), s = {
272
- typeFlagged: e | n,
273
- id: i,
274
- clientID: this.#r,
275
- generationID: a,
276
- data: t,
277
- receivedAt: 0
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);
280
- let m = {
281
- packet: s,
282
- firstSend: Date.now(),
283
- lastSend: Date.now(),
284
- retryCount: 0,
285
- nextInterval: w
286
- };
287
- this.#F(e, s, m);
288
- }
289
- #b(e) {
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
- }
298
- }
299
- #x(e) {
300
- if (e.length < 11) return;
301
- let t = e.slice(0, x), n = e.slice(x, 11), r = e.slice(11), i = d(n), o = {
302
- ...i,
303
- clientID: 0,
304
- generationID: this.#S(i.id, i.typeFlagged & 15),
305
- data: /* @__PURE__ */ new Uint8Array(),
306
- receivedAt: Date.now()
307
- }, c = this.#C(o, n, r, t);
308
- if (c !== null) {
309
- if (o.data = c.plaintext, s(o) === a.Ping) {
310
- this.#E(o.id, c.dummyUsed);
311
- return;
312
- }
313
- this.#w(o, c.dummyUsed) && (this.#D(o), this.#N(o));
314
- }
315
- }
316
- #S(e, t) {
317
- switch (t) {
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);
322
- default: return 0;
323
- }
324
- }
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;
327
- try {
328
- return {
329
- plaintext: this.#e.decrypt(d, e.id, f, t, n, r, l, i),
330
- dummyUsed: u
331
- };
332
- } catch {
333
- for (let i of [-1, 1]) {
334
- let a = f + i;
335
- if (!(a < 0)) try {
336
- return {
337
- plaintext: this.#e.decrypt(d, e.id, a, t, n, r, !1, !1),
338
- dummyUsed: !1
339
- };
340
- } catch {}
341
- }
342
- if (d === a.Command || d === a.CommandLow || d === a.Ack) try {
343
- return {
344
- plaintext: this.#e.decrypt(d, e.id, f, t, n, r, !0, i),
345
- dummyUsed: !0
346
- };
347
- } catch {}
348
- return null;
349
- }
350
- }
351
- #w(e, t) {
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);
356
- }
357
- #T(e, t, n) {
358
- let r = /* @__PURE__ */ new Uint8Array(2);
359
- new DataView(r.buffer).setUint16(0, e, !1), this.#y(t, r, 0, n);
360
- }
361
- #E(e, t) {
362
- let n = /* @__PURE__ */ new Uint8Array(2);
363
- new DataView(n.buffer).setUint16(0, e, !1), this.#y(a.Pong, n, o.Unencrypted, t);
364
- }
365
- #D(e) {
366
- let t = s(e);
367
- if (t !== a.Command && t !== a.CommandLow) {
368
- this.onPacket?.(e);
369
- return;
370
- }
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);
374
- if (t === void 0) break;
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);
379
- }
380
- }
381
- #O = 0;
382
- #k = 0;
383
- #A(e, t, n) {
384
- let r = n ? this.#O : this.#k;
385
- for (; !e.has(r) && O(e, r);) r = r + 1 & 65535, t.advance(1);
386
- n ? this.#O = r : this.#k = r;
387
- }
388
- #j(e, t, n, r) {
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;
391
- for (;;) {
392
- let e = t.get(s);
393
- if (!e) return null;
394
- i.push(e), a += e.data.length;
395
- let n = (c(e) & o.Fragmented) !== 0;
396
- if (!l) {
397
- if (l = !0, !n) {
398
- u = !0;
399
- break;
400
- }
401
- } else if (n) {
402
- u = !0;
403
- break;
404
- }
405
- s = s + 1 & 65535;
406
- }
407
- if (!u) return null;
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];
411
- }
412
- #M(e) {
413
- if ((c(e) & o.Compressed) !== 0) try {
414
- e.data = new h().decompress(e.data), e.typeFlagged &= ~o.Compressed;
415
- } catch (t) {
416
- this.#t.debug("decompression failed", {
417
- id: e.id,
418
- err: t
419
- });
420
- }
421
- }
422
- #N(e) {
423
- let t = s(e);
424
- if (t === a.Init1) {
425
- this.#_ = null;
426
- return;
427
- }
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);
431
- }
432
- }
433
- #P(e) {
434
- let t = this.#c[e], n = this.#l[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]);
436
- }
437
- #F(e, t, n) {
438
- if (e === a.Init1) {
439
- this.#_ = n;
440
- return;
441
- }
442
- if (e === a.Command || e === a.CommandLow) {
443
- let r = e << 16 | t.id;
444
- this.#g.set(r, n);
445
- }
446
- }
447
- #I() {
448
- let e = Date.now();
449
- if (e - this.#s > y) {
450
- this.#t.warn("idle timeout"), this.#R(/* @__PURE__ */ Error("idle timeout"));
451
- return;
452
- }
453
- this.#_ && this.#L(this.#_, e);
454
- for (let [t, n] of this.#g) {
455
- if (e - n.firstSend > y) {
456
- this.#g.delete(t), this.#R(/* @__PURE__ */ Error("packet ack timeout"));
457
- return;
458
- }
459
- this.#L(n, e);
460
- }
461
- }
462
- #L(e, t) {
463
- if (t - e.lastSend < e.nextInterval) return;
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);
467
- }
468
- #R(e) {
469
- this.#i || (this.close(), this.onClosed?.(e));
470
- }
471
- };
472
- function D(e, t) {
473
- return e === a.Command || e === a.CommandLow ? t | o.NewProtocol : t;
474
- }
475
- function O(e, t) {
476
- let n = Date.now();
477
- for (let [r, i] of e) if ((r - t + 65536 & 65535) < 32768 && n - i.receivedAt > 5e3) return !0;
478
- return !1;
479
- }
480
- //#endregion
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 };
482
-
483
- //# sourceMappingURL=handler-DI_abe9c.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"handler-DI_abe9c.js","names":["noopLogger","splitHostPort","PacketType","\"Voice\"","\"VoiceWhisper\"","\"Command\"","\"CommandLow\"","\"Ping\"","\"Pong\"","\"Ack\"","\"AckLow\"","\"Init1\"","PacketFlags","\"Fragmented\"","\"NewProtocol\"","\"Compressed\"","\"Unencrypted\"","packetType","p","packetFlags","isUnencrypted","buildC2SHeader","header","view","parseS2CHeader","raw","parseC2SHeader","GenerationWindow","#mod","mod","#receiveWindow","windowSize","#generation","amount","newBaseOffset","#mappedBaseOffset","genStep","moveDist","mappedValue","maxOffset","#isNextGen","TABLE_SIZE","Qlz","parseQlzHeader","data","dest","decompressedSize","flags","headerLen","#hashtable","state","#ensureControl","#processReference","#processLiteral","st","b1","b2","hash","matchlen","offset","i","end","#updateHashtable","threshold","v","RECEIVE_PACKET_WINDOW_SIZE","PING_INTERVAL_MS","PACKET_TIMEOUT_MS","MAX_RETRY_INTERVAL_MS","TAG_SIZE","VOICE_HEADER_SIZE","WHISPER_HEADER_SIZE","RESEND_BASE_INTERVAL_MS","RESEND_LOOP_INTERVAL_MS","PacketHandler","#crypt","crypt","#logger","logger","#clientID","id","addr","socket","createSocket","isIP","host","onError","reject","error","port","resolve","#conn","conn","#closed","#lastMessageReceived","#handleRawPacket","msg","err","#triggerClose","#packetCounter","init1Data","processInit1","#sendPacketRaw","pingTimer","#stopPing","resendTimer","#checkResends","#stopResend","#initPacketCheck","dummy","pType","#sendSplitPacket","pID","pGen","#generationCounter","payloadLen","voicePayload","codec","final","#write","targetClientIds","whisperPayload","index","pos","first","blockSize","last","pFlags","applyProtocolFlags","#nextPacketIdentity","unencrypted","ciphertext","tag","rp","#trackResend","normalized","parsed","#resolveGeneration","decrypted","#decryptPacketData","#sendPong","#handleCommandWindowAndAck","#handlePacketQueue","#updatePostReceiveState","#recvWindowCommand","#recvWindowCommandLow","#sendWindowCommand","#sendWindowCommandLow","dummyUsed","gen","guessGen","win","ackType","#sendAck","ackData","packetID","pongData","isCommand","queue","#commandQueue","#commandLowQueue","#fastForwardMissingPackets","current","#_nextCommandID","#_nextCommandLowID","packet","result","#tryReassemble","reassembled","newNext","#tryDecompress","nextID","hasOldNewerPacket","startPacket","fragments","totalSize","currID","startSeen","complete","frag","fragmented","combined","ackID","key","#ackManager","now","#doResend","pkg"],"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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"}
@@ -1,2 +0,0 @@
1
- const e=require("./address-BR-5unVo.cjs"),t=require("./crypt-handshake-CQkQreLx.cjs");let n=require("node:net"),r=require("node:dgram");var i=function(e){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}({}),a=function(e){return e[e.Fragmented=16]=`Fragmented`,e[e.NewProtocol=32]=`NewProtocol`,e[e.Compressed=64]=`Compressed`,e[e.Unencrypted=128]=`Unencrypted`,e}({});function o(e){return e.typeFlagged&15}function s(e){return e.typeFlagged&240}function c(e){return!!(s(e)&128)}function l(e){let t=new Uint8Array(5),n=new DataView(t.buffer);return n.setUint16(0,e.id,!1),n.setUint16(2,e.clientID,!1),t[4]=e.typeFlagged,t}function u(e){return{id:new DataView(e.buffer,e.byteOffset,e.byteLength).getUint16(0,!1),typeFlagged:e[2]}}function d(e){let t=new DataView(e.buffer,e.byteOffset,e.byteLength);return{id:t.getUint16(0,!1),clientID:t.getUint16(2,!1),typeFlagged:e[4]}}var f=class{#e=0;#t=0;#n;#r;constructor(e,t){this.#n=e,this.#r=t}get generation(){return this.#t}advance(e){if(e<=0)return;let t=this.#e+e,n=Math.floor(t/this.#n);n>0&&(this.#t=Math.min(this.#t+n,4294967295)),this.#e=t%this.#n}advanceToExcluded(e){let t=e-this.#e;t<0&&(t+=this.#n),this.advance(t+1)}syncTo(e){let t=e-this.#e;t<0&&(t+=this.#n),this.advance(t)}isInWindow(e){let t=this.#e+this.#r;return t<this.#n?e>=this.#e&&e<t:e>=this.#e||e<t-this.#n}mappedToIndex(e){return this.#i(e)?e+this.#n-this.#e:e-this.#e}isOldPacket(e){return this.mappedToIndex(e)<0}isFuturePacket(e){return this.mappedToIndex(e)>=this.#r}#i(e){return this.#e>this.#n-this.#r&&e<this.#e+this.#r-this.#n}getGeneration(e){return this.#i(e)?this.#t+1:this.#t}reset(){this.#e=0,this.#t=0}},p=4096,m=class{#e=new Int32Array(p);decompress(e){let{headerLen:t,decompressedSize:n,flags:r}=h(e),i=new Uint8Array(n);if(!(r&1))return i.set(e.slice(t,t+n)),i;this.#e.fill(0);let a={control:1,sourcePos:t,destPos:0,nextHashed:0};for(;this.#t(e,a);)if(a.control&1){if(!this.#n(e,i,a))break}else if(this.#r(e,i,n,a))break;return i}#t(e,t){return t.control===1?t.sourcePos+4>e.length?!1:(t.control=(e[t.sourcePos]|e[t.sourcePos+1]<<8|e[t.sourcePos+2]<<16|e[t.sourcePos+3]<<24)>>>0,t.sourcePos+=4,!0):!0}#n(e,t,n){if(n.control=n.control>>>1>>>0,n.sourcePos+2>e.length)return!1;let r=e[n.sourcePos],i=e[n.sourcePos+1];n.sourcePos+=2;let a=r>>4|i<<4,o=r&15;if(o!==0)o+=2;else{if(n.sourcePos>=e.length)return!1;o=e[n.sourcePos],n.sourcePos++}let s=this.#e[a];for(let e=0;e<o;e++)n.destPos<t.length&&s+e<n.destPos&&(t[n.destPos]=t[s+e],n.destPos++);let c=n.destPos+1-o;return this.#i(t,n,c),n.nextHashed=n.destPos,!0}#r(e,t,n,r){let i=Math.max(n,10)-10;if(r.destPos>=i){for(;r.destPos<n;){if(r.control===1){if(r.sourcePos+=4,r.sourcePos>e.length)break;r.control=(e[r.sourcePos-4]|e[r.sourcePos-3]<<8|e[r.sourcePos-2]<<16|e[r.sourcePos-1]<<24)>>>0}if(r.sourcePos>=e.length)break;t[r.destPos++]=e[r.sourcePos++],r.control=r.control>>>1>>>0}return!0}if(r.sourcePos>=e.length||r.destPos>=t.length)return!0;t[r.destPos++]=e[r.sourcePos++],r.control=r.control>>>1>>>0;let a=Math.max(r.destPos-2,0);return this.#i(t,r,a),r.nextHashed<a&&(r.nextHashed=a),!1}#i(e,t,n){for(;t.nextHashed<n&&!(t.nextHashed+3>e.length);){let n=(e[t.nextHashed]|e[t.nextHashed+1]<<8|e[t.nextHashed+2]<<16)>>>0,r=(n>>12^n)&4095;this.#e[r]=t.nextHashed,t.nextHashed++}}};function h(e){if(e.length<3)throw Error(`QuickLZ: data too short`);let t=e[0];if((t>>2&3)!=1)throw Error(`QuickLZ: only level 1 is supported`);let n=t&2?9:3;if(e.length<n)throw Error(`QuickLZ: data too short for header`);let r;return r=t&2?(e[5]|e[6]<<8|e[7]<<16|e[8]<<24)>>>0:e[2],{headerLen:n,decompressedSize:r,flags:t}}var g=1024,_=5e3,v=6e4,y=1e3,b=8,x=3,S=5,C=500,w=100,T=class{onPacket=null;onClosed=null;#e;#t;#n=null;#r=0;#i=!1;#a=null;#o=null;#s=Date.now();#c=new Uint16Array(9);#l=new Uint32Array(9);#u=new f(65536,g);#d=new f(65536,g);#f=new f(65536,g);#p=new f(65536,g);#m=new Map;#h=new Map;#g=new Map;#_=null;constructor(t,n=e.o){this.#e=t,this.#t=n}setClientID(e){this.#r=e}connect(t){return new Promise((i,a)=>{let{host:o,port:s}=e.r(t),c=(0,r.createSocket)((0,n.isIP)(o)===6?`udp6`:`udp4`),l=e=>{c.close(),a(e)};c.once(`error`,l),c.connect(parseInt(s,10),o,()=>{c.off(`error`,l),this.start(c),i()})})}start(e){this.#n=e,this.#i=!1,this.#s=Date.now(),e.on(`message`,e=>{this.#s=Date.now(),this.#x(new Uint8Array(e.buffer,e.byteOffset,e.byteLength))}),e.on(`error`,e=>{this.#t.error(`udp error`,e),this.#R(e)}),e.on(`close`,()=>this.#R(null)),this.#c[i.Command]=1,this.#c[i.Init1]=101;let n=t.n(this.#e,null);n&&this.#y(i.Init1,n,0);let r=setInterval(()=>{this.#e.cryptoInitComplete&&this.sendPacket(i.Ping,new Uint8Array,a.Unencrypted)},_);this.#a=()=>clearInterval(r);let o=setInterval(()=>this.#I(),w);this.#o=()=>clearInterval(o)}receivedFinalInitAck(){this.#_=null}sendPacket(e,t,n){let r=!this.#e.cryptoInitComplete;if(t.length>487&&e!==i.Voice&&e!==i.VoiceWhisper){this.#v(e,t,n,r);return}this.#y(e,t,n,r)}sendVoicePacket(e,t){let n=this.#c[i.Voice],r=this.#l[i.Voice];this.#c[i.Voice]=n+1&65535,this.#c[i.Voice]===0&&this.#l[i.Voice]++;let o=x+e.length,s=new Uint8Array(o);new DataView(s.buffer).setUint16(0,n,!1),s[2]=t,s.set(e,x);let c=l({typeFlagged:i.Voice|a.Unencrypted,id:n,clientID:this.#r,generationID:r,data:s,receivedAt:0}),u=new Uint8Array(13+o);u.set(this.#e.fakeSignature,0),u.set(c,b),u.set(s,13),this.#b(u)}sendWhisperPacket(e,t,n){if(t.length===0)throw Error(`whisper requires at least one target`);if(t.length>32)throw Error(`too many whisper targets`);if(t.some(e=>!Number.isInteger(e)||e<0||e>65535))throw RangeError(`invalid whisper target`);let r=this.#c[i.VoiceWhisper],o=this.#l[i.VoiceWhisper];this.#c[i.VoiceWhisper]=r+1&65535,this.#c[i.VoiceWhisper]===0&&(this.#l[i.VoiceWhisper]=o+1>>>0);let s=S+t.length*2+e.length,c=new Uint8Array(s),u=new DataView(c.buffer);u.setUint16(0,r,!1),c[2]=n,c[3]=0,c[4]=t.length;for(let e=0;e<t.length;e++)u.setUint16(S+e*2,t[e],!1);c.set(e,S+t.length*2);let d=l({typeFlagged:i.VoiceWhisper|a.Unencrypted,id:r,clientID:this.#r,generationID:o,data:c,receivedAt:0}),f=new Uint8Array(13+s);f.set(this.#e.fakeSignature,0),f.set(d,b),f.set(c,13),this.#b(f)}close(){this.#i||(this.#i=!0,this.#a?.(),this.#o?.(),this.#n?.close())}#v(e,t,n,r){let i=0,o=!0;for(;i<t.length;){let s=Math.min(t.length-i,487),c=i+s===t.length,l=n;o!==c&&(l|=a.Fragmented),this.#y(e,t.slice(i,i+s),l,r),i+=s,o=!1}}#y(e,t,n,r=!this.#e.cryptoInitComplete){n=E(e,n);let[i,o]=this.#P(e),s={typeFlagged:e|n,id:i,clientID:this.#r,generationID:o,data:t,receivedAt:0},c=(n&a.Unencrypted)!==0,u=l(s),[d,f]=this.#e.encrypt(e,i,o,u,t,r,c),p=new Uint8Array(13+d.length);p.set(f.slice(0,b),0),p.set(u,b),p.set(d,13),this.#b(p);let m={packet:s,firstSend:Date.now(),lastSend:Date.now(),retryCount:0,nextInterval:C};this.#F(e,s,m)}#b(e){if(this.#n)try{this.#n.send(Buffer.from(e),e=>{e&&this.#t.warn(`udp send error`,e)})}catch(e){let t=e instanceof Error?e:Error(String(e));this.#t.error(`udp send failed`,t),this.#R(t)}}#x(e){if(e.length<11)return;let t=e.slice(0,b),n=e.slice(b,11),r=e.slice(11),a=u(n),s={...a,clientID:0,generationID:this.#S(a.id,a.typeFlagged&15),data:new Uint8Array,receivedAt:Date.now()},c=this.#C(s,n,r,t);if(c!==null){if(s.data=c.plaintext,o(s)===i.Ping){this.#E(s.id,c.dummyUsed);return}this.#w(s,c.dummyUsed)&&(this.#D(s),this.#N(s))}}#S(e,t){switch(t){case i.Command:return this.#u.getGeneration(e);case i.CommandLow:return this.#d.getGeneration(e);case i.Ack:return this.#f.getGeneration(e);case i.AckLow:return this.#p.getGeneration(e);default:return 0}}#C(e,t,n,r){let c=(s(e)&a.Unencrypted)!==0,l=!this.#e.cryptoInitComplete,u=l,d=o(e),f=e.generationID;try{return{plaintext:this.#e.decrypt(d,e.id,f,t,n,r,l,c),dummyUsed:u}}catch{for(let i of[-1,1]){let a=f+i;if(!(a<0))try{return{plaintext:this.#e.decrypt(d,e.id,a,t,n,r,!1,!1),dummyUsed:!1}}catch{}}if(d===i.Command||d===i.CommandLow||d===i.Ack)try{return{plaintext:this.#e.decrypt(d,e.id,f,t,n,r,!0,c),dummyUsed:!0}}catch{}return null}}#w(e,t){let n=o(e);if(n!==i.Command&&n!==i.CommandLow)return!0;let r=n===i.Command?this.#u:this.#d,a=n===i.Command?i.Ack:i.AckLow;return r.isInWindow(e.id)?(this.#T(e.id,a,t),!0):(r.isOldPacket(e.id)&&this.#T(e.id,a,t),!1)}#T(e,t,n){let r=new Uint8Array(2);new DataView(r.buffer).setUint16(0,e,!1),this.#y(t,r,0,n)}#E(e,t){let n=new Uint8Array(2);new DataView(n.buffer).setUint16(0,e,!1),this.#y(i.Pong,n,a.Unencrypted,t)}#D(e){let t=o(e);if(t!==i.Command&&t!==i.CommandLow){this.onPacket?.(e);return}let n=t===i.Command,r=n?this.#m:this.#h,a=n?this.#u:this.#d;for(r.set(e.id,e),n?this.#A(r,a,!0):this.#A(r,a,!1);;){let e=n?this.#O:this.#k,t=r.get(e);if(t===void 0)break;let i=this.#j(t,r,e,a);if(!i)break;let[o,s]=i;n?this.#O=s:this.#k=s,this.#M(o),this.onPacket?.(o)}}#O=0;#k=0;#A(e,t,n){let r=n?this.#O:this.#k;for(;!e.has(r)&&D(e,r);)r=r+1&65535,t.advance(1);n?this.#O=r:this.#k=r}#j(e,t,n,r){if((s(e)&a.Fragmented)===0)return t.delete(n),r.advance(1),[e,n+1&65535];let i=[],o=0,c=n,l=!1,u=!1;for(;;){let e=t.get(c);if(!e)return null;i.push(e),o+=e.data.length;let n=(s(e)&a.Fragmented)!==0;if(!l){if(l=!0,!n){u=!0;break}}else if(n){u=!0;break}c=c+1&65535}if(!u)return null;let d=new Uint8Array(o),f=0;for(let e of i)d.set(e.data,f),f+=e.data.length,t.delete(n),r.advance(1),n=n+1&65535;return e.data=d,e.typeFlagged&=~a.Fragmented,[e,n]}#M(e){if((s(e)&a.Compressed)!==0)try{e.data=new m().decompress(e.data),e.typeFlagged&=~a.Compressed}catch(t){this.#t.debug(`decompression failed`,{id:e.id,err:t})}}#N(e){let t=o(e);if(t===i.Init1){this.#_=null;return}if((t===i.Ack||t===i.AckLow)&&e.data.length>=2){let n=new DataView(e.data.buffer,e.data.byteOffset).getUint16(0,!1),r=(t===i.Ack?i.Command:i.CommandLow)<<16|n;this.#g.delete(r)}}#P(e){let t=this.#c[e],n=this.#l[e];return e===i.Init1?[t,n]:(this.#c[e]=t+1&65535,this.#c[e]===0&&(this.#l[e]=n+1>>>0),e===i.Command?this.#f.advanceToExcluded(t):e===i.CommandLow&&this.#p.advanceToExcluded(t),[t,n])}#F(e,t,n){if(e===i.Init1){this.#_=n;return}if(e===i.Command||e===i.CommandLow){let r=e<<16|t.id;this.#g.set(r,n)}}#I(){let e=Date.now();if(e-this.#s>v){this.#t.warn(`idle timeout`),this.#R(Error(`idle timeout`));return}this.#_&&this.#L(this.#_,e);for(let[t,n]of this.#g){if(e-n.firstSend>v){this.#g.delete(t),this.#R(Error(`packet ack timeout`));return}this.#L(n,e)}}#L(e,t){if(t-e.lastSend<e.nextInterval)return;e.lastSend=t,e.retryCount++,e.nextInterval=Math.min(e.nextInterval*2,y);let n=!this.#e.cryptoInitComplete,r=(s(e.packet)&a.Unencrypted)!==0,i=l(e.packet),c=o(e.packet),[u,d]=this.#e.encrypt(c,e.packet.id,e.packet.generationID,i,e.packet.data,n,r),f=new Uint8Array(13+u.length);f.set(d.slice(0,b),0),f.set(i,b),f.set(u,13),this.#b(f)}#R(e){this.#i||(this.close(),this.onClosed?.(e))}};function E(e,t){return e===i.Command||e===i.CommandLow?t|a.NewProtocol:t}function D(e,t){let n=Date.now();for(let[r,i]of e)if((r-t+65536&65535)<32768&&n-i.receivedAt>5e3)return!0;return!1}Object.defineProperty(exports,"a",{enumerable:!0,get:function(){return i}}),Object.defineProperty(exports,"c",{enumerable:!0,get:function(){return s}}),Object.defineProperty(exports,"d",{enumerable:!0,get:function(){return u}}),Object.defineProperty(exports,"i",{enumerable:!0,get:function(){return a}}),Object.defineProperty(exports,"l",{enumerable:!0,get:function(){return o}}),Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return m}}),Object.defineProperty(exports,"o",{enumerable:!0,get:function(){return l}}),Object.defineProperty(exports,"r",{enumerable:!0,get:function(){return f}}),Object.defineProperty(exports,"s",{enumerable:!0,get:function(){return c}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return T}}),Object.defineProperty(exports,"u",{enumerable:!0,get:function(){return d}});
2
- //# sourceMappingURL=handler-DuwoO5RC.cjs.map