@honeybbq/teamspeak-client 0.2.2 → 0.2.3
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/command/index.cjs +1 -1
- package/dist/command/index.mjs +2 -2
- package/dist/{command-caXc4h0n.js → command-CTDmBXd_.js} +1 -1
- package/dist/{command-caXc4h0n.js.map → command-CTDmBXd_.js.map} +1 -1
- package/dist/{command-Cu2v-5-K.cjs → command-CUPNiKRl.cjs} +2 -2
- package/dist/{command-Cu2v-5-K.cjs.map → command-CUPNiKRl.cjs.map} +1 -1
- package/dist/crypt-handshake-D2Rsi2e3.cjs +2 -0
- package/dist/{crypt-handshake-Dbj2cSBZ.cjs.map → crypt-handshake-D2Rsi2e3.cjs.map} +1 -1
- package/dist/crypt-handshake-DIj51kno.js +55 -0
- package/dist/{crypt-handshake-CHmvZ2qs.js.map → crypt-handshake-DIj51kno.js.map} +1 -1
- package/dist/{crypt-init2-DWX7Tp-_.js → crypt-init2-C2X9oK4i.js} +24 -26
- package/dist/{crypt-init2-DWX7Tp-_.js.map → crypt-init2-C2X9oK4i.js.map} +1 -1
- package/dist/crypt-init2-CazdFwqF.cjs +2 -0
- package/dist/{crypt-init2-C2oihZ7e.cjs.map → crypt-init2-CazdFwqF.cjs.map} +1 -1
- package/dist/crypto/index.cjs +1 -1
- package/dist/crypto/index.mjs +2 -2
- package/dist/{crypto-VC7n6YJb.js → crypto-CwIMggQG.js} +4 -4
- package/dist/{crypto-VC7n6YJb.js.map → crypto-CwIMggQG.js.map} +1 -1
- package/dist/{crypto-2veVY1fC.cjs → crypto-IbzNNTgO.cjs} +2 -2
- package/dist/{crypto-2veVY1fC.cjs.map → crypto-IbzNNTgO.cjs.map} +1 -1
- package/dist/discovery/index.cjs +1 -1
- package/dist/discovery/index.mjs +1 -1
- package/dist/handler-BJdwhtkp.cjs +2 -0
- package/dist/{handler-CqCD93f0.cjs.map → handler-BJdwhtkp.cjs.map} +1 -1
- package/dist/{handler-C_JhqGTd.js → handler-BP38rMNl.js} +18 -18
- package/dist/{handler-C_JhqGTd.js.map → handler-BP38rMNl.js.map} +1 -1
- package/dist/handshake/index.cjs +1 -1
- package/dist/handshake/index.mjs +2 -2
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.mjs +11 -11
- package/dist/index.mjs.map +1 -1
- package/dist/{parser-DhAWj-TI.cjs → parser-B6cGUByG.cjs} +2 -2
- package/dist/{parser-DhAWj-TI.cjs.map → parser-B6cGUByG.cjs.map} +1 -1
- package/dist/{parser-CJjP3LlO.js → parser-BPzO8py_.js} +2 -2
- package/dist/{parser-CJjP3LlO.js.map → parser-BPzO8py_.js.map} +1 -1
- package/dist/primitives-Bt-L4BZa.js +1483 -0
- package/dist/primitives-Bt-L4BZa.js.map +1 -0
- package/dist/primitives-ClIhDdNZ.cjs +2 -0
- package/dist/primitives-ClIhDdNZ.cjs.map +1 -0
- package/dist/{resolver-DDD2FFhD.cjs → resolver-B7jho9CP.cjs} +3 -3
- package/dist/{resolver-DDD2FFhD.cjs.map → resolver-B7jho9CP.cjs.map} +1 -1
- package/dist/{resolver-Br0QefWx.js → resolver-BDCF2KbM.js} +2 -2
- package/dist/{resolver-Br0QefWx.js.map → resolver-BDCF2KbM.js.map} +1 -1
- package/dist/transport/index.cjs +1 -1
- package/dist/transport/index.mjs +1 -1
- package/dist/{types-DrnoCdSW.cjs → types-ANvuLFWH.cjs} +2 -2
- package/dist/{types-DrnoCdSW.cjs.map → types-ANvuLFWH.cjs.map} +1 -1
- package/dist/{types-CGKgXvpG.js → types-Xm1vrW4s.js} +1 -1
- package/dist/{types-CGKgXvpG.js.map → types-Xm1vrW4s.js.map} +1 -1
- package/package.json +3 -3
- package/dist/crypt-handshake-CHmvZ2qs.js +0 -55
- package/dist/crypt-handshake-Dbj2cSBZ.cjs +0 -2
- package/dist/crypt-init2-C2oihZ7e.cjs +0 -2
- package/dist/handler-CqCD93f0.cjs +0 -2
- package/dist/primitives-BIAYfJ2Y.js +0 -1842
- package/dist/primitives-BIAYfJ2Y.js.map +0 -1
- package/dist/primitives-bj-ml31v.cjs +0 -2
- package/dist/primitives-bj-ml31v.cjs.map +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const e=require(
|
|
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
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
|
|
4
|
-
//# sourceMappingURL=resolver-
|
|
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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolver-DDD2FFhD.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
|
+
{"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,4 +1,4 @@
|
|
|
1
|
-
import { r as e } from "./types-
|
|
1
|
+
import { r as e } from "./types-Xm1vrW4s.js";
|
|
2
2
|
import { resolveSrv as t } from "node:dns/promises";
|
|
3
3
|
import { createConnection as n } from "node:net";
|
|
4
4
|
//#region src/discovery/resolver.ts
|
|
@@ -159,4 +159,4 @@ function m(e, t) {
|
|
|
159
159
|
//#endregion
|
|
160
160
|
export { o as t };
|
|
161
161
|
|
|
162
|
-
//# sourceMappingURL=resolver-
|
|
162
|
+
//# sourceMappingURL=resolver-BDCF2KbM.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolver-Br0QefWx.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
|
+
{"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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"}
|
package/dist/transport/index.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../handler-BJdwhtkp.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;
|
package/dist/transport/index.mjs
CHANGED
|
@@ -1,2 +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-
|
|
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-BP38rMNl.js";
|
|
2
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 };
|
|
@@ -1,2 +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
|
|
2
|
-
//# sourceMappingURL=types-
|
|
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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types-
|
|
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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types-
|
|
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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@honeybbq/teamspeak-client",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.3",
|
|
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",
|
|
@@ -72,12 +72,12 @@
|
|
|
72
72
|
},
|
|
73
73
|
"devDependencies": {
|
|
74
74
|
"@types/node": "^25.6.0",
|
|
75
|
-
"oxfmt": "^0.
|
|
75
|
+
"oxfmt": "^0.58.0",
|
|
76
76
|
"oxlint": "^1.59.0",
|
|
77
77
|
"tsx": "^4.21.0",
|
|
78
78
|
"typescript": "^6.0.2",
|
|
79
79
|
"vite": "^8.0.8",
|
|
80
|
-
"vite-plugin-dts": "^
|
|
80
|
+
"vite-plugin-dts": "^5.0.0",
|
|
81
81
|
"vitest": "^4.1.4"
|
|
82
82
|
},
|
|
83
83
|
"engines": {
|
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
import { n as e } from "./command-caXc4h0n.js";
|
|
2
|
-
import { randomBytes as t } from "node:crypto";
|
|
3
|
-
//#region src/handshake/crypt-handshake.ts
|
|
4
|
-
var n = 1566914096, r = 4, i = 1, a = 21;
|
|
5
|
-
function o(e, t) {
|
|
6
|
-
if (t === null || t.length >= 1 && t[0] === 127) return s();
|
|
7
|
-
switch (t[0]) {
|
|
8
|
-
case 0: return c(t);
|
|
9
|
-
case 1: return l(t);
|
|
10
|
-
case 2: return u(t);
|
|
11
|
-
case 3: return d(e, t);
|
|
12
|
-
default: return null;
|
|
13
|
-
}
|
|
14
|
-
}
|
|
15
|
-
function s() {
|
|
16
|
-
let e = new Uint8Array(r + i + 4 + 4 + 8), a = new DataView(e.buffer);
|
|
17
|
-
a.setUint32(0, n, !1), e[4] = 0;
|
|
18
|
-
let o = Math.floor(Date.now() / 1e3), s = Math.max(0, Math.min(o, 4294967295));
|
|
19
|
-
a.setUint32(5, s, !1);
|
|
20
|
-
let c = t(4);
|
|
21
|
-
return e.set(c, 9), e;
|
|
22
|
-
}
|
|
23
|
-
function c(e) {
|
|
24
|
-
if (e.length !== a) return null;
|
|
25
|
-
let t = new Uint8Array(i + 16 + 4);
|
|
26
|
-
t[0] = 1;
|
|
27
|
-
let n = r + i + 4, o = e[n] | e[n + 1] << 8 | e[n + 2] << 16 | e[n + 3] << 24;
|
|
28
|
-
return new DataView(t.buffer).setUint32(i + 16, o >>> 0, !1), t;
|
|
29
|
-
}
|
|
30
|
-
function l(e) {
|
|
31
|
-
if (e.length !== a) return null;
|
|
32
|
-
let t = new Uint8Array(r + i + 16 + 4);
|
|
33
|
-
return new DataView(t.buffer).setUint32(0, n, !1), t[4] = 2, t.set(e.slice(1, 21), 5), t;
|
|
34
|
-
}
|
|
35
|
-
function u(e) {
|
|
36
|
-
if (e.length !== r + i + 16 + 4) return null;
|
|
37
|
-
let t = new Uint8Array(i + 64 + 64 + 4 + 100);
|
|
38
|
-
return t[0] = 3, t[i + 64 - 1] = 1, t[i + 64 + 64 - 1] = 1, new DataView(t.buffer).setUint32(i + 64 + 64, 1, !1), t;
|
|
39
|
-
}
|
|
40
|
-
function d(a, o) {
|
|
41
|
-
if (o.length !== i + 64 + 64 + 4 + 100) return null;
|
|
42
|
-
let s = new DataView(o.buffer, o.byteOffset).getUint32(129, !1), c = a.solveRsaChallenge(o, 1, s);
|
|
43
|
-
a.alphaTmp = new Uint8Array(t(10));
|
|
44
|
-
let l = Buffer.from(a.alphaTmp).toString("base64"), u = a.identity.publicKeyBase64(), d = e("clientinitiv", [
|
|
45
|
-
["alpha", l],
|
|
46
|
-
["omega", u],
|
|
47
|
-
["ot", "1"],
|
|
48
|
-
["ip", ""]
|
|
49
|
-
]), f = Buffer.from(d), p = new Uint8Array(r + i + 232 + 64 + f.length);
|
|
50
|
-
return new DataView(p.buffer).setUint32(0, n, !1), p[4] = 4, p.set(o.slice(1, 233), 5), p.set(c.slice(0, 64), 237), p.set(f, 301), p;
|
|
51
|
-
}
|
|
52
|
-
//#endregion
|
|
53
|
-
export { o as n, n as t };
|
|
54
|
-
|
|
55
|
-
//# sourceMappingURL=crypt-handshake-CHmvZ2qs.js.map
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
const e=require(`./command-Cu2v-5-K.cjs`);let t=require(`node:crypto`);var n=1566914096,r=4,i=1,a=21;function o(e,t){if(t===null||t.length>=1&&t[0]===127)return s();switch(t[0]){case 0:return c(t);case 1:return l(t);case 2:return u(t);case 3:return d(e,t);default:return null}}function s(){let e=new Uint8Array(r+i+4+4+8),a=new DataView(e.buffer);a.setUint32(0,n,!1),e[4]=0;let o=Math.floor(Date.now()/1e3),s=Math.max(0,Math.min(o,4294967295));a.setUint32(5,s,!1);let c=(0,t.randomBytes)(4);return e.set(c,9),e}function c(e){if(e.length!==a)return null;let t=new Uint8Array(i+16+4);t[0]=1;let n=r+i+4,o=e[n]|e[n+1]<<8|e[n+2]<<16|e[n+3]<<24;return new DataView(t.buffer).setUint32(i+16,o>>>0,!1),t}function l(e){if(e.length!==a)return null;let t=new Uint8Array(r+i+16+4);return new DataView(t.buffer).setUint32(0,n,!1),t[4]=2,t.set(e.slice(1,21),5),t}function u(e){if(e.length!==r+i+16+4)return null;let t=new Uint8Array(i+64+64+4+100);return t[0]=3,t[i+64-1]=1,t[i+64+64-1]=1,new DataView(t.buffer).setUint32(i+64+64,1,!1),t}function d(a,o){if(o.length!==i+64+64+4+100)return null;let s=new DataView(o.buffer,o.byteOffset).getUint32(129,!1),c=a.solveRsaChallenge(o,1,s);a.alphaTmp=new Uint8Array((0,t.randomBytes)(10));let l=Buffer.from(a.alphaTmp).toString(`base64`),u=a.identity.publicKeyBase64(),d=e.n(`clientinitiv`,[[`alpha`,l],[`omega`,u],[`ot`,`1`],[`ip`,``]]),f=Buffer.from(d),p=new Uint8Array(r+i+232+64+f.length);return new DataView(p.buffer).setUint32(0,n,!1),p[4]=4,p.set(o.slice(1,233),5),p.set(c.slice(0,64),237),p.set(f,301),p}Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return o}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return n}});
|
|
2
|
-
//# sourceMappingURL=crypt-handshake-Dbj2cSBZ.cjs.map
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
const e=require(`./primitives-bj-ml31v.cjs`);var t=new Uint8Array([205,13,226,174,212,99,69,80,154,126,60,253,143,104,179,220,117,85,178,157,204,236,115,205,24,117,15,153,56,18,64,138]),n=function(e){return e[e.Intermediate=0]=`Intermediate`,e[e.Server=2]=`Server`,e[e.Ts5Server=8]=`Ts5Server`,e[e.Ephemeral=32]=`Ephemeral`,e}(n||{}),r=class{blocks;constructor(e){this.blocks=e}deriveKey(){let e=Uint8Array.from(t);for(let t of this.blocks)e=c(t,e);return e}};function i(e){if(e.length<1)throw Error(`license too short`);if(e[0]!==1)throw Error(`unsupported license version`);let t=e.slice(1),n=[];for(;t.length>0;){let{block:e,consumed:r}=a(t);n.push(e),t=t.slice(r)}return new r(n)}function a(t){if(t.length<42)throw Error(`license too short`);if(t[0]!==0)throw Error(`wrong key kind in license: ${t[0]}`);let n=t[33],r=1356998400,i=new DataView(t.buffer,t.byteOffset,t.byteLength),a=new Date((i.getUint32(34,!1)+r)*1e3),s=new Date((i.getUint32(38,!1)+r)*1e3);if(s<a)throw Error(`license times are invalid`);let c=Uint8Array.from(t.slice(1,33)),{payload:l,payloadRead:u}=o(n,t,42),d=42+u,f=t.slice(1,d),p=e.f(Uint8Array.from(f));return{block:{key:c,hash:Uint8Array.from(p.slice(0,32)),properties:l.properties,issuer:l.issuer,notValidBefore:a,notValidAfter:s,blockType:n,serverType:l.serverType},consumed:d}}function o(e,t,r){switch(e){case n.Intermediate:{let{str:e,read:n}=s(t.slice(46));return{payload:{issuer:e,serverType:0,properties:[],read:5+n},payloadRead:5+n}}case n.Server:{let{str:e,read:n}=s(t.slice(47));return{payload:{issuer:e,serverType:t[42]??0,properties:[],read:6+n},payloadRead:6+n}}case n.Ts5Server:{let e=t[43]===void 0?0:t[43],n=44,i=[];for(let r=0;r<e;r++){if(n>=t.length)throw Error(`license too short`);let e=t[n++];if(n+e>t.length)throw Error(`license too short`);i.push(Uint8Array.from(t.slice(n,n+e))),n+=e}return{payload:{issuer:``,serverType:t[42]??0,properties:i,read:n-r},payloadRead:n-r}}case n.Ephemeral:return{payload:{issuer:``,serverType:0,properties:[],read:0},payloadRead:0};default:throw Error(`invalid license block type: ${e}`)}}function s(e){for(let t=0;t<e.length;t++)if(e[t]===0)return{str:new TextDecoder().decode(e.slice(0,t)),read:t};throw Error(`non-null-terminated issuer string`)}function c(t,n){let r=Uint8Array.from(t.hash);e.n(r);let i=e.t(r),a=e.c.Point.fromBytes(t.key).negate(),o=e.c.Point.fromBytes(n).negate(),s=e.a(a,i).add(o).toBytes(),c=new Uint8Array(s.length);return c.set(s),c[31]=(c[31]===void 0?0:c[31])^128,c}function l(t,n,r,a,o,s){if(t.alphaTmp.length===0)throw Error(`alpha is not initialized`);let c=Buffer.from(n,`base64`),l=Buffer.from(r,`base64`),u=Buffer.from(a,`base64`),d=Buffer.from(o,`base64`);if(!e.s(e.m(l),c,u))throw Error(`init proof is not valid`);let f=e.i(i(c).deriveKey(),s);t.setSharedSecret(t.alphaTmp,d,f)}Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return r}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return i}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return l}});
|
|
2
|
-
//# sourceMappingURL=crypt-init2-C2oihZ7e.cjs.map
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
const e=require(`./types-DrnoCdSW.cjs`),t=require(`./crypt-handshake-Dbj2cSBZ.cjs`);let n=require(`node:dgram`);var r=function(e){return e[e.Voice=0]=`Voice`,e[e.VoiceWhisper=1]=`VoiceWhisper`,e[e.Command=2]=`Command`,e[e.CommandLow=3]=`CommandLow`,e[e.Ping=4]=`Ping`,e[e.Pong=5]=`Pong`,e[e.Ack=6]=`Ack`,e[e.AckLow=7]=`AckLow`,e[e.Init1=8]=`Init1`,e}({}),i=function(e){return e[e.Fragmented=16]=`Fragmented`,e[e.NewProtocol=32]=`NewProtocol`,e[e.Compressed=64]=`Compressed`,e[e.Unencrypted=128]=`Unencrypted`,e}({});function a(e){return e.typeFlagged&15}function o(e){return e.typeFlagged&240}function s(e){return(o(e)&i.Unencrypted)!==0}function c(e){let t=new Uint8Array(5),n=new DataView(t.buffer);return n.setUint16(0,e.id,!1),n.setUint16(2,e.clientID,!1),t[4]=e.typeFlagged,t}function l(e){return{id:new DataView(e.buffer,e.byteOffset,e.byteLength).getUint16(0,!1),typeFlagged:e[2]}}function u(e){let t=new DataView(e.buffer,e.byteOffset,e.byteLength);return{id:t.getUint16(0,!1),clientID:t.getUint16(2,!1),typeFlagged:e[4]}}var d=class{#e=0;#t=0;#n;#r;constructor(e,t){this.#n=e,this.#r=t}get generation(){return this.#t}advance(e){if(e<=0)return;let t=this.#e+e,n=Math.floor(t/this.#n);n>0&&(this.#t=Math.min(this.#t+n,4294967295)),this.#e=t%this.#n}advanceToExcluded(e){let t=e-this.#e;t<0&&(t+=this.#n),this.advance(t+1)}syncTo(e){let t=e-this.#e;t<0&&(t+=this.#n),this.advance(t)}isInWindow(e){let t=this.#e+this.#r;return t<this.#n?e>=this.#e&&e<t:e>=this.#e||e<t-this.#n}mappedToIndex(e){return this.#i(e)?e+this.#n-this.#e:e-this.#e}isOldPacket(e){return this.mappedToIndex(e)<0}isFuturePacket(e){return this.mappedToIndex(e)>=this.#r}#i(e){return this.#e>this.#n-this.#r&&e<this.#e+this.#r-this.#n}getGeneration(e){return this.#i(e)?this.#t+1:this.#t}reset(){this.#e=0,this.#t=0}},f=4096,p=class{#e=new Int32Array(f);decompress(e){let{headerLen:t,decompressedSize:n,flags:r}=m(e),i=new Uint8Array(n);if(!(r&1))return i.set(e.slice(t,t+n)),i;this.#e.fill(0);let a={control:1,sourcePos:t,destPos:0,nextHashed:0};for(;this.#t(e,a);)if(a.control&1){if(!this.#n(e,i,a))break}else if(this.#r(e,i,n,a))break;return i}#t(e,t){return t.control===1?t.sourcePos+4>e.length?!1:(t.control=(e[t.sourcePos]|e[t.sourcePos+1]<<8|e[t.sourcePos+2]<<16|e[t.sourcePos+3]<<24)>>>0,t.sourcePos+=4,!0):!0}#n(e,t,n){if(n.control=n.control>>>1>>>0,n.sourcePos+2>e.length)return!1;let r=e[n.sourcePos],i=e[n.sourcePos+1];n.sourcePos+=2;let a=r>>4|i<<4,o=r&15;if(o!==0)o+=2;else{if(n.sourcePos>=e.length)return!1;o=e[n.sourcePos],n.sourcePos++}let s=this.#e[a];for(let e=0;e<o;e++)n.destPos<t.length&&s+e<n.destPos&&(t[n.destPos]=t[s+e],n.destPos++);let c=n.destPos+1-o;return this.#i(t,n,c),n.nextHashed=n.destPos,!0}#r(e,t,n,r){let i=Math.max(n,10)-10;if(r.destPos>=i){for(;r.destPos<n;){if(r.control===1){if(r.sourcePos+=4,r.sourcePos>e.length)break;r.control=(e[r.sourcePos-4]|e[r.sourcePos-3]<<8|e[r.sourcePos-2]<<16|e[r.sourcePos-1]<<24)>>>0}if(r.sourcePos>=e.length)break;t[r.destPos++]=e[r.sourcePos++],r.control=r.control>>>1>>>0}return!0}if(r.sourcePos>=e.length||r.destPos>=t.length)return!0;t[r.destPos++]=e[r.sourcePos++],r.control=r.control>>>1>>>0;let a=Math.max(r.destPos-2,0);return this.#i(t,r,a),r.nextHashed<a&&(r.nextHashed=a),!1}#i(e,t,n){for(;t.nextHashed<n&&!(t.nextHashed+3>e.length);){let n=(e[t.nextHashed]|e[t.nextHashed+1]<<8|e[t.nextHashed+2]<<16)>>>0,r=(n>>12^n)&4095;this.#e[r]=t.nextHashed,t.nextHashed++}}};function m(e){if(e.length<3)throw Error(`QuickLZ: data too short`);let t=e[0];if((t>>2&3)!=1)throw Error(`QuickLZ: only level 1 is supported`);let n=t&2?9:3;if(e.length<n)throw Error(`QuickLZ: data too short for header`);let r;return r=t&2?(e[5]|e[6]<<8|e[7]<<16|e[8]<<24)>>>0:e[2],{headerLen:n,decompressedSize:r,flags:t}}var h=500,g=1024,_=5e3,v=6e4,y=1e3,b=5,x=8,S=3,C=500,w=100,T=class{onPacket=null;onClosed=null;#e;#t;#n=null;#r=0;#i=!1;#a=null;#o=null;#s=Date.now();#c=new Uint16Array(9);#l=new Uint32Array(9);#u=new d(65536,g);#d=new d(65536,g);#f=new d(65536,g);#p=new d(65536,g);#m=new Map;#h=new Map;#g=new Map;#_=null;constructor(t,n=e.r){this.#e=t,this.#t=n}setClientID(e){this.#r=e}connect(e){return new Promise((t,r)=>{let[i,a]=e.lastIndexOf(`:`)>0?[e.slice(0,e.lastIndexOf(`:`)),e.slice(e.lastIndexOf(`:`)+1)]:[e,`9987`],o=parseInt(a,10),s=(0,n.createSocket)(`udp4`);s.once(`error`,r),s.connect(o,i,()=>{s.off(`error`,r),this.start(s),t()})})}start(e){this.#n=e,this.#i=!1,this.#s=Date.now(),e.on(`message`,e=>{this.#s=Date.now(),this.#x(new Uint8Array(e.buffer,e.byteOffset,e.byteLength))}),e.on(`error`,e=>{this.#t.error(`udp error`,e),this.#R(e)}),e.on(`close`,()=>this.#R(null)),this.#c[r.Command]=1,this.#c[r.Init1]=101;let n=t.n(this.#e,null);n&&this.#y(r.Init1,n,0);let a=setInterval(()=>{this.#e.cryptoInitComplete&&this.sendPacket(r.Ping,new Uint8Array,i.Unencrypted)},_);this.#a=()=>clearInterval(a);let o=setInterval(()=>this.#I(),w);this.#o=()=>clearInterval(o)}receivedFinalInitAck(){this.#_=null}sendPacket(e,t,n){let i=!this.#e.cryptoInitComplete;if(t.length>487&&e!==r.Voice&&e!==r.VoiceWhisper){this.#v(e,t,n,i);return}this.#y(e,t,n,i)}sendVoicePacket(e,t){let n=this.#c[r.Voice],a=this.#l[r.Voice];this.#c[r.Voice]=n+1&65535,this.#c[r.Voice]===0&&this.#l[r.Voice]++;let o=S+e.length,s=new Uint8Array(o);new DataView(s.buffer).setUint16(0,n,!1),s[2]=t,s.set(e,S);let l=c({typeFlagged:r.Voice|i.Unencrypted,id:n,clientID:this.#r,generationID:a,data:s,receivedAt:0}),u=new Uint8Array(x+b+o);u.set(this.#e.fakeSignature,0),u.set(l,x),u.set(s,x+b),this.#b(u)}close(){this.#i||(this.#i=!0,this.#a?.(),this.#o?.(),this.#n?.close())}#v(e,t,n,r){let a=h-b-x,o=0,s=!0;for(;o<t.length;){let c=Math.min(t.length-o,a),l=o+c===t.length,u=n;s!==l&&(u|=i.Fragmented),this.#y(e,t.slice(o,o+c),u,r),o+=c,s=!1}}#y(e,t,n,r=!this.#e.cryptoInitComplete){n=E(e,n);let[a,o]=this.#P(e),s={typeFlagged:e|n,id:a,clientID:this.#r,generationID:o,data:t,receivedAt:0},l=(n&i.Unencrypted)!==0,u=c(s),[d,f]=this.#e.encrypt(e,a,o,u,t,r,l),p=new Uint8Array(x+b+d.length);p.set(f.slice(0,x),0),p.set(u,x),p.set(d,x+b),this.#b(p);let m={packet:s,firstSend:Date.now(),lastSend:Date.now(),retryCount:0,nextInterval:C};this.#F(e,s,m)}#b(e){this.#n?.send(Buffer.from(e),e=>{e&&this.#t.warn(`udp send error`,e)})}#x(e){if(e.length<11)return;let t=e.slice(0,x),n=e.slice(x,x+3),i=e.slice(x+3),o=l(n),s={...o,clientID:0,generationID:this.#S(o.id,o.typeFlagged&15),data:new Uint8Array,receivedAt:Date.now()},c=this.#C(s,n,i,t);if(c!==null){if(s.data=c.plaintext,a(s)===r.Ping){this.#E(s.id,c.dummyUsed);return}this.#w(s,c.dummyUsed)&&(this.#D(s),this.#N(s))}}#S(e,t){switch(t){case r.Command:return this.#u.getGeneration(e);case r.CommandLow:return this.#d.getGeneration(e);case r.Ack:return this.#f.getGeneration(e);case r.AckLow:return this.#p.getGeneration(e);default:return 0}}#C(e,t,n,s){let c=(o(e)&i.Unencrypted)!==0,l=!this.#e.cryptoInitComplete,u=l,d=a(e),f=e.generationID;try{return{plaintext:this.#e.decrypt(d,e.id,f,t,n,s,l,c),dummyUsed:u}}catch{for(let r of[-1,1]){let i=f+r;if(!(i<0))try{return{plaintext:this.#e.decrypt(d,e.id,i,t,n,s,!1,!1),dummyUsed:!1}}catch{}}if(d===r.Command||d===r.CommandLow||d===r.Ack)try{return{plaintext:this.#e.decrypt(d,e.id,f,t,n,s,!0,c),dummyUsed:!0}}catch{}return null}}#w(e,t){let n=a(e);if(n!==r.Command&&n!==r.CommandLow)return!0;let i=n===r.Command?this.#u:this.#d,o=n===r.Command?r.Ack:r.AckLow;return i.isInWindow(e.id)?(this.#T(e.id,o,t),!0):(i.isOldPacket(e.id)&&this.#T(e.id,o,t),!1)}#T(e,t,n){let r=new Uint8Array(2);new DataView(r.buffer).setUint16(0,e,!1),this.#y(t,r,0,n)}#E(e,t){let n=new Uint8Array(2);new DataView(n.buffer).setUint16(0,e,!1),this.#y(r.Pong,n,i.Unencrypted,t)}#D(e){let t=a(e);if(t!==r.Command&&t!==r.CommandLow){this.onPacket?.(e);return}let n=t===r.Command,i=n?this.#m:this.#h,o=n?this.#u:this.#d;for(i.set(e.id,e),n?this.#A(i,o,!0):this.#A(i,o,!1);;){let e=n?this.#O:this.#k,t=i.get(e);if(t===void 0)break;let r=this.#j(t,i,e,o);if(!r)break;let[a,s]=r;n?this.#O=s:this.#k=s,this.#M(a),this.onPacket?.(a)}}#O=0;#k=0;#A(e,t,n){let r=n?this.#O:this.#k;for(;!e.has(r)&&D(e,r);)r=r+1&65535,t.advance(1);n?this.#O=r:this.#k=r}#j(e,t,n,r){if((o(e)&i.Fragmented)===0)return t.delete(n),r.advance(1),[e,n+1&65535];let a=[],s=0,c=n,l=!1,u=!1;for(;;){let e=t.get(c);if(!e)return null;a.push(e),s+=e.data.length;let n=(o(e)&i.Fragmented)!==0;if(!l){if(l=!0,!n){u=!0;break}}else if(n){u=!0;break}c=c+1&65535}if(!u)return null;let d=new Uint8Array(s),f=0;for(let e of a)d.set(e.data,f),f+=e.data.length,t.delete(n),r.advance(1),n=n+1&65535;return e.data=d,e.typeFlagged&=~i.Fragmented,[e,n]}#M(e){if((o(e)&i.Compressed)!==0)try{e.data=new p().decompress(e.data),e.typeFlagged&=~i.Compressed}catch(t){this.#t.debug(`decompression failed`,{id:e.id,err:t})}}#N(e){let t=a(e);if(t===r.Init1){this.#_=null;return}if((t===r.Ack||t===r.AckLow)&&e.data.length>=2){let n=new DataView(e.data.buffer,e.data.byteOffset).getUint16(0,!1),i=(t===r.Ack?r.Command:r.CommandLow)<<16|n;this.#g.delete(i)}}#P(e){let t=this.#c[e],n=this.#l[e];return e===r.Init1?[t,n]:(this.#c[e]=t+1&65535,this.#c[e]===0&&(this.#l[e]=n+1>>>0),e===r.Command?this.#f.advanceToExcluded(t):e===r.CommandLow&&this.#p.advanceToExcluded(t),[t,n])}#F(e,t,n){if(e===r.Init1){this.#_=n;return}if(e===r.Command||e===r.CommandLow){let r=e<<16|t.id;this.#g.set(r,n)}}#I(){let e=Date.now();if(e-this.#s>v){this.#t.warn(`idle timeout`),this.#R(Error(`idle timeout`));return}this.#_&&this.#L(this.#_,e);for(let[t,n]of this.#g){if(e-n.firstSend>v){this.#g.delete(t),this.#R(Error(`packet ack timeout`));return}this.#L(n,e)}}#L(e,t){if(t-e.lastSend<e.nextInterval)return;e.lastSend=t,e.retryCount++,e.nextInterval=Math.min(e.nextInterval*2,y);let n=!this.#e.cryptoInitComplete,r=(o(e.packet)&i.Unencrypted)!==0,s=c(e.packet),l=a(e.packet),[u,d]=this.#e.encrypt(l,e.packet.id,e.packet.generationID,s,e.packet.data,n,r),f=new Uint8Array(x+b+u.length);f.set(d.slice(0,x),0),f.set(s,x),f.set(u,x+b),this.#b(f)}#R(e){this.#i||(this.close(),this.onClosed?.(e))}};function E(e,t){return e===r.Command||e===r.CommandLow?t|i.NewProtocol:t}function D(e,t){let n=Date.now();for(let[r,i]of e)if((r-t+65536&65535)<32768&&n-i.receivedAt>5e3)return!0;return!1}Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return r}}),Object.defineProperty(exports,`c`,{enumerable:!0,get:function(){return o}}),Object.defineProperty(exports,`d`,{enumerable:!0,get:function(){return l}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return i}}),Object.defineProperty(exports,`l`,{enumerable:!0,get:function(){return a}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return p}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return c}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return d}}),Object.defineProperty(exports,`s`,{enumerable:!0,get:function(){return s}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return T}}),Object.defineProperty(exports,`u`,{enumerable:!0,get:function(){return u}});
|
|
2
|
-
//# sourceMappingURL=handler-CqCD93f0.cjs.map
|