@honeybbq/teamspeak-client 0.0.0 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (137) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +208 -0
  3. package/dist/api.d.ts +17 -0
  4. package/dist/api.d.ts.map +1 -0
  5. package/dist/client.d.ts +39 -0
  6. package/dist/client.d.ts.map +1 -0
  7. package/dist/command/command.d.ts +12 -0
  8. package/dist/command/command.d.ts.map +1 -0
  9. package/dist/command/command.test.d.ts +2 -0
  10. package/dist/command/command.test.d.ts.map +1 -0
  11. package/dist/command/index.cjs +1 -0
  12. package/dist/command/index.d.ts +4 -0
  13. package/dist/command/index.d.ts.map +1 -0
  14. package/dist/command/index.mjs +3 -0
  15. package/dist/command/parser.d.ts +3 -0
  16. package/dist/command/parser.d.ts.map +1 -0
  17. package/dist/command-Cu2v-5-K.cjs +4 -0
  18. package/dist/command-Cu2v-5-K.cjs.map +1 -0
  19. package/dist/command-caXc4h0n.js +76 -0
  20. package/dist/command-caXc4h0n.js.map +1 -0
  21. package/dist/commands.d.ts +48 -0
  22. package/dist/commands.d.ts.map +1 -0
  23. package/dist/crypt-handshake-CHmvZ2qs.js +55 -0
  24. package/dist/crypt-handshake-CHmvZ2qs.js.map +1 -0
  25. package/dist/crypt-handshake-Dbj2cSBZ.cjs +2 -0
  26. package/dist/crypt-handshake-Dbj2cSBZ.cjs.map +1 -0
  27. package/dist/crypt-init2-BIbQ7TN0.cjs +2 -0
  28. package/dist/crypt-init2-BIbQ7TN0.cjs.map +1 -0
  29. package/dist/crypt-init2-C63eypta.js +165 -0
  30. package/dist/crypt-init2-C63eypta.js.map +1 -0
  31. package/dist/crypto/crypt-ops.d.ts +7 -0
  32. package/dist/crypto/crypt-ops.d.ts.map +1 -0
  33. package/dist/crypto/crypt.d.ts +22 -0
  34. package/dist/crypto/crypt.d.ts.map +1 -0
  35. package/dist/crypto/eax.d.ts +12 -0
  36. package/dist/crypto/eax.d.ts.map +1 -0
  37. package/dist/crypto/eax.test.d.ts +2 -0
  38. package/dist/crypto/eax.test.d.ts.map +1 -0
  39. package/dist/crypto/identity.d.ts +18 -0
  40. package/dist/crypto/identity.d.ts.map +1 -0
  41. package/dist/crypto/identity.test.d.ts +2 -0
  42. package/dist/crypto/identity.test.d.ts.map +1 -0
  43. package/dist/crypto/index.cjs +1 -0
  44. package/dist/crypto/index.d.ts +6 -0
  45. package/dist/crypto/index.d.ts.map +1 -0
  46. package/dist/crypto/index.mjs +3 -0
  47. package/dist/crypto/primitives.d.ts +28 -0
  48. package/dist/crypto/primitives.d.ts.map +1 -0
  49. package/dist/crypto-C3gBJkh2.cjs +2 -0
  50. package/dist/crypto-C3gBJkh2.cjs.map +1 -0
  51. package/dist/crypto-IGJlkTAl.js +165 -0
  52. package/dist/crypto-IGJlkTAl.js.map +1 -0
  53. package/dist/discovery/index.cjs +1 -0
  54. package/dist/discovery/index.d.ts +2 -0
  55. package/dist/discovery/index.d.ts.map +1 -0
  56. package/dist/discovery/index.mjs +2 -0
  57. package/dist/discovery/resolver.d.ts +8 -0
  58. package/dist/discovery/resolver.d.ts.map +1 -0
  59. package/dist/errors.d.ts +34 -0
  60. package/dist/errors.d.ts.map +1 -0
  61. package/dist/events.d.ts +10 -0
  62. package/dist/events.d.ts.map +1 -0
  63. package/dist/handler-C2vxlHYC.js +458 -0
  64. package/dist/handler-C2vxlHYC.js.map +1 -0
  65. package/dist/handler-DQteUMKT.cjs +2 -0
  66. package/dist/handler-DQteUMKT.cjs.map +1 -0
  67. package/dist/handshake/crypt-handshake.d.ts +8 -0
  68. package/dist/handshake/crypt-handshake.d.ts.map +1 -0
  69. package/dist/handshake/crypt-init2.d.ts +7 -0
  70. package/dist/handshake/crypt-init2.d.ts.map +1 -0
  71. package/dist/handshake/index.cjs +1 -0
  72. package/dist/handshake/index.d.ts +4 -0
  73. package/dist/handshake/index.d.ts.map +1 -0
  74. package/dist/handshake/index.mjs +3 -0
  75. package/dist/handshake/license.d.ts +28 -0
  76. package/dist/handshake/license.d.ts.map +1 -0
  77. package/dist/handshake.d.ts +9 -0
  78. package/dist/handshake.d.ts.map +1 -0
  79. package/dist/helpers.d.ts +14 -0
  80. package/dist/helpers.d.ts.map +1 -0
  81. package/dist/helpers.test.d.ts +2 -0
  82. package/dist/helpers.test.d.ts.map +1 -0
  83. package/dist/index.cjs +2 -0
  84. package/dist/index.cjs.map +1 -0
  85. package/dist/index.d.ts +9 -0
  86. package/dist/index.d.ts.map +1 -0
  87. package/dist/index.mjs +761 -0
  88. package/dist/index.mjs.map +1 -0
  89. package/dist/integration.test.d.ts +12 -0
  90. package/dist/integration.test.d.ts.map +1 -0
  91. package/dist/notifications.d.ts +32 -0
  92. package/dist/notifications.d.ts.map +1 -0
  93. package/dist/notifications.test.d.ts +2 -0
  94. package/dist/notifications.test.d.ts.map +1 -0
  95. package/dist/parser-CJjP3LlO.js +33 -0
  96. package/dist/parser-CJjP3LlO.js.map +1 -0
  97. package/dist/parser-DhAWj-TI.cjs +2 -0
  98. package/dist/parser-DhAWj-TI.cjs.map +1 -0
  99. package/dist/primitives-BxtDMP7x.cjs +2 -0
  100. package/dist/primitives-BxtDMP7x.cjs.map +1 -0
  101. package/dist/primitives-CmIK1O7L.js +1836 -0
  102. package/dist/primitives-CmIK1O7L.js.map +1 -0
  103. package/dist/resolver-DDZWomrF.js +165 -0
  104. package/dist/resolver-DDZWomrF.js.map +1 -0
  105. package/dist/resolver-Dey6omBe.cjs +4 -0
  106. package/dist/resolver-Dey6omBe.cjs.map +1 -0
  107. package/dist/throttle.d.ts +11 -0
  108. package/dist/throttle.d.ts.map +1 -0
  109. package/dist/throttle.test.d.ts +2 -0
  110. package/dist/throttle.test.d.ts.map +1 -0
  111. package/dist/transfer.d.ts +34 -0
  112. package/dist/transfer.d.ts.map +1 -0
  113. package/dist/transport/generation-window.d.ts +15 -0
  114. package/dist/transport/generation-window.d.ts.map +1 -0
  115. package/dist/transport/generation-window.test.d.ts +2 -0
  116. package/dist/transport/generation-window.test.d.ts.map +1 -0
  117. package/dist/transport/handler.d.ts +18 -0
  118. package/dist/transport/handler.d.ts.map +1 -0
  119. package/dist/transport/index.cjs +1 -0
  120. package/dist/transport/index.d.ts +6 -0
  121. package/dist/transport/index.d.ts.map +1 -0
  122. package/dist/transport/index.mjs +2 -0
  123. package/dist/transport/packet.d.ts +36 -0
  124. package/dist/transport/packet.d.ts.map +1 -0
  125. package/dist/transport/packet.test.d.ts +2 -0
  126. package/dist/transport/packet.test.d.ts.map +1 -0
  127. package/dist/transport/quicklz.d.ts +5 -0
  128. package/dist/transport/quicklz.d.ts.map +1 -0
  129. package/dist/transport/quicklz.test.d.ts +2 -0
  130. package/dist/transport/quicklz.test.d.ts.map +1 -0
  131. package/dist/types-CGKgXvpG.js +18 -0
  132. package/dist/types-CGKgXvpG.js.map +1 -0
  133. package/dist/types-DrnoCdSW.cjs +2 -0
  134. package/dist/types-DrnoCdSW.cjs.map +1 -0
  135. package/dist/types.d.ts +114 -0
  136. package/dist/types.d.ts.map +1 -0
  137. package/package.json +87 -1
