@honeybbq/teamspeak-client 0.3.0 → 1.0.0-beta.1

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 (178) hide show
  1. package/README.md +322 -60
  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 +172 -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/eax.d.ts.map +1 -1
  17. package/dist/crypto/identity.d.ts +87 -8
  18. package/dist/crypto/identity.d.ts.map +1 -1
  19. package/dist/crypto/index.d.ts +2 -1
  20. package/dist/crypto/index.d.ts.map +1 -1
  21. package/dist/diagnostics.d.ts +45 -0
  22. package/dist/diagnostics.d.ts.map +1 -0
  23. package/dist/discovery/resolver.d.ts +21 -3
  24. package/dist/discovery/resolver.d.ts.map +1 -1
  25. package/dist/errors.d.ts +70 -16
  26. package/dist/errors.d.ts.map +1 -1
  27. package/dist/events.d.ts +4 -5
  28. package/dist/events.d.ts.map +1 -1
  29. package/dist/handshake/crypt-handshake.d.ts +1 -0
  30. package/dist/handshake/crypt-handshake.d.ts.map +1 -1
  31. package/dist/handshake/crypt-init2.d.ts.map +1 -1
  32. package/dist/handshake/license.d.ts +7 -0
  33. package/dist/handshake/license.d.ts.map +1 -1
  34. package/dist/handshake.d.ts +14 -5
  35. package/dist/handshake.d.ts.map +1 -1
  36. package/dist/helpers.d.ts +0 -8
  37. package/dist/helpers.d.ts.map +1 -1
  38. package/dist/index.d.ts +20 -6
  39. package/dist/index.d.ts.map +1 -1
  40. package/dist/index.js +3967 -0
  41. package/dist/index.js.map +1 -0
  42. package/dist/notifications.d.ts +7 -15
  43. package/dist/notifications.d.ts.map +1 -1
  44. package/dist/reconnect.d.ts +69 -0
  45. package/dist/reconnect.d.ts.map +1 -0
  46. package/dist/throttle.d.ts +9 -0
  47. package/dist/throttle.d.ts.map +1 -1
  48. package/dist/transfer.d.ts +27 -25
  49. package/dist/transfer.d.ts.map +1 -1
  50. package/dist/transport/generation-window.d.ts.map +1 -1
  51. package/dist/transport/handler.d.ts +37 -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 -57
  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 +1392 -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.test.ts +49 -0
  79. package/src/handshake/license.ts +208 -0
  80. package/src/handshake.ts +136 -0
  81. package/src/helpers.ts +10 -0
  82. package/src/index.ts +74 -0
  83. package/src/notifications.ts +136 -0
  84. package/src/reconnect.ts +141 -0
  85. package/src/throttle.ts +92 -0
  86. package/src/transfer.ts +127 -0
  87. package/src/transport/generation-window.ts +77 -0
  88. package/src/transport/handler.ts +914 -0
  89. package/src/transport/index.ts +14 -0
  90. package/src/transport/packet.ts +69 -0
  91. package/src/transport/quicklz.ts +209 -0
  92. package/src/types.ts +349 -0
  93. package/dist/address-BR-5unVo.cjs +0 -2
  94. package/dist/address-BR-5unVo.cjs.map +0 -1
  95. package/dist/address-BfmovVpp.js +0 -65
  96. package/dist/address-BfmovVpp.js.map +0 -1
  97. package/dist/address.test.d.ts +0 -2
  98. package/dist/address.test.d.ts.map +0 -1
  99. package/dist/api.d.ts +0 -17
  100. package/dist/api.d.ts.map +0 -1
  101. package/dist/api.test.d.ts +0 -2
  102. package/dist/api.test.d.ts.map +0 -1
  103. package/dist/command/command.d.ts +0 -12
  104. package/dist/command/command.d.ts.map +0 -1
  105. package/dist/command/command.test.d.ts +0 -2
  106. package/dist/command/command.test.d.ts.map +0 -1
  107. package/dist/command/index.cjs +0 -1
  108. package/dist/command/index.d.ts +0 -4
  109. package/dist/command/index.d.ts.map +0 -1
  110. package/dist/command/index.mjs +0 -3
  111. package/dist/command/parser.d.ts +0 -3
  112. package/dist/command/parser.d.ts.map +0 -1
  113. package/dist/command-BLe-C2L2.js +0 -74
  114. package/dist/command-BLe-C2L2.js.map +0 -1
  115. package/dist/command-DAK4pUBP.cjs +0 -4
  116. package/dist/command-DAK4pUBP.cjs.map +0 -1
  117. package/dist/crypt-handshake-CQkQreLx.cjs +0 -2
  118. package/dist/crypt-handshake-CQkQreLx.cjs.map +0 -1
  119. package/dist/crypt-handshake-DziOY4Lq.js +0 -55
  120. package/dist/crypt-handshake-DziOY4Lq.js.map +0 -1
  121. package/dist/crypt-init2-D70ha4LB.js +0 -158
  122. package/dist/crypt-init2-D70ha4LB.js.map +0 -1
  123. package/dist/crypt-init2-DparLekm.cjs +0 -2
  124. package/dist/crypt-init2-DparLekm.cjs.map +0 -1
  125. package/dist/crypto/eax.test.d.ts +0 -2
  126. package/dist/crypto/eax.test.d.ts.map +0 -1
  127. package/dist/crypto/identity.test.d.ts +0 -2
  128. package/dist/crypto/identity.test.d.ts.map +0 -1
  129. package/dist/crypto/index.cjs +0 -1
  130. package/dist/crypto/index.mjs +0 -3
  131. package/dist/crypto-Bg02m4ZE.js +0 -165
  132. package/dist/crypto-Bg02m4ZE.js.map +0 -1
  133. package/dist/crypto-CDlweUL3.cjs +0 -2
  134. package/dist/crypto-CDlweUL3.cjs.map +0 -1
  135. package/dist/discovery/index.cjs +0 -1
  136. package/dist/discovery/index.mjs +0 -2
  137. package/dist/handler-DI_abe9c.js +0 -483
  138. package/dist/handler-DI_abe9c.js.map +0 -1
  139. package/dist/handler-DuwoO5RC.cjs +0 -2
  140. package/dist/handler-DuwoO5RC.cjs.map +0 -1
  141. package/dist/handshake/index.cjs +0 -1
  142. package/dist/handshake/index.mjs +0 -3
  143. package/dist/handshake.test.d.ts +0 -2
  144. package/dist/handshake.test.d.ts.map +0 -1
  145. package/dist/helpers.test.d.ts +0 -2
  146. package/dist/helpers.test.d.ts.map +0 -1
  147. package/dist/index.cjs +0 -4
  148. package/dist/index.cjs.map +0 -1
  149. package/dist/index.mjs +0 -796
  150. package/dist/index.mjs.map +0 -1
  151. package/dist/integration.test.d.ts +0 -12
  152. package/dist/integration.test.d.ts.map +0 -1
  153. package/dist/notifications.test.d.ts +0 -2
  154. package/dist/notifications.test.d.ts.map +0 -1
  155. package/dist/parser-CL33R9tr.cjs +0 -2
  156. package/dist/parser-CL33R9tr.cjs.map +0 -1
  157. package/dist/parser-DZMv3Jm-.js +0 -33
  158. package/dist/parser-DZMv3Jm-.js.map +0 -1
  159. package/dist/primitives-cNNAeFCo.cjs +0 -2
  160. package/dist/primitives-cNNAeFCo.cjs.map +0 -1
  161. package/dist/primitives-xIr6Tjk4.js +0 -1457
  162. package/dist/primitives-xIr6Tjk4.js.map +0 -1
  163. package/dist/resolver-6B8dI9gr.js +0 -141
  164. package/dist/resolver-6B8dI9gr.js.map +0 -1
  165. package/dist/resolver-DCcmyWSK.cjs +0 -4
  166. package/dist/resolver-DCcmyWSK.cjs.map +0 -1
  167. package/dist/throttle.test.d.ts +0 -2
  168. package/dist/throttle.test.d.ts.map +0 -1
  169. package/dist/transport/generation-window.test.d.ts +0 -2
  170. package/dist/transport/generation-window.test.d.ts.map +0 -1
  171. package/dist/transport/index.cjs +0 -1
  172. package/dist/transport/index.mjs +0 -2
  173. package/dist/transport/packet.test.d.ts +0 -2
  174. package/dist/transport/packet.test.d.ts.map +0 -1
  175. package/dist/transport/quicklz.test.d.ts +0 -2
  176. package/dist/transport/quicklz.test.d.ts.map +0 -1
  177. package/dist/transport/whisper.test.d.ts +0 -2
  178. package/dist/transport/whisper.test.d.ts.map +0 -1
