@honeybbq/teamspeak-client 0.3.0 → 0.3.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.
- package/dist/address-BR-5unVo.cjs.map +1 -1
- package/dist/address-BfmovVpp.js.map +1 -1
- package/dist/client.d.ts.map +1 -1
- package/dist/command-BLe-C2L2.js.map +1 -1
- package/dist/command-DAK4pUBP.cjs.map +1 -1
- package/dist/commands.d.ts.map +1 -1
- package/dist/crypt-handshake-CQkQreLx.cjs.map +1 -1
- package/dist/crypt-handshake-DziOY4Lq.js.map +1 -1
- package/dist/crypt-init2-D70ha4LB.js.map +1 -1
- package/dist/crypt-init2-DparLekm.cjs.map +1 -1
- package/dist/crypto/crypt.d.ts.map +1 -1
- package/dist/crypto/eax.d.ts.map +1 -1
- package/dist/crypto/identity.d.ts.map +1 -1
- package/dist/crypto-Bg02m4ZE.js.map +1 -1
- package/dist/crypto-CDlweUL3.cjs.map +1 -1
- package/dist/discovery/resolver.d.ts.map +1 -1
- package/dist/errors.d.ts.map +1 -1
- package/dist/handler-DI_abe9c.js.map +1 -1
- package/dist/handler-DuwoO5RC.cjs.map +1 -1
- package/dist/handshake/license.d.ts.map +1 -1
- package/dist/index.cjs +2 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.mjs +96 -65
- package/dist/index.mjs.map +1 -1
- package/dist/parser-CL33R9tr.cjs.map +1 -1
- package/dist/parser-DZMv3Jm-.js.map +1 -1
- package/dist/primitives-cNNAeFCo.cjs.map +1 -1
- package/dist/primitives-xIr6Tjk4.js.map +1 -1
- package/dist/resolver-6B8dI9gr.js.map +1 -1
- package/dist/resolver-DCcmyWSK.cjs.map +1 -1
- package/dist/throttle.d.ts.map +1 -1
- package/dist/transfer.d.ts.map +1 -1
- package/dist/transport/generation-window.d.ts.map +1 -1
- package/dist/transport/handler.d.ts.map +1 -1
- package/dist/transport/quicklz.d.ts.map +1 -1
- package/package.json +4 -5
- package/dist/address.test.d.ts +0 -2
- package/dist/address.test.d.ts.map +0 -1
- package/dist/api.test.d.ts +0 -2
- package/dist/api.test.d.ts.map +0 -1
- package/dist/command/command.test.d.ts +0 -2
- package/dist/command/command.test.d.ts.map +0 -1
- package/dist/crypto/eax.test.d.ts +0 -2
- package/dist/crypto/eax.test.d.ts.map +0 -1
- package/dist/crypto/identity.test.d.ts +0 -2
- package/dist/crypto/identity.test.d.ts.map +0 -1
- package/dist/handshake.test.d.ts +0 -2
- package/dist/handshake.test.d.ts.map +0 -1
- package/dist/helpers.test.d.ts +0 -2
- package/dist/helpers.test.d.ts.map +0 -1
- package/dist/integration.test.d.ts +0 -12
- package/dist/integration.test.d.ts.map +0 -1
- package/dist/notifications.test.d.ts +0 -2
- package/dist/notifications.test.d.ts.map +0 -1
- package/dist/throttle.test.d.ts +0 -2
- package/dist/throttle.test.d.ts.map +0 -1
- package/dist/transport/generation-window.test.d.ts +0 -2
- package/dist/transport/generation-window.test.d.ts.map +0 -1
- package/dist/transport/packet.test.d.ts +0 -2
- package/dist/transport/packet.test.d.ts.map +0 -1
- package/dist/transport/quicklz.test.d.ts +0 -2
- package/dist/transport/quicklz.test.d.ts.map +0 -1
- package/dist/transport/whisper.test.d.ts +0 -2
- package/dist/transport/whisper.test.d.ts.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolver-6B8dI9gr.js","names":[],"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\";\nimport { isIpAddress, joinHostPort, splitHostPort } from \"../address.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 splitHostPortParts(addr: string): [string, string] {\n const { host, port } = splitHostPort(addr);\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":";;;;AAOA,IAAM,IAAsB,OACtB,IAAsB,wCACtB,IAAe,KAER,IAAb,MAAsB;CACpB,qBAAkB,IAAI,IAA4B;CAElD,YAAY,IAAe,GAAY,CAAC;CAExC,MAAM,QAAQ,GAAmB,GAA+C;EAC9E,IAAI,CAAC,GAAW,MAAU,MAAM,eAAe;EAE/C,IAAM,IAAS,KAAK,GAAe,CAAS;EAC5C,IAAI,GAAQ,OAAO;EAEnB,IAAM,EAAE,SAAM,YAAS,EAAc,CAAS;EAE9C,IAAI,EAAY,CAAI,GAClB,OAAO,CAAC;GAAE,MAAM,EAAa,GAAM,CAAI;GAAG,QAAQ;GAAU,wBAAQ,IAAI,KAAK,CAAC;EAAE,CAAC;EAInF,IAAI,CAAC,EAAK,SAAS,GAAG,KAAK,MAAS,aAAa;GAC/C,IAAM,IAAW,MAAM,EAAgB,GAAM,CAAM;GACnD,IAAI,GACF,OAAO,KAAK,QAAQ,GAAU,CAAM;EAExC;EAGA,IAAM,IAAa,MAAM,KAAK,GAAY,GAAM,CAAM;EACtD,IAAI,GAAY,OAAO,KAAK,GAAU,GAAW,CAAU;EAE3D,IAAM,IAAa,EAAc,CAAI,GAG/B,IAAW,MAAM,KAAK,GAAiB,GAAY,GAAM,CAAM;EACrE,IAAI,GACF,OAAO,KAAK,GAAU,GAAW,CAC/B;GAAE,MAAM;GAAU,QAAQ;GAAa,wBAAQ,IAAI,KAAK,CAAC;EAAE,CAC7D,CAAC;EAIH,IAAM,IAAc,MAAM,KAAK,GAAoB,GAAY,GAAM,CAAM;EAC3E,IAAI,GACF,OAAO,KAAK,GAAU,GAAW,CAC/B;GAAE,MAAM;GAAa,QAAQ;GAAgB,wBAAQ,IAAI,KAAK,CAAC;EAAE,CACnE,CAAC;EAIH,IAAM,IAA2B,CAC/B;GAAE,MAAM,EAAa,GAAM,CAAI;GAAG,QAAQ;GAAU,wBAAQ,IAAI,KAAK,CAAC;EAAE,CAC1E;EACA,OAAO,KAAK,GAAU,GAAW,CAAQ;CAC3C;CAEA,GAAe,GAA0C;EACvD,IAAM,IAAS,KAAK,GAAO,IAAI,CAAS;EACxC,IAAI,CAAC,KAAU,EAAO,WAAW,GAAG,OAAO;EAC3C,IAAM,IAAQ,EAAO;EAErB,OADI,EAAM,OAAO,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,EAAM,OAAO,QAAQ,IAAU,OACvE;CACT;CAEA,GAAU,GAAa,GAAyC;EAC9D,IAAM,IAAS,IAAI,KAAK,KAAK,IAAI,IAAI,CAAY,GAC3C,IAAa,EAAQ,KAAK,OAAO;GAAE,GAAG;GAAG;EAAO,EAAE;EAExD,OADA,KAAK,GAAO,IAAI,GAAK,CAAU,GACxB;CACT;CAEA,MAAM,GAAY,GAAc,GAAsD;EACpF,IAAI;GACF,IAAM,IAAO,MAAM,EAAW,EAAW,aAAa,GAAM,GAAG,CAAM;GAErE,OADI,CAAC,KAAQ,EAAK,WAAW,IAAU,OAChC,EAAK,KAAK,OAAS;IACxB,MAAM,EAAa,EAAI,KAAK,QAAQ,OAAO,EAAE,GAAG,OAAO,EAAI,IAAI,CAAC;IAChE,QAAQ;IACR,wBAAQ,IAAI,KAAK,CAAC;GACpB,EAAE;EACJ,QAAQ;GACN,OAAO;EACT;CACF;CAEA,MAAM,GACJ,GACA,GACA,GACwB;EACxB,KAAK,IAAM,KAAU,GACnB,IAAI;GACF,IAAM,IAAO,MAAM,EAAW,EAAW,eAAe,GAAQ,GAAG,CAAM;GACzE,IAAI,CAAC,KAAQ,EAAK,WAAW,GAAG;GAChC,KAAK,IAAM,KAAO,GAAM;IAEtB,IAAM,IAAS,MAAM,EADH,EAAa,EAAI,KAAK,QAAQ,OAAO,EAAE,GAAG,OAAO,EAAI,IAAI,CAC3C,GAAW,GAAW,CAAM;IAC5D,IAAI,GAAQ,OAAO;GACrB;EACF,QAAQ;GACN;EACF;EAEF,OAAO;CACT;CAEA,MAAM,GACJ,GACA,GACA,GACwB;EACxB,KAAK,IAAM,KAAU,GAAS;GAE5B,IAAM,IAAS,MAAM,EADH,EAAa,GAAQ,OAAO,CAAmB,CACjC,GAAW,GAAW,CAAM;GAC5D,IAAI,GAAQ,OAAO;EACrB;EACA,OAAO;CACT;AACF;AAIA,eAAe,EAAgB,GAAkB,GAA8C;CAC7F,IAAI;EACF,IAAM,IAAM,IAAI,IAAI,CAAmB;EACvC,EAAI,aAAa,IAAI,QAAQ,CAAQ;EACrC,IAAM,IAAoB,IAAS,EAAE,UAAO,IAAI,CAAC,GAC3C,IAAO,MAAM,MAAM,EAAI,SAAS,GAAG,CAAI;EAI7C,OAHK,EAAK,OAEG,MADM,EAAK,KAAK,EAAA,CACX,MAAM,IAAI,CAAC,CAAC,EAAE,EAAE,KAAK,KAFlB;CAIvB,QAAQ;EACN,OAAO;CACT;AACF;AAEA,SAAS,EACP,GACA,GACA,GACwB;CACxB,IAAM,CAAC,GAAM,KAAW,EAAmB,CAAS,GAC9C,IAAO,SAAS,GAAS,EAAE;CAEjC,OAAO,IAAI,SAAS,MAAY;EAC9B,IAAM,IAAU,iBAAiB;GAE/B,AADA,EAAO,QAAQ,GACf,EAAQ,IAAI;EACd,GAAG,GAAK,GAEF,IAAS,EAAiB;GAAE;GAAM;GAAM,SAAS;EAAM,SAAS;GACpE,EAAO,MAAM,GAAG,EAAU,GAAG;EAC/B,CAAC,GAEG,IAAM;EAkBV,AAjBA,EAAO,GAAG,SAAS,MAAkB;GACnC,KAAO,EAAM,SAAS;GACtB,IAAM,IAAM,EAAI,QAAQ,IAAI;GAC5B,IAAI,KAAO,GAAG;IAEZ,AADA,aAAa,CAAO,GACpB,EAAO,QAAQ;IACf,IAAM,IAAO,EAAI,MAAM,GAAG,CAAG,CAAC,CAAC,KAAK;IACpC,AAAkD,EAA9C,CAAC,KAAQ,MAAS,SAAS,MAAS,WAAkB,OAC7C,CAAI;GACnB;EACF,CAAC,GAED,EAAO,GAAG,eAAe;GAEvB,AADA,aAAa,CAAO,GACpB,EAAQ,IAAI;EACd,CAAC,GAEG,KACF,EAAO,iBACL,eACM;GAGJ,AAFA,aAAa,CAAO,GACpB,EAAO,QAAQ,GACf,EAAQ,IAAI;EACd,GACA,EAAE,MAAM,GAAK,CACf;CAEJ,CAAC;AACH;AAEA,SAAS,EAAmB,GAAgC;CAC1D,IAAM,EAAE,SAAM,YAAS,EAAc,CAAI;CACzC,OAAO,CAAC,GAAM,CAAI;AACpB;AAEA,SAAS,EAAc,GAAwB;CAC7C,IAAM,IAAQ,EAAK,MAAM,GAAG,GACtB,IAAiB,CAAC;CACxB,KAAK,IAAI,IAAI,GAAG,IAAI,EAAM,SAAS,GAAG,KACpC,EAAK,KAAK,EAAM,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC;CAEpC,OAAO,EAAK,MAAM,GAAG,CAAC;AACxB;AAEA,SAAS,EAAc,GAAqB,GAAkC;CAE5E,OADK,IACE,QAAQ,KAAK,CAClB,GACA,IAAI,SAAY,GAAG,MACjB,EAAO,iBAAiB,eAAe,EAAO,EAAO,MAAM,GAAG,EAAE,MAAM,GAAK,CAAC,CAC9E,CACF,CAAC,IANmB;AAOtB"}
|
|
1
|
+
{"version":3,"file":"resolver-6B8dI9gr.js","names":["joinHostPort","noopLogger","splitHostPort","isIpAddress","TS_DNS_DEFAULT_PORT","NICKNAME_LOOKUP_URL","CACHE_TTL_MS","Resolver","inputAddr","cached","#getValidCache","host","port","nickAddr","resolveNickname","signal","srvResults","#resolveSRV","#setCache","domainList","getDomainList","tsdnsSrv","#resolveTSDNSSRV","tsdnsDirect","#resolveTSDNSDirect","fallback","#cache","first","expiry","withExpiry","results","r","key","srvs","withSignal","resolveSrv","srv","domain","domains","result","queryTSDNS","queryHost","url","nickname","init","resp","portStr","splitHostPortParts","tsdnsAddr","timeout","socket","resolve","createConnection","buf","chunk","idx","line","addr","parts","list","i","promise","reject"],"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\";\nimport { isIpAddress, joinHostPort, splitHostPort } from \"../address.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 splitHostPortParts(addr: string): [string, string] {\n const { host, port } = splitHostPort(addr);\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":";;;;AAOA,IAAMI,IAAsB,OACtBC,IAAsB,wCACtBC,IAAe,KAERC,IAAb,MAAsB;CACpB,qBAAkB,IAAI,IAA4B;CAElD,YAAY,IAAeN,GAAY,CAAC;CAExC,MAAM,QAAQ,GAAmB,GAA+C;EAC9E,IAAI,CAACO,GAAW,MAAU,MAAM,eAAe;EAE/C,IAAMC,IAAS,KAAKC,GAAeF,CAAS;EAC5C,IAAIC,GAAQ,OAAOA;EAEnB,IAAM,EAAE,SAAM,YAASP,EAAcM,CAAS;EAE9C,IAAIL,EAAYQ,CAAI,GAClB,OAAO,CAAC;GAAE,MAAMX,EAAaW,GAAMC,CAAI;GAAG,QAAQ;GAAU,wBAAQ,IAAI,KAAK,CAAC;EAAE,CAAC;EAInF,IAAI,CAACD,EAAK,SAAS,GAAG,KAAKA,MAAS,aAAa;GAC/C,IAAME,IAAW,MAAMC,EAAgBH,GAAMI,CAAM;GACnD,IAAIF,GACF,OAAO,KAAK,QAAQA,GAAUE,CAAM;EAExC;EAGA,IAAMC,IAAa,MAAM,KAAKC,GAAYN,GAAMI,CAAM;EACtD,IAAIC,GAAY,OAAO,KAAKE,GAAUV,GAAWQ,CAAU;EAE3D,IAAMG,IAAaC,EAAcT,CAAI,GAG/BU,IAAW,MAAM,KAAKC,GAAiBH,GAAYR,GAAMI,CAAM;EACrE,IAAIM,GACF,OAAO,KAAKH,GAAUV,GAAW,CAC/B;GAAE,MAAMa;GAAU,QAAQ;GAAa,wBAAQ,IAAI,KAAK,CAAC;EAAE,CAC7D,CAAC;EAIH,IAAME,IAAc,MAAM,KAAKC,GAAoBL,GAAYR,GAAMI,CAAM;EAC3E,IAAIQ,GACF,OAAO,KAAKL,GAAUV,GAAW,CAC/B;GAAE,MAAMe;GAAa,QAAQ;GAAgB,wBAAQ,IAAI,KAAK,CAAC;EAAE,CACnE,CAAC;EAIH,IAAME,IAA2B,CAC/B;GAAE,MAAMzB,EAAaW,GAAMC,CAAI;GAAG,QAAQ;GAAU,wBAAQ,IAAI,KAAK,CAAC;EAAE,CAC1E;EACA,OAAO,KAAKM,GAAUV,GAAWiB,CAAQ;CAC3C;CAEA,GAAe,GAA0C;EACvD,IAAMhB,IAAS,KAAKiB,GAAO,IAAIlB,CAAS;EACxC,IAAI,CAACC,KAAUA,EAAO,WAAW,GAAG,OAAO;EAC3C,IAAMkB,IAAQlB,EAAO;EAErB,OADIkB,EAAM,OAAO,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAIA,EAAM,OAAO,QAAQ,IAAU,OACvElB;CACT;CAEA,GAAU,GAAa,GAAyC;EAC9D,IAAMmB,IAAS,IAAI,KAAK,KAAK,IAAI,IAAItB,CAAY,GAC3CuB,IAAaC,EAAQ,KAAK,OAAO;GAAE,GAAGC;GAAG;EAAO,EAAE;EAExD,OADA,KAAKL,GAAO,IAAIM,GAAKH,CAAU,GACxBA;CACT;CAEA,MAAMZ,GAAY,GAAc,GAAsD;EACpF,IAAI;GACF,IAAMgB,IAAO,MAAMC,EAAWC,EAAW,aAAaxB,GAAM,GAAGI,CAAM;GAErE,OADI,CAACkB,KAAQA,EAAK,WAAW,IAAU,OAChCA,EAAK,KAAK,OAAS;IACxB,MAAMjC,EAAaoC,EAAI,KAAK,QAAQ,OAAO,EAAE,GAAG,OAAOA,EAAI,IAAI,CAAC;IAChE,QAAQ;IACR,wBAAQ,IAAI,KAAK,CAAC;GACpB,EAAE;EACJ,QAAQ;GACN,OAAO;EACT;CACF;CAEA,MAAMd,GACJ,GACA,GACA,GACwB;EACxB,KAAK,IAAMe,KAAUC,GACnB,IAAI;GACF,IAAML,IAAO,MAAMC,EAAWC,EAAW,eAAeE,GAAQ,GAAGtB,CAAM;GACzE,IAAI,CAACkB,KAAQA,EAAK,WAAW,GAAG;GAChC,KAAK,IAAMG,KAAOH,GAAM;IAEtB,IAAMM,IAAS,MAAMC,EADHxC,EAAaoC,EAAI,KAAK,QAAQ,OAAO,EAAE,GAAG,OAAOA,EAAI,IAAI,CAC3C,GAAWK,GAAW1B,CAAM;IAC5D,IAAIwB,GAAQ,OAAOA;GACrB;EACF,QAAQ;GACN;EACF;EAEF,OAAO;CACT;CAEA,MAAMf,GACJ,GACA,GACA,GACwB;EACxB,KAAK,IAAMa,KAAUC,GAAS;GAE5B,IAAMC,IAAS,MAAMC,EADHxC,EAAaqC,GAAQ,OAAOjC,CAAmB,CACjC,GAAWqC,GAAW1B,CAAM;GAC5D,IAAIwB,GAAQ,OAAOA;EACrB;EACA,OAAO;CACT;AACF;AAIA,eAAezB,EAAgB,GAAkB,GAA8C;CAC7F,IAAI;EACF,IAAM4B,IAAM,IAAI,IAAIrC,CAAmB;EACvC,EAAI,aAAa,IAAI,QAAQsC,CAAQ;EACrC,IAAMC,IAAoB7B,IAAS,EAAE,UAAO,IAAI,CAAC,GAC3C8B,IAAO,MAAM,MAAMH,EAAI,SAAS,GAAGE,CAAI;EAI7C,OAHKC,EAAK,OAEG,MADMA,EAAK,KAAK,EAAA,CACX,MAAM,IAAI,CAAC,CAAC,EAAE,EAAE,KAAK,KAFlB;CAIvB,QAAQ;EACN,OAAO;CACT;AACF;AAEA,SAASL,EACP,GACA,GACA,GACwB;CACxB,IAAM,CAAC7B,GAAMmC,KAAWC,EAAmBC,CAAS,GAC9CpC,IAAO,SAASkC,GAAS,EAAE;CAEjC,OAAO,IAAI,SAAS,MAAY;EAC9B,IAAMG,IAAU,iBAAiB;GAE/B,AADAC,EAAO,QAAQ,GACfC,EAAQ,IAAI;EACd,GAAG,GAAK,GAEFD,IAASE,EAAiB;GAAE;GAAM;GAAM,SAAS;EAAM,SAAS;GACpE,EAAO,MAAM,GAAGX,EAAU,GAAG;EAC/B,CAAC,GAEGY,IAAM;EAkBV,AAjBAH,EAAO,GAAG,SAAS,MAAkB;GACnC,KAAOI,EAAM,SAAS;GACtB,IAAMC,IAAMF,EAAI,QAAQ,IAAI;GAC5B,IAAIE,KAAO,GAAG;IAEZ,AADA,aAAaN,CAAO,GACpBC,EAAO,QAAQ;IACf,IAAMM,IAAOH,EAAI,MAAM,GAAGE,CAAG,CAAC,CAAC,KAAK;IACpC,AAAkDJ,EAA9C,CAACK,KAAQA,MAAS,SAASA,MAAS,WAAkB,OAC7CA,CAAI;GACnB;EACF,CAAC,GAEDN,EAAO,GAAG,eAAe;GAEvB,AADA,aAAaD,CAAO,GACpBE,EAAQ,IAAI;EACd,CAAC,GAEGpC,KACFA,EAAO,iBACL,eACM;GAGJ,AAFA,aAAakC,CAAO,GACpBC,EAAO,QAAQ,GACfC,EAAQ,IAAI;EACd,GACA,EAAE,MAAM,GAAK,CACf;CAEJ,CAAC;AACH;AAEA,SAASJ,EAAmB,GAAgC;CAC1D,IAAM,EAAE,SAAM,YAAS7C,EAAcuD,CAAI;CACzC,OAAO,CAAC9C,GAAMC,CAAI;AACpB;AAEA,SAASQ,EAAc,GAAwB;CAC7C,IAAMsC,IAAQ/C,EAAK,MAAM,GAAG,GACtBgD,IAAiB,CAAC;CACxB,KAAK,IAAIC,IAAI,GAAGA,IAAIF,EAAM,SAAS,GAAG,KACpC,EAAK,KAAKA,EAAM,MAAME,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC;CAEpC,OAAOD,EAAK,MAAM,GAAG,CAAC;AACxB;AAEA,SAASzB,EAAc,GAAqB,GAAkC;CAE5E,OADKnB,IACE,QAAQ,KAAK,CAClB8C,GACA,IAAI,SAAY,GAAG,MACjB9C,EAAO,iBAAiB,eAAe+C,EAAO/C,EAAO,MAAM,GAAG,EAAE,MAAM,GAAK,CAAC,CAC9E,CACF,CAAC,IANmB8C;AAOtB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolver-DCcmyWSK.cjs","names":[],"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\";\nimport { isIpAddress, joinHostPort, splitHostPort } from \"../address.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 splitHostPortParts(addr: string): [string, string] {\n const { host, port } = splitHostPort(addr);\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
|
+
{"version":3,"file":"resolver-DCcmyWSK.cjs","names":["noopLogger","splitHostPort","isIpAddress","joinHostPort","resolveSrv","createConnection","require_address","node_dns_promises","node_net","TS_DNS_DEFAULT_PORT","NICKNAME_LOOKUP_URL","CACHE_TTL_MS","Resolver","inputAddr","cached","#getValidCache","host","port","nickAddr","resolveNickname","signal","srvResults","#resolveSRV","#setCache","domainList","getDomainList","tsdnsSrv","#resolveTSDNSSRV","tsdnsDirect","#resolveTSDNSDirect","fallback","#cache","first","expiry","withExpiry","results","r","key","srvs","withSignal","srv","domain","domains","result","queryTSDNS","queryHost","url","nickname","init","resp","portStr","splitHostPortParts","tsdnsAddr","timeout","socket","resolve","buf","chunk","idx","line","addr","parts","list","i","promise","reject"],"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\";\nimport { isIpAddress, joinHostPort, splitHostPort } from \"../address.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 splitHostPortParts(addr: string): [string, string] {\n const { host, port } = splitHostPort(addr);\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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"}
|
package/dist/throttle.d.ts.map
CHANGED
|
@@ -1 +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;
|
|
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,CAiC9C;CACF"}
|
package/dist/transfer.d.ts.map
CHANGED
|
@@ -1 +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,KAAK,cAAc,GACf,cAAc,GACd,gBAAgB,GAChB,OAAO,YAAY,EAAE,sBAAsB,CAAC;AAEhD,qBAAa,mBAAmB;;IAI9B,QAAQ,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC;
|
|
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,KAAK,cAAc,GACf,cAAc,GACd,gBAAgB,GAChB,OAAO,YAAY,EAAE,sBAAsB,CAAC;AAEhD,qBAAa,mBAAmB;;IAI9B,QAAQ,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC,CAQ5D;IAED,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAE9B;IAED,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,GAAG,IAAI,CAGjD;IAED,KAAK,IAAI,IAAI,CAGZ;CACF;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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generation-window.d.ts","sourceRoot":"","sources":["../../src/transport/generation-window.ts"],"names":[],"mappings":"AAAA,qBAAa,gBAAgB;;
|
|
1
|
+
{"version":3,"file":"generation-window.d.ts","sourceRoot":"","sources":["../../src/transport/generation-window.ts"],"names":[],"mappings":"AAAA,qBAAa,gBAAgB;;IAM3B,YAAY,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAG1C;IAED,IAAI,UAAU,IAAI,MAAM,CAEvB;IAED,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAQ5B;IAED,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAI3C;IAED,MAAM,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAIhC;IAED,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAMvC;IAED,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAKzC;IAED,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAExC;IAED,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAE3C;IASD,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAGzC;IAED,KAAK,IAAI,IAAI,CAGZ;CACF"}
|
|
@@ -1 +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;AAGpE,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;
|
|
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;AAGpE,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;IAyBtD,YAAY,KAAK,EAAE,KAAK,EAAE,MAAM,GAAE,MAAmB,EAGpD;IAED,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAE5B;IAED,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBnC;IAED,KAAK,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI,CAgC3B;IAED,oBAAoB,IAAI,IAAI,CAE3B;IAED,UAAU,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAOnE;IAED,eAAe,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CA6BrD;IAED,8EAA8E;IAC9E,iBAAiB,CAAC,IAAI,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAwClF;IAED,KAAK,IAAI,IAAI,CAMZ;CAwcF"}
|
|
@@ -1 +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;
|
|
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,CA4BvC;CAmGF"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@honeybbq/teamspeak-client",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.1",
|
|
4
4
|
"description": "TeamSpeak 3 client SDK for Node.js — a clean-room TypeScript port of the Go reference implementation",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"client",
|
|
@@ -55,7 +55,7 @@
|
|
|
55
55
|
"access": "public"
|
|
56
56
|
},
|
|
57
57
|
"scripts": {
|
|
58
|
-
"build": "vite build && tsc
|
|
58
|
+
"build": "vite build && tsc -p tsconfig.build.json --emitDeclarationOnly",
|
|
59
59
|
"test": "vitest run",
|
|
60
60
|
"test:watch": "vitest",
|
|
61
61
|
"lint": "oxlint .",
|
|
@@ -72,12 +72,11 @@
|
|
|
72
72
|
},
|
|
73
73
|
"devDependencies": {
|
|
74
74
|
"@types/node": "^26.1.1",
|
|
75
|
-
"oxfmt": "^0.
|
|
75
|
+
"oxfmt": "^0.71.0",
|
|
76
76
|
"oxlint": "^1.59.0",
|
|
77
77
|
"tsx": "^4.21.0",
|
|
78
|
-
"typescript": "^
|
|
78
|
+
"typescript": "^7.0.2",
|
|
79
79
|
"vite": "^8.0.8",
|
|
80
|
-
"vite-plugin-dts": "^5.0.0",
|
|
81
80
|
"vitest": "^5.0.0"
|
|
82
81
|
},
|
|
83
82
|
"engines": {
|
package/dist/address.test.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"address.test.d.ts","sourceRoot":"","sources":["../src/address.test.ts"],"names":[],"mappings":""}
|
package/dist/api.test.d.ts
DELETED
package/dist/api.test.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"api.test.d.ts","sourceRoot":"","sources":["../src/api.test.ts"],"names":[],"mappings":""}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"command.test.d.ts","sourceRoot":"","sources":["../../src/command/command.test.ts"],"names":[],"mappings":""}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"eax.test.d.ts","sourceRoot":"","sources":["../../src/crypto/eax.test.ts"],"names":[],"mappings":""}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"identity.test.d.ts","sourceRoot":"","sources":["../../src/crypto/identity.test.ts"],"names":[],"mappings":""}
|
package/dist/handshake.test.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"handshake.test.d.ts","sourceRoot":"","sources":["../src/handshake.test.ts"],"names":[],"mappings":""}
|
package/dist/helpers.test.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.test.d.ts","sourceRoot":"","sources":["../src/helpers.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Integration tests against a live TeamSpeak 3 server.
|
|
3
|
-
*
|
|
4
|
-
* Opt-in: these tests only run when TEAMSPEAK_ADDR is set:
|
|
5
|
-
*
|
|
6
|
-
* TEAMSPEAK_ADDR=chenkr.cn pnpm test --reporter=verbose src/integration.test.ts
|
|
7
|
-
*
|
|
8
|
-
* A single shared client is reused across all tests to avoid the TS3
|
|
9
|
-
* anti-flood protection that bans IPs reconnecting too quickly.
|
|
10
|
-
*/
|
|
11
|
-
export {};
|
|
12
|
-
//# sourceMappingURL=integration.test.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"integration.test.d.ts","sourceRoot":"","sources":["../src/integration.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"notifications.test.d.ts","sourceRoot":"","sources":["../src/notifications.test.ts"],"names":[],"mappings":""}
|
package/dist/throttle.test.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"throttle.test.d.ts","sourceRoot":"","sources":["../src/throttle.test.ts"],"names":[],"mappings":""}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"generation-window.test.d.ts","sourceRoot":"","sources":["../../src/transport/generation-window.test.ts"],"names":[],"mappings":""}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"packet.test.d.ts","sourceRoot":"","sources":["../../src/transport/packet.test.ts"],"names":[],"mappings":""}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"quicklz.test.d.ts","sourceRoot":"","sources":["../../src/transport/quicklz.test.ts"],"names":[],"mappings":""}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"whisper.test.d.ts","sourceRoot":"","sources":["../../src/transport/whisper.test.ts"],"names":[],"mappings":""}
|