@honeybbq/teamspeak-client 0.2.3 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (89) hide show
  1. package/README.md +1 -0
  2. package/dist/address-BR-5unVo.cjs +2 -0
  3. package/dist/address-BR-5unVo.cjs.map +1 -0
  4. package/dist/address-BfmovVpp.js +65 -0
  5. package/dist/address-BfmovVpp.js.map +1 -0
  6. package/dist/address.d.ts +9 -0
  7. package/dist/address.d.ts.map +1 -0
  8. package/dist/address.test.d.ts +2 -0
  9. package/dist/address.test.d.ts.map +1 -0
  10. package/dist/api.d.ts.map +1 -1
  11. package/dist/api.test.d.ts +2 -0
  12. package/dist/api.test.d.ts.map +1 -0
  13. package/dist/client.d.ts +2 -0
  14. package/dist/client.d.ts.map +1 -1
  15. package/dist/command/index.cjs +1 -1
  16. package/dist/command/index.mjs +2 -2
  17. package/dist/{command-CTDmBXd_.js → command-BLe-C2L2.js} +2 -4
  18. package/dist/{command-CTDmBXd_.js.map → command-BLe-C2L2.js.map} +1 -1
  19. package/dist/command-DAK4pUBP.cjs +4 -0
  20. package/dist/{command-CUPNiKRl.cjs.map → command-DAK4pUBP.cjs.map} +1 -1
  21. package/dist/{crypt-handshake-D2Rsi2e3.cjs → crypt-handshake-CQkQreLx.cjs} +2 -2
  22. package/dist/{crypt-handshake-D2Rsi2e3.cjs.map → crypt-handshake-CQkQreLx.cjs.map} +1 -1
  23. package/dist/{crypt-handshake-DIj51kno.js → crypt-handshake-DziOY4Lq.js} +2 -2
  24. package/dist/{crypt-handshake-DIj51kno.js.map → crypt-handshake-DziOY4Lq.js.map} +1 -1
  25. package/dist/{crypt-init2-C2X9oK4i.js → crypt-init2-D70ha4LB.js} +6 -6
  26. package/dist/{crypt-init2-C2X9oK4i.js.map → crypt-init2-D70ha4LB.js.map} +1 -1
  27. package/dist/{crypt-init2-CazdFwqF.cjs → crypt-init2-DparLekm.cjs} +2 -2
  28. package/dist/{crypt-init2-CazdFwqF.cjs.map → crypt-init2-DparLekm.cjs.map} +1 -1
  29. package/dist/crypto/identity.d.ts.map +1 -1
  30. package/dist/crypto/index.cjs +1 -1
  31. package/dist/crypto/index.mjs +2 -2
  32. package/dist/{crypto-CwIMggQG.js → crypto-Bg02m4ZE.js} +7 -7
  33. package/dist/crypto-Bg02m4ZE.js.map +1 -0
  34. package/dist/crypto-CDlweUL3.cjs +2 -0
  35. package/dist/crypto-CDlweUL3.cjs.map +1 -0
  36. package/dist/discovery/index.cjs +1 -1
  37. package/dist/discovery/index.mjs +1 -1
  38. package/dist/discovery/resolver.d.ts.map +1 -1
  39. package/dist/{handler-BP38rMNl.js → handler-DI_abe9c.js} +153 -125
  40. package/dist/handler-DI_abe9c.js.map +1 -0
  41. package/dist/handler-DuwoO5RC.cjs +2 -0
  42. package/dist/handler-DuwoO5RC.cjs.map +1 -0
  43. package/dist/handshake/index.cjs +1 -1
  44. package/dist/handshake/index.mjs +2 -2
  45. package/dist/helpers.d.ts.map +1 -1
  46. package/dist/index.cjs +2 -2
  47. package/dist/index.cjs.map +1 -1
  48. package/dist/index.mjs +154 -140
  49. package/dist/index.mjs.map +1 -1
  50. package/dist/{parser-B6cGUByG.cjs → parser-CL33R9tr.cjs} +2 -2
  51. package/dist/{parser-B6cGUByG.cjs.map → parser-CL33R9tr.cjs.map} +1 -1
  52. package/dist/{parser-BPzO8py_.js → parser-DZMv3Jm-.js} +2 -2
  53. package/dist/{parser-BPzO8py_.js.map → parser-DZMv3Jm-.js.map} +1 -1
  54. package/dist/primitives-cNNAeFCo.cjs +2 -0
  55. package/dist/primitives-cNNAeFCo.cjs.map +1 -0
  56. package/dist/primitives-xIr6Tjk4.js +1457 -0
  57. package/dist/primitives-xIr6Tjk4.js.map +1 -0
  58. package/dist/resolver-6B8dI9gr.js +141 -0
  59. package/dist/resolver-6B8dI9gr.js.map +1 -0
  60. package/dist/resolver-DCcmyWSK.cjs +4 -0
  61. package/dist/resolver-DCcmyWSK.cjs.map +1 -0
  62. package/dist/transport/handler.d.ts +2 -0
  63. package/dist/transport/handler.d.ts.map +1 -1
  64. package/dist/transport/index.cjs +1 -1
  65. package/dist/transport/index.mjs +1 -1
  66. package/dist/transport/whisper.test.d.ts +2 -0
  67. package/dist/transport/whisper.test.d.ts.map +1 -0
  68. package/dist/types.d.ts +2 -0
  69. package/dist/types.d.ts.map +1 -1
  70. package/package.json +4 -4
  71. package/dist/command-CUPNiKRl.cjs +0 -4
  72. package/dist/crypto-CwIMggQG.js.map +0 -1
  73. package/dist/crypto-IbzNNTgO.cjs +0 -2
  74. package/dist/crypto-IbzNNTgO.cjs.map +0 -1
  75. package/dist/handler-BJdwhtkp.cjs +0 -2
  76. package/dist/handler-BJdwhtkp.cjs.map +0 -1
  77. package/dist/handler-BP38rMNl.js.map +0 -1
  78. package/dist/primitives-Bt-L4BZa.js +0 -1483
  79. package/dist/primitives-Bt-L4BZa.js.map +0 -1
  80. package/dist/primitives-ClIhDdNZ.cjs +0 -2
  81. package/dist/primitives-ClIhDdNZ.cjs.map +0 -1
  82. package/dist/resolver-B7jho9CP.cjs +0 -4
  83. package/dist/resolver-B7jho9CP.cjs.map +0 -1
  84. package/dist/resolver-BDCF2KbM.js +0 -162
  85. package/dist/resolver-BDCF2KbM.js.map +0 -1
  86. package/dist/types-ANvuLFWH.cjs +0 -2
  87. package/dist/types-ANvuLFWH.cjs.map +0 -1
  88. package/dist/types-Xm1vrW4s.js +0 -18
  89. package/dist/types-Xm1vrW4s.js.map +0 -1