package/dist/index.mjs DELETED
@@ -1,796 +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 = [];
430
- #d = [];
431
- #f = [];
432
- #p = [];
433
- #m = [];
434
- #h = [];
435
- #g = [];
436
- #_ = [];
437
- #v = [];
438
- #y = [];
439
- #b = [];
440
- #x;
441
- #S;
442
- constructor(t, n, r, i = {}) {
443
- 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.#T(e), this.handler.onClosed = (e) => this.#P(e), i.commandMiddleware && this.#y.push(...i.commandMiddleware), i.eventMiddleware && this.#b.push(...i.eventMiddleware), this.#x = this.#F(), this.#S = this.#I();
444
- }
445
- get status() {
446
- return this.#i;
447
- }
448
- getClientInitOptions() {
449
- return this.#r;
450
- }
451
- async connect() {
452
- if (this.#i !== t.Disconnected) throw new l();
453
- this.#C(), this.#i = t.Connecting;
454
- let e = await this.#w();
455
- this.logger.info("connecting to server", { address: e }), await this.handler.connect(e);
456
- }
457
- async disconnect() {
458
- if (this.#i === t.Disconnected) return;
459
- let e = this.#i === t.Connected;
460
- if (this.#i = t.Disconnected, this.logger.info("disconnecting from server"), e) try {
461
- await this.execCommand("clientdisconnect reasonmsg=Shutdown", 1e3);
462
- } catch {}
463
- this.handler.close();
464
- let n = this.#_.slice();
465
- for (let e of n) setImmediate(() => e(void 0));
466
- }
467
- waitConnected(e) {
468
- return this.#i === t.Connected ? Promise.resolve() : new Promise((t, n) => {
469
- this.#l.push(t), e && e.addEventListener("abort", () => n(e.reason), { once: !0 });
470
- });
471
- }
472
- async sendCommandNoWait(e) {
473
- await this.#a.wait(), await this.#x(e);
474
- }
475
- async execCommand(e, t = 1e4) {
476
- await this.execCommandWithResponse(e, t);
477
- }
478
- async execCommandWithResponse(e, t = 1e4) {
479
- let [n, r] = this.#o.register(), i = A(e, n);
480
- try {
481
- await this.#a.wait(), await this.#x(i);
482
- } catch (e) {
483
- throw this.#o.unregister(n), e;
484
- }
485
- let a = await Promise.race([r, new Promise((n, r) => setTimeout(() => r(new c(e)), t))]);
486
- if (this.#o.unregister(n), a.err) throw a.err;
487
- return a.data;
488
- }
489
- on(e, t) {
490
- switch (e) {
491
- case "textMessage":
492
- this.#u.push(t);
493
- break;
494
- case "clientEnter":
495
- this.#d.push(t);
496
- break;
497
- case "clientLeave":
498
- this.#f.push(t);
499
- break;
500
- case "clientMoved":
501
- this.#p.push(t);
502
- break;
503
- case "poked":
504
- this.#m.push(t);
505
- break;
506
- case "voiceData":
507
- this.#h.push(t);
508
- break;
509
- case "connected":
510
- this.#g.push(t);
511
- break;
512
- case "disconnected":
513
- this.#_.push(t);
514
- break;
515
- case "kicked": this.#v.push(t);
516
- }
517
- return this;
518
- }
519
- useCommandMiddleware(...e) {
520
- return this.#y.push(...e), this.#x = this.#F(), this;
521
- }
522
- useEventMiddleware(...e) {
523
- return this.#b.push(...e), this.#S = this.#I(), this;
524
- }
525
- clientID() {
526
- return this.clid;
527
- }
528
- channelID() {
529
- return this.#c.get(this.clid)?.channelID ?? 0n;
530
- }
531
- sendWhisper(e, t, n) {
532
- this.handler.sendWhisperPacket(e, t, n);
533
- }
534
- sendVoice(e, t) {
535
- this.handler.sendVoicePacket(e, t);
536
- }
537
- async fileTransferInitUpload(e, t, n, r, i = !1) {
538
- let [a, s] = this.#s.register(), c = F(e, t, n, r, a, i);
539
- try {
540
- await this.execCommand(c, 1e4);
541
- } catch (e) {
542
- throw this.#s.unregister(a), e;
543
- }
544
- let l = await Promise.race([s, new Promise((e, t) => setTimeout(() => t(new g()), 1e4))]);
545
- if (this.#s.unregister(a), "size" in l) throw new o("unexpected download response");
546
- if ("status" in l) {
547
- let e = l;
548
- throw new o(`${e.message} (status=${e.status})`);
549
- }
550
- return l;
551
- }
552
- async fileTransferInitDownload(e, t, n) {
553
- let [r, i] = this.#s.register(), a = I(e, t, n, r);
554
- try {
555
- await this.execCommand(a, 1e4);
556
- } catch (e) {
557
- throw this.#s.unregister(r), e;
558
- }
559
- let s = await Promise.race([i, new Promise((e, t) => setTimeout(() => t(new g()), 1e4))]);
560
- if (this.#s.unregister(r), "seekPosition" in s) throw new o("unexpected upload response");
561
- if ("status" in s) {
562
- let e = s;
563
- throw new o(`${e.message} (status=${e.status})`);
564
- }
565
- return s;
566
- }
567
- uploadFileData(e, t, n) {
568
- return N(e, t, n);
569
- }
570
- downloadFileData(e, t, n) {
571
- return P(e, t, n);
572
- }
573
- _markConnected() {
574
- this.#i = t.Connected;
575
- for (let e of this.#l) e();
576
- this.#l = [];
577
- let e = this.#g.slice();
578
- for (let t of e) setImmediate(() => t());
579
- }
580
- #C() {
581
- this.handler.close(), this.crypt = new v(this.#e), this.handler = new x(this.crypt, this.logger), this.handler.onPacket = (e) => this.#T(e), this.handler.onClosed = (e) => this.#P(e), this.#o.reset(), this.#s.reset(), this.#c.clear(), this.clid = 0, this.#x = this.#F();
582
- }
583
- async #w() {
584
- let e = this.#t.includes(":") ? this.#t : `${this.#t}:9987`;
585
- try {
586
- return (await this.#n.resolve(this.#t))[0]?.addr ?? e;
587
- } catch {
588
- return e;
589
- }
590
- }
591
- #T(e) {
592
- this.#E(e);
593
- }
594
- #E(e) {
595
- let t = e.typeFlagged & 15;
596
- if (t === 8) {
597
- let t = te(this.crypt, e.data);
598
- t && this.handler.sendPacket(b.Init1, t, 0);
599
- return;
600
- }
601
- if ((t === 0 || t === 1) && e.data.length > 5) {
602
- this.#D(e.data);
603
- return;
604
- }
605
- (t === 2 || t === 3) && e.data.length > 0 && this.#O(Buffer.from(e.data).toString("utf8"));
606
- }
607
- #D(e) {
608
- if (this.#h.length === 0) return;
609
- let t = new DataView(e.buffer, e.byteOffset, e.byteLength).getUint16(2, !1);
610
- if (t === this.clid) return;
611
- let n = {
612
- clientId: t,
613
- codec: e[4],
614
- data: e.subarray(5)
615
- };
616
- for (let e of this.#h) setImmediate(() => e(n));
617
- }
618
- #O(e) {
619
- if (!e) return;
620
- let t = e.split("\0").join("\n").split("\n");
621
- for (let e of t) {
622
- let t = e.replace(/\r$/, "");
623
- if (t) for (let e of Z(t)) this.#k(e);
624
- }
625
- }
626
- #k(e) {
627
- let t = T(e);
628
- if (t && t.name) {
629
- if (t.name.startsWith("notify")) {
630
- let e = re(t, this.clid, this.#c, this.nickname);
631
- this.#j(e, t.params);
632
- return;
633
- }
634
- switch (t.name) {
635
- case "clientinitiv":
636
- z(this, t.params);
637
- break;
638
- case "initivexpand2":
639
- B(this, t.params);
640
- break;
641
- case "initserver":
642
- V(this, t.params);
643
- break;
644
- case "error":
645
- this.#A(t.params);
646
- break;
647
- default: {
648
- let e = t.params;
649
- if (t.name.includes("=")) {
650
- let n = t.name.indexOf("="), r = t.name.slice(0, n), i = t.name.slice(n + 1);
651
- e = {
652
- [r]: i,
653
- ...t.params
654
- };
655
- }
656
- this.#o.buffer(e);
657
- break;
658
- }
659
- }
660
- }
661
- }
662
- #A(e) {
663
- let { err: t, rc: n } = k(e);
664
- n === null ? this.#o.discardBuffer() : this.#o.resolve(n, t), (e.id ?? "0") === "3329" && setImmediate(() => this.disconnect().catch(() => {}));
665
- }
666
- #j(e, t) {
667
- switch (e.kind) {
668
- case "clientEnter": {
669
- let t = e.info;
670
- t.id !== 0 && X(this.nickname, t.nickname) && (this.clid = t.id, this.handler.setClientID(t.id), this.#o.signalWelcomeComplete()), this.#M("clientEnter", t);
671
- break;
672
- }
673
- case "clientLeave":
674
- if (this.#M("clientLeave", e.event), e.isSelf && (e.event.reasonID === 4 || e.event.reasonID === 5)) {
675
- let t = e.event.reasonMsg;
676
- for (let e of this.#v) setImmediate(() => e(t));
677
- }
678
- break;
679
- case "clientMoved":
680
- this.#M("clientMoved", e.event);
681
- break;
682
- case "textMessage":
683
- this.#M("textMessage", e.message);
684
- break;
685
- case "poked":
686
- this.#M("poked", e.event);
687
- break;
688
- case "startUpload":
689
- this.#s.notify(e.info.clientFileTransferID, e.info);
690
- break;
691
- case "startDownload":
692
- this.#s.notify(e.info.clientFileTransferID, e.info);
693
- break;
694
- case "fileTransferStatus": this.#s.notify(e.info.clientFileTransferID, e.info);
695
- }
696
- }
697
- #M(e, t) {
698
- this.#S(t);
699
- }
700
- #N(e, t) {
701
- switch (e) {
702
- case "textMessage":
703
- for (let e of this.#u) setImmediate(() => e(t));
704
- break;
705
- case "clientEnter":
706
- for (let e of this.#d) setImmediate(() => e(t));
707
- break;
708
- case "clientLeave":
709
- for (let e of this.#f) setImmediate(() => e(t));
710
- break;
711
- case "clientMoved":
712
- for (let e of this.#p) setImmediate(() => e(t));
713
- break;
714
- case "poked": for (let e of this.#m) setImmediate(() => e(t));
715
- }
716
- }
717
- #P(e) {
718
- if (this.#i === t.Disconnected) return;
719
- this.#i = t.Disconnected;
720
- let n = this.#_.slice();
721
- for (let t of n) setImmediate(() => t(e ?? void 0));
722
- }
723
- #F() {
724
- return L(this.#y, async (e) => {
725
- this.handler.sendPacket(b.Command, Buffer.from(e), 0);
726
- });
727
- }
728
- #I() {
729
- return R(this.#b, (e) => {
730
- typeof e == "object" && e && "invokerName" in e && "message" in e && "targetMode" in e ? this.#N("textMessage", e) : typeof e == "object" && e && "invokerName" in e && "message" in e && !("targetMode" in e) ? this.#N("poked", e) : typeof e == "object" && e && "id" in e && "uid" in e ? this.#N("clientEnter", e) : typeof e == "object" && e && "id" in e && "reasonID" in e && "targetChannelID" in e ? this.#N("clientMoved", e) : typeof e == "object" && e && "id" in e && "reasonID" in e && this.#N("clientLeave", e);
731
- });
732
- }
733
- };
734
- //#endregion
735
- //#region src/api.ts
736
- async function me(e, t, n, r) {
737
- let i = C("sendtextmessage", [
738
- ["targetmode", String(t)],
739
- ["target", String(n)],
740
- ["msg", r]
741
- ]);
742
- await e.sendCommandNoWait(i);
743
- }
744
- async function he(e, t, n, r = "") {
745
- let i = [["clid", String(t)], ["cid", String(n)]];
746
- r && i.push(["cpw", ge(r)]);
747
- let a = C("clientmove", i);
748
- await e.execCommand(a, 1e4);
749
- }
750
- function ge(e) {
751
- return E("sha1").update(e).digest("base64");
752
- }
753
- async function _e(e, t, n) {
754
- let r = C("clientpoke", [["clid", String(t)], ["msg", n]]);
755
- await e.execCommand(r, 1e4);
756
- }
757
- async function ve(e, t) {
758
- let n = (await e.execCommandWithResponse(`clientinfo clid=${t}`, 5e3))[0];
759
- if (!n) throw Error(`no data returned for client ${t}`);
760
- return n;
761
- }
762
- async function ye(e) {
763
- return (await e.execCommandWithResponse("channellist", 5e3)).map((e) => ({
764
- id: BigInt(e.cid ?? "0"),
765
- parentID: BigInt(e.pid ?? e.cpid ?? "0"),
766
- order: BigInt(e.channel_order ?? "0"),
767
- name: S(e.channel_name ?? ""),
768
- description: ""
769
- }));
770
- }
771
- async function be(e) {
772
- return (await e.execCommandWithResponse("clientlist -uid -away -voice -groups", 5e3)).map((e) => {
773
- let t = e.client_servergroups ?? "";
774
- return {
775
- id: parseInt(e.clid ?? "0", 10),
776
- nickname: S(e.client_nickname ?? ""),
777
- uid: e.client_unique_identifier ?? "",
778
- channelID: BigInt(e.cid ?? "0"),
779
- type: parseInt(e.client_type ?? "0", 10),
780
- serverGroups: t ? t.split(",") : []
781
- };
782
- });
783
- }
784
- async function xe(e, t, n) {
785
- if (n.length === 0) return;
786
- let r = n.join("|"), i = w("ftdeletefile", {
787
- cid: String(t),
788
- cpw: "",
789
- name: r
790
- });
791
- await e.execCommand(i, 1e4);
792
- }
793
- //#endregion
794
- 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 };
795
-
796
- //# sourceMappingURL=index.mjs.map