@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
package/dist/index.mjs DELETED
@@ -1,827 +0,0 @@
1
- import { a as e, i as t, o as n } from "./address-BfmovVpp.js";
2
- import { C as r, S as i, _ as a, b as o, d as s, g as c, h as l, l as u, o as d, p as f, r as p, u as m, v as h, w as ee, x as g, y as _ } from "./primitives-xIr6Tjk4.js";
3
- import { t as v } from "./crypto-Bg02m4ZE.js";
4
- import { t as y } from "./resolver-6B8dI9gr.js";
5
- import { a as b, t as x } from "./handler-DI_abe9c.js";
6
- import { i as S, n as C, t as w } from "./command-BLe-C2L2.js";
7
- import { n as te } from "./crypt-handshake-DziOY4Lq.js";
8
- import { t as ne } from "./crypt-init2-D70ha4LB.js";
9
- import { t as T } from "./parser-DZMv3Jm-.js";
10
- import { createHash as E } from "node:crypto";
11
- import { createConnection as D } from "node:net";
12
- //#region src/commands.ts
13
- var O = class {
14
- #e = /* @__PURE__ */ new Map();
15
- #t = 0;
16
- #n = [];
17
- #r = !1;
18
- register() {
19
- this.#t++;
20
- let e = this.#t;
21
- return [e, new Promise((t) => {
22
- this.#e.set(e, t);
23
- })];
24
- }
25
- unregister(e) {
26
- this.#e.delete(e);
27
- }
28
- signalWelcomeComplete() {
29
- this.#r = !0, this.#n = [];
30
- }
31
- buffer(e) {
32
- this.#r && this.#e.size !== 0 && this.#n.push(e);
33
- }
34
- resolve(e, t) {
35
- let n = this.#e.get(e);
36
- if (!n) {
37
- this.#n = [];
38
- return;
39
- }
40
- let r = this.#n;
41
- this.#n = [], this.#e.delete(e), n({
42
- err: t,
43
- data: r
44
- });
45
- }
46
- discardBuffer() {
47
- this.#n = [];
48
- }
49
- reset() {
50
- this.#e.clear(), this.#n = [], this.#r = !1, this.#t = 0;
51
- }
52
- };
53
- function k(e) {
54
- let t = e.id ?? "0", n = e.msg ?? "", i = e.return_code, a = null;
55
- t !== "0" && (a = new r(t, n));
56
- let o = null;
57
- if (i !== void 0 && i !== "") {
58
- let e = parseInt(i, 10);
59
- isNaN(e) || (o = e);
60
- }
61
- return {
62
- err: a,
63
- rc: o
64
- };
65
- }
66
- function A(e, t) {
67
- return e.includes("return_code=") ? e : `${e} return_code=${t}`;
68
- }
69
- //#endregion
70
- //#region src/transfer.ts
71
- var j = class {
72
- #e = /* @__PURE__ */ new Map();
73
- #t = 0;
74
- register() {
75
- this.#t++, this.#t > 65535 && (this.#t = 1);
76
- let e = this.#t;
77
- return [e, new Promise((t) => {
78
- this.#e.set(e, t);
79
- })];
80
- }
81
- unregister(e) {
82
- this.#e.delete(e);
83
- }
84
- notify(e, t) {
85
- let n = this.#e.get(e);
86
- n && n(t);
87
- }
88
- reset() {
89
- this.#e.clear(), this.#t = 0;
90
- }
91
- };
92
- function M(e, t, n) {
93
- return new Promise((r, i) => {
94
- let a = D({
95
- host: e,
96
- port: t
97
- }, () => {
98
- a.write(n, (e) => {
99
- e ? (a.destroy(), i(new o(`failed to send transfer key: ${e.message}`))) : r(a);
100
- });
101
- });
102
- a.setTimeout(1e4), a.once("error", i), a.once("timeout", () => {
103
- a.destroy(), i(new o("connection timeout"));
104
- });
105
- });
106
- }
107
- async function N(e, t, n) {
108
- let r = await M(e, t.port, t.fileTransferKey);
109
- await new Promise((e, t) => {
110
- n.pipe(r), r.on("finish", e), r.on("error", t);
111
- });
112
- }
113
- async function P(e, t, n) {
114
- let r = await M(e, t.port, t.fileTransferKey);
115
- await new Promise((e, t) => {
116
- r.pipe(n), n.on("finish", e), r.on("error", t), n.on("error", t);
117
- });
118
- }
119
- function F(e, t, n, r, i, a) {
120
- let o = t.startsWith("/") ? t : `/${t}`;
121
- return w("ftinitupload", {
122
- cid: String(e),
123
- name: o,
124
- cpw: n,
125
- size: String(r),
126
- clientftfid: String(i),
127
- overwrite: a ? "1" : "0",
128
- resume: "0"
129
- });
130
- }
131
- function I(e, t, n, r) {
132
- let i = t.startsWith("/") ? t : `/${t}`;
133
- return w("ftinitdownload", {
134
- cid: String(e),
135
- name: i,
136
- cpw: n,
137
- clientftfid: String(r),
138
- seekpos: "0"
139
- });
140
- }
141
- //#endregion
142
- //#region src/events.ts
143
- function L(e, t) {
144
- let n = t;
145
- for (let t = e.length - 1; t >= 0; t--) n = e[t](n);
146
- return n;
147
- }
148
- function R(e, t) {
149
- let n = t;
150
- for (let t = e.length - 1; t >= 0; t--) n = e[t](n);
151
- return n;
152
- }
153
- //#endregion
154
- //#region src/handshake.ts
155
- function z(e, t) {
156
- let n = t.alpha ?? "", r = t.beta ?? "", i = t.omega ?? "";
157
- e.crypt.initCrypto(n, r, i), e.logger.info("crypto initialized (P-256 path), sending clientinit"), G(e);
158
- }
159
- function B(e, t) {
160
- e.logger.info("received initivexpand2"), e.handler.receivedFinalInitAck();
161
- let n = t.l ?? "", r = t.omega ?? "", i = t.proof ?? "", a = t.beta ?? "", o = H(e, a);
162
- ne(e.crypt, n, r, i, a, o), G(e);
163
- }
164
- function V(e, t) {
165
- let n = t.aclid ?? t.clid ?? "", r = n ? parseInt(n, 10) : 0;
166
- r > 0 && (e.clid = r, e.handler.setClientID(r)), e.logger.info("connected to server", { selfId: e.clid }), e._markConnected(), setImmediate(() => {
167
- let t = w("clientupdate", {
168
- client_input_muted: "0",
169
- client_output_muted: "0"
170
- });
171
- e.sendCommandNoWait(t).catch(() => {});
172
- });
173
- }
174
- function H(e, t) {
175
- let [n, r] = p(), i = Buffer.from(n).toString("base64"), a = U(e, n, t), o = C("clientek", [["ek", i], ["proof", a]]);
176
- return e.handler.sendPacket(b.Command, Buffer.from(o), 0), r;
177
- }
178
- function U(e, t, n) {
179
- let r = Buffer.from(n, "base64"), i = /* @__PURE__ */ new Uint8Array(86);
180
- i.set(t.slice(0, 32)), i.set(r.slice(0, Math.min(54, r.length)), 32);
181
- let a = d(e.crypt.identity.privateKey, i);
182
- return Buffer.from(a).toString("base64");
183
- }
184
- function W(e) {
185
- return e === "" ? "" : E("sha1").update(e).digest().toString("base64");
186
- }
187
- function G(e) {
188
- let t = K(e);
189
- e.handler.sendPacket(b.Command, Buffer.from(t), 0);
190
- }
191
- function K(e) {
192
- let t = e.crypt.identity.publicKeyBase64(), n = e.getClientInitOptions(), r = W(n.defaultChannelPassword), i = W(n.serverPassword), a = E("sha1").update(t).digest().toString("base64");
193
- return C("clientinit", [
194
- ["client_nickname", e.nickname],
195
- ["client_version", "3.?.? [Build: 5680278000]"],
196
- ["client_platform", "Windows"],
197
- ["client_input_hardware", "1"],
198
- ["client_output_hardware", "1"],
199
- ["client_default_channel", n.defaultChannel],
200
- ["client_default_channel_password", r],
201
- ["client_server_password", i],
202
- ["client_meta_data", ""],
203
- ["client_version_sign", "DX5NIYLvfJEUjuIbCidnoeozxIDRRkpq3I9vVMBmE9L2qnekOoBzSenkzsg2lC9CMv8K5hkEzhr2TYUYSwUXCg=="],
204
- ["client_key_offset", String(e.crypt.identity.offset)],
205
- ["client_nickname_phonetic", ""],
206
- ["client_default_token", ""],
207
- ["hwid", a]
208
- ]);
209
- }
210
- //#endregion
211
- //#region src/helpers.ts
212
- function q(e) {
213
- if (e === "" || e === void 0) return 0n;
214
- try {
215
- return BigInt(e);
216
- } catch {
217
- return 0n;
218
- }
219
- }
220
- function J(e) {
221
- let t = parseInt(e, 10);
222
- return isNaN(t) || t < 0 || t > 65535 ? 0 : t;
223
- }
224
- function Y(e) {
225
- let t = parseInt(e, 10);
226
- return isNaN(t) ? 0 : t;
227
- }
228
- function X(e, t) {
229
- if (t === e) return !0;
230
- if (!t.startsWith(e)) return !1;
231
- let n = t.slice(e.length);
232
- return /^\d+$/.test(n);
233
- }
234
- function Z(e) {
235
- let t = e.indexOf(" ");
236
- if (t < 0) return [e];
237
- let n = e.slice(0, t), r = e.slice(t + 1);
238
- if (!r.includes("|")) return [e];
239
- let i = r.split("|"), a = [], o = /* @__PURE__ */ new Map();
240
- for (let e of i) {
241
- if (e === "") continue;
242
- let t = e.split(" ").filter(Boolean), r = /* @__PURE__ */ new Set();
243
- for (let e of t) r.add(Q(e));
244
- let i = [];
245
- for (let [e, t] of o) r.has(e) || i.push(t);
246
- let s = [...i, ...t];
247
- a.push(`${n} ${s.join(" ")}`), o = /* @__PURE__ */ new Map();
248
- for (let e of s) o.set(Q(e), e);
249
- }
250
- return a.length === 0 ? [e] : a;
251
- }
252
- function Q(e) {
253
- let t = e.indexOf("=");
254
- return t > 0 ? e.slice(0, t) : e;
255
- }
256
- //#endregion
257
- //#region src/notifications.ts
258
- function re(e, t, n, r) {
259
- switch (e.name) {
260
- case "notifycliententerview": return ie(e, n, r);
261
- case "notifyclientleftview": return ae(e, t, n);
262
- case "notifyclientmoved": return oe(e, n);
263
- case "notifytextmessage": return se(e, n);
264
- case "notifyclientpoke": return de(e);
265
- case "notifystartupload": return {
266
- kind: "startUpload",
267
- info: ce(e)
268
- };
269
- case "notifystartdownload": return {
270
- kind: "startDownload",
271
- info: le(e)
272
- };
273
- case "notifystatusfiletransfer": return {
274
- kind: "fileTransferStatus",
275
- info: ue(e)
276
- };
277
- default: return { kind: "unknown" };
278
- }
279
- }
280
- function ie(e, t, n) {
281
- let r = J(e.params.clid ?? ""), i = q(e.params.ctid ?? ""), a = Y(e.params.client_type ?? ""), o = e.params.client_servergroups ?? "", s = {
282
- id: r,
283
- nickname: e.params.client_nickname ?? "",
284
- uid: e.params.client_unique_identifier ?? "",
285
- channelID: i,
286
- type: a,
287
- serverGroups: o ? o.split(",") : []
288
- };
289
- return r !== 0 && t.set(r, s), {
290
- kind: "clientEnter",
291
- info: s
292
- };
293
- }
294
- function ae(e, t, n) {
295
- let r = J(e.params.clid ?? ""), i = Y(e.params.reasonid ?? ""), a = r === t;
296
- return r !== 0 && n.delete(r), {
297
- kind: "clientLeave",
298
- event: {
299
- id: r,
300
- reasonID: i,
301
- reasonMsg: e.params.reasonmsg ?? "",
302
- targetID: J(e.params.targetid ?? "")
303
- },
304
- isSelf: a
305
- };
306
- }
307
- function oe(e, t) {
308
- let n = J(e.params.clid ?? ""), r = q(e.params.ctid ?? "");
309
- if (n !== 0) {
310
- let e = t.get(n);
311
- e && t.set(n, {
312
- ...e,
313
- channelID: r
314
- });
315
- }
316
- return {
317
- kind: "clientMoved",
318
- event: {
319
- id: n,
320
- targetChannelID: r,
321
- reasonID: Y(e.params.reasonid ?? ""),
322
- invokerID: J(e.params.invokerid ?? ""),
323
- invokerName: e.params.invokername ?? "",
324
- invokerUID: e.params.invokeruid ?? ""
325
- }
326
- };
327
- }
328
- function se(e, t) {
329
- let n = J(e.params.invokerid ?? ""), r = t.get(n);
330
- return {
331
- kind: "textMessage",
332
- message: {
333
- targetMode: Y(e.params.targetmode ?? ""),
334
- targetID: q(e.params.target ?? ""),
335
- invokerID: n,
336
- invokerName: e.params.invokername ?? "",
337
- invokerUID: e.params.invokeruid ?? r?.uid ?? "",
338
- message: S(e.params.msg ?? ""),
339
- invokerGroups: r?.serverGroups ?? []
340
- }
341
- };
342
- }
343
- function ce(e) {
344
- return {
345
- clientFileTransferID: J(e.params.clientftfid ?? ""),
346
- serverFileTransferID: J(e.params.serverftfid ?? ""),
347
- fileTransferKey: e.params.ftkey ?? "",
348
- port: J(e.params.port ?? ""),
349
- seekPosition: q(e.params.seekpos ?? "")
350
- };
351
- }
352
- function le(e) {
353
- return {
354
- clientFileTransferID: J(e.params.clientftfid ?? ""),
355
- serverFileTransferID: J(e.params.serverftfid ?? ""),
356
- fileTransferKey: e.params.ftkey ?? "",
357
- port: J(e.params.port ?? ""),
358
- size: q(e.params.size ?? "")
359
- };
360
- }
361
- function ue(e) {
362
- return {
363
- clientFileTransferID: J(e.params.clientftfid ?? ""),
364
- status: Y(e.params.status ?? ""),
365
- message: e.params.msg ?? ""
366
- };
367
- }
368
- function de(e) {
369
- return {
370
- kind: "poked",
371
- event: {
372
- invokerID: J(e.params.invokerid ?? ""),
373
- invokerName: S(e.params.invokername ?? ""),
374
- invokerUID: e.params.invokeruid ?? "",
375
- message: S(e.params.msg ?? "")
376
- }
377
- };
378
- }
379
- //#endregion
380
- //#region src/throttle.ts
381
- var fe = class e {
382
- static TOKEN_RATE = 4;
383
- static TOKEN_MAX = 8;
384
- #e = 5;
385
- #t = Date.now();
386
- async wait(t) {
387
- for (;;) {
388
- if (t?.aborted) throw t.reason;
389
- let n = Date.now(), r = (n - this.#t) / 1e3;
390
- if (this.#e = Math.min(this.#e + r * e.TOKEN_RATE, e.TOKEN_MAX), this.#t = n, this.#e >= 1) {
391
- --this.#e;
392
- return;
393
- }
394
- let i = Math.ceil((1 - this.#e) / e.TOKEN_RATE * 1e3) + 10;
395
- await new Promise((e, n) => {
396
- let r = setTimeout(e, i);
397
- t && t.addEventListener("abort", () => {
398
- clearTimeout(r), n(t.reason);
399
- }, { once: !0 });
400
- });
401
- }
402
- }
403
- };
404
- //#endregion
405
- //#region src/client.ts
406
- function pe(e) {
407
- return {
408
- serverPassword: e.serverPassword ?? "",
409
- defaultChannel: e.defaultChannel ?? "",
410
- defaultChannelPassword: e.defaultChannelPassword ?? ""
411
- };
412
- }
413
- var $ = class {
414
- crypt;
415
- handler;
416
- logger;
417
- nickname;
418
- clid = 0;
419
- #e;
420
- #t;
421
- #n;
422
- #r;
423
- #i = t.Disconnected;
424
- #a = new fe();
425
- #o = new O();
426
- #s = new j();
427
- #c = /* @__PURE__ */ new Map();
428
- #l = [];
429
- #u = null;
430
- #d = [];
431
- #f = [];
432
- #p = [];
433
- #m = [];
434
- #h = [];
435
- #g = [];
436
- #_ = [];
437
- #v = [];
438
- #y = [];
439
- #b = [];
440
- #x = [];
441
- #S;
442
- #C;
443
- constructor(t, n, r, i = {}) {
444
- this.#e = t, this.#t = n, this.nickname = r, this.logger = i.logger ?? e, this.#n = i.resolver ?? new y(this.logger), this.#r = pe(i), this.crypt = new v(t), this.handler = new x(this.crypt, this.logger), this.handler.onPacket = (e) => this.#E(e), this.handler.onClosed = (e) => this.#F(e), i.commandMiddleware && this.#b.push(...i.commandMiddleware), i.eventMiddleware && this.#x.push(...i.eventMiddleware), this.#S = this.#L(), this.#C = this.#R();
445
- }
446
- get status() {
447
- return this.#i;
448
- }
449
- getClientInitOptions() {
450
- return this.#r;
451
- }
452
- async connect() {
453
- if (this.#i !== t.Disconnected) throw new l();
454
- this.#w(), this.#i = t.Connecting;
455
- let e = await this.#T();
456
- this.logger.info("connecting to server", { address: e }), await this.handler.connect(e);
457
- }
458
- async disconnect() {
459
- if (this.#i === t.Disconnected) return;
460
- let e = this.#i === t.Connected;
461
- if (this.#i = t.Disconnected, this.logger.info("disconnecting from server"), e) try {
462
- await this.execCommand("clientdisconnect reasonmsg=Shutdown", 1e3);
463
- } catch {}
464
- this.handler.close();
465
- let n = this.#v.slice();
466
- for (let e of n) setImmediate(() => e(void 0));
467
- }
468
- waitConnected(e) {
469
- return this.#i === t.Connected ? Promise.resolve() : this.#u ? Promise.reject(this.#u) : new Promise((t, n) => {
470
- let r = {
471
- resolve: () => {
472
- e?.removeEventListener("abort", i), t();
473
- },
474
- reject: (t) => {
475
- e?.removeEventListener("abort", i), n(t);
476
- }
477
- }, i = () => {
478
- let t = this.#l.indexOf(r);
479
- t >= 0 && this.#l.splice(t, 1);
480
- let n = e?.reason;
481
- r.reject(n instanceof Error ? n : Error(String(n ?? "Connection wait aborted")));
482
- };
483
- this.#l.push(r), e?.aborted ? i() : e?.addEventListener("abort", i, { once: !0 });
484
- });
485
- }
486
- async sendCommandNoWait(e) {
487
- await this.#a.wait(), await this.#S(e);
488
- }
489
- async execCommand(e, t = 1e4) {
490
- await this.execCommandWithResponse(e, t);
491
- }
492
- async execCommandWithResponse(e, t = 1e4) {
493
- let [n, r] = this.#o.register(), i = A(e, n);
494
- try {
495
- await this.#a.wait(), await this.#S(i);
496
- } catch (e) {
497
- throw this.#o.unregister(n), e;
498
- }
499
- let a = await Promise.race([r, new Promise((n, r) => setTimeout(() => r(new c(e)), t))]);
500
- if (this.#o.unregister(n), a.err) throw a.err;
501
- return a.data;
502
- }
503
- on(e, t) {
504
- switch (e) {
505
- case "textMessage":
506
- this.#d.push(t);
507
- break;
508
- case "clientEnter":
509
- this.#f.push(t);
510
- break;
511
- case "clientLeave":
512
- this.#p.push(t);
513
- break;
514
- case "clientMoved":
515
- this.#m.push(t);
516
- break;
517
- case "poked":
518
- this.#h.push(t);
519
- break;
520
- case "voiceData":
521
- this.#g.push(t);
522
- break;
523
- case "connected":
524
- this.#_.push(t);
525
- break;
526
- case "disconnected":
527
- this.#v.push(t);
528
- break;
529
- case "kicked": this.#y.push(t);
530
- }
531
- return this;
532
- }
533
- useCommandMiddleware(...e) {
534
- return this.#b.push(...e), this.#S = this.#L(), this;
535
- }
536
- useEventMiddleware(...e) {
537
- return this.#x.push(...e), this.#C = this.#R(), this;
538
- }
539
- clientID() {
540
- return this.clid;
541
- }
542
- channelID() {
543
- return this.#c.get(this.clid)?.channelID ?? 0n;
544
- }
545
- sendWhisper(e, t, n) {
546
- this.handler.sendWhisperPacket(e, t, n);
547
- }
548
- sendVoice(e, t) {
549
- this.handler.sendVoicePacket(e, t);
550
- }
551
- async fileTransferInitUpload(e, t, n, r, i = !1) {
552
- let [a, s] = this.#s.register(), c = F(e, t, n, r, a, i);
553
- try {
554
- await this.execCommand(c, 1e4);
555
- } catch (e) {
556
- throw this.#s.unregister(a), e;
557
- }
558
- let l = await Promise.race([s, new Promise((e, t) => setTimeout(() => t(new g()), 1e4))]);
559
- if (this.#s.unregister(a), "size" in l) throw new o("unexpected download response");
560
- if ("status" in l) {
561
- let e = l;
562
- throw new o(`${e.message} (status=${e.status})`);
563
- }
564
- return l;
565
- }
566
- async fileTransferInitDownload(e, t, n) {
567
- let [r, i] = this.#s.register(), a = I(e, t, n, r);
568
- try {
569
- await this.execCommand(a, 1e4);
570
- } catch (e) {
571
- throw this.#s.unregister(r), e;
572
- }
573
- let s = await Promise.race([i, new Promise((e, t) => setTimeout(() => t(new g()), 1e4))]);
574
- if (this.#s.unregister(r), "seekPosition" in s) throw new o("unexpected upload response");
575
- if ("status" in s) {
576
- let e = s;
577
- throw new o(`${e.message} (status=${e.status})`);
578
- }
579
- return s;
580
- }
581
- uploadFileData(e, t, n) {
582
- return N(e, t, n);
583
- }
584
- downloadFileData(e, t, n) {
585
- return P(e, t, n);
586
- }
587
- _markConnected() {
588
- this.#i = t.Connected, this.#u = null;
589
- for (let e of this.#l) e.resolve();
590
- this.#l = [];
591
- let e = this.#_.slice();
592
- for (let t of e) setImmediate(() => t());
593
- }
594
- #w() {
595
- this.#u = null, this.handler.close(), this.crypt = new v(this.#e), this.handler = new x(this.crypt, this.logger), this.handler.onPacket = (e) => this.#E(e), this.handler.onClosed = (e) => this.#F(e), this.#o.reset(), this.#s.reset(), this.#c.clear(), this.clid = 0, this.#S = this.#L();
596
- }
597
- async #T() {
598
- let e = this.#t.includes(":") ? this.#t : `${this.#t}:9987`;
599
- try {
600
- return (await this.#n.resolve(this.#t))[0]?.addr ?? e;
601
- } catch {
602
- return e;
603
- }
604
- }
605
- #E(e) {
606
- this.#D(e);
607
- }
608
- #D(e) {
609
- let t = e.typeFlagged & 15;
610
- if (t === 8) {
611
- let t = te(this.crypt, e.data);
612
- t && this.handler.sendPacket(b.Init1, t, 0);
613
- return;
614
- }
615
- if ((t === 0 || t === 1) && e.data.length > 5) {
616
- this.#O(e.data);
617
- return;
618
- }
619
- (t === 2 || t === 3) && e.data.length > 0 && this.#k(Buffer.from(e.data).toString("utf8"));
620
- }
621
- #O(e) {
622
- if (this.#g.length === 0) return;
623
- let t = new DataView(e.buffer, e.byteOffset, e.byteLength).getUint16(2, !1);
624
- if (t === this.clid) return;
625
- let n = {
626
- clientId: t,
627
- codec: e[4],
628
- data: e.subarray(5)
629
- };
630
- for (let e of this.#g) setImmediate(() => e(n));
631
- }
632
- #k(e) {
633
- if (!e) return;
634
- let t = e.split("\0").join("\n").split("\n");
635
- for (let e of t) {
636
- let t = e.replace(/\r$/, "");
637
- if (t) for (let e of Z(t)) this.#A(e);
638
- }
639
- }
640
- #A(e) {
641
- let t = T(e);
642
- if (t && t.name) {
643
- if (t.name.startsWith("notify")) {
644
- let e = re(t, this.clid, this.#c, this.nickname);
645
- this.#M(e, t.params);
646
- return;
647
- }
648
- switch (t.name) {
649
- case "clientinitiv":
650
- z(this, t.params);
651
- break;
652
- case "initivexpand2":
653
- B(this, t.params);
654
- break;
655
- case "initserver":
656
- V(this, t.params);
657
- break;
658
- case "error":
659
- this.#j(t.params);
660
- break;
661
- default: {
662
- let e = t.params;
663
- if (t.name.includes("=")) {
664
- let n = t.name.indexOf("="), r = t.name.slice(0, n), i = t.name.slice(n + 1);
665
- e = {
666
- [r]: i,
667
- ...t.params
668
- };
669
- }
670
- this.#o.buffer(e);
671
- break;
672
- }
673
- }
674
- }
675
- }
676
- #j(e) {
677
- let { err: n, rc: r } = k(e);
678
- if (r === null ? this.#o.discardBuffer() : this.#o.resolve(r, n), n && this.#i !== t.Connected) {
679
- this.#I(n);
680
- return;
681
- }
682
- (e.id ?? "0") === "3329" && setImmediate(() => this.disconnect().catch(() => {}));
683
- }
684
- #M(e, t) {
685
- switch (e.kind) {
686
- case "clientEnter": {
687
- let t = e.info;
688
- t.id !== 0 && t.id === this.clid ? (this.nickname = t.nickname, this.#o.signalWelcomeComplete()) : t.id !== 0 && this.clid === 0 && X(this.nickname, t.nickname) && (this.clid = t.id, this.handler.setClientID(t.id), this.nickname = t.nickname, this.#o.signalWelcomeComplete()), this.#N("clientEnter", t);
689
- break;
690
- }
691
- case "clientLeave":
692
- if (this.#N("clientLeave", e.event), e.isSelf && (e.event.reasonID === 4 || e.event.reasonID === 5)) {
693
- let t = e.event.reasonMsg;
694
- for (let e of this.#y) setImmediate(() => e(t));
695
- }
696
- break;
697
- case "clientMoved":
698
- this.#N("clientMoved", e.event);
699
- break;
700
- case "textMessage":
701
- this.#N("textMessage", e.message);
702
- break;
703
- case "poked":
704
- this.#N("poked", e.event);
705
- break;
706
- case "startUpload":
707
- this.#s.notify(e.info.clientFileTransferID, e.info);
708
- break;
709
- case "startDownload":
710
- this.#s.notify(e.info.clientFileTransferID, e.info);
711
- break;
712
- case "fileTransferStatus": this.#s.notify(e.info.clientFileTransferID, e.info);
713
- }
714
- }
715
- #N(e, t) {
716
- this.#C(t);
717
- }
718
- #P(e, t) {
719
- switch (e) {
720
- case "textMessage":
721
- for (let e of this.#d) setImmediate(() => e(t));
722
- break;
723
- case "clientEnter":
724
- for (let e of this.#f) setImmediate(() => e(t));
725
- break;
726
- case "clientLeave":
727
- for (let e of this.#p) setImmediate(() => e(t));
728
- break;
729
- case "clientMoved":
730
- for (let e of this.#m) setImmediate(() => e(t));
731
- break;
732
- case "poked": for (let e of this.#h) setImmediate(() => e(t));
733
- }
734
- }
735
- #F(e) {
736
- if (this.#i === t.Disconnected) return;
737
- if (this.#i !== t.Connected) {
738
- this.#I(e ?? /* @__PURE__ */ Error("Connection closed before the TeamSpeak handshake completed"));
739
- return;
740
- }
741
- this.#i = t.Disconnected;
742
- let n = this.#v.slice();
743
- for (let t of n) setImmediate(() => t(e ?? void 0));
744
- }
745
- #I(e) {
746
- this.#u = e;
747
- let n = this.#l.splice(0);
748
- for (let t of n) t.reject(e);
749
- if (this.#i === t.Disconnected) return;
750
- this.#i = t.Disconnected, this.handler.close();
751
- let r = this.#v.slice();
752
- for (let t of r) setImmediate(() => t(e));
753
- }
754
- #L() {
755
- return L(this.#b, async (e) => {
756
- this.handler.sendPacket(b.Command, Buffer.from(e), 0);
757
- });
758
- }
759
- #R() {
760
- return R(this.#x, (e) => {
761
- typeof e == "object" && e && "invokerName" in e && "message" in e && "targetMode" in e ? this.#P("textMessage", e) : typeof e == "object" && e && "invokerName" in e && "message" in e && !("targetMode" in e) ? this.#P("poked", e) : typeof e == "object" && e && "id" in e && "uid" in e ? this.#P("clientEnter", e) : typeof e == "object" && e && "id" in e && "reasonID" in e && "targetChannelID" in e ? this.#P("clientMoved", e) : typeof e == "object" && e && "id" in e && "reasonID" in e && this.#P("clientLeave", e);
762
- });
763
- }
764
- };
765
- //#endregion
766
- //#region src/api.ts
767
- async function me(e, t, n, r) {
768
- let i = C("sendtextmessage", [
769
- ["targetmode", String(t)],
770
- ["target", String(n)],
771
- ["msg", r]
772
- ]);
773
- await e.sendCommandNoWait(i);
774
- }
775
- async function he(e, t, n, r = "") {
776
- let i = [["clid", String(t)], ["cid", String(n)]];
777
- r && i.push(["cpw", ge(r)]);
778
- let a = C("clientmove", i);
779
- await e.execCommand(a, 1e4);
780
- }
781
- function ge(e) {
782
- return E("sha1").update(e).digest("base64");
783
- }
784
- async function _e(e, t, n) {
785
- let r = C("clientpoke", [["clid", String(t)], ["msg", n]]);
786
- await e.execCommand(r, 1e4);
787
- }
788
- async function ve(e, t) {
789
- let n = (await e.execCommandWithResponse(`clientinfo clid=${t}`, 5e3))[0];
790
- if (!n) throw Error(`no data returned for client ${t}`);
791
- return n;
792
- }
793
- async function ye(e) {
794
- return (await e.execCommandWithResponse("channellist", 5e3)).map((e) => ({
795
- id: BigInt(e.cid ?? "0"),
796
- parentID: BigInt(e.pid ?? e.cpid ?? "0"),
797
- order: BigInt(e.channel_order ?? "0"),
798
- name: S(e.channel_name ?? ""),
799
- description: ""
800
- }));
801
- }
802
- async function be(e) {
803
- return (await e.execCommandWithResponse("clientlist -uid -away -voice -groups", 5e3)).map((e) => {
804
- let t = e.client_servergroups ?? "";
805
- return {
806
- id: parseInt(e.clid ?? "0", 10),
807
- nickname: S(e.client_nickname ?? ""),
808
- uid: e.client_unique_identifier ?? "",
809
- channelID: BigInt(e.cid ?? "0"),
810
- type: parseInt(e.client_type ?? "0", 10),
811
- serverGroups: t ? t.split(",") : []
812
- };
813
- });
814
- }
815
- async function xe(e, t, n) {
816
- if (n.length === 0) return;
817
- let r = n.join("|"), i = w("ftdeletefile", {
818
- cid: String(t),
819
- cpw: "",
820
- name: r
821
- });
822
- await e.execCommand(i, 1e4);
823
- }
824
- //#endregion
825
- export { l as AlreadyConnectedError, $ as Client, t as ClientStatus, c as CommandTimeoutError, a as CryptoInitError, h as EAXTagMismatchError, _ as FakeSignatureMismatchError, o as FileTransferError, g as FileTransferTimeoutError, u as Identity, i as InvalidIdentityError, r as ServerError, ee as TeamspeakError, he as clientMove, e as consoleLogger, M as dialFileTransfer, P as downloadFileData, xe as fileTransferDeleteFile, m as generateIdentity, ve as getClientInfo, s as getUidFromPublicKey, f as identityFromString, ye as listChannels, be as listClients, n as noopLogger, _e as poke, me as sendTextMessage, N as uploadFileData };
826
-
827
- //# sourceMappingURL=index.mjs.map