@@ -1,4 +0,0 @@
1
- const e=require("./types-ANvuLFWH.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=new Map;constructor(t=e.r){}async resolve(e,t){if(!e)throw Error(`empty address`);let n=this.#t(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.#r(r,t);if(a)return this.#n(e,a);let o=p(r),c=await this.#i(o,r,t);if(c)return this.#n(e,[{addr:c,source:`TSDNS-SRV`,expiry:new Date(0)}]);let d=await this.#a(o,r,t);if(d)return this.#n(e,[{addr:d,source:`TSDNS-Direct`,expiry:new Date(0)}]);let m=[{addr:f(r,i),source:`Direct`,expiry:new Date(0)}];return this.#n(e,m)}#t(e){let t=this.#e.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}#n(e,t){let n=new Date(Date.now()+a),r=t.map(e=>({...e,expiry:n}));return this.#e.set(e,r),r}async#r(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#i(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#a(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-B7jho9CP.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"resolver-B7jho9CP.cjs","names":["#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 #cache = new Map<string, ResolvedAddr[]>();\n\n constructor(_log: Logger = noopLogger) {}\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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"}
@@ -1,162 +0,0 @@
1
- import { r as e } from "./types-Xm1vrW4s.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 = /* @__PURE__ */ new Map();
7
- constructor(t = e) {}
8
- async resolve(e, t) {
9
- if (!e) throw Error("empty address");
10
- let n = this.#t(e);
11
- if (n) return n;
12
- let { host: r, port: i } = u(e);
13
- if (l(r)) return [{
14
- addr: f(r, i),
15
- source: "Direct",
16
- expiry: /* @__PURE__ */ new Date(0)
17
- }];
18
- if (!r.includes(".") && r !== "localhost") {
19
- let e = await s(r, t);
20
- if (e) return this.resolve(e, t);
21
- }
22
- let a = await this.#r(r, t);
23
- if (a) return this.#n(e, a);
24
- let o = p(r), c = await this.#i(o, r, t);
25
- if (c) return this.#n(e, [{
26
- addr: c,
27
- source: "TSDNS-SRV",
28
- expiry: /* @__PURE__ */ new Date(0)
29
- }]);
30
- let d = await this.#a(o, r, t);
31
- if (d) return this.#n(e, [{
32
- addr: d,
33
- source: "TSDNS-Direct",
34
- expiry: /* @__PURE__ */ new Date(0)
35
- }]);
36
- let m = [{
37
- addr: f(r, i),
38
- source: "Direct",
39
- expiry: /* @__PURE__ */ new Date(0)
40
- }];
41
- return this.#n(e, m);
42
- }
43
- #t(e) {
44
- let t = this.#e.get(e);
45
- if (!t || t.length === 0) return null;
46
- let n = t[0];
47
- return n.expiry.getTime() > 0 && Date.now() > n.expiry.getTime() ? null : t;
48
- }
49
- #n(e, t) {
50
- let n = new Date(Date.now() + a), r = t.map((e) => ({
51
- ...e,
52
- expiry: n
53
- }));
54
- return this.#e.set(e, r), r;
55
- }
56
- async #r(e, n) {
57
- try {
58
- let r = await m(t(`_ts3._udp.${e}`), n);
59
- return !r || r.length === 0 ? null : r.map((e) => ({
60
- addr: f(e.name.replace(/\.$/, ""), String(e.port)),
61
- source: "SRV",
62
- expiry: /* @__PURE__ */ new Date(0)
63
- }));
64
- } catch {
65
- return null;
66
- }
67
- }
68
- async #i(e, n, r) {
69
- for (let i of e) try {
70
- let e = await m(t(`_tsdns._tcp.${i}`), r);
71
- if (!e || e.length === 0) continue;
72
- for (let t of e) {
73
- let e = await c(f(t.name.replace(/\.$/, ""), String(t.port)), n, r);
74
- if (e) return e;
75
- }
76
- } catch {
77
- continue;
78
- }
79
- return null;
80
- }
81
- async #a(e, t, n) {
82
- for (let i of e) {
83
- let e = await c(f(i, String(r)), t, n);
84
- if (e) return e;
85
- }
86
- return null;
87
- }
88
- };
89
- async function s(e, t) {
90
- try {
91
- let n = new URL(i);
92
- n.searchParams.set("name", e);
93
- let r = t ? { signal: t } : {}, a = await fetch(n.toString(), r);
94
- return a.ok && (await a.text()).split("\n")[0]?.trim() || null;
95
- } catch {
96
- return null;
97
- }
98
- }
99
- function c(e, t, r) {
100
- let [i, a] = d(e), o = parseInt(a, 10);
101
- return new Promise((e) => {
102
- let a = setTimeout(() => {
103
- s.destroy(), e(null);
104
- }, 3e3), s = n({
105
- host: i,
106
- port: o,
107
- timeout: 2e3
108
- }, () => {
109
- s.write(`${t}\n`);
110
- }), c = "";
111
- s.on("data", (t) => {
112
- c += t.toString();
113
- let n = c.indexOf("\n");
114
- if (n >= 0) {
115
- clearTimeout(a), s.destroy();
116
- let t = c.slice(0, n).trim();
117
- e(!t || t === "404" || t === "errors" ? null : t);
118
- }
119
- }), s.on("error", () => {
120
- clearTimeout(a), e(null);
121
- }), r && r.addEventListener("abort", () => {
122
- clearTimeout(a), s.destroy(), e(null);
123
- }, { once: !0 });
124
- });
125
- }
126
- function l(e) {
127
- return /^\d{1,3}(\.\d{1,3}){3}$/.test(e) || e.startsWith("[");
128
- }
129
- function u(e) {
130
- let t = e.lastIndexOf(":");
131
- if (t < 0) return {
132
- host: e,
133
- port: "9987"
134
- };
135
- let n = e.slice(t + 1);
136
- return /^\d+$/.test(n) ? {
137
- host: e.slice(0, t),
138
- port: n
139
- } : {
140
- host: e,
141
- port: "9987"
142
- };
143
- }
144
- function d(e) {
145
- let { host: t, port: n } = u(e);
146
- return [t, n];
147
- }
148
- function f(e, t) {
149
- return e.includes(":") ? `[${e}]:${t}` : `${e}:${t}`;
150
- }
151
- function p(e) {
152
- let t = e.split("."), n = [];
153
- for (let e = 0; e < t.length - 1; e++) n.push(t.slice(e).join("."));
154
- return n.slice(0, 3);
155
- }
156
- function m(e, t) {
157
- return t ? Promise.race([e, new Promise((e, n) => t.addEventListener("abort", () => n(t.reason), { once: !0 }))]) : e;
158
- }
159
- //#endregion
160
- export { o as t };
161
-
162
- //# sourceMappingURL=resolver-BDCF2KbM.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"resolver-BDCF2KbM.js","names":["#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 #cache = new Map<string, ResolvedAddr[]>();\n\n constructor(_log: Logger = noopLogger) {}\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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"}
@@ -1,2 +0,0 @@
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-ANvuLFWH.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types-ANvuLFWH.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 /** Server password sent during the initial `clientinit` handshake. */\n serverPassword?: string;\n /** Default channel name to join during the initial `clientinit` handshake. */\n defaultChannel?: string;\n /** Password for `defaultChannel`, sent during the initial `clientinit` handshake. */\n defaultChannelPassword?: string;\n}\n"],"mappings":"AAoGA,IAAkB,EAAX,SAAA,EAAA,OACL,GAAA,EAAA,aAAA,GAAA,eACA,EAAA,EAAA,WAAA,GAAA,aACA,EAAA,EAAA,UAAA,GAAA,aACF,EAAA,CAAA,CAAA,EAsBa,EAAqB,CAChC,OAAQ,CAAC,EACT,MAAO,CAAC,EACR,MAAO,CAAC,EACR,OAAQ,CAAC,CACX,EAGa,EAAwB,CACnC,MAAO,QAAQ,MAAM,KAAK,OAAO,EACjC,KAAM,QAAQ,KAAK,KAAK,OAAO,EAC/B,KAAM,QAAQ,KAAK,KAAK,OAAO,EAC/B,MAAO,QAAQ,MAAM,KAAK,OAAO,CACnC"}
@@ -1,18 +0,0 @@
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-Xm1vrW4s.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types-Xm1vrW4s.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 /** Server password sent during the initial `clientinit` handshake. */\n serverPassword?: string;\n /** Default channel name to join during the initial `clientinit` handshake. */\n defaultChannel?: string;\n /** Password for `defaultChannel`, sent during the initial `clientinit` handshake. */\n defaultChannelPassword?: string;\n}\n"],"mappings":";AAoGA,IAAkB,IAAX,yBAAA,GAAA;QACL,EAAA,EAAA,eAAA,KAAA,gBACA,EAAA,EAAA,aAAA,KAAA,cACA,EAAA,EAAA,YAAA,KAAA;AACF,EAAA,CAAA,CAAA,GAsBa,IAAqB;CAChC,QAAQ,CAAC;CACT,OAAO,CAAC;CACR,OAAO,CAAC;CACR,QAAQ,CAAC;AACX,GAGa,IAAwB;CACnC,OAAO,QAAQ,MAAM,KAAK,OAAO;CACjC,MAAM,QAAQ,KAAK,KAAK,OAAO;CAC/B,MAAM,QAAQ,KAAK,KAAK,OAAO;CAC/B,OAAO,QAAQ,MAAM,KAAK,OAAO;AACnC"}