@@ -0,0 +1,165 @@
1
+ import { r as e } from "./types-CGKgXvpG.js";
2
+ import { resolveSrv as t } from "node:dns/promises";
3
+ import { createConnection as n } from "node:net";
4
+ //#region src/discovery/resolver.ts
5
+ var r = 41144, i = "https://named.myteamspeak.com/lookup", a = 600 * 1e3, o = class {
6
+ #e;
7
+ #t = /* @__PURE__ */ new Map();
8
+ constructor(t = e) {
9
+ this.#e = t;
10
+ }
11
+ async resolve(e, t) {
12
+ if (!e) throw Error("empty address");
13
+ let n = this.#n(e);
14
+ if (n) return n;
15
+ let { host: r, port: i } = u(e);
16
+ if (l(r)) return [{
17
+ addr: f(r, i),
18
+ source: "Direct",
19
+ expiry: /* @__PURE__ */ new Date(0)
20
+ }];
21
+ if (!r.includes(".") && r !== "localhost") {
22
+ let e = await s(r, t);
23
+ if (e) return this.resolve(e, t);
24
+ }
25
+ let a = await this.#i(r, t);
26
+ if (a) return this.#r(e, a);
27
+ let o = p(r), c = await this.#a(o, r, t);
28
+ if (c) return this.#r(e, [{
29
+ addr: c,
30
+ source: "TSDNS-SRV",
31
+ expiry: /* @__PURE__ */ new Date(0)
32
+ }]);
33
+ let d = await this.#o(o, r, t);
34
+ if (d) return this.#r(e, [{
35
+ addr: d,
36
+ source: "TSDNS-Direct",
37
+ expiry: /* @__PURE__ */ new Date(0)
38
+ }]);
39
+ let m = [{
40
+ addr: f(r, i),
41
+ source: "Direct",
42
+ expiry: /* @__PURE__ */ new Date(0)
43
+ }];
44
+ return this.#r(e, m);
45
+ }
46
+ #n(e) {
47
+ let t = this.#t.get(e);
48
+ if (!t || t.length === 0) return null;
49
+ let n = t[0];
50
+ return n.expiry.getTime() > 0 && Date.now() > n.expiry.getTime() ? null : t;
51
+ }
52
+ #r(e, t) {
53
+ let n = new Date(Date.now() + a), r = t.map((e) => ({
54
+ ...e,
55
+ expiry: n
56
+ }));
57
+ return this.#t.set(e, r), r;
58
+ }
59
+ async #i(e, n) {
60
+ try {
61
+ let r = await m(t(`_ts3._udp.${e}`), n);
62
+ return !r || r.length === 0 ? null : r.map((e) => ({
63
+ addr: f(e.name.replace(/\.$/, ""), String(e.port)),
64
+ source: "SRV",
65
+ expiry: /* @__PURE__ */ new Date(0)
66
+ }));
67
+ } catch {
68
+ return null;
69
+ }
70
+ }
71
+ async #a(e, n, r) {
72
+ for (let i of e) try {
73
+ let e = await m(t(`_tsdns._tcp.${i}`), r);
74
+ if (!e || e.length === 0) continue;
75
+ for (let t of e) {
76
+ let e = await c(f(t.name.replace(/\.$/, ""), String(t.port)), n, r);
77
+ if (e) return e;
78
+ }
79
+ } catch {
80
+ continue;
81
+ }
82
+ return null;
83
+ }
84
+ async #o(e, t, n) {
85
+ for (let i of e) {
86
+ let e = await c(f(i, String(r)), t, n);
87
+ if (e) return e;
88
+ }
89
+ return null;
90
+ }
91
+ };
92
+ async function s(e, t) {
93
+ try {
94
+ let n = new URL(i);
95
+ n.searchParams.set("name", e);
96
+ let r = t ? { signal: t } : {}, a = await fetch(n.toString(), r);
97
+ return a.ok && (await a.text()).split("\n")[0]?.trim() || null;
98
+ } catch {
99
+ return null;
100
+ }
101
+ }
102
+ function c(e, t, r) {
103
+ let [i, a] = d(e), o = parseInt(a, 10);
104
+ return new Promise((e) => {
105
+ let a = setTimeout(() => {
106
+ s.destroy(), e(null);
107
+ }, 3e3), s = n({
108
+ host: i,
109
+ port: o,
110
+ timeout: 2e3
111
+ }, () => {
112
+ s.write(`${t}\n`);
113
+ }), c = "";
114
+ s.on("data", (t) => {
115
+ c += t.toString();
116
+ let n = c.indexOf("\n");
117
+ if (n >= 0) {
118
+ clearTimeout(a), s.destroy();
119
+ let t = c.slice(0, n).trim();
120
+ e(!t || t === "404" || t === "errors" ? null : t);
121
+ }
122
+ }), s.on("error", () => {
123
+ clearTimeout(a), e(null);
124
+ }), r && r.addEventListener("abort", () => {
125
+ clearTimeout(a), s.destroy(), e(null);
126
+ }, { once: !0 });
127
+ });
128
+ }
129
+ function l(e) {
130
+ return /^\d{1,3}(\.\d{1,3}){3}$/.test(e) || e.startsWith("[");
131
+ }
132
+ function u(e) {
133
+ let t = e.lastIndexOf(":");
134
+ if (t < 0) return {
135
+ host: e,
136
+ port: "9987"
137
+ };
138
+ let n = e.slice(t + 1);
139
+ return /^\d+$/.test(n) ? {
140
+ host: e.slice(0, t),
141
+ port: n
142
+ } : {
143
+ host: e,
144
+ port: "9987"
145
+ };
146
+ }
147
+ function d(e) {
148
+ let { host: t, port: n } = u(e);
149
+ return [t, n];
150
+ }
151
+ function f(e, t) {
152
+ return e.includes(":") ? `[${e}]:${t}` : `${e}:${t}`;
153
+ }
154
+ function p(e) {
155
+ let t = e.split("."), n = [];
156
+ for (let e = 0; e < t.length - 1; e++) n.push(t.slice(e).join("."));
157
+ return n.slice(0, 3);
158
+ }
159
+ function m(e, t) {
160
+ return t ? Promise.race([e, new Promise((e, n) => t.addEventListener("abort", () => n(t.reason), { once: !0 }))]) : e;
161
+ }
162
+ //#endregion
163
+ export { o as t };
164
+
165
+ //# sourceMappingURL=resolver-DDZWomrF.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolver-DDZWomrF.js","names":["#log","#cache","#getValidCache","#resolveSRV","#setCache","#resolveTSDNSSRV","#resolveTSDNSDirect"],"sources":["../src/discovery/resolver.ts"],"sourcesContent":["import { resolveSrv } from \"node:dns/promises\";\nimport { createConnection } from \"node:net\";\nimport type { Logger } from \"../types.js\";\nimport type { ResolvedAddr } from \"../types.js\";\nimport { noopLogger } from \"../types.js\";\n\nconst TS_DNS_DEFAULT_PORT = 41144;\nconst NICKNAME_LOOKUP_URL = \"https://named.myteamspeak.com/lookup\";\nconst CACHE_TTL_MS = 10 * 60 * 1000;\n\nexport class Resolver {\n readonly #log: Logger;\n readonly #cache = new Map<string, ResolvedAddr[]>();\n\n constructor(log: Logger = noopLogger) {\n this.#log = log;\n }\n\n async resolve(inputAddr: string, signal?: AbortSignal): Promise<ResolvedAddr[]> {\n if (!inputAddr) throw new Error(\"empty address\");\n\n const cached = this.#getValidCache(inputAddr);\n if (cached) return cached;\n\n const { host, port } = splitHostPort(inputAddr);\n\n if (isIpAddress(host)) {\n return [{ addr: joinHostPort(host, port), source: \"Direct\", expiry: new Date(0) }];\n }\n\n // Nickname resolution (no dots → not a domain)\n if (!host.includes(\".\") && host !== \"localhost\") {\n const nickAddr = await resolveNickname(host, signal);\n if (nickAddr) {\n return this.resolve(nickAddr, signal);\n }\n }\n\n // SRV _ts3._udp.<host>\n const srvResults = await this.#resolveSRV(host, signal);\n if (srvResults) return this.#setCache(inputAddr, srvResults);\n\n const domainList = getDomainList(host);\n\n // TSDNS via SRV _tsdns._tcp.<domain>\n const tsdnsSrv = await this.#resolveTSDNSSRV(domainList, host, signal);\n if (tsdnsSrv) {\n return this.#setCache(inputAddr, [\n { addr: tsdnsSrv, source: \"TSDNS-SRV\", expiry: new Date(0) },\n ]);\n }\n\n // TSDNS direct :41144\n const tsdnsDirect = await this.#resolveTSDNSDirect(domainList, host, signal);\n if (tsdnsDirect) {\n return this.#setCache(inputAddr, [\n { addr: tsdnsDirect, source: \"TSDNS-Direct\", expiry: new Date(0) },\n ]);\n }\n\n // Plain DNS fallback\n const fallback: ResolvedAddr[] = [\n { addr: joinHostPort(host, port), source: \"Direct\", expiry: new Date(0) },\n ];\n return this.#setCache(inputAddr, fallback);\n }\n\n #getValidCache(inputAddr: string): ResolvedAddr[] | null {\n const cached = this.#cache.get(inputAddr);\n if (!cached || cached.length === 0) return null;\n const first = cached[0]!;\n if (first.expiry.getTime() > 0 && Date.now() > first.expiry.getTime()) return null;\n return cached;\n }\n\n #setCache(key: string, results: ResolvedAddr[]): ResolvedAddr[] {\n const expiry = new Date(Date.now() + CACHE_TTL_MS);\n const withExpiry = results.map((r) => ({ ...r, expiry }));\n this.#cache.set(key, withExpiry);\n return withExpiry;\n }\n\n async #resolveSRV(host: string, signal?: AbortSignal): Promise<ResolvedAddr[] | null> {\n try {\n const srvs = await withSignal(resolveSrv(`_ts3._udp.${host}`), signal);\n if (!srvs || srvs.length === 0) return null;\n return srvs.map((srv) => ({\n addr: joinHostPort(srv.name.replace(/\\.$/, \"\"), String(srv.port)),\n source: \"SRV\",\n expiry: new Date(0),\n }));\n } catch {\n return null;\n }\n }\n\n async #resolveTSDNSSRV(\n domains: string[],\n queryHost: string,\n signal?: AbortSignal,\n ): Promise<string | null> {\n for (const domain of domains) {\n try {\n const srvs = await withSignal(resolveSrv(`_tsdns._tcp.${domain}`), signal);\n if (!srvs || srvs.length === 0) continue;\n for (const srv of srvs) {\n const tsdnsAddr = joinHostPort(srv.name.replace(/\\.$/, \"\"), String(srv.port));\n const result = await queryTSDNS(tsdnsAddr, queryHost, signal);\n if (result) return result;\n }\n } catch {\n continue;\n }\n }\n return null;\n }\n\n async #resolveTSDNSDirect(\n domains: string[],\n queryHost: string,\n signal?: AbortSignal,\n ): Promise<string | null> {\n for (const domain of domains) {\n const tsdnsAddr = joinHostPort(domain, String(TS_DNS_DEFAULT_PORT));\n const result = await queryTSDNS(tsdnsAddr, queryHost, signal);\n if (result) return result;\n }\n return null;\n }\n}\n\n// ---- Helpers ----------------------------------------------------------------\n\nasync function resolveNickname(nickname: string, signal?: AbortSignal): Promise<string | null> {\n try {\n const url = new URL(NICKNAME_LOOKUP_URL);\n url.searchParams.set(\"name\", nickname);\n const init: RequestInit = signal ? { signal } : {};\n const resp = await fetch(url.toString(), init);\n if (!resp.ok) return null;\n const text = await resp.text();\n const line = text.split(\"\\n\")[0]?.trim();\n return line || null;\n } catch {\n return null;\n }\n}\n\nfunction queryTSDNS(\n tsdnsAddr: string,\n queryHost: string,\n signal?: AbortSignal,\n): Promise<string | null> {\n const [host, portStr] = splitHostPortParts(tsdnsAddr);\n const port = parseInt(portStr, 10);\n\n return new Promise((resolve) => {\n const timeout = setTimeout(() => {\n socket.destroy();\n resolve(null);\n }, 3_000);\n\n const socket = createConnection({ host, port, timeout: 2_000 }, () => {\n socket.write(`${queryHost}\\n`);\n });\n\n let buf = \"\";\n socket.on(\"data\", (chunk: Buffer) => {\n buf += chunk.toString();\n const idx = buf.indexOf(\"\\n\");\n if (idx >= 0) {\n clearTimeout(timeout);\n socket.destroy();\n const line = buf.slice(0, idx).trim();\n if (!line || line === \"404\" || line === \"errors\") resolve(null);\n else resolve(line);\n }\n });\n\n socket.on(\"error\", () => {\n clearTimeout(timeout);\n resolve(null);\n });\n\n if (signal) {\n signal.addEventListener(\n \"abort\",\n () => {\n clearTimeout(timeout);\n socket.destroy();\n resolve(null);\n },\n { once: true },\n );\n }\n });\n}\n\nfunction isIpAddress(host: string): boolean {\n // Simple IPv4 check; IPv6 would be inside brackets\n return /^\\d{1,3}(\\.\\d{1,3}){3}$/.test(host) || host.startsWith(\"[\");\n}\n\nfunction splitHostPort(addr: string): { host: string; port: string } {\n const lastColon = addr.lastIndexOf(\":\");\n if (lastColon < 0) return { host: addr, port: \"9987\" };\n const afterColon = addr.slice(lastColon + 1);\n if (/^\\d+$/.test(afterColon)) {\n return { host: addr.slice(0, lastColon), port: afterColon };\n }\n return { host: addr, port: \"9987\" };\n}\n\nfunction splitHostPortParts(addr: string): [string, string] {\n const { host, port } = splitHostPort(addr);\n return [host, port];\n}\n\nfunction joinHostPort(host: string, port: string): string {\n if (host.includes(\":\")) return `[${host}]:${port}`;\n return `${host}:${port}`;\n}\n\nfunction getDomainList(host: string): string[] {\n const parts = host.split(\".\");\n const list: string[] = [];\n for (let i = 0; i < parts.length - 1; i++) {\n list.push(parts.slice(i).join(\".\"));\n }\n return list.slice(0, 3);\n}\n\nfunction withSignal<T>(promise: Promise<T>, signal?: AbortSignal): Promise<T> {\n if (!signal) return promise;\n return Promise.race([\n promise,\n new Promise<T>((_, reject) =>\n signal.addEventListener(\"abort\", () => reject(signal.reason), { once: true }),\n ),\n ]);\n}\n"],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ const e=require(`./types-DrnoCdSW.cjs`);let t=require(`node:dns/promises`),n=require(`node:net`);var r=41144,i=`https://named.myteamspeak.com/lookup`,a=600*1e3,o=class{#e;#t=new Map;constructor(t=e.r){this.#e=t}async resolve(e,t){if(!e)throw Error(`empty address`);let n=this.#n(e);if(n)return n;let{host:r,port:i}=u(e);if(l(r))return[{addr:f(r,i),source:`Direct`,expiry:new Date(0)}];if(!r.includes(`.`)&&r!==`localhost`){let e=await s(r,t);if(e)return this.resolve(e,t)}let a=await this.#i(r,t);if(a)return this.#r(e,a);let o=p(r),c=await this.#a(o,r,t);if(c)return this.#r(e,[{addr:c,source:`TSDNS-SRV`,expiry:new Date(0)}]);let d=await this.#o(o,r,t);if(d)return this.#r(e,[{addr:d,source:`TSDNS-Direct`,expiry:new Date(0)}]);let m=[{addr:f(r,i),source:`Direct`,expiry:new Date(0)}];return this.#r(e,m)}#n(e){let t=this.#t.get(e);if(!t||t.length===0)return null;let n=t[0];return n.expiry.getTime()>0&&Date.now()>n.expiry.getTime()?null:t}#r(e,t){let n=new Date(Date.now()+a),r=t.map(e=>({...e,expiry:n}));return this.#t.set(e,r),r}async#i(e,n){try{let r=await m((0,t.resolveSrv)(`_ts3._udp.${e}`),n);return!r||r.length===0?null:r.map(e=>({addr:f(e.name.replace(/\.$/,``),String(e.port)),source:`SRV`,expiry:new Date(0)}))}catch{return null}}async#a(e,n,r){for(let i of e)try{let e=await m((0,t.resolveSrv)(`_tsdns._tcp.${i}`),r);if(!e||e.length===0)continue;for(let t of e){let e=await c(f(t.name.replace(/\.$/,``),String(t.port)),n,r);if(e)return e}}catch{continue}return null}async#o(e,t,n){for(let i of e){let e=await c(f(i,String(r)),t,n);if(e)return e}return null}};async function s(e,t){try{let n=new URL(i);n.searchParams.set(`name`,e);let r=t?{signal:t}:{},a=await fetch(n.toString(),r);return a.ok&&(await a.text()).split(`
2
+ `)[0]?.trim()||null}catch{return null}}function c(e,t,r){let[i,a]=d(e),o=parseInt(a,10);return new Promise(e=>{let a=setTimeout(()=>{s.destroy(),e(null)},3e3),s=(0,n.createConnection)({host:i,port:o,timeout:2e3},()=>{s.write(`${t}\n`)}),c=``;s.on(`data`,t=>{c+=t.toString();let n=c.indexOf(`
3
+ `);if(n>=0){clearTimeout(a),s.destroy();let t=c.slice(0,n).trim();e(!t||t===`404`||t===`errors`?null:t)}}),s.on(`error`,()=>{clearTimeout(a),e(null)}),r&&r.addEventListener(`abort`,()=>{clearTimeout(a),s.destroy(),e(null)},{once:!0})})}function l(e){return/^\d{1,3}(\.\d{1,3}){3}$/.test(e)||e.startsWith(`[`)}function u(e){let t=e.lastIndexOf(`:`);if(t<0)return{host:e,port:`9987`};let n=e.slice(t+1);return/^\d+$/.test(n)?{host:e.slice(0,t),port:n}:{host:e,port:`9987`}}function d(e){let{host:t,port:n}=u(e);return[t,n]}function f(e,t){return e.includes(`:`)?`[${e}]:${t}`:`${e}:${t}`}function p(e){let t=e.split(`.`),n=[];for(let e=0;e<t.length-1;e++)n.push(t.slice(e).join(`.`));return n.slice(0,3)}function m(e,t){return t?Promise.race([e,new Promise((e,n)=>t.addEventListener(`abort`,()=>n(t.reason),{once:!0}))]):e}Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return o}});
4
+ //# sourceMappingURL=resolver-Dey6omBe.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolver-Dey6omBe.cjs","names":["#log","#cache","#getValidCache","#resolveSRV","#setCache","#resolveTSDNSSRV","#resolveTSDNSDirect"],"sources":["../src/discovery/resolver.ts"],"sourcesContent":["import { resolveSrv } from \"node:dns/promises\";\nimport { createConnection } from \"node:net\";\nimport type { Logger } from \"../types.js\";\nimport type { ResolvedAddr } from \"../types.js\";\nimport { noopLogger } from \"../types.js\";\n\nconst TS_DNS_DEFAULT_PORT = 41144;\nconst NICKNAME_LOOKUP_URL = \"https://named.myteamspeak.com/lookup\";\nconst CACHE_TTL_MS = 10 * 60 * 1000;\n\nexport class Resolver {\n readonly #log: Logger;\n readonly #cache = new Map<string, ResolvedAddr[]>();\n\n constructor(log: Logger = noopLogger) {\n this.#log = log;\n }\n\n async resolve(inputAddr: string, signal?: AbortSignal): Promise<ResolvedAddr[]> {\n if (!inputAddr) throw new Error(\"empty address\");\n\n const cached = this.#getValidCache(inputAddr);\n if (cached) return cached;\n\n const { host, port } = splitHostPort(inputAddr);\n\n if (isIpAddress(host)) {\n return [{ addr: joinHostPort(host, port), source: \"Direct\", expiry: new Date(0) }];\n }\n\n // Nickname resolution (no dots → not a domain)\n if (!host.includes(\".\") && host !== \"localhost\") {\n const nickAddr = await resolveNickname(host, signal);\n if (nickAddr) {\n return this.resolve(nickAddr, signal);\n }\n }\n\n // SRV _ts3._udp.<host>\n const srvResults = await this.#resolveSRV(host, signal);\n if (srvResults) return this.#setCache(inputAddr, srvResults);\n\n const domainList = getDomainList(host);\n\n // TSDNS via SRV _tsdns._tcp.<domain>\n const tsdnsSrv = await this.#resolveTSDNSSRV(domainList, host, signal);\n if (tsdnsSrv) {\n return this.#setCache(inputAddr, [\n { addr: tsdnsSrv, source: \"TSDNS-SRV\", expiry: new Date(0) },\n ]);\n }\n\n // TSDNS direct :41144\n const tsdnsDirect = await this.#resolveTSDNSDirect(domainList, host, signal);\n if (tsdnsDirect) {\n return this.#setCache(inputAddr, [\n { addr: tsdnsDirect, source: \"TSDNS-Direct\", expiry: new Date(0) },\n ]);\n }\n\n // Plain DNS fallback\n const fallback: ResolvedAddr[] = [\n { addr: joinHostPort(host, port), source: \"Direct\", expiry: new Date(0) },\n ];\n return this.#setCache(inputAddr, fallback);\n }\n\n #getValidCache(inputAddr: string): ResolvedAddr[] | null {\n const cached = this.#cache.get(inputAddr);\n if (!cached || cached.length === 0) return null;\n const first = cached[0]!;\n if (first.expiry.getTime() > 0 && Date.now() > first.expiry.getTime()) return null;\n return cached;\n }\n\n #setCache(key: string, results: ResolvedAddr[]): ResolvedAddr[] {\n const expiry = new Date(Date.now() + CACHE_TTL_MS);\n const withExpiry = results.map((r) => ({ ...r, expiry }));\n this.#cache.set(key, withExpiry);\n return withExpiry;\n }\n\n async #resolveSRV(host: string, signal?: AbortSignal): Promise<ResolvedAddr[] | null> {\n try {\n const srvs = await withSignal(resolveSrv(`_ts3._udp.${host}`), signal);\n if (!srvs || srvs.length === 0) return null;\n return srvs.map((srv) => ({\n addr: joinHostPort(srv.name.replace(/\\.$/, \"\"), String(srv.port)),\n source: \"SRV\",\n expiry: new Date(0),\n }));\n } catch {\n return null;\n }\n }\n\n async #resolveTSDNSSRV(\n domains: string[],\n queryHost: string,\n signal?: AbortSignal,\n ): Promise<string | null> {\n for (const domain of domains) {\n try {\n const srvs = await withSignal(resolveSrv(`_tsdns._tcp.${domain}`), signal);\n if (!srvs || srvs.length === 0) continue;\n for (const srv of srvs) {\n const tsdnsAddr = joinHostPort(srv.name.replace(/\\.$/, \"\"), String(srv.port));\n const result = await queryTSDNS(tsdnsAddr, queryHost, signal);\n if (result) return result;\n }\n } catch {\n continue;\n }\n }\n return null;\n }\n\n async #resolveTSDNSDirect(\n domains: string[],\n queryHost: string,\n signal?: AbortSignal,\n ): Promise<string | null> {\n for (const domain of domains) {\n const tsdnsAddr = joinHostPort(domain, String(TS_DNS_DEFAULT_PORT));\n const result = await queryTSDNS(tsdnsAddr, queryHost, signal);\n if (result) return result;\n }\n return null;\n }\n}\n\n// ---- Helpers ----------------------------------------------------------------\n\nasync function resolveNickname(nickname: string, signal?: AbortSignal): Promise<string | null> {\n try {\n const url = new URL(NICKNAME_LOOKUP_URL);\n url.searchParams.set(\"name\", nickname);\n const init: RequestInit = signal ? { signal } : {};\n const resp = await fetch(url.toString(), init);\n if (!resp.ok) return null;\n const text = await resp.text();\n const line = text.split(\"\\n\")[0]?.trim();\n return line || null;\n } catch {\n return null;\n }\n}\n\nfunction queryTSDNS(\n tsdnsAddr: string,\n queryHost: string,\n signal?: AbortSignal,\n): Promise<string | null> {\n const [host, portStr] = splitHostPortParts(tsdnsAddr);\n const port = parseInt(portStr, 10);\n\n return new Promise((resolve) => {\n const timeout = setTimeout(() => {\n socket.destroy();\n resolve(null);\n }, 3_000);\n\n const socket = createConnection({ host, port, timeout: 2_000 }, () => {\n socket.write(`${queryHost}\\n`);\n });\n\n let buf = \"\";\n socket.on(\"data\", (chunk: Buffer) => {\n buf += chunk.toString();\n const idx = buf.indexOf(\"\\n\");\n if (idx >= 0) {\n clearTimeout(timeout);\n socket.destroy();\n const line = buf.slice(0, idx).trim();\n if (!line || line === \"404\" || line === \"errors\") resolve(null);\n else resolve(line);\n }\n });\n\n socket.on(\"error\", () => {\n clearTimeout(timeout);\n resolve(null);\n });\n\n if (signal) {\n signal.addEventListener(\n \"abort\",\n () => {\n clearTimeout(timeout);\n socket.destroy();\n resolve(null);\n },\n { once: true },\n );\n }\n });\n}\n\nfunction isIpAddress(host: string): boolean {\n // Simple IPv4 check; IPv6 would be inside brackets\n return /^\\d{1,3}(\\.\\d{1,3}){3}$/.test(host) || host.startsWith(\"[\");\n}\n\nfunction splitHostPort(addr: string): { host: string; port: string } {\n const lastColon = addr.lastIndexOf(\":\");\n if (lastColon < 0) return { host: addr, port: \"9987\" };\n const afterColon = addr.slice(lastColon + 1);\n if (/^\\d+$/.test(afterColon)) {\n return { host: addr.slice(0, lastColon), port: afterColon };\n }\n return { host: addr, port: \"9987\" };\n}\n\nfunction splitHostPortParts(addr: string): [string, string] {\n const { host, port } = splitHostPort(addr);\n return [host, port];\n}\n\nfunction joinHostPort(host: string, port: string): string {\n if (host.includes(\":\")) return `[${host}]:${port}`;\n return `${host}:${port}`;\n}\n\nfunction getDomainList(host: string): string[] {\n const parts = host.split(\".\");\n const list: string[] = [];\n for (let i = 0; i < parts.length - 1; i++) {\n list.push(parts.slice(i).join(\".\"));\n }\n return list.slice(0, 3);\n}\n\nfunction withSignal<T>(promise: Promise<T>, signal?: AbortSignal): Promise<T> {\n if (!signal) return promise;\n return Promise.race([\n promise,\n new Promise<T>((_, reject) =>\n signal.addEventListener(\"abort\", () => reject(signal.reason), { once: true }),\n ),\n ]);\n}\n"],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Token-bucket limiter for outbound TS3 commands.
3
+ * Mirrors Go's commandThrottle.
4
+ */
5
+ export declare class CommandThrottle {
6
+ #private;
7
+ static readonly TOKEN_RATE = 4;
8
+ static readonly TOKEN_MAX = 8;
9
+ wait(signal?: AbortSignal): Promise<void>;
10
+ }
11
+ //# sourceMappingURL=throttle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"throttle.d.ts","sourceRoot":"","sources":["../src/throttle.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,qBAAa,eAAe;;IAC1B,MAAM,CAAC,QAAQ,CAAC,UAAU,KAAO;IACjC,MAAM,CAAC,QAAQ,CAAC,SAAS,KAAO;IAK1B,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;CAkChD"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=throttle.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"throttle.test.d.ts","sourceRoot":"","sources":["../src/throttle.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,34 @@
1
+ import type { Readable, Writable } from "node:stream";
2
+ import type { FileUploadInfo, FileDownloadInfo } from "./types.js";
3
+ import { FileTransferError, FileTransferTimeoutError } from "./errors.js";
4
+ export interface FileTransferTracker {
5
+ register(): [
6
+ cftid: number,
7
+ promise: Promise<FileUploadInfo | FileDownloadInfo | import("./types.js").FileTransferStatusInfo>
8
+ ];
9
+ unregister(cftid: number): void;
10
+ notify(cftid: number, value: FileUploadInfo | FileDownloadInfo | import("./types.js").FileTransferStatusInfo): void;
11
+ reset(): void;
12
+ }
13
+ export declare class FileTransferTracker {
14
+ #private;
15
+ }
16
+ /**
17
+ * Open a TCP connection to the TS3 file transfer port and perform the
18
+ * ftkey handshake. The caller is responsible for closing the socket.
19
+ */
20
+ export declare function dialFileTransfer(host: string, port: number, key: string): Promise<import("node:net").Socket>;
21
+ /** Upload data via a TS3 file transfer connection. */
22
+ export declare function uploadFileData(host: string, info: FileUploadInfo, data: Readable): Promise<void>;
23
+ /** Download data via a TS3 file transfer connection. */
24
+ export declare function downloadFileData(host: string, info: FileDownloadInfo, dest: Writable): Promise<void>;
25
+ /**
26
+ * Build a ftinitupload command string.
27
+ */
28
+ export declare function buildFtInitUpload(channelID: bigint, path: string, password: string, size: bigint, cftid: number, overwrite: boolean): string;
29
+ /**
30
+ * Build a ftinitdownload command string.
31
+ */
32
+ export declare function buildFtInitDownload(channelID: bigint, path: string, password: string, cftid: number): string;
33
+ export { FileTransferError, FileTransferTimeoutError };
34
+ //# sourceMappingURL=transfer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transfer.d.ts","sourceRoot":"","sources":["../src/transfer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAG1E,MAAM,WAAW,mBAAmB;IAClC,QAAQ,IAAI;QACV,KAAK,EAAE,MAAM;QACb,OAAO,EAAE,OAAO,CACd,cAAc,GAAG,gBAAgB,GAAG,OAAO,YAAY,EAAE,sBAAsB,CAChF;KACF,CAAC;IACF,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,MAAM,CACJ,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,cAAc,GAAG,gBAAgB,GAAG,OAAO,YAAY,EAAE,sBAAsB,GACrF,IAAI,CAAC;IACR,KAAK,IAAI,IAAI,CAAC;CACf;AAOD,qBAAa,mBAAmB;;CA2B/B;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,OAAO,UAAU,EAAE,MAAM,CAAC,CAmBpC;AAED,sDAAsD;AACtD,wBAAsB,cAAc,CAClC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,cAAc,EACpB,IAAI,EAAE,QAAQ,GACb,OAAO,CAAC,IAAI,CAAC,CAOf;AAED,wDAAwD;AACxD,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,gBAAgB,EACtB,IAAI,EAAE,QAAQ,GACb,OAAO,CAAC,IAAI,CAAC,CAQf;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,OAAO,GACjB,MAAM,CAWR;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,GACZ,MAAM,CASR;AAED,OAAO,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,CAAC"}
@@ -0,0 +1,15 @@
1
+ export declare class GenerationWindow {
2
+ #private;
3
+ constructor(mod: number, windowSize: number);
4
+ get generation(): number;
5
+ advance(amount: number): void;
6
+ advanceToExcluded(mappedValue: number): void;
7
+ syncTo(mappedValue: number): void;
8
+ isInWindow(mappedValue: number): boolean;
9
+ mappedToIndex(mappedValue: number): number;
10
+ isOldPacket(mappedValue: number): boolean;
11
+ isFuturePacket(mappedValue: number): boolean;
12
+ getGeneration(mappedValue: number): number;
13
+ reset(): void;
14
+ }
15
+ //# sourceMappingURL=generation-window.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generation-window.d.ts","sourceRoot":"","sources":["../../src/transport/generation-window.ts"],"names":[],"mappings":"AAAA,qBAAa,gBAAgB;;gBAMf,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM;IAK3C,IAAI,UAAU,IAAI,MAAM,CAEvB;IAED,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAU7B,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAM5C,MAAM,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAMjC,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO;IAQxC,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM;IAO1C,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO;IAIzC,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO;IAW5C,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM;IAK1C,KAAK,IAAI,IAAI;CAId"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=generation-window.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generation-window.test.d.ts","sourceRoot":"","sources":["../../src/transport/generation-window.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,18 @@
1
+ import { type Socket as UdpSocket } from "node:dgram";
2
+ import type { Crypt } from "../crypto/crypt.js";
3
+ import type { Logger } from "../types.js";
4
+ import { type Packet, PacketType } from "./packet.js";
5
+ export declare class PacketHandler {
6
+ #private;
7
+ onPacket: ((p: Packet) => void) | null;
8
+ onClosed: ((err: Error | null) => void) | null;
9
+ constructor(crypt: Crypt, logger?: Logger);
10
+ setClientID(id: number): void;
11
+ connect(addr: string): Promise<void>;
12
+ start(conn: UdpSocket): void;
13
+ receivedFinalInitAck(): void;
14
+ sendPacket(pType: PacketType, data: Uint8Array, flags: number): void;
15
+ sendVoicePacket(data: Uint8Array, codec: number): void;
16
+ close(): void;
17
+ }
18
+ //# sourceMappingURL=handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../src/transport/handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,MAAM,IAAI,SAAS,EAAE,MAAM,YAAY,CAAC;AACpE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C,OAAO,EACL,KAAK,MAAM,EACX,UAAU,EAMX,MAAM,aAAa,CAAC;AAyBrB,qBAAa,aAAa;;IACxB,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,IAAI,CAAQ;IAC9C,QAAQ,EAAE,CAAC,CAAC,GAAG,EAAE,KAAK,GAAG,IAAI,KAAK,IAAI,CAAC,GAAG,IAAI,CAAQ;gBAyB1C,KAAK,EAAE,KAAK,EAAE,MAAM,GAAE,MAAmB;IAKrD,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAI7B,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAkBpC,KAAK,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI;IAkC5B,oBAAoB,IAAI,IAAI;IAI5B,UAAU,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IASpE,eAAe,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IA+BtD,KAAK,IAAI,IAAI;CAscd"}
@@ -0,0 +1 @@
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`../handler-DQteUMKT.cjs`);exports.GenerationWindow=e.r,exports.PacketFlags=e.i,exports.PacketHandler=e.t,exports.PacketType=e.a,exports.Qlz=e.n,exports.buildC2SHeader=e.o,exports.isUnencrypted=e.s,exports.packetFlags=e.c,exports.packetType=e.l,exports.parseC2SHeader=e.u,exports.parseS2CHeader=e.d;
@@ -0,0 +1,6 @@
1
+ export { PacketHandler } from "./handler.js";
2
+ export { PacketType, PacketFlags, packetType, packetFlags, isUnencrypted, buildC2SHeader, parseS2CHeader, parseC2SHeader, } from "./packet.js";
3
+ export type { Packet } from "./packet.js";
4
+ export { GenerationWindow } from "./generation-window.js";
5
+ export { Qlz } from "./quicklz.js";
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/transport/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EACL,UAAU,EACV,WAAW,EACX,UAAU,EACV,WAAW,EACX,aAAa,EACb,cAAc,EACd,cAAc,EACd,cAAc,GACf,MAAM,aAAa,CAAC;AACrB,YAAY,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { a as e, c as t, d as n, i as r, l as i, n as a, o, r as s, s as c, t as l, u } from "../handler-C2vxlHYC.js";
2
+ export { s as GenerationWindow, r as PacketFlags, l as PacketHandler, e as PacketType, a as Qlz, o as buildC2SHeader, c as isUnencrypted, t as packetFlags, i as packetType, u as parseC2SHeader, n as parseS2CHeader };
@@ -0,0 +1,36 @@
1
+ export declare const enum PacketType {
2
+ Voice = 0,
3
+ VoiceWhisper = 1,
4
+ Command = 2,
5
+ CommandLow = 3,
6
+ Ping = 4,
7
+ Pong = 5,
8
+ Ack = 6,
9
+ AckLow = 7,
10
+ Init1 = 8
11
+ }
12
+ export declare const enum PacketFlags {
13
+ Fragmented = 16,
14
+ NewProtocol = 32,
15
+ Compressed = 64,
16
+ Unencrypted = 128
17
+ }
18
+ export interface Packet {
19
+ /** Type byte combined with flags (low nibble = type, high nibble = flags). */
20
+ typeFlagged: number;
21
+ id: number;
22
+ clientID: number;
23
+ generationID: number;
24
+ data: Uint8Array;
25
+ receivedAt: number;
26
+ }
27
+ export declare function packetType(p: Packet): PacketType;
28
+ export declare function packetFlags(p: Packet): number;
29
+ export declare function isUnencrypted(p: Packet): boolean;
30
+ /** Build the 5-byte client-to-server header: [packetID(2), clientID(2), typeFlagged(1)]. */
31
+ export declare function buildC2SHeader(p: Packet): Uint8Array;
32
+ /** Parse a 3-byte server-to-client header. */
33
+ export declare function parseS2CHeader(raw: Uint8Array): Pick<Packet, "id" | "typeFlagged">;
34
+ /** Parse a 5-byte client-to-server header. */
35
+ export declare function parseC2SHeader(raw: Uint8Array): Pick<Packet, "id" | "clientID" | "typeFlagged">;
36
+ //# sourceMappingURL=packet.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"packet.d.ts","sourceRoot":"","sources":["../../src/transport/packet.ts"],"names":[],"mappings":"AAAA,0BAAkB,UAAU;IAC1B,KAAK,IAAI;IACT,YAAY,IAAI;IAChB,OAAO,IAAI;IACX,UAAU,IAAI;IACd,IAAI,IAAI;IACR,IAAI,IAAI;IACR,GAAG,IAAI;IACP,MAAM,IAAI;IACV,KAAK,IAAI;CACV;AAED,0BAAkB,WAAW;IAC3B,UAAU,KAAO;IACjB,WAAW,KAAO;IAClB,UAAU,KAAO;IACjB,WAAW,MAAO;CACnB;AAED,MAAM,WAAW,MAAM;IACrB,8EAA8E;IAC9E,WAAW,EAAE,MAAM,CAAC;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,UAAU,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,UAAU,CAAC,CAAC,EAAE,MAAM,GAAG,UAAU,CAEhD;AAED,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAE7C;AAED,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAEhD;AAED,4FAA4F;AAC5F,wBAAgB,cAAc,CAAC,CAAC,EAAE,MAAM,GAAG,UAAU,CAOpD;AAED,8CAA8C;AAC9C,wBAAgB,cAAc,CAAC,GAAG,EAAE,UAAU,GAAG,IAAI,CAAC,MAAM,EAAE,IAAI,GAAG,aAAa,CAAC,CAMlF;AAED,8CAA8C;AAC9C,wBAAgB,cAAc,CAAC,GAAG,EAAE,UAAU,GAAG,IAAI,CAAC,MAAM,EAAE,IAAI,GAAG,UAAU,GAAG,aAAa,CAAC,CAO/F"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=packet.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"packet.test.d.ts","sourceRoot":"","sources":["../../src/transport/packet.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,5 @@
1
+ export declare class Qlz {
2
+ #private;
3
+ decompress(data: Uint8Array): Uint8Array;
4
+ }
5
+ //# sourceMappingURL=quicklz.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quicklz.d.ts","sourceRoot":"","sources":["../../src/transport/quicklz.ts"],"names":[],"mappings":"AASA,qBAAa,GAAG;;IAGd,UAAU,CAAC,IAAI,EAAE,UAAU,GAAG,UAAU;CA+HzC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=quicklz.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quicklz.test.d.ts","sourceRoot":"","sources":["../../src/transport/quicklz.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,18 @@
1
+ //#region src/types.ts
2
+ var e = /* @__PURE__ */ function(e) {
3
+ return e[e.Disconnected = 0] = "Disconnected", e[e.Connecting = 1] = "Connecting", e[e.Connected = 2] = "Connected", e;
4
+ }({}), t = {
5
+ debug() {},
6
+ info() {},
7
+ warn() {},
8
+ error() {}
9
+ }, n = {
10
+ debug: console.debug.bind(console),
11
+ info: console.info.bind(console),
12
+ warn: console.warn.bind(console),
13
+ error: console.error.bind(console)
14
+ };
15
+ //#endregion
16
+ export { n, t as r, e as t };
17
+
18
+ //# sourceMappingURL=types-CGKgXvpG.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types-CGKgXvpG.js","names":[],"sources":["../src/types.ts"],"sourcesContent":["// ---- Branded primitive types ------------------------------------------------\n\n/** A TS3-escaped string. Obtained only via escape(). */\nexport type EscapedString = string & { readonly __escaped: unique symbol };\n\n// ---- Event map --------------------------------------------------------------\n\nexport interface TextMessage {\n invokerName: string;\n invokerUID: string;\n message: string;\n invokerGroups: string[];\n targetMode: number;\n targetID: bigint;\n invokerID: number;\n}\n\nexport interface ClientMovedEvent {\n invokerName: string;\n invokerUID: string;\n targetChannelID: bigint;\n reasonID: number;\n id: number;\n invokerID: number;\n}\n\nexport interface ClientLeftViewEvent {\n reasonMsg: string;\n reasonID: number;\n id: number;\n targetID: number;\n}\n\nexport interface ClientInfo {\n nickname: string;\n uid: string;\n serverGroups: string[];\n channelID: bigint;\n type: number;\n id: number;\n}\n\nexport interface ChannelInfo {\n name: string;\n description: string;\n id: bigint;\n parentID: bigint;\n}\n\nexport interface FileUploadInfo {\n fileTransferKey: string;\n seekPosition: bigint;\n clientFileTransferID: number;\n serverFileTransferID: number;\n port: number;\n}\n\nexport interface FileDownloadInfo {\n fileTransferKey: string;\n size: bigint;\n clientFileTransferID: number;\n serverFileTransferID: number;\n port: number;\n}\n\nexport interface FileTransferStatusInfo {\n message: string;\n status: number;\n clientFileTransferID: number;\n}\n\nexport interface PokeEvent {\n invokerName: string;\n invokerUID: string;\n invokerID: number;\n message: string;\n}\n\nexport interface VoiceData {\n clientId: number;\n codec: number;\n data: Uint8Array;\n}\n\n// ---- Typed event map used by Client.on() ------------------------------------\n\nexport interface EventMap {\n textMessage: TextMessage;\n clientEnter: ClientInfo;\n clientLeave: ClientLeftViewEvent;\n clientMoved: ClientMovedEvent;\n poked: PokeEvent;\n voiceData: VoiceData;\n connected: void;\n disconnected: Error | undefined;\n kicked: string;\n}\n\n// ---- Client status ----------------------------------------------------------\n\nexport const enum ClientStatus {\n Disconnected = 0,\n Connecting = 1,\n Connected = 2,\n}\n\n// ---- Middleware types --------------------------------------------------------\n\nexport type CommandMiddleware = (\n next: (cmd: string) => Promise<void>,\n) => (cmd: string) => Promise<void>;\n\nexport type EventMiddleware = (\n next: (evt: EventMap[keyof EventMap]) => void,\n) => (evt: EventMap[keyof EventMap]) => void;\n\n// ---- Logger interface --------------------------------------------------------\n\nexport interface Logger {\n debug(msg: string, ...args: unknown[]): void;\n info(msg: string, ...args: unknown[]): void;\n warn(msg: string, ...args: unknown[]): void;\n error(msg: string, ...args: unknown[]): void;\n}\n\n/** A no-op logger that discards all messages. */\nexport const noopLogger: Logger = {\n debug() {},\n info() {},\n warn() {},\n error() {},\n};\n\n/** A console-backed logger. */\nexport const consoleLogger: Logger = {\n debug: console.debug.bind(console),\n info: console.info.bind(console),\n warn: console.warn.bind(console),\n error: console.error.bind(console),\n};\n\n// ---- Resolved address (from discovery) --------------------------------------\n\nexport interface ResolvedAddr {\n addr: string;\n source: string;\n expiry: Date;\n}\n\n// ---- AddrResolver interface -------------------------------------------------\n\nexport interface AddrResolver {\n resolve(addr: string, signal?: AbortSignal): Promise<ResolvedAddr[]>;\n}\n\n// ---- ClientOptions ----------------------------------------------------------\n\nexport interface ClientOptions {\n logger?: Logger;\n resolver?: AddrResolver;\n commandMiddleware?: CommandMiddleware[];\n eventMiddleware?: EventMiddleware[];\n}\n"],"mappings":";AAoGA,IAAkB,IAAX,yBAAA,GAAA;QACL,EAAA,EAAA,eAAA,KAAA,gBACA,EAAA,EAAA,aAAA,KAAA,cACA,EAAA,EAAA,YAAA,KAAA;KACD,EAsBY,IAAqB;CAChC,QAAQ;CACR,OAAO;CACP,OAAO;CACP,QAAQ;CACT,EAGY,IAAwB;CACnC,OAAO,QAAQ,MAAM,KAAK,QAAQ;CAClC,MAAM,QAAQ,KAAK,KAAK,QAAQ;CAChC,MAAM,QAAQ,KAAK,KAAK,QAAQ;CAChC,OAAO,QAAQ,MAAM,KAAK,QAAQ;CACnC"}
@@ -0,0 +1,2 @@
1
+ var e=function(e){return e[e.Disconnected=0]=`Disconnected`,e[e.Connecting=1]=`Connecting`,e[e.Connected=2]=`Connected`,e}({}),t={debug(){},info(){},warn(){},error(){}},n={debug:console.debug.bind(console),info:console.info.bind(console),warn:console.warn.bind(console),error:console.error.bind(console)};Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return n}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return t}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return e}});
2
+ //# sourceMappingURL=types-DrnoCdSW.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types-DrnoCdSW.cjs","names":[],"sources":["../src/types.ts"],"sourcesContent":["// ---- Branded primitive types ------------------------------------------------\n\n/** A TS3-escaped string. Obtained only via escape(). */\nexport type EscapedString = string & { readonly __escaped: unique symbol };\n\n// ---- Event map --------------------------------------------------------------\n\nexport interface TextMessage {\n invokerName: string;\n invokerUID: string;\n message: string;\n invokerGroups: string[];\n targetMode: number;\n targetID: bigint;\n invokerID: number;\n}\n\nexport interface ClientMovedEvent {\n invokerName: string;\n invokerUID: string;\n targetChannelID: bigint;\n reasonID: number;\n id: number;\n invokerID: number;\n}\n\nexport interface ClientLeftViewEvent {\n reasonMsg: string;\n reasonID: number;\n id: number;\n targetID: number;\n}\n\nexport interface ClientInfo {\n nickname: string;\n uid: string;\n serverGroups: string[];\n channelID: bigint;\n type: number;\n id: number;\n}\n\nexport interface ChannelInfo {\n name: string;\n description: string;\n id: bigint;\n parentID: bigint;\n}\n\nexport interface FileUploadInfo {\n fileTransferKey: string;\n seekPosition: bigint;\n clientFileTransferID: number;\n serverFileTransferID: number;\n port: number;\n}\n\nexport interface FileDownloadInfo {\n fileTransferKey: string;\n size: bigint;\n clientFileTransferID: number;\n serverFileTransferID: number;\n port: number;\n}\n\nexport interface FileTransferStatusInfo {\n message: string;\n status: number;\n clientFileTransferID: number;\n}\n\nexport interface PokeEvent {\n invokerName: string;\n invokerUID: string;\n invokerID: number;\n message: string;\n}\n\nexport interface VoiceData {\n clientId: number;\n codec: number;\n data: Uint8Array;\n}\n\n// ---- Typed event map used by Client.on() ------------------------------------\n\nexport interface EventMap {\n textMessage: TextMessage;\n clientEnter: ClientInfo;\n clientLeave: ClientLeftViewEvent;\n clientMoved: ClientMovedEvent;\n poked: PokeEvent;\n voiceData: VoiceData;\n connected: void;\n disconnected: Error | undefined;\n kicked: string;\n}\n\n// ---- Client status ----------------------------------------------------------\n\nexport const enum ClientStatus {\n Disconnected = 0,\n Connecting = 1,\n Connected = 2,\n}\n\n// ---- Middleware types --------------------------------------------------------\n\nexport type CommandMiddleware = (\n next: (cmd: string) => Promise<void>,\n) => (cmd: string) => Promise<void>;\n\nexport type EventMiddleware = (\n next: (evt: EventMap[keyof EventMap]) => void,\n) => (evt: EventMap[keyof EventMap]) => void;\n\n// ---- Logger interface --------------------------------------------------------\n\nexport interface Logger {\n debug(msg: string, ...args: unknown[]): void;\n info(msg: string, ...args: unknown[]): void;\n warn(msg: string, ...args: unknown[]): void;\n error(msg: string, ...args: unknown[]): void;\n}\n\n/** A no-op logger that discards all messages. */\nexport const noopLogger: Logger = {\n debug() {},\n info() {},\n warn() {},\n error() {},\n};\n\n/** A console-backed logger. */\nexport const consoleLogger: Logger = {\n debug: console.debug.bind(console),\n info: console.info.bind(console),\n warn: console.warn.bind(console),\n error: console.error.bind(console),\n};\n\n// ---- Resolved address (from discovery) --------------------------------------\n\nexport interface ResolvedAddr {\n addr: string;\n source: string;\n expiry: Date;\n}\n\n// ---- AddrResolver interface -------------------------------------------------\n\nexport interface AddrResolver {\n resolve(addr: string, signal?: AbortSignal): Promise<ResolvedAddr[]>;\n}\n\n// ---- ClientOptions ----------------------------------------------------------\n\nexport interface ClientOptions {\n logger?: Logger;\n resolver?: AddrResolver;\n commandMiddleware?: CommandMiddleware[];\n eventMiddleware?: EventMiddleware[];\n}\n"],"mappings":"AAoGA,IAAkB,EAAX,SAAA,EAAA,OACL,GAAA,EAAA,aAAA,GAAA,eACA,EAAA,EAAA,WAAA,GAAA,aACA,EAAA,EAAA,UAAA,GAAA,kBACD,CAsBY,EAAqB,CAChC,OAAQ,GACR,MAAO,GACP,MAAO,GACP,OAAQ,GACT,CAGY,EAAwB,CACnC,MAAO,QAAQ,MAAM,KAAK,QAAQ,CAClC,KAAM,QAAQ,KAAK,KAAK,QAAQ,CAChC,KAAM,QAAQ,KAAK,KAAK,QAAQ,CAChC,MAAO,QAAQ,MAAM,KAAK,QAAQ,CACnC"}
@@ -0,0 +1,114 @@
1
+ /** A TS3-escaped string. Obtained only via escape(). */
2
+ export type EscapedString = string & {
3
+ readonly __escaped: unique symbol;
4
+ };
5
+ export interface TextMessage {
6
+ invokerName: string;
7
+ invokerUID: string;
8
+ message: string;
9
+ invokerGroups: string[];
10
+ targetMode: number;
11
+ targetID: bigint;
12
+ invokerID: number;
13
+ }
14
+ export interface ClientMovedEvent {
15
+ invokerName: string;
16
+ invokerUID: string;
17
+ targetChannelID: bigint;
18
+ reasonID: number;
19
+ id: number;
20
+ invokerID: number;
21
+ }
22
+ export interface ClientLeftViewEvent {
23
+ reasonMsg: string;
24
+ reasonID: number;
25
+ id: number;
26
+ targetID: number;
27
+ }
28
+ export interface ClientInfo {
29
+ nickname: string;
30
+ uid: string;
31
+ serverGroups: string[];
32
+ channelID: bigint;
33
+ type: number;
34
+ id: number;
35
+ }
36
+ export interface ChannelInfo {
37
+ name: string;
38
+ description: string;
39
+ id: bigint;
40
+ parentID: bigint;
41
+ }
42
+ export interface FileUploadInfo {
43
+ fileTransferKey: string;
44
+ seekPosition: bigint;
45
+ clientFileTransferID: number;
46
+ serverFileTransferID: number;
47
+ port: number;
48
+ }
49
+ export interface FileDownloadInfo {
50
+ fileTransferKey: string;
51
+ size: bigint;
52
+ clientFileTransferID: number;
53
+ serverFileTransferID: number;
54
+ port: number;
55
+ }
56
+ export interface FileTransferStatusInfo {
57
+ message: string;
58
+ status: number;
59
+ clientFileTransferID: number;
60
+ }
61
+ export interface PokeEvent {
62
+ invokerName: string;
63
+ invokerUID: string;
64
+ invokerID: number;
65
+ message: string;
66
+ }
67
+ export interface VoiceData {
68
+ clientId: number;
69
+ codec: number;
70
+ data: Uint8Array;
71
+ }
72
+ export interface EventMap {
73
+ textMessage: TextMessage;
74
+ clientEnter: ClientInfo;
75
+ clientLeave: ClientLeftViewEvent;
76
+ clientMoved: ClientMovedEvent;
77
+ poked: PokeEvent;
78
+ voiceData: VoiceData;
79
+ connected: void;
80
+ disconnected: Error | undefined;
81
+ kicked: string;
82
+ }
83
+ export declare const enum ClientStatus {
84
+ Disconnected = 0,
85
+ Connecting = 1,
86
+ Connected = 2
87
+ }
88
+ export type CommandMiddleware = (next: (cmd: string) => Promise<void>) => (cmd: string) => Promise<void>;
89
+ export type EventMiddleware = (next: (evt: EventMap[keyof EventMap]) => void) => (evt: EventMap[keyof EventMap]) => void;
90
+ export interface Logger {
91
+ debug(msg: string, ...args: unknown[]): void;
92
+ info(msg: string, ...args: unknown[]): void;
93
+ warn(msg: string, ...args: unknown[]): void;
94
+ error(msg: string, ...args: unknown[]): void;
95
+ }
96
+ /** A no-op logger that discards all messages. */
97
+ export declare const noopLogger: Logger;
98
+ /** A console-backed logger. */
99
+ export declare const consoleLogger: Logger;
100
+ export interface ResolvedAddr {
101
+ addr: string;
102
+ source: string;
103
+ expiry: Date;
104
+ }
105
+ export interface AddrResolver {
106
+ resolve(addr: string, signal?: AbortSignal): Promise<ResolvedAddr[]>;
107
+ }
108
+ export interface ClientOptions {
109
+ logger?: Logger;
110
+ resolver?: AddrResolver;
111
+ commandMiddleware?: CommandMiddleware[];
112
+ eventMiddleware?: EventMiddleware[];
113
+ }
114
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}