@honeybbq/teamspeak-client 0.1.0 → 0.2.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/README.md +14 -1
- package/dist/client.d.ts +6 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/{crypt-init2-BIbQ7TN0.cjs → crypt-init2-C2oihZ7e.cjs} +2 -2
- package/dist/crypt-init2-C2oihZ7e.cjs.map +1 -0
- package/dist/{crypt-init2-C63eypta.js → crypt-init2-DWX7Tp-_.js} +36 -41
- package/dist/crypt-init2-DWX7Tp-_.js.map +1 -0
- package/dist/crypto/identity.d.ts.map +1 -1
- package/dist/crypto/index.cjs +1 -1
- package/dist/crypto/index.mjs +3 -3
- package/dist/crypto/primitives.d.ts +17 -2
- package/dist/crypto/primitives.d.ts.map +1 -1
- package/dist/{crypto-C3gBJkh2.cjs → crypto-2veVY1fC.cjs} +2 -2
- package/dist/{crypto-C3gBJkh2.cjs.map → crypto-2veVY1fC.cjs.map} +1 -1
- package/dist/{crypto-IGJlkTAl.js → crypto-VC7n6YJb.js} +12 -12
- package/dist/{crypto-IGJlkTAl.js.map → crypto-VC7n6YJb.js.map} +1 -1
- package/dist/{handler-C2vxlHYC.js → handler-C_JhqGTd.js} +2 -5
- package/dist/handler-C_JhqGTd.js.map +1 -0
- package/dist/{handler-DQteUMKT.cjs → handler-CqCD93f0.cjs} +2 -2
- package/dist/handler-CqCD93f0.cjs.map +1 -0
- package/dist/handshake/index.cjs +1 -1
- package/dist/handshake/index.mjs +1 -1
- package/dist/handshake.d.ts.map +1 -1
- package/dist/handshake.test.d.ts +2 -0
- package/dist/handshake.test.d.ts.map +1 -0
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.mjs +217 -199
- package/dist/index.mjs.map +1 -1
- package/dist/{primitives-CmIK1O7L.js → primitives-BIAYfJ2Y.js} +12 -6
- package/dist/primitives-BIAYfJ2Y.js.map +1 -0
- package/dist/primitives-bj-ml31v.cjs +2 -0
- package/dist/primitives-bj-ml31v.cjs.map +1 -0
- package/dist/transport/handler.d.ts.map +1 -1
- package/dist/transport/index.cjs +1 -1
- package/dist/transport/index.mjs +1 -1
- package/dist/types-CGKgXvpG.js.map +1 -1
- package/dist/types-DrnoCdSW.cjs.map +1 -1
- package/dist/types.d.ts +6 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +4 -4
- package/dist/crypt-init2-BIbQ7TN0.cjs.map +0 -1
- package/dist/crypt-init2-C63eypta.js.map +0 -1
- package/dist/handler-C2vxlHYC.js.map +0 -1
- package/dist/handler-DQteUMKT.cjs.map +0 -1
- package/dist/primitives-BxtDMP7x.cjs +0 -2
- package/dist/primitives-BxtDMP7x.cjs.map +0 -1
- package/dist/primitives-CmIK1O7L.js.map +0 -1
package/dist/transport/index.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { a as e, c as t, d as n, i as r, l as i, n as a, o, r as s, s as c, t as l, u } from "../handler-
|
|
1
|
+
import { a as e, c as t, d as n, i as r, l as i, n as a, o, r as s, s as c, t as l, u } from "../handler-C_JhqGTd.js";
|
|
2
2
|
export { s as GenerationWindow, r as PacketFlags, l as PacketHandler, e as PacketType, a as Qlz, o as buildC2SHeader, c as isUnencrypted, t as packetFlags, i as packetType, u as parseC2SHeader, n as parseS2CHeader };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types-CGKgXvpG.js","names":[],"sources":["../src/types.ts"],"sourcesContent":["// ---- Branded primitive types ------------------------------------------------\n\n/** A TS3-escaped string. Obtained only via escape(). */\nexport type EscapedString = string & { readonly __escaped: unique symbol };\n\n// ---- Event map --------------------------------------------------------------\n\nexport interface TextMessage {\n invokerName: string;\n invokerUID: string;\n message: string;\n invokerGroups: string[];\n targetMode: number;\n targetID: bigint;\n invokerID: number;\n}\n\nexport interface ClientMovedEvent {\n invokerName: string;\n invokerUID: string;\n targetChannelID: bigint;\n reasonID: number;\n id: number;\n invokerID: number;\n}\n\nexport interface ClientLeftViewEvent {\n reasonMsg: string;\n reasonID: number;\n id: number;\n targetID: number;\n}\n\nexport interface ClientInfo {\n nickname: string;\n uid: string;\n serverGroups: string[];\n channelID: bigint;\n type: number;\n id: number;\n}\n\nexport interface ChannelInfo {\n name: string;\n description: string;\n id: bigint;\n parentID: bigint;\n}\n\nexport interface FileUploadInfo {\n fileTransferKey: string;\n seekPosition: bigint;\n clientFileTransferID: number;\n serverFileTransferID: number;\n port: number;\n}\n\nexport interface FileDownloadInfo {\n fileTransferKey: string;\n size: bigint;\n clientFileTransferID: number;\n serverFileTransferID: number;\n port: number;\n}\n\nexport interface FileTransferStatusInfo {\n message: string;\n status: number;\n clientFileTransferID: number;\n}\n\nexport interface PokeEvent {\n invokerName: string;\n invokerUID: string;\n invokerID: number;\n message: string;\n}\n\nexport interface VoiceData {\n clientId: number;\n codec: number;\n data: Uint8Array;\n}\n\n// ---- Typed event map used by Client.on() ------------------------------------\n\nexport interface EventMap {\n textMessage: TextMessage;\n clientEnter: ClientInfo;\n clientLeave: ClientLeftViewEvent;\n clientMoved: ClientMovedEvent;\n poked: PokeEvent;\n voiceData: VoiceData;\n connected: void;\n disconnected: Error | undefined;\n kicked: string;\n}\n\n// ---- Client status ----------------------------------------------------------\n\nexport const enum ClientStatus {\n Disconnected = 0,\n Connecting = 1,\n Connected = 2,\n}\n\n// ---- Middleware types --------------------------------------------------------\n\nexport type CommandMiddleware = (\n next: (cmd: string) => Promise<void>,\n) => (cmd: string) => Promise<void>;\n\nexport type EventMiddleware = (\n next: (evt: EventMap[keyof EventMap]) => void,\n) => (evt: EventMap[keyof EventMap]) => void;\n\n// ---- Logger interface --------------------------------------------------------\n\nexport interface Logger {\n debug(msg: string, ...args: unknown[]): void;\n info(msg: string, ...args: unknown[]): void;\n warn(msg: string, ...args: unknown[]): void;\n error(msg: string, ...args: unknown[]): void;\n}\n\n/** A no-op logger that discards all messages. */\nexport const noopLogger: Logger = {\n debug() {},\n info() {},\n warn() {},\n error() {},\n};\n\n/** A console-backed logger. */\nexport const consoleLogger: Logger = {\n debug: console.debug.bind(console),\n info: console.info.bind(console),\n warn: console.warn.bind(console),\n error: console.error.bind(console),\n};\n\n// ---- Resolved address (from discovery) --------------------------------------\n\nexport interface ResolvedAddr {\n addr: string;\n source: string;\n expiry: Date;\n}\n\n// ---- AddrResolver interface -------------------------------------------------\n\nexport interface AddrResolver {\n resolve(addr: string, signal?: AbortSignal): Promise<ResolvedAddr[]>;\n}\n\n// ---- ClientOptions ----------------------------------------------------------\n\nexport interface ClientOptions {\n logger?: Logger;\n resolver?: AddrResolver;\n commandMiddleware?: CommandMiddleware[];\n eventMiddleware?: EventMiddleware[];\n}\n"],"mappings":";AAoGA,IAAkB,IAAX,yBAAA,GAAA;QACL,EAAA,EAAA,eAAA,KAAA,gBACA,EAAA,EAAA,aAAA,KAAA,cACA,EAAA,EAAA,YAAA,KAAA;KACD,EAsBY,IAAqB;CAChC,QAAQ;CACR,OAAO;CACP,OAAO;CACP,QAAQ;CACT,EAGY,IAAwB;CACnC,OAAO,QAAQ,MAAM,KAAK,QAAQ;CAClC,MAAM,QAAQ,KAAK,KAAK,QAAQ;CAChC,MAAM,QAAQ,KAAK,KAAK,QAAQ;CAChC,OAAO,QAAQ,MAAM,KAAK,QAAQ;CACnC"}
|
|
1
|
+
{"version":3,"file":"types-CGKgXvpG.js","names":[],"sources":["../src/types.ts"],"sourcesContent":["// ---- Branded primitive types ------------------------------------------------\n\n/** A TS3-escaped string. Obtained only via escape(). */\nexport type EscapedString = string & { readonly __escaped: unique symbol };\n\n// ---- Event map --------------------------------------------------------------\n\nexport interface TextMessage {\n invokerName: string;\n invokerUID: string;\n message: string;\n invokerGroups: string[];\n targetMode: number;\n targetID: bigint;\n invokerID: number;\n}\n\nexport interface ClientMovedEvent {\n invokerName: string;\n invokerUID: string;\n targetChannelID: bigint;\n reasonID: number;\n id: number;\n invokerID: number;\n}\n\nexport interface ClientLeftViewEvent {\n reasonMsg: string;\n reasonID: number;\n id: number;\n targetID: number;\n}\n\nexport interface ClientInfo {\n nickname: string;\n uid: string;\n serverGroups: string[];\n channelID: bigint;\n type: number;\n id: number;\n}\n\nexport interface ChannelInfo {\n name: string;\n description: string;\n id: bigint;\n parentID: bigint;\n}\n\nexport interface FileUploadInfo {\n fileTransferKey: string;\n seekPosition: bigint;\n clientFileTransferID: number;\n serverFileTransferID: number;\n port: number;\n}\n\nexport interface FileDownloadInfo {\n fileTransferKey: string;\n size: bigint;\n clientFileTransferID: number;\n serverFileTransferID: number;\n port: number;\n}\n\nexport interface FileTransferStatusInfo {\n message: string;\n status: number;\n clientFileTransferID: number;\n}\n\nexport interface PokeEvent {\n invokerName: string;\n invokerUID: string;\n invokerID: number;\n message: string;\n}\n\nexport interface VoiceData {\n clientId: number;\n codec: number;\n data: Uint8Array;\n}\n\n// ---- Typed event map used by Client.on() ------------------------------------\n\nexport interface EventMap {\n textMessage: TextMessage;\n clientEnter: ClientInfo;\n clientLeave: ClientLeftViewEvent;\n clientMoved: ClientMovedEvent;\n poked: PokeEvent;\n voiceData: VoiceData;\n connected: void;\n disconnected: Error | undefined;\n kicked: string;\n}\n\n// ---- Client status ----------------------------------------------------------\n\nexport const enum ClientStatus {\n Disconnected = 0,\n Connecting = 1,\n Connected = 2,\n}\n\n// ---- Middleware types --------------------------------------------------------\n\nexport type CommandMiddleware = (\n next: (cmd: string) => Promise<void>,\n) => (cmd: string) => Promise<void>;\n\nexport type EventMiddleware = (\n next: (evt: EventMap[keyof EventMap]) => void,\n) => (evt: EventMap[keyof EventMap]) => void;\n\n// ---- Logger interface --------------------------------------------------------\n\nexport interface Logger {\n debug(msg: string, ...args: unknown[]): void;\n info(msg: string, ...args: unknown[]): void;\n warn(msg: string, ...args: unknown[]): void;\n error(msg: string, ...args: unknown[]): void;\n}\n\n/** A no-op logger that discards all messages. */\nexport const noopLogger: Logger = {\n debug() {},\n info() {},\n warn() {},\n error() {},\n};\n\n/** A console-backed logger. */\nexport const consoleLogger: Logger = {\n debug: console.debug.bind(console),\n info: console.info.bind(console),\n warn: console.warn.bind(console),\n error: console.error.bind(console),\n};\n\n// ---- Resolved address (from discovery) --------------------------------------\n\nexport interface ResolvedAddr {\n addr: string;\n source: string;\n expiry: Date;\n}\n\n// ---- AddrResolver interface -------------------------------------------------\n\nexport interface AddrResolver {\n resolve(addr: string, signal?: AbortSignal): Promise<ResolvedAddr[]>;\n}\n\n// ---- ClientOptions ----------------------------------------------------------\n\nexport interface ClientOptions {\n logger?: Logger;\n resolver?: AddrResolver;\n commandMiddleware?: CommandMiddleware[];\n eventMiddleware?: EventMiddleware[];\n /** Server password sent during the initial `clientinit` handshake. */\n serverPassword?: string;\n /** Default channel name to join during the initial `clientinit` handshake. */\n defaultChannel?: string;\n /** Password for `defaultChannel`, sent during the initial `clientinit` handshake. */\n defaultChannelPassword?: string;\n}\n"],"mappings":";AAoGA,IAAkB,IAAX,yBAAA,GAAA;QACL,EAAA,EAAA,eAAA,KAAA,gBACA,EAAA,EAAA,aAAA,KAAA,cACA,EAAA,EAAA,YAAA,KAAA;KACD,EAsBY,IAAqB;CAChC,QAAQ;CACR,OAAO;CACP,OAAO;CACP,QAAQ;CACT,EAGY,IAAwB;CACnC,OAAO,QAAQ,MAAM,KAAK,QAAQ;CAClC,MAAM,QAAQ,KAAK,KAAK,QAAQ;CAChC,MAAM,QAAQ,KAAK,KAAK,QAAQ;CAChC,OAAO,QAAQ,MAAM,KAAK,QAAQ;CACnC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types-DrnoCdSW.cjs","names":[],"sources":["../src/types.ts"],"sourcesContent":["// ---- Branded primitive types ------------------------------------------------\n\n/** A TS3-escaped string. Obtained only via escape(). */\nexport type EscapedString = string & { readonly __escaped: unique symbol };\n\n// ---- Event map --------------------------------------------------------------\n\nexport interface TextMessage {\n invokerName: string;\n invokerUID: string;\n message: string;\n invokerGroups: string[];\n targetMode: number;\n targetID: bigint;\n invokerID: number;\n}\n\nexport interface ClientMovedEvent {\n invokerName: string;\n invokerUID: string;\n targetChannelID: bigint;\n reasonID: number;\n id: number;\n invokerID: number;\n}\n\nexport interface ClientLeftViewEvent {\n reasonMsg: string;\n reasonID: number;\n id: number;\n targetID: number;\n}\n\nexport interface ClientInfo {\n nickname: string;\n uid: string;\n serverGroups: string[];\n channelID: bigint;\n type: number;\n id: number;\n}\n\nexport interface ChannelInfo {\n name: string;\n description: string;\n id: bigint;\n parentID: bigint;\n}\n\nexport interface FileUploadInfo {\n fileTransferKey: string;\n seekPosition: bigint;\n clientFileTransferID: number;\n serverFileTransferID: number;\n port: number;\n}\n\nexport interface FileDownloadInfo {\n fileTransferKey: string;\n size: bigint;\n clientFileTransferID: number;\n serverFileTransferID: number;\n port: number;\n}\n\nexport interface FileTransferStatusInfo {\n message: string;\n status: number;\n clientFileTransferID: number;\n}\n\nexport interface PokeEvent {\n invokerName: string;\n invokerUID: string;\n invokerID: number;\n message: string;\n}\n\nexport interface VoiceData {\n clientId: number;\n codec: number;\n data: Uint8Array;\n}\n\n// ---- Typed event map used by Client.on() ------------------------------------\n\nexport interface EventMap {\n textMessage: TextMessage;\n clientEnter: ClientInfo;\n clientLeave: ClientLeftViewEvent;\n clientMoved: ClientMovedEvent;\n poked: PokeEvent;\n voiceData: VoiceData;\n connected: void;\n disconnected: Error | undefined;\n kicked: string;\n}\n\n// ---- Client status ----------------------------------------------------------\n\nexport const enum ClientStatus {\n Disconnected = 0,\n Connecting = 1,\n Connected = 2,\n}\n\n// ---- Middleware types --------------------------------------------------------\n\nexport type CommandMiddleware = (\n next: (cmd: string) => Promise<void>,\n) => (cmd: string) => Promise<void>;\n\nexport type EventMiddleware = (\n next: (evt: EventMap[keyof EventMap]) => void,\n) => (evt: EventMap[keyof EventMap]) => void;\n\n// ---- Logger interface --------------------------------------------------------\n\nexport interface Logger {\n debug(msg: string, ...args: unknown[]): void;\n info(msg: string, ...args: unknown[]): void;\n warn(msg: string, ...args: unknown[]): void;\n error(msg: string, ...args: unknown[]): void;\n}\n\n/** A no-op logger that discards all messages. */\nexport const noopLogger: Logger = {\n debug() {},\n info() {},\n warn() {},\n error() {},\n};\n\n/** A console-backed logger. */\nexport const consoleLogger: Logger = {\n debug: console.debug.bind(console),\n info: console.info.bind(console),\n warn: console.warn.bind(console),\n error: console.error.bind(console),\n};\n\n// ---- Resolved address (from discovery) --------------------------------------\n\nexport interface ResolvedAddr {\n addr: string;\n source: string;\n expiry: Date;\n}\n\n// ---- AddrResolver interface -------------------------------------------------\n\nexport interface AddrResolver {\n resolve(addr: string, signal?: AbortSignal): Promise<ResolvedAddr[]>;\n}\n\n// ---- ClientOptions ----------------------------------------------------------\n\nexport interface ClientOptions {\n logger?: Logger;\n resolver?: AddrResolver;\n commandMiddleware?: CommandMiddleware[];\n eventMiddleware?: EventMiddleware[];\n}\n"],"mappings":"AAoGA,IAAkB,EAAX,SAAA,EAAA,OACL,GAAA,EAAA,aAAA,GAAA,eACA,EAAA,EAAA,WAAA,GAAA,aACA,EAAA,EAAA,UAAA,GAAA,kBACD,CAsBY,EAAqB,CAChC,OAAQ,GACR,MAAO,GACP,MAAO,GACP,OAAQ,GACT,CAGY,EAAwB,CACnC,MAAO,QAAQ,MAAM,KAAK,QAAQ,CAClC,KAAM,QAAQ,KAAK,KAAK,QAAQ,CAChC,KAAM,QAAQ,KAAK,KAAK,QAAQ,CAChC,MAAO,QAAQ,MAAM,KAAK,QAAQ,CACnC"}
|
|
1
|
+
{"version":3,"file":"types-DrnoCdSW.cjs","names":[],"sources":["../src/types.ts"],"sourcesContent":["// ---- Branded primitive types ------------------------------------------------\n\n/** A TS3-escaped string. Obtained only via escape(). */\nexport type EscapedString = string & { readonly __escaped: unique symbol };\n\n// ---- Event map --------------------------------------------------------------\n\nexport interface TextMessage {\n invokerName: string;\n invokerUID: string;\n message: string;\n invokerGroups: string[];\n targetMode: number;\n targetID: bigint;\n invokerID: number;\n}\n\nexport interface ClientMovedEvent {\n invokerName: string;\n invokerUID: string;\n targetChannelID: bigint;\n reasonID: number;\n id: number;\n invokerID: number;\n}\n\nexport interface ClientLeftViewEvent {\n reasonMsg: string;\n reasonID: number;\n id: number;\n targetID: number;\n}\n\nexport interface ClientInfo {\n nickname: string;\n uid: string;\n serverGroups: string[];\n channelID: bigint;\n type: number;\n id: number;\n}\n\nexport interface ChannelInfo {\n name: string;\n description: string;\n id: bigint;\n parentID: bigint;\n}\n\nexport interface FileUploadInfo {\n fileTransferKey: string;\n seekPosition: bigint;\n clientFileTransferID: number;\n serverFileTransferID: number;\n port: number;\n}\n\nexport interface FileDownloadInfo {\n fileTransferKey: string;\n size: bigint;\n clientFileTransferID: number;\n serverFileTransferID: number;\n port: number;\n}\n\nexport interface FileTransferStatusInfo {\n message: string;\n status: number;\n clientFileTransferID: number;\n}\n\nexport interface PokeEvent {\n invokerName: string;\n invokerUID: string;\n invokerID: number;\n message: string;\n}\n\nexport interface VoiceData {\n clientId: number;\n codec: number;\n data: Uint8Array;\n}\n\n// ---- Typed event map used by Client.on() ------------------------------------\n\nexport interface EventMap {\n textMessage: TextMessage;\n clientEnter: ClientInfo;\n clientLeave: ClientLeftViewEvent;\n clientMoved: ClientMovedEvent;\n poked: PokeEvent;\n voiceData: VoiceData;\n connected: void;\n disconnected: Error | undefined;\n kicked: string;\n}\n\n// ---- Client status ----------------------------------------------------------\n\nexport const enum ClientStatus {\n Disconnected = 0,\n Connecting = 1,\n Connected = 2,\n}\n\n// ---- Middleware types --------------------------------------------------------\n\nexport type CommandMiddleware = (\n next: (cmd: string) => Promise<void>,\n) => (cmd: string) => Promise<void>;\n\nexport type EventMiddleware = (\n next: (evt: EventMap[keyof EventMap]) => void,\n) => (evt: EventMap[keyof EventMap]) => void;\n\n// ---- Logger interface --------------------------------------------------------\n\nexport interface Logger {\n debug(msg: string, ...args: unknown[]): void;\n info(msg: string, ...args: unknown[]): void;\n warn(msg: string, ...args: unknown[]): void;\n error(msg: string, ...args: unknown[]): void;\n}\n\n/** A no-op logger that discards all messages. */\nexport const noopLogger: Logger = {\n debug() {},\n info() {},\n warn() {},\n error() {},\n};\n\n/** A console-backed logger. */\nexport const consoleLogger: Logger = {\n debug: console.debug.bind(console),\n info: console.info.bind(console),\n warn: console.warn.bind(console),\n error: console.error.bind(console),\n};\n\n// ---- Resolved address (from discovery) --------------------------------------\n\nexport interface ResolvedAddr {\n addr: string;\n source: string;\n expiry: Date;\n}\n\n// ---- AddrResolver interface -------------------------------------------------\n\nexport interface AddrResolver {\n resolve(addr: string, signal?: AbortSignal): Promise<ResolvedAddr[]>;\n}\n\n// ---- ClientOptions ----------------------------------------------------------\n\nexport interface ClientOptions {\n logger?: Logger;\n resolver?: AddrResolver;\n commandMiddleware?: CommandMiddleware[];\n eventMiddleware?: EventMiddleware[];\n /** Server password sent during the initial `clientinit` handshake. */\n serverPassword?: string;\n /** Default channel name to join during the initial `clientinit` handshake. */\n defaultChannel?: string;\n /** Password for `defaultChannel`, sent during the initial `clientinit` handshake. */\n defaultChannelPassword?: string;\n}\n"],"mappings":"AAoGA,IAAkB,EAAX,SAAA,EAAA,OACL,GAAA,EAAA,aAAA,GAAA,eACA,EAAA,EAAA,WAAA,GAAA,aACA,EAAA,EAAA,UAAA,GAAA,kBACD,CAsBY,EAAqB,CAChC,OAAQ,GACR,MAAO,GACP,MAAO,GACP,OAAQ,GACT,CAGY,EAAwB,CACnC,MAAO,QAAQ,MAAM,KAAK,QAAQ,CAClC,KAAM,QAAQ,KAAK,KAAK,QAAQ,CAChC,KAAM,QAAQ,KAAK,KAAK,QAAQ,CAChC,MAAO,QAAQ,MAAM,KAAK,QAAQ,CACnC"}
|
package/dist/types.d.ts
CHANGED
|
@@ -110,5 +110,11 @@ export interface ClientOptions {
|
|
|
110
110
|
resolver?: AddrResolver;
|
|
111
111
|
commandMiddleware?: CommandMiddleware[];
|
|
112
112
|
eventMiddleware?: EventMiddleware[];
|
|
113
|
+
/** Server password sent during the initial `clientinit` handshake. */
|
|
114
|
+
serverPassword?: string;
|
|
115
|
+
/** Default channel name to join during the initial `clientinit` handshake. */
|
|
116
|
+
defaultChannel?: string;
|
|
117
|
+
/** Password for `defaultChannel`, sent during the initial `clientinit` handshake. */
|
|
118
|
+
defaultChannelPassword?: string;
|
|
113
119
|
}
|
|
114
120
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@honeybbq/teamspeak-client",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "TeamSpeak 3 client SDK for Node.js — a clean-room TypeScript port of the Go reference implementation",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"client",
|
|
@@ -9,12 +9,12 @@
|
|
|
9
9
|
"ts3",
|
|
10
10
|
"voip"
|
|
11
11
|
],
|
|
12
|
+
"license": "MIT",
|
|
13
|
+
"author": "honeybbq",
|
|
12
14
|
"repository": {
|
|
13
15
|
"type": "git",
|
|
14
16
|
"url": "https://github.com/HoneyBBQ/teamspeak-js"
|
|
15
17
|
},
|
|
16
|
-
"license": "MIT",
|
|
17
|
-
"author": "honeybbq",
|
|
18
18
|
"files": [
|
|
19
19
|
"dist"
|
|
20
20
|
],
|
|
@@ -72,7 +72,7 @@
|
|
|
72
72
|
},
|
|
73
73
|
"devDependencies": {
|
|
74
74
|
"@types/node": "^25.5.0",
|
|
75
|
-
"oxfmt": "^0.
|
|
75
|
+
"oxfmt": "^0.44.0",
|
|
76
76
|
"oxlint": "^1.57.0",
|
|
77
77
|
"tsx": "^4.21.0",
|
|
78
78
|
"typescript": "^6.0.2",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"crypt-init2-BIbQ7TN0.cjs","names":[],"sources":["../src/handshake/license.ts","../src/handshake/crypt-init2.ts"],"sourcesContent":["import { hash512 } from \"../crypto/identity.js\";\nimport { clampScalar } from \"../crypto/primitives.js\";\nimport { ed25519 } from \"@noble/curves/ed25519.js\";\n\n// The root key is a 33-byte Ed25519 point\nconst LICENSE_ROOT_KEY = new Uint8Array([\n 0xcd, 0x0d, 0xe2, 0xae, 0xd4, 0x63, 0x45, 0x50, 0x9a, 0x7e, 0x3c, 0xfd, 0x8f, 0x68, 0xb3, 0xdc,\n 0x75, 0x55, 0xb2, 0x9d, 0xcc, 0xec, 0x73, 0xcd, 0x18, 0x75, 0x0f, 0x99, 0x38, 0x12, 0x40, 0x8a,\n]);\n\nconst enum LicenseBlockType {\n Intermediate = 0,\n Server = 2,\n Ts5Server = 8,\n Ephemeral = 32,\n}\n\ninterface LicenseBlock {\n readonly key: Uint8Array; // 32-byte Ed25519 point\n readonly hash: Uint8Array; // SHA-512 truncated to 32 bytes\n properties: Uint8Array[];\n issuer: string;\n notValidBefore: Date;\n notValidAfter: Date;\n blockType: LicenseBlockType;\n serverType: number;\n}\n\nexport class LicenseChain {\n readonly blocks: LicenseBlock[];\n\n constructor(blocks: LicenseBlock[]) {\n this.blocks = blocks;\n }\n\n /**\n * Derive the session key by chaining Ed25519 point arithmetic starting from\n * the root key through each license block.\n */\n deriveKey(): Uint8Array<ArrayBuffer> {\n let round: Uint8Array<ArrayBuffer> = Uint8Array.from(LICENSE_ROOT_KEY);\n for (const block of this.blocks) {\n round = deriveKeyFromBlock(block, round);\n }\n return round;\n }\n}\n\nexport function parseLicenses(data: Uint8Array): LicenseChain {\n if (data.length < 1) throw new Error(\"license too short\");\n if (data[0] !== 1) throw new Error(\"unsupported license version\");\n\n let remaining = data.slice(1);\n const blocks: LicenseBlock[] = [];\n\n while (remaining.length > 0) {\n const { block, consumed } = parseLicenseBlock(remaining);\n blocks.push(block);\n remaining = remaining.slice(consumed);\n }\n\n return new LicenseChain(blocks);\n}\n\nfunction parseLicenseBlock(data: Uint8Array): { block: LicenseBlock; consumed: number } {\n const MIN_BLOCK_LEN = 42;\n if (data.length < MIN_BLOCK_LEN) throw new Error(\"license too short\");\n if (data[0] !== 0) throw new Error(`wrong key kind in license: ${data[0]}`);\n\n const blockType = data[33] as LicenseBlockType;\n\n // Timestamps are seconds since Unix epoch offset by 0x50e22700\n const UNIX_OFFSET = 0x50e22700;\n const view = new DataView(data.buffer, data.byteOffset, data.byteLength);\n const notValidBefore = new Date((view.getUint32(34, false) + UNIX_OFFSET) * 1000);\n const notValidAfter = new Date((view.getUint32(38, false) + UNIX_OFFSET) * 1000);\n\n if (notValidAfter < notValidBefore) {\n throw new Error(\"license times are invalid\");\n }\n\n const key = Uint8Array.from(data.slice(1, 33));\n\n const { payload, payloadRead } = parseBlockPayload(blockType, data, MIN_BLOCK_LEN);\n\n const allLen = MIN_BLOCK_LEN + payloadRead;\n const hashInput = data.slice(1, allLen);\n const hashFull = hash512(Uint8Array.from(hashInput));\n const hash = Uint8Array.from(hashFull.slice(0, 32));\n\n return {\n block: {\n key,\n hash,\n properties: payload.properties,\n issuer: payload.issuer,\n notValidBefore,\n notValidAfter,\n blockType,\n serverType: payload.serverType,\n },\n consumed: allLen,\n };\n}\n\ninterface BlockPayload {\n issuer: string;\n serverType: number;\n properties: Uint8Array[];\n read: number;\n}\n\nfunction parseBlockPayload(\n blockType: LicenseBlockType,\n data: Uint8Array,\n minBlockLen: number,\n): { payload: BlockPayload; payloadRead: number } {\n switch (blockType) {\n case LicenseBlockType.Intermediate: {\n const { str, read } = readNullString(data.slice(46));\n return {\n payload: { issuer: str, serverType: 0, properties: [], read: 5 + read },\n payloadRead: 5 + read,\n };\n }\n case LicenseBlockType.Server: {\n const { str, read } = readNullString(data.slice(47));\n return {\n payload: { issuer: str, serverType: data[42] ?? 0, properties: [], read: 6 + read },\n payloadRead: 6 + read,\n };\n }\n case LicenseBlockType.Ts5Server: {\n const propCount = data[43] !== undefined ? data[43] : 0;\n let pos = 44;\n const properties: Uint8Array[] = [];\n for (let i = 0; i < propCount; i++) {\n if (pos >= data.length) throw new Error(\"license too short\");\n const propLen = data[pos++]!;\n if (pos + propLen > data.length) throw new Error(\"license too short\");\n properties.push(Uint8Array.from(data.slice(pos, pos + propLen)));\n pos += propLen;\n }\n return {\n payload: { issuer: \"\", serverType: data[42] ?? 0, properties, read: pos - minBlockLen },\n payloadRead: pos - minBlockLen,\n };\n }\n case LicenseBlockType.Ephemeral:\n return { payload: { issuer: \"\", serverType: 0, properties: [], read: 0 }, payloadRead: 0 };\n default:\n throw new Error(`invalid license block type: ${blockType}`);\n }\n}\n\n/**\n * Scan for a null-terminated string and return its content and the index\n * of the null byte (NOT including it in the count, matching Go behaviour).\n * The parent formulas (`5 + read`, `6 + read`) already add 1 for the null.\n */\nfunction readNullString(data: Uint8Array): { str: string; read: number } {\n for (let i = 0; i < data.length; i++) {\n if (data[i] === 0) {\n return { str: new TextDecoder().decode(data.slice(0, i)), read: i };\n }\n }\n throw new Error(\"non-null-terminated issuer string\");\n}\n\n/**\n * Derive the next key given a parent key and a license block.\n * Mirrors Go's licenseBlock.deriveKey.\n */\nfunction deriveKeyFromBlock(block: LicenseBlock, parent: Uint8Array): Uint8Array<ArrayBuffer> {\n const scalarBytes = Uint8Array.from(block.hash);\n clampScalar(scalarBytes);\n\n // Reduce mod curve order — matches Go's scalar.NewFromBits behaviour\n const scalar = bytesToBigIntLE(scalarBytes) % ed25519.Point.CURVE().n;\n\n const pub = ed25519.Point.fromBytes(block.key);\n const negPub = pub.negate();\n\n const par = ed25519.Point.fromBytes(parent);\n const negPar = par.negate();\n\n const res = negPub.multiply(scalar).add(negPar);\n const raw = res.toBytes();\n const final = new Uint8Array(raw.length) as Uint8Array<ArrayBuffer>;\n final.set(raw);\n final[31] = (final[31] !== undefined ? final[31] : 0) ^ 0x80;\n\n return final;\n}\n\nfunction bytesToBigIntLE(bytes: Uint8Array): bigint {\n let result = 0n;\n for (let i = bytes.length - 1; i >= 0; i--) {\n result = (result << 8n) | BigInt(bytes[i]!);\n }\n return result;\n}\n","import type { Crypt } from \"../crypto/crypt.js\";\nimport { importPublicKey } from \"../crypto/identity.js\";\nimport { verifySign, getSharedSecret2 } from \"../crypto/primitives.js\";\nimport { parseLicenses } from \"./license.js\";\n\n/**\n * CryptoInit2 performs the second stage of crypto initialization (Ed25519 ECDH).\n * Mirrors Go's handshake.CryptoInit2.\n */\nexport function cryptoInit2(\n crypt: Crypt,\n license: string,\n omega: string,\n proof: string,\n beta: string,\n privateKey: Uint8Array,\n): void {\n if (crypt.alphaTmp.length === 0) {\n throw new Error(\"alpha is not initialized\");\n }\n\n const licenseBytes = Buffer.from(license, \"base64\");\n const omegaBytes = Buffer.from(omega, \"base64\");\n const proofBytes = Buffer.from(proof, \"base64\");\n const betaBytes = Buffer.from(beta, \"base64\");\n\n const serverPubKey = importPublicKey(omegaBytes);\n if (!verifySign(serverPubKey, licenseBytes, proofBytes)) {\n throw new Error(\"init proof is not valid\");\n }\n\n const licenses = parseLicenses(licenseBytes);\n const key = licenses.deriveKey();\n\n const sharedSecret = getSharedSecret2(key, privateKey);\n\n crypt.setSharedSecret(crypt.alphaTmp, betaBytes, sharedSecret);\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"crypt-init2-C63eypta.js","names":[],"sources":["../src/handshake/license.ts","../src/handshake/crypt-init2.ts"],"sourcesContent":["import { hash512 } from \"../crypto/identity.js\";\nimport { clampScalar } from \"../crypto/primitives.js\";\nimport { ed25519 } from \"@noble/curves/ed25519.js\";\n\n// The root key is a 33-byte Ed25519 point\nconst LICENSE_ROOT_KEY = new Uint8Array([\n 0xcd, 0x0d, 0xe2, 0xae, 0xd4, 0x63, 0x45, 0x50, 0x9a, 0x7e, 0x3c, 0xfd, 0x8f, 0x68, 0xb3, 0xdc,\n 0x75, 0x55, 0xb2, 0x9d, 0xcc, 0xec, 0x73, 0xcd, 0x18, 0x75, 0x0f, 0x99, 0x38, 0x12, 0x40, 0x8a,\n]);\n\nconst enum LicenseBlockType {\n Intermediate = 0,\n Server = 2,\n Ts5Server = 8,\n Ephemeral = 32,\n}\n\ninterface LicenseBlock {\n readonly key: Uint8Array; // 32-byte Ed25519 point\n readonly hash: Uint8Array; // SHA-512 truncated to 32 bytes\n properties: Uint8Array[];\n issuer: string;\n notValidBefore: Date;\n notValidAfter: Date;\n blockType: LicenseBlockType;\n serverType: number;\n}\n\nexport class LicenseChain {\n readonly blocks: LicenseBlock[];\n\n constructor(blocks: LicenseBlock[]) {\n this.blocks = blocks;\n }\n\n /**\n * Derive the session key by chaining Ed25519 point arithmetic starting from\n * the root key through each license block.\n */\n deriveKey(): Uint8Array<ArrayBuffer> {\n let round: Uint8Array<ArrayBuffer> = Uint8Array.from(LICENSE_ROOT_KEY);\n for (const block of this.blocks) {\n round = deriveKeyFromBlock(block, round);\n }\n return round;\n }\n}\n\nexport function parseLicenses(data: Uint8Array): LicenseChain {\n if (data.length < 1) throw new Error(\"license too short\");\n if (data[0] !== 1) throw new Error(\"unsupported license version\");\n\n let remaining = data.slice(1);\n const blocks: LicenseBlock[] = [];\n\n while (remaining.length > 0) {\n const { block, consumed } = parseLicenseBlock(remaining);\n blocks.push(block);\n remaining = remaining.slice(consumed);\n }\n\n return new LicenseChain(blocks);\n}\n\nfunction parseLicenseBlock(data: Uint8Array): { block: LicenseBlock; consumed: number } {\n const MIN_BLOCK_LEN = 42;\n if (data.length < MIN_BLOCK_LEN) throw new Error(\"license too short\");\n if (data[0] !== 0) throw new Error(`wrong key kind in license: ${data[0]}`);\n\n const blockType = data[33] as LicenseBlockType;\n\n // Timestamps are seconds since Unix epoch offset by 0x50e22700\n const UNIX_OFFSET = 0x50e22700;\n const view = new DataView(data.buffer, data.byteOffset, data.byteLength);\n const notValidBefore = new Date((view.getUint32(34, false) + UNIX_OFFSET) * 1000);\n const notValidAfter = new Date((view.getUint32(38, false) + UNIX_OFFSET) * 1000);\n\n if (notValidAfter < notValidBefore) {\n throw new Error(\"license times are invalid\");\n }\n\n const key = Uint8Array.from(data.slice(1, 33));\n\n const { payload, payloadRead } = parseBlockPayload(blockType, data, MIN_BLOCK_LEN);\n\n const allLen = MIN_BLOCK_LEN + payloadRead;\n const hashInput = data.slice(1, allLen);\n const hashFull = hash512(Uint8Array.from(hashInput));\n const hash = Uint8Array.from(hashFull.slice(0, 32));\n\n return {\n block: {\n key,\n hash,\n properties: payload.properties,\n issuer: payload.issuer,\n notValidBefore,\n notValidAfter,\n blockType,\n serverType: payload.serverType,\n },\n consumed: allLen,\n };\n}\n\ninterface BlockPayload {\n issuer: string;\n serverType: number;\n properties: Uint8Array[];\n read: number;\n}\n\nfunction parseBlockPayload(\n blockType: LicenseBlockType,\n data: Uint8Array,\n minBlockLen: number,\n): { payload: BlockPayload; payloadRead: number } {\n switch (blockType) {\n case LicenseBlockType.Intermediate: {\n const { str, read } = readNullString(data.slice(46));\n return {\n payload: { issuer: str, serverType: 0, properties: [], read: 5 + read },\n payloadRead: 5 + read,\n };\n }\n case LicenseBlockType.Server: {\n const { str, read } = readNullString(data.slice(47));\n return {\n payload: { issuer: str, serverType: data[42] ?? 0, properties: [], read: 6 + read },\n payloadRead: 6 + read,\n };\n }\n case LicenseBlockType.Ts5Server: {\n const propCount = data[43] !== undefined ? data[43] : 0;\n let pos = 44;\n const properties: Uint8Array[] = [];\n for (let i = 0; i < propCount; i++) {\n if (pos >= data.length) throw new Error(\"license too short\");\n const propLen = data[pos++]!;\n if (pos + propLen > data.length) throw new Error(\"license too short\");\n properties.push(Uint8Array.from(data.slice(pos, pos + propLen)));\n pos += propLen;\n }\n return {\n payload: { issuer: \"\", serverType: data[42] ?? 0, properties, read: pos - minBlockLen },\n payloadRead: pos - minBlockLen,\n };\n }\n case LicenseBlockType.Ephemeral:\n return { payload: { issuer: \"\", serverType: 0, properties: [], read: 0 }, payloadRead: 0 };\n default:\n throw new Error(`invalid license block type: ${blockType}`);\n }\n}\n\n/**\n * Scan for a null-terminated string and return its content and the index\n * of the null byte (NOT including it in the count, matching Go behaviour).\n * The parent formulas (`5 + read`, `6 + read`) already add 1 for the null.\n */\nfunction readNullString(data: Uint8Array): { str: string; read: number } {\n for (let i = 0; i < data.length; i++) {\n if (data[i] === 0) {\n return { str: new TextDecoder().decode(data.slice(0, i)), read: i };\n }\n }\n throw new Error(\"non-null-terminated issuer string\");\n}\n\n/**\n * Derive the next key given a parent key and a license block.\n * Mirrors Go's licenseBlock.deriveKey.\n */\nfunction deriveKeyFromBlock(block: LicenseBlock, parent: Uint8Array): Uint8Array<ArrayBuffer> {\n const scalarBytes = Uint8Array.from(block.hash);\n clampScalar(scalarBytes);\n\n // Reduce mod curve order — matches Go's scalar.NewFromBits behaviour\n const scalar = bytesToBigIntLE(scalarBytes) % ed25519.Point.CURVE().n;\n\n const pub = ed25519.Point.fromBytes(block.key);\n const negPub = pub.negate();\n\n const par = ed25519.Point.fromBytes(parent);\n const negPar = par.negate();\n\n const res = negPub.multiply(scalar).add(negPar);\n const raw = res.toBytes();\n const final = new Uint8Array(raw.length) as Uint8Array<ArrayBuffer>;\n final.set(raw);\n final[31] = (final[31] !== undefined ? final[31] : 0) ^ 0x80;\n\n return final;\n}\n\nfunction bytesToBigIntLE(bytes: Uint8Array): bigint {\n let result = 0n;\n for (let i = bytes.length - 1; i >= 0; i--) {\n result = (result << 8n) | BigInt(bytes[i]!);\n }\n return result;\n}\n","import type { Crypt } from \"../crypto/crypt.js\";\nimport { importPublicKey } from \"../crypto/identity.js\";\nimport { verifySign, getSharedSecret2 } from \"../crypto/primitives.js\";\nimport { parseLicenses } from \"./license.js\";\n\n/**\n * CryptoInit2 performs the second stage of crypto initialization (Ed25519 ECDH).\n * Mirrors Go's handshake.CryptoInit2.\n */\nexport function cryptoInit2(\n crypt: Crypt,\n license: string,\n omega: string,\n proof: string,\n beta: string,\n privateKey: Uint8Array,\n): void {\n if (crypt.alphaTmp.length === 0) {\n throw new Error(\"alpha is not initialized\");\n }\n\n const licenseBytes = Buffer.from(license, \"base64\");\n const omegaBytes = Buffer.from(omega, \"base64\");\n const proofBytes = Buffer.from(proof, \"base64\");\n const betaBytes = Buffer.from(beta, \"base64\");\n\n const serverPubKey = importPublicKey(omegaBytes);\n if (!verifySign(serverPubKey, licenseBytes, proofBytes)) {\n throw new Error(\"init proof is not valid\");\n }\n\n const licenses = parseLicenses(licenseBytes);\n const key = licenses.deriveKey();\n\n const sharedSecret = getSharedSecret2(key, privateKey);\n\n crypt.setSharedSecret(crypt.alphaTmp, betaBytes, sharedSecret);\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"handler-C2vxlHYC.js","names":["#mod","#receiveWindow","#generation","#mappedBaseOffset","#isNextGen","#hashtable","#ensureControl","#processReference","#processLiteral","#updateHashtable","#crypt","#logger","#clientID","#conn","#closed","#lastMessageReceived","#handleRawPacket","#triggerClose","#packetCounter","#sendPacketRaw","#stopPing","#checkResends","#stopResend","#initPacketCheck","#sendSplitPacket","#generationCounter","#write","#nextPacketIdentity","#trackResend","#resolveGeneration","#decryptPacketData","#sendPong","#handleCommandWindowAndAck","#handlePacketQueue","#updatePostReceiveState","#recvWindowCommand","#recvWindowCommandLow","#sendWindowCommand","#sendWindowCommandLow","#sendAck","#commandQueue","#commandLowQueue","#fastForwardMissingPackets","#_nextCommandID","#_nextCommandLowID","#tryReassemble","#tryDecompress","#ackManager","#doResend"],"sources":["../src/transport/packet.ts","../src/transport/generation-window.ts","../src/transport/quicklz.ts","../src/transport/handler.ts"],"sourcesContent":["export const enum PacketType {\n Voice = 0,\n VoiceWhisper = 1,\n Command = 2,\n CommandLow = 3,\n Ping = 4,\n Pong = 5,\n Ack = 6,\n AckLow = 7,\n Init1 = 8,\n}\n\nexport const enum PacketFlags {\n Fragmented = 0x10,\n NewProtocol = 0x20,\n Compressed = 0x40,\n Unencrypted = 0x80,\n}\n\nexport interface Packet {\n /** Type byte combined with flags (low nibble = type, high nibble = flags). */\n typeFlagged: number;\n id: number;\n clientID: number;\n generationID: number;\n data: Uint8Array;\n receivedAt: number; // Date.now()\n}\n\nexport function packetType(p: Packet): PacketType {\n return (p.typeFlagged & 0x0f) as PacketType;\n}\n\nexport function packetFlags(p: Packet): number {\n return p.typeFlagged & 0xf0;\n}\n\nexport function isUnencrypted(p: Packet): boolean {\n return (packetFlags(p) & PacketFlags.Unencrypted) !== 0;\n}\n\n/** Build the 5-byte client-to-server header: [packetID(2), clientID(2), typeFlagged(1)]. */\nexport function buildC2SHeader(p: Packet): Uint8Array {\n const header = new Uint8Array(5);\n const view = new DataView(header.buffer);\n view.setUint16(0, p.id, false);\n view.setUint16(2, p.clientID, false);\n header[4] = p.typeFlagged;\n return header;\n}\n\n/** Parse a 3-byte server-to-client header. */\nexport function parseS2CHeader(raw: Uint8Array): Pick<Packet, \"id\" | \"typeFlagged\"> {\n const view = new DataView(raw.buffer, raw.byteOffset, raw.byteLength);\n return {\n id: view.getUint16(0, false),\n typeFlagged: raw[2]!,\n };\n}\n\n/** Parse a 5-byte client-to-server header. */\nexport function parseC2SHeader(raw: Uint8Array): Pick<Packet, \"id\" | \"clientID\" | \"typeFlagged\"> {\n const view = new DataView(raw.buffer, raw.byteOffset, raw.byteLength);\n return {\n id: view.getUint16(0, false),\n clientID: view.getUint16(2, false),\n typeFlagged: raw[4]!,\n };\n}\n","export class GenerationWindow {\n #mappedBaseOffset = 0;\n #generation = 0;\n readonly #mod: number;\n readonly #receiveWindow: number;\n\n constructor(mod: number, windowSize: number) {\n this.#mod = mod;\n this.#receiveWindow = windowSize;\n }\n\n get generation(): number {\n return this.#generation;\n }\n\n advance(amount: number): void {\n if (amount <= 0) return;\n const newBaseOffset = this.#mappedBaseOffset + amount;\n const genStep = Math.floor(newBaseOffset / this.#mod);\n if (genStep > 0) {\n this.#generation = Math.min(this.#generation + genStep, 0xffff_ffff);\n }\n this.#mappedBaseOffset = newBaseOffset % this.#mod;\n }\n\n advanceToExcluded(mappedValue: number): void {\n let moveDist = mappedValue - this.#mappedBaseOffset;\n if (moveDist < 0) moveDist += this.#mod;\n this.advance(moveDist + 1);\n }\n\n syncTo(mappedValue: number): void {\n let moveDist = mappedValue - this.#mappedBaseOffset;\n if (moveDist < 0) moveDist += this.#mod;\n this.advance(moveDist);\n }\n\n isInWindow(mappedValue: number): boolean {\n const maxOffset = this.#mappedBaseOffset + this.#receiveWindow;\n if (maxOffset < this.#mod) {\n return mappedValue >= this.#mappedBaseOffset && mappedValue < maxOffset;\n }\n return mappedValue >= this.#mappedBaseOffset || mappedValue < maxOffset - this.#mod;\n }\n\n mappedToIndex(mappedValue: number): number {\n if (this.#isNextGen(mappedValue)) {\n return mappedValue + this.#mod - this.#mappedBaseOffset;\n }\n return mappedValue - this.#mappedBaseOffset;\n }\n\n isOldPacket(mappedValue: number): boolean {\n return this.mappedToIndex(mappedValue) < 0;\n }\n\n isFuturePacket(mappedValue: number): boolean {\n return this.mappedToIndex(mappedValue) >= this.#receiveWindow;\n }\n\n #isNextGen(mappedValue: number): boolean {\n return (\n this.#mappedBaseOffset > this.#mod - this.#receiveWindow &&\n mappedValue < this.#mappedBaseOffset + this.#receiveWindow - this.#mod\n );\n }\n\n getGeneration(mappedValue: number): number {\n if (this.#isNextGen(mappedValue)) return this.#generation + 1;\n return this.#generation;\n }\n\n reset(): void {\n this.#mappedBaseOffset = 0;\n this.#generation = 0;\n }\n}\n","const TABLE_SIZE = 4096;\n\ninterface QlzState {\n control: number;\n sourcePos: number;\n destPos: number;\n nextHashed: number;\n}\n\nexport class Qlz {\n #hashtable = new Int32Array(TABLE_SIZE);\n\n decompress(data: Uint8Array): Uint8Array {\n const { headerLen, decompressedSize, flags } = parseQlzHeader(data);\n\n const dest = new Uint8Array(decompressedSize);\n\n if ((flags & 0x01) === 0) {\n dest.set(data.slice(headerLen, headerLen + decompressedSize));\n return dest;\n }\n\n this.#hashtable.fill(0);\n\n const state: QlzState = {\n control: 1,\n sourcePos: headerLen,\n destPos: 0,\n nextHashed: 0,\n };\n\n while (this.#ensureControl(data, state)) {\n if ((state.control & 1) !== 0) {\n if (!this.#processReference(data, dest, state)) break;\n } else {\n if (this.#processLiteral(data, dest, decompressedSize, state)) break;\n }\n }\n\n return dest;\n }\n\n #ensureControl(data: Uint8Array, st: QlzState): boolean {\n if (st.control !== 1) return true;\n if (st.sourcePos + 4 > data.length) return false;\n st.control =\n (data[st.sourcePos]! |\n (data[st.sourcePos + 1]! << 8) |\n (data[st.sourcePos + 2]! << 16) |\n (data[st.sourcePos + 3]! << 24)) >>>\n 0;\n st.sourcePos += 4;\n return true;\n }\n\n #processReference(data: Uint8Array, dest: Uint8Array, st: QlzState): boolean {\n st.control = (st.control >>> 1) >>> 0;\n if (st.sourcePos + 2 > data.length) return false;\n\n const b1 = data[st.sourcePos]!;\n const b2 = data[st.sourcePos + 1]!;\n st.sourcePos += 2;\n\n const hash = (b1 >> 4) | (b2 << 4);\n let matchlen = b1 & 0x0f;\n if (matchlen !== 0) {\n matchlen += 2;\n } else {\n if (st.sourcePos >= data.length) return false;\n matchlen = data[st.sourcePos]!;\n st.sourcePos++;\n }\n\n const offset = this.#hashtable[hash]!;\n for (let i = 0; i < matchlen; i++) {\n if (st.destPos < dest.length && offset + i < st.destPos) {\n dest[st.destPos] = dest[offset + i]!;\n st.destPos++;\n }\n }\n\n const end = st.destPos + 1 - matchlen;\n this.#updateHashtable(dest, st, end);\n st.nextHashed = st.destPos;\n\n return true;\n }\n\n #processLiteral(\n data: Uint8Array,\n dest: Uint8Array,\n decompressedSize: number,\n st: QlzState,\n ): boolean {\n const threshold = Math.max(decompressedSize, 10) - 10;\n if (st.destPos >= threshold) {\n while (st.destPos < decompressedSize) {\n if (st.control === 1) {\n st.sourcePos += 4;\n if (st.sourcePos > data.length) break;\n st.control =\n (data[st.sourcePos - 4]! |\n (data[st.sourcePos - 3]! << 8) |\n (data[st.sourcePos - 2]! << 16) |\n (data[st.sourcePos - 1]! << 24)) >>>\n 0;\n }\n if (st.sourcePos >= data.length) break;\n dest[st.destPos++] = data[st.sourcePos++]!;\n st.control = (st.control >>> 1) >>> 0;\n }\n return true;\n }\n\n if (st.sourcePos >= data.length || st.destPos >= dest.length) return true;\n\n dest[st.destPos++] = data[st.sourcePos++]!;\n st.control = (st.control >>> 1) >>> 0;\n\n const end = Math.max(st.destPos - 2, 0);\n this.#updateHashtable(dest, st, end);\n if (st.nextHashed < end) st.nextHashed = end;\n\n return false;\n }\n\n #updateHashtable(dest: Uint8Array, st: QlzState, end: number): void {\n while (st.nextHashed < end) {\n if (st.nextHashed + 3 > dest.length) break;\n const v =\n (dest[st.nextHashed]! |\n (dest[st.nextHashed + 1]! << 8) |\n (dest[st.nextHashed + 2]! << 16)) >>>\n 0;\n const hash = ((v >> 12) ^ v) & 0xfff;\n this.#hashtable[hash] = st.nextHashed;\n st.nextHashed++;\n }\n }\n}\n\nfunction parseQlzHeader(data: Uint8Array): {\n headerLen: number;\n decompressedSize: number;\n flags: number;\n} {\n if (data.length < 3) throw new Error(\"QuickLZ: data too short\");\n\n const flags = data[0]!;\n const level = (flags >> 2) & 0x03;\n if (level !== 1) throw new Error(\"QuickLZ: only level 1 is supported\");\n\n const headerLen = (flags & 0x02) !== 0 ? 9 : 3;\n if (data.length < headerLen) throw new Error(\"QuickLZ: data too short for header\");\n\n let decompressedSize: number;\n if ((flags & 0x02) !== 0) {\n decompressedSize = (data[5]! | (data[6]! << 8) | (data[7]! << 16) | (data[8]! << 24)) >>> 0;\n } else {\n decompressedSize = data[2]!;\n }\n\n return { headerLen, decompressedSize, flags };\n}\n","import { createSocket, type Socket as UdpSocket } from \"node:dgram\";\nimport type { Crypt } from \"../crypto/crypt.js\";\nimport type { Logger } from \"../types.js\";\nimport { noopLogger } from \"../types.js\";\nimport {\n type Packet,\n PacketType,\n PacketFlags,\n packetType,\n packetFlags,\n buildC2SHeader,\n parseS2CHeader,\n} from \"./packet.js\";\nimport { GenerationWindow } from \"./generation-window.js\";\nimport { Qlz } from \"./quicklz.js\";\nimport { processInit1 } from \"../handshake/crypt-handshake.js\";\n\nconst MAX_OUT_PACKET_SIZE = 500;\nconst RECEIVE_PACKET_WINDOW_SIZE = 1024;\nconst PING_INTERVAL_MS = 5_000;\nconst PACKET_TIMEOUT_MS = 60_000;\nconst MAX_RETRY_INTERVAL_MS = 1_000;\nconst UDP_READ_BUFFER_SIZE = 4096;\nconst HEADER_SIZE = 5;\nconst TAG_SIZE = 8;\nconst VOICE_HEADER_SIZE = 3;\nconst RESEND_BASE_INTERVAL_MS = 500;\nconst RESEND_LOOP_INTERVAL_MS = 100;\n\ninterface ResendPacket {\n packet: Packet;\n firstSend: number;\n lastSend: number;\n retryCount: number;\n nextInterval: number;\n}\n\nexport class PacketHandler {\n onPacket: ((p: Packet) => void) | null = null;\n onClosed: ((err: Error | null) => void) | null = null;\n\n readonly #crypt: Crypt;\n readonly #logger: Logger;\n\n #conn: UdpSocket | null = null;\n #clientID = 0;\n #closed = false;\n #stopPing: (() => void) | null = null;\n #stopResend: (() => void) | null = null;\n #lastMessageReceived = Date.now();\n\n #packetCounter = new Uint16Array(9);\n #generationCounter = new Uint32Array(9);\n\n #recvWindowCommand = new GenerationWindow(1 << 16, RECEIVE_PACKET_WINDOW_SIZE);\n #recvWindowCommandLow = new GenerationWindow(1 << 16, RECEIVE_PACKET_WINDOW_SIZE);\n #sendWindowCommand = new GenerationWindow(1 << 16, RECEIVE_PACKET_WINDOW_SIZE);\n #sendWindowCommandLow = new GenerationWindow(1 << 16, RECEIVE_PACKET_WINDOW_SIZE);\n\n #commandQueue = new Map<number, Packet>();\n #commandLowQueue = new Map<number, Packet>();\n #ackManager = new Map<number, ResendPacket>();\n #initPacketCheck: ResendPacket | null = null;\n\n constructor(crypt: Crypt, logger: Logger = noopLogger) {\n this.#crypt = crypt;\n this.#logger = logger;\n }\n\n setClientID(id: number): void {\n this.#clientID = id;\n }\n\n connect(addr: string): Promise<void> {\n return new Promise((resolve, reject) => {\n const [host, portStr] =\n addr.lastIndexOf(\":\") > 0\n ? [addr.slice(0, addr.lastIndexOf(\":\")), addr.slice(addr.lastIndexOf(\":\") + 1)]\n : [addr, \"9987\"];\n const port = parseInt(portStr, 10);\n\n const socket = createSocket(\"udp4\");\n socket.once(\"error\", reject);\n socket.connect(port, host, () => {\n socket.off(\"error\", reject);\n this.start(socket);\n resolve();\n });\n });\n }\n\n start(conn: UdpSocket): void {\n this.#conn = conn;\n this.#closed = false;\n this.#lastMessageReceived = Date.now();\n\n conn.on(\"message\", (msg) => {\n this.#lastMessageReceived = Date.now();\n this.#handleRawPacket(new Uint8Array(msg.buffer, msg.byteOffset, msg.byteLength));\n });\n conn.on(\"error\", (err) => {\n this.#logger.error(\"udp error\", err);\n this.#triggerClose(err);\n });\n conn.on(\"close\", () => this.#triggerClose(null));\n\n this.#packetCounter[PacketType.Command] = 1;\n this.#packetCounter[PacketType.Init1] = 101;\n\n const init1Data = processInit1(this.#crypt, null);\n if (init1Data) this.#sendPacketRaw(PacketType.Init1, init1Data, 0);\n\n // Ping loop\n const pingTimer = setInterval(() => {\n if (this.#crypt.cryptoInitComplete) {\n this.sendPacket(PacketType.Ping, new Uint8Array(0), PacketFlags.Unencrypted);\n }\n }, PING_INTERVAL_MS);\n this.#stopPing = () => clearInterval(pingTimer);\n\n // Resend loop\n const resendTimer = setInterval(() => this.#checkResends(), RESEND_LOOP_INTERVAL_MS);\n this.#stopResend = () => clearInterval(resendTimer);\n }\n\n receivedFinalInitAck(): void {\n this.#initPacketCheck = null;\n }\n\n sendPacket(pType: PacketType, data: Uint8Array, flags: number): void {\n const dummy = !this.#crypt.cryptoInitComplete;\n if (data.length > 487 && pType !== PacketType.Voice && pType !== PacketType.VoiceWhisper) {\n this.#sendSplitPacket(pType, data, flags, dummy);\n return;\n }\n this.#sendPacketRaw(pType, data, flags, dummy);\n }\n\n sendVoicePacket(data: Uint8Array, codec: number): void {\n const pID = this.#packetCounter[PacketType.Voice]!;\n const pGen = this.#generationCounter[PacketType.Voice]!;\n this.#packetCounter[PacketType.Voice] = (pID + 1) & 0xffff;\n if (this.#packetCounter[PacketType.Voice] === 0) {\n this.#generationCounter[PacketType.Voice]!++;\n }\n\n const payloadLen = VOICE_HEADER_SIZE + data.length;\n const voicePayload = new Uint8Array(payloadLen);\n new DataView(voicePayload.buffer).setUint16(0, pID, false);\n voicePayload[2] = codec;\n voicePayload.set(data, VOICE_HEADER_SIZE);\n\n const p: Packet = {\n typeFlagged: PacketType.Voice | PacketFlags.Unencrypted,\n id: pID,\n clientID: this.#clientID,\n generationID: pGen,\n data: voicePayload,\n receivedAt: 0,\n };\n\n const header = buildC2SHeader(p);\n const final = new Uint8Array(TAG_SIZE + HEADER_SIZE + payloadLen);\n final.set(this.#crypt.fakeSignature, 0);\n final.set(header, TAG_SIZE);\n final.set(voicePayload, TAG_SIZE + HEADER_SIZE);\n this.#write(final);\n }\n\n close(): void {\n if (this.#closed) return;\n this.#closed = true;\n this.#stopPing?.();\n this.#stopResend?.();\n this.#conn?.close();\n }\n\n // ---- Private ---------------------------------------------------------------\n\n #sendSplitPacket(pType: PacketType, data: Uint8Array, flags: number, dummy: boolean): void {\n const maxSize = MAX_OUT_PACKET_SIZE - HEADER_SIZE - TAG_SIZE; // 487\n let pos = 0;\n let first = true;\n\n while (pos < data.length) {\n const blockSize = Math.min(data.length - pos, maxSize);\n const last = pos + blockSize === data.length;\n\n let pFlags = flags;\n if (first !== last) pFlags |= PacketFlags.Fragmented;\n\n this.#sendPacketRaw(pType, data.slice(pos, pos + blockSize), pFlags, dummy);\n pos += blockSize;\n first = false;\n }\n }\n\n #sendPacketRaw(\n pType: PacketType,\n data: Uint8Array,\n flags: number,\n dummy = !this.#crypt.cryptoInitComplete,\n ): void {\n flags = applyProtocolFlags(pType, flags);\n const [pID, pGen] = this.#nextPacketIdentity(pType);\n\n const p: Packet = {\n typeFlagged: pType | flags,\n id: pID,\n clientID: this.#clientID,\n generationID: pGen,\n data,\n receivedAt: 0,\n };\n\n const unencrypted = (flags & PacketFlags.Unencrypted) !== 0;\n const header = buildC2SHeader(p);\n const [ciphertext, tag] = this.#crypt.encrypt(\n pType,\n pID,\n pGen,\n header,\n data,\n dummy,\n unencrypted,\n );\n\n const final = new Uint8Array(TAG_SIZE + HEADER_SIZE + ciphertext.length);\n final.set(tag.slice(0, TAG_SIZE), 0);\n final.set(header, TAG_SIZE);\n final.set(ciphertext, TAG_SIZE + HEADER_SIZE);\n this.#write(final);\n\n const rp: ResendPacket = {\n packet: p,\n firstSend: Date.now(),\n lastSend: Date.now(),\n retryCount: 0,\n nextInterval: RESEND_BASE_INTERVAL_MS,\n };\n this.#trackResend(pType, p, rp);\n }\n\n #write(data: Uint8Array): void {\n this.#conn?.send(Buffer.from(data), (err) => {\n if (err) this.#logger.warn(\"udp send error\", err);\n });\n }\n\n #handleRawPacket(raw: Uint8Array): void {\n if (raw.length < 11) return;\n\n const tag = raw.slice(0, TAG_SIZE);\n const header = raw.slice(TAG_SIZE, TAG_SIZE + 3);\n const ciphertext = raw.slice(TAG_SIZE + 3);\n\n const parsed = parseS2CHeader(header);\n const p: Packet = {\n ...parsed,\n clientID: 0,\n generationID: this.#resolveGeneration(parsed.id, parsed.typeFlagged & 0x0f),\n data: new Uint8Array(0),\n receivedAt: Date.now(),\n };\n\n const decrypted = this.#decryptPacketData(p, header, ciphertext, tag);\n if (decrypted === null) return;\n p.data = decrypted.plaintext;\n\n const pType = packetType(p);\n\n if (pType === PacketType.Ping) {\n this.#sendPong(p.id, decrypted.dummyUsed);\n return;\n }\n\n if (!this.#handleCommandWindowAndAck(p, decrypted.dummyUsed)) return;\n\n this.#handlePacketQueue(p);\n this.#updatePostReceiveState(p);\n }\n\n #resolveGeneration(id: number, pType: number): number {\n switch (pType as PacketType) {\n case PacketType.Command:\n return this.#recvWindowCommand.getGeneration(id);\n case PacketType.CommandLow:\n return this.#recvWindowCommandLow.getGeneration(id);\n case PacketType.Ack:\n return this.#sendWindowCommand.getGeneration(id);\n case PacketType.AckLow:\n return this.#sendWindowCommandLow.getGeneration(id);\n default:\n return 0;\n }\n }\n\n #decryptPacketData(\n p: Packet,\n header: Uint8Array,\n ciphertext: Uint8Array,\n tag: Uint8Array,\n ): { plaintext: Uint8Array; dummyUsed: boolean } | null {\n const unencrypted = (packetFlags(p) & PacketFlags.Unencrypted) !== 0;\n const dummy = !this.#crypt.cryptoInitComplete;\n let dummyUsed = dummy;\n const pType = packetType(p);\n const gen = p.generationID;\n\n try {\n const plaintext = this.#crypt.decrypt(\n pType,\n p.id,\n gen,\n header,\n ciphertext,\n tag,\n dummy,\n unencrypted,\n );\n return { plaintext, dummyUsed };\n } catch {\n // Try adjacent generations\n for (const offset of [-1, 1]) {\n const guessGen = gen + offset;\n if (guessGen < 0) continue;\n try {\n const plaintext = this.#crypt.decrypt(\n pType,\n p.id,\n guessGen,\n header,\n ciphertext,\n tag,\n false,\n false,\n );\n return { plaintext, dummyUsed: false };\n } catch {\n // continue\n }\n }\n\n // Try dummy fallback for command/ack types\n if (\n pType === PacketType.Command ||\n pType === PacketType.CommandLow ||\n pType === PacketType.Ack\n ) {\n try {\n const plaintext = this.#crypt.decrypt(\n pType,\n p.id,\n gen,\n header,\n ciphertext,\n tag,\n true,\n unencrypted,\n );\n return { plaintext, dummyUsed: true };\n } catch {\n // fall through\n }\n }\n\n this.#logger.debug(\"packet decryption failed\", { type: pType, id: p.id });\n return null;\n }\n }\n\n #handleCommandWindowAndAck(p: Packet, dummyUsed: boolean): boolean {\n const pType = packetType(p);\n if (pType !== PacketType.Command && pType !== PacketType.CommandLow) return true;\n\n const win = pType === PacketType.Command ? this.#recvWindowCommand : this.#recvWindowCommandLow;\n const ackType = pType === PacketType.Command ? PacketType.Ack : PacketType.AckLow;\n\n if (!win.isInWindow(p.id)) {\n if (win.isOldPacket(p.id)) {\n this.#sendAck(p.id, ackType, dummyUsed);\n }\n return false;\n }\n this.#sendAck(p.id, ackType, dummyUsed);\n return true;\n }\n\n #sendAck(packetID: number, ackType: PacketType, dummyUsed: boolean): void {\n const ackData = new Uint8Array(2);\n new DataView(ackData.buffer).setUint16(0, packetID, false);\n this.#sendPacketRaw(ackType, ackData, 0, dummyUsed);\n }\n\n #sendPong(pID: number, dummyUsed: boolean): void {\n const pongData = new Uint8Array(2);\n new DataView(pongData.buffer).setUint16(0, pID, false);\n this.#sendPacketRaw(PacketType.Pong, pongData, PacketFlags.Unencrypted, dummyUsed);\n }\n\n #handlePacketQueue(p: Packet): void {\n const pType = packetType(p);\n if (pType !== PacketType.Command && pType !== PacketType.CommandLow) {\n this.onPacket?.(p);\n return;\n }\n\n const isCommand = pType === PacketType.Command;\n const queue = isCommand ? this.#commandQueue : this.#commandLowQueue;\n const win = isCommand ? this.#recvWindowCommand : this.#recvWindowCommandLow;\n\n queue.set(p.id, p);\n\n if (isCommand) {\n this.#fastForwardMissingPackets(queue, win, true);\n } else {\n this.#fastForwardMissingPackets(queue, win, false);\n }\n\n while (true) {\n const current = isCommand ? this.#_nextCommandID : this.#_nextCommandLowID;\n const packet = queue.get(current);\n if (packet === undefined) break;\n\n const result = this.#tryReassemble(packet, queue, current, win);\n if (!result) break;\n\n const [reassembled, newNext] = result;\n if (isCommand) this.#_nextCommandID = newNext;\n else this.#_nextCommandLowID = newNext;\n\n this.#tryDecompress(reassembled);\n this.onPacket?.(reassembled);\n }\n }\n\n #_nextCommandID = 0;\n #_nextCommandLowID = 0;\n\n #fastForwardMissingPackets(\n queue: Map<number, Packet>,\n win: GenerationWindow,\n isCommand: boolean,\n ): void {\n let nextID = isCommand ? this.#_nextCommandID : this.#_nextCommandLowID;\n while (!queue.has(nextID) && hasOldNewerPacket(queue, nextID)) {\n nextID = (nextID + 1) & 0xffff;\n win.advance(1);\n }\n if (isCommand) this.#_nextCommandID = nextID;\n else this.#_nextCommandLowID = nextID;\n }\n\n #tryReassemble(\n startPacket: Packet,\n queue: Map<number, Packet>,\n nextID: number,\n win: GenerationWindow,\n ): [reassembled: Packet, newNextID: number] | null {\n if ((packetFlags(startPacket) & PacketFlags.Fragmented) === 0) {\n queue.delete(nextID);\n win.advance(1);\n return [startPacket, (nextID + 1) & 0xffff];\n }\n\n const fragments: Packet[] = [];\n let totalSize = 0;\n let currID = nextID;\n let startSeen = false;\n let complete = false;\n\n while (true) {\n const frag = queue.get(currID);\n if (!frag) return null;\n fragments.push(frag);\n totalSize += frag.data.length;\n\n const fragmented = (packetFlags(frag) & PacketFlags.Fragmented) !== 0;\n if (!startSeen) {\n startSeen = true;\n if (!fragmented) {\n complete = true;\n break;\n }\n } else if (fragmented) {\n complete = true;\n break;\n }\n currID = (currID + 1) & 0xffff;\n }\n\n if (!complete) return null;\n\n const combined = new Uint8Array(totalSize);\n let pos = 0;\n for (const frag of fragments) {\n combined.set(frag.data, pos);\n pos += frag.data.length;\n queue.delete(nextID);\n win.advance(1);\n nextID = (nextID + 1) & 0xffff;\n }\n\n startPacket.data = combined;\n startPacket.typeFlagged &= ~PacketFlags.Fragmented;\n return [startPacket, nextID];\n }\n\n #tryDecompress(packet: Packet): void {\n if ((packetFlags(packet) & PacketFlags.Compressed) === 0) return;\n try {\n const qlz = new Qlz();\n packet.data = qlz.decompress(packet.data);\n packet.typeFlagged &= ~PacketFlags.Compressed;\n } catch (err) {\n this.#logger.debug(\"decompression failed\", { id: packet.id, err });\n }\n }\n\n #updatePostReceiveState(p: Packet): void {\n const pType = packetType(p);\n\n if (pType === PacketType.Init1) {\n this.#initPacketCheck = null;\n return;\n }\n\n if ((pType === PacketType.Ack || pType === PacketType.AckLow) && p.data.length >= 2) {\n const ackID = new DataView(p.data.buffer, p.data.byteOffset).getUint16(0, false);\n const targetType = pType === PacketType.Ack ? PacketType.Command : PacketType.CommandLow;\n const key = (targetType << 16) | ackID;\n this.#ackManager.delete(key);\n }\n }\n\n #nextPacketIdentity(pType: PacketType): [id: number, gen: number] {\n const pID = this.#packetCounter[pType]!;\n const pGen = this.#generationCounter[pType]!;\n\n if (pType === PacketType.Init1) return [pID, pGen];\n\n this.#packetCounter[pType] = (pID + 1) & 0xffff;\n if (this.#packetCounter[pType] === 0) {\n this.#generationCounter[pType] = (pGen + 1) >>> 0;\n }\n\n if (pType === PacketType.Command) {\n this.#sendWindowCommand.advanceToExcluded(pID);\n } else if (pType === PacketType.CommandLow) {\n this.#sendWindowCommandLow.advanceToExcluded(pID);\n }\n\n return [pID, pGen];\n }\n\n #trackResend(pType: PacketType, p: Packet, rp: ResendPacket): void {\n if (pType === PacketType.Init1) {\n this.#initPacketCheck = rp;\n return;\n }\n if (pType === PacketType.Command || pType === PacketType.CommandLow) {\n const key = (pType << 16) | p.id;\n this.#ackManager.set(key, rp);\n }\n }\n\n #checkResends(): void {\n const now = Date.now();\n\n if (now - this.#lastMessageReceived > PACKET_TIMEOUT_MS) {\n this.#logger.warn(\"idle timeout\");\n this.#triggerClose(new Error(\"idle timeout\"));\n return;\n }\n\n if (this.#initPacketCheck) {\n this.#doResend(this.#initPacketCheck, now);\n }\n\n for (const [key, rp] of this.#ackManager) {\n if (now - rp.firstSend > PACKET_TIMEOUT_MS) {\n this.#ackManager.delete(key);\n this.#triggerClose(new Error(\"packet ack timeout\"));\n return;\n }\n this.#doResend(rp, now);\n }\n }\n\n #doResend(rp: ResendPacket, now: number): void {\n if (now - rp.lastSend < rp.nextInterval) return;\n\n rp.lastSend = now;\n rp.retryCount++;\n rp.nextInterval = Math.min(rp.nextInterval * 2, MAX_RETRY_INTERVAL_MS);\n\n const dummy = !this.#crypt.cryptoInitComplete;\n const unencrypted = (packetFlags(rp.packet) & PacketFlags.Unencrypted) !== 0;\n const header = buildC2SHeader(rp.packet);\n const pType = packetType(rp.packet);\n\n const [ciphertext, tag] = this.#crypt.encrypt(\n pType,\n rp.packet.id,\n rp.packet.generationID,\n header,\n rp.packet.data,\n dummy,\n unencrypted,\n );\n\n const final = new Uint8Array(TAG_SIZE + HEADER_SIZE + ciphertext.length);\n final.set(tag.slice(0, TAG_SIZE), 0);\n final.set(header, TAG_SIZE);\n final.set(ciphertext, TAG_SIZE + HEADER_SIZE);\n this.#write(final);\n }\n\n #triggerClose(err: Error | null): void {\n if (this.#closed) return;\n this.close();\n this.onClosed?.(err);\n }\n}\n\n// ---- Helpers ----------------------------------------------------------------\n\nfunction applyProtocolFlags(pType: PacketType, flags: number): number {\n if (pType === PacketType.Command || pType === PacketType.CommandLow) {\n return flags | PacketFlags.NewProtocol;\n }\n return flags;\n}\n\nfunction hasOldNewerPacket(queue: Map<number, Packet>, nextID: number): boolean {\n const now = Date.now();\n for (const [id, pkg] of queue) {\n const diff = (id - nextID + 0x10000) & 0xffff;\n if (diff < 0x8000 && now - pkg.receivedAt > 5_000) {\n return true;\n }\n }\n return false;\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"handler-DQteUMKT.cjs","names":["#mod","#receiveWindow","#generation","#mappedBaseOffset","#isNextGen","#hashtable","#ensureControl","#processReference","#processLiteral","#updateHashtable","#crypt","#logger","#clientID","#conn","#closed","#lastMessageReceived","#handleRawPacket","#triggerClose","#packetCounter","#sendPacketRaw","#stopPing","#checkResends","#stopResend","#initPacketCheck","#sendSplitPacket","#generationCounter","#write","#nextPacketIdentity","#trackResend","#resolveGeneration","#decryptPacketData","#sendPong","#handleCommandWindowAndAck","#handlePacketQueue","#updatePostReceiveState","#recvWindowCommand","#recvWindowCommandLow","#sendWindowCommand","#sendWindowCommandLow","#sendAck","#commandQueue","#commandLowQueue","#fastForwardMissingPackets","#_nextCommandID","#_nextCommandLowID","#tryReassemble","#tryDecompress","#ackManager","#doResend"],"sources":["../src/transport/packet.ts","../src/transport/generation-window.ts","../src/transport/quicklz.ts","../src/transport/handler.ts"],"sourcesContent":["export const enum PacketType {\n Voice = 0,\n VoiceWhisper = 1,\n Command = 2,\n CommandLow = 3,\n Ping = 4,\n Pong = 5,\n Ack = 6,\n AckLow = 7,\n Init1 = 8,\n}\n\nexport const enum PacketFlags {\n Fragmented = 0x10,\n NewProtocol = 0x20,\n Compressed = 0x40,\n Unencrypted = 0x80,\n}\n\nexport interface Packet {\n /** Type byte combined with flags (low nibble = type, high nibble = flags). */\n typeFlagged: number;\n id: number;\n clientID: number;\n generationID: number;\n data: Uint8Array;\n receivedAt: number; // Date.now()\n}\n\nexport function packetType(p: Packet): PacketType {\n return (p.typeFlagged & 0x0f) as PacketType;\n}\n\nexport function packetFlags(p: Packet): number {\n return p.typeFlagged & 0xf0;\n}\n\nexport function isUnencrypted(p: Packet): boolean {\n return (packetFlags(p) & PacketFlags.Unencrypted) !== 0;\n}\n\n/** Build the 5-byte client-to-server header: [packetID(2), clientID(2), typeFlagged(1)]. */\nexport function buildC2SHeader(p: Packet): Uint8Array {\n const header = new Uint8Array(5);\n const view = new DataView(header.buffer);\n view.setUint16(0, p.id, false);\n view.setUint16(2, p.clientID, false);\n header[4] = p.typeFlagged;\n return header;\n}\n\n/** Parse a 3-byte server-to-client header. */\nexport function parseS2CHeader(raw: Uint8Array): Pick<Packet, \"id\" | \"typeFlagged\"> {\n const view = new DataView(raw.buffer, raw.byteOffset, raw.byteLength);\n return {\n id: view.getUint16(0, false),\n typeFlagged: raw[2]!,\n };\n}\n\n/** Parse a 5-byte client-to-server header. */\nexport function parseC2SHeader(raw: Uint8Array): Pick<Packet, \"id\" | \"clientID\" | \"typeFlagged\"> {\n const view = new DataView(raw.buffer, raw.byteOffset, raw.byteLength);\n return {\n id: view.getUint16(0, false),\n clientID: view.getUint16(2, false),\n typeFlagged: raw[4]!,\n };\n}\n","export class GenerationWindow {\n #mappedBaseOffset = 0;\n #generation = 0;\n readonly #mod: number;\n readonly #receiveWindow: number;\n\n constructor(mod: number, windowSize: number) {\n this.#mod = mod;\n this.#receiveWindow = windowSize;\n }\n\n get generation(): number {\n return this.#generation;\n }\n\n advance(amount: number): void {\n if (amount <= 0) return;\n const newBaseOffset = this.#mappedBaseOffset + amount;\n const genStep = Math.floor(newBaseOffset / this.#mod);\n if (genStep > 0) {\n this.#generation = Math.min(this.#generation + genStep, 0xffff_ffff);\n }\n this.#mappedBaseOffset = newBaseOffset % this.#mod;\n }\n\n advanceToExcluded(mappedValue: number): void {\n let moveDist = mappedValue - this.#mappedBaseOffset;\n if (moveDist < 0) moveDist += this.#mod;\n this.advance(moveDist + 1);\n }\n\n syncTo(mappedValue: number): void {\n let moveDist = mappedValue - this.#mappedBaseOffset;\n if (moveDist < 0) moveDist += this.#mod;\n this.advance(moveDist);\n }\n\n isInWindow(mappedValue: number): boolean {\n const maxOffset = this.#mappedBaseOffset + this.#receiveWindow;\n if (maxOffset < this.#mod) {\n return mappedValue >= this.#mappedBaseOffset && mappedValue < maxOffset;\n }\n return mappedValue >= this.#mappedBaseOffset || mappedValue < maxOffset - this.#mod;\n }\n\n mappedToIndex(mappedValue: number): number {\n if (this.#isNextGen(mappedValue)) {\n return mappedValue + this.#mod - this.#mappedBaseOffset;\n }\n return mappedValue - this.#mappedBaseOffset;\n }\n\n isOldPacket(mappedValue: number): boolean {\n return this.mappedToIndex(mappedValue) < 0;\n }\n\n isFuturePacket(mappedValue: number): boolean {\n return this.mappedToIndex(mappedValue) >= this.#receiveWindow;\n }\n\n #isNextGen(mappedValue: number): boolean {\n return (\n this.#mappedBaseOffset > this.#mod - this.#receiveWindow &&\n mappedValue < this.#mappedBaseOffset + this.#receiveWindow - this.#mod\n );\n }\n\n getGeneration(mappedValue: number): number {\n if (this.#isNextGen(mappedValue)) return this.#generation + 1;\n return this.#generation;\n }\n\n reset(): void {\n this.#mappedBaseOffset = 0;\n this.#generation = 0;\n }\n}\n","const TABLE_SIZE = 4096;\n\ninterface QlzState {\n control: number;\n sourcePos: number;\n destPos: number;\n nextHashed: number;\n}\n\nexport class Qlz {\n #hashtable = new Int32Array(TABLE_SIZE);\n\n decompress(data: Uint8Array): Uint8Array {\n const { headerLen, decompressedSize, flags } = parseQlzHeader(data);\n\n const dest = new Uint8Array(decompressedSize);\n\n if ((flags & 0x01) === 0) {\n dest.set(data.slice(headerLen, headerLen + decompressedSize));\n return dest;\n }\n\n this.#hashtable.fill(0);\n\n const state: QlzState = {\n control: 1,\n sourcePos: headerLen,\n destPos: 0,\n nextHashed: 0,\n };\n\n while (this.#ensureControl(data, state)) {\n if ((state.control & 1) !== 0) {\n if (!this.#processReference(data, dest, state)) break;\n } else {\n if (this.#processLiteral(data, dest, decompressedSize, state)) break;\n }\n }\n\n return dest;\n }\n\n #ensureControl(data: Uint8Array, st: QlzState): boolean {\n if (st.control !== 1) return true;\n if (st.sourcePos + 4 > data.length) return false;\n st.control =\n (data[st.sourcePos]! |\n (data[st.sourcePos + 1]! << 8) |\n (data[st.sourcePos + 2]! << 16) |\n (data[st.sourcePos + 3]! << 24)) >>>\n 0;\n st.sourcePos += 4;\n return true;\n }\n\n #processReference(data: Uint8Array, dest: Uint8Array, st: QlzState): boolean {\n st.control = (st.control >>> 1) >>> 0;\n if (st.sourcePos + 2 > data.length) return false;\n\n const b1 = data[st.sourcePos]!;\n const b2 = data[st.sourcePos + 1]!;\n st.sourcePos += 2;\n\n const hash = (b1 >> 4) | (b2 << 4);\n let matchlen = b1 & 0x0f;\n if (matchlen !== 0) {\n matchlen += 2;\n } else {\n if (st.sourcePos >= data.length) return false;\n matchlen = data[st.sourcePos]!;\n st.sourcePos++;\n }\n\n const offset = this.#hashtable[hash]!;\n for (let i = 0; i < matchlen; i++) {\n if (st.destPos < dest.length && offset + i < st.destPos) {\n dest[st.destPos] = dest[offset + i]!;\n st.destPos++;\n }\n }\n\n const end = st.destPos + 1 - matchlen;\n this.#updateHashtable(dest, st, end);\n st.nextHashed = st.destPos;\n\n return true;\n }\n\n #processLiteral(\n data: Uint8Array,\n dest: Uint8Array,\n decompressedSize: number,\n st: QlzState,\n ): boolean {\n const threshold = Math.max(decompressedSize, 10) - 10;\n if (st.destPos >= threshold) {\n while (st.destPos < decompressedSize) {\n if (st.control === 1) {\n st.sourcePos += 4;\n if (st.sourcePos > data.length) break;\n st.control =\n (data[st.sourcePos - 4]! |\n (data[st.sourcePos - 3]! << 8) |\n (data[st.sourcePos - 2]! << 16) |\n (data[st.sourcePos - 1]! << 24)) >>>\n 0;\n }\n if (st.sourcePos >= data.length) break;\n dest[st.destPos++] = data[st.sourcePos++]!;\n st.control = (st.control >>> 1) >>> 0;\n }\n return true;\n }\n\n if (st.sourcePos >= data.length || st.destPos >= dest.length) return true;\n\n dest[st.destPos++] = data[st.sourcePos++]!;\n st.control = (st.control >>> 1) >>> 0;\n\n const end = Math.max(st.destPos - 2, 0);\n this.#updateHashtable(dest, st, end);\n if (st.nextHashed < end) st.nextHashed = end;\n\n return false;\n }\n\n #updateHashtable(dest: Uint8Array, st: QlzState, end: number): void {\n while (st.nextHashed < end) {\n if (st.nextHashed + 3 > dest.length) break;\n const v =\n (dest[st.nextHashed]! |\n (dest[st.nextHashed + 1]! << 8) |\n (dest[st.nextHashed + 2]! << 16)) >>>\n 0;\n const hash = ((v >> 12) ^ v) & 0xfff;\n this.#hashtable[hash] = st.nextHashed;\n st.nextHashed++;\n }\n }\n}\n\nfunction parseQlzHeader(data: Uint8Array): {\n headerLen: number;\n decompressedSize: number;\n flags: number;\n} {\n if (data.length < 3) throw new Error(\"QuickLZ: data too short\");\n\n const flags = data[0]!;\n const level = (flags >> 2) & 0x03;\n if (level !== 1) throw new Error(\"QuickLZ: only level 1 is supported\");\n\n const headerLen = (flags & 0x02) !== 0 ? 9 : 3;\n if (data.length < headerLen) throw new Error(\"QuickLZ: data too short for header\");\n\n let decompressedSize: number;\n if ((flags & 0x02) !== 0) {\n decompressedSize = (data[5]! | (data[6]! << 8) | (data[7]! << 16) | (data[8]! << 24)) >>> 0;\n } else {\n decompressedSize = data[2]!;\n }\n\n return { headerLen, decompressedSize, flags };\n}\n","import { createSocket, type Socket as UdpSocket } from \"node:dgram\";\nimport type { Crypt } from \"../crypto/crypt.js\";\nimport type { Logger } from \"../types.js\";\nimport { noopLogger } from \"../types.js\";\nimport {\n type Packet,\n PacketType,\n PacketFlags,\n packetType,\n packetFlags,\n buildC2SHeader,\n parseS2CHeader,\n} from \"./packet.js\";\nimport { GenerationWindow } from \"./generation-window.js\";\nimport { Qlz } from \"./quicklz.js\";\nimport { processInit1 } from \"../handshake/crypt-handshake.js\";\n\nconst MAX_OUT_PACKET_SIZE = 500;\nconst RECEIVE_PACKET_WINDOW_SIZE = 1024;\nconst PING_INTERVAL_MS = 5_000;\nconst PACKET_TIMEOUT_MS = 60_000;\nconst MAX_RETRY_INTERVAL_MS = 1_000;\nconst UDP_READ_BUFFER_SIZE = 4096;\nconst HEADER_SIZE = 5;\nconst TAG_SIZE = 8;\nconst VOICE_HEADER_SIZE = 3;\nconst RESEND_BASE_INTERVAL_MS = 500;\nconst RESEND_LOOP_INTERVAL_MS = 100;\n\ninterface ResendPacket {\n packet: Packet;\n firstSend: number;\n lastSend: number;\n retryCount: number;\n nextInterval: number;\n}\n\nexport class PacketHandler {\n onPacket: ((p: Packet) => void) | null = null;\n onClosed: ((err: Error | null) => void) | null = null;\n\n readonly #crypt: Crypt;\n readonly #logger: Logger;\n\n #conn: UdpSocket | null = null;\n #clientID = 0;\n #closed = false;\n #stopPing: (() => void) | null = null;\n #stopResend: (() => void) | null = null;\n #lastMessageReceived = Date.now();\n\n #packetCounter = new Uint16Array(9);\n #generationCounter = new Uint32Array(9);\n\n #recvWindowCommand = new GenerationWindow(1 << 16, RECEIVE_PACKET_WINDOW_SIZE);\n #recvWindowCommandLow = new GenerationWindow(1 << 16, RECEIVE_PACKET_WINDOW_SIZE);\n #sendWindowCommand = new GenerationWindow(1 << 16, RECEIVE_PACKET_WINDOW_SIZE);\n #sendWindowCommandLow = new GenerationWindow(1 << 16, RECEIVE_PACKET_WINDOW_SIZE);\n\n #commandQueue = new Map<number, Packet>();\n #commandLowQueue = new Map<number, Packet>();\n #ackManager = new Map<number, ResendPacket>();\n #initPacketCheck: ResendPacket | null = null;\n\n constructor(crypt: Crypt, logger: Logger = noopLogger) {\n this.#crypt = crypt;\n this.#logger = logger;\n }\n\n setClientID(id: number): void {\n this.#clientID = id;\n }\n\n connect(addr: string): Promise<void> {\n return new Promise((resolve, reject) => {\n const [host, portStr] =\n addr.lastIndexOf(\":\") > 0\n ? [addr.slice(0, addr.lastIndexOf(\":\")), addr.slice(addr.lastIndexOf(\":\") + 1)]\n : [addr, \"9987\"];\n const port = parseInt(portStr, 10);\n\n const socket = createSocket(\"udp4\");\n socket.once(\"error\", reject);\n socket.connect(port, host, () => {\n socket.off(\"error\", reject);\n this.start(socket);\n resolve();\n });\n });\n }\n\n start(conn: UdpSocket): void {\n this.#conn = conn;\n this.#closed = false;\n this.#lastMessageReceived = Date.now();\n\n conn.on(\"message\", (msg) => {\n this.#lastMessageReceived = Date.now();\n this.#handleRawPacket(new Uint8Array(msg.buffer, msg.byteOffset, msg.byteLength));\n });\n conn.on(\"error\", (err) => {\n this.#logger.error(\"udp error\", err);\n this.#triggerClose(err);\n });\n conn.on(\"close\", () => this.#triggerClose(null));\n\n this.#packetCounter[PacketType.Command] = 1;\n this.#packetCounter[PacketType.Init1] = 101;\n\n const init1Data = processInit1(this.#crypt, null);\n if (init1Data) this.#sendPacketRaw(PacketType.Init1, init1Data, 0);\n\n // Ping loop\n const pingTimer = setInterval(() => {\n if (this.#crypt.cryptoInitComplete) {\n this.sendPacket(PacketType.Ping, new Uint8Array(0), PacketFlags.Unencrypted);\n }\n }, PING_INTERVAL_MS);\n this.#stopPing = () => clearInterval(pingTimer);\n\n // Resend loop\n const resendTimer = setInterval(() => this.#checkResends(), RESEND_LOOP_INTERVAL_MS);\n this.#stopResend = () => clearInterval(resendTimer);\n }\n\n receivedFinalInitAck(): void {\n this.#initPacketCheck = null;\n }\n\n sendPacket(pType: PacketType, data: Uint8Array, flags: number): void {\n const dummy = !this.#crypt.cryptoInitComplete;\n if (data.length > 487 && pType !== PacketType.Voice && pType !== PacketType.VoiceWhisper) {\n this.#sendSplitPacket(pType, data, flags, dummy);\n return;\n }\n this.#sendPacketRaw(pType, data, flags, dummy);\n }\n\n sendVoicePacket(data: Uint8Array, codec: number): void {\n const pID = this.#packetCounter[PacketType.Voice]!;\n const pGen = this.#generationCounter[PacketType.Voice]!;\n this.#packetCounter[PacketType.Voice] = (pID + 1) & 0xffff;\n if (this.#packetCounter[PacketType.Voice] === 0) {\n this.#generationCounter[PacketType.Voice]!++;\n }\n\n const payloadLen = VOICE_HEADER_SIZE + data.length;\n const voicePayload = new Uint8Array(payloadLen);\n new DataView(voicePayload.buffer).setUint16(0, pID, false);\n voicePayload[2] = codec;\n voicePayload.set(data, VOICE_HEADER_SIZE);\n\n const p: Packet = {\n typeFlagged: PacketType.Voice | PacketFlags.Unencrypted,\n id: pID,\n clientID: this.#clientID,\n generationID: pGen,\n data: voicePayload,\n receivedAt: 0,\n };\n\n const header = buildC2SHeader(p);\n const final = new Uint8Array(TAG_SIZE + HEADER_SIZE + payloadLen);\n final.set(this.#crypt.fakeSignature, 0);\n final.set(header, TAG_SIZE);\n final.set(voicePayload, TAG_SIZE + HEADER_SIZE);\n this.#write(final);\n }\n\n close(): void {\n if (this.#closed) return;\n this.#closed = true;\n this.#stopPing?.();\n this.#stopResend?.();\n this.#conn?.close();\n }\n\n // ---- Private ---------------------------------------------------------------\n\n #sendSplitPacket(pType: PacketType, data: Uint8Array, flags: number, dummy: boolean): void {\n const maxSize = MAX_OUT_PACKET_SIZE - HEADER_SIZE - TAG_SIZE; // 487\n let pos = 0;\n let first = true;\n\n while (pos < data.length) {\n const blockSize = Math.min(data.length - pos, maxSize);\n const last = pos + blockSize === data.length;\n\n let pFlags = flags;\n if (first !== last) pFlags |= PacketFlags.Fragmented;\n\n this.#sendPacketRaw(pType, data.slice(pos, pos + blockSize), pFlags, dummy);\n pos += blockSize;\n first = false;\n }\n }\n\n #sendPacketRaw(\n pType: PacketType,\n data: Uint8Array,\n flags: number,\n dummy = !this.#crypt.cryptoInitComplete,\n ): void {\n flags = applyProtocolFlags(pType, flags);\n const [pID, pGen] = this.#nextPacketIdentity(pType);\n\n const p: Packet = {\n typeFlagged: pType | flags,\n id: pID,\n clientID: this.#clientID,\n generationID: pGen,\n data,\n receivedAt: 0,\n };\n\n const unencrypted = (flags & PacketFlags.Unencrypted) !== 0;\n const header = buildC2SHeader(p);\n const [ciphertext, tag] = this.#crypt.encrypt(\n pType,\n pID,\n pGen,\n header,\n data,\n dummy,\n unencrypted,\n );\n\n const final = new Uint8Array(TAG_SIZE + HEADER_SIZE + ciphertext.length);\n final.set(tag.slice(0, TAG_SIZE), 0);\n final.set(header, TAG_SIZE);\n final.set(ciphertext, TAG_SIZE + HEADER_SIZE);\n this.#write(final);\n\n const rp: ResendPacket = {\n packet: p,\n firstSend: Date.now(),\n lastSend: Date.now(),\n retryCount: 0,\n nextInterval: RESEND_BASE_INTERVAL_MS,\n };\n this.#trackResend(pType, p, rp);\n }\n\n #write(data: Uint8Array): void {\n this.#conn?.send(Buffer.from(data), (err) => {\n if (err) this.#logger.warn(\"udp send error\", err);\n });\n }\n\n #handleRawPacket(raw: Uint8Array): void {\n if (raw.length < 11) return;\n\n const tag = raw.slice(0, TAG_SIZE);\n const header = raw.slice(TAG_SIZE, TAG_SIZE + 3);\n const ciphertext = raw.slice(TAG_SIZE + 3);\n\n const parsed = parseS2CHeader(header);\n const p: Packet = {\n ...parsed,\n clientID: 0,\n generationID: this.#resolveGeneration(parsed.id, parsed.typeFlagged & 0x0f),\n data: new Uint8Array(0),\n receivedAt: Date.now(),\n };\n\n const decrypted = this.#decryptPacketData(p, header, ciphertext, tag);\n if (decrypted === null) return;\n p.data = decrypted.plaintext;\n\n const pType = packetType(p);\n\n if (pType === PacketType.Ping) {\n this.#sendPong(p.id, decrypted.dummyUsed);\n return;\n }\n\n if (!this.#handleCommandWindowAndAck(p, decrypted.dummyUsed)) return;\n\n this.#handlePacketQueue(p);\n this.#updatePostReceiveState(p);\n }\n\n #resolveGeneration(id: number, pType: number): number {\n switch (pType as PacketType) {\n case PacketType.Command:\n return this.#recvWindowCommand.getGeneration(id);\n case PacketType.CommandLow:\n return this.#recvWindowCommandLow.getGeneration(id);\n case PacketType.Ack:\n return this.#sendWindowCommand.getGeneration(id);\n case PacketType.AckLow:\n return this.#sendWindowCommandLow.getGeneration(id);\n default:\n return 0;\n }\n }\n\n #decryptPacketData(\n p: Packet,\n header: Uint8Array,\n ciphertext: Uint8Array,\n tag: Uint8Array,\n ): { plaintext: Uint8Array; dummyUsed: boolean } | null {\n const unencrypted = (packetFlags(p) & PacketFlags.Unencrypted) !== 0;\n const dummy = !this.#crypt.cryptoInitComplete;\n let dummyUsed = dummy;\n const pType = packetType(p);\n const gen = p.generationID;\n\n try {\n const plaintext = this.#crypt.decrypt(\n pType,\n p.id,\n gen,\n header,\n ciphertext,\n tag,\n dummy,\n unencrypted,\n );\n return { plaintext, dummyUsed };\n } catch {\n // Try adjacent generations\n for (const offset of [-1, 1]) {\n const guessGen = gen + offset;\n if (guessGen < 0) continue;\n try {\n const plaintext = this.#crypt.decrypt(\n pType,\n p.id,\n guessGen,\n header,\n ciphertext,\n tag,\n false,\n false,\n );\n return { plaintext, dummyUsed: false };\n } catch {\n // continue\n }\n }\n\n // Try dummy fallback for command/ack types\n if (\n pType === PacketType.Command ||\n pType === PacketType.CommandLow ||\n pType === PacketType.Ack\n ) {\n try {\n const plaintext = this.#crypt.decrypt(\n pType,\n p.id,\n gen,\n header,\n ciphertext,\n tag,\n true,\n unencrypted,\n );\n return { plaintext, dummyUsed: true };\n } catch {\n // fall through\n }\n }\n\n this.#logger.debug(\"packet decryption failed\", { type: pType, id: p.id });\n return null;\n }\n }\n\n #handleCommandWindowAndAck(p: Packet, dummyUsed: boolean): boolean {\n const pType = packetType(p);\n if (pType !== PacketType.Command && pType !== PacketType.CommandLow) return true;\n\n const win = pType === PacketType.Command ? this.#recvWindowCommand : this.#recvWindowCommandLow;\n const ackType = pType === PacketType.Command ? PacketType.Ack : PacketType.AckLow;\n\n if (!win.isInWindow(p.id)) {\n if (win.isOldPacket(p.id)) {\n this.#sendAck(p.id, ackType, dummyUsed);\n }\n return false;\n }\n this.#sendAck(p.id, ackType, dummyUsed);\n return true;\n }\n\n #sendAck(packetID: number, ackType: PacketType, dummyUsed: boolean): void {\n const ackData = new Uint8Array(2);\n new DataView(ackData.buffer).setUint16(0, packetID, false);\n this.#sendPacketRaw(ackType, ackData, 0, dummyUsed);\n }\n\n #sendPong(pID: number, dummyUsed: boolean): void {\n const pongData = new Uint8Array(2);\n new DataView(pongData.buffer).setUint16(0, pID, false);\n this.#sendPacketRaw(PacketType.Pong, pongData, PacketFlags.Unencrypted, dummyUsed);\n }\n\n #handlePacketQueue(p: Packet): void {\n const pType = packetType(p);\n if (pType !== PacketType.Command && pType !== PacketType.CommandLow) {\n this.onPacket?.(p);\n return;\n }\n\n const isCommand = pType === PacketType.Command;\n const queue = isCommand ? this.#commandQueue : this.#commandLowQueue;\n const win = isCommand ? this.#recvWindowCommand : this.#recvWindowCommandLow;\n\n queue.set(p.id, p);\n\n if (isCommand) {\n this.#fastForwardMissingPackets(queue, win, true);\n } else {\n this.#fastForwardMissingPackets(queue, win, false);\n }\n\n while (true) {\n const current = isCommand ? this.#_nextCommandID : this.#_nextCommandLowID;\n const packet = queue.get(current);\n if (packet === undefined) break;\n\n const result = this.#tryReassemble(packet, queue, current, win);\n if (!result) break;\n\n const [reassembled, newNext] = result;\n if (isCommand) this.#_nextCommandID = newNext;\n else this.#_nextCommandLowID = newNext;\n\n this.#tryDecompress(reassembled);\n this.onPacket?.(reassembled);\n }\n }\n\n #_nextCommandID = 0;\n #_nextCommandLowID = 0;\n\n #fastForwardMissingPackets(\n queue: Map<number, Packet>,\n win: GenerationWindow,\n isCommand: boolean,\n ): void {\n let nextID = isCommand ? this.#_nextCommandID : this.#_nextCommandLowID;\n while (!queue.has(nextID) && hasOldNewerPacket(queue, nextID)) {\n nextID = (nextID + 1) & 0xffff;\n win.advance(1);\n }\n if (isCommand) this.#_nextCommandID = nextID;\n else this.#_nextCommandLowID = nextID;\n }\n\n #tryReassemble(\n startPacket: Packet,\n queue: Map<number, Packet>,\n nextID: number,\n win: GenerationWindow,\n ): [reassembled: Packet, newNextID: number] | null {\n if ((packetFlags(startPacket) & PacketFlags.Fragmented) === 0) {\n queue.delete(nextID);\n win.advance(1);\n return [startPacket, (nextID + 1) & 0xffff];\n }\n\n const fragments: Packet[] = [];\n let totalSize = 0;\n let currID = nextID;\n let startSeen = false;\n let complete = false;\n\n while (true) {\n const frag = queue.get(currID);\n if (!frag) return null;\n fragments.push(frag);\n totalSize += frag.data.length;\n\n const fragmented = (packetFlags(frag) & PacketFlags.Fragmented) !== 0;\n if (!startSeen) {\n startSeen = true;\n if (!fragmented) {\n complete = true;\n break;\n }\n } else if (fragmented) {\n complete = true;\n break;\n }\n currID = (currID + 1) & 0xffff;\n }\n\n if (!complete) return null;\n\n const combined = new Uint8Array(totalSize);\n let pos = 0;\n for (const frag of fragments) {\n combined.set(frag.data, pos);\n pos += frag.data.length;\n queue.delete(nextID);\n win.advance(1);\n nextID = (nextID + 1) & 0xffff;\n }\n\n startPacket.data = combined;\n startPacket.typeFlagged &= ~PacketFlags.Fragmented;\n return [startPacket, nextID];\n }\n\n #tryDecompress(packet: Packet): void {\n if ((packetFlags(packet) & PacketFlags.Compressed) === 0) return;\n try {\n const qlz = new Qlz();\n packet.data = qlz.decompress(packet.data);\n packet.typeFlagged &= ~PacketFlags.Compressed;\n } catch (err) {\n this.#logger.debug(\"decompression failed\", { id: packet.id, err });\n }\n }\n\n #updatePostReceiveState(p: Packet): void {\n const pType = packetType(p);\n\n if (pType === PacketType.Init1) {\n this.#initPacketCheck = null;\n return;\n }\n\n if ((pType === PacketType.Ack || pType === PacketType.AckLow) && p.data.length >= 2) {\n const ackID = new DataView(p.data.buffer, p.data.byteOffset).getUint16(0, false);\n const targetType = pType === PacketType.Ack ? PacketType.Command : PacketType.CommandLow;\n const key = (targetType << 16) | ackID;\n this.#ackManager.delete(key);\n }\n }\n\n #nextPacketIdentity(pType: PacketType): [id: number, gen: number] {\n const pID = this.#packetCounter[pType]!;\n const pGen = this.#generationCounter[pType]!;\n\n if (pType === PacketType.Init1) return [pID, pGen];\n\n this.#packetCounter[pType] = (pID + 1) & 0xffff;\n if (this.#packetCounter[pType] === 0) {\n this.#generationCounter[pType] = (pGen + 1) >>> 0;\n }\n\n if (pType === PacketType.Command) {\n this.#sendWindowCommand.advanceToExcluded(pID);\n } else if (pType === PacketType.CommandLow) {\n this.#sendWindowCommandLow.advanceToExcluded(pID);\n }\n\n return [pID, pGen];\n }\n\n #trackResend(pType: PacketType, p: Packet, rp: ResendPacket): void {\n if (pType === PacketType.Init1) {\n this.#initPacketCheck = rp;\n return;\n }\n if (pType === PacketType.Command || pType === PacketType.CommandLow) {\n const key = (pType << 16) | p.id;\n this.#ackManager.set(key, rp);\n }\n }\n\n #checkResends(): void {\n const now = Date.now();\n\n if (now - this.#lastMessageReceived > PACKET_TIMEOUT_MS) {\n this.#logger.warn(\"idle timeout\");\n this.#triggerClose(new Error(\"idle timeout\"));\n return;\n }\n\n if (this.#initPacketCheck) {\n this.#doResend(this.#initPacketCheck, now);\n }\n\n for (const [key, rp] of this.#ackManager) {\n if (now - rp.firstSend > PACKET_TIMEOUT_MS) {\n this.#ackManager.delete(key);\n this.#triggerClose(new Error(\"packet ack timeout\"));\n return;\n }\n this.#doResend(rp, now);\n }\n }\n\n #doResend(rp: ResendPacket, now: number): void {\n if (now - rp.lastSend < rp.nextInterval) return;\n\n rp.lastSend = now;\n rp.retryCount++;\n rp.nextInterval = Math.min(rp.nextInterval * 2, MAX_RETRY_INTERVAL_MS);\n\n const dummy = !this.#crypt.cryptoInitComplete;\n const unencrypted = (packetFlags(rp.packet) & PacketFlags.Unencrypted) !== 0;\n const header = buildC2SHeader(rp.packet);\n const pType = packetType(rp.packet);\n\n const [ciphertext, tag] = this.#crypt.encrypt(\n pType,\n rp.packet.id,\n rp.packet.generationID,\n header,\n rp.packet.data,\n dummy,\n unencrypted,\n );\n\n const final = new Uint8Array(TAG_SIZE + HEADER_SIZE + ciphertext.length);\n final.set(tag.slice(0, TAG_SIZE), 0);\n final.set(header, TAG_SIZE);\n final.set(ciphertext, TAG_SIZE + HEADER_SIZE);\n this.#write(final);\n }\n\n #triggerClose(err: Error | null): void {\n if (this.#closed) return;\n this.close();\n this.onClosed?.(err);\n }\n}\n\n// ---- Helpers ----------------------------------------------------------------\n\nfunction applyProtocolFlags(pType: PacketType, flags: number): number {\n if (pType === PacketType.Command || pType === PacketType.CommandLow) {\n return flags | PacketFlags.NewProtocol;\n }\n return flags;\n}\n\nfunction hasOldNewerPacket(queue: Map<number, Packet>, nextID: number): boolean {\n const now = Date.now();\n for (const [id, pkg] of queue) {\n const diff = (id - nextID + 0x10000) & 0xffff;\n if (diff < 0x8000 && now - pkg.receivedAt > 5_000) {\n return true;\n }\n }\n return false;\n}\n"],"mappings":"gHAAA,IAAkB,EAAX,SAAA,EAAA,OACL,GAAA,EAAA,MAAA,GAAA,QACA,EAAA,EAAA,aAAA,GAAA,eACA,EAAA,EAAA,QAAA,GAAA,UACA,EAAA,EAAA,WAAA,GAAA,aACA,EAAA,EAAA,KAAA,GAAA,OACA,EAAA,EAAA,KAAA,GAAA,OACA,EAAA,EAAA,IAAA,GAAA,MACA,EAAA,EAAA,OAAA,GAAA,SACA,EAAA,EAAA,MAAA,GAAA,cACD,CAEiB,EAAX,SAAA,EAAA,OACL,GAAA,EAAA,WAAA,IAAA,aACA,EAAA,EAAA,YAAA,IAAA,cACA,EAAA,EAAA,WAAA,IAAA,aACA,EAAA,EAAA,YAAA,KAAA,oBACD,CAYD,SAAgB,EAAW,EAAuB,CAChD,OAAQ,EAAE,YAAc,GAG1B,SAAgB,EAAY,EAAmB,CAC7C,OAAO,EAAE,YAAc,IAGzB,SAAgB,EAAc,EAAoB,CAChD,OAAQ,EAAY,EAAE,CAAG,EAAY,eAAiB,EAIxD,SAAgB,EAAe,EAAuB,CACpD,IAAM,EAAS,IAAI,WAAW,EAAE,CAC1B,EAAO,IAAI,SAAS,EAAO,OAAO,CAIxC,OAHA,EAAK,UAAU,EAAG,EAAE,GAAI,GAAM,CAC9B,EAAK,UAAU,EAAG,EAAE,SAAU,GAAM,CACpC,EAAO,GAAK,EAAE,YACP,EAIT,SAAgB,EAAe,EAAqD,CAElF,MAAO,CACL,GAFW,IAAI,SAAS,EAAI,OAAQ,EAAI,WAAY,EAAI,WAAW,CAE1D,UAAU,EAAG,GAAM,CAC5B,YAAa,EAAI,GAClB,CAIH,SAAgB,EAAe,EAAkE,CAC/F,IAAM,EAAO,IAAI,SAAS,EAAI,OAAQ,EAAI,WAAY,EAAI,WAAW,CACrE,MAAO,CACL,GAAI,EAAK,UAAU,EAAG,GAAM,CAC5B,SAAU,EAAK,UAAU,EAAG,GAAM,CAClC,YAAa,EAAI,GAClB,CCnEH,IAAa,EAAb,KAA8B,CAC5B,GAAoB,EACpB,GAAc,EACd,GACA,GAEA,YAAY,EAAa,EAAoB,CAC3C,MAAA,EAAY,EACZ,MAAA,EAAsB,EAGxB,IAAI,YAAqB,CACvB,OAAO,MAAA,EAGT,QAAQ,EAAsB,CAC5B,GAAI,GAAU,EAAG,OACjB,IAAM,EAAgB,MAAA,EAAyB,EACzC,EAAU,KAAK,MAAM,EAAgB,MAAA,EAAU,CACjD,EAAU,IACZ,MAAA,EAAmB,KAAK,IAAI,MAAA,EAAmB,EAAS,WAAY,EAEtE,MAAA,EAAyB,EAAgB,MAAA,EAG3C,kBAAkB,EAA2B,CAC3C,IAAI,EAAW,EAAc,MAAA,EACzB,EAAW,IAAG,GAAY,MAAA,GAC9B,KAAK,QAAQ,EAAW,EAAE,CAG5B,OAAO,EAA2B,CAChC,IAAI,EAAW,EAAc,MAAA,EACzB,EAAW,IAAG,GAAY,MAAA,GAC9B,KAAK,QAAQ,EAAS,CAGxB,WAAW,EAA8B,CACvC,IAAM,EAAY,MAAA,EAAyB,MAAA,EAI3C,OAHI,EAAY,MAAA,EACP,GAAe,MAAA,GAA0B,EAAc,EAEzD,GAAe,MAAA,GAA0B,EAAc,EAAY,MAAA,EAG5E,cAAc,EAA6B,CAIzC,OAHI,MAAA,EAAgB,EAAY,CACvB,EAAc,MAAA,EAAY,MAAA,EAE5B,EAAc,MAAA,EAGvB,YAAY,EAA8B,CACxC,OAAO,KAAK,cAAc,EAAY,CAAG,EAG3C,eAAe,EAA8B,CAC3C,OAAO,KAAK,cAAc,EAAY,EAAI,MAAA,EAG5C,GAAW,EAA8B,CACvC,OACE,MAAA,EAAyB,MAAA,EAAY,MAAA,GACrC,EAAc,MAAA,EAAyB,MAAA,EAAsB,MAAA,EAIjE,cAAc,EAA6B,CAEzC,OADI,MAAA,EAAgB,EAAY,CAAS,MAAA,EAAmB,EACrD,MAAA,EAGT,OAAc,CACZ,MAAA,EAAyB,EACzB,MAAA,EAAmB,IC1EjB,EAAa,KASN,EAAb,KAAiB,CACf,GAAa,IAAI,WAAW,EAAW,CAEvC,WAAW,EAA8B,CACvC,GAAM,CAAE,YAAW,mBAAkB,SAAU,EAAe,EAAK,CAE7D,EAAO,IAAI,WAAW,EAAiB,CAE7C,GAAA,EAAK,EAAQ,GAEX,OADA,EAAK,IAAI,EAAK,MAAM,EAAW,EAAY,EAAiB,CAAC,CACtD,EAGT,MAAA,EAAgB,KAAK,EAAE,CAEvB,IAAM,EAAkB,CACtB,QAAS,EACT,UAAW,EACX,QAAS,EACT,WAAY,EACb,CAED,KAAO,MAAA,EAAoB,EAAM,EAAM,EACrC,GAAK,EAAM,QAAU,MACf,CAAC,MAAA,EAAuB,EAAM,EAAM,EAAM,CAAE,cAE5C,MAAA,EAAqB,EAAM,EAAM,EAAkB,EAAM,CAAE,MAInE,OAAO,EAGT,GAAe,EAAkB,EAAuB,CAUtD,OATI,EAAG,UAAY,EACf,EAAG,UAAY,EAAI,EAAK,OAAe,IAC3C,EAAG,SACA,EAAK,EAAG,WACN,EAAK,EAAG,UAAY,IAAO,EAC3B,EAAK,EAAG,UAAY,IAAO,GAC3B,EAAK,EAAG,UAAY,IAAO,MAC9B,EACF,EAAG,WAAa,EACT,IATsB,GAY/B,GAAkB,EAAkB,EAAkB,EAAuB,CAE3E,GADA,EAAG,QAAW,EAAG,UAAY,IAAO,EAChC,EAAG,UAAY,EAAI,EAAK,OAAQ,MAAO,GAE3C,IAAM,EAAK,EAAK,EAAG,WACb,EAAK,EAAK,EAAG,UAAY,GAC/B,EAAG,WAAa,EAEhB,IAAM,EAAQ,GAAM,EAAM,GAAM,EAC5B,EAAW,EAAK,GACpB,GAAI,IAAa,EACf,GAAY,MACP,CACL,GAAI,EAAG,WAAa,EAAK,OAAQ,MAAO,GACxC,EAAW,EAAK,EAAG,WACnB,EAAG,YAGL,IAAM,EAAS,MAAA,EAAgB,GAC/B,IAAK,IAAI,EAAI,EAAG,EAAI,EAAU,IACxB,EAAG,QAAU,EAAK,QAAU,EAAS,EAAI,EAAG,UAC9C,EAAK,EAAG,SAAW,EAAK,EAAS,GACjC,EAAG,WAIP,IAAM,EAAM,EAAG,QAAU,EAAI,EAI7B,OAHA,MAAA,EAAsB,EAAM,EAAI,EAAI,CACpC,EAAG,WAAa,EAAG,QAEZ,GAGT,GACE,EACA,EACA,EACA,EACS,CACT,IAAM,EAAY,KAAK,IAAI,EAAkB,GAAG,CAAG,GACnD,GAAI,EAAG,SAAW,EAAW,CAC3B,KAAO,EAAG,QAAU,GAAkB,CACpC,GAAI,EAAG,UAAY,EAAG,CAEpB,GADA,EAAG,WAAa,EACZ,EAAG,UAAY,EAAK,OAAQ,MAChC,EAAG,SACA,EAAK,EAAG,UAAY,GAClB,EAAK,EAAG,UAAY,IAAO,EAC3B,EAAK,EAAG,UAAY,IAAO,GAC3B,EAAK,EAAG,UAAY,IAAO,MAC9B,EAEJ,GAAI,EAAG,WAAa,EAAK,OAAQ,MACjC,EAAK,EAAG,WAAa,EAAK,EAAG,aAC7B,EAAG,QAAW,EAAG,UAAY,IAAO,EAEtC,MAAO,GAGT,GAAI,EAAG,WAAa,EAAK,QAAU,EAAG,SAAW,EAAK,OAAQ,MAAO,GAErE,EAAK,EAAG,WAAa,EAAK,EAAG,aAC7B,EAAG,QAAW,EAAG,UAAY,IAAO,EAEpC,IAAM,EAAM,KAAK,IAAI,EAAG,QAAU,EAAG,EAAE,CAIvC,OAHA,MAAA,EAAsB,EAAM,EAAI,EAAI,CAChC,EAAG,WAAa,IAAK,EAAG,WAAa,GAElC,GAGT,GAAiB,EAAkB,EAAc,EAAmB,CAClE,KAAO,EAAG,WAAa,GACjB,IAAG,WAAa,EAAI,EAAK,SADH,CAE1B,IAAM,GACH,EAAK,EAAG,YACN,EAAK,EAAG,WAAa,IAAO,EAC5B,EAAK,EAAG,WAAa,IAAO,MAC/B,EACI,GAAS,GAAK,GAAM,GAAK,KAC/B,MAAA,EAAgB,GAAQ,EAAG,WAC3B,EAAG,gBAKT,SAAS,EAAe,EAItB,CACA,GAAI,EAAK,OAAS,EAAG,MAAU,MAAM,0BAA0B,CAE/D,IAAM,EAAQ,EAAK,GAEnB,IADe,GAAS,EAAK,IACf,EAAG,MAAU,MAAM,qCAAqC,CAEtE,IAAM,EAAa,EAAQ,EAAc,EAAI,EAC7C,GAAI,EAAK,OAAS,EAAW,MAAU,MAAM,qCAAqC,CAElF,IAAI,EAOJ,MANA,CAGE,EAHG,EAAQ,GACS,EAAK,GAAO,EAAK,IAAO,EAAM,EAAK,IAAO,GAAO,EAAK,IAAO,MAAS,EAEvE,EAAK,GAGnB,CAAE,YAAW,mBAAkB,QAAO,CCjJ/C,IAAM,EAAsB,IACtB,EAA6B,KAC7B,EAAmB,IACnB,EAAoB,IACpB,EAAwB,IAExB,EAAc,EACd,EAAW,EACX,EAAoB,EACpB,EAA0B,IAC1B,EAA0B,IAUnB,EAAb,KAA2B,CACzB,SAAyC,KACzC,SAAiD,KAEjD,GACA,GAEA,GAA0B,KAC1B,GAAY,EACZ,GAAU,GACV,GAAiC,KACjC,GAAmC,KACnC,GAAuB,KAAK,KAAK,CAEjC,GAAiB,IAAI,YAAY,EAAE,CACnC,GAAqB,IAAI,YAAY,EAAE,CAEvC,GAAqB,IAAI,EAAiB,MAAS,EAA2B,CAC9E,GAAwB,IAAI,EAAiB,MAAS,EAA2B,CACjF,GAAqB,IAAI,EAAiB,MAAS,EAA2B,CAC9E,GAAwB,IAAI,EAAiB,MAAS,EAA2B,CAEjF,GAAgB,IAAI,IACpB,GAAmB,IAAI,IACvB,GAAc,IAAI,IAClB,GAAwC,KAExC,YAAY,EAAc,EAAiB,EAAA,EAAY,CACrD,MAAA,EAAc,EACd,MAAA,EAAe,EAGjB,YAAY,EAAkB,CAC5B,MAAA,EAAiB,EAGnB,QAAQ,EAA6B,CACnC,OAAO,IAAI,SAAS,EAAS,IAAW,CACtC,GAAM,CAAC,EAAM,GACX,EAAK,YAAY,IAAI,CAAG,EACpB,CAAC,EAAK,MAAM,EAAG,EAAK,YAAY,IAAI,CAAC,CAAE,EAAK,MAAM,EAAK,YAAY,IAAI,CAAG,EAAE,CAAC,CAC7E,CAAC,EAAM,OAAO,CACd,EAAO,SAAS,EAAS,GAAG,CAE5B,GAAA,EAAA,EAAA,cAAsB,OAAO,CACnC,EAAO,KAAK,QAAS,EAAO,CAC5B,EAAO,QAAQ,EAAM,MAAY,CAC/B,EAAO,IAAI,QAAS,EAAO,CAC3B,KAAK,MAAM,EAAO,CAClB,GAAS,EACT,EACF,CAGJ,MAAM,EAAuB,CAC3B,MAAA,EAAa,EACb,MAAA,EAAe,GACf,MAAA,EAA4B,KAAK,KAAK,CAEtC,EAAK,GAAG,UAAY,GAAQ,CAC1B,MAAA,EAA4B,KAAK,KAAK,CACtC,MAAA,EAAsB,IAAI,WAAW,EAAI,OAAQ,EAAI,WAAY,EAAI,WAAW,CAAC,EACjF,CACF,EAAK,GAAG,QAAU,GAAQ,CACxB,MAAA,EAAa,MAAM,YAAa,EAAI,CACpC,MAAA,EAAmB,EAAI,EACvB,CACF,EAAK,GAAG,YAAe,MAAA,EAAmB,KAAK,CAAC,CAEhD,MAAA,EAAoB,EAAW,SAAW,EAC1C,MAAA,EAAoB,EAAW,OAAS,IAExC,IAAM,EAAY,EAAA,EAAa,MAAA,EAAa,KAAK,CAC7C,GAAW,MAAA,EAAoB,EAAW,MAAO,EAAW,EAAE,CAGlE,IAAM,EAAY,gBAAkB,CAC9B,MAAA,EAAY,oBACd,KAAK,WAAW,EAAW,KAAM,IAAI,WAAe,EAAY,YAAY,EAE7E,EAAiB,CACpB,MAAA,MAAuB,cAAc,EAAU,CAG/C,IAAM,EAAc,gBAAkB,MAAA,GAAoB,CAAE,EAAwB,CACpF,MAAA,MAAyB,cAAc,EAAY,CAGrD,sBAA6B,CAC3B,MAAA,EAAwB,KAG1B,WAAW,EAAmB,EAAkB,EAAqB,CACnE,IAAM,EAAQ,CAAC,MAAA,EAAY,mBAC3B,GAAI,EAAK,OAAS,KAAO,IAAU,EAAW,OAAS,IAAU,EAAW,aAAc,CACxF,MAAA,EAAsB,EAAO,EAAM,EAAO,EAAM,CAChD,OAEF,MAAA,EAAoB,EAAO,EAAM,EAAO,EAAM,CAGhD,gBAAgB,EAAkB,EAAqB,CACrD,IAAM,EAAM,MAAA,EAAoB,EAAW,OACrC,EAAO,MAAA,EAAwB,EAAW,OAChD,MAAA,EAAoB,EAAW,OAAU,EAAM,EAAK,MAChD,MAAA,EAAoB,EAAW,SAAW,GAC5C,MAAA,EAAwB,EAAW,SAGrC,IAAM,EAAa,EAAoB,EAAK,OACtC,EAAe,IAAI,WAAW,EAAW,CAC/C,IAAI,SAAS,EAAa,OAAO,CAAC,UAAU,EAAG,EAAK,GAAM,CAC1D,EAAa,GAAK,EAClB,EAAa,IAAI,EAAM,EAAkB,CAWzC,IAAM,EAAS,EATG,CAChB,YAAa,EAAW,MAAQ,EAAY,YAC5C,GAAI,EACJ,SAAU,MAAA,EACV,aAAc,EACd,KAAM,EACN,WAAY,EACb,CAE+B,CAC1B,EAAQ,IAAI,WAAW,EAAW,EAAc,EAAW,CACjE,EAAM,IAAI,MAAA,EAAY,cAAe,EAAE,CACvC,EAAM,IAAI,EAAQ,EAAS,CAC3B,EAAM,IAAI,EAAc,EAAW,EAAY,CAC/C,MAAA,EAAY,EAAM,CAGpB,OAAc,CACR,MAAA,IACJ,MAAA,EAAe,GACf,MAAA,KAAkB,CAClB,MAAA,KAAoB,CACpB,MAAA,GAAY,OAAO,EAKrB,GAAiB,EAAmB,EAAkB,EAAe,EAAsB,CACzF,IAAM,EAAU,EAAsB,EAAc,EAChD,EAAM,EACN,EAAQ,GAEZ,KAAO,EAAM,EAAK,QAAQ,CACxB,IAAM,EAAY,KAAK,IAAI,EAAK,OAAS,EAAK,EAAQ,CAChD,EAAO,EAAM,IAAc,EAAK,OAElC,EAAS,EACT,IAAU,IAAM,GAAU,EAAY,YAE1C,MAAA,EAAoB,EAAO,EAAK,MAAM,EAAK,EAAM,EAAU,CAAE,EAAQ,EAAM,CAC3E,GAAO,EACP,EAAQ,IAIZ,GACE,EACA,EACA,EACA,EAAQ,CAAC,MAAA,EAAY,mBACf,CACN,EAAQ,EAAmB,EAAO,EAAM,CACxC,GAAM,CAAC,EAAK,GAAQ,MAAA,EAAyB,EAAM,CAE7C,EAAY,CAChB,YAAa,EAAQ,EACrB,GAAI,EACJ,SAAU,MAAA,EACV,aAAc,EACd,OACA,WAAY,EACb,CAEK,GAAe,EAAQ,EAAY,eAAiB,EACpD,EAAS,EAAe,EAAE,CAC1B,CAAC,EAAY,GAAO,MAAA,EAAY,QACpC,EACA,EACA,EACA,EACA,EACA,EACA,EACD,CAEK,EAAQ,IAAI,WAAW,EAAW,EAAc,EAAW,OAAO,CACxE,EAAM,IAAI,EAAI,MAAM,EAAG,EAAS,CAAE,EAAE,CACpC,EAAM,IAAI,EAAQ,EAAS,CAC3B,EAAM,IAAI,EAAY,EAAW,EAAY,CAC7C,MAAA,EAAY,EAAM,CAElB,IAAM,EAAmB,CACvB,OAAQ,EACR,UAAW,KAAK,KAAK,CACrB,SAAU,KAAK,KAAK,CACpB,WAAY,EACZ,aAAc,EACf,CACD,MAAA,EAAkB,EAAO,EAAG,EAAG,CAGjC,GAAO,EAAwB,CAC7B,MAAA,GAAY,KAAK,OAAO,KAAK,EAAK,CAAG,GAAQ,CACvC,GAAK,MAAA,EAAa,KAAK,iBAAkB,EAAI,EACjD,CAGJ,GAAiB,EAAuB,CACtC,GAAI,EAAI,OAAS,GAAI,OAErB,IAAM,EAAM,EAAI,MAAM,EAAG,EAAS,CAC5B,EAAS,EAAI,MAAM,EAAU,EAAW,EAAE,CAC1C,EAAa,EAAI,MAAM,EAAW,EAAE,CAEpC,EAAS,EAAe,EAAO,CAC/B,EAAY,CAChB,GAAG,EACH,SAAU,EACV,aAAc,MAAA,EAAwB,EAAO,GAAI,EAAO,YAAc,GAAK,CAC3E,KAAM,IAAI,WACV,WAAY,KAAK,KAAK,CACvB,CAEK,EAAY,MAAA,EAAwB,EAAG,EAAQ,EAAY,EAAI,CACjE,OAAc,KAKlB,IAJA,EAAE,KAAO,EAAU,UAEL,EAAW,EAAE,GAEb,EAAW,KAAM,CAC7B,MAAA,EAAe,EAAE,GAAI,EAAU,UAAU,CACzC,OAGG,MAAA,EAAgC,EAAG,EAAU,UAAU,GAE5D,MAAA,EAAwB,EAAE,CAC1B,MAAA,EAA6B,EAAE,GAGjC,GAAmB,EAAY,EAAuB,CACpD,OAAQ,EAAR,CACE,KAAK,EAAW,QACd,OAAO,MAAA,EAAwB,cAAc,EAAG,CAClD,KAAK,EAAW,WACd,OAAO,MAAA,EAA2B,cAAc,EAAG,CACrD,KAAK,EAAW,IACd,OAAO,MAAA,EAAwB,cAAc,EAAG,CAClD,KAAK,EAAW,OACd,OAAO,MAAA,EAA2B,cAAc,EAAG,CACrD,QACE,MAAO,IAIb,GACE,EACA,EACA,EACA,EACsD,CACtD,IAAM,GAAe,EAAY,EAAE,CAAG,EAAY,eAAiB,EAC7D,EAAQ,CAAC,MAAA,EAAY,mBACvB,EAAY,EACV,EAAQ,EAAW,EAAE,CACrB,EAAM,EAAE,aAEd,GAAI,CAWF,MAAO,CAAE,UAVS,MAAA,EAAY,QAC5B,EACA,EAAE,GACF,EACA,EACA,EACA,EACA,EACA,EACD,CACmB,YAAW,MACzB,CAEN,IAAK,IAAM,IAAU,CAAC,GAAI,EAAE,CAAE,CAC5B,IAAM,EAAW,EAAM,EACnB,OAAW,GACf,GAAI,CAWF,MAAO,CAAE,UAVS,MAAA,EAAY,QAC5B,EACA,EAAE,GACF,EACA,EACA,EACA,EACA,GACA,GACD,CACmB,UAAW,GAAO,MAChC,GAMV,GACE,IAAU,EAAW,SACrB,IAAU,EAAW,YACrB,IAAU,EAAW,IAErB,GAAI,CAWF,MAAO,CAAE,UAVS,MAAA,EAAY,QAC5B,EACA,EAAE,GACF,EACA,EACA,EACA,EACA,GACA,EACD,CACmB,UAAW,GAAM,MAC/B,EAMV,OADA,MAAA,EAAa,MAAM,2BAA4B,CAAE,KAAM,EAAO,GAAI,EAAE,GAAI,CAAC,CAClE,MAIX,GAA2B,EAAW,EAA6B,CACjE,IAAM,EAAQ,EAAW,EAAE,CAC3B,GAAI,IAAU,EAAW,SAAW,IAAU,EAAW,WAAY,MAAO,GAE5E,IAAM,EAAM,IAAU,EAAW,QAAU,MAAA,EAA0B,MAAA,EAC/D,EAAU,IAAU,EAAW,QAAU,EAAW,IAAM,EAAW,OAS3E,OAPK,EAAI,WAAW,EAAE,GAAG,EAMzB,MAAA,EAAc,EAAE,GAAI,EAAS,EAAU,CAChC,KAND,EAAI,YAAY,EAAE,GAAG,EACvB,MAAA,EAAc,EAAE,GAAI,EAAS,EAAU,CAElC,IAMX,GAAS,EAAkB,EAAqB,EAA0B,CACxE,IAAM,EAAU,IAAI,WAAW,EAAE,CACjC,IAAI,SAAS,EAAQ,OAAO,CAAC,UAAU,EAAG,EAAU,GAAM,CAC1D,MAAA,EAAoB,EAAS,EAAS,EAAG,EAAU,CAGrD,GAAU,EAAa,EAA0B,CAC/C,IAAM,EAAW,IAAI,WAAW,EAAE,CAClC,IAAI,SAAS,EAAS,OAAO,CAAC,UAAU,EAAG,EAAK,GAAM,CACtD,MAAA,EAAoB,EAAW,KAAM,EAAU,EAAY,YAAa,EAAU,CAGpF,GAAmB,EAAiB,CAClC,IAAM,EAAQ,EAAW,EAAE,CAC3B,GAAI,IAAU,EAAW,SAAW,IAAU,EAAW,WAAY,CACnE,KAAK,WAAW,EAAE,CAClB,OAGF,IAAM,EAAY,IAAU,EAAW,QACjC,EAAQ,EAAY,MAAA,EAAqB,MAAA,EACzC,EAAM,EAAY,MAAA,EAA0B,MAAA,EAUlD,IARA,EAAM,IAAI,EAAE,GAAI,EAAE,CAEd,EACF,MAAA,EAAgC,EAAO,EAAK,GAAK,CAEjD,MAAA,EAAgC,EAAO,EAAK,GAAM,GAGvC,CACX,IAAM,EAAU,EAAY,MAAA,EAAuB,MAAA,EAC7C,EAAS,EAAM,IAAI,EAAQ,CACjC,GAAI,IAAW,IAAA,GAAW,MAE1B,IAAM,EAAS,MAAA,EAAoB,EAAQ,EAAO,EAAS,EAAI,CAC/D,GAAI,CAAC,EAAQ,MAEb,GAAM,CAAC,EAAa,GAAW,EAC3B,EAAW,MAAA,EAAuB,EACjC,MAAA,EAA0B,EAE/B,MAAA,EAAoB,EAAY,CAChC,KAAK,WAAW,EAAY,EAIhC,GAAkB,EAClB,GAAqB,EAErB,GACE,EACA,EACA,EACM,CACN,IAAI,EAAS,EAAY,MAAA,EAAuB,MAAA,EAChD,KAAO,CAAC,EAAM,IAAI,EAAO,EAAI,EAAkB,EAAO,EAAO,EAC3D,EAAU,EAAS,EAAK,MACxB,EAAI,QAAQ,EAAE,CAEZ,EAAW,MAAA,EAAuB,EACjC,MAAA,EAA0B,EAGjC,GACE,EACA,EACA,EACA,EACiD,CACjD,IAAK,EAAY,EAAY,CAAG,EAAY,cAAgB,EAG1D,OAFA,EAAM,OAAO,EAAO,CACpB,EAAI,QAAQ,EAAE,CACP,CAAC,EAAc,EAAS,EAAK,MAAO,CAG7C,IAAM,EAAsB,EAAE,CAC1B,EAAY,EACZ,EAAS,EACT,EAAY,GACZ,EAAW,GAEf,OAAa,CACX,IAAM,EAAO,EAAM,IAAI,EAAO,CAC9B,GAAI,CAAC,EAAM,OAAO,KAClB,EAAU,KAAK,EAAK,CACpB,GAAa,EAAK,KAAK,OAEvB,IAAM,GAAc,EAAY,EAAK,CAAG,EAAY,cAAgB,EACpE,GAAI,CAAC,EAEH,IADA,EAAY,GACR,CAAC,EAAY,CACf,EAAW,GACX,eAEO,EAAY,CACrB,EAAW,GACX,MAEF,EAAU,EAAS,EAAK,MAG1B,GAAI,CAAC,EAAU,OAAO,KAEtB,IAAM,EAAW,IAAI,WAAW,EAAU,CACtC,EAAM,EACV,IAAK,IAAM,KAAQ,EACjB,EAAS,IAAI,EAAK,KAAM,EAAI,CAC5B,GAAO,EAAK,KAAK,OACjB,EAAM,OAAO,EAAO,CACpB,EAAI,QAAQ,EAAE,CACd,EAAU,EAAS,EAAK,MAK1B,MAFA,GAAY,KAAO,EACnB,EAAY,aAAe,CAAC,EAAY,WACjC,CAAC,EAAa,EAAO,CAG9B,GAAe,EAAsB,CACnC,IAAK,EAAY,EAAO,CAAG,EAAY,cAAgB,EACvD,GAAI,CAEF,EAAO,KADK,IAAI,GAAK,CACH,WAAW,EAAO,KAAK,CACzC,EAAO,aAAe,CAAC,EAAY,iBAC5B,EAAK,CACZ,MAAA,EAAa,MAAM,uBAAwB,CAAE,GAAI,EAAO,GAAI,MAAK,CAAC,EAItE,GAAwB,EAAiB,CACvC,IAAM,EAAQ,EAAW,EAAE,CAE3B,GAAI,IAAU,EAAW,MAAO,CAC9B,MAAA,EAAwB,KACxB,OAGF,IAAK,IAAU,EAAW,KAAO,IAAU,EAAW,SAAW,EAAE,KAAK,QAAU,EAAG,CACnF,IAAM,EAAQ,IAAI,SAAS,EAAE,KAAK,OAAQ,EAAE,KAAK,WAAW,CAAC,UAAU,EAAG,GAAM,CAE1E,GADa,IAAU,EAAW,IAAM,EAAW,QAAU,EAAW,aACnD,GAAM,EACjC,MAAA,EAAiB,OAAO,EAAI,EAIhC,GAAoB,EAA8C,CAChE,IAAM,EAAM,MAAA,EAAoB,GAC1B,EAAO,MAAA,EAAwB,GAerC,OAbI,IAAU,EAAW,MAAc,CAAC,EAAK,EAAK,EAElD,MAAA,EAAoB,GAAU,EAAM,EAAK,MACrC,MAAA,EAAoB,KAAW,IACjC,MAAA,EAAwB,GAAU,EAAO,IAAO,GAG9C,IAAU,EAAW,QACvB,MAAA,EAAwB,kBAAkB,EAAI,CACrC,IAAU,EAAW,YAC9B,MAAA,EAA2B,kBAAkB,EAAI,CAG5C,CAAC,EAAK,EAAK,EAGpB,GAAa,EAAmB,EAAW,EAAwB,CACjE,GAAI,IAAU,EAAW,MAAO,CAC9B,MAAA,EAAwB,EACxB,OAEF,GAAI,IAAU,EAAW,SAAW,IAAU,EAAW,WAAY,CACnE,IAAM,EAAO,GAAS,GAAM,EAAE,GAC9B,MAAA,EAAiB,IAAI,EAAK,EAAG,EAIjC,IAAsB,CACpB,IAAM,EAAM,KAAK,KAAK,CAEtB,GAAI,EAAM,MAAA,EAA4B,EAAmB,CACvD,MAAA,EAAa,KAAK,eAAe,CACjC,MAAA,EAAuB,MAAM,eAAe,CAAC,CAC7C,OAGE,MAAA,GACF,MAAA,EAAe,MAAA,EAAuB,EAAI,CAG5C,IAAK,GAAM,CAAC,EAAK,KAAO,MAAA,EAAkB,CACxC,GAAI,EAAM,EAAG,UAAY,EAAmB,CAC1C,MAAA,EAAiB,OAAO,EAAI,CAC5B,MAAA,EAAuB,MAAM,qBAAqB,CAAC,CACnD,OAEF,MAAA,EAAe,EAAI,EAAI,EAI3B,GAAU,EAAkB,EAAmB,CAC7C,GAAI,EAAM,EAAG,SAAW,EAAG,aAAc,OAEzC,EAAG,SAAW,EACd,EAAG,aACH,EAAG,aAAe,KAAK,IAAI,EAAG,aAAe,EAAG,EAAsB,CAEtE,IAAM,EAAQ,CAAC,MAAA,EAAY,mBACrB,GAAe,EAAY,EAAG,OAAO,CAAG,EAAY,eAAiB,EACrE,EAAS,EAAe,EAAG,OAAO,CAClC,EAAQ,EAAW,EAAG,OAAO,CAE7B,CAAC,EAAY,GAAO,MAAA,EAAY,QACpC,EACA,EAAG,OAAO,GACV,EAAG,OAAO,aACV,EACA,EAAG,OAAO,KACV,EACA,EACD,CAEK,EAAQ,IAAI,WAAW,EAAW,EAAc,EAAW,OAAO,CACxE,EAAM,IAAI,EAAI,MAAM,EAAG,EAAS,CAAE,EAAE,CACpC,EAAM,IAAI,EAAQ,EAAS,CAC3B,EAAM,IAAI,EAAY,EAAW,EAAY,CAC7C,MAAA,EAAY,EAAM,CAGpB,GAAc,EAAyB,CACjC,MAAA,IACJ,KAAK,OAAO,CACZ,KAAK,WAAW,EAAI,IAMxB,SAAS,EAAmB,EAAmB,EAAuB,CAIpE,OAHI,IAAU,EAAW,SAAW,IAAU,EAAW,WAChD,EAAQ,EAAY,YAEtB,EAGT,SAAS,EAAkB,EAA4B,EAAyB,CAC9E,IAAM,EAAM,KAAK,KAAK,CACtB,IAAK,GAAM,CAAC,EAAI,KAAQ,EAEtB,IADc,EAAK,EAAS,MAAW,OAC5B,OAAU,EAAM,EAAI,WAAa,IAC1C,MAAO,GAGX,MAAO"}
|
|
@@ -1,2 +0,0 @@
|
|
|
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
|