@honeybbq/teamspeak-client 0.0.0 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +208 -0
- package/dist/api.d.ts +17 -0
- package/dist/api.d.ts.map +1 -0
- package/dist/client.d.ts +39 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/command/command.d.ts +12 -0
- package/dist/command/command.d.ts.map +1 -0
- package/dist/command/command.test.d.ts +2 -0
- package/dist/command/command.test.d.ts.map +1 -0
- package/dist/command/index.cjs +1 -0
- package/dist/command/index.d.ts +4 -0
- package/dist/command/index.d.ts.map +1 -0
- package/dist/command/index.mjs +3 -0
- package/dist/command/parser.d.ts +3 -0
- package/dist/command/parser.d.ts.map +1 -0
- package/dist/command-Cu2v-5-K.cjs +4 -0
- package/dist/command-Cu2v-5-K.cjs.map +1 -0
- package/dist/command-caXc4h0n.js +76 -0
- package/dist/command-caXc4h0n.js.map +1 -0
- package/dist/commands.d.ts +48 -0
- package/dist/commands.d.ts.map +1 -0
- package/dist/crypt-handshake-CHmvZ2qs.js +55 -0
- package/dist/crypt-handshake-CHmvZ2qs.js.map +1 -0
- package/dist/crypt-handshake-Dbj2cSBZ.cjs +2 -0
- package/dist/crypt-handshake-Dbj2cSBZ.cjs.map +1 -0
- package/dist/crypt-init2-BIbQ7TN0.cjs +2 -0
- package/dist/crypt-init2-BIbQ7TN0.cjs.map +1 -0
- package/dist/crypt-init2-C63eypta.js +165 -0
- package/dist/crypt-init2-C63eypta.js.map +1 -0
- package/dist/crypto/crypt-ops.d.ts +7 -0
- package/dist/crypto/crypt-ops.d.ts.map +1 -0
- package/dist/crypto/crypt.d.ts +22 -0
- package/dist/crypto/crypt.d.ts.map +1 -0
- package/dist/crypto/eax.d.ts +12 -0
- package/dist/crypto/eax.d.ts.map +1 -0
- package/dist/crypto/eax.test.d.ts +2 -0
- package/dist/crypto/eax.test.d.ts.map +1 -0
- package/dist/crypto/identity.d.ts +18 -0
- package/dist/crypto/identity.d.ts.map +1 -0
- package/dist/crypto/identity.test.d.ts +2 -0
- package/dist/crypto/identity.test.d.ts.map +1 -0
- package/dist/crypto/index.cjs +1 -0
- package/dist/crypto/index.d.ts +6 -0
- package/dist/crypto/index.d.ts.map +1 -0
- package/dist/crypto/index.mjs +3 -0
- package/dist/crypto/primitives.d.ts +28 -0
- package/dist/crypto/primitives.d.ts.map +1 -0
- package/dist/crypto-C3gBJkh2.cjs +2 -0
- package/dist/crypto-C3gBJkh2.cjs.map +1 -0
- package/dist/crypto-IGJlkTAl.js +165 -0
- package/dist/crypto-IGJlkTAl.js.map +1 -0
- package/dist/discovery/index.cjs +1 -0
- package/dist/discovery/index.d.ts +2 -0
- package/dist/discovery/index.d.ts.map +1 -0
- package/dist/discovery/index.mjs +2 -0
- package/dist/discovery/resolver.d.ts +8 -0
- package/dist/discovery/resolver.d.ts.map +1 -0
- package/dist/errors.d.ts +34 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/events.d.ts +10 -0
- package/dist/events.d.ts.map +1 -0
- package/dist/handler-C2vxlHYC.js +458 -0
- package/dist/handler-C2vxlHYC.js.map +1 -0
- package/dist/handler-DQteUMKT.cjs +2 -0
- package/dist/handler-DQteUMKT.cjs.map +1 -0
- package/dist/handshake/crypt-handshake.d.ts +8 -0
- package/dist/handshake/crypt-handshake.d.ts.map +1 -0
- package/dist/handshake/crypt-init2.d.ts +7 -0
- package/dist/handshake/crypt-init2.d.ts.map +1 -0
- package/dist/handshake/index.cjs +1 -0
- package/dist/handshake/index.d.ts +4 -0
- package/dist/handshake/index.d.ts.map +1 -0
- package/dist/handshake/index.mjs +3 -0
- package/dist/handshake/license.d.ts +28 -0
- package/dist/handshake/license.d.ts.map +1 -0
- package/dist/handshake.d.ts +9 -0
- package/dist/handshake.d.ts.map +1 -0
- package/dist/helpers.d.ts +14 -0
- package/dist/helpers.d.ts.map +1 -0
- package/dist/helpers.test.d.ts +2 -0
- package/dist/helpers.test.d.ts.map +1 -0
- package/dist/index.cjs +2 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.mjs +761 -0
- package/dist/index.mjs.map +1 -0
- package/dist/integration.test.d.ts +12 -0
- package/dist/integration.test.d.ts.map +1 -0
- package/dist/notifications.d.ts +32 -0
- package/dist/notifications.d.ts.map +1 -0
- package/dist/notifications.test.d.ts +2 -0
- package/dist/notifications.test.d.ts.map +1 -0
- package/dist/parser-CJjP3LlO.js +33 -0
- package/dist/parser-CJjP3LlO.js.map +1 -0
- package/dist/parser-DhAWj-TI.cjs +2 -0
- package/dist/parser-DhAWj-TI.cjs.map +1 -0
- package/dist/primitives-BxtDMP7x.cjs +2 -0
- package/dist/primitives-BxtDMP7x.cjs.map +1 -0
- package/dist/primitives-CmIK1O7L.js +1836 -0
- package/dist/primitives-CmIK1O7L.js.map +1 -0
- package/dist/resolver-DDZWomrF.js +165 -0
- package/dist/resolver-DDZWomrF.js.map +1 -0
- package/dist/resolver-Dey6omBe.cjs +4 -0
- package/dist/resolver-Dey6omBe.cjs.map +1 -0
- package/dist/throttle.d.ts +11 -0
- package/dist/throttle.d.ts.map +1 -0
- package/dist/throttle.test.d.ts +2 -0
- package/dist/throttle.test.d.ts.map +1 -0
- package/dist/transfer.d.ts +34 -0
- package/dist/transfer.d.ts.map +1 -0
- package/dist/transport/generation-window.d.ts +15 -0
- package/dist/transport/generation-window.d.ts.map +1 -0
- package/dist/transport/generation-window.test.d.ts +2 -0
- package/dist/transport/generation-window.test.d.ts.map +1 -0
- package/dist/transport/handler.d.ts +18 -0
- package/dist/transport/handler.d.ts.map +1 -0
- package/dist/transport/index.cjs +1 -0
- package/dist/transport/index.d.ts +6 -0
- package/dist/transport/index.d.ts.map +1 -0
- package/dist/transport/index.mjs +2 -0
- package/dist/transport/packet.d.ts +36 -0
- package/dist/transport/packet.d.ts.map +1 -0
- package/dist/transport/packet.test.d.ts +2 -0
- package/dist/transport/packet.test.d.ts.map +1 -0
- package/dist/transport/quicklz.d.ts +5 -0
- package/dist/transport/quicklz.d.ts.map +1 -0
- package/dist/transport/quicklz.test.d.ts +2 -0
- package/dist/transport/quicklz.test.d.ts.map +1 -0
- package/dist/types-CGKgXvpG.js +18 -0
- package/dist/types-CGKgXvpG.js.map +1 -0
- package/dist/types-DrnoCdSW.cjs +2 -0
- package/dist/types-DrnoCdSW.cjs.map +1 -0
- package/dist/types.d.ts +114 -0
- package/dist/types.d.ts.map +1 -0
- package/package.json +87 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["#pending","#nextRC","#welcomeComplete","#buffer","#pending","#nextID","#lastUpdate","#tokens","#identity","#addr","#resolver","#handlePacket","#handleConnectionClosed","#cmdMiddlewares","#eventMiddlewares","#finalCmdHandler","#buildCmdHandler","#finalEvtHandler","#buildEvtHandler","#status","#resetForConnect","#resolveAddr","#disconnectedHandlers","#connectedResolvers","#throttle","#cmdTrack","#textMsgHandlers","#clientEnterHandlers","#clientLeaveHandlers","#clientMoveHandlers","#pokedHandlers","#voiceDataHandlers","#connectedHandlers","#kickedHandlers","#clients","#ftTrack","#handlePacketSync","#handleVoicePacket","#handleCommandLines","#handleCommandStr","#processNotificationResult","#handleError","#dispatchEvent","#dispatchEventDirect"],"sources":["../src/commands.ts","../src/transfer.ts","../src/events.ts","../src/handshake.ts","../src/helpers.ts","../src/notifications.ts","../src/throttle.ts","../src/client.ts","../src/api.ts"],"sourcesContent":["import { ServerError } from \"./errors.js\";\n\nexport interface CommandResult {\n err: Error | null;\n data: Record<string, string>[];\n}\n\n/**\n * Tracks in-flight commands by return_code.\n *\n * The TS3/TS5 server sends a \"welcome sequence\" of unsolicited data immediately\n * after the connection handshake (channellist, channelclientlist, etc.). This\n * data arrives on the event loop AFTER we may have registered our first pending\n * RC, which would contaminate our command responses.\n *\n * Solution: gate all row buffering on a `#welcomeComplete` flag. The flag is\n * set when `notifycliententerview` for our own clid arrives — the last event\n * the TS3/TS5 server sends in its welcome sequence. Any data arriving before\n * that is silently discarded.\n */\nexport class CommandTracker {\n readonly #pending = new Map<number, (result: CommandResult) => void>();\n #nextRC = 0;\n #buffer: Record<string, string>[] = [];\n\n /**\n * Set to true when we receive `notifycliententerview` for our own clid,\n * which marks the end of the server's welcome sequence.\n */\n #welcomeComplete = false;\n\n register(): [rc: number, promise: Promise<CommandResult>] {\n this.#nextRC++;\n const rc = this.#nextRC;\n const promise = new Promise<CommandResult>((resolve) => {\n this.#pending.set(rc, resolve);\n });\n return [rc, promise];\n }\n\n unregister(rc: number): void {\n this.#pending.delete(rc);\n }\n\n /**\n * Called when `notifycliententerview` for our own clid arrives.\n * Marks the welcome sequence as complete and discards any accumulated data.\n */\n signalWelcomeComplete(): void {\n this.#welcomeComplete = true;\n this.#buffer = [];\n }\n\n /**\n * Buffer a data row from the server. Rows arriving before the welcome\n * sequence is complete are silently discarded to prevent contamination.\n */\n buffer(params: Record<string, string>): void {\n if (!this.#welcomeComplete) return;\n if (this.#pending.size === 0) return;\n this.#buffer.push(params);\n }\n\n resolve(rc: number, err: Error | null): void {\n const resolve = this.#pending.get(rc);\n if (!resolve) {\n this.#buffer = [];\n return;\n }\n const data = this.#buffer;\n this.#buffer = [];\n this.#pending.delete(rc);\n resolve({ err, data });\n }\n\n discardBuffer(): void {\n this.#buffer = [];\n }\n\n reset(): void {\n this.#pending.clear();\n this.#buffer = [];\n this.#welcomeComplete = false;\n this.#nextRC = 0;\n }\n}\n\n/**\n * Parse and handle an `error` command from the server.\n * Returns the error (or null on success) and the resolved return_code.\n */\nexport function parseServerError(params: Record<string, string>): {\n err: Error | null;\n rc: number | null;\n} {\n const id = params[\"id\"] ?? \"0\";\n const msg = params[\"msg\"] ?? \"\";\n const rcStr = params[\"return_code\"];\n\n let err: Error | null = null;\n if (id !== \"0\") {\n err = new ServerError(id, msg);\n }\n\n let rc: number | null = null;\n if (rcStr !== undefined && rcStr !== \"\") {\n const parsed = parseInt(rcStr, 10);\n if (!isNaN(parsed)) rc = parsed;\n }\n\n return { err, rc };\n}\n\n/**\n * Append a return_code parameter to a command string if not already present.\n */\nexport function appendReturnCode(cmd: string, rc: number): string {\n if (cmd.includes(\"return_code=\")) return cmd;\n return `${cmd} return_code=${rc}`;\n}\n","import { createConnection } from \"node:net\";\nimport type { Readable, Writable } from \"node:stream\";\nimport type { FileUploadInfo, FileDownloadInfo } from \"./types.js\";\nimport { FileTransferError, FileTransferTimeoutError } from \"./errors.js\";\nimport { buildCommand } from \"./command/command.js\";\n\nexport interface FileTransferTracker {\n register(): [\n cftid: number,\n promise: Promise<\n FileUploadInfo | FileDownloadInfo | import(\"./types.js\").FileTransferStatusInfo\n >,\n ];\n unregister(cftid: number): void;\n notify(\n cftid: number,\n value: FileUploadInfo | FileDownloadInfo | import(\"./types.js\").FileTransferStatusInfo,\n ): void;\n reset(): void;\n}\n\ntype FtNotification =\n | FileUploadInfo\n | FileDownloadInfo\n | import(\"./types.js\").FileTransferStatusInfo;\n\nexport class FileTransferTracker {\n readonly #pending = new Map<number, (v: FtNotification) => void>();\n #nextID = 0;\n\n register(): [cftid: number, promise: Promise<FtNotification>] {\n this.#nextID++;\n if (this.#nextID > 65535) this.#nextID = 1;\n const cftid = this.#nextID;\n const promise = new Promise<FtNotification>((resolve) => {\n this.#pending.set(cftid, resolve);\n });\n return [cftid, promise];\n }\n\n unregister(cftid: number): void {\n this.#pending.delete(cftid);\n }\n\n notify(cftid: number, value: FtNotification): void {\n const resolve = this.#pending.get(cftid);\n if (resolve) resolve(value);\n }\n\n reset(): void {\n this.#pending.clear();\n this.#nextID = 0;\n }\n}\n\n/**\n * Open a TCP connection to the TS3 file transfer port and perform the\n * ftkey handshake. The caller is responsible for closing the socket.\n */\nexport function dialFileTransfer(\n host: string,\n port: number,\n key: string,\n): Promise<import(\"node:net\").Socket> {\n return new Promise((resolve, reject) => {\n const socket = createConnection({ host, port }, () => {\n socket.write(key, (err) => {\n if (err) {\n socket.destroy();\n reject(new FileTransferError(`failed to send transfer key: ${err.message}`));\n } else {\n resolve(socket);\n }\n });\n });\n socket.setTimeout(10_000);\n socket.once(\"error\", reject);\n socket.once(\"timeout\", () => {\n socket.destroy();\n reject(new FileTransferError(\"connection timeout\"));\n });\n });\n}\n\n/** Upload data via a TS3 file transfer connection. */\nexport async function uploadFileData(\n host: string,\n info: FileUploadInfo,\n data: Readable,\n): Promise<void> {\n const socket = await dialFileTransfer(host, info.port, info.fileTransferKey);\n await new Promise<void>((resolve, reject) => {\n data.pipe(socket);\n socket.on(\"finish\", resolve);\n socket.on(\"error\", reject);\n });\n}\n\n/** Download data via a TS3 file transfer connection. */\nexport async function downloadFileData(\n host: string,\n info: FileDownloadInfo,\n dest: Writable,\n): Promise<void> {\n const socket = await dialFileTransfer(host, info.port, info.fileTransferKey);\n await new Promise<void>((resolve, reject) => {\n socket.pipe(dest);\n dest.on(\"finish\", resolve);\n socket.on(\"error\", reject);\n dest.on(\"error\", reject);\n });\n}\n\n/**\n * Build a ftinitupload command string.\n */\nexport function buildFtInitUpload(\n channelID: bigint,\n path: string,\n password: string,\n size: bigint,\n cftid: number,\n overwrite: boolean,\n): string {\n const targetPath = path.startsWith(\"/\") ? path : `/${path}`;\n return buildCommand(\"ftinitupload\", {\n cid: String(channelID),\n name: targetPath,\n cpw: password,\n size: String(size),\n clientftfid: String(cftid),\n overwrite: overwrite ? \"1\" : \"0\",\n resume: \"0\",\n });\n}\n\n/**\n * Build a ftinitdownload command string.\n */\nexport function buildFtInitDownload(\n channelID: bigint,\n path: string,\n password: string,\n cftid: number,\n): string {\n const targetPath = path.startsWith(\"/\") ? path : `/${path}`;\n return buildCommand(\"ftinitdownload\", {\n cid: String(channelID),\n name: targetPath,\n cpw: password,\n clientftfid: String(cftid),\n seekpos: \"0\",\n });\n}\n\nexport { FileTransferError, FileTransferTimeoutError };\n","import type { EventMap, CommandMiddleware, EventMiddleware } from \"./types.js\";\n\ntype EventHandler<K extends keyof EventMap> = EventMap[K] extends void\n ? () => void\n : (payload: EventMap[K]) => void;\n\nexport type { EventHandler };\n\n/**\n * Compose a chain of middlewares around a base handler.\n * Rightmost middleware wraps the base first.\n */\nexport function buildCommandChain(\n middlewares: CommandMiddleware[],\n base: (cmd: string) => Promise<void>,\n): (cmd: string) => Promise<void> {\n let handler = base;\n for (let i = middlewares.length - 1; i >= 0; i--) {\n handler = middlewares[i]!(handler);\n }\n return handler;\n}\n\nexport function buildEventChain(\n middlewares: EventMiddleware[],\n base: (evt: EventMap[keyof EventMap]) => void,\n): (evt: EventMap[keyof EventMap]) => void {\n let handler = base;\n for (let i = middlewares.length - 1; i >= 0; i--) {\n handler = middlewares[i]!(handler);\n }\n return handler;\n}\n","import { createHash } from \"node:crypto\";\nimport { buildCommandOrdered, buildCommand } from \"./command/command.js\";\nimport { sign, generateTemporaryKey } from \"./crypto/primitives.js\";\nimport { cryptoInit2 } from \"./handshake/crypt-init2.js\";\nimport { PacketType } from \"./transport/packet.js\";\nimport type { Client } from \"./client.js\";\n\n/** Handle the `clientinitiv` message (P-256 based crypto path). */\nexport function handleHandshakeInitIV(client: Client, params: Record<string, string>): void {\n const alpha = params[\"alpha\"] ?? \"\";\n const beta = params[\"beta\"] ?? \"\";\n const omega = params[\"omega\"] ?? \"\";\n\n client.crypt.initCrypto(alpha, beta, omega);\n client.logger.info(\"crypto initialized (P-256 path), sending clientinit\");\n sendClientInit(client);\n}\n\n/** Handle the `initivexpand2` message (Ed25519 / TS3 crypto path). */\nexport function handleHandshakeExpand2(client: Client, params: Record<string, string>): void {\n client.logger.info(\"received initivexpand2\");\n client.handler.receivedFinalInitAck();\n\n const license = params[\"l\"] ?? \"\";\n const omega = params[\"omega\"] ?? \"\";\n const proof = params[\"proof\"] ?? \"\";\n const beta = params[\"beta\"] ?? \"\";\n\n const privateKey = sendClientEkPacket(client, beta);\n cryptoInit2(client.crypt, license, omega, proof, beta, privateKey);\n sendClientInit(client);\n}\n\n/** Handle `initserver` — marks the client as connected. */\nexport function handleInitServer(client: Client, params: Record<string, string>): void {\n const idStr = params[\"aclid\"] ?? params[\"clid\"] ?? \"\";\n const clid = idStr ? parseInt(idStr, 10) : 0;\n\n if (clid > 0) {\n client.clid = clid;\n client.handler.setClientID(clid);\n }\n\n client.logger.info(\"connected to server\", { selfId: client.clid });\n client._markConnected();\n\n // Inform the server about mute state\n setImmediate(() => {\n const updateCmd = buildCommand(\"clientupdate\", {\n client_input_muted: \"0\",\n client_output_muted: \"0\",\n });\n client.sendCommandNoWait(updateCmd).catch(() => {});\n });\n}\n\nfunction sendClientEkPacket(client: Client, beta: string): Uint8Array {\n const [publicKey, privateKey] = generateTemporaryKey();\n const ekBase64 = Buffer.from(publicKey).toString(\"base64\");\n const clientProof = buildClientEkProof(client, publicKey, beta);\n\n const clientEk = buildCommandOrdered(\"clientek\", [\n [\"ek\", ekBase64],\n [\"proof\", clientProof],\n ]);\n client.handler.sendPacket(PacketType.Command, Buffer.from(clientEk), 0);\n return privateKey;\n}\n\nfunction buildClientEkProof(client: Client, publicKey: Uint8Array, beta: string): string {\n const betaBytes = Buffer.from(beta, \"base64\");\n const toSign = new Uint8Array(86);\n toSign.set(publicKey.slice(0, 32));\n toSign.set(betaBytes.slice(0, Math.min(54, betaBytes.length)), 32);\n const sig = sign(client.crypt.identity.privateKey, toSign);\n return Buffer.from(sig).toString(\"base64\");\n}\n\nexport function sendClientInit(client: Client): void {\n const pubKeyBase64 = client.crypt.identity.publicKeyBase64();\n const hash = createHash(\"sha256\").update(pubKeyBase64).digest();\n const hwid = hash.slice(0, 16).toString(\"base64\");\n\n const cmd = buildCommandOrdered(\"clientinit\", [\n [\"client_nickname\", client.nickname],\n [\"client_version\", \"3.5.3 [Build: 1587971024]\"],\n [\"client_platform\", \"Windows\"],\n [\"client_input_hardware\", \"1\"],\n [\"client_output_hardware\", \"1\"],\n [\"client_default_channel\", \"\"],\n [\"client_default_channel_password\", \"\"],\n [\"client_server_password\", \"\"],\n [\"client_meta_data\", \"\"],\n [\n \"client_version_sign\",\n \"Kvmj7qX6wJCPI5GVT71samfmhz/bvs7M+OTXWB/JWxdQbxDe17xda7dzUWLX7pjvdJTqZmbse1HBmTxThPKvAg==\",\n ],\n [\"client_key_offset\", String(client.crypt.identity.offset)],\n [\"client_nickname_phonetic\", \"\"],\n [\"client_default_token\", \"\"],\n [\"hwid\", hwid],\n ]);\n\n client.handler.sendPacket(PacketType.Command, Buffer.from(cmd), 0);\n}\n","export function parseUint64(s: string): bigint {\n if (s === \"\" || s === undefined) return 0n;\n try {\n return BigInt(s);\n } catch {\n return 0n;\n }\n}\n\nexport function parseUint16(s: string): number {\n const v = parseInt(s, 10);\n if (isNaN(v) || v < 0 || v > 65535) return 0;\n return v;\n}\n\nexport function parseInt10(s: string): number {\n const v = parseInt(s, 10);\n return isNaN(v) ? 0 : v;\n}\n\n/**\n * Reports whether `actual` equals `expected` or equals `expected` followed by\n * only digits — the pattern TeamSpeak uses when a nickname is already taken.\n */\nexport function isAutoNicknameMatch(expected: string, actual: string): boolean {\n if (actual === expected) return true;\n if (!actual.startsWith(expected)) return false;\n const suffix = actual.slice(expected.length);\n return /^\\d+$/.test(suffix);\n}\n\n/**\n * Expand a pipe-separated multi-row TS3 command line into individual rows,\n * each prefixed with the command name.\n */\nexport function splitCommandRows(line: string): string[] {\n const spaceIdx = line.indexOf(\" \");\n if (spaceIdx < 0) return [line];\n\n const name = line.slice(0, spaceIdx);\n const rest = line.slice(spaceIdx + 1);\n\n if (!rest.includes(\"|\")) return [line];\n\n const parts = rest.split(\"|\");\n const rows: string[] = [];\n for (const part of parts) {\n if (part !== \"\") rows.push(`${name} ${part}`);\n }\n return rows.length === 0 ? [line] : rows;\n}\n","import type { Command } from \"./command/command.js\";\nimport { unescape } from \"./command/command.js\";\nimport type {\n ClientInfo,\n ClientLeftViewEvent,\n ClientMovedEvent,\n TextMessage,\n PokeEvent,\n FileUploadInfo,\n FileDownloadInfo,\n FileTransferStatusInfo,\n} from \"./types.js\";\nimport { parseUint64, parseUint16, parseInt10 } from \"./helpers.js\";\n\nexport type NotificationResult =\n | { kind: \"clientEnter\"; info: ClientInfo }\n | { kind: \"clientLeave\"; event: ClientLeftViewEvent; isSelf: boolean }\n | { kind: \"clientMoved\"; event: ClientMovedEvent }\n | { kind: \"textMessage\"; message: TextMessage }\n | { kind: \"poked\"; event: PokeEvent }\n | { kind: \"startUpload\"; info: FileUploadInfo }\n | { kind: \"startDownload\"; info: FileDownloadInfo }\n | { kind: \"fileTransferStatus\"; info: FileTransferStatusInfo }\n | { kind: \"unknown\" };\n\nexport function handleNotification(\n cmd: Command,\n selfCLID: number,\n clients: Map<number, ClientInfo>,\n nickname: string,\n): NotificationResult {\n switch (cmd.name) {\n case \"notifycliententerview\":\n return handleClientEnterView(cmd, clients, nickname);\n case \"notifyclientleftview\":\n return handleClientLeftView(cmd, selfCLID, clients);\n case \"notifyclientmoved\":\n return handleClientMoved(cmd, clients);\n case \"notifytextmessage\":\n return handleTextMessage(cmd, clients);\n case \"notifyclientpoke\":\n return handleClientPoked(cmd);\n case \"notifystartupload\":\n return { kind: \"startUpload\", info: handleStartUpload(cmd) };\n case \"notifystartdownload\":\n return { kind: \"startDownload\", info: handleStartDownload(cmd) };\n case \"notifystatusfiletransfer\":\n return { kind: \"fileTransferStatus\", info: handleFileTransferStatus(cmd) };\n default:\n return { kind: \"unknown\" };\n }\n}\n\nfunction handleClientEnterView(\n cmd: Command,\n clients: Map<number, ClientInfo>,\n nickname: string,\n): NotificationResult {\n const clid = parseUint16(cmd.params[\"clid\"] ?? \"\");\n const cid = parseUint64(cmd.params[\"cid\"] ?? \"\");\n const clientType = parseInt10(cmd.params[\"client_type\"] ?? \"\");\n const groupsStr = cmd.params[\"client_servergroups\"] ?? \"\";\n\n const info: ClientInfo = {\n id: clid,\n nickname: cmd.params[\"client_nickname\"] ?? \"\",\n uid: cmd.params[\"client_unique_identifier\"] ?? \"\",\n channelID: cid,\n type: clientType,\n serverGroups: groupsStr ? groupsStr.split(\",\") : [],\n };\n\n if (clid !== 0) {\n clients.set(clid, info);\n }\n\n return { kind: \"clientEnter\", info };\n}\n\nfunction handleClientLeftView(\n cmd: Command,\n selfCLID: number,\n clients: Map<number, ClientInfo>,\n): NotificationResult {\n const clid = parseUint16(cmd.params[\"clid\"] ?? \"\");\n const reasonID = parseInt10(cmd.params[\"reasonid\"] ?? \"\");\n\n const isSelf = clid === selfCLID;\n if (clid !== 0) clients.delete(clid);\n\n return {\n kind: \"clientLeave\",\n event: {\n id: clid,\n reasonID,\n reasonMsg: cmd.params[\"reasonmsg\"] ?? \"\",\n targetID: parseUint16(cmd.params[\"targetid\"] ?? \"\"),\n },\n isSelf,\n };\n}\n\nfunction handleClientMoved(cmd: Command, clients: Map<number, ClientInfo>): NotificationResult {\n const clid = parseUint16(cmd.params[\"clid\"] ?? \"\");\n const ctid = parseUint64(cmd.params[\"ctid\"] ?? \"\");\n\n if (clid !== 0) {\n const existing = clients.get(clid);\n if (existing) clients.set(clid, { ...existing, channelID: ctid });\n }\n\n return {\n kind: \"clientMoved\",\n event: {\n id: clid,\n targetChannelID: ctid,\n reasonID: parseInt10(cmd.params[\"reasonid\"] ?? \"\"),\n invokerID: parseUint16(cmd.params[\"invokerid\"] ?? \"\"),\n invokerName: cmd.params[\"invokername\"] ?? \"\",\n invokerUID: cmd.params[\"invokeruid\"] ?? \"\",\n },\n };\n}\n\nfunction handleTextMessage(cmd: Command, clients: Map<number, ClientInfo>): NotificationResult {\n const invokerID = parseUint16(cmd.params[\"invokerid\"] ?? \"\");\n const invokerInfo = clients.get(invokerID);\n\n const message: TextMessage = {\n targetMode: parseInt10(cmd.params[\"targetmode\"] ?? \"\"),\n targetID: parseUint64(cmd.params[\"target\"] ?? \"\"),\n invokerID,\n invokerName: cmd.params[\"invokername\"] ?? \"\",\n invokerUID: cmd.params[\"invokeruid\"] ?? invokerInfo?.uid ?? \"\",\n message: unescape(cmd.params[\"msg\"] ?? \"\"),\n invokerGroups: invokerInfo?.serverGroups ?? [],\n };\n\n return { kind: \"textMessage\", message };\n}\n\nfunction handleStartUpload(cmd: Command): FileUploadInfo {\n return {\n clientFileTransferID: parseUint16(cmd.params[\"clientftfid\"] ?? \"\"),\n serverFileTransferID: parseUint16(cmd.params[\"serverftfid\"] ?? \"\"),\n fileTransferKey: cmd.params[\"ftkey\"] ?? \"\",\n port: parseUint16(cmd.params[\"port\"] ?? \"\"),\n seekPosition: parseUint64(cmd.params[\"seekpos\"] ?? \"\"),\n };\n}\n\nfunction handleStartDownload(cmd: Command): FileDownloadInfo {\n return {\n clientFileTransferID: parseUint16(cmd.params[\"clientftfid\"] ?? \"\"),\n serverFileTransferID: parseUint16(cmd.params[\"serverftfid\"] ?? \"\"),\n fileTransferKey: cmd.params[\"ftkey\"] ?? \"\",\n port: parseUint16(cmd.params[\"port\"] ?? \"\"),\n size: parseUint64(cmd.params[\"size\"] ?? \"\"),\n };\n}\n\nfunction handleFileTransferStatus(cmd: Command): FileTransferStatusInfo {\n return {\n clientFileTransferID: parseUint16(cmd.params[\"clientftfid\"] ?? \"\"),\n status: parseInt10(cmd.params[\"status\"] ?? \"\"),\n message: cmd.params[\"msg\"] ?? \"\",\n };\n}\n\nfunction handleClientPoked(cmd: Command): NotificationResult {\n return {\n kind: \"poked\",\n event: {\n invokerID: parseUint16(cmd.params[\"invokerid\"] ?? \"\"),\n invokerName: unescape(cmd.params[\"invokername\"] ?? \"\"),\n invokerUID: cmd.params[\"invokeruid\"] ?? \"\",\n message: unescape(cmd.params[\"msg\"] ?? \"\"),\n },\n };\n}\n","/**\n * Token-bucket limiter for outbound TS3 commands.\n * Mirrors Go's commandThrottle.\n */\nexport class CommandThrottle {\n static readonly TOKEN_RATE = 4.0; // tokens per second\n static readonly TOKEN_MAX = 8.0; // bucket capacity\n\n #tokens = 5.0;\n #lastUpdate = Date.now();\n\n async wait(signal?: AbortSignal): Promise<void> {\n while (true) {\n if (signal?.aborted) throw signal.reason as Error;\n\n const now = Date.now();\n const elapsed = (now - this.#lastUpdate) / 1000;\n this.#tokens = Math.min(\n this.#tokens + elapsed * CommandThrottle.TOKEN_RATE,\n CommandThrottle.TOKEN_MAX,\n );\n this.#lastUpdate = now;\n\n if (this.#tokens >= 1.0) {\n this.#tokens -= 1.0;\n return;\n }\n\n const waitMs = Math.ceil(((1.0 - this.#tokens) / CommandThrottle.TOKEN_RATE) * 1000) + 10;\n\n await new Promise<void>((resolve, reject) => {\n const timer = setTimeout(resolve, waitMs);\n if (signal) {\n signal.addEventListener(\n \"abort\",\n () => {\n clearTimeout(timer);\n reject(signal.reason as Error);\n },\n { once: true },\n );\n }\n });\n }\n }\n}\n","import {\n type EventMap,\n type ClientOptions,\n type CommandMiddleware,\n type EventMiddleware,\n type Logger,\n type AddrResolver,\n type ClientInfo,\n ClientStatus,\n consoleLogger,\n} from \"./types.js\";\nimport { AlreadyConnectedError } from \"./errors.js\";\nimport { Identity, Crypt } from \"./crypto/index.js\";\nimport { Resolver } from \"./discovery/resolver.js\";\nimport { PacketHandler } from \"./transport/handler.js\";\nimport { PacketType } from \"./transport/packet.js\";\nimport type { Packet } from \"./transport/packet.js\";\nimport { CommandTracker, appendReturnCode, parseServerError } from \"./commands.js\";\nimport {\n FileTransferTracker,\n buildFtInitUpload,\n buildFtInitDownload,\n dialFileTransfer,\n uploadFileData,\n downloadFileData,\n} from \"./transfer.js\";\nimport { buildCommandChain, buildEventChain } from \"./events.js\";\nimport { processInit1 } from \"./handshake/crypt-handshake.js\";\nimport { handleHandshakeInitIV, handleHandshakeExpand2, handleInitServer } from \"./handshake.js\";\nimport { handleNotification } from \"./notifications.js\";\nimport { parseCommand } from \"./command/parser.js\";\nimport { CommandThrottle } from \"./throttle.js\";\nimport { splitCommandRows, isAutoNicknameMatch } from \"./helpers.js\";\nimport type { FileUploadInfo, FileDownloadInfo } from \"./types.js\";\nimport { CommandTimeoutError, FileTransferTimeoutError, FileTransferError } from \"./errors.js\";\nimport type { Readable, Writable } from \"node:stream\";\n\nexport { ClientStatus };\n\nexport interface ClientState {\n status: ClientStatus;\n clid: number;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AnyHandler = (arg: any) => void;\n\nexport class Client {\n // Internal — accessible from handshake.ts helpers\n /** @internal */ crypt: Crypt;\n /** @internal */ handler: PacketHandler;\n /** @internal */ logger: Logger;\n /** @internal */ nickname: string;\n /** @internal */ clid = 0;\n\n #identity: Identity;\n #addr: string;\n #resolver: AddrResolver;\n #status: ClientStatus = ClientStatus.Disconnected;\n #throttle = new CommandThrottle();\n #cmdTrack = new CommandTracker();\n #ftTrack = new FileTransferTracker();\n #clients = new Map<number, ClientInfo>();\n #connectedResolvers: Array<() => void> = [];\n\n // Event handler lists\n #textMsgHandlers: Array<(msg: import(\"./types.js\").TextMessage) => void> = [];\n #clientEnterHandlers: Array<(info: ClientInfo) => void> = [];\n #clientLeaveHandlers: Array<(evt: import(\"./types.js\").ClientLeftViewEvent) => void> = [];\n #clientMoveHandlers: Array<(evt: import(\"./types.js\").ClientMovedEvent) => void> = [];\n #pokedHandlers: Array<(evt: import(\"./types.js\").PokeEvent) => void> = [];\n #voiceDataHandlers: Array<(data: import(\"./types.js\").VoiceData) => void> = [];\n #connectedHandlers: Array<() => void> = [];\n #disconnectedHandlers: Array<(err: Error | undefined) => void> = [];\n #kickedHandlers: Array<(msg: string) => void> = [];\n\n // Middleware\n #cmdMiddlewares: CommandMiddleware[] = [];\n #eventMiddlewares: EventMiddleware[] = [];\n #finalCmdHandler: (cmd: string) => Promise<void>;\n #finalEvtHandler: (evt: EventMap[keyof EventMap]) => void;\n\n constructor(identity: Identity, addr: string, nickname: string, options: ClientOptions = {}) {\n this.#identity = identity;\n this.#addr = addr;\n this.nickname = nickname;\n this.logger = options.logger ?? consoleLogger;\n this.#resolver = options.resolver ?? new Resolver(this.logger);\n\n this.crypt = new Crypt(identity);\n this.handler = new PacketHandler(this.crypt, this.logger);\n this.handler.onPacket = (p) => this.#handlePacket(p);\n this.handler.onClosed = (err) => this.#handleConnectionClosed(err);\n\n if (options.commandMiddleware) {\n this.#cmdMiddlewares.push(...options.commandMiddleware);\n }\n if (options.eventMiddleware) {\n this.#eventMiddlewares.push(...options.eventMiddleware);\n }\n\n this.#finalCmdHandler = this.#buildCmdHandler();\n this.#finalEvtHandler = this.#buildEvtHandler();\n }\n\n get status(): ClientStatus {\n return this.#status;\n }\n\n // ---- Connection -----------------------------------------------------------\n\n async connect(): Promise<void> {\n if (this.#status !== ClientStatus.Disconnected) {\n throw new AlreadyConnectedError();\n }\n\n this.#resetForConnect();\n this.#status = ClientStatus.Connecting;\n\n const targetAddr = await this.#resolveAddr();\n this.logger.info(\"connecting to server\", { address: targetAddr });\n await this.handler.connect(targetAddr);\n }\n\n async disconnect(): Promise<void> {\n if (this.#status === ClientStatus.Disconnected) return;\n\n const wasConnected = this.#status === ClientStatus.Connected;\n this.#status = ClientStatus.Disconnected;\n\n this.logger.info(\"disconnecting from server\");\n\n if (wasConnected) {\n try {\n await this.execCommand(\"clientdisconnect reasonmsg=Shutdown\", 1000);\n } catch {\n // best-effort\n }\n }\n\n this.handler.close();\n const handlers = this.#disconnectedHandlers.slice();\n for (const h of handlers) setImmediate(() => h(undefined));\n }\n\n waitConnected(signal?: AbortSignal): Promise<void> {\n if (this.#status === ClientStatus.Connected) return Promise.resolve();\n return new Promise<void>((resolve, reject) => {\n this.#connectedResolvers.push(resolve);\n if (signal) {\n signal.addEventListener(\"abort\", () => reject(signal.reason as Error), { once: true });\n }\n });\n }\n\n // ---- Commands ------------------------------------------------------------\n\n async sendCommandNoWait(cmd: string): Promise<void> {\n await this.#throttle.wait();\n await this.#finalCmdHandler(cmd);\n }\n\n async execCommand(cmd: string, timeoutMs = 10_000): Promise<void> {\n await this.execCommandWithResponse(cmd, timeoutMs);\n }\n\n async execCommandWithResponse(\n cmd: string,\n timeoutMs = 10_000,\n ): Promise<Record<string, string>[]> {\n const [rc, promise] = this.#cmdTrack.register();\n const withRc = appendReturnCode(cmd, rc);\n\n try {\n await this.#throttle.wait();\n await this.#finalCmdHandler(withRc);\n } catch (err) {\n this.#cmdTrack.unregister(rc);\n throw err;\n }\n\n const result = await Promise.race([\n promise,\n new Promise<never>((_, reject) =>\n setTimeout(() => reject(new CommandTimeoutError(cmd)), timeoutMs),\n ),\n ]);\n\n this.#cmdTrack.unregister(rc);\n\n if (result.err) throw result.err;\n return result.data;\n }\n\n // ---- Events --------------------------------------------------------------\n\n on<K extends keyof EventMap>(\n event: K,\n handler: EventMap[K] extends void ? () => void : (payload: EventMap[K]) => void,\n ): this {\n switch (event) {\n case \"textMessage\":\n this.#textMsgHandlers.push(handler as AnyHandler);\n break;\n case \"clientEnter\":\n this.#clientEnterHandlers.push(handler as AnyHandler);\n break;\n case \"clientLeave\":\n this.#clientLeaveHandlers.push(handler as AnyHandler);\n break;\n case \"clientMoved\":\n this.#clientMoveHandlers.push(handler as AnyHandler);\n break;\n case \"poked\":\n this.#pokedHandlers.push(handler as AnyHandler);\n break;\n case \"voiceData\":\n this.#voiceDataHandlers.push(handler as AnyHandler);\n break;\n case \"connected\":\n this.#connectedHandlers.push(handler as () => void);\n break;\n case \"disconnected\":\n this.#disconnectedHandlers.push(handler as AnyHandler);\n break;\n case \"kicked\":\n this.#kickedHandlers.push(handler as AnyHandler);\n break;\n }\n return this;\n }\n\n useCommandMiddleware(...mw: CommandMiddleware[]): this {\n this.#cmdMiddlewares.push(...mw);\n this.#finalCmdHandler = this.#buildCmdHandler();\n return this;\n }\n\n useEventMiddleware(...mw: EventMiddleware[]): this {\n this.#eventMiddlewares.push(...mw);\n this.#finalEvtHandler = this.#buildEvtHandler();\n return this;\n }\n\n // ---- API shorthand -------------------------------------------------------\n\n clientID(): number {\n return this.clid;\n }\n\n channelID(): bigint {\n const info = this.#clients.get(this.clid);\n return info?.channelID ?? 0n;\n }\n\n sendVoice(data: Uint8Array, codec: number): void {\n this.handler.sendVoicePacket(data, codec);\n }\n\n // ---- File Transfer -------------------------------------------------------\n\n async fileTransferInitUpload(\n channelID: bigint,\n path: string,\n password: string,\n size: bigint,\n overwrite = false,\n ): Promise<FileUploadInfo> {\n const [cftid, ftPromise] = this.#ftTrack.register();\n const cmd = buildFtInitUpload(channelID, path, password, size, cftid, overwrite);\n\n try {\n await this.execCommand(cmd, 10_000);\n } catch (err) {\n this.#ftTrack.unregister(cftid);\n throw err;\n }\n\n const result = await Promise.race([\n ftPromise,\n new Promise<never>((_, reject) =>\n setTimeout(() => reject(new FileTransferTimeoutError()), 10_000),\n ),\n ]);\n this.#ftTrack.unregister(cftid);\n\n if (\"size\" in result) throw new FileTransferError(\"unexpected download response\");\n if (\"status\" in result) {\n const st = result as import(\"./types.js\").FileTransferStatusInfo;\n throw new FileTransferError(`${st.message} (status=${st.status})`);\n }\n return result as FileUploadInfo;\n }\n\n async fileTransferInitDownload(\n channelID: bigint,\n path: string,\n password: string,\n ): Promise<FileDownloadInfo> {\n const [cftid, ftPromise] = this.#ftTrack.register();\n const cmd = buildFtInitDownload(channelID, path, password, cftid);\n\n try {\n await this.execCommand(cmd, 10_000);\n } catch (err) {\n this.#ftTrack.unregister(cftid);\n throw err;\n }\n\n const result = await Promise.race([\n ftPromise,\n new Promise<never>((_, reject) =>\n setTimeout(() => reject(new FileTransferTimeoutError()), 10_000),\n ),\n ]);\n this.#ftTrack.unregister(cftid);\n\n if (\"seekPosition\" in result) throw new FileTransferError(\"unexpected upload response\");\n if (\"status\" in result) {\n const st = result as import(\"./types.js\").FileTransferStatusInfo;\n throw new FileTransferError(`${st.message} (status=${st.status})`);\n }\n return result as FileDownloadInfo;\n }\n\n uploadFileData(host: string, info: FileUploadInfo, data: Readable): Promise<void> {\n return uploadFileData(host, info, data);\n }\n\n downloadFileData(host: string, info: FileDownloadInfo, dest: Writable): Promise<void> {\n return downloadFileData(host, info, dest);\n }\n\n // ---- Internal (package-visible) ------------------------------------------\n\n /** @internal */\n _markConnected(): void {\n this.#status = ClientStatus.Connected;\n for (const resolve of this.#connectedResolvers) resolve();\n this.#connectedResolvers = [];\n const handlers = this.#connectedHandlers.slice();\n for (const h of handlers) setImmediate(() => h());\n }\n\n // ---- Private -------------------------------------------------------------\n\n #resetForConnect(): void {\n this.handler.close();\n this.crypt = new Crypt(this.#identity);\n this.handler = new PacketHandler(this.crypt, this.logger);\n this.handler.onPacket = (p) => this.#handlePacket(p);\n this.handler.onClosed = (err) => this.#handleConnectionClosed(err);\n this.#cmdTrack.reset();\n this.#ftTrack.reset();\n this.#clients.clear();\n this.clid = 0;\n this.#finalCmdHandler = this.#buildCmdHandler();\n }\n\n async #resolveAddr(): Promise<string> {\n const addrWithPort = this.#addr.includes(\":\") ? this.#addr : `${this.#addr}:9987`;\n try {\n const resolved = await this.#resolver.resolve(this.#addr);\n return resolved[0]?.addr ?? addrWithPort;\n } catch {\n return addrWithPort;\n }\n }\n\n #handlePacket(p: Packet): void {\n this.#handlePacketSync(p);\n }\n\n #handlePacketSync(p: Packet): void {\n const pType = p.typeFlagged & 0x0f;\n if (pType === 8 /* Init1 */) {\n const response = processInit1(this.crypt, p.data);\n if (response) {\n this.handler.sendPacket(PacketType.Init1, response, 0);\n }\n return;\n }\n\n if ((pType === 0 /* Voice */ || pType === 1) /* VoiceWhisper */ && p.data.length > 5) {\n this.#handleVoicePacket(p.data);\n return;\n }\n\n if ((pType === 2 /* Command */ || pType === 3) /* CommandLow */ && p.data.length > 0) {\n this.#handleCommandLines(Buffer.from(p.data).toString(\"utf8\"));\n }\n }\n\n /**\n * Parse an incoming S2C voice packet.\n * Format: [VId: u16] [CId: u16] [Codec: u8] [Data: var]\n */\n #handleVoicePacket(payload: Uint8Array): void {\n if (this.#voiceDataHandlers.length === 0) return;\n\n const view = new DataView(payload.buffer, payload.byteOffset, payload.byteLength);\n const clientId = view.getUint16(2, false);\n if (clientId === this.clid) return;\n\n const codec = payload[4]!;\n const data = payload.subarray(5);\n\n const voiceData: import(\"./types.js\").VoiceData = { clientId, codec, data };\n for (const h of this.#voiceDataHandlers) setImmediate(() => h(voiceData));\n }\n\n #handleCommandLines(s: string): void {\n if (!s) return;\n const lines = s.split(/[\\n\\0]/);\n for (const line of lines) {\n const trimmed = line.replace(/\\r$/, \"\");\n if (!trimmed) continue;\n for (const row of splitCommandRows(trimmed)) {\n this.#handleCommandStr(row);\n }\n }\n }\n\n #handleCommandStr(s: string): void {\n const cmd = parseCommand(s);\n if (!cmd || !cmd.name) return;\n\n if (cmd.name.startsWith(\"notify\")) {\n const result = handleNotification(cmd, this.clid, this.#clients, this.nickname);\n this.#processNotificationResult(result, cmd.params);\n return;\n }\n\n switch (cmd.name) {\n case \"clientinitiv\":\n handleHandshakeInitIV(this, cmd.params);\n break;\n case \"initivexpand2\":\n handleHandshakeExpand2(this, cmd.params);\n break;\n case \"initserver\":\n handleInitServer(this, cmd.params);\n break;\n case \"error\":\n this.#handleError(cmd.params);\n break;\n default: {\n // TS5/TS6 servers send data rows without a command-name prefix.\n // In that case our parser treats the first key=value pair as the\n // \"command name\" (e.g. name=\"clid=1827\"). Reconstruct full params.\n let params = cmd.params;\n if (cmd.name.includes(\"=\")) {\n const eqIdx = cmd.name.indexOf(\"=\");\n const k = cmd.name.slice(0, eqIdx);\n const v = cmd.name.slice(eqIdx + 1);\n params = { [k]: v, ...cmd.params };\n }\n this.#cmdTrack.buffer(params);\n break;\n }\n }\n }\n\n #handleError(params: Record<string, string>): void {\n const { err, rc } = parseServerError(params);\n if (rc !== null) {\n this.#cmdTrack.resolve(rc, err);\n } else {\n // No return_code: server is acknowledging an unsolicited command\n // (welcome-sequence channellist, no-RC commands like clientupdate, etc.).\n // Discard any rows buffered since the last resolved command.\n this.#cmdTrack.discardBuffer();\n }\n\n const id = params[\"id\"] ?? \"0\";\n if (id === \"3329\") {\n setImmediate(() => this.disconnect().catch(() => {}));\n }\n }\n\n #processNotificationResult(\n result: import(\"./notifications.js\").NotificationResult,\n _params: Record<string, string>,\n ): void {\n switch (result.kind) {\n case \"clientEnter\": {\n const info = result.info;\n if (info.id !== 0 && isAutoNicknameMatch(this.nickname, info.nickname)) {\n this.clid = info.id;\n this.handler.setClientID(info.id);\n // Our own notifycliententerview is the last event in the TS3/TS5\n // welcome sequence. Signal that it's safe to buffer command responses.\n this.#cmdTrack.signalWelcomeComplete();\n }\n this.#dispatchEvent(\"clientEnter\", info);\n break;\n }\n case \"clientLeave\": {\n this.#dispatchEvent(\"clientLeave\", result.event);\n if (result.isSelf && (result.event.reasonID === 4 || result.event.reasonID === 5)) {\n const msg = result.event.reasonMsg;\n for (const h of this.#kickedHandlers) setImmediate(() => h(msg));\n }\n break;\n }\n case \"clientMoved\":\n this.#dispatchEvent(\"clientMoved\", result.event);\n break;\n case \"textMessage\":\n this.#dispatchEvent(\"textMessage\", result.message);\n break;\n case \"poked\":\n this.#dispatchEvent(\"poked\", result.event);\n break;\n case \"startUpload\":\n this.#ftTrack.notify(result.info.clientFileTransferID, result.info);\n break;\n case \"startDownload\":\n this.#ftTrack.notify(result.info.clientFileTransferID, result.info);\n break;\n case \"fileTransferStatus\":\n this.#ftTrack.notify(result.info.clientFileTransferID, result.info);\n break;\n }\n }\n\n #dispatchEvent<K extends keyof EventMap>(event: K, payload: EventMap[K]): void {\n this.#finalEvtHandler(payload as EventMap[keyof EventMap]);\n }\n\n #dispatchEventDirect<K extends keyof EventMap>(event: K, payload: EventMap[K]): void {\n switch (event) {\n case \"textMessage\":\n for (const h of this.#textMsgHandlers)\n setImmediate(() => h(payload as import(\"./types.js\").TextMessage));\n break;\n case \"clientEnter\":\n for (const h of this.#clientEnterHandlers) setImmediate(() => h(payload as ClientInfo));\n break;\n case \"clientLeave\":\n for (const h of this.#clientLeaveHandlers)\n setImmediate(() => h(payload as import(\"./types.js\").ClientLeftViewEvent));\n break;\n case \"clientMoved\":\n for (const h of this.#clientMoveHandlers)\n setImmediate(() => h(payload as import(\"./types.js\").ClientMovedEvent));\n break;\n case \"poked\":\n for (const h of this.#pokedHandlers)\n setImmediate(() => h(payload as import(\"./types.js\").PokeEvent));\n break;\n }\n }\n\n #handleConnectionClosed(err: Error | null): void {\n if (this.#status === ClientStatus.Disconnected) return;\n this.#status = ClientStatus.Disconnected;\n const handlers = this.#disconnectedHandlers.slice();\n for (const h of handlers) setImmediate(() => h(err ?? undefined));\n }\n\n #buildCmdHandler(): (cmd: string) => Promise<void> {\n const base = async (cmd: string): Promise<void> => {\n this.handler.sendPacket(PacketType.Command, Buffer.from(cmd), 0);\n };\n return buildCommandChain(this.#cmdMiddlewares, base);\n }\n\n #buildEvtHandler(): (evt: EventMap[keyof EventMap]) => void {\n const base = (evt: EventMap[keyof EventMap]): void => {\n // Determine which event type this is by checking the shape\n if (\n evt !== null &&\n evt !== undefined &&\n typeof evt === \"object\" &&\n \"invokerName\" in evt &&\n \"message\" in evt &&\n \"targetMode\" in evt\n ) {\n this.#dispatchEventDirect(\"textMessage\", evt as EventMap[\"textMessage\"]);\n } else if (\n evt !== null &&\n evt !== undefined &&\n typeof evt === \"object\" &&\n \"invokerName\" in evt &&\n \"message\" in evt &&\n !(\"targetMode\" in evt)\n ) {\n this.#dispatchEventDirect(\"poked\", evt as EventMap[\"poked\"]);\n } else if (\n evt !== null &&\n evt !== undefined &&\n typeof evt === \"object\" &&\n \"id\" in evt &&\n \"uid\" in evt\n ) {\n this.#dispatchEventDirect(\"clientEnter\", evt as EventMap[\"clientEnter\"]);\n } else if (\n evt !== null &&\n evt !== undefined &&\n typeof evt === \"object\" &&\n \"id\" in evt &&\n \"reasonID\" in evt &&\n \"targetChannelID\" in evt\n ) {\n this.#dispatchEventDirect(\"clientMoved\", evt as EventMap[\"clientMoved\"]);\n } else if (\n evt !== null &&\n evt !== undefined &&\n typeof evt === \"object\" &&\n \"id\" in evt &&\n \"reasonID\" in evt\n ) {\n this.#dispatchEventDirect(\"clientLeave\", evt as EventMap[\"clientLeave\"]);\n }\n };\n return buildEventChain(this.#eventMiddlewares, base);\n }\n}\n","import { buildCommandOrdered, buildCommand, unescape } from \"./command/command.js\";\nimport type { ChannelInfo, ClientInfo } from \"./types.js\";\nimport type { Client } from \"./client.js\";\n\n/** Send a text message to a client (targetMode=1), channel (2), or server (3). */\nexport async function sendTextMessage(\n client: Client,\n targetMode: number,\n targetID: bigint,\n message: string,\n): Promise<void> {\n const cmd = buildCommandOrdered(\"sendtextmessage\", [\n [\"targetmode\", String(targetMode)],\n [\"target\", String(targetID)],\n [\"msg\", message],\n ]);\n await client.sendCommandNoWait(cmd);\n}\n\n/** Move a client to a different channel. */\nexport async function clientMove(\n client: Client,\n clid: number,\n channelID: bigint,\n password = \"\",\n): Promise<void> {\n const params: Array<readonly [string, string]> = [\n [\"clid\", String(clid)],\n [\"cid\", String(channelID)],\n ];\n if (password) params.push([\"cpw\", password]);\n const cmd = buildCommandOrdered(\"clientmove\", params);\n await client.execCommand(cmd, 10_000);\n}\n\n/** Send a poke message to a client. */\nexport async function poke(client: Client, clid: number, message: string): Promise<void> {\n const cmd = buildCommandOrdered(\"clientpoke\", [\n [\"clid\", String(clid)],\n [\"msg\", message],\n ]);\n await client.execCommand(cmd, 10_000);\n}\n\n/** Fetch raw clientinfo for a given clid. */\nexport async function getClientInfo(client: Client, clid: number): Promise<Record<string, string>> {\n const data = await client.execCommandWithResponse(`clientinfo clid=${clid}`, 5_000);\n const row = data[0];\n if (!row) throw new Error(`no data returned for client ${clid}`);\n return row;\n}\n\n/** List all channels on the server. */\nexport async function listChannels(client: Client): Promise<ChannelInfo[]> {\n const data = await client.execCommandWithResponse(\"channellist\", 5_000);\n return data.map((item) => ({\n id: BigInt(item[\"cid\"] ?? \"0\"),\n parentID: BigInt(item[\"pid\"] ?? \"0\"),\n name: unescape(item[\"channel_name\"] ?? \"\"),\n description: \"\",\n }));\n}\n\n/** List all clients currently connected to the server. */\nexport async function listClients(client: Client): Promise<ClientInfo[]> {\n const data = await client.execCommandWithResponse(\"clientlist -uid -away -voice -groups\", 5_000);\n return data.map((item) => {\n const groupsStr = item[\"client_servergroups\"] ?? \"\";\n return {\n id: parseInt(item[\"clid\"] ?? \"0\", 10),\n nickname: unescape(item[\"client_nickname\"] ?? \"\"),\n uid: item[\"client_unique_identifier\"] ?? \"\",\n channelID: BigInt(item[\"cid\"] ?? \"0\"),\n type: parseInt(item[\"client_type\"] ?? \"0\", 10),\n serverGroups: groupsStr ? groupsStr.split(\",\") : [],\n };\n });\n}\n\n/** Delete a file on the server. */\nexport async function fileTransferDeleteFile(\n client: Client,\n channelID: bigint,\n paths: string[],\n): Promise<void> {\n if (paths.length === 0) return;\n const pathStr = paths.join(\"|\");\n const cmd = buildCommand(\"ftdeletefile\", {\n cid: String(channelID),\n cpw: \"\",\n name: pathStr,\n });\n await client.execCommand(cmd, 10_000);\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"integration.test.d.ts","sourceRoot":"","sources":["../src/integration.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { Command } from "./command/command.js";
|
|
2
|
+
import type { ClientInfo, ClientLeftViewEvent, ClientMovedEvent, TextMessage, PokeEvent, FileUploadInfo, FileDownloadInfo, FileTransferStatusInfo } from "./types.js";
|
|
3
|
+
export type NotificationResult = {
|
|
4
|
+
kind: "clientEnter";
|
|
5
|
+
info: ClientInfo;
|
|
6
|
+
} | {
|
|
7
|
+
kind: "clientLeave";
|
|
8
|
+
event: ClientLeftViewEvent;
|
|
9
|
+
isSelf: boolean;
|
|
10
|
+
} | {
|
|
11
|
+
kind: "clientMoved";
|
|
12
|
+
event: ClientMovedEvent;
|
|
13
|
+
} | {
|
|
14
|
+
kind: "textMessage";
|
|
15
|
+
message: TextMessage;
|
|
16
|
+
} | {
|
|
17
|
+
kind: "poked";
|
|
18
|
+
event: PokeEvent;
|
|
19
|
+
} | {
|
|
20
|
+
kind: "startUpload";
|
|
21
|
+
info: FileUploadInfo;
|
|
22
|
+
} | {
|
|
23
|
+
kind: "startDownload";
|
|
24
|
+
info: FileDownloadInfo;
|
|
25
|
+
} | {
|
|
26
|
+
kind: "fileTransferStatus";
|
|
27
|
+
info: FileTransferStatusInfo;
|
|
28
|
+
} | {
|
|
29
|
+
kind: "unknown";
|
|
30
|
+
};
|
|
31
|
+
export declare function handleNotification(cmd: Command, selfCLID: number, clients: Map<number, ClientInfo>, nickname: string): NotificationResult;
|
|
32
|
+
//# sourceMappingURL=notifications.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notifications.d.ts","sourceRoot":"","sources":["../src/notifications.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAEpD,OAAO,KAAK,EACV,UAAU,EACV,mBAAmB,EACnB,gBAAgB,EAChB,WAAW,EACX,SAAS,EACT,cAAc,EACd,gBAAgB,EAChB,sBAAsB,EACvB,MAAM,YAAY,CAAC;AAGpB,MAAM,MAAM,kBAAkB,GAC1B;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,IAAI,EAAE,UAAU,CAAA;CAAE,GACzC;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,KAAK,EAAE,mBAAmB,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,GACpE;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,KAAK,EAAE,gBAAgB,CAAA;CAAE,GAChD;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,OAAO,EAAE,WAAW,CAAA;CAAE,GAC7C;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,SAAS,CAAA;CAAE,GACnC;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,IAAI,EAAE,cAAc,CAAA;CAAE,GAC7C;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,IAAI,EAAE,gBAAgB,CAAA;CAAE,GACjD;IAAE,IAAI,EAAE,oBAAoB,CAAC;IAAC,IAAI,EAAE,sBAAsB,CAAA;CAAE,GAC5D;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,CAAC;AAExB,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,OAAO,EACZ,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,EAChC,QAAQ,EAAE,MAAM,GACf,kBAAkB,CAqBpB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notifications.test.d.ts","sourceRoot":"","sources":["../src/notifications.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { i as e } from "./command-caXc4h0n.js";
|
|
2
|
+
//#region src/command/parser.ts
|
|
3
|
+
function t(t) {
|
|
4
|
+
if (t === "") return null;
|
|
5
|
+
let n = 0;
|
|
6
|
+
for (let e = 0; e < t.length; e++) {
|
|
7
|
+
let r = t.charCodeAt(e);
|
|
8
|
+
if (r >= 32 && r <= 126) {
|
|
9
|
+
n = e;
|
|
10
|
+
break;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
n > 0 && (t = t.slice(n));
|
|
14
|
+
let r = t.split(" ");
|
|
15
|
+
if (r.length === 0) return null;
|
|
16
|
+
let i = r[0] ?? "";
|
|
17
|
+
if (i === "") return null;
|
|
18
|
+
let a = {};
|
|
19
|
+
for (let t = 1; t < r.length; t++) {
|
|
20
|
+
let n = r[t];
|
|
21
|
+
if (n === void 0 || n === "") continue;
|
|
22
|
+
let i = n.indexOf("=");
|
|
23
|
+
i >= 0 ? a[e(n.slice(0, i))] = e(n.slice(i + 1)) : a[e(n)] = "";
|
|
24
|
+
}
|
|
25
|
+
return {
|
|
26
|
+
name: i,
|
|
27
|
+
params: a
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
//#endregion
|
|
31
|
+
export { t };
|
|
32
|
+
|
|
33
|
+
//# sourceMappingURL=parser-CJjP3LlO.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser-CJjP3LlO.js","names":[],"sources":["../src/command/parser.ts"],"sourcesContent":["import { unescape } from \"./command.js\";\nimport type { Command } from \"./command.js\";\n\nexport function parseCommand(s: string): Command | null {\n if (s === \"\") return null;\n\n // Skip leading non-printable bytes (< 0x20 or > 0x7E)\n let startIndex = 0;\n for (let i = 0; i < s.length; i++) {\n const code = s.charCodeAt(i);\n if (code >= 32 && code <= 126) {\n startIndex = i;\n break;\n }\n }\n if (startIndex > 0) {\n s = s.slice(startIndex);\n }\n\n const parts = s.split(\" \");\n if (parts.length === 0) return null;\n\n const name = parts[0] ?? \"\";\n if (name === \"\") return null;\n\n const params: Record<string, string> = {};\n\n for (let i = 1; i < parts.length; i++) {\n const p = parts[i];\n if (p === undefined || p === \"\") continue;\n const eqIdx = p.indexOf(\"=\");\n if (eqIdx >= 0) {\n params[unescape(p.slice(0, eqIdx))] = unescape(p.slice(eqIdx + 1));\n } else {\n params[unescape(p)] = \"\";\n }\n }\n\n return { name, params };\n}\n"],"mappings":";;AAGA,SAAgB,EAAa,GAA2B;AACtD,KAAI,MAAM,GAAI,QAAO;CAGrB,IAAI,IAAa;AACjB,MAAK,IAAI,IAAI,GAAG,IAAI,EAAE,QAAQ,KAAK;EACjC,IAAM,IAAO,EAAE,WAAW,EAAE;AAC5B,MAAI,KAAQ,MAAM,KAAQ,KAAK;AAC7B,OAAa;AACb;;;AAGJ,CAAI,IAAa,MACf,IAAI,EAAE,MAAM,EAAW;CAGzB,IAAM,IAAQ,EAAE,MAAM,IAAI;AAC1B,KAAI,EAAM,WAAW,EAAG,QAAO;CAE/B,IAAM,IAAO,EAAM,MAAM;AACzB,KAAI,MAAS,GAAI,QAAO;CAExB,IAAM,IAAiC,EAAE;AAEzC,MAAK,IAAI,IAAI,GAAG,IAAI,EAAM,QAAQ,KAAK;EACrC,IAAM,IAAI,EAAM;AAChB,MAAI,MAAM,KAAA,KAAa,MAAM,GAAI;EACjC,IAAM,IAAQ,EAAE,QAAQ,IAAI;AAC5B,EAAI,KAAS,IACX,EAAO,EAAS,EAAE,MAAM,GAAG,EAAM,CAAC,IAAI,EAAS,EAAE,MAAM,IAAQ,EAAE,CAAC,GAElE,EAAO,EAAS,EAAE,IAAI;;AAI1B,QAAO;EAAE;EAAM;EAAQ"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const e=require(`./command-Cu2v-5-K.cjs`);function t(t){if(t===``)return null;let n=0;for(let e=0;e<t.length;e++){let r=t.charCodeAt(e);if(r>=32&&r<=126){n=e;break}}n>0&&(t=t.slice(n));let r=t.split(` `);if(r.length===0)return null;let i=r[0]??``;if(i===``)return null;let a={};for(let t=1;t<r.length;t++){let n=r[t];if(n===void 0||n===``)continue;let i=n.indexOf(`=`);i>=0?a[e.i(n.slice(0,i))]=e.i(n.slice(i+1)):a[e.i(n)]=``}return{name:i,params:a}}Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return t}});
|
|
2
|
+
//# sourceMappingURL=parser-DhAWj-TI.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser-DhAWj-TI.cjs","names":[],"sources":["../src/command/parser.ts"],"sourcesContent":["import { unescape } from \"./command.js\";\nimport type { Command } from \"./command.js\";\n\nexport function parseCommand(s: string): Command | null {\n if (s === \"\") return null;\n\n // Skip leading non-printable bytes (< 0x20 or > 0x7E)\n let startIndex = 0;\n for (let i = 0; i < s.length; i++) {\n const code = s.charCodeAt(i);\n if (code >= 32 && code <= 126) {\n startIndex = i;\n break;\n }\n }\n if (startIndex > 0) {\n s = s.slice(startIndex);\n }\n\n const parts = s.split(\" \");\n if (parts.length === 0) return null;\n\n const name = parts[0] ?? \"\";\n if (name === \"\") return null;\n\n const params: Record<string, string> = {};\n\n for (let i = 1; i < parts.length; i++) {\n const p = parts[i];\n if (p === undefined || p === \"\") continue;\n const eqIdx = p.indexOf(\"=\");\n if (eqIdx >= 0) {\n params[unescape(p.slice(0, eqIdx))] = unescape(p.slice(eqIdx + 1));\n } else {\n params[unescape(p)] = \"\";\n }\n }\n\n return { name, params };\n}\n"],"mappings":"0CAGA,SAAgB,EAAa,EAA2B,CACtD,GAAI,IAAM,GAAI,OAAO,KAGrB,IAAI,EAAa,EACjB,IAAK,IAAI,EAAI,EAAG,EAAI,EAAE,OAAQ,IAAK,CACjC,IAAM,EAAO,EAAE,WAAW,EAAE,CAC5B,GAAI,GAAQ,IAAM,GAAQ,IAAK,CAC7B,EAAa,EACb,OAGA,EAAa,IACf,EAAI,EAAE,MAAM,EAAW,EAGzB,IAAM,EAAQ,EAAE,MAAM,IAAI,CAC1B,GAAI,EAAM,SAAW,EAAG,OAAO,KAE/B,IAAM,EAAO,EAAM,IAAM,GACzB,GAAI,IAAS,GAAI,OAAO,KAExB,IAAM,EAAiC,EAAE,CAEzC,IAAK,IAAI,EAAI,EAAG,EAAI,EAAM,OAAQ,IAAK,CACrC,IAAM,EAAI,EAAM,GAChB,GAAI,IAAM,IAAA,IAAa,IAAM,GAAI,SACjC,IAAM,EAAQ,EAAE,QAAQ,IAAI,CACxB,GAAS,EACX,EAAO,EAAA,EAAS,EAAE,MAAM,EAAG,EAAM,CAAC,EAAI,EAAA,EAAS,EAAE,MAAM,EAAQ,EAAE,CAAC,CAElE,EAAO,EAAA,EAAS,EAAE,EAAI,GAI1B,MAAO,CAAE,OAAM,SAAQ"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
let e=require(`node:crypto`);var t=class extends Error{constructor(e,t){super(e,t),this.name=`TeamspeakError`}},n=class extends t{id;serverMessage;constructor(e,t){super(`TeamSpeak server error: ${t} (id=${e})`),this.name=`ServerError`,this.id=e,this.serverMessage=t}},r=class extends t{command;constructor(e){super(`command timeout: ${e}`),this.name=`CommandTimeoutError`,this.command=e}},i=class extends t{constructor(){super(`already connecting or connected`),this.name=`AlreadyConnectedError`}},a=class extends t{constructor(){super(`EAX tag mismatch`),this.name=`EAXTagMismatchError`}},o=class extends t{constructor(){super(`fake signature mismatch`),this.name=`FakeSignatureMismatchError`}},s=class extends t{constructor(e,t){super(e,t),this.name=`FileTransferError`}},c=class extends t{constructor(){super(`timeout waiting for file transfer notification`),this.name=`FileTransferTimeoutError`}},l=class extends t{constructor(e,t){super(e,t),this.name=`CryptoInitError`}},u=class extends t{constructor(e=`invalid identity format`){super(e),this.name=`InvalidIdentityError`}},d=32,f=65,p=4,m=class{privateKey;offset;constructor(e,t){this.privateKey=e,this.offset=t}publicKeyBase64(){let t=(0,e.createPublicKey)(this.privateKey).export({format:`jwk`});return t.x===void 0||t.y===void 0||typeof t.x!=`string`||typeof t.y!=`string`?``:y(re(t.x,d),re(t.y,d))}toString(){let e=this.privateKey.export({format:`jwk`});if(!e.d)return`:${this.offset}`;let t=re(e.d,d);return`${Buffer.from(t).toString(`base64`)}:${this.offset}`}securityLevel(){let t=(0,e.createHash)(`sha1`);return t.update(this.publicKeyBase64()),t.update(this.offset.toString(10)),ie(t.digest())}async upgradeToLevel(t,n){let r=this.publicKeyBase64();for(;;){if(n?.aborted)throw n.reason;let i=(0,e.createHash)(`sha1`);if(i.update(r),i.update(this.offset.toString(10)),ie(i.digest())>=t)return;this.offset++,this.offset%10000n==0n&&await new Promise(e=>setImmediate(e))}}};function h(t){let n=t.lastIndexOf(`:`);if(n<0)throw new u;let r=t.slice(0,n),i=t.slice(n+1),a=Buffer.from(r,`base64`),o=BigInt(i);if(a.length>d)throw new u(`private key scalar too large`);let s=Buffer.alloc(d);a.copy(s,d-a.length);let c=(0,e.createECDH)(`prime256v1`);c.setPrivateKey(s);let l=c.getPublicKey(null,`uncompressed`),f=Buffer.from(l.slice(1,33)).toString(`base64url`),p=Buffer.from(l.slice(33,65)).toString(`base64url`);return new m((0,e.createPrivateKey)({key:{kty:`EC`,crv:`P-256`,d:s.toString(`base64url`),x:f,y:p},format:`jwk`}),o)}function g(t){let{privateKey:n}=(0,e.generateKeyPairSync)(`ec`,{namedCurve:`prime256v1`}),r=new m(n,0n),i=r.publicKeyBase64();for(;;){let n=(0,e.createHash)(`sha1`);if(n.update(i),n.update(r.offset.toString(10)),ie(n.digest())>=t)return r;r.offset++}}function _(t){let n=(0,e.createHash)(`sha1`).update(t).digest();return Buffer.from(n).toString(`base64`)}function v(t){return(0,e.createHash)(`sha512`).update(t).digest()}function y(e,t){let n=T(3,Buffer.from([0])),r=T(2,te(32)),i=T(2,te(e)),a=T(2,te(t));return T(48,Buffer.concat([n,r,i,a])).toString(`base64`)}function b(t){let n=x(t);return(0,e.createPublicKey)({key:{kty:`EC`,crv:`P-256`,x:Buffer.from(n.slice(1,33)).toString(`base64url`),y:Buffer.from(n.slice(33,65)).toString(`base64url`)},format:`jwk`})}function x(e){try{return S(e)}catch{}return C(e)}function S(e){let t=E(e,48).value,n=0,r=E(t,3,n);n+=r.consumed;let i=E(t,2,n);n+=i.consumed;let a=E(t,2,n);n+=a.consumed;let o=E(t,2,n);return w(ne(a.value,d),ne(o.value,d))}function C(e){let t=E(e,48).value,n=0,r=E(t,2,n);n+=r.consumed;let i=E(t,2,n);return w(ne(r.value,d),ne(i.value,d))}function w(e,t){if(e.length>d||t.length>d)throw Error(`invalid public key point encoding`);let n=new Uint8Array(f);return n[0]=p,n.set(e,1+d-e.length),n.set(t,1+2*d-t.length),n}function T(e,t){let n=ee(t.length);return Buffer.concat([Buffer.from([e]),n,t])}function ee(e){return e<128?Buffer.from([e]):e<256?Buffer.from([129,e]):Buffer.from([130,e>>8&255,e&255])}function te(e){if(typeof e==`number`){let t=[],n=e;do t.unshift(n&255),n>>=8;while(n>0);return t[0]&128&&t.unshift(0),Buffer.from(t)}let t=0;for(;t<e.length-1&&e[t]===0;)t++;let n=e.slice(t);return n[0]&128?Buffer.concat([Buffer.from([0]),n]):Buffer.from(n)}function E(e,t,n=0){if(e[n]!==t)throw Error(`expected DER tag 0x${t.toString(16)}, got 0x${(e[n]??0).toString(16)}`);let r=n+1,i,a=e[r++];if(a<128)i=a;else if(a===129)i=e[r++];else if(a===130)i=(e[r]<<8|e[r+1])>>>0,r+=2;else throw Error(`unsupported DER length encoding`);return{value:e.slice(r,r+i),consumed:r-n+i}}function ne(e,t){let n=0;for(;n<e.length-1&&e[n]===0;)n++;let r=e.slice(n);if(r.length>t)throw Error(`integer too large`);if(r.length===t)return r;let i=new Uint8Array(t);return i.set(r,t-r.length),i}function re(e,t){let n=Buffer.from(e,`base64url`);if(n.length===t)return n;let r=Buffer.alloc(t);return n.copy(r,t-n.length),r}function ie(e){let t=0;for(let n of e)if(n===0)t+=8;else for(let e=0;e<8;e++)if(!(n&1<<e))t++;else return t;return t}function ae(e){return e instanceof Uint8Array||ArrayBuffer.isView(e)&&e.constructor.name===`Uint8Array`}function oe(e,t=``){if(!Number.isSafeInteger(e)||e<0){let n=t&&`"${t}" `;throw Error(`${n}expected integer >= 0, got ${e}`)}}function D(e,t,n=``){let r=ae(e),i=e?.length,a=t!==void 0;if(!r||a&&i!==t){let o=n&&`"${n}" `,s=a?` of length ${t}`:``,c=r?`length=${i}`:`type=${typeof e}`;throw Error(o+`expected Uint8Array`+s+`, got `+c)}return e}function se(e,t=!0){if(e.destroyed)throw Error(`Hash instance has been destroyed`);if(t&&e.finished)throw Error(`Hash#digest() has already been called`)}function ce(e,t){D(e,void 0,`digestInto() output`);let n=t.outputLen;if(e.length<n)throw Error(`"digestInto() output" expected to be of length >=`+n)}function le(...e){for(let t=0;t<e.length;t++)e[t].fill(0)}function ue(e){return new DataView(e.buffer,e.byteOffset,e.byteLength)}new Uint8Array(new Uint32Array([287454020]).buffer)[0];var de=typeof Uint8Array.from([]).toHex==`function`&&typeof Uint8Array.fromHex==`function`,fe=Array.from({length:256},(e,t)=>t.toString(16).padStart(2,`0`));function pe(e){if(D(e),de)return e.toHex();let t=``;for(let n=0;n<e.length;n++)t+=fe[e[n]];return t}var O={_0:48,_9:57,A:65,F:70,a:97,f:102};function me(e){if(e>=O._0&&e<=O._9)return e-O._0;if(e>=O.A&&e<=O.F)return e-(O.A-10);if(e>=O.a&&e<=O.f)return e-(O.a-10)}function he(e){if(typeof e!=`string`)throw Error(`hex string expected, got `+typeof e);if(de)return Uint8Array.fromHex(e);let t=e.length,n=t/2;if(t%2)throw Error(`hex string expected, got unpadded hex of length `+t);let r=new Uint8Array(n);for(let t=0,i=0;t<n;t++,i+=2){let n=me(e.charCodeAt(i)),a=me(e.charCodeAt(i+1));if(n===void 0||a===void 0){let t=e[i]+e[i+1];throw Error(`hex string expected, got non-hex character "`+t+`" at index `+i)}r[t]=n*16+a}return r}function k(...e){let t=0;for(let n=0;n<e.length;n++){let r=e[n];D(r),t+=r.length}let n=new Uint8Array(t);for(let t=0,r=0;t<e.length;t++){let i=e[t];n.set(i,r),r+=i.length}return n}function ge(e,t={}){let n=(t,n)=>e(n).update(t).digest(),r=e(void 0);return n.outputLen=r.outputLen,n.blockLen=r.blockLen,n.create=t=>e(t),Object.assign(n,t),Object.freeze(n)}function A(e=32){let t=typeof globalThis==`object`?globalThis.crypto:null;if(typeof t?.getRandomValues!=`function`)throw Error(`crypto.getRandomValues must be defined`);return t.getRandomValues(new Uint8Array(e))}var _e=e=>({oid:Uint8Array.from([6,9,96,134,72,1,101,3,4,2,e])}),ve=class{blockLen;outputLen;padOffset;isLE;buffer;view;finished=!1;length=0;pos=0;destroyed=!1;constructor(e,t,n,r){this.blockLen=e,this.outputLen=t,this.padOffset=n,this.isLE=r,this.buffer=new Uint8Array(e),this.view=ue(this.buffer)}update(e){se(this),D(e);let{view:t,buffer:n,blockLen:r}=this,i=e.length;for(let a=0;a<i;){let o=Math.min(r-this.pos,i-a);if(o===r){let t=ue(e);for(;r<=i-a;a+=r)this.process(t,a);continue}n.set(e.subarray(a,a+o),this.pos),this.pos+=o,a+=o,this.pos===r&&(this.process(t,0),this.pos=0)}return this.length+=e.length,this.roundClean(),this}digestInto(e){se(this),ce(e,this),this.finished=!0;let{buffer:t,view:n,blockLen:r,isLE:i}=this,{pos:a}=this;t[a++]=128,le(this.buffer.subarray(a)),this.padOffset>r-a&&(this.process(n,0),a=0);for(let e=a;e<r;e++)t[e]=0;n.setBigUint64(r-8,BigInt(this.length*8),i),this.process(n,0);let o=ue(e),s=this.outputLen;if(s%4)throw Error(`_sha2: outputLen must be aligned to 32bit`);let c=s/4,l=this.get();if(c>l.length)throw Error(`_sha2: outputLen bigger than state`);for(let e=0;e<c;e++)o.setUint32(4*e,l[e],i)}digest(){let{buffer:e,outputLen:t}=this;this.digestInto(e);let n=e.slice(0,t);return this.destroy(),n}_cloneInto(e){e||=new this.constructor,e.set(...this.get());let{blockLen:t,buffer:n,length:r,finished:i,destroyed:a,pos:o}=this;return e.destroyed=a,e.finished=i,e.length=r,e.pos=o,r%t&&e.buffer.set(n),e}clone(){return this._cloneInto()}},j=Uint32Array.from([1779033703,4089235720,3144134277,2227873595,1013904242,4271175723,2773480762,1595750129,1359893119,2917565137,2600822924,725511199,528734635,4215389547,1541459225,327033209]),ye=BigInt(2**32-1),be=BigInt(32);function xe(e,t=!1){return t?{h:Number(e&ye),l:Number(e>>be&ye)}:{h:Number(e>>be&ye)|0,l:Number(e&ye)|0}}function Se(e,t=!1){let n=e.length,r=new Uint32Array(n),i=new Uint32Array(n);for(let a=0;a<n;a++){let{h:n,l:o}=xe(e[a],t);[r[a],i[a]]=[n,o]}return[r,i]}var Ce=(e,t,n)=>e>>>n,we=(e,t,n)=>e<<32-n|t>>>n,M=(e,t,n)=>e>>>n|t<<32-n,N=(e,t,n)=>e<<32-n|t>>>n,Te=(e,t,n)=>e<<64-n|t>>>n-32,Ee=(e,t,n)=>e>>>n-32|t<<64-n;function P(e,t,n,r){let i=(t>>>0)+(r>>>0);return{h:e+n+(i/2**32|0)|0,l:i|0}}var De=(e,t,n)=>(e>>>0)+(t>>>0)+(n>>>0),Oe=(e,t,n,r)=>t+n+r+(e/2**32|0)|0,ke=(e,t,n,r)=>(e>>>0)+(t>>>0)+(n>>>0)+(r>>>0),Ae=(e,t,n,r,i)=>t+n+r+i+(e/2**32|0)|0,je=(e,t,n,r,i)=>(e>>>0)+(t>>>0)+(n>>>0)+(r>>>0)+(i>>>0),Me=(e,t,n,r,i,a)=>t+n+r+i+a+(e/2**32|0)|0,Ne=Se(`0x428a2f98d728ae22.0x7137449123ef65cd.0xb5c0fbcfec4d3b2f.0xe9b5dba58189dbbc.0x3956c25bf348b538.0x59f111f1b605d019.0x923f82a4af194f9b.0xab1c5ed5da6d8118.0xd807aa98a3030242.0x12835b0145706fbe.0x243185be4ee4b28c.0x550c7dc3d5ffb4e2.0x72be5d74f27b896f.0x80deb1fe3b1696b1.0x9bdc06a725c71235.0xc19bf174cf692694.0xe49b69c19ef14ad2.0xefbe4786384f25e3.0x0fc19dc68b8cd5b5.0x240ca1cc77ac9c65.0x2de92c6f592b0275.0x4a7484aa6ea6e483.0x5cb0a9dcbd41fbd4.0x76f988da831153b5.0x983e5152ee66dfab.0xa831c66d2db43210.0xb00327c898fb213f.0xbf597fc7beef0ee4.0xc6e00bf33da88fc2.0xd5a79147930aa725.0x06ca6351e003826f.0x142929670a0e6e70.0x27b70a8546d22ffc.0x2e1b21385c26c926.0x4d2c6dfc5ac42aed.0x53380d139d95b3df.0x650a73548baf63de.0x766a0abb3c77b2a8.0x81c2c92e47edaee6.0x92722c851482353b.0xa2bfe8a14cf10364.0xa81a664bbc423001.0xc24b8b70d0f89791.0xc76c51a30654be30.0xd192e819d6ef5218.0xd69906245565a910.0xf40e35855771202a.0x106aa07032bbd1b8.0x19a4c116b8d2d0c8.0x1e376c085141ab53.0x2748774cdf8eeb99.0x34b0bcb5e19b48a8.0x391c0cb3c5c95a63.0x4ed8aa4ae3418acb.0x5b9cca4f7763e373.0x682e6ff3d6b2b8a3.0x748f82ee5defb2fc.0x78a5636f43172f60.0x84c87814a1f0ab72.0x8cc702081a6439ec.0x90befffa23631e28.0xa4506cebde82bde9.0xbef9a3f7b2c67915.0xc67178f2e372532b.0xca273eceea26619c.0xd186b8c721c0c207.0xeada7dd6cde0eb1e.0xf57d4f7fee6ed178.0x06f067aa72176fba.0x0a637dc5a2c898a6.0x113f9804bef90dae.0x1b710b35131c471b.0x28db77f523047d84.0x32caab7b40c72493.0x3c9ebe0a15c9bebc.0x431d67c49c100d4c.0x4cc5d4becb3e42b6.0x597f299cfc657e2a.0x5fcb6fab3ad6faec.0x6c44198c4a475817`.split(`.`).map(e=>BigInt(e))),Pe=Ne[0],Fe=Ne[1],F=new Uint32Array(80),I=new Uint32Array(80),Ie=class extends ve{constructor(e){super(128,e,16,!1)}get(){let{Ah:e,Al:t,Bh:n,Bl:r,Ch:i,Cl:a,Dh:o,Dl:s,Eh:c,El:l,Fh:u,Fl:d,Gh:f,Gl:p,Hh:m,Hl:h}=this;return[e,t,n,r,i,a,o,s,c,l,u,d,f,p,m,h]}set(e,t,n,r,i,a,o,s,c,l,u,d,f,p,m,h){this.Ah=e|0,this.Al=t|0,this.Bh=n|0,this.Bl=r|0,this.Ch=i|0,this.Cl=a|0,this.Dh=o|0,this.Dl=s|0,this.Eh=c|0,this.El=l|0,this.Fh=u|0,this.Fl=d|0,this.Gh=f|0,this.Gl=p|0,this.Hh=m|0,this.Hl=h|0}process(e,t){for(let n=0;n<16;n++,t+=4)F[n]=e.getUint32(t),I[n]=e.getUint32(t+=4);for(let e=16;e<80;e++){let t=F[e-15]|0,n=I[e-15]|0,r=M(t,n,1)^M(t,n,8)^Ce(t,n,7),i=N(t,n,1)^N(t,n,8)^we(t,n,7),a=F[e-2]|0,o=I[e-2]|0,s=M(a,o,19)^Te(a,o,61)^Ce(a,o,6),c=ke(i,N(a,o,19)^Ee(a,o,61)^we(a,o,6),I[e-7],I[e-16]);F[e]=Ae(c,r,s,F[e-7],F[e-16])|0,I[e]=c|0}let{Ah:n,Al:r,Bh:i,Bl:a,Ch:o,Cl:s,Dh:c,Dl:l,Eh:u,El:d,Fh:f,Fl:p,Gh:m,Gl:h,Hh:g,Hl:_}=this;for(let e=0;e<80;e++){let t=M(u,d,14)^M(u,d,18)^Te(u,d,41),v=N(u,d,14)^N(u,d,18)^Ee(u,d,41),y=u&f^~u&m,b=d&p^~d&h,x=je(_,v,b,Fe[e],I[e]),S=Me(x,g,t,y,Pe[e],F[e]),C=x|0,w=M(n,r,28)^Te(n,r,34)^Te(n,r,39),T=N(n,r,28)^Ee(n,r,34)^Ee(n,r,39),ee=n&i^n&o^i&o,te=r&a^r&s^a&s;g=m|0,_=h|0,m=f|0,h=p|0,f=u|0,p=d|0,{h:u,l:d}=P(c|0,l|0,S|0,C|0),c=o|0,l=s|0,o=i|0,s=a|0,i=n|0,a=r|0;let E=De(C,T,te);n=Oe(E,S,w,ee),r=E|0}({h:n,l:r}=P(this.Ah|0,this.Al|0,n|0,r|0)),{h:i,l:a}=P(this.Bh|0,this.Bl|0,i|0,a|0),{h:o,l:s}=P(this.Ch|0,this.Cl|0,o|0,s|0),{h:c,l}=P(this.Dh|0,this.Dl|0,c|0,l|0),{h:u,l:d}=P(this.Eh|0,this.El|0,u|0,d|0),{h:f,l:p}=P(this.Fh|0,this.Fl|0,f|0,p|0),{h:m,l:h}=P(this.Gh|0,this.Gl|0,m|0,h|0),{h:g,l:_}=P(this.Hh|0,this.Hl|0,g|0,_|0),this.set(n,r,i,a,o,s,c,l,u,d,f,p,m,h,g,_)}roundClean(){le(F,I)}destroy(){le(this.buffer),this.set(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0)}},Le=class extends Ie{Ah=j[0]|0;Al=j[1]|0;Bh=j[2]|0;Bl=j[3]|0;Ch=j[4]|0;Cl=j[5]|0;Dh=j[6]|0;Dl=j[7]|0;Eh=j[8]|0;El=j[9]|0;Fh=j[10]|0;Fl=j[11]|0;Gh=j[12]|0;Gl=j[13]|0;Hh=j[14]|0;Hl=j[15]|0;constructor(){super(64)}},Re=ge(()=>new Le,_e(3)),ze=BigInt(0),Be=BigInt(1);function Ve(e,t=``){if(typeof e!=`boolean`){let n=t&&`"${t}" `;throw Error(n+`expected boolean, got type=`+typeof e)}return e}function He(e){if(typeof e==`bigint`){if(!Ye(e))throw Error(`positive bigint expected, got `+e)}else oe(e);return e}function L(e,t=``){if(!Number.isSafeInteger(e)){let n=t&&`"${t}" `;throw Error(n+`expected safe integer, got type=`+typeof e)}}function Ue(e){if(typeof e!=`string`)throw Error(`hex string expected, got `+typeof e);return e===``?ze:BigInt(`0x`+e)}function We(e){return Ue(pe(e))}function R(e){return Ue(pe(Je(D(e)).reverse()))}function Ge(e,t){oe(t),e=He(e);let n=he(e.toString(16).padStart(t*2,`0`));if(n.length!==t)throw Error(`number too large`);return n}function Ke(e,t){return Ge(e,t).reverse()}function qe(e,t){if(e.length!==t.length)return!1;let n=0;for(let r=0;r<e.length;r++)n|=e[r]^t[r];return n===0}function Je(e){return Uint8Array.from(e)}function z(e){return Uint8Array.from(e,(t,n)=>{let r=t.charCodeAt(0);if(t.length!==1||r>127)throw Error(`string contains non-ASCII character "${e[n]}" with code ${r} at position ${n}`);return r})}var Ye=e=>typeof e==`bigint`&&ze<=e;function Xe(e,t,n){return Ye(e)&&Ye(t)&&Ye(n)&&t<=e&&e<n}function Ze(e,t,n,r){if(!Xe(t,n,r))throw Error(`expected valid `+e+`: `+n+` <= n < `+r+`, got `+t)}function Qe(e){let t;for(t=0;e>ze;e>>=Be,t+=1);return t}var $e=e=>(Be<<BigInt(e))-Be;function et(e,t={},n={}){if(!e||typeof e!=`object`)throw Error(`expected valid options object`);function r(t,n,r){let i=e[t];if(r&&i===void 0)return;let a=typeof i;if(a!==n||i===null)throw Error(`param "${t}" is invalid: expected ${n}, got ${a}`)}let i=(e,t)=>Object.entries(e).forEach(([e,n])=>r(e,n,t));i(t,!1),i(n,!0)}var tt=()=>{throw Error(`not implemented`)};function nt(e){let t=new WeakMap;return(n,...r)=>{let i=t.get(n);if(i!==void 0)return i;let a=e(n,...r);return t.set(n,a),a}}var B=BigInt(0),V=BigInt(1),H=BigInt(2),rt=BigInt(3),it=BigInt(4),at=BigInt(5),ot=BigInt(7),st=BigInt(8),ct=BigInt(9),lt=BigInt(16);function U(e,t){let n=e%t;return n>=B?n:t+n}function W(e,t,n){let r=e;for(;t-- >B;)r*=r,r%=n;return r}function ut(e,t){if(e===B)throw Error(`invert: expected non-zero number`);if(t<=B)throw Error(`invert: expected positive modulus, got `+t);let n=U(e,t),r=t,i=B,a=V,o=V,s=B;for(;n!==B;){let e=r/n,t=r%n,c=i-o*e,l=a-s*e;r=n,n=t,i=o,a=s,o=c,s=l}if(r!==V)throw Error(`invert: does not exist`);return U(i,t)}function dt(e,t,n){if(!e.eql(e.sqr(t),n))throw Error(`Cannot find square root`)}function ft(e,t){let n=(e.ORDER+V)/it,r=e.pow(t,n);return dt(e,r,t),r}function pt(e,t){let n=(e.ORDER-at)/st,r=e.mul(t,H),i=e.pow(r,n),a=e.mul(t,i),o=e.mul(e.mul(a,H),i),s=e.mul(a,e.sub(o,e.ONE));return dt(e,s,t),s}function mt(e){let t=wt(e),n=ht(e),r=n(t,t.neg(t.ONE)),i=n(t,r),a=n(t,t.neg(r)),o=(e+ot)/lt;return(e,t)=>{let n=e.pow(t,o),s=e.mul(n,r),c=e.mul(n,i),l=e.mul(n,a),u=e.eql(e.sqr(s),t),d=e.eql(e.sqr(c),t);n=e.cmov(n,s,u),s=e.cmov(l,c,d);let f=e.eql(e.sqr(s),t),p=e.cmov(n,s,f);return dt(e,p,t),p}}function ht(e){if(e<rt)throw Error(`sqrt is not defined for small field`);let t=e-V,n=0;for(;t%H===B;)t/=H,n++;let r=H,i=wt(e);for(;xt(i,r)===1;)if(r++>1e3)throw Error(`Cannot find square root: probably non-prime P`);if(n===1)return ft;let a=i.pow(r,t),o=(t+V)/H;return function(e,r){if(e.is0(r))return r;if(xt(e,r)!==1)throw Error(`Cannot find square root`);let i=n,s=e.mul(e.ONE,a),c=e.pow(r,t),l=e.pow(r,o);for(;!e.eql(c,e.ONE);){if(e.is0(c))return e.ZERO;let t=1,n=e.sqr(c);for(;!e.eql(n,e.ONE);)if(t++,n=e.sqr(n),t===i)throw Error(`Cannot find square root`);let r=V<<BigInt(i-t-1),a=e.pow(s,r);i=t,s=e.sqr(a),c=e.mul(c,s),l=e.mul(l,a)}return l}}function gt(e){return e%it===rt?ft:e%st===at?pt:e%lt===ct?mt(e):ht(e)}var G=(e,t)=>(U(e,t)&V)===V,_t=[`create`,`isValid`,`is0`,`neg`,`inv`,`sqrt`,`sqr`,`eql`,`add`,`sub`,`mul`,`pow`,`div`,`addN`,`subN`,`mulN`,`sqrN`];function vt(e){return et(e,_t.reduce((e,t)=>(e[t]=`function`,e),{ORDER:`bigint`,BYTES:`number`,BITS:`number`})),e}function yt(e,t,n){if(n<B)throw Error(`invalid exponent, negatives unsupported`);if(n===B)return e.ONE;if(n===V)return t;let r=e.ONE,i=t;for(;n>B;)n&V&&(r=e.mul(r,i)),i=e.sqr(i),n>>=V;return r}function bt(e,t,n=!1){let r=Array(t.length).fill(n?e.ZERO:void 0),i=t.reduce((t,n,i)=>e.is0(n)?t:(r[i]=t,e.mul(t,n)),e.ONE),a=e.inv(i);return t.reduceRight((t,n,i)=>e.is0(n)?t:(r[i]=e.mul(t,r[i]),e.mul(t,n)),a),r}function xt(e,t){let n=(e.ORDER-V)/H,r=e.pow(t,n),i=e.eql(r,e.ONE),a=e.eql(r,e.ZERO),o=e.eql(r,e.neg(e.ONE));if(!i&&!a&&!o)throw Error(`invalid Legendre symbol result`);return i?1:a?0:-1}function St(e,t){t!==void 0&&oe(t);let n=t===void 0?e.toString(2).length:t;return{nBitLength:n,nByteLength:Math.ceil(n/8)}}var Ct=class{ORDER;BITS;BYTES;isLE;ZERO=B;ONE=V;_lengths;_sqrt;_mod;constructor(e,t={}){if(e<=B)throw Error(`invalid field: expected ORDER > 0, got `+e);let n;this.isLE=!1,typeof t==`object`&&t&&(typeof t.BITS==`number`&&(n=t.BITS),typeof t.sqrt==`function`&&(this.sqrt=t.sqrt),typeof t.isLE==`boolean`&&(this.isLE=t.isLE),t.allowedLengths&&(this._lengths=t.allowedLengths?.slice()),typeof t.modFromBytes==`boolean`&&(this._mod=t.modFromBytes));let{nBitLength:r,nByteLength:i}=St(e,n);if(i>2048)throw Error(`invalid field: expected ORDER of <= 2048 bytes`);this.ORDER=e,this.BITS=r,this.BYTES=i,this._sqrt=void 0,Object.preventExtensions(this)}create(e){return U(e,this.ORDER)}isValid(e){if(typeof e!=`bigint`)throw Error(`invalid field element: expected bigint, got `+typeof e);return B<=e&&e<this.ORDER}is0(e){return e===B}isValidNot0(e){return!this.is0(e)&&this.isValid(e)}isOdd(e){return(e&V)===V}neg(e){return U(-e,this.ORDER)}eql(e,t){return e===t}sqr(e){return U(e*e,this.ORDER)}add(e,t){return U(e+t,this.ORDER)}sub(e,t){return U(e-t,this.ORDER)}mul(e,t){return U(e*t,this.ORDER)}pow(e,t){return yt(this,e,t)}div(e,t){return U(e*ut(t,this.ORDER),this.ORDER)}sqrN(e){return e*e}addN(e,t){return e+t}subN(e,t){return e-t}mulN(e,t){return e*t}inv(e){return ut(e,this.ORDER)}sqrt(e){return this._sqrt||=gt(this.ORDER),this._sqrt(this,e)}toBytes(e){return this.isLE?Ke(e,this.BYTES):Ge(e,this.BYTES)}fromBytes(e,t=!1){D(e);let{_lengths:n,BYTES:r,isLE:i,ORDER:a,_mod:o}=this;if(n){if(!n.includes(e.length)||e.length>r)throw Error(`Field.fromBytes: expected `+n+` bytes, got `+e.length);let t=new Uint8Array(r);t.set(e,i?0:t.length-e.length),e=t}if(e.length!==r)throw Error(`Field.fromBytes: expected `+r+` bytes, got `+e.length);let s=i?R(e):We(e);if(o&&(s=U(s,a)),!t&&!this.isValid(s))throw Error(`invalid field element: outside of range 0..ORDER`);return s}invertBatch(e){return bt(this,e)}cmov(e,t,n){return n?t:e}};function wt(e,t={}){return new Ct(e,t)}function Tt(e,t){if(!e.isOdd)throw Error(`Field doesn't have isOdd`);let n=e.sqrt(t);return e.isOdd(n)?e.neg(n):n}function Et(e){if(typeof e!=`bigint`)throw Error(`field order must be bigint`);let t=e.toString(2).length;return Math.ceil(t/8)}function Dt(e){let t=Et(e);return t+Math.ceil(t/2)}function Ot(e,t,n=!1){D(e);let r=e.length,i=Et(t),a=Dt(t);if(r<16||r<a||r>1024)throw Error(`expected `+a+`-1024 bytes of input, got `+r);let o=U(n?R(e):We(e),t-V)+V;return n?Ke(o,i):Ge(o,i)}var kt=BigInt(0),At=BigInt(1);function jt(e,t){let n=t.negate();return e?n:t}function Mt(e,t){let n=bt(e.Fp,t.map(e=>e.Z));return t.map((t,r)=>e.fromAffine(t.toAffine(n[r])))}function Nt(e,t){if(!Number.isSafeInteger(e)||e<=0||e>t)throw Error(`invalid window size, expected [1..`+t+`], got W=`+e)}function Pt(e,t){Nt(e,t);let n=Math.ceil(t/e)+1,r=2**(e-1),i=2**e;return{windows:n,windowSize:r,mask:$e(e),maxNumber:i,shiftBy:BigInt(e)}}function Ft(e,t,n){let{windowSize:r,mask:i,maxNumber:a,shiftBy:o}=n,s=Number(e&i),c=e>>o;s>r&&(s-=a,c+=At);let l=t*r,u=l+Math.abs(s)-1,d=s===0,f=s<0,p=t%2!=0;return{nextN:c,offset:u,isZero:d,isNeg:f,isNegF:p,offsetF:l}}function It(e,t){if(!Array.isArray(e))throw Error(`array expected`);e.forEach((e,n)=>{if(!(e instanceof t))throw Error(`invalid point at index `+n)})}function Lt(e,t){if(!Array.isArray(e))throw Error(`array of scalars expected`);e.forEach((e,n)=>{if(!t.isValid(e))throw Error(`invalid scalar at index `+n)})}var Rt=new WeakMap,zt=new WeakMap;function Bt(e){return zt.get(e)||1}function Vt(e){if(e!==kt)throw Error(`invalid wNAF`)}var Ht=class{BASE;ZERO;Fn;bits;constructor(e,t){this.BASE=e.BASE,this.ZERO=e.ZERO,this.Fn=e.Fn,this.bits=t}_unsafeLadder(e,t,n=this.ZERO){let r=e;for(;t>kt;)t&At&&(n=n.add(r)),r=r.double(),t>>=At;return n}precomputeWindow(e,t){let{windows:n,windowSize:r}=Pt(t,this.bits),i=[],a=e,o=a;for(let e=0;e<n;e++){o=a,i.push(o);for(let e=1;e<r;e++)o=o.add(a),i.push(o);a=o.double()}return i}wNAF(e,t,n){if(!this.Fn.isValid(n))throw Error(`invalid scalar`);let r=this.ZERO,i=this.BASE,a=Pt(e,this.bits);for(let e=0;e<a.windows;e++){let{nextN:o,offset:s,isZero:c,isNeg:l,isNegF:u,offsetF:d}=Ft(n,e,a);n=o,c?i=i.add(jt(u,t[d])):r=r.add(jt(l,t[s]))}return Vt(n),{p:r,f:i}}wNAFUnsafe(e,t,n,r=this.ZERO){let i=Pt(e,this.bits);for(let e=0;e<i.windows&&n!==kt;e++){let{nextN:a,offset:o,isZero:s,isNeg:c}=Ft(n,e,i);if(n=a,!s){let e=t[o];r=r.add(c?e.negate():e)}}return Vt(n),r}getPrecomputes(e,t,n){let r=Rt.get(t);return r||(r=this.precomputeWindow(t,e),e!==1&&(typeof n==`function`&&(r=n(r)),Rt.set(t,r))),r}cached(e,t,n){let r=Bt(e);return this.wNAF(r,this.getPrecomputes(r,e,n),t)}unsafe(e,t,n,r){let i=Bt(e);return i===1?this._unsafeLadder(e,t,r):this.wNAFUnsafe(i,this.getPrecomputes(i,e,n),t,r)}createCache(e,t){Nt(t,this.bits),zt.set(e,t),Rt.delete(e)}hasCache(e){return Bt(e)!==1}};function Ut(e,t,n){let r=e.Fn;It(t,e),Lt(n,r);let i=t.length,a=n.length;if(i!==a)throw Error(`arrays of points and scalars must have equal length`);let o=e.ZERO,s=Qe(BigInt(i)),c=1;s>12?c=s-3:s>4?c=s-2:s>0&&(c=2);let l=$e(c),u=Array(Number(l)+1).fill(o),d=Math.floor((r.BITS-1)/c)*c,f=o;for(let e=d;e>=0;e-=c){u.fill(o);for(let r=0;r<a;r++){let i=n[r],a=Number(i>>BigInt(e)&l);u[a]=u[a].add(t[r])}let r=o;for(let e=u.length-1,t=o;e>0;e--)t=t.add(u[e]),r=r.add(t);if(f=f.add(r),e!==0)for(let e=0;e<c;e++)f=f.double()}return f}function Wt(e,t,n){if(t){if(t.ORDER!==e)throw Error(`Field.ORDER must match order: Fp == p, Fn == n`);return vt(t),t}else return wt(e,{isLE:n})}function Gt(e,t,n={},r){if(r===void 0&&(r=e===`edwards`),!t||typeof t!=`object`)throw Error(`expected valid ${e} CURVE object`);for(let e of[`p`,`n`,`h`]){let n=t[e];if(!(typeof n==`bigint`&&n>kt))throw Error(`CURVE.${e} must be positive bigint`)}let i=Wt(t.p,n.Fp,r),a=Wt(t.n,n.Fn,r),o=[`Gx`,`Gy`,`a`,e===`weierstrass`?`b`:`d`];for(let e of o)if(!i.isValid(t[e]))throw Error(`CURVE.${e} must be valid field element of CURVE.Fp`);return t=Object.freeze(Object.assign({},t)),{CURVE:t,Fp:i,Fn:a}}function Kt(e,t){return function(n){let r=e(n);return{secretKey:r,publicKey:t(r)}}}var K=BigInt(0),q=BigInt(1),qt=BigInt(2),Jt=BigInt(8);function Yt(e,t,n,r){let i=e.sqr(n),a=e.sqr(r),o=e.add(e.mul(t.a,i),a),s=e.add(e.ONE,e.mul(t.d,e.mul(i,a)));return e.eql(o,s)}function Xt(e,t={}){let n=Gt(`edwards`,e,t,t.FpFnLE),{Fp:r,Fn:i}=n,a=n.CURVE,{h:o}=a;et(t,{},{uvRatio:`function`});let s=qt<<BigInt(i.BYTES*8)-q,c=e=>r.create(e),l=t.uvRatio||((e,t)=>{try{return{isValid:!0,value:r.sqrt(r.div(e,t))}}catch{return{isValid:!1,value:K}}});if(!Yt(r,a,a.Gx,a.Gy))throw Error(`bad curve params: generator point`);function u(e,t,n=!1){let r=n?q:K;return Ze(`coordinate `+e,t,r,s),t}function d(e){if(!(e instanceof m))throw Error(`EdwardsPoint expected`)}let f=nt((e,t)=>{let{X:n,Y:i,Z:a}=e,o=e.is0();t??=o?Jt:r.inv(a);let s=c(n*t),l=c(i*t),u=r.mul(a,t);if(o)return{x:K,y:q};if(u!==q)throw Error(`invZ was invalid`);return{x:s,y:l}}),p=nt(e=>{let{a:t,d:n}=a;if(e.is0())throw Error(`bad point: ZERO`);let{X:r,Y:i,Z:o,T:s}=e,l=c(r*r),u=c(i*i),d=c(o*o),f=c(d*d);if(c(d*c(c(l*t)+u))!==c(f+c(n*c(l*u))))throw Error(`bad point: equation left != right (1)`);if(c(r*i)!==c(o*s))throw Error(`bad point: equation left != right (2)`);return!0});class m{static BASE=new m(a.Gx,a.Gy,q,c(a.Gx*a.Gy));static ZERO=new m(K,q,q,K);static Fp=r;static Fn=i;X;Y;Z;T;constructor(e,t,n,r){this.X=u(`x`,e),this.Y=u(`y`,t),this.Z=u(`z`,n,!0),this.T=u(`t`,r),Object.freeze(this)}static CURVE(){return a}static fromAffine(e){if(e instanceof m)throw Error(`extended point not allowed`);let{x:t,y:n}=e||{};return u(`x`,t),u(`y`,n),new m(t,n,q,c(t*n))}static fromBytes(e,t=!1){let n=r.BYTES,{a:i,d:o}=a;e=Je(D(e,n,`point`)),Ve(t,`zip215`);let u=Je(e),d=e[n-1];u[n-1]=d&-129;let f=R(u);Ze(`point.y`,f,K,t?s:r.ORDER);let p=c(f*f),{isValid:h,value:g}=l(c(p-q),c(o*p-i));if(!h)throw Error(`bad point: invalid y coordinate`);let _=(g&q)===q,v=(d&128)!=0;if(!t&&g===K&&v)throw Error(`bad point: x=0 and x_0=1`);return v!==_&&(g=c(-g)),m.fromAffine({x:g,y:f})}static fromHex(e,t=!1){return m.fromBytes(he(e),t)}get x(){return this.toAffine().x}get y(){return this.toAffine().y}precompute(e=8,t=!0){return h.createCache(this,e),t||this.multiply(qt),this}assertValidity(){p(this)}equals(e){d(e);let{X:t,Y:n,Z:r}=this,{X:i,Y:a,Z:o}=e,s=c(t*o),l=c(i*r),u=c(n*o),f=c(a*r);return s===l&&u===f}is0(){return this.equals(m.ZERO)}negate(){return new m(c(-this.X),this.Y,this.Z,c(-this.T))}double(){let{a:e}=a,{X:t,Y:n,Z:r}=this,i=c(t*t),o=c(n*n),s=c(qt*c(r*r)),l=c(e*i),u=t+n,d=c(c(u*u)-i-o),f=l+o,p=f-s,h=l-o,g=c(d*p),_=c(f*h),v=c(d*h);return new m(g,_,c(p*f),v)}add(e){d(e);let{a:t,d:n}=a,{X:r,Y:i,Z:o,T:s}=this,{X:l,Y:u,Z:f,T:p}=e,h=c(r*l),g=c(i*u),_=c(s*n*p),v=c(o*f),y=c((r+i)*(l+u)-h-g),b=v-_,x=v+_,S=c(g-t*h),C=c(y*b),w=c(x*S),T=c(y*S);return new m(C,w,c(b*x),T)}subtract(e){return this.add(e.negate())}multiply(e){if(!i.isValidNot0(e))throw Error(`invalid scalar: expected 1 <= sc < curve.n`);let{p:t,f:n}=h.cached(this,e,e=>Mt(m,e));return Mt(m,[t,n])[0]}multiplyUnsafe(e,t=m.ZERO){if(!i.isValid(e))throw Error(`invalid scalar: expected 0 <= sc < curve.n`);return e===K?m.ZERO:this.is0()||e===q?this:h.unsafe(this,e,e=>Mt(m,e),t)}isSmallOrder(){return this.multiplyUnsafe(o).is0()}isTorsionFree(){return h.unsafe(this,a.n).is0()}toAffine(e){return f(this,e)}clearCofactor(){return o===q?this:this.multiplyUnsafe(o)}toBytes(){let{x:e,y:t}=this.toAffine(),n=r.toBytes(t);return n[n.length-1]|=e&q?128:0,n}toHex(){return pe(this.toBytes())}toString(){return`<Point ${this.is0()?`ZERO`:this.toHex()}>`}}let h=new Ht(m,i.BITS);return m.BASE.precompute(8),m}var Zt=class{static BASE;static ZERO;static Fp;static Fn;ep;constructor(e){this.ep=e}static fromBytes(e){tt()}static fromHex(e){tt()}get x(){return this.toAffine().x}get y(){return this.toAffine().y}clearCofactor(){return this}assertValidity(){this.ep.assertValidity()}toAffine(e){return this.ep.toAffine(e)}toHex(){return pe(this.toBytes())}toString(){return this.toHex()}isTorsionFree(){return!0}isSmallOrder(){return!1}add(e){return this.assertSame(e),this.init(this.ep.add(e.ep))}subtract(e){return this.assertSame(e),this.init(this.ep.subtract(e.ep))}multiply(e){return this.init(this.ep.multiply(e))}multiplyUnsafe(e){return this.init(this.ep.multiplyUnsafe(e))}double(){return this.init(this.ep.double())}negate(){return this.init(this.ep.negate())}precompute(e,t){return this.init(this.ep.precompute(e,t))}};function Qt(e,t,n={}){if(typeof t!=`function`)throw Error(`"hash" function param is required`);et(n,{},{adjustScalarBytes:`function`,randomBytes:`function`,domain:`function`,prehash:`function`,mapToCurve:`function`});let{prehash:r}=n,{BASE:i,Fp:a,Fn:o}=e,s=n.randomBytes||A,c=n.adjustScalarBytes||(e=>e),l=n.domain||((e,t,n)=>{if(Ve(n,`phflag`),t.length||n)throw Error(`Contexts/pre-hash are not supported`);return e});function u(e){return o.create(R(e))}function d(e){let n=y.secretKey;D(e,y.secretKey,`secretKey`);let r=D(t(e),2*n,`hashedSecretKey`),i=c(r.slice(0,n));return{head:i,prefix:r.slice(n,2*n),scalar:u(i)}}function f(e){let{head:t,prefix:n,scalar:r}=d(e),a=i.multiply(r);return{head:t,prefix:n,scalar:r,point:a,pointBytes:a.toBytes()}}function p(e){return f(e).pointBytes}function m(e=Uint8Array.of(),...n){return u(t(l(k(...n),D(e,void 0,`context`),!!r)))}function h(e,t,n={}){e=D(e,void 0,`message`),r&&(e=r(e));let{prefix:a,scalar:s,pointBytes:c}=f(t),l=m(n.context,a,e),u=i.multiply(l).toBytes(),d=m(n.context,u,c,e),p=o.create(l+d*s);if(!o.isValid(p))throw Error(`sign failed: invalid s`);return D(k(u,o.toBytes(p)),y.signature,`result`)}let g={zip215:!0};function _(t,n,a,o=g){let{context:s,zip215:c}=o,l=y.signature;t=D(t,l,`signature`),n=D(n,void 0,`message`),a=D(a,y.publicKey,`publicKey`),c!==void 0&&Ve(c,`zip215`),r&&(n=r(n));let u=l/2,d=t.subarray(0,u),f=R(t.subarray(u,l)),p,h,_;try{p=e.fromBytes(a,c),h=e.fromBytes(d,c),_=i.multiplyUnsafe(f)}catch{return!1}if(!c&&p.isSmallOrder())return!1;let v=m(s,h.toBytes(),p.toBytes(),n);return h.add(p.multiplyUnsafe(v)).subtract(_).clearCofactor().is0()}let v=a.BYTES,y={secretKey:v,publicKey:v,signature:2*v,seed:v};function b(e=s(y.seed)){return D(e,y.seed,`seed`)}function x(e){return ae(e)&&e.length===o.BYTES}function S(t,n){try{return!!e.fromBytes(t,n)}catch{return!1}}let C={getExtendedPublicKey:f,randomSecretKey:b,isValidSecretKey:x,isValidPublicKey:S,toMontgomery(t){let{y:n}=e.fromBytes(t),r=y.publicKey,i=r===32;if(!i&&r!==57)throw Error(`only defined for 25519 and 448`);let o=i?a.div(q+n,q-n):a.div(n-q,n+q);return a.toBytes(o)},toMontgomerySecret(e){let n=y.secretKey;return D(e,n),c(t(e.subarray(0,n))).subarray(0,n)}};return Object.freeze({keygen:Kt(b,p),getPublicKey:p,sign:h,verify:_,utils:C,Point:e,lengths:y})}var $t=We;function J(e,t){if(L(e),L(t),e<0||e>=1<<8*t)throw Error(`invalid I2OSP input: `+e);let n=Array.from({length:t}).fill(0);for(let r=t-1;r>=0;r--)n[r]=e&255,e>>>=8;return new Uint8Array(n)}function en(e,t){let n=new Uint8Array(e.length);for(let r=0;r<e.length;r++)n[r]=e[r]^t[r];return n}function tn(e){if(!ae(e)&&typeof e!=`string`)throw Error(`DST must be Uint8Array or ascii string`);return typeof e==`string`?z(e):e}function nn(e,t,n,r){D(e),L(n),t=tn(t),t.length>255&&(t=r(k(z(`H2C-OVERSIZE-DST-`),t)));let{outputLen:i,blockLen:a}=r,o=Math.ceil(n/i);if(n>65535||o>255)throw Error(`expand_message_xmd: invalid lenInBytes`);let s=k(t,J(t.length,1)),c=J(0,a),l=J(n,2),u=Array(o),d=r(k(c,e,l,J(0,1),s));u[0]=r(k(d,J(1,1),s));for(let e=1;e<=o;e++)u[e]=r(k(en(d,u[e-1]),J(e+1,1),s));return k(...u).slice(0,n)}function rn(e,t,n,r,i){if(D(e),L(n),t=tn(t),t.length>255){let e=Math.ceil(2*r/8);t=i.create({dkLen:e}).update(z(`H2C-OVERSIZE-DST-`)).update(t).digest()}if(n>65535||t.length>255)throw Error(`expand_message_xof: invalid lenInBytes`);return i.create({dkLen:n}).update(e).update(J(n,2)).update(t).update(J(t.length,1)).digest()}function an(e,t,n){et(n,{p:`bigint`,m:`number`,k:`number`,hash:`function`});let{p:r,k:i,m:a,hash:o,expand:s,DST:c}=n;L(o.outputLen,`valid hash`),D(e),L(t);let l=r.toString(2).length,u=Math.ceil((l+i)/8),d=t*a*u,f;if(s===`xmd`)f=nn(e,c,d,o);else if(s===`xof`)f=rn(e,c,d,i,o);else if(s===`_internal_pass`)f=e;else throw Error(`expand must be "xmd" or "xof"`);let p=Array(t);for(let e=0;e<t;e++){let t=Array(a);for(let n=0;n<a;n++){let i=u*(n+e*a);t[n]=U($t(f.subarray(i,i+u)),r)}p[e]=t}return p}var on=z(`HashToScalar-`);function sn(e,t,n){if(typeof t!=`function`)throw Error(`mapToCurve() must be defined`);function r(n){return e.fromAffine(t(n))}function i(t){let n=t.clearCofactor();return n.equals(e.ZERO)?e.ZERO:(n.assertValidity(),n)}return{defaults:Object.freeze(n),Point:e,hashToCurve(e,t){let a=an(e,2,Object.assign({},n,t)),o=r(a[0]),s=r(a[1]);return i(o.add(s))},encodeToCurve(e,t){let a=n.encodeDST?{DST:n.encodeDST}:{};return i(r(an(e,1,Object.assign({},n,a,t))[0]))},mapToCurve(e){if(n.m===1){if(typeof e!=`bigint`)throw Error(`expected bigint (m=1)`);return i(r([e]))}if(!Array.isArray(e))throw Error(`expected array of bigints`);for(let t of e)if(typeof t!=`bigint`)throw Error(`expected array of bigints`);return i(r(e))},hashToScalar(t,r){let i=e.Fn.ORDER;return an(t,1,Object.assign({},n,{p:i,m:1,DST:on},r))[0][0]}}}function cn(e){et(e,{name:`string`,hash:`function`,hashToScalar:`function`,hashToGroup:`function`});let{name:t,Point:n,hash:r}=e,{Fn:i}=n,a=(t,n)=>e.hashToGroup(t,{DST:k(z(`HashToGroup-`),n)}),o=(t,n)=>e.hashToScalar(t,{DST:k(on,n)}),s=(e=A)=>{let t=Ot(e(Dt(i.ORDER)),i.ORDER,i.isLE);return i.isLE?R(t):We(t)},c=(e,t)=>Ut(n,e,t),l=e=>k(z(`OPRFV1-`),new Uint8Array([e]),z(`-`+t)),u=l(0),d=l(1),f=l(2);function p(...e){let t=[];for(let n of e)typeof n==`number`?t.push(Ge(n,2)):typeof n==`string`?t.push(z(n)):(D(n),t.push(Ge(n.length,2),n));return k(...t)}let m=(...e)=>r(p(...e,`Finalize`));function h(e,t,n,i){let a=r(p(e.toBytes(),k(z(`Seed-`),i))),s=[];for(let e=0;e<t.length;e++){let r=t[e].toBytes(),c=n[e].toBytes(),l=o(p(a,e,r,c,`Composite`),i);s.push(l)}return s}function g(e,t,n,r){let i=h(e,t,n,r);return{M:c(t,i),Z:c(n,i)}}function _(e,t,n,r,i){let a=c(n,h(t,n,r,i));return{M:a,Z:a.multiply(e)}}function v(e,t,n,r,i,a){let[s,c,l,u,d]=[e,t,n,r,i].map(e=>e.toBytes());return o(p(s,c,l,u,d,`Challenge`),a)}function y(e,t,r,a,o,c){let{M:l,Z:u}=_(t,r,a,o,e),d=s(c),f=v(r,l,u,n.BASE.multiply(d),l.multiply(d),e);return k(...[f,i.sub(d,i.mul(f,t))].map(e=>i.toBytes(e)))}function b(e,t,r,a,o){D(o,2*i.BYTES);let{M:s,Z:c}=g(t,r,a,e),[l,u]=[o.subarray(0,i.BYTES),o.subarray(i.BYTES)].map(e=>i.fromBytes(e)),d=v(t,s,c,n.BASE.multiply(u).add(t.multiply(l)),s.multiply(u).add(c.multiply(l)),e);if(!i.eql(l,d))throw Error(`proof verification failed`)}function x(){let e=s(),t=n.BASE.multiply(e);return{secretKey:i.toBytes(e),publicKey:t.toBytes()}}function S(t,r,a){let o=k(z(`DeriveKeyPair`),t),s=k(r,p(a),Uint8Array.of(0));for(let t=0;t<=255;t++){s[s.length-1]=t;let r=e.hashToScalar(s,{DST:o});if(!i.is0(r))return{secretKey:i.toBytes(r),publicKey:n.BASE.multiply(r).toBytes()}}throw Error(`Cannot derive key`)}function C(e,t,r=A){let o=s(r),c=a(t,e);if(c.equals(n.ZERO))throw Error(`Input point at infinity`);let l=c.multiply(o);return{blind:i.toBytes(o),blinded:l.toBytes()}}function w(e,t,r){let o=i.fromBytes(t),s=a(r,e);if(s.equals(n.ZERO))throw Error(`Input point at infinity`);return m(r,s.multiply(o).toBytes())}let T={generateKeyPair:x,deriveKeyPair:(e,t)=>S(u,e,t),blind:(e,t=A)=>C(u,e,t),blindEvaluate(e,t){let r=i.fromBytes(e);return n.fromBytes(t).multiply(r).toBytes()},finalize(e,t,r){let a=i.fromBytes(t);return m(e,n.fromBytes(r).multiply(i.inv(a)).toBytes())},evaluate:(e,t)=>w(u,e,t)};return Object.freeze({name:t,oprf:T,voprf:{generateKeyPair:x,deriveKeyPair:(e,t)=>S(d,e,t),blind:(e,t=A)=>C(d,e,t),blindEvaluateBatch(e,t,r,a=A){if(!Array.isArray(r))throw Error(`expected array`);let o=i.fromBytes(e),s=n.fromBytes(t),c=r.map(n.fromBytes),l=c.map(e=>e.multiply(o)),u=y(d,o,s,c,l,a);return{evaluated:l.map(e=>e.toBytes()),proof:u}},blindEvaluate(e,t,n,r=A){let i=this.blindEvaluateBatch(e,t,[n],r);return{evaluated:i.evaluated[0],proof:i.proof}},finalizeBatch(e,t,r){if(!Array.isArray(e))throw Error(`expected array`);return b(d,n.fromBytes(t),e.map(e=>e.blinded).map(n.fromBytes),e.map(e=>e.evaluated).map(n.fromBytes),r),e.map(e=>T.finalize(e.input,e.blind,e.evaluated))},finalize(e,t,n,r,i,a){return this.finalizeBatch([{input:e,blind:t,evaluated:n,blinded:r}],i,a)[0]},evaluate:(e,t)=>w(d,e,t)},poprf:e=>{let t=o(p(`Info`,e),f),r=n.BASE.multiply(t);return{generateKeyPair:x,deriveKeyPair:(e,t)=>S(f,e,t),blind(e,t,o=A){let c=n.fromBytes(t),l=r.add(c);if(l.equals(n.ZERO))throw Error(`tweakedKey point at infinity`);let u=s(o),d=a(e,f);if(d.equals(n.ZERO))throw Error(`Input point at infinity`);let p=d.multiply(u);return{blind:i.toBytes(u),blinded:p.toBytes(),tweakedKey:l.toBytes()}},blindEvaluateBatch(e,r,a=A){if(!Array.isArray(r))throw Error(`expected array`);let o=i.fromBytes(e),s=i.add(o,t),c=i.inv(s),l=r.map(n.fromBytes),u=l.map(e=>e.multiply(c)),d=y(f,s,n.BASE.multiply(s),u,l,a);return{evaluated:u.map(e=>e.toBytes()),proof:d}},blindEvaluate(e,t,n=A){let r=this.blindEvaluateBatch(e,[t],n);return{evaluated:r.evaluated[0],proof:r.proof}},finalizeBatch(t,r,a){if(!Array.isArray(t))throw Error(`expected array`);let o=t.map(e=>e.evaluated).map(n.fromBytes);return b(f,n.fromBytes(a),o,t.map(e=>e.blinded).map(n.fromBytes),r),t.map((t,n)=>{let r=i.fromBytes(t.blind),a=o[n].multiply(i.inv(r)).toBytes();return m(t.input,e,a)})},finalize(e,t,n,r,i,a){return this.finalizeBatch([{input:e,blind:t,evaluated:n,blinded:r}],i,a)[0]},evaluate(r,o){let s=i.fromBytes(r),c=a(o,f);if(c.equals(n.ZERO))throw Error(`Input point at infinity`);let l=i.add(s,t),u=i.inv(l);return m(o,e,c.multiply(u).toBytes())}}},__tests:{Fn:i}})}var ln=BigInt(0),Y=BigInt(1),un=BigInt(2),dn=BigInt(3),fn=BigInt(5),pn=BigInt(8),X=BigInt(`0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffed`),mn={p:X,n:BigInt(`0x1000000000000000000000000000000014def9dea2f79cd65812631a5cf5d3ed`),h:pn,a:BigInt(`0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec`),d:BigInt(`0x52036cee2b6ffe738cc740797779e89800700a4d4141d8ab75eb4dca135978a3`),Gx:BigInt(`0x216936d3cd6e53fec0a4e231fdd6dc5c692cc7609525a7b2c9562d608f25d51a`),Gy:BigInt(`0x6666666666666666666666666666666666666666666666666666666666666658`)};function hn(e){let t=BigInt(10),n=BigInt(20),r=BigInt(40),i=BigInt(80),a=X,o=e*e%a*e%a,s=W(W(o,un,a)*o%a,Y,a)*e%a,c=W(s,fn,a)*s%a,l=W(c,t,a)*c%a,u=W(l,n,a)*l%a,d=W(u,r,a)*u%a;return{pow_p_5_8:W(W(W(W(d,i,a)*d%a,i,a)*d%a,t,a)*c%a,un,a)*e%a,b2:o}}function gn(e){return e[0]&=248,e[31]&=127,e[31]|=64,e}var _n=BigInt(`19681161376707505956807079304988542015446066515923890162744021073123829784752`);function vn(e,t){let n=X,r=U(t*t*t,n),i=hn(e*U(r*r*t,n)).pow_p_5_8,a=U(e*r*i,n),o=U(t*a*a,n),s=a,c=U(a*_n,n),l=o===e,u=o===U(-e,n),d=o===U(-e*_n,n);return l&&(a=s),(u||d)&&(a=c),G(a,n)&&(a=U(-a,n)),{isValid:l||u,value:a}}var Z=Xt(mn,{uvRatio:vn}),Q=Z.Fp,yn=Z.Fn;function bn(e){return Qt(Z,Re,Object.assign({adjustScalarBytes:gn},e))}var xn=bn({}),Sn=(X+dn)/pn,Cn=Q.pow(un,Sn),wn=Q.sqrt(Q.neg(Q.ONE));function Tn(e){let t=(X-fn)/pn,n=BigInt(486662),r=Q.sqr(e);r=Q.mul(r,un);let i=Q.add(r,Q.ONE),a=Q.neg(n),o=Q.sqr(i),s=Q.mul(o,i),c=Q.mul(r,n);c=Q.mul(c,a),c=Q.add(c,o),c=Q.mul(c,a);let l=Q.sqr(s);o=Q.sqr(l),l=Q.mul(l,s),l=Q.mul(l,c),o=Q.mul(o,l);let u=Q.pow(o,t);u=Q.mul(u,l);let d=Q.mul(u,wn);o=Q.sqr(u),o=Q.mul(o,s);let f=Q.eql(o,c),p=Q.cmov(d,u,f),m=Q.mul(a,r),h=Q.mul(u,e);h=Q.mul(h,Cn);let g=Q.mul(h,wn),_=Q.mul(c,r);o=Q.sqr(h),o=Q.mul(o,s);let v=Q.eql(o,_),y=Q.cmov(g,h,v);o=Q.sqr(p),o=Q.mul(o,s);let b=Q.eql(o,c),x=Q.cmov(m,a,b),S=Q.cmov(y,p,b),C=Q.isOdd(S);return S=Q.cmov(S,Q.neg(S),b!==C),{xMn:x,xMd:i,yMn:S,yMd:Y}}var En=Tt(Q,Q.neg(BigInt(486664)));function Dn(e){let{xMn:t,xMd:n,yMn:r,yMd:i}=Tn(e),a=Q.mul(t,i);a=Q.mul(a,En);let o=Q.mul(n,r),s=Q.sub(t,n),c=Q.add(t,n),l=Q.mul(o,c),u=Q.eql(l,Q.ZERO);a=Q.cmov(a,Q.ZERO,u),o=Q.cmov(o,Q.ONE,u),s=Q.cmov(s,Q.ONE,u),c=Q.cmov(c,Q.ONE,u);let[d,f]=bt(Q,[o,c],!0);return{x:Q.mul(a,d),y:Q.mul(s,f)}}sn(Z,e=>Dn(e[0]),{DST:`edwards25519_XMD:SHA-512_ELL2_RO_`,encodeDST:`edwards25519_XMD:SHA-512_ELL2_NU_`,p:X,m:1,k:128,expand:`xmd`,hash:Re});var On=_n,kn=BigInt(`25063068953384623474111414158702152701244531502492656460079210482610430750235`),An=BigInt(`54469307008909316920995813868745141605393597292927456921205312896311721017578`),jn=BigInt(`1159843021668779879193775521855586647937357759715417654439879720876111806838`),Mn=BigInt(`40440834346308536858101042469323190826248399146238708352240133220865137265952`),Nn=e=>vn(Y,e),Pn=BigInt(`0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff`),Fn=e=>Q.create(R(e)&Pn);function In(e){let{d:t}=mn,n=X,r=e=>Q.create(e),i=r(On*e*e),a=r((i+Y)*jn),o=BigInt(-1),s=r((o-t*i)*r(i+t)),{isValid:c,value:l}=vn(a,s),u=r(l*e);G(u,n)||(u=r(-u)),c||(l=u),c||(o=i);let d=r(o*(i-Y)*Mn-s),f=l*l,p=r((l+l)*s),m=r(d*kn),h=r(Y-f),g=r(Y+f);return new Z(r(p*g),r(h*m),r(m*g),r(p*h))}var Ln=class e extends Zt{static BASE=new e(Z.BASE);static ZERO=new e(Z.ZERO);static Fp=Q;static Fn=yn;constructor(e){super(e)}static fromAffine(t){return new e(Z.fromAffine(t))}assertSame(t){if(!(t instanceof e))throw Error(`RistrettoPoint expected`)}init(t){return new e(t)}static fromBytes(t){D(t,32);let{a:n,d:r}=mn,i=X,a=e=>Q.create(e),o=Fn(t);if(!qe(Q.toBytes(o),t)||G(o,i))throw Error(`invalid ristretto255 encoding 1`);let s=a(o*o),c=a(Y+n*s),l=a(Y-n*s),u=a(c*c),d=a(l*l),f=a(n*r*u-d),{isValid:p,value:m}=Nn(a(f*d)),h=a(m*l),g=a(m*h*f),_=a((o+o)*h);G(_,i)&&(_=a(-_));let v=a(c*g),y=a(_*v);if(!p||G(y,i)||v===ln)throw Error(`invalid ristretto255 encoding 2`);return new e(new Z(_,v,Y,y))}static fromHex(t){return e.fromBytes(he(t))}toBytes(){let{X:e,Y:t,Z:n,T:r}=this.ep,i=X,a=e=>Q.create(e),o=a(a(n+t)*a(n-t)),s=a(e*t),{value:c}=Nn(a(o*a(s*s))),l=a(c*o),u=a(c*s),d=a(l*u*r),f;if(G(r*d,i)){let n=a(t*On),r=a(e*On);e=n,t=r,f=a(l*An)}else f=u;G(e*d,i)&&(t=a(-t));let p=a((n-t)*f);return G(p,i)&&(p=a(-p)),Q.toBytes(p)}equals(e){this.assertSame(e);let{X:t,Y:n}=this.ep,{X:r,Y:i}=e.ep,a=e=>Q.create(e),o=a(t*i)===a(n*r),s=a(n*i)===a(t*r);return o||s}is0(){return this.equals(e.ZERO)}},Rn={Point:Ln,hashToCurve(e,t){let n=nn(e,t?.DST||`ristretto255_XMD:SHA-512_R255MAP_RO_`,64,Re);return Rn.deriveToCurve(n)},hashToScalar(e,t={DST:on}){let n=nn(e,t.DST,64,Re);return yn.create(R(n))},deriveToCurve(e){D(e,64);let t=In(Fn(e.subarray(0,32))),n=In(Fn(e.subarray(32,64)));return new Ln(t.add(n))}};cn({name:`ristretto255-SHA512`,Point:Ln,hash:Re,hashToGroup:Rn.hashToCurve,hashToScalar:Rn.hashToScalar});var $=32,zn=248,Bn=127,Vn=64,Hn=128,Un=127;function Wn(e){e.length<$||(e[0]=(e[0]??0)&zn,e[$-1]=(e[$-1]??0)&Bn|Vn)}function Gn(){let t=new Uint8Array((0,e.randomBytes)($));Wn(t);let n=Yn(t)%xn.Point.CURVE().n;return[xn.Point.BASE.multiply(n).toBytes(),Uint8Array.from(t)]}function Kn(t,n){let r=(0,e.createSign)(`SHA256`);return r.update(n),r.sign(t)}function qn(t,n,r){try{let i=(0,e.createVerify)(`SHA256`);return i.update(n),i.verify(t,Buffer.from(r))}catch{return!1}}function Jn(t,n){if(t.length!==$||n.length!==$)throw Error(`invalid key length`);let r=Uint8Array.from(n);r[$-1]=(r[$-1]??0)&Un;let i=Yn(r)%xn.Point.CURVE().n,a=xn.Point.fromBytes(t).negate().multiply(i).toBytes();return a[$-1]=(a[$-1]??0)^Hn,(0,e.createHash)(`sha512`).update(a).digest()}function Yn(e){let t=0n;for(let n=e.length-1;n>=0;n--)t=t<<8n|BigInt(e[n]);return t}Object.defineProperty(exports,`S`,{enumerable:!0,get:function(){return t}}),Object.defineProperty(exports,`_`,{enumerable:!0,get:function(){return o}}),Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return qn}}),Object.defineProperty(exports,`b`,{enumerable:!0,get:function(){return u}}),Object.defineProperty(exports,`c`,{enumerable:!0,get:function(){return g}}),Object.defineProperty(exports,`d`,{enumerable:!0,get:function(){return h}}),Object.defineProperty(exports,`f`,{enumerable:!0,get:function(){return b}}),Object.defineProperty(exports,`g`,{enumerable:!0,get:function(){return a}}),Object.defineProperty(exports,`h`,{enumerable:!0,get:function(){return l}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return Kn}}),Object.defineProperty(exports,`l`,{enumerable:!0,get:function(){return _}}),Object.defineProperty(exports,`m`,{enumerable:!0,get:function(){return r}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return Gn}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return xn}}),Object.defineProperty(exports,`p`,{enumerable:!0,get:function(){return i}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return Jn}}),Object.defineProperty(exports,`s`,{enumerable:!0,get:function(){return m}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return Wn}}),Object.defineProperty(exports,`u`,{enumerable:!0,get:function(){return v}}),Object.defineProperty(exports,`v`,{enumerable:!0,get:function(){return s}}),Object.defineProperty(exports,`x`,{enumerable:!0,get:function(){return n}}),Object.defineProperty(exports,`y`,{enumerable:!0,get:function(){return c}});
|
|
2
|
+
//# sourceMappingURL=primitives-BxtDMP7x.cjs.map
|