@aegis-fluxion/core 0.7.2 → 0.9.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/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import {\r\n createCipheriv,\r\n createDecipheriv,\r\n createECDH,\r\n createHash,\r\n randomBytes,\r\n randomUUID\r\n} from \"node:crypto\";\r\nimport type { ECDH } from \"node:crypto\";\r\nimport type { IncomingMessage } from \"node:http\";\r\nimport WebSocket, { WebSocketServer } from \"ws\";\r\nimport type {\r\n ClientOptions,\r\n RawData,\r\n ServerOptions as WebSocketServerOptions\r\n} from \"ws\";\r\n\r\nconst DEFAULT_CLOSE_CODE = 1000;\r\nconst DEFAULT_CLOSE_REASON = \"\";\r\nconst POLICY_VIOLATION_CLOSE_CODE = 1008;\r\nconst POLICY_VIOLATION_CLOSE_REASON = \"Connection rejected by middleware.\";\r\nconst INTERNAL_HANDSHAKE_EVENT = \"__handshake\";\r\nconst INTERNAL_RPC_REQUEST_EVENT = \"__rpc:req\";\r\nconst INTERNAL_RPC_RESPONSE_EVENT = \"__rpc:res\";\r\nconst READY_EVENT = \"ready\";\r\nconst HANDSHAKE_CURVE = \"prime256v1\";\r\nconst ENCRYPTION_ALGORITHM = \"aes-256-gcm\";\r\nconst GCM_IV_LENGTH = 12;\r\nconst GCM_AUTH_TAG_LENGTH = 16;\r\nconst ENCRYPTION_KEY_LENGTH = 32;\r\nconst ENCRYPTED_PACKET_VERSION = 1;\r\nconst ENCRYPTED_PACKET_PREFIX_LENGTH = 1 + GCM_IV_LENGTH + GCM_AUTH_TAG_LENGTH;\r\nconst BINARY_PAYLOAD_MARKER = \"__afxBinaryPayload\";\r\nconst BINARY_PAYLOAD_VERSION = 1;\r\nconst DEFAULT_HEARTBEAT_INTERVAL_MS = 15_000;\r\nconst DEFAULT_HEARTBEAT_TIMEOUT_MS = 15_000;\r\nconst DEFAULT_RECONNECT_INITIAL_DELAY_MS = 250;\r\nconst DEFAULT_RECONNECT_MAX_DELAY_MS = 10_000;\r\nconst DEFAULT_RECONNECT_FACTOR = 2;\r\nconst DEFAULT_RECONNECT_JITTER_RATIO = 0.2;\r\nconst DEFAULT_RPC_TIMEOUT_MS = 5_000;\r\nconst DEFAULT_RATE_LIMIT_WINDOW_MS = 1_000;\r\nconst DEFAULT_RATE_LIMIT_MAX_EVENTS_PER_CONNECTION = 120;\r\nconst DEFAULT_RATE_LIMIT_MAX_EVENTS_PER_IP = 300;\r\nconst DEFAULT_RATE_LIMIT_THROTTLE_MS = 150;\r\nconst DEFAULT_RATE_LIMIT_MAX_THROTTLE_MS = 2_000;\r\nconst DEFAULT_RATE_LIMIT_DISCONNECT_AFTER_VIOLATIONS = 4;\r\nconst DEFAULT_RATE_LIMIT_CLOSE_CODE = 1013;\r\nconst DEFAULT_RATE_LIMIT_CLOSE_REASON =\r\n \"Rate limit exceeded. Please retry later.\";\r\nconst SECURE_SERVER_ADAPTER_MESSAGE_VERSION = 1;\r\n\r\ninterface HandshakePayload {\r\n publicKey: string;\r\n}\r\n\r\ninterface ServerHandshakeState {\r\n ecdh: ECDH;\r\n localPublicKey: string;\r\n isReady: boolean;\r\n}\r\n\r\ninterface ClientHandshakeState {\r\n ecdh: ECDH;\r\n localPublicKey: string;\r\n isReady: boolean;\r\n sharedSecret: Buffer | null;\r\n encryptionKey: Buffer | null;\r\n}\r\n\r\ninterface EncryptedPacketParts {\r\n iv: Buffer;\r\n authTag: Buffer;\r\n ciphertext: Buffer;\r\n}\r\n\r\ninterface RpcRequestPayload {\r\n id: string;\r\n event: string;\r\n data: unknown;\r\n}\r\n\r\ninterface RpcResponsePayload {\r\n id: string;\r\n ok: boolean;\r\n data?: unknown;\r\n error?: string;\r\n}\r\n\r\ninterface PendingRpcRequest {\r\n resolve: (value: unknown) => void;\r\n reject: (reason?: unknown) => void;\r\n timeoutHandle: ReturnType<typeof setTimeout>;\r\n}\r\n\r\ninterface SecureServerRateLimitBucket {\r\n windowStartedAt: number;\r\n count: number;\r\n violationCount: number;\r\n throttleUntil: number;\r\n lastSeenAt: number;\r\n}\r\n\r\ninterface SecureServerRateLimitDecision {\r\n shouldDisconnect: boolean;\r\n shouldDrop: boolean;\r\n throttleDelayMs: number;\r\n}\r\n\r\ntype BinaryPayloadKind = \"buffer\" | \"uint8array\" | \"blob\";\r\n\r\ninterface EncodedBinaryPayload {\r\n [BINARY_PAYLOAD_MARKER]: number;\r\n kind: BinaryPayloadKind;\r\n base64: string;\r\n mimeType?: string;\r\n}\r\n\r\nexport interface SecureEnvelope<TData = unknown> {\r\n event: string;\r\n data: TData;\r\n}\r\n\r\nexport type SecureBinaryPayload = Buffer | Uint8Array | Blob;\r\n\r\nexport interface SecureAckOptions {\r\n timeoutMs?: number;\r\n}\r\n\r\nexport type SecureAckCallback = (\r\n error: Error | null,\r\n response?: unknown\r\n) => void;\r\n\r\nexport interface SecureServerHeartbeatOptions {\r\n enabled?: boolean;\r\n intervalMs?: number;\r\n timeoutMs?: number;\r\n}\r\n\r\nexport type SecureServerRateLimitAction = \"throttle\" | \"disconnect\";\r\n\r\nexport interface SecureServerRateLimitOptions {\r\n enabled?: boolean;\r\n windowMs?: number;\r\n maxEventsPerConnection?: number;\r\n maxEventsPerIp?: number;\r\n action?: SecureServerRateLimitAction;\r\n throttleMs?: number;\r\n maxThrottleMs?: number;\r\n disconnectAfterViolations?: number;\r\n disconnectCode?: number;\r\n disconnectReason?: string;\r\n}\r\n\r\nexport type SecureServerAdapterMessageScope = \"broadcast\" | \"room\";\r\n\r\nexport interface SecureServerAdapterMessage {\r\n version: typeof SECURE_SERVER_ADAPTER_MESSAGE_VERSION;\r\n originServerId: string;\r\n scope: SecureServerAdapterMessageScope;\r\n event: string;\r\n data: unknown;\r\n emittedAt: number;\r\n room?: string;\r\n}\r\n\r\nexport interface SecureServerAdapter {\r\n attach: (server: SecureServer) => void | Promise<void>;\r\n publish: (message: SecureServerAdapterMessage) => void | Promise<void>;\r\n detach?: (server: SecureServer) => void | Promise<void>;\r\n}\r\n\r\nexport interface SecureServerOptions extends WebSocketServerOptions {\r\n heartbeat?: SecureServerHeartbeatOptions;\r\n rateLimit?: SecureServerRateLimitOptions;\r\n adapter?: SecureServerAdapter;\r\n}\r\n\r\nexport interface SecureClientReconnectOptions {\r\n enabled?: boolean;\r\n initialDelayMs?: number;\r\n maxDelayMs?: number;\r\n factor?: number;\r\n jitterRatio?: number;\r\n maxAttempts?: number | null;\r\n}\r\n\r\nexport interface SecureClientOptions {\r\n protocols?: string | string[];\r\n wsOptions?: ClientOptions;\r\n autoConnect?: boolean;\r\n reconnect?: boolean | SecureClientReconnectOptions;\r\n}\r\n\r\nexport interface SecureServerClient {\r\n id: string;\r\n socket: WebSocket;\r\n request: IncomingMessage;\r\n metadata: ReadonlyMap<string, unknown>;\r\n emit: (\r\n event: string,\r\n data: unknown,\r\n callbackOrOptions?: SecureAckCallback | SecureAckOptions,\r\n maybeCallback?: SecureAckCallback\r\n ) => boolean | Promise<unknown>;\r\n join: (room: string) => boolean;\r\n leave: (room: string) => boolean;\r\n leaveAll: () => number;\r\n}\r\n\r\nexport interface SecureServerRoomOperator {\r\n emit: (event: string, data: unknown) => SecureServer;\r\n}\r\n\r\nexport type SecureErrorHandler = (error: Error) => void;\r\n\r\nexport type SecureServerEventHandler = (\r\n data: unknown,\r\n client: SecureServerClient\r\n) => unknown | Promise<unknown>;\r\n\r\nexport type SecureServerConnectionHandler = (\r\n client: SecureServerClient\r\n) => void;\r\n\r\nexport type SecureServerDisconnectHandler = (\r\n client: SecureServerClient,\r\n code: number,\r\n reason: string\r\n) => void;\r\n\r\nexport type SecureServerReadyHandler = (client: SecureServerClient) => void;\r\n\r\nexport type SecureClientEventHandler = (data: unknown) => unknown | Promise<unknown>;\r\n\r\nexport type SecureClientConnectHandler = () => void;\r\n\r\nexport type SecureClientDisconnectHandler = (\r\n code: number,\r\n reason: string\r\n) => void;\r\n\r\nexport type SecureClientReadyHandler = () => void;\r\n\r\nexport type SecureServerLifecycleEvent =\r\n | \"connection\"\r\n | \"disconnect\"\r\n | \"ready\"\r\n | \"error\";\r\n\r\nexport type SecureClientLifecycleEvent =\r\n | \"connect\"\r\n | \"disconnect\"\r\n | \"ready\"\r\n | \"error\";\r\n\r\nexport interface SecureServerEventMap {\r\n connection: SecureServerConnectionHandler;\r\n disconnect: SecureServerDisconnectHandler;\r\n ready: SecureServerReadyHandler;\r\n error: SecureErrorHandler;\r\n}\r\n\r\nexport interface SecureClientEventMap {\r\n connect: SecureClientConnectHandler;\r\n disconnect: SecureClientDisconnectHandler;\r\n ready: SecureClientReadyHandler;\r\n error: SecureErrorHandler;\r\n}\r\n\r\nexport interface SecureServerConnectionMiddlewareContext {\r\n phase: \"connection\";\r\n socket: WebSocket;\r\n request: IncomingMessage;\r\n metadata: Map<string, unknown>;\r\n}\r\n\r\nexport interface SecureServerMessageMiddlewareContext {\r\n phase: \"incoming\" | \"outgoing\";\r\n client: SecureServerClient;\r\n event: string;\r\n data: unknown;\r\n metadata: Map<string, unknown>;\r\n}\r\n\r\nexport type SecureServerMiddlewareContext =\r\n | SecureServerConnectionMiddlewareContext\r\n | SecureServerMessageMiddlewareContext;\r\n\r\nexport type SecureServerMiddlewareNext = () => Promise<void>;\r\n\r\nexport type SecureServerMiddleware = (\r\n context: SecureServerMiddlewareContext,\r\n next: SecureServerMiddlewareNext\r\n) => void | Promise<void>;\r\n\r\nexport function normalizeSecureServerAdapterMessage(\r\n value: unknown\r\n): SecureServerAdapterMessage {\r\n if (!isPlainObject(value)) {\r\n throw new Error(\"SecureServer adapter message must be a plain object.\");\r\n }\r\n\r\n if (value.version !== SECURE_SERVER_ADAPTER_MESSAGE_VERSION) {\r\n throw new Error(\r\n `Unsupported SecureServer adapter message version: ${String(value.version)}.`\r\n );\r\n }\r\n\r\n if (\r\n typeof value.originServerId !== \"string\" ||\r\n value.originServerId.trim().length === 0\r\n ) {\r\n throw new Error(\"SecureServer adapter message originServerId must be a non-empty string.\");\r\n }\r\n\r\n if (value.scope !== \"broadcast\" && value.scope !== \"room\") {\r\n throw new Error('SecureServer adapter message scope must be either \"broadcast\" or \"room\".');\r\n }\r\n\r\n if (typeof value.event !== \"string\" || value.event.trim().length === 0) {\r\n throw new Error(\"SecureServer adapter message event must be a non-empty string.\");\r\n }\r\n\r\n if (typeof value.emittedAt !== \"number\" || !Number.isFinite(value.emittedAt)) {\r\n throw new Error(\"SecureServer adapter message emittedAt must be a finite number.\");\r\n }\r\n\r\n if (value.scope === \"room\") {\r\n if (typeof value.room !== \"string\" || value.room.trim().length === 0) {\r\n throw new Error(\"SecureServer adapter message room must be a non-empty string.\");\r\n }\r\n\r\n return {\r\n version: SECURE_SERVER_ADAPTER_MESSAGE_VERSION,\r\n originServerId: value.originServerId,\r\n scope: value.scope,\r\n event: value.event,\r\n data: value.data,\r\n emittedAt: value.emittedAt,\r\n room: value.room.trim()\r\n };\r\n }\r\n\r\n return {\r\n version: SECURE_SERVER_ADAPTER_MESSAGE_VERSION,\r\n originServerId: value.originServerId,\r\n scope: value.scope,\r\n event: value.event,\r\n data: value.data,\r\n emittedAt: value.emittedAt\r\n };\r\n}\r\n\r\nfunction normalizeToError(error: unknown, fallbackMessage: string): Error {\r\n if (error instanceof Error) {\r\n return error;\r\n }\r\n\r\n if (typeof error === \"string\" && error.trim().length > 0) {\r\n return new Error(error);\r\n }\r\n\r\n return new Error(fallbackMessage);\r\n}\r\n\r\nfunction decodeRawData(rawData: RawData): string {\r\n if (typeof rawData === \"string\") {\r\n return rawData;\r\n }\r\n\r\n if (rawData instanceof ArrayBuffer) {\r\n return Buffer.from(rawData).toString(\"utf8\");\r\n }\r\n\r\n if (Array.isArray(rawData)) {\r\n return Buffer.concat(rawData).toString(\"utf8\");\r\n }\r\n\r\n return rawData.toString(\"utf8\");\r\n}\r\n\r\nfunction rawDataToBuffer(rawData: RawData): Buffer {\r\n if (typeof rawData === \"string\") {\r\n return Buffer.from(rawData, \"utf8\");\r\n }\r\n\r\n if (rawData instanceof ArrayBuffer) {\r\n return Buffer.from(rawData);\r\n }\r\n\r\n if (Array.isArray(rawData)) {\r\n return Buffer.concat(rawData);\r\n }\r\n\r\n return Buffer.from(rawData);\r\n}\r\n\r\nfunction delay(ms: number): Promise<void> {\r\n return new Promise((resolve) => {\r\n setTimeout(resolve, ms);\r\n });\r\n}\r\n\r\nfunction isBlobValue(value: unknown): value is Blob {\r\n return typeof Blob !== \"undefined\" && value instanceof Blob;\r\n}\r\n\r\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\r\n if (typeof value !== \"object\" || value === null) {\r\n return false;\r\n }\r\n\r\n const prototype = Object.getPrototypeOf(value);\r\n return prototype === Object.prototype || prototype === null;\r\n}\r\n\r\nfunction encodeBinaryPayload(\r\n kind: BinaryPayloadKind,\r\n payloadBuffer: Buffer,\r\n mimeType?: string\r\n): EncodedBinaryPayload {\r\n const encodedPayload: EncodedBinaryPayload = {\r\n [BINARY_PAYLOAD_MARKER]: BINARY_PAYLOAD_VERSION,\r\n kind,\r\n base64: payloadBuffer.toString(\"base64\")\r\n };\r\n\r\n if (mimeType !== undefined && mimeType.length > 0) {\r\n encodedPayload.mimeType = mimeType;\r\n }\r\n\r\n return encodedPayload;\r\n}\r\n\r\nasync function encodeEnvelopeData(value: unknown): Promise<unknown> {\r\n if (Buffer.isBuffer(value)) {\r\n return encodeBinaryPayload(\"buffer\", value);\r\n }\r\n\r\n if (value instanceof Uint8Array) {\r\n const typedArrayBuffer = Buffer.from(value.buffer, value.byteOffset, value.byteLength);\r\n return encodeBinaryPayload(\"uint8array\", typedArrayBuffer);\r\n }\r\n\r\n if (isBlobValue(value)) {\r\n const blobBuffer = Buffer.from(await value.arrayBuffer());\r\n return encodeBinaryPayload(\"blob\", blobBuffer, value.type);\r\n }\r\n\r\n if (Array.isArray(value)) {\r\n return Promise.all(value.map((item) => encodeEnvelopeData(item)));\r\n }\r\n\r\n if (isPlainObject(value)) {\r\n const encodedEntries = await Promise.all(\r\n Object.entries(value).map(async ([key, entryValue]) => {\r\n return [key, await encodeEnvelopeData(entryValue)] as const;\r\n })\r\n );\r\n\r\n return Object.fromEntries(encodedEntries);\r\n }\r\n\r\n return value;\r\n}\r\n\r\nfunction isEncodedBinaryPayload(value: unknown): value is EncodedBinaryPayload {\r\n if (!isPlainObject(value)) {\r\n return false;\r\n }\r\n\r\n if (value[BINARY_PAYLOAD_MARKER] !== BINARY_PAYLOAD_VERSION) {\r\n return false;\r\n }\r\n\r\n if (\r\n value.kind !== \"buffer\" &&\r\n value.kind !== \"uint8array\" &&\r\n value.kind !== \"blob\"\r\n ) {\r\n return false;\r\n }\r\n\r\n if (typeof value.base64 !== \"string\") {\r\n return false;\r\n }\r\n\r\n if (value.mimeType !== undefined && typeof value.mimeType !== \"string\") {\r\n return false;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nfunction decodeEnvelopeData(value: unknown): unknown {\r\n if (Array.isArray(value)) {\r\n return value.map((item) => decodeEnvelopeData(item));\r\n }\r\n\r\n if (isEncodedBinaryPayload(value)) {\r\n const binaryBuffer = Buffer.from(value.base64, \"base64\");\r\n\r\n if (value.kind === \"buffer\") {\r\n return binaryBuffer;\r\n }\r\n\r\n if (value.kind === \"uint8array\") {\r\n return Uint8Array.from(binaryBuffer);\r\n }\r\n\r\n if (typeof Blob === \"undefined\") {\r\n return binaryBuffer;\r\n }\r\n\r\n return new Blob([binaryBuffer], {\r\n type: value.mimeType ?? \"\"\r\n });\r\n }\r\n\r\n if (isPlainObject(value)) {\r\n const decodedEntries = Object.entries(value).map(([key, entryValue]) => {\r\n return [key, decodeEnvelopeData(entryValue)] as const;\r\n });\r\n\r\n return Object.fromEntries(decodedEntries);\r\n }\r\n\r\n return value;\r\n}\r\n\r\nasync function serializeEnvelope(event: string, data: unknown): Promise<string> {\r\n const encodedData = await encodeEnvelopeData(data);\r\n const envelope: SecureEnvelope = { event, data: encodedData };\r\n return JSON.stringify(envelope);\r\n}\r\n\r\nfunction serializePlainEnvelope(event: string, data: unknown): string {\r\n const envelope: SecureEnvelope = { event, data };\r\n return JSON.stringify(envelope);\r\n}\r\n\r\nfunction parseEnvelope(rawData: RawData): SecureEnvelope {\r\n const decoded = decodeRawData(rawData);\r\n const parsed = JSON.parse(decoded) as Partial<SecureEnvelope>;\r\n\r\n if (\r\n typeof parsed !== \"object\" ||\r\n parsed === null ||\r\n typeof parsed.event !== \"string\"\r\n ) {\r\n throw new Error(\"Invalid message format. Expected { event: string, data: unknown }.\");\r\n }\r\n\r\n return {\r\n event: parsed.event,\r\n data: decodeEnvelopeData(parsed.data)\r\n };\r\n}\r\n\r\nfunction parseEnvelopeFromText(decodedPayload: string): SecureEnvelope {\r\n const parsed = JSON.parse(decodedPayload) as Partial<SecureEnvelope>;\r\n\r\n if (\r\n typeof parsed !== \"object\" ||\r\n parsed === null ||\r\n typeof parsed.event !== \"string\"\r\n ) {\r\n throw new Error(\"Invalid message format. Expected { event: string, data: unknown }.\");\r\n }\r\n\r\n return {\r\n event: parsed.event,\r\n data: decodeEnvelopeData(parsed.data)\r\n };\r\n}\r\n\r\nfunction decodeCloseReason(reason: Buffer): string {\r\n return reason.toString(\"utf8\");\r\n}\r\n\r\nfunction isReservedEmitEvent(event: string): boolean {\r\n return (\r\n event === INTERNAL_HANDSHAKE_EVENT ||\r\n event === INTERNAL_RPC_REQUEST_EVENT ||\r\n event === INTERNAL_RPC_RESPONSE_EVENT ||\r\n event === READY_EVENT\r\n );\r\n}\r\n\r\nfunction isPromiseLike(value: unknown): value is PromiseLike<unknown> {\r\n return typeof value === \"object\" && value !== null && \"then\" in value;\r\n}\r\n\r\nfunction normalizeRpcTimeout(timeoutMs: number | undefined): number {\r\n const resolvedTimeoutMs = timeoutMs ?? DEFAULT_RPC_TIMEOUT_MS;\r\n\r\n if (!Number.isFinite(resolvedTimeoutMs) || resolvedTimeoutMs <= 0) {\r\n throw new Error(\"ACK timeoutMs must be a positive number.\");\r\n }\r\n\r\n return resolvedTimeoutMs;\r\n}\r\n\r\nfunction parseRpcRequestPayload(data: unknown): RpcRequestPayload {\r\n if (typeof data !== \"object\" || data === null) {\r\n throw new Error(\"Invalid RPC request payload format.\");\r\n }\r\n\r\n const payload = data as Partial<RpcRequestPayload>;\r\n\r\n if (typeof payload.id !== \"string\" || payload.id.trim().length === 0) {\r\n throw new Error(\"RPC request payload must include a non-empty id.\");\r\n }\r\n\r\n if (typeof payload.event !== \"string\" || payload.event.trim().length === 0) {\r\n throw new Error(\"RPC request payload must include a non-empty event.\");\r\n }\r\n\r\n return {\r\n id: payload.id,\r\n event: payload.event,\r\n data: payload.data\r\n };\r\n}\r\n\r\nfunction parseRpcResponsePayload(data: unknown): RpcResponsePayload {\r\n if (typeof data !== \"object\" || data === null) {\r\n throw new Error(\"Invalid RPC response payload format.\");\r\n }\r\n\r\n const payload = data as Partial<RpcResponsePayload>;\r\n\r\n if (typeof payload.id !== \"string\" || payload.id.trim().length === 0) {\r\n throw new Error(\"RPC response payload must include a non-empty id.\");\r\n }\r\n\r\n if (typeof payload.ok !== \"boolean\") {\r\n throw new Error(\"RPC response payload must include a boolean ok field.\");\r\n }\r\n\r\n if (payload.error !== undefined && typeof payload.error !== \"string\") {\r\n throw new Error(\"RPC response payload error must be a string when provided.\");\r\n }\r\n\r\n const parsedPayload: RpcResponsePayload = {\r\n id: payload.id,\r\n ok: payload.ok,\r\n data: payload.data\r\n };\r\n\r\n if (payload.error !== undefined) {\r\n parsedPayload.error = payload.error;\r\n }\r\n\r\n return parsedPayload;\r\n}\r\n\r\nfunction resolveAckArguments(\r\n callbackOrOptions?: SecureAckCallback | SecureAckOptions,\r\n maybeCallback?: SecureAckCallback\r\n): {\r\n expectsAck: boolean;\r\n callback?: SecureAckCallback;\r\n timeoutMs: number;\r\n} {\r\n if (callbackOrOptions === undefined && maybeCallback === undefined) {\r\n return {\r\n expectsAck: false,\r\n timeoutMs: DEFAULT_RPC_TIMEOUT_MS\r\n };\r\n }\r\n\r\n if (typeof callbackOrOptions === \"function\") {\r\n if (maybeCallback !== undefined) {\r\n throw new Error(\"ACK callback was provided more than once.\");\r\n }\r\n\r\n return {\r\n expectsAck: true,\r\n callback: callbackOrOptions,\r\n timeoutMs: DEFAULT_RPC_TIMEOUT_MS\r\n };\r\n }\r\n\r\n const options = callbackOrOptions;\r\n\r\n if (options !== undefined && (typeof options !== \"object\" || options === null)) {\r\n throw new Error(\"ACK options must be an object.\");\r\n }\r\n\r\n if (maybeCallback !== undefined && typeof maybeCallback !== \"function\") {\r\n throw new Error(\"ACK callback must be a function.\");\r\n }\r\n\r\n return {\r\n ...(maybeCallback ? { callback: maybeCallback } : {}),\r\n expectsAck: true,\r\n timeoutMs: normalizeRpcTimeout(options?.timeoutMs)\r\n };\r\n}\r\n\r\nfunction createEphemeralHandshakeState(): { ecdh: ECDH; localPublicKey: string } {\r\n const ecdh = createECDH(HANDSHAKE_CURVE);\r\n ecdh.generateKeys();\r\n\r\n return {\r\n ecdh,\r\n localPublicKey: ecdh.getPublicKey(\"base64\")\r\n };\r\n}\r\n\r\nfunction parseHandshakePayload(data: unknown): HandshakePayload {\r\n if (typeof data !== \"object\" || data === null) {\r\n throw new Error(\"Invalid handshake payload format.\");\r\n }\r\n\r\n const payload = data as Partial<HandshakePayload>;\r\n\r\n if (typeof payload.publicKey !== \"string\" || payload.publicKey.length === 0) {\r\n throw new Error(\"Handshake payload must include a non-empty public key.\");\r\n }\r\n\r\n return {\r\n publicKey: payload.publicKey\r\n };\r\n}\r\n\r\nfunction deriveEncryptionKey(sharedSecret: Buffer): Buffer {\r\n const derivedKey = createHash(\"sha256\").update(sharedSecret).digest();\r\n\r\n if (derivedKey.length !== ENCRYPTION_KEY_LENGTH) {\r\n throw new Error(\"Failed to derive a valid AES-256 key.\");\r\n }\r\n\r\n return derivedKey;\r\n}\r\n\r\nfunction encryptSerializedEnvelope(serializedEnvelope: string, encryptionKey: Buffer): Buffer {\r\n const iv = randomBytes(GCM_IV_LENGTH);\r\n const cipher = createCipheriv(ENCRYPTION_ALGORITHM, encryptionKey, iv);\r\n const ciphertext = Buffer.concat([\r\n cipher.update(serializedEnvelope, \"utf8\"),\r\n cipher.final()\r\n ]);\r\n const authTag = cipher.getAuthTag();\r\n\r\n return Buffer.concat([\r\n Buffer.from([ENCRYPTED_PACKET_VERSION]),\r\n iv,\r\n authTag,\r\n ciphertext\r\n ]);\r\n}\r\n\r\nfunction parseEncryptedPacket(rawData: RawData): EncryptedPacketParts {\r\n const packetBuffer = rawDataToBuffer(rawData);\r\n\r\n if (packetBuffer.length <= ENCRYPTED_PACKET_PREFIX_LENGTH) {\r\n throw new Error(\"Encrypted packet is too short.\");\r\n }\r\n\r\n const version = packetBuffer.readUInt8(0);\r\n\r\n if (version !== ENCRYPTED_PACKET_VERSION) {\r\n throw new Error(\"Unsupported encrypted packet version.\");\r\n }\r\n\r\n const ivStart = 1;\r\n const ivEnd = ivStart + GCM_IV_LENGTH;\r\n const authTagStart = ivEnd;\r\n const authTagEnd = authTagStart + GCM_AUTH_TAG_LENGTH;\r\n\r\n const iv = packetBuffer.subarray(ivStart, ivEnd);\r\n const authTag = packetBuffer.subarray(authTagStart, authTagEnd);\r\n const ciphertext = packetBuffer.subarray(authTagEnd);\r\n\r\n if (ciphertext.length === 0) {\r\n throw new Error(\"Encrypted payload is empty.\");\r\n }\r\n\r\n return {\r\n iv,\r\n authTag,\r\n ciphertext\r\n };\r\n}\r\n\r\nfunction decryptSerializedEnvelope(rawData: RawData, encryptionKey: Buffer): string {\r\n const encryptedPacket = parseEncryptedPacket(rawData);\r\n const decipher = createDecipheriv(\r\n ENCRYPTION_ALGORITHM,\r\n encryptionKey,\r\n encryptedPacket.iv\r\n );\r\n\r\n decipher.setAuthTag(encryptedPacket.authTag);\r\n\r\n const plaintext = Buffer.concat([\r\n decipher.update(encryptedPacket.ciphertext),\r\n decipher.final()\r\n ]);\r\n\r\n return plaintext.toString(\"utf8\");\r\n}\r\n\r\nexport class SecureServer {\r\n private readonly instanceId = randomUUID();\r\n\r\n private readonly socketServer: WebSocketServer;\r\n\r\n private adapter: SecureServerAdapter | null = null;\r\n\r\n private readonly heartbeatConfig: Required<SecureServerHeartbeatOptions>;\r\n\r\n private readonly rateLimitConfig: Required<SecureServerRateLimitOptions>;\r\n\r\n private heartbeatIntervalHandle: ReturnType<typeof setInterval> | null = null;\r\n\r\n private readonly clientsById = new Map<string, SecureServerClient>();\r\n\r\n private readonly clientIdBySocket = new Map<WebSocket, string>();\r\n\r\n private readonly customEventHandlers = new Map<string, Set<SecureServerEventHandler>>();\r\n\r\n private readonly connectionHandlers = new Set<SecureServerConnectionHandler>();\r\n\r\n private readonly disconnectHandlers = new Set<SecureServerDisconnectHandler>();\r\n\r\n private readonly readyHandlers = new Set<SecureServerReadyHandler>();\r\n\r\n private readonly errorHandlers = new Set<SecureErrorHandler>();\r\n\r\n private readonly middlewareHandlers: SecureServerMiddleware[] = [];\r\n\r\n private readonly handshakeStateBySocket = new WeakMap<WebSocket, ServerHandshakeState>();\r\n\r\n private readonly middlewareMetadataBySocket = new WeakMap<\r\n WebSocket,\r\n Map<string, unknown>\r\n >();\r\n\r\n private readonly sharedSecretBySocket = new WeakMap<WebSocket, Buffer>();\r\n\r\n private readonly encryptionKeyBySocket = new WeakMap<WebSocket, Buffer>();\r\n\r\n private readonly pendingPayloadsBySocket = new WeakMap<WebSocket, SecureEnvelope[]>();\r\n\r\n private readonly pendingRpcRequestsBySocket = new WeakMap<\r\n WebSocket,\r\n Map<string, PendingRpcRequest>\r\n >();\r\n\r\n private readonly heartbeatStateBySocket = new WeakMap<\r\n WebSocket,\r\n { awaitingPong: boolean; lastPingAt: number }\r\n >();\r\n\r\n private readonly roomMembersByName = new Map<string, Set<string>>();\r\n\r\n private readonly roomNamesByClientId = new Map<string, Set<string>>();\r\n\r\n private readonly clientIpByClientId = new Map<string, string>();\r\n\r\n private readonly rateLimitBucketsByClientId = new Map<\r\n string,\r\n SecureServerRateLimitBucket\r\n >();\r\n\r\n private readonly rateLimitBucketsByIp = new Map<\r\n string,\r\n SecureServerRateLimitBucket\r\n >();\r\n\r\n public constructor(options: SecureServerOptions) {\r\n const { heartbeat, rateLimit, adapter, ...socketServerOptions } = options;\r\n\r\n this.heartbeatConfig = this.resolveHeartbeatConfig(heartbeat);\r\n this.rateLimitConfig = this.resolveRateLimitConfig(rateLimit);\r\n this.socketServer = new WebSocketServer(socketServerOptions);\r\n this.bindSocketServerEvents();\r\n this.startHeartbeatLoop();\r\n\r\n if (adapter) {\r\n void this.setAdapter(adapter).catch(() => {\r\n return undefined;\r\n });\r\n }\r\n }\r\n\r\n public get clientCount(): number {\r\n return this.clientsById.size;\r\n }\r\n\r\n public get serverId(): string {\r\n return this.instanceId;\r\n }\r\n\r\n public get clients(): ReadonlyMap<string, SecureServerClient> {\r\n return this.clientsById;\r\n }\r\n\r\n public async setAdapter(adapter: SecureServerAdapter | null): Promise<void> {\r\n const previousAdapter = this.adapter;\r\n\r\n if (previousAdapter === adapter) {\r\n return;\r\n }\r\n\r\n try {\r\n if (previousAdapter?.detach) {\r\n await Promise.resolve(previousAdapter.detach(this));\r\n }\r\n\r\n this.adapter = null;\r\n\r\n if (!adapter) {\r\n return;\r\n }\r\n\r\n await Promise.resolve(adapter.attach(this));\r\n this.adapter = adapter;\r\n } catch (error) {\r\n const normalizedError = normalizeToError(\r\n error,\r\n \"Failed to set SecureServer adapter.\"\r\n );\r\n\r\n this.notifyError(normalizedError);\r\n throw normalizedError;\r\n }\r\n }\r\n\r\n public async handleAdapterMessage(message: unknown): Promise<void> {\r\n try {\r\n const normalizedMessage = normalizeSecureServerAdapterMessage(message);\r\n\r\n if (normalizedMessage.originServerId === this.instanceId) {\r\n return;\r\n }\r\n\r\n if (normalizedMessage.scope === \"broadcast\") {\r\n this.emitLocally(normalizedMessage.event, normalizedMessage.data);\r\n return;\r\n }\r\n\r\n if (!normalizedMessage.room) {\r\n return;\r\n }\r\n\r\n this.emitToRoom(\r\n normalizedMessage.room,\r\n normalizedMessage.event,\r\n normalizedMessage.data,\r\n false\r\n );\r\n } catch (error) {\r\n this.notifyError(\r\n normalizeToError(error, \"Failed to process SecureServer adapter message.\")\r\n );\r\n }\r\n }\r\n\r\n public on(event: \"connection\", handler: SecureServerConnectionHandler): this;\r\n public on(event: \"disconnect\", handler: SecureServerDisconnectHandler): this;\r\n public on(event: \"ready\", handler: SecureServerReadyHandler): this;\r\n public on(event: \"error\", handler: SecureErrorHandler): this;\r\n public on(event: string, handler: SecureServerEventHandler): this;\r\n public on(event: string, handler: unknown): this {\r\n try {\r\n if (event === \"connection\") {\r\n this.connectionHandlers.add(handler as SecureServerConnectionHandler);\r\n return this;\r\n }\r\n\r\n if (event === \"disconnect\") {\r\n this.disconnectHandlers.add(handler as SecureServerDisconnectHandler);\r\n return this;\r\n }\r\n\r\n if (event === READY_EVENT) {\r\n this.readyHandlers.add(handler as SecureServerReadyHandler);\r\n return this;\r\n }\r\n\r\n if (event === \"error\") {\r\n this.errorHandlers.add(handler as SecureErrorHandler);\r\n return this;\r\n }\r\n\r\n if (event === INTERNAL_HANDSHAKE_EVENT) {\r\n throw new Error(`The event \"${INTERNAL_HANDSHAKE_EVENT}\" is reserved for internal use.`);\r\n }\r\n\r\n const typedHandler = handler as SecureServerEventHandler;\r\n const listeners = this.customEventHandlers.get(event) ?? new Set<SecureServerEventHandler>();\r\n listeners.add(typedHandler);\r\n this.customEventHandlers.set(event, listeners);\r\n } catch (error) {\r\n this.notifyError(\r\n normalizeToError(error, \"Failed to register server event handler.\")\r\n );\r\n }\r\n\r\n return this;\r\n }\r\n\r\n public off(event: \"connection\", handler: SecureServerConnectionHandler): this;\r\n public off(event: \"disconnect\", handler: SecureServerDisconnectHandler): this;\r\n public off(event: \"ready\", handler: SecureServerReadyHandler): this;\r\n public off(event: \"error\", handler: SecureErrorHandler): this;\r\n public off(event: string, handler: SecureServerEventHandler): this;\r\n public off(event: string, handler: unknown): this {\r\n try {\r\n if (event === \"connection\") {\r\n this.connectionHandlers.delete(handler as SecureServerConnectionHandler);\r\n return this;\r\n }\r\n\r\n if (event === \"disconnect\") {\r\n this.disconnectHandlers.delete(handler as SecureServerDisconnectHandler);\r\n return this;\r\n }\r\n\r\n if (event === READY_EVENT) {\r\n this.readyHandlers.delete(handler as SecureServerReadyHandler);\r\n return this;\r\n }\r\n\r\n if (event === \"error\") {\r\n this.errorHandlers.delete(handler as SecureErrorHandler);\r\n return this;\r\n }\r\n\r\n if (event === INTERNAL_HANDSHAKE_EVENT) {\r\n return this;\r\n }\r\n\r\n const listeners = this.customEventHandlers.get(event);\r\n\r\n if (!listeners) {\r\n return this;\r\n }\r\n\r\n listeners.delete(handler as SecureServerEventHandler);\r\n\r\n if (listeners.size === 0) {\r\n this.customEventHandlers.delete(event);\r\n }\r\n } catch (error) {\r\n this.notifyError(\r\n normalizeToError(error, \"Failed to remove server event handler.\")\r\n );\r\n }\r\n\r\n return this;\r\n }\r\n\r\n public use(middleware: SecureServerMiddleware): this {\r\n try {\r\n if (typeof middleware !== \"function\") {\r\n throw new Error(\"Server middleware must be a function.\");\r\n }\r\n\r\n this.middlewareHandlers.push(middleware);\r\n } catch (error) {\r\n this.notifyError(\r\n normalizeToError(error, \"Failed to register server middleware.\")\r\n );\r\n }\r\n\r\n return this;\r\n }\r\n\r\n public emit(event: string, data: unknown): this {\r\n try {\r\n if (isReservedEmitEvent(event)) {\r\n throw new Error(`The event \"${event}\" is reserved and cannot be emitted manually.`);\r\n }\r\n\r\n this.emitLocally(event, data);\r\n this.publishAdapterMessage({\r\n scope: \"broadcast\",\r\n event,\r\n data\r\n });\r\n } catch (error) {\r\n this.notifyError(normalizeToError(error, \"Failed to emit server event.\"));\r\n }\r\n\r\n return this;\r\n }\r\n\r\n public emitTo(clientId: string, event: string, data: unknown): boolean;\r\n public emitTo(\r\n clientId: string,\r\n event: string,\r\n data: unknown,\r\n callback: SecureAckCallback\r\n ): boolean;\r\n public emitTo(\r\n clientId: string,\r\n event: string,\r\n data: unknown,\r\n options: SecureAckOptions\r\n ): Promise<unknown>;\r\n public emitTo(\r\n clientId: string,\r\n event: string,\r\n data: unknown,\r\n options: SecureAckOptions,\r\n callback: SecureAckCallback\r\n ): boolean;\r\n public emitTo(\r\n clientId: string,\r\n event: string,\r\n data: unknown,\r\n callbackOrOptions?: SecureAckCallback | SecureAckOptions,\r\n maybeCallback?: SecureAckCallback\r\n ): boolean | Promise<unknown> {\r\n const ackArgs = resolveAckArguments(callbackOrOptions, maybeCallback);\r\n\r\n try {\r\n if (isReservedEmitEvent(event)) {\r\n throw new Error(`The event \"${event}\" is reserved and cannot be emitted manually.`);\r\n }\r\n\r\n const client = this.clientsById.get(clientId);\r\n\r\n if (!client) {\r\n throw new Error(`Client with id ${clientId} was not found.`);\r\n }\r\n\r\n if (!ackArgs.expectsAck) {\r\n void this.sendOrQueuePayload(client.socket, { event, data }).catch(() => {\r\n return undefined;\r\n });\r\n return true;\r\n }\r\n\r\n const ackPromise = this.sendRpcRequest(\r\n client.socket,\r\n event,\r\n data,\r\n ackArgs.timeoutMs\r\n );\r\n\r\n if (ackArgs.callback) {\r\n ackPromise\r\n .then((response) => {\r\n ackArgs.callback?.(null, response);\r\n })\r\n .catch((error) => {\r\n ackArgs.callback?.(\r\n normalizeToError(error, `ACK callback failed for client ${client.id}.`)\r\n );\r\n });\r\n\r\n return true;\r\n }\r\n\r\n return ackPromise;\r\n } catch (error) {\r\n const normalizedError = normalizeToError(error, \"Failed to emit event to client.\");\r\n this.notifyError(normalizedError);\r\n\r\n if (ackArgs.callback) {\r\n ackArgs.callback(normalizedError);\r\n return false;\r\n }\r\n\r\n if (ackArgs.expectsAck) {\r\n return Promise.reject(normalizedError);\r\n }\r\n\r\n return false;\r\n }\r\n }\r\n\r\n public to(room: string): SecureServerRoomOperator {\r\n const normalizedRoom = this.normalizeRoomName(room);\r\n\r\n return {\r\n emit: (event: string, data: unknown): SecureServer => {\r\n try {\r\n this.emitToRoom(normalizedRoom, event, data, true);\r\n } catch (error) {\r\n this.notifyError(\r\n normalizeToError(error, `Failed to emit event to room ${normalizedRoom}.`)\r\n );\r\n }\r\n\r\n return this;\r\n }\r\n };\r\n }\r\n\r\n public close(\r\n code: number = DEFAULT_CLOSE_CODE,\r\n reason: string = DEFAULT_CLOSE_REASON\r\n ): void {\r\n try {\r\n this.stopHeartbeatLoop();\r\n\r\n const activeAdapter = this.adapter;\r\n this.adapter = null;\r\n\r\n if (activeAdapter?.detach) {\r\n void Promise.resolve(activeAdapter.detach(this)).catch((error) => {\r\n this.notifyError(\r\n normalizeToError(error, \"Failed to detach SecureServer adapter during close.\")\r\n );\r\n });\r\n }\r\n\r\n for (const client of this.clientsById.values()) {\r\n this.rejectPendingRpcRequests(\r\n client.socket,\r\n new Error(\"Server closed before ACK response was received.\")\r\n );\r\n this.middlewareMetadataBySocket.delete(client.socket);\r\n\r\n if (\r\n client.socket.readyState === WebSocket.OPEN ||\r\n client.socket.readyState === WebSocket.CONNECTING\r\n ) {\r\n client.socket.close(code, reason);\r\n }\r\n }\r\n\r\n this.rateLimitBucketsByClientId.clear();\r\n this.rateLimitBucketsByIp.clear();\r\n this.clientIpByClientId.clear();\r\n\r\n this.socketServer.close();\r\n } catch (error) {\r\n this.notifyError(normalizeToError(error, \"Failed to close server.\"));\r\n }\r\n }\r\n\r\n private resolveHeartbeatConfig(\r\n heartbeatOptions: SecureServerHeartbeatOptions | undefined\r\n ): Required<SecureServerHeartbeatOptions> {\r\n const intervalMs = heartbeatOptions?.intervalMs ?? DEFAULT_HEARTBEAT_INTERVAL_MS;\r\n const timeoutMs = heartbeatOptions?.timeoutMs ?? DEFAULT_HEARTBEAT_TIMEOUT_MS;\r\n\r\n if (!Number.isFinite(intervalMs) || intervalMs <= 0) {\r\n throw new Error(\"Server heartbeat intervalMs must be a positive number.\");\r\n }\r\n\r\n if (!Number.isFinite(timeoutMs) || timeoutMs <= 0) {\r\n throw new Error(\"Server heartbeat timeoutMs must be a positive number.\");\r\n }\r\n\r\n return {\r\n enabled: heartbeatOptions?.enabled ?? true,\r\n intervalMs,\r\n timeoutMs\r\n };\r\n }\r\n\r\n private resolveRateLimitConfig(\r\n rateLimitOptions: SecureServerRateLimitOptions | undefined\r\n ): Required<SecureServerRateLimitOptions> {\r\n const windowMs = rateLimitOptions?.windowMs ?? DEFAULT_RATE_LIMIT_WINDOW_MS;\r\n const maxEventsPerConnection =\r\n rateLimitOptions?.maxEventsPerConnection ??\r\n DEFAULT_RATE_LIMIT_MAX_EVENTS_PER_CONNECTION;\r\n const maxEventsPerIp =\r\n rateLimitOptions?.maxEventsPerIp ?? DEFAULT_RATE_LIMIT_MAX_EVENTS_PER_IP;\r\n const action = rateLimitOptions?.action ?? \"throttle\";\r\n const throttleMs = rateLimitOptions?.throttleMs ?? DEFAULT_RATE_LIMIT_THROTTLE_MS;\r\n const maxThrottleMs =\r\n rateLimitOptions?.maxThrottleMs ?? DEFAULT_RATE_LIMIT_MAX_THROTTLE_MS;\r\n const disconnectAfterViolations =\r\n rateLimitOptions?.disconnectAfterViolations ??\r\n DEFAULT_RATE_LIMIT_DISCONNECT_AFTER_VIOLATIONS;\r\n const disconnectCode =\r\n rateLimitOptions?.disconnectCode ?? DEFAULT_RATE_LIMIT_CLOSE_CODE;\r\n const disconnectReason =\r\n rateLimitOptions?.disconnectReason ?? DEFAULT_RATE_LIMIT_CLOSE_REASON;\r\n\r\n if (!Number.isFinite(windowMs) || windowMs <= 0) {\r\n throw new Error(\"Server rateLimit windowMs must be a positive number.\");\r\n }\r\n\r\n if (!Number.isFinite(maxEventsPerConnection) || maxEventsPerConnection <= 0) {\r\n throw new Error(\r\n \"Server rateLimit maxEventsPerConnection must be a positive number.\"\r\n );\r\n }\r\n\r\n if (!Number.isFinite(maxEventsPerIp) || maxEventsPerIp <= 0) {\r\n throw new Error(\"Server rateLimit maxEventsPerIp must be a positive number.\");\r\n }\r\n\r\n if (action !== \"throttle\" && action !== \"disconnect\") {\r\n throw new Error('Server rateLimit action must be either \"throttle\" or \"disconnect\".');\r\n }\r\n\r\n if (!Number.isFinite(throttleMs) || throttleMs <= 0) {\r\n throw new Error(\"Server rateLimit throttleMs must be a positive number.\");\r\n }\r\n\r\n if (!Number.isFinite(maxThrottleMs) || maxThrottleMs <= 0) {\r\n throw new Error(\"Server rateLimit maxThrottleMs must be a positive number.\");\r\n }\r\n\r\n if (maxThrottleMs < throttleMs) {\r\n throw new Error(\r\n \"Server rateLimit maxThrottleMs must be greater than or equal to throttleMs.\"\r\n );\r\n }\r\n\r\n if (\r\n !Number.isInteger(disconnectAfterViolations) ||\r\n disconnectAfterViolations <= 0\r\n ) {\r\n throw new Error(\r\n \"Server rateLimit disconnectAfterViolations must be a positive integer.\"\r\n );\r\n }\r\n\r\n if (!Number.isInteger(disconnectCode) || disconnectCode < 1000 || disconnectCode > 4999) {\r\n throw new Error(\"Server rateLimit disconnectCode must be a valid WebSocket close code.\");\r\n }\r\n\r\n return {\r\n enabled: rateLimitOptions?.enabled ?? true,\r\n windowMs,\r\n maxEventsPerConnection,\r\n maxEventsPerIp,\r\n action,\r\n throttleMs,\r\n maxThrottleMs,\r\n disconnectAfterViolations,\r\n disconnectCode,\r\n disconnectReason\r\n };\r\n }\r\n\r\n private createRateLimitBucket(now: number): SecureServerRateLimitBucket {\r\n return {\r\n windowStartedAt: now,\r\n count: 0,\r\n violationCount: 0,\r\n throttleUntil: 0,\r\n lastSeenAt: now\r\n };\r\n }\r\n\r\n private getOrCreateRateLimitBucket(\r\n map: Map<string, SecureServerRateLimitBucket>,\r\n key: string,\r\n now: number\r\n ): SecureServerRateLimitBucket {\r\n const existingBucket = map.get(key);\r\n\r\n if (existingBucket) {\r\n return existingBucket;\r\n }\r\n\r\n const bucket = this.createRateLimitBucket(now);\r\n map.set(key, bucket);\r\n return bucket;\r\n }\r\n\r\n private updateRateLimitBucket(bucket: SecureServerRateLimitBucket, now: number): void {\r\n if (now - bucket.windowStartedAt >= this.rateLimitConfig.windowMs) {\r\n bucket.windowStartedAt = now;\r\n bucket.count = 0;\r\n bucket.violationCount = 0;\r\n bucket.throttleUntil = 0;\r\n }\r\n\r\n bucket.count += 1;\r\n bucket.lastSeenAt = now;\r\n }\r\n\r\n private pruneRateLimitBucketMap(\r\n map: Map<string, SecureServerRateLimitBucket>,\r\n now: number,\r\n maxIdleMs: number\r\n ): void {\r\n for (const [key, bucket] of map.entries()) {\r\n if (now - bucket.lastSeenAt >= maxIdleMs) {\r\n map.delete(key);\r\n }\r\n }\r\n }\r\n\r\n private pruneRateLimitBuckets(now: number): void {\r\n const maxIdleMs = this.rateLimitConfig.windowMs * 4;\r\n this.pruneRateLimitBucketMap(this.rateLimitBucketsByClientId, now, maxIdleMs);\r\n this.pruneRateLimitBucketMap(this.rateLimitBucketsByIp, now, maxIdleMs);\r\n }\r\n\r\n private normalizeIpAddress(ipAddress: string): string {\r\n let normalized = ipAddress.trim().toLowerCase();\r\n\r\n if (normalized.startsWith(\"::ffff:\")) {\r\n normalized = normalized.slice(7);\r\n }\r\n\r\n if (normalized.startsWith(\"[\") && normalized.endsWith(\"]\")) {\r\n normalized = normalized.slice(1, -1);\r\n }\r\n\r\n const zoneIndex = normalized.indexOf(\"%\");\r\n\r\n if (zoneIndex >= 0) {\r\n normalized = normalized.slice(0, zoneIndex);\r\n }\r\n\r\n return normalized.length > 0 ? normalized : \"unknown\";\r\n }\r\n\r\n private resolveClientIp(request: IncomingMessage): string {\r\n const forwardedHeader = request.headers[\"x-forwarded-for\"];\r\n const forwardedValue = Array.isArray(forwardedHeader)\r\n ? forwardedHeader[0]\r\n : forwardedHeader;\r\n\r\n if (typeof forwardedValue === \"string\") {\r\n const firstForwardedIp = forwardedValue\r\n .split(\",\")\r\n .map((item) => item.trim())\r\n .find((item) => item.length > 0);\r\n\r\n if (firstForwardedIp) {\r\n return this.normalizeIpAddress(firstForwardedIp);\r\n }\r\n }\r\n\r\n return this.normalizeIpAddress(request.socket.remoteAddress ?? \"unknown\");\r\n }\r\n\r\n private isIpStillConnected(ipAddress: string): boolean {\r\n for (const connectedIp of this.clientIpByClientId.values()) {\r\n if (connectedIp === ipAddress) {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private evaluateIncomingRateLimit(\r\n client: SecureServerClient\r\n ): SecureServerRateLimitDecision {\r\n const noLimitDecision: SecureServerRateLimitDecision = {\r\n shouldDisconnect: false,\r\n shouldDrop: false,\r\n throttleDelayMs: 0\r\n };\r\n\r\n if (!this.rateLimitConfig.enabled) {\r\n return noLimitDecision;\r\n }\r\n\r\n const now = Date.now();\r\n const clientBucket = this.getOrCreateRateLimitBucket(\r\n this.rateLimitBucketsByClientId,\r\n client.id,\r\n now\r\n );\r\n\r\n this.updateRateLimitBucket(clientBucket, now);\r\n\r\n const clientIp = this.clientIpByClientId.get(client.id);\r\n const ipBucket = clientIp\r\n ? this.getOrCreateRateLimitBucket(this.rateLimitBucketsByIp, clientIp, now)\r\n : null;\r\n\r\n if (ipBucket) {\r\n this.updateRateLimitBucket(ipBucket, now);\r\n }\r\n\r\n const activeThrottleUntil = Math.max(\r\n clientBucket.throttleUntil,\r\n ipBucket?.throttleUntil ?? 0\r\n );\r\n\r\n if (activeThrottleUntil > now) {\r\n return {\r\n shouldDisconnect: false,\r\n shouldDrop: true,\r\n throttleDelayMs: 0\r\n };\r\n }\r\n\r\n const isConnectionLimitExceeded =\r\n clientBucket.count > this.rateLimitConfig.maxEventsPerConnection;\r\n const isIpLimitExceeded = ipBucket\r\n ? ipBucket.count > this.rateLimitConfig.maxEventsPerIp\r\n : false;\r\n\r\n if (!isConnectionLimitExceeded && !isIpLimitExceeded) {\r\n if (\r\n this.rateLimitBucketsByClientId.size > 1_024 ||\r\n this.rateLimitBucketsByIp.size > 1_024\r\n ) {\r\n this.pruneRateLimitBuckets(now);\r\n }\r\n\r\n return noLimitDecision;\r\n }\r\n\r\n if (isConnectionLimitExceeded) {\r\n clientBucket.violationCount += 1;\r\n }\r\n\r\n if (ipBucket && isIpLimitExceeded) {\r\n ipBucket.violationCount += 1;\r\n }\r\n\r\n const violationCount = Math.max(\r\n clientBucket.violationCount,\r\n ipBucket?.violationCount ?? 0\r\n );\r\n\r\n const shouldDisconnect =\r\n this.rateLimitConfig.action === \"disconnect\" ||\r\n violationCount >= this.rateLimitConfig.disconnectAfterViolations;\r\n\r\n if (shouldDisconnect) {\r\n return {\r\n shouldDisconnect: true,\r\n shouldDrop: true,\r\n throttleDelayMs: 0\r\n };\r\n }\r\n\r\n const throttleDelayMs = Math.min(\r\n this.rateLimitConfig.maxThrottleMs,\r\n Math.max(\r\n this.rateLimitConfig.throttleMs,\r\n this.rateLimitConfig.throttleMs * violationCount\r\n )\r\n );\r\n\r\n const throttleUntil = now + throttleDelayMs;\r\n clientBucket.throttleUntil = throttleUntil;\r\n\r\n if (ipBucket) {\r\n ipBucket.throttleUntil = throttleUntil;\r\n }\r\n\r\n return {\r\n shouldDisconnect: false,\r\n shouldDrop: false,\r\n throttleDelayMs\r\n };\r\n }\r\n\r\n private startHeartbeatLoop(): void {\r\n if (!this.heartbeatConfig.enabled || this.heartbeatIntervalHandle) {\r\n return;\r\n }\r\n\r\n this.heartbeatIntervalHandle = setInterval(() => {\r\n this.performHeartbeatSweep();\r\n }, this.heartbeatConfig.intervalMs);\r\n\r\n this.heartbeatIntervalHandle.unref?.();\r\n }\r\n\r\n private stopHeartbeatLoop(): void {\r\n if (!this.heartbeatIntervalHandle) {\r\n return;\r\n }\r\n\r\n clearInterval(this.heartbeatIntervalHandle);\r\n this.heartbeatIntervalHandle = null;\r\n }\r\n\r\n private performHeartbeatSweep(): void {\r\n const now = Date.now();\r\n\r\n for (const client of this.clientsById.values()) {\r\n const socket = client.socket;\r\n\r\n if (socket.readyState !== WebSocket.OPEN) {\r\n continue;\r\n }\r\n\r\n const heartbeatState = this.heartbeatStateBySocket.get(socket) ?? {\r\n awaitingPong: false,\r\n lastPingAt: 0\r\n };\r\n\r\n if (\r\n heartbeatState.awaitingPong &&\r\n now - heartbeatState.lastPingAt >= this.heartbeatConfig.timeoutMs\r\n ) {\r\n this.rejectPendingRpcRequests(\r\n socket,\r\n new Error(`Heartbeat timeout while waiting for client ${client.id} ACK response.`)\r\n );\r\n this.sharedSecretBySocket.delete(socket);\r\n this.encryptionKeyBySocket.delete(socket);\r\n this.pendingPayloadsBySocket.delete(socket);\r\n this.pendingRpcRequestsBySocket.delete(socket);\r\n this.handshakeStateBySocket.delete(socket);\r\n this.heartbeatStateBySocket.delete(socket);\r\n this.middlewareMetadataBySocket.delete(socket);\r\n socket.terminate();\r\n continue;\r\n }\r\n\r\n if (heartbeatState.awaitingPong) {\r\n continue;\r\n }\r\n\r\n heartbeatState.awaitingPong = true;\r\n heartbeatState.lastPingAt = now;\r\n this.heartbeatStateBySocket.set(socket, heartbeatState);\r\n\r\n try {\r\n socket.ping();\r\n } catch (error) {\r\n this.notifyError(\r\n normalizeToError(error, `Failed to send heartbeat ping to client ${client.id}.`)\r\n );\r\n }\r\n }\r\n }\r\n\r\n private handleHeartbeatPong(socket: WebSocket): void {\r\n const heartbeatState = this.heartbeatStateBySocket.get(socket);\r\n\r\n if (!heartbeatState) {\r\n return;\r\n }\r\n\r\n heartbeatState.awaitingPong = false;\r\n heartbeatState.lastPingAt = 0;\r\n this.heartbeatStateBySocket.set(socket, heartbeatState);\r\n }\r\n\r\n private bindSocketServerEvents(): void {\r\n this.socketServer.on(\"connection\", (socket: WebSocket, request: IncomingMessage) => {\r\n void this.handleConnection(socket, request);\r\n });\r\n\r\n this.socketServer.on(\"error\", (error: Error) => {\r\n this.notifyError(normalizeToError(error, \"WebSocket server encountered an error.\"));\r\n });\r\n }\r\n\r\n private async handleConnection(socket: WebSocket, request: IncomingMessage): Promise<void> {\r\n const connectionMetadata = new Map<string, unknown>();\r\n this.middlewareMetadataBySocket.set(socket, connectionMetadata);\r\n\r\n try {\r\n await this.executeServerMiddleware({\r\n phase: \"connection\",\r\n socket,\r\n request,\r\n metadata: connectionMetadata\r\n });\r\n } catch (error) {\r\n const normalizedError = normalizeToError(\r\n error,\r\n \"Connection middleware rejected the incoming socket.\"\r\n );\r\n\r\n this.notifyError(normalizedError);\r\n this.middlewareMetadataBySocket.delete(socket);\r\n\r\n if (\r\n socket.readyState === WebSocket.OPEN ||\r\n socket.readyState === WebSocket.CONNECTING\r\n ) {\r\n socket.close(\r\n POLICY_VIOLATION_CLOSE_CODE,\r\n normalizedError.message || POLICY_VIOLATION_CLOSE_REASON\r\n );\r\n }\r\n\r\n return;\r\n }\r\n\r\n try {\r\n const clientId = randomUUID();\r\n const handshakeState = this.createServerHandshakeState();\r\n const clientIp = this.resolveClientIp(request);\r\n\r\n connectionMetadata.set(\"network.ip\", clientIp);\r\n\r\n const client = this.createSecureServerClient(\r\n clientId,\r\n socket,\r\n request,\r\n connectionMetadata\r\n );\r\n\r\n this.clientsById.set(clientId, client);\r\n this.clientIdBySocket.set(socket, clientId);\r\n this.clientIpByClientId.set(clientId, clientIp);\r\n this.handshakeStateBySocket.set(socket, handshakeState);\r\n this.pendingPayloadsBySocket.set(socket, []);\r\n this.pendingRpcRequestsBySocket.set(socket, new Map<string, PendingRpcRequest>());\r\n this.heartbeatStateBySocket.set(socket, {\r\n awaitingPong: false,\r\n lastPingAt: 0\r\n });\r\n this.roomNamesByClientId.set(clientId, new Set<string>());\r\n\r\n socket.on(\"message\", (rawData: RawData) => {\r\n void this.handleIncomingMessage(client, rawData);\r\n });\r\n\r\n socket.on(\"close\", (code: number, reason: Buffer) => {\r\n this.handleDisconnection(client, code, reason);\r\n });\r\n\r\n socket.on(\"pong\", () => {\r\n this.handleHeartbeatPong(client.socket);\r\n });\r\n\r\n socket.on(\"error\", (error: Error) => {\r\n this.notifyError(\r\n normalizeToError(\r\n error,\r\n `Client socket error detected for client ${client.id}.`\r\n )\r\n );\r\n });\r\n\r\n this.sendInternalHandshake(socket, handshakeState.localPublicKey);\r\n this.notifyConnection(client);\r\n } catch (error) {\r\n this.notifyError(normalizeToError(error, \"Failed to handle client connection.\"));\r\n this.middlewareMetadataBySocket.delete(socket);\r\n }\r\n }\r\n\r\n private async handleIncomingMessage(\r\n client: SecureServerClient,\r\n rawData: RawData\r\n ): Promise<void> {\r\n try {\r\n const rateLimitDecision = this.evaluateIncomingRateLimit(client);\r\n\r\n if (rateLimitDecision.shouldDisconnect) {\r\n this.notifyError(\r\n new Error(\r\n `Rate limit disconnect triggered for client ${client.id}.`\r\n )\r\n );\r\n\r\n if (\r\n client.socket.readyState === WebSocket.OPEN ||\r\n client.socket.readyState === WebSocket.CONNECTING\r\n ) {\r\n client.socket.close(\r\n this.rateLimitConfig.disconnectCode,\r\n this.rateLimitConfig.disconnectReason\r\n );\r\n }\r\n\r\n return;\r\n }\r\n\r\n if (rateLimitDecision.shouldDrop) {\r\n return;\r\n }\r\n\r\n if (rateLimitDecision.throttleDelayMs > 0) {\r\n this.notifyError(\r\n new Error(\r\n `Rate limit throttle applied to client ${client.id} for ${rateLimitDecision.throttleDelayMs}ms.`\r\n )\r\n );\r\n\r\n await delay(rateLimitDecision.throttleDelayMs);\r\n\r\n if (client.socket.readyState !== WebSocket.OPEN) {\r\n return;\r\n }\r\n }\r\n\r\n let envelope: SecureEnvelope | null = null;\r\n\r\n try {\r\n envelope = parseEnvelope(rawData);\r\n } catch {\r\n envelope = null;\r\n }\r\n\r\n if (envelope?.event === INTERNAL_HANDSHAKE_EVENT) {\r\n this.handleInternalHandshake(client, envelope.data);\r\n return;\r\n }\r\n\r\n if (envelope !== null) {\r\n this.notifyError(\r\n new Error(\r\n `Plaintext event \"${envelope.event}\" was rejected for client ${client.id}.`\r\n )\r\n );\r\n return;\r\n }\r\n\r\n if (!this.isClientHandshakeReady(client.socket)) {\r\n this.notifyError(\r\n new Error(`Encrypted payload was received before handshake completion for client ${client.id}.`)\r\n );\r\n return;\r\n }\r\n\r\n const encryptionKey = this.encryptionKeyBySocket.get(client.socket);\r\n\r\n if (!encryptionKey) {\r\n this.notifyError(new Error(`Missing encryption key for client ${client.id}.`));\r\n return;\r\n }\r\n\r\n let decryptedPayload: string;\r\n\r\n try {\r\n decryptedPayload = decryptSerializedEnvelope(rawData, encryptionKey);\r\n } catch {\r\n console.warn(\"Tampered data detected and dropped\");\r\n return;\r\n }\r\n\r\n const decryptedEnvelope = parseEnvelopeFromText(decryptedPayload);\r\n\r\n if (decryptedEnvelope.event === INTERNAL_RPC_RESPONSE_EVENT) {\r\n this.handleRpcResponse(client.socket, decryptedEnvelope.data);\r\n return;\r\n }\r\n\r\n if (decryptedEnvelope.event === INTERNAL_RPC_REQUEST_EVENT) {\r\n await this.handleRpcRequest(client, decryptedEnvelope.data);\r\n return;\r\n }\r\n\r\n const interceptedData = await this.applyMessageMiddleware(\r\n \"incoming\",\r\n client,\r\n decryptedEnvelope.event,\r\n decryptedEnvelope.data\r\n );\r\n\r\n this.dispatchCustomEvent(decryptedEnvelope.event, interceptedData, client);\r\n } catch (error) {\r\n this.notifyError(normalizeToError(error, \"Failed to process incoming server message.\"));\r\n }\r\n }\r\n\r\n private handleDisconnection(client: SecureServerClient, code: number, reason: Buffer): void {\r\n try {\r\n client.leaveAll();\r\n this.clientsById.delete(client.id);\r\n this.clientIdBySocket.delete(client.socket);\r\n\r\n const disconnectedIp = this.clientIpByClientId.get(client.id);\r\n\r\n this.clientIpByClientId.delete(client.id);\r\n this.rateLimitBucketsByClientId.delete(client.id);\r\n\r\n if (disconnectedIp && !this.isIpStillConnected(disconnectedIp)) {\r\n this.rateLimitBucketsByIp.delete(disconnectedIp);\r\n }\r\n\r\n this.handshakeStateBySocket.delete(client.socket);\r\n this.sharedSecretBySocket.delete(client.socket);\r\n this.encryptionKeyBySocket.delete(client.socket);\r\n this.pendingPayloadsBySocket.delete(client.socket);\r\n this.rejectPendingRpcRequests(\r\n client.socket,\r\n new Error(`Client ${client.id} disconnected before ACK response was received.`)\r\n );\r\n this.pendingRpcRequestsBySocket.delete(client.socket);\r\n this.heartbeatStateBySocket.delete(client.socket);\r\n this.middlewareMetadataBySocket.delete(client.socket);\r\n\r\n const decodedReason = decodeCloseReason(reason);\r\n\r\n for (const handler of this.disconnectHandlers) {\r\n try {\r\n handler(client, code, decodedReason);\r\n } catch (handlerError) {\r\n this.notifyError(\r\n normalizeToError(\r\n handlerError,\r\n `Disconnect handler failed for client ${client.id}.`\r\n )\r\n );\r\n }\r\n }\r\n } catch (error) {\r\n this.notifyError(normalizeToError(error, \"Failed to process client disconnection.\"));\r\n }\r\n }\r\n\r\n private dispatchCustomEvent(\r\n event: string,\r\n data: unknown,\r\n client: SecureServerClient\r\n ): void {\r\n const handlers = this.customEventHandlers.get(event);\r\n\r\n if (!handlers || handlers.size === 0) {\r\n return;\r\n }\r\n\r\n for (const handler of handlers) {\r\n try {\r\n const handlerResult = handler(data, client);\r\n\r\n if (isPromiseLike(handlerResult)) {\r\n void Promise.resolve(handlerResult).catch((error) => {\r\n this.notifyError(\r\n normalizeToError(\r\n error,\r\n `Server event handler failed for event ${event}.`\r\n )\r\n );\r\n });\r\n }\r\n } catch (error) {\r\n this.notifyError(\r\n normalizeToError(\r\n error,\r\n `Server event handler failed for event ${event}.`\r\n )\r\n );\r\n }\r\n }\r\n }\r\n\r\n private async executeServerMiddleware(\r\n context: SecureServerMiddlewareContext\r\n ): Promise<void> {\r\n if (this.middlewareHandlers.length === 0) {\r\n return;\r\n }\r\n\r\n let currentIndex = -1;\r\n\r\n const dispatch = async (index: number): Promise<void> => {\r\n if (index <= currentIndex) {\r\n throw new Error(\"Server middleware next() was called multiple times.\");\r\n }\r\n\r\n currentIndex = index;\r\n const middleware = this.middlewareHandlers[index];\r\n\r\n if (!middleware) {\r\n return;\r\n }\r\n\r\n await Promise.resolve(\r\n middleware(context, async () => {\r\n await dispatch(index + 1);\r\n })\r\n );\r\n };\r\n\r\n await dispatch(0);\r\n }\r\n\r\n private async applyMessageMiddleware(\r\n phase: \"incoming\" | \"outgoing\",\r\n client: SecureServerClient,\r\n event: string,\r\n data: unknown\r\n ): Promise<unknown> {\r\n const metadata =\r\n this.middlewareMetadataBySocket.get(client.socket) ?? new Map<string, unknown>();\r\n\r\n this.middlewareMetadataBySocket.set(client.socket, metadata);\r\n\r\n const middlewareContext: SecureServerMessageMiddlewareContext = {\r\n phase,\r\n client,\r\n event,\r\n data,\r\n metadata\r\n };\r\n\r\n await this.executeServerMiddleware(middlewareContext);\r\n return middlewareContext.data;\r\n }\r\n\r\n private resolveClientBySocket(socket: WebSocket): SecureServerClient | null {\r\n const clientId = this.clientIdBySocket.get(socket);\r\n\r\n if (!clientId) {\r\n return null;\r\n }\r\n\r\n return this.clientsById.get(clientId) ?? null;\r\n }\r\n\r\n private sendRaw(socket: WebSocket, payload: string): void {\r\n try {\r\n if (socket.readyState !== WebSocket.OPEN) {\r\n return;\r\n }\r\n\r\n socket.send(payload);\r\n } catch (error) {\r\n this.notifyError(normalizeToError(error, \"Failed to send server payload.\"));\r\n }\r\n }\r\n\r\n private async sendEncryptedEnvelope(socket: WebSocket, envelope: SecureEnvelope): Promise<void> {\r\n if (socket.readyState !== WebSocket.OPEN) {\r\n return;\r\n }\r\n\r\n const encryptionKey = this.encryptionKeyBySocket.get(socket);\r\n\r\n if (!encryptionKey) {\r\n const missingKeyError = new Error(\"Missing encryption key for connected socket.\");\r\n this.notifyError(missingKeyError);\r\n throw missingKeyError;\r\n }\r\n\r\n try {\r\n const serializedEnvelope = await serializeEnvelope(envelope.event, envelope.data);\r\n const encryptedPayload = encryptSerializedEnvelope(serializedEnvelope, encryptionKey);\r\n socket.send(encryptedPayload);\r\n } catch (error) {\r\n const normalizedError = normalizeToError(error, \"Failed to send encrypted server payload.\");\r\n this.notifyError(normalizedError);\r\n throw normalizedError;\r\n }\r\n }\r\n\r\n private sendRpcRequest(\r\n socket: WebSocket,\r\n event: string,\r\n data: unknown,\r\n timeoutMs: number\r\n ): Promise<unknown> {\r\n if (socket.readyState !== WebSocket.OPEN && socket.readyState !== WebSocket.CONNECTING) {\r\n throw new Error(\"Client socket is not connected for ACK request.\");\r\n }\r\n\r\n const pendingRequests =\r\n this.pendingRpcRequestsBySocket.get(socket) ?? new Map<string, PendingRpcRequest>();\r\n this.pendingRpcRequestsBySocket.set(socket, pendingRequests);\r\n\r\n const requestId = randomUUID();\r\n\r\n return new Promise<unknown>((resolve, reject) => {\r\n const timeoutHandle = setTimeout(() => {\r\n pendingRequests.delete(requestId);\r\n reject(new Error(`ACK response timed out after ${timeoutMs}ms for event \"${event}\".`));\r\n }, timeoutMs);\r\n\r\n timeoutHandle.unref?.();\r\n\r\n pendingRequests.set(requestId, {\r\n resolve,\r\n reject,\r\n timeoutHandle\r\n });\r\n\r\n void this.sendOrQueuePayload(socket, {\r\n event: INTERNAL_RPC_REQUEST_EVENT,\r\n data: {\r\n id: requestId,\r\n event,\r\n data\r\n } satisfies RpcRequestPayload\r\n }).catch((error) => {\r\n clearTimeout(timeoutHandle);\r\n pendingRequests.delete(requestId);\r\n reject(\r\n normalizeToError(error, `Failed to dispatch ACK request for event \"${event}\".`)\r\n );\r\n });\r\n });\r\n }\r\n\r\n private handleRpcResponse(socket: WebSocket, data: unknown): void {\r\n try {\r\n const responsePayload = parseRpcResponsePayload(data);\r\n const pendingRequests = this.pendingRpcRequestsBySocket.get(socket);\r\n\r\n if (!pendingRequests) {\r\n return;\r\n }\r\n\r\n const pendingRequest = pendingRequests.get(responsePayload.id);\r\n\r\n if (!pendingRequest) {\r\n return;\r\n }\r\n\r\n clearTimeout(pendingRequest.timeoutHandle);\r\n pendingRequests.delete(responsePayload.id);\r\n\r\n if (responsePayload.ok) {\r\n pendingRequest.resolve(responsePayload.data);\r\n return;\r\n }\r\n\r\n pendingRequest.reject(\r\n new Error(responsePayload.error ?? \"ACK request failed without an error message.\")\r\n );\r\n } catch (error) {\r\n this.notifyError(normalizeToError(error, \"Failed to process server ACK response.\"));\r\n }\r\n }\r\n\r\n private async handleRpcRequest(client: SecureServerClient, data: unknown): Promise<void> {\r\n let rpcRequestPayload: RpcRequestPayload;\r\n\r\n try {\r\n rpcRequestPayload = parseRpcRequestPayload(data);\r\n } catch (error) {\r\n this.notifyError(normalizeToError(error, \"Invalid server ACK request payload.\"));\r\n return;\r\n }\r\n\r\n try {\r\n const interceptedData = await this.applyMessageMiddleware(\r\n \"incoming\",\r\n client,\r\n rpcRequestPayload.event,\r\n rpcRequestPayload.data\r\n );\r\n\r\n const ackResponse = await this.executeRpcRequestHandler(\r\n rpcRequestPayload.event,\r\n interceptedData,\r\n client\r\n );\r\n\r\n await this.sendEncryptedEnvelope(client.socket, {\r\n event: INTERNAL_RPC_RESPONSE_EVENT,\r\n data: {\r\n id: rpcRequestPayload.id,\r\n ok: true,\r\n data: ackResponse\r\n } satisfies RpcResponsePayload\r\n });\r\n } catch (error) {\r\n const normalizedError = normalizeToError(error, \"Server ACK request handler failed.\");\r\n\r\n await this.sendEncryptedEnvelope(client.socket, {\r\n event: INTERNAL_RPC_RESPONSE_EVENT,\r\n data: {\r\n id: rpcRequestPayload.id,\r\n ok: false,\r\n error: normalizedError.message\r\n } satisfies RpcResponsePayload\r\n });\r\n\r\n this.notifyError(normalizedError);\r\n }\r\n }\r\n\r\n private async executeRpcRequestHandler(\r\n event: string,\r\n data: unknown,\r\n client: SecureServerClient\r\n ): Promise<unknown> {\r\n const handlers = this.customEventHandlers.get(event);\r\n\r\n if (!handlers || handlers.size === 0) {\r\n throw new Error(`No handler is registered for ACK request event \"${event}\".`);\r\n }\r\n\r\n const firstHandler = handlers.values().next().value as SecureServerEventHandler;\r\n return Promise.resolve(firstHandler(data, client));\r\n }\r\n\r\n private rejectPendingRpcRequests(socket: WebSocket, error: Error): void {\r\n const pendingRequests = this.pendingRpcRequestsBySocket.get(socket);\r\n\r\n if (!pendingRequests) {\r\n return;\r\n }\r\n\r\n for (const pendingRequest of pendingRequests.values()) {\r\n clearTimeout(pendingRequest.timeoutHandle);\r\n pendingRequest.reject(error);\r\n }\r\n\r\n pendingRequests.clear();\r\n }\r\n\r\n private notifyConnection(client: SecureServerClient): void {\r\n for (const handler of this.connectionHandlers) {\r\n try {\r\n handler(client);\r\n } catch (error) {\r\n this.notifyError(\r\n normalizeToError(error, `Connection handler failed for client ${client.id}.`)\r\n );\r\n }\r\n }\r\n }\r\n\r\n private notifyReady(client: SecureServerClient): void {\r\n for (const handler of this.readyHandlers) {\r\n try {\r\n handler(client);\r\n } catch (error) {\r\n this.notifyError(\r\n normalizeToError(error, `Ready handler failed for client ${client.id}.`)\r\n );\r\n }\r\n }\r\n }\r\n\r\n private notifyError(error: Error): void {\r\n if (this.errorHandlers.size === 0) {\r\n return;\r\n }\r\n\r\n for (const handler of this.errorHandlers) {\r\n try {\r\n handler(error);\r\n } catch {\r\n // Error handlers should not throw into the event loop.\r\n }\r\n }\r\n }\r\n\r\n private createServerHandshakeState(): ServerHandshakeState {\r\n const { ecdh, localPublicKey } = createEphemeralHandshakeState();\r\n\r\n return {\r\n ecdh,\r\n localPublicKey,\r\n isReady: false\r\n };\r\n }\r\n\r\n private sendInternalHandshake(socket: WebSocket, localPublicKey: string): void {\r\n this.sendRaw(\r\n socket,\r\n serializePlainEnvelope(INTERNAL_HANDSHAKE_EVENT, {\r\n publicKey: localPublicKey\r\n })\r\n );\r\n }\r\n\r\n private handleInternalHandshake(client: SecureServerClient, data: unknown): void {\r\n try {\r\n const payload = parseHandshakePayload(data);\r\n const handshakeState = this.handshakeStateBySocket.get(client.socket);\r\n\r\n if (!handshakeState) {\r\n throw new Error(`Missing handshake state for client ${client.id}.`);\r\n }\r\n\r\n if (handshakeState.isReady) {\r\n return;\r\n }\r\n\r\n const remotePublicKey = Buffer.from(payload.publicKey, \"base64\");\r\n const sharedSecret = handshakeState.ecdh.computeSecret(remotePublicKey);\r\n const encryptionKey = deriveEncryptionKey(sharedSecret);\r\n\r\n this.sharedSecretBySocket.set(client.socket, sharedSecret);\r\n this.encryptionKeyBySocket.set(client.socket, encryptionKey);\r\n handshakeState.isReady = true;\r\n\r\n this.flushQueuedPayloads(client.socket);\r\n this.notifyReady(client);\r\n } catch (error) {\r\n this.notifyError(normalizeToError(error, \"Failed to complete server handshake.\"));\r\n }\r\n }\r\n\r\n private isClientHandshakeReady(socket: WebSocket): boolean {\r\n return this.handshakeStateBySocket.get(socket)?.isReady ?? false;\r\n }\r\n\r\n private async sendOrQueuePayload(\r\n socket: WebSocket,\r\n envelope: SecureEnvelope\r\n ): Promise<void> {\r\n let interceptedEnvelope = envelope;\r\n\r\n if (!isReservedEmitEvent(envelope.event)) {\r\n const targetClient = this.resolveClientBySocket(socket);\r\n\r\n if (targetClient) {\r\n const interceptedData = await this.applyMessageMiddleware(\r\n \"outgoing\",\r\n targetClient,\r\n envelope.event,\r\n envelope.data\r\n );\r\n\r\n interceptedEnvelope = {\r\n event: envelope.event,\r\n data: interceptedData\r\n };\r\n }\r\n }\r\n\r\n if (!this.isClientHandshakeReady(socket)) {\r\n this.queuePayload(socket, interceptedEnvelope);\r\n return;\r\n }\r\n\r\n await this.sendEncryptedEnvelope(socket, interceptedEnvelope);\r\n }\r\n\r\n private queuePayload(socket: WebSocket, envelope: SecureEnvelope): void {\r\n const pendingPayloads = this.pendingPayloadsBySocket.get(socket) ?? [];\r\n pendingPayloads.push(envelope);\r\n this.pendingPayloadsBySocket.set(socket, pendingPayloads);\r\n }\r\n\r\n private async flushQueuedPayloads(socket: WebSocket): Promise<void> {\r\n const pendingPayloads = this.pendingPayloadsBySocket.get(socket);\r\n\r\n if (!pendingPayloads || pendingPayloads.length === 0) {\r\n return;\r\n }\r\n\r\n this.pendingPayloadsBySocket.delete(socket);\r\n\r\n for (const envelope of pendingPayloads) {\r\n await this.sendEncryptedEnvelope(socket, envelope);\r\n }\r\n }\r\n\r\n private createSecureServerClient(\r\n clientId: string,\r\n socket: WebSocket,\r\n request: IncomingMessage,\r\n metadata: Map<string, unknown>\r\n ): SecureServerClient {\r\n return {\r\n id: clientId,\r\n socket,\r\n request,\r\n metadata,\r\n emit: (\r\n event: string,\r\n data: unknown,\r\n callbackOrOptions?: SecureAckCallback | SecureAckOptions,\r\n maybeCallback?: SecureAckCallback\r\n ): boolean | Promise<unknown> => {\r\n if (callbackOrOptions === undefined && maybeCallback === undefined) {\r\n return this.emitTo(clientId, event, data);\r\n }\r\n\r\n if (typeof callbackOrOptions === \"function\") {\r\n return this.emitTo(clientId, event, data, callbackOrOptions);\r\n }\r\n\r\n if (maybeCallback) {\r\n return this.emitTo(\r\n clientId,\r\n event,\r\n data,\r\n callbackOrOptions ?? {},\r\n maybeCallback\r\n );\r\n }\r\n\r\n return this.emitTo(clientId, event, data, callbackOrOptions ?? {});\r\n },\r\n join: (room: string): boolean => this.joinClientToRoom(clientId, room),\r\n leave: (room: string): boolean => this.leaveClientFromRoom(clientId, room),\r\n leaveAll: (): number => this.leaveClientFromAllRooms(clientId)\r\n };\r\n }\r\n\r\n private emitLocally(event: string, data: unknown): void {\r\n const envelope: SecureEnvelope = { event, data };\r\n\r\n for (const client of this.clientsById.values()) {\r\n void this.sendOrQueuePayload(client.socket, envelope).catch(() => {\r\n return undefined;\r\n });\r\n }\r\n }\r\n\r\n private publishAdapterMessage(\r\n message: Omit<SecureServerAdapterMessage, \"version\" | \"originServerId\" | \"emittedAt\">\r\n ): void {\r\n if (!this.adapter) {\r\n return;\r\n }\r\n\r\n let adapterMessage: SecureServerAdapterMessage;\r\n\r\n if (message.scope === \"room\") {\r\n if (!message.room) {\r\n return;\r\n }\r\n\r\n adapterMessage = {\r\n version: SECURE_SERVER_ADAPTER_MESSAGE_VERSION,\r\n originServerId: this.instanceId,\r\n scope: \"room\",\r\n event: message.event,\r\n data: message.data,\r\n emittedAt: Date.now(),\r\n room: message.room\r\n };\r\n } else {\r\n adapterMessage = {\r\n version: SECURE_SERVER_ADAPTER_MESSAGE_VERSION,\r\n originServerId: this.instanceId,\r\n scope: \"broadcast\",\r\n event: message.event,\r\n data: message.data,\r\n emittedAt: Date.now()\r\n };\r\n }\r\n\r\n void Promise.resolve(this.adapter.publish(adapterMessage)).catch((error) => {\r\n this.notifyError(\r\n normalizeToError(error, \"Failed to publish SecureServer adapter message.\")\r\n );\r\n });\r\n }\r\n\r\n private normalizeRoomName(room: string): string {\r\n if (typeof room !== \"string\") {\r\n throw new Error(\"Room name must be a string.\");\r\n }\r\n\r\n const normalizedRoom = room.trim();\r\n\r\n if (normalizedRoom.length === 0) {\r\n throw new Error(\"Room name cannot be empty.\");\r\n }\r\n\r\n return normalizedRoom;\r\n }\r\n\r\n private joinClientToRoom(clientId: string, room: string): boolean {\r\n const normalizedRoom = this.normalizeRoomName(room);\r\n\r\n if (!this.clientsById.has(clientId)) {\r\n return false;\r\n }\r\n\r\n const clientRooms = this.roomNamesByClientId.get(clientId) ?? new Set<string>();\r\n\r\n if (clientRooms.has(normalizedRoom)) {\r\n this.roomNamesByClientId.set(clientId, clientRooms);\r\n return false;\r\n }\r\n\r\n clientRooms.add(normalizedRoom);\r\n this.roomNamesByClientId.set(clientId, clientRooms);\r\n\r\n const roomMembers = this.roomMembersByName.get(normalizedRoom) ?? new Set<string>();\r\n roomMembers.add(clientId);\r\n this.roomMembersByName.set(normalizedRoom, roomMembers);\r\n\r\n return true;\r\n }\r\n\r\n private leaveClientFromRoom(clientId: string, room: string): boolean {\r\n const normalizedRoom = this.normalizeRoomName(room);\r\n const clientRooms = this.roomNamesByClientId.get(clientId);\r\n\r\n if (!clientRooms || !clientRooms.delete(normalizedRoom)) {\r\n return false;\r\n }\r\n\r\n if (clientRooms.size === 0) {\r\n this.roomNamesByClientId.delete(clientId);\r\n }\r\n\r\n const roomMembers = this.roomMembersByName.get(normalizedRoom);\r\n\r\n if (roomMembers) {\r\n roomMembers.delete(clientId);\r\n\r\n if (roomMembers.size === 0) {\r\n this.roomMembersByName.delete(normalizedRoom);\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private leaveClientFromAllRooms(clientId: string): number {\r\n const clientRooms = this.roomNamesByClientId.get(clientId);\r\n\r\n if (!clientRooms || clientRooms.size === 0) {\r\n this.roomNamesByClientId.delete(clientId);\r\n return 0;\r\n }\r\n\r\n const roomNames = [...clientRooms];\r\n this.roomNamesByClientId.delete(clientId);\r\n\r\n for (const roomName of roomNames) {\r\n const roomMembers = this.roomMembersByName.get(roomName);\r\n\r\n if (!roomMembers) {\r\n continue;\r\n }\r\n\r\n roomMembers.delete(clientId);\r\n\r\n if (roomMembers.size === 0) {\r\n this.roomMembersByName.delete(roomName);\r\n }\r\n }\r\n\r\n return roomNames.length;\r\n }\r\n\r\n private emitToRoom(\r\n room: string,\r\n event: string,\r\n data: unknown,\r\n replicate: boolean\r\n ): void {\r\n if (isReservedEmitEvent(event)) {\r\n throw new Error(`The event \"${event}\" is reserved and cannot be emitted manually.`);\r\n }\r\n\r\n const roomMembers = this.roomMembersByName.get(room);\r\n\r\n if (roomMembers && roomMembers.size > 0) {\r\n const envelope: SecureEnvelope = { event, data };\r\n\r\n for (const clientId of roomMembers) {\r\n const client = this.clientsById.get(clientId);\r\n\r\n if (!client) {\r\n continue;\r\n }\r\n\r\n void this.sendOrQueuePayload(client.socket, envelope).catch(() => {\r\n return undefined;\r\n });\r\n }\r\n }\r\n\r\n if (replicate) {\r\n this.publishAdapterMessage({\r\n scope: \"room\",\r\n room,\r\n event,\r\n data\r\n });\r\n }\r\n }\r\n}\r\n\r\nexport class SecureClient {\r\n private socket: WebSocket | null = null;\r\n\r\n private readonly reconnectConfig: Required<SecureClientReconnectOptions>;\r\n\r\n private reconnectAttemptCount = 0;\r\n\r\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null;\r\n\r\n private isManualDisconnectRequested = false;\r\n\r\n private readonly customEventHandlers = new Map<string, Set<SecureClientEventHandler>>();\r\n\r\n private readonly connectHandlers = new Set<SecureClientConnectHandler>();\r\n\r\n private readonly disconnectHandlers = new Set<SecureClientDisconnectHandler>();\r\n\r\n private readonly readyHandlers = new Set<SecureClientReadyHandler>();\r\n\r\n private readonly errorHandlers = new Set<SecureErrorHandler>();\r\n\r\n private handshakeState: ClientHandshakeState | null = null;\r\n\r\n private pendingPayloadQueue: SecureEnvelope[] = [];\r\n\r\n private readonly pendingRpcRequests = new Map<string, PendingRpcRequest>();\r\n\r\n public constructor(\r\n private readonly url: string,\r\n private readonly options: SecureClientOptions = {}\r\n ) {\r\n this.reconnectConfig = this.resolveReconnectConfig(this.options.reconnect);\r\n\r\n if (this.options.autoConnect ?? true) {\r\n this.connect();\r\n }\r\n }\r\n\r\n public get readyState(): number | null {\r\n return this.socket?.readyState ?? null;\r\n }\r\n\r\n public isConnected(): boolean {\r\n return this.socket?.readyState === WebSocket.OPEN;\r\n }\r\n\r\n public connect(): void {\r\n try {\r\n if (\r\n this.socket &&\r\n (this.socket.readyState === WebSocket.OPEN ||\r\n this.socket.readyState === WebSocket.CONNECTING)\r\n ) {\r\n return;\r\n }\r\n\r\n this.clearReconnectTimer();\r\n this.isManualDisconnectRequested = false;\r\n\r\n const socket = this.createSocket();\r\n this.socket = socket;\r\n this.handshakeState = this.createClientHandshakeState();\r\n this.pendingPayloadQueue = [];\r\n this.bindSocketEvents(socket);\r\n } catch (error) {\r\n this.notifyError(normalizeToError(error, \"Failed to connect client.\"));\r\n\r\n if (!this.isManualDisconnectRequested) {\r\n this.scheduleReconnect();\r\n }\r\n }\r\n }\r\n\r\n public disconnect(\r\n code: number = DEFAULT_CLOSE_CODE,\r\n reason: string = DEFAULT_CLOSE_REASON\r\n ): void {\r\n try {\r\n this.isManualDisconnectRequested = true;\r\n this.clearReconnectTimer();\r\n\r\n if (!this.socket) {\r\n return;\r\n }\r\n\r\n if (\r\n this.socket.readyState === WebSocket.CLOSING ||\r\n this.socket.readyState === WebSocket.CLOSED\r\n ) {\r\n return;\r\n }\r\n\r\n this.socket.close(code, reason);\r\n } catch (error) {\r\n this.notifyError(normalizeToError(error, \"Failed to disconnect client.\"));\r\n }\r\n }\r\n\r\n public on(event: \"connect\", handler: SecureClientConnectHandler): this;\r\n public on(event: \"disconnect\", handler: SecureClientDisconnectHandler): this;\r\n public on(event: \"ready\", handler: SecureClientReadyHandler): this;\r\n public on(event: \"error\", handler: SecureErrorHandler): this;\r\n public on(event: string, handler: SecureClientEventHandler): this;\r\n public on(event: string, handler: unknown): this {\r\n try {\r\n if (event === \"connect\") {\r\n this.connectHandlers.add(handler as SecureClientConnectHandler);\r\n return this;\r\n }\r\n\r\n if (event === \"disconnect\") {\r\n this.disconnectHandlers.add(handler as SecureClientDisconnectHandler);\r\n return this;\r\n }\r\n\r\n if (event === READY_EVENT) {\r\n this.readyHandlers.add(handler as SecureClientReadyHandler);\r\n return this;\r\n }\r\n\r\n if (event === \"error\") {\r\n this.errorHandlers.add(handler as SecureErrorHandler);\r\n return this;\r\n }\r\n\r\n if (event === INTERNAL_HANDSHAKE_EVENT) {\r\n throw new Error(`The event \"${INTERNAL_HANDSHAKE_EVENT}\" is reserved for internal use.`);\r\n }\r\n\r\n const typedHandler = handler as SecureClientEventHandler;\r\n const listeners = this.customEventHandlers.get(event) ?? new Set<SecureClientEventHandler>();\r\n listeners.add(typedHandler);\r\n this.customEventHandlers.set(event, listeners);\r\n } catch (error) {\r\n this.notifyError(\r\n normalizeToError(error, \"Failed to register client event handler.\")\r\n );\r\n }\r\n\r\n return this;\r\n }\r\n\r\n public off(event: \"connect\", handler: SecureClientConnectHandler): this;\r\n public off(event: \"disconnect\", handler: SecureClientDisconnectHandler): this;\r\n public off(event: \"ready\", handler: SecureClientReadyHandler): this;\r\n public off(event: \"error\", handler: SecureErrorHandler): this;\r\n public off(event: string, handler: SecureClientEventHandler): this;\r\n public off(event: string, handler: unknown): this {\r\n try {\r\n if (event === \"connect\") {\r\n this.connectHandlers.delete(handler as SecureClientConnectHandler);\r\n return this;\r\n }\r\n\r\n if (event === \"disconnect\") {\r\n this.disconnectHandlers.delete(handler as SecureClientDisconnectHandler);\r\n return this;\r\n }\r\n\r\n if (event === READY_EVENT) {\r\n this.readyHandlers.delete(handler as SecureClientReadyHandler);\r\n return this;\r\n }\r\n\r\n if (event === \"error\") {\r\n this.errorHandlers.delete(handler as SecureErrorHandler);\r\n return this;\r\n }\r\n\r\n if (event === INTERNAL_HANDSHAKE_EVENT) {\r\n return this;\r\n }\r\n\r\n const listeners = this.customEventHandlers.get(event);\r\n\r\n if (!listeners) {\r\n return this;\r\n }\r\n\r\n listeners.delete(handler as SecureClientEventHandler);\r\n\r\n if (listeners.size === 0) {\r\n this.customEventHandlers.delete(event);\r\n }\r\n } catch (error) {\r\n this.notifyError(\r\n normalizeToError(error, \"Failed to remove client event handler.\")\r\n );\r\n }\r\n\r\n return this;\r\n }\r\n\r\n public emit(event: string, data: unknown): boolean;\r\n public emit(event: string, data: unknown, callback: SecureAckCallback): boolean;\r\n public emit(event: string, data: unknown, options: SecureAckOptions): Promise<unknown>;\r\n public emit(\r\n event: string,\r\n data: unknown,\r\n options: SecureAckOptions,\r\n callback: SecureAckCallback\r\n ): boolean;\r\n public emit(\r\n event: string,\r\n data: unknown,\r\n callbackOrOptions?: SecureAckCallback | SecureAckOptions,\r\n maybeCallback?: SecureAckCallback\r\n ): boolean | Promise<unknown> {\r\n const ackArgs = resolveAckArguments(callbackOrOptions, maybeCallback);\r\n\r\n try {\r\n if (isReservedEmitEvent(event)) {\r\n throw new Error(`The event \"${event}\" is reserved and cannot be emitted manually.`);\r\n }\r\n\r\n if (!this.socket || this.socket.readyState !== WebSocket.OPEN) {\r\n throw new Error(\"Client socket is not connected.\");\r\n }\r\n\r\n if (ackArgs.expectsAck) {\r\n const ackPromise = this.sendRpcRequest(event, data, ackArgs.timeoutMs);\r\n\r\n if (ackArgs.callback) {\r\n ackPromise\r\n .then((response) => {\r\n ackArgs.callback?.(null, response);\r\n })\r\n .catch((error) => {\r\n ackArgs.callback?.(\r\n normalizeToError(error, `ACK callback failed for event \"${event}\".`)\r\n );\r\n });\r\n\r\n return true;\r\n }\r\n\r\n return ackPromise;\r\n }\r\n\r\n const envelope: SecureEnvelope = { event, data };\r\n\r\n if (!this.isHandshakeReady()) {\r\n this.pendingPayloadQueue.push(envelope);\r\n return true;\r\n }\r\n\r\n void this.sendEncryptedEnvelope(envelope).catch(() => {\r\n return undefined;\r\n });\r\n return true;\r\n } catch (error) {\r\n const normalizedError = normalizeToError(error, \"Failed to emit client event.\");\r\n this.notifyError(normalizedError);\r\n\r\n if (ackArgs.callback) {\r\n ackArgs.callback(normalizedError);\r\n return false;\r\n }\r\n\r\n if (ackArgs.expectsAck) {\r\n return Promise.reject(normalizedError);\r\n }\r\n\r\n return false;\r\n }\r\n }\r\n\r\n private resolveReconnectConfig(\r\n reconnectOptions: boolean | SecureClientReconnectOptions | undefined\r\n ): Required<SecureClientReconnectOptions> {\r\n if (typeof reconnectOptions === \"boolean\") {\r\n return {\r\n enabled: reconnectOptions,\r\n initialDelayMs: DEFAULT_RECONNECT_INITIAL_DELAY_MS,\r\n maxDelayMs: DEFAULT_RECONNECT_MAX_DELAY_MS,\r\n factor: DEFAULT_RECONNECT_FACTOR,\r\n jitterRatio: DEFAULT_RECONNECT_JITTER_RATIO,\r\n maxAttempts: null\r\n };\r\n }\r\n\r\n const initialDelayMs = reconnectOptions?.initialDelayMs ?? DEFAULT_RECONNECT_INITIAL_DELAY_MS;\r\n const maxDelayMs = reconnectOptions?.maxDelayMs ?? DEFAULT_RECONNECT_MAX_DELAY_MS;\r\n const factor = reconnectOptions?.factor ?? DEFAULT_RECONNECT_FACTOR;\r\n const jitterRatio = reconnectOptions?.jitterRatio ?? DEFAULT_RECONNECT_JITTER_RATIO;\r\n const maxAttempts = reconnectOptions?.maxAttempts ?? null;\r\n\r\n if (!Number.isFinite(initialDelayMs) || initialDelayMs < 0) {\r\n throw new Error(\"Client reconnect initialDelayMs must be a non-negative number.\");\r\n }\r\n\r\n if (!Number.isFinite(maxDelayMs) || maxDelayMs < 0) {\r\n throw new Error(\"Client reconnect maxDelayMs must be a non-negative number.\");\r\n }\r\n\r\n if (maxDelayMs < initialDelayMs) {\r\n throw new Error(\"Client reconnect maxDelayMs must be greater than or equal to initialDelayMs.\");\r\n }\r\n\r\n if (!Number.isFinite(factor) || factor < 1) {\r\n throw new Error(\"Client reconnect factor must be greater than or equal to 1.\");\r\n }\r\n\r\n if (!Number.isFinite(jitterRatio) || jitterRatio < 0 || jitterRatio > 1) {\r\n throw new Error(\"Client reconnect jitterRatio must be between 0 and 1.\");\r\n }\r\n\r\n if (\r\n maxAttempts !== null &&\r\n (!Number.isInteger(maxAttempts) || maxAttempts < 0)\r\n ) {\r\n throw new Error(\"Client reconnect maxAttempts must be a non-negative integer or null.\");\r\n }\r\n\r\n return {\r\n enabled: reconnectOptions?.enabled ?? true,\r\n initialDelayMs,\r\n maxDelayMs,\r\n factor,\r\n jitterRatio,\r\n maxAttempts\r\n };\r\n }\r\n\r\n private scheduleReconnect(): void {\r\n if (!this.reconnectConfig.enabled || this.reconnectTimer) {\r\n return;\r\n }\r\n\r\n if (\r\n this.reconnectConfig.maxAttempts !== null &&\r\n this.reconnectAttemptCount >= this.reconnectConfig.maxAttempts\r\n ) {\r\n return;\r\n }\r\n\r\n this.reconnectAttemptCount += 1;\r\n const delayMs = this.computeReconnectDelay(this.reconnectAttemptCount);\r\n\r\n this.reconnectTimer = setTimeout(() => {\r\n this.reconnectTimer = null;\r\n this.connect();\r\n }, delayMs);\r\n\r\n this.reconnectTimer.unref?.();\r\n }\r\n\r\n private computeReconnectDelay(attemptNumber: number): number {\r\n const exponentialDelay = Math.min(\r\n this.reconnectConfig.maxDelayMs,\r\n this.reconnectConfig.initialDelayMs *\r\n Math.pow(this.reconnectConfig.factor, Math.max(0, attemptNumber - 1))\r\n );\r\n\r\n if (this.reconnectConfig.jitterRatio === 0 || exponentialDelay === 0) {\r\n return Math.round(exponentialDelay);\r\n }\r\n\r\n const jitterDelta = exponentialDelay * this.reconnectConfig.jitterRatio;\r\n const jitterOffset = (Math.random() * 2 - 1) * jitterDelta;\r\n\r\n return Math.max(0, Math.round(exponentialDelay + jitterOffset));\r\n }\r\n\r\n private clearReconnectTimer(): void {\r\n if (!this.reconnectTimer) {\r\n return;\r\n }\r\n\r\n clearTimeout(this.reconnectTimer);\r\n this.reconnectTimer = null;\r\n }\r\n\r\n private createSocket(): WebSocket {\r\n if (this.options.protocols !== undefined) {\r\n return new WebSocket(this.url, this.options.protocols, this.options.wsOptions);\r\n }\r\n\r\n if (this.options.wsOptions !== undefined) {\r\n return new WebSocket(this.url, this.options.wsOptions);\r\n }\r\n\r\n return new WebSocket(this.url);\r\n }\r\n\r\n private bindSocketEvents(socket: WebSocket): void {\r\n socket.on(\"open\", () => {\r\n this.clearReconnectTimer();\r\n this.reconnectAttemptCount = 0;\r\n this.sendInternalHandshake();\r\n this.notifyConnect();\r\n });\r\n\r\n socket.on(\"message\", (rawData: RawData) => {\r\n this.handleIncomingMessage(rawData);\r\n });\r\n\r\n socket.on(\"close\", (code: number, reason: Buffer) => {\r\n this.handleDisconnect(code, reason);\r\n });\r\n\r\n socket.on(\"error\", (error: Error) => {\r\n this.notifyError(normalizeToError(error, \"Client socket encountered an error.\"));\r\n });\r\n }\r\n\r\n private handleIncomingMessage(rawData: RawData): void {\r\n try {\r\n let envelope: SecureEnvelope | null = null;\r\n\r\n try {\r\n envelope = parseEnvelope(rawData);\r\n } catch {\r\n envelope = null;\r\n }\r\n\r\n if (envelope?.event === INTERNAL_HANDSHAKE_EVENT) {\r\n this.handleInternalHandshake(envelope.data);\r\n return;\r\n }\r\n\r\n if (envelope !== null) {\r\n this.notifyError(\r\n new Error(`Plaintext event \"${envelope.event}\" was rejected on client.`)\r\n );\r\n return;\r\n }\r\n\r\n if (!this.isHandshakeReady()) {\r\n this.notifyError(new Error(\"Encrypted payload was received before handshake completion.\"));\r\n return;\r\n }\r\n\r\n const encryptionKey = this.handshakeState?.encryptionKey;\r\n\r\n if (!encryptionKey) {\r\n this.notifyError(new Error(\"Missing encryption key for client payload decryption.\"));\r\n return;\r\n }\r\n\r\n let decryptedPayload: string;\r\n\r\n try {\r\n decryptedPayload = decryptSerializedEnvelope(rawData, encryptionKey);\r\n } catch {\r\n console.warn(\"Tampered data detected and dropped\");\r\n return;\r\n }\r\n\r\n const decryptedEnvelope = parseEnvelopeFromText(decryptedPayload);\r\n\r\n if (decryptedEnvelope.event === INTERNAL_RPC_RESPONSE_EVENT) {\r\n this.handleRpcResponse(decryptedEnvelope.data);\r\n return;\r\n }\r\n\r\n if (decryptedEnvelope.event === INTERNAL_RPC_REQUEST_EVENT) {\r\n void this.handleRpcRequest(decryptedEnvelope.data);\r\n return;\r\n }\r\n\r\n this.dispatchCustomEvent(decryptedEnvelope.event, decryptedEnvelope.data);\r\n } catch (error) {\r\n this.notifyError(normalizeToError(error, \"Failed to process incoming client message.\"));\r\n }\r\n }\r\n\r\n private handleDisconnect(code: number, reason: Buffer): void {\r\n try {\r\n this.socket = null;\r\n this.handshakeState = null;\r\n this.pendingPayloadQueue = [];\r\n this.rejectPendingRpcRequests(\r\n new Error(\"Client disconnected before ACK response was received.\")\r\n );\r\n const decodedReason = decodeCloseReason(reason);\r\n\r\n for (const handler of this.disconnectHandlers) {\r\n try {\r\n handler(code, decodedReason);\r\n } catch (handlerError) {\r\n this.notifyError(\r\n normalizeToError(handlerError, \"Client disconnect handler failed.\")\r\n );\r\n }\r\n }\r\n\r\n if (!this.isManualDisconnectRequested) {\r\n this.scheduleReconnect();\r\n }\r\n\r\n this.isManualDisconnectRequested = false;\r\n } catch (error) {\r\n this.notifyError(normalizeToError(error, \"Failed to handle client disconnect.\"));\r\n }\r\n }\r\n\r\n private dispatchCustomEvent(event: string, data: unknown): void {\r\n const handlers = this.customEventHandlers.get(event);\r\n\r\n if (!handlers || handlers.size === 0) {\r\n return;\r\n }\r\n\r\n for (const handler of handlers) {\r\n try {\r\n const handlerResult = handler(data);\r\n\r\n if (isPromiseLike(handlerResult)) {\r\n void Promise.resolve(handlerResult).catch((error) => {\r\n this.notifyError(\r\n normalizeToError(\r\n error,\r\n `Client event handler failed for event ${event}.`\r\n )\r\n );\r\n });\r\n }\r\n } catch (error) {\r\n this.notifyError(\r\n normalizeToError(error, `Client event handler failed for event ${event}.`)\r\n );\r\n }\r\n }\r\n }\r\n\r\n private notifyConnect(): void {\r\n for (const handler of this.connectHandlers) {\r\n try {\r\n handler();\r\n } catch (error) {\r\n this.notifyError(normalizeToError(error, \"Client connect handler failed.\"));\r\n }\r\n }\r\n }\r\n\r\n private notifyReady(): void {\r\n for (const handler of this.readyHandlers) {\r\n try {\r\n handler();\r\n } catch (error) {\r\n this.notifyError(normalizeToError(error, \"Client ready handler failed.\"));\r\n }\r\n }\r\n }\r\n\r\n private notifyError(error: Error): void {\r\n if (this.errorHandlers.size === 0) {\r\n return;\r\n }\r\n\r\n for (const handler of this.errorHandlers) {\r\n try {\r\n handler(error);\r\n } catch {\r\n // Error handlers should not throw into the event loop.\r\n }\r\n }\r\n }\r\n\r\n private async sendEncryptedEnvelope(envelope: SecureEnvelope): Promise<void> {\r\n if (!this.socket || this.socket.readyState !== WebSocket.OPEN) {\r\n const socketStateError = new Error(\"Client socket is not connected.\");\r\n this.notifyError(socketStateError);\r\n throw socketStateError;\r\n }\r\n\r\n const encryptionKey = this.handshakeState?.encryptionKey;\r\n\r\n if (!encryptionKey) {\r\n const missingKeyError = new Error(\"Missing encryption key for client payload encryption.\");\r\n this.notifyError(missingKeyError);\r\n throw missingKeyError;\r\n }\r\n\r\n try {\r\n const serializedEnvelope = await serializeEnvelope(envelope.event, envelope.data);\r\n const encryptedPayload = encryptSerializedEnvelope(serializedEnvelope, encryptionKey);\r\n this.socket.send(encryptedPayload);\r\n } catch (error) {\r\n const normalizedError = normalizeToError(error, \"Failed to send encrypted client payload.\");\r\n this.notifyError(normalizedError);\r\n throw normalizedError;\r\n }\r\n }\r\n\r\n private sendRpcRequest(\r\n event: string,\r\n data: unknown,\r\n timeoutMs: number\r\n ): Promise<unknown> {\r\n if (!this.socket || this.socket.readyState !== WebSocket.OPEN) {\r\n throw new Error(\"Client socket is not connected for ACK request.\");\r\n }\r\n\r\n const requestId = randomUUID();\r\n\r\n return new Promise<unknown>((resolve, reject) => {\r\n const timeoutHandle = setTimeout(() => {\r\n this.pendingRpcRequests.delete(requestId);\r\n reject(new Error(`ACK response timed out after ${timeoutMs}ms for event \"${event}\".`));\r\n }, timeoutMs);\r\n\r\n timeoutHandle.unref?.();\r\n\r\n this.pendingRpcRequests.set(requestId, {\r\n resolve,\r\n reject,\r\n timeoutHandle\r\n });\r\n\r\n const rpcRequestEnvelope: SecureEnvelope<RpcRequestPayload> = {\r\n event: INTERNAL_RPC_REQUEST_EVENT,\r\n data: {\r\n id: requestId,\r\n event,\r\n data\r\n }\r\n };\r\n\r\n if (!this.isHandshakeReady()) {\r\n this.pendingPayloadQueue.push(rpcRequestEnvelope);\r\n return;\r\n }\r\n\r\n void this.sendEncryptedEnvelope(rpcRequestEnvelope).catch((error) => {\r\n clearTimeout(timeoutHandle);\r\n this.pendingRpcRequests.delete(requestId);\r\n reject(\r\n normalizeToError(error, `Failed to dispatch ACK request for event \"${event}\".`)\r\n );\r\n });\r\n });\r\n }\r\n\r\n private handleRpcResponse(data: unknown): void {\r\n try {\r\n const responsePayload = parseRpcResponsePayload(data);\r\n const pendingRequest = this.pendingRpcRequests.get(responsePayload.id);\r\n\r\n if (!pendingRequest) {\r\n return;\r\n }\r\n\r\n clearTimeout(pendingRequest.timeoutHandle);\r\n this.pendingRpcRequests.delete(responsePayload.id);\r\n\r\n if (responsePayload.ok) {\r\n pendingRequest.resolve(responsePayload.data);\r\n return;\r\n }\r\n\r\n pendingRequest.reject(\r\n new Error(responsePayload.error ?? \"ACK request failed without an error message.\")\r\n );\r\n } catch (error) {\r\n this.notifyError(normalizeToError(error, \"Failed to process client ACK response.\"));\r\n }\r\n }\r\n\r\n private async handleRpcRequest(data: unknown): Promise<void> {\r\n let rpcRequestPayload: RpcRequestPayload;\r\n\r\n try {\r\n rpcRequestPayload = parseRpcRequestPayload(data);\r\n } catch (error) {\r\n this.notifyError(normalizeToError(error, \"Invalid client ACK request payload.\"));\r\n return;\r\n }\r\n\r\n try {\r\n const ackResponse = await this.executeRpcRequestHandler(\r\n rpcRequestPayload.event,\r\n rpcRequestPayload.data\r\n );\r\n\r\n await this.sendEncryptedEnvelope({\r\n event: INTERNAL_RPC_RESPONSE_EVENT,\r\n data: {\r\n id: rpcRequestPayload.id,\r\n ok: true,\r\n data: ackResponse\r\n } satisfies RpcResponsePayload\r\n });\r\n } catch (error) {\r\n const normalizedError = normalizeToError(error, \"Client ACK request handler failed.\");\r\n\r\n await this.sendEncryptedEnvelope({\r\n event: INTERNAL_RPC_RESPONSE_EVENT,\r\n data: {\r\n id: rpcRequestPayload.id,\r\n ok: false,\r\n error: normalizedError.message\r\n } satisfies RpcResponsePayload\r\n });\r\n\r\n this.notifyError(normalizedError);\r\n }\r\n }\r\n\r\n private async executeRpcRequestHandler(event: string, data: unknown): Promise<unknown> {\r\n const handlers = this.customEventHandlers.get(event);\r\n\r\n if (!handlers || handlers.size === 0) {\r\n throw new Error(`No handler is registered for ACK request event \"${event}\".`);\r\n }\r\n\r\n const firstHandler = handlers.values().next().value as SecureClientEventHandler;\r\n return Promise.resolve(firstHandler(data));\r\n }\r\n\r\n private rejectPendingRpcRequests(error: Error): void {\r\n for (const pendingRequest of this.pendingRpcRequests.values()) {\r\n clearTimeout(pendingRequest.timeoutHandle);\r\n pendingRequest.reject(error);\r\n }\r\n\r\n this.pendingRpcRequests.clear();\r\n }\r\n\r\n private createClientHandshakeState(): ClientHandshakeState {\r\n const { ecdh, localPublicKey } = createEphemeralHandshakeState();\r\n\r\n return {\r\n ecdh,\r\n localPublicKey,\r\n isReady: false,\r\n sharedSecret: null,\r\n encryptionKey: null\r\n };\r\n }\r\n\r\n private sendInternalHandshake(): void {\r\n try {\r\n if (!this.socket || this.socket.readyState !== WebSocket.OPEN) {\r\n return;\r\n }\r\n\r\n if (!this.handshakeState) {\r\n throw new Error(\"Missing client handshake state.\");\r\n }\r\n\r\n this.socket.send(\r\n serializePlainEnvelope(INTERNAL_HANDSHAKE_EVENT, {\r\n publicKey: this.handshakeState.localPublicKey\r\n })\r\n );\r\n } catch (error) {\r\n this.notifyError(normalizeToError(error, \"Failed to send client handshake payload.\"));\r\n }\r\n }\r\n\r\n private handleInternalHandshake(data: unknown): void {\r\n try {\r\n const payload = parseHandshakePayload(data);\r\n\r\n if (!this.handshakeState) {\r\n throw new Error(\"Missing client handshake state.\");\r\n }\r\n\r\n if (this.handshakeState.isReady) {\r\n return;\r\n }\r\n\r\n const remotePublicKey = Buffer.from(payload.publicKey, \"base64\");\r\n const sharedSecret = this.handshakeState.ecdh.computeSecret(remotePublicKey);\r\n\r\n this.handshakeState.sharedSecret = sharedSecret;\r\n this.handshakeState.encryptionKey = deriveEncryptionKey(sharedSecret);\r\n this.handshakeState.isReady = true;\r\n\r\n void this.flushPendingPayloadQueue();\r\n this.notifyReady();\r\n } catch (error) {\r\n this.notifyError(normalizeToError(error, \"Failed to complete client handshake.\"));\r\n }\r\n }\r\n\r\n private isHandshakeReady(): boolean {\r\n return this.handshakeState?.isReady ?? false;\r\n }\r\n\r\n private async flushPendingPayloadQueue(): Promise<void> {\r\n if (!this.socket || this.socket.readyState !== WebSocket.OPEN || !this.isHandshakeReady()) {\r\n return;\r\n }\r\n\r\n const pendingPayloads = this.pendingPayloadQueue;\r\n this.pendingPayloadQueue = [];\r\n\r\n for (const envelope of pendingPayloads) {\r\n await this.sendEncryptedEnvelope(envelope);\r\n }\r\n }\r\n}\r\n"]}
1
+ {"version":3,"sources":["../src/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import {\r\n createCipheriv,\r\n createDecipheriv,\r\n createECDH,\r\n createHmac,\r\n createHash,\r\n randomBytes,\r\n randomUUID,\r\n timingSafeEqual\r\n} from \"node:crypto\";\r\nimport type { ECDH } from \"node:crypto\";\r\nimport type { IncomingMessage } from \"node:http\";\r\nimport { PassThrough, Readable } from \"node:stream\";\r\nimport WebSocket, { WebSocketServer } from \"ws\";\r\nimport type {\r\n ClientOptions,\r\n RawData,\r\n ServerOptions as WebSocketServerOptions\r\n} from \"ws\";\r\n\r\nconst DEFAULT_CLOSE_CODE = 1000;\r\nconst DEFAULT_CLOSE_REASON = \"\";\r\nconst POLICY_VIOLATION_CLOSE_CODE = 1008;\r\nconst POLICY_VIOLATION_CLOSE_REASON = \"Connection rejected by middleware.\";\r\nconst INTERNAL_HANDSHAKE_EVENT = \"__handshake\";\r\nconst INTERNAL_SESSION_TICKET_EVENT = \"__session:ticket\";\r\nconst INTERNAL_RPC_REQUEST_EVENT = \"__rpc:req\";\r\nconst INTERNAL_RPC_RESPONSE_EVENT = \"__rpc:res\";\r\nconst INTERNAL_STREAM_FRAME_EVENT = \"__stream:frame\";\r\nconst READY_EVENT = \"ready\";\r\nconst HANDSHAKE_CURVE = \"prime256v1\";\r\nconst HANDSHAKE_PROTOCOL_VERSION = 1;\r\nconst ENCRYPTION_ALGORITHM = \"aes-256-gcm\";\r\nconst GCM_IV_LENGTH = 12;\r\nconst GCM_AUTH_TAG_LENGTH = 16;\r\nconst ENCRYPTION_KEY_LENGTH = 32;\r\nconst ENCRYPTED_PACKET_VERSION = 1;\r\nconst ENCRYPTED_PACKET_PREFIX_LENGTH = 1 + GCM_IV_LENGTH + GCM_AUTH_TAG_LENGTH;\r\nconst SESSION_TICKET_VERSION = 1;\r\nconst BINARY_PAYLOAD_MARKER = \"__afxBinaryPayload\";\r\nconst BINARY_PAYLOAD_VERSION = 1;\r\nconst DEFAULT_HEARTBEAT_INTERVAL_MS = 15_000;\r\nconst DEFAULT_HEARTBEAT_TIMEOUT_MS = 15_000;\r\nconst DEFAULT_SESSION_RESUMPTION_ENABLED = true;\r\nconst DEFAULT_SESSION_TICKET_TTL_MS = 10 * 60_000;\r\nconst DEFAULT_SESSION_TICKET_MAX_CACHE_SIZE = 10_000;\r\nconst STREAM_FRAME_VERSION = 1;\r\nconst DEFAULT_STREAM_CHUNK_SIZE_BYTES = 64 * 1024;\r\nconst MAX_STREAM_CHUNK_SIZE_BYTES = 1024 * 1024;\r\nconst RESUMPTION_NONCE_LENGTH = 16;\r\nconst DEFAULT_RECONNECT_INITIAL_DELAY_MS = 250;\r\nconst DEFAULT_RECONNECT_MAX_DELAY_MS = 10_000;\r\nconst DEFAULT_RECONNECT_FACTOR = 2;\r\nconst DEFAULT_RECONNECT_JITTER_RATIO = 0.2;\r\nconst DEFAULT_RPC_TIMEOUT_MS = 5_000;\r\nconst DEFAULT_RATE_LIMIT_WINDOW_MS = 1_000;\r\nconst DEFAULT_RATE_LIMIT_MAX_EVENTS_PER_CONNECTION = 120;\r\nconst DEFAULT_RATE_LIMIT_MAX_EVENTS_PER_IP = 300;\r\nconst DEFAULT_RATE_LIMIT_THROTTLE_MS = 150;\r\nconst DEFAULT_RATE_LIMIT_MAX_THROTTLE_MS = 2_000;\r\nconst DEFAULT_RATE_LIMIT_DISCONNECT_AFTER_VIOLATIONS = 4;\r\nconst DEFAULT_RATE_LIMIT_CLOSE_CODE = 1013;\r\nconst DEFAULT_RATE_LIMIT_CLOSE_REASON =\r\n \"Rate limit exceeded. Please retry later.\";\r\nconst SECURE_SERVER_ADAPTER_MESSAGE_VERSION = 1;\r\n\r\ninterface HandshakeHelloPayload {\r\n type: \"hello\";\r\n protocolVersion: typeof HANDSHAKE_PROTOCOL_VERSION;\r\n publicKey: string;\r\n}\r\n\r\ninterface HandshakeResumePayload {\r\n type: \"resume\";\r\n protocolVersion: typeof HANDSHAKE_PROTOCOL_VERSION;\r\n sessionId: string;\r\n clientNonce: string;\r\n clientProof: string;\r\n}\r\n\r\ninterface HandshakeResumeAckPayload {\r\n type: \"resume-ack\";\r\n protocolVersion: typeof HANDSHAKE_PROTOCOL_VERSION;\r\n ok: boolean;\r\n sessionId?: string;\r\n serverProof?: string;\r\n reason?: string;\r\n}\r\n\r\ntype HandshakePayload =\r\n | HandshakeHelloPayload\r\n | HandshakeResumePayload\r\n | HandshakeResumeAckPayload;\r\n\r\ninterface SessionTicketPayload {\r\n version: typeof SESSION_TICKET_VERSION;\r\n sessionId: string;\r\n secret: string;\r\n issuedAt: number;\r\n expiresAt: number;\r\n}\r\n\r\ninterface ServerSessionTicketRecord {\r\n sessionId: string;\r\n secret: Buffer;\r\n issuedAt: number;\r\n expiresAt: number;\r\n}\r\n\r\ninterface ClientSessionTicketRecord {\r\n sessionId: string;\r\n secret: Buffer;\r\n issuedAt: number;\r\n expiresAt: number;\r\n}\r\n\r\ninterface ClientResumeAttemptState {\r\n status: \"pending\" | \"accepted\" | \"failed\";\r\n sessionId: string;\r\n clientNonce: Buffer;\r\n resumedKey: Buffer;\r\n}\r\n\r\ninterface ServerHandshakeState {\r\n ecdh: ECDH;\r\n localPublicKey: string;\r\n isReady: boolean;\r\n}\r\n\r\ninterface ClientHandshakeState {\r\n ecdh: ECDH;\r\n localPublicKey: string;\r\n clientHelloSent: boolean;\r\n pendingServerPublicKey: string | null;\r\n resumeAttempt: ClientResumeAttemptState | null;\r\n isReady: boolean;\r\n sharedSecret: Buffer | null;\r\n encryptionKey: Buffer | null;\r\n}\r\n\r\ninterface EncryptedPacketParts {\r\n iv: Buffer;\r\n authTag: Buffer;\r\n ciphertext: Buffer;\r\n}\r\n\r\ninterface RpcRequestPayload {\r\n id: string;\r\n event: string;\r\n data: unknown;\r\n}\r\n\r\ninterface RpcResponsePayload {\r\n id: string;\r\n ok: boolean;\r\n data?: unknown;\r\n error?: string;\r\n}\r\n\r\ninterface PendingRpcRequest {\r\n resolve: (value: unknown) => void;\r\n reject: (reason?: unknown) => void;\r\n timeoutHandle: ReturnType<typeof setTimeout>;\r\n}\r\n\r\ntype SecureChunkSourceValue = Buffer | Uint8Array | ArrayBuffer | string;\r\n\r\ninterface StreamFrameStartPayload {\r\n version: typeof STREAM_FRAME_VERSION;\r\n type: \"start\";\r\n streamId: string;\r\n event: string;\r\n metadata?: Record<string, unknown>;\r\n totalBytes?: number;\r\n}\r\n\r\ninterface StreamFrameChunkPayload {\r\n version: typeof STREAM_FRAME_VERSION;\r\n type: \"chunk\";\r\n streamId: string;\r\n index: number;\r\n payload: string;\r\n byteLength: number;\r\n}\r\n\r\ninterface StreamFrameEndPayload {\r\n version: typeof STREAM_FRAME_VERSION;\r\n type: \"end\";\r\n streamId: string;\r\n chunkCount: number;\r\n totalBytes: number;\r\n}\r\n\r\ninterface StreamFrameAbortPayload {\r\n version: typeof STREAM_FRAME_VERSION;\r\n type: \"abort\";\r\n streamId: string;\r\n reason: string;\r\n}\r\n\r\ntype StreamFramePayload =\r\n | StreamFrameStartPayload\r\n | StreamFrameChunkPayload\r\n | StreamFrameEndPayload\r\n | StreamFrameAbortPayload;\r\n\r\ninterface IncomingServerStreamState {\r\n info: SecureIncomingStreamInfo;\r\n stream: PassThrough;\r\n expectedChunkIndex: number;\r\n receivedBytes: number;\r\n}\r\n\r\ninterface IncomingClientStreamState {\r\n info: SecureIncomingStreamInfo;\r\n stream: PassThrough;\r\n expectedChunkIndex: number;\r\n receivedBytes: number;\r\n}\r\n\r\ninterface SecureServerRateLimitBucket {\r\n windowStartedAt: number;\r\n count: number;\r\n violationCount: number;\r\n throttleUntil: number;\r\n lastSeenAt: number;\r\n}\r\n\r\ninterface SecureServerRateLimitDecision {\r\n shouldDisconnect: boolean;\r\n shouldDrop: boolean;\r\n throttleDelayMs: number;\r\n}\r\n\r\ntype BinaryPayloadKind = \"buffer\" | \"uint8array\" | \"blob\";\r\n\r\ninterface EncodedBinaryPayload {\r\n [BINARY_PAYLOAD_MARKER]: number;\r\n kind: BinaryPayloadKind;\r\n base64: string;\r\n mimeType?: string;\r\n}\r\n\r\nexport interface SecureEnvelope<TData = unknown> {\r\n event: string;\r\n data: TData;\r\n}\r\n\r\nexport type SecureBinaryPayload = Buffer | Uint8Array | Blob;\r\n\r\nexport type SecureChunkedStreamSource =\r\n | Buffer\r\n | Uint8Array\r\n | Readable\r\n | AsyncIterable<SecureChunkSourceValue>;\r\n\r\nexport interface SecureChunkedStreamOptions {\r\n chunkSizeBytes?: number;\r\n metadata?: Record<string, unknown>;\r\n totalBytes?: number;\r\n signal?: AbortSignal;\r\n}\r\n\r\nexport interface SecureStreamSendResult {\r\n streamId: string;\r\n chunkCount: number;\r\n totalBytes: number;\r\n}\r\n\r\nexport interface SecureIncomingStreamInfo {\r\n streamId: string;\r\n event: string;\r\n metadata?: Record<string, unknown>;\r\n totalBytes?: number;\r\n startedAt: number;\r\n}\r\n\r\nexport type SecureServerStreamHandler = (\r\n stream: Readable,\r\n info: SecureIncomingStreamInfo,\r\n client: SecureServerClient\r\n) => void | Promise<void>;\r\n\r\nexport type SecureClientStreamHandler = (\r\n stream: Readable,\r\n info: SecureIncomingStreamInfo\r\n) => void | Promise<void>;\r\n\r\nexport interface SecureAckOptions {\r\n timeoutMs?: number;\r\n}\r\n\r\nexport type SecureAckCallback = (\r\n error: Error | null,\r\n response?: unknown\r\n) => void;\r\n\r\nexport interface SecureServerHeartbeatOptions {\r\n enabled?: boolean;\r\n intervalMs?: number;\r\n timeoutMs?: number;\r\n}\r\n\r\nexport type SecureServerRateLimitAction = \"throttle\" | \"disconnect\";\r\n\r\nexport interface SecureServerRateLimitOptions {\r\n enabled?: boolean;\r\n windowMs?: number;\r\n maxEventsPerConnection?: number;\r\n maxEventsPerIp?: number;\r\n action?: SecureServerRateLimitAction;\r\n throttleMs?: number;\r\n maxThrottleMs?: number;\r\n disconnectAfterViolations?: number;\r\n disconnectCode?: number;\r\n disconnectReason?: string;\r\n}\r\n\r\nexport interface SecureServerSessionResumptionOptions {\r\n enabled?: boolean;\r\n ticketTtlMs?: number;\r\n maxCachedTickets?: number;\r\n}\r\n\r\nexport type SecureServerAdapterMessageScope = \"broadcast\" | \"room\";\r\n\r\nexport interface SecureServerAdapterMessage {\r\n version: typeof SECURE_SERVER_ADAPTER_MESSAGE_VERSION;\r\n originServerId: string;\r\n scope: SecureServerAdapterMessageScope;\r\n event: string;\r\n data: unknown;\r\n emittedAt: number;\r\n room?: string;\r\n}\r\n\r\nexport interface SecureServerAdapter {\r\n attach: (server: SecureServer) => void | Promise<void>;\r\n publish: (message: SecureServerAdapterMessage) => void | Promise<void>;\r\n detach?: (server: SecureServer) => void | Promise<void>;\r\n}\r\n\r\nexport interface SecureServerOptions extends WebSocketServerOptions {\r\n heartbeat?: SecureServerHeartbeatOptions;\r\n rateLimit?: SecureServerRateLimitOptions;\r\n sessionResumption?: SecureServerSessionResumptionOptions;\r\n adapter?: SecureServerAdapter;\r\n}\r\n\r\nexport interface SecureClientReconnectOptions {\r\n enabled?: boolean;\r\n initialDelayMs?: number;\r\n maxDelayMs?: number;\r\n factor?: number;\r\n jitterRatio?: number;\r\n maxAttempts?: number | null;\r\n}\r\n\r\nexport interface SecureClientSessionResumptionOptions {\r\n enabled?: boolean;\r\n maxAcceptedTicketTtlMs?: number;\r\n}\r\n\r\nexport interface SecureClientOptions {\r\n protocols?: string | string[];\r\n wsOptions?: ClientOptions;\r\n autoConnect?: boolean;\r\n reconnect?: boolean | SecureClientReconnectOptions;\r\n sessionResumption?: boolean | SecureClientSessionResumptionOptions;\r\n}\r\n\r\nexport interface SecureServerClient {\r\n id: string;\r\n socket: WebSocket;\r\n request: IncomingMessage;\r\n metadata: ReadonlyMap<string, unknown>;\r\n emit: (\r\n event: string,\r\n data: unknown,\r\n callbackOrOptions?: SecureAckCallback | SecureAckOptions,\r\n maybeCallback?: SecureAckCallback\r\n ) => boolean | Promise<unknown>;\r\n emitStream: (\r\n event: string,\r\n source: SecureChunkedStreamSource,\r\n options?: SecureChunkedStreamOptions\r\n ) => Promise<SecureStreamSendResult>;\r\n join: (room: string) => boolean;\r\n leave: (room: string) => boolean;\r\n leaveAll: () => number;\r\n}\r\n\r\nexport interface SecureServerRoomOperator {\r\n emit: (event: string, data: unknown) => SecureServer;\r\n}\r\n\r\nexport type SecureErrorHandler = (error: Error) => void;\r\n\r\nexport type SecureServerEventHandler = (\r\n data: unknown,\r\n client: SecureServerClient\r\n) => unknown | Promise<unknown>;\r\n\r\nexport type SecureServerConnectionHandler = (\r\n client: SecureServerClient\r\n) => void;\r\n\r\nexport type SecureServerDisconnectHandler = (\r\n client: SecureServerClient,\r\n code: number,\r\n reason: string\r\n) => void;\r\n\r\nexport type SecureServerReadyHandler = (client: SecureServerClient) => void;\r\n\r\nexport type SecureClientEventHandler = (data: unknown) => unknown | Promise<unknown>;\r\n\r\nexport type SecureClientConnectHandler = () => void;\r\n\r\nexport type SecureClientDisconnectHandler = (\r\n code: number,\r\n reason: string\r\n) => void;\r\n\r\nexport type SecureClientReadyHandler = () => void;\r\n\r\nexport type SecureServerLifecycleEvent =\r\n | \"connection\"\r\n | \"disconnect\"\r\n | \"ready\"\r\n | \"error\";\r\n\r\nexport type SecureClientLifecycleEvent =\r\n | \"connect\"\r\n | \"disconnect\"\r\n | \"ready\"\r\n | \"error\";\r\n\r\nexport interface SecureServerEventMap {\r\n connection: SecureServerConnectionHandler;\r\n disconnect: SecureServerDisconnectHandler;\r\n ready: SecureServerReadyHandler;\r\n error: SecureErrorHandler;\r\n}\r\n\r\nexport interface SecureClientEventMap {\r\n connect: SecureClientConnectHandler;\r\n disconnect: SecureClientDisconnectHandler;\r\n ready: SecureClientReadyHandler;\r\n error: SecureErrorHandler;\r\n}\r\n\r\nexport interface SecureServerConnectionMiddlewareContext {\r\n phase: \"connection\";\r\n socket: WebSocket;\r\n request: IncomingMessage;\r\n metadata: Map<string, unknown>;\r\n}\r\n\r\nexport interface SecureServerMessageMiddlewareContext {\r\n phase: \"incoming\" | \"outgoing\";\r\n client: SecureServerClient;\r\n event: string;\r\n data: unknown;\r\n metadata: Map<string, unknown>;\r\n}\r\n\r\nexport type SecureServerMiddlewareContext =\r\n | SecureServerConnectionMiddlewareContext\r\n | SecureServerMessageMiddlewareContext;\r\n\r\nexport type SecureServerMiddlewareNext = () => Promise<void>;\r\n\r\nexport type SecureServerMiddleware = (\r\n context: SecureServerMiddlewareContext,\r\n next: SecureServerMiddlewareNext\r\n) => void | Promise<void>;\r\n\r\nexport function normalizeSecureServerAdapterMessage(\r\n value: unknown\r\n): SecureServerAdapterMessage {\r\n if (!isPlainObject(value)) {\r\n throw new Error(\"SecureServer adapter message must be a plain object.\");\r\n }\r\n\r\n if (value.version !== SECURE_SERVER_ADAPTER_MESSAGE_VERSION) {\r\n throw new Error(\r\n `Unsupported SecureServer adapter message version: ${String(value.version)}.`\r\n );\r\n }\r\n\r\n if (\r\n typeof value.originServerId !== \"string\" ||\r\n value.originServerId.trim().length === 0\r\n ) {\r\n throw new Error(\"SecureServer adapter message originServerId must be a non-empty string.\");\r\n }\r\n\r\n if (value.scope !== \"broadcast\" && value.scope !== \"room\") {\r\n throw new Error('SecureServer adapter message scope must be either \"broadcast\" or \"room\".');\r\n }\r\n\r\n if (typeof value.event !== \"string\" || value.event.trim().length === 0) {\r\n throw new Error(\"SecureServer adapter message event must be a non-empty string.\");\r\n }\r\n\r\n if (typeof value.emittedAt !== \"number\" || !Number.isFinite(value.emittedAt)) {\r\n throw new Error(\"SecureServer adapter message emittedAt must be a finite number.\");\r\n }\r\n\r\n if (value.scope === \"room\") {\r\n if (typeof value.room !== \"string\" || value.room.trim().length === 0) {\r\n throw new Error(\"SecureServer adapter message room must be a non-empty string.\");\r\n }\r\n\r\n return {\r\n version: SECURE_SERVER_ADAPTER_MESSAGE_VERSION,\r\n originServerId: value.originServerId,\r\n scope: value.scope,\r\n event: value.event,\r\n data: value.data,\r\n emittedAt: value.emittedAt,\r\n room: value.room.trim()\r\n };\r\n }\r\n\r\n return {\r\n version: SECURE_SERVER_ADAPTER_MESSAGE_VERSION,\r\n originServerId: value.originServerId,\r\n scope: value.scope,\r\n event: value.event,\r\n data: value.data,\r\n emittedAt: value.emittedAt\r\n };\r\n}\r\n\r\nfunction normalizeToError(error: unknown, fallbackMessage: string): Error {\r\n if (error instanceof Error) {\r\n return error;\r\n }\r\n\r\n if (typeof error === \"string\" && error.trim().length > 0) {\r\n return new Error(error);\r\n }\r\n\r\n return new Error(fallbackMessage);\r\n}\r\n\r\nfunction decodeRawData(rawData: RawData): string {\r\n if (typeof rawData === \"string\") {\r\n return rawData;\r\n }\r\n\r\n if (rawData instanceof ArrayBuffer) {\r\n return Buffer.from(rawData).toString(\"utf8\");\r\n }\r\n\r\n if (Array.isArray(rawData)) {\r\n return Buffer.concat(rawData).toString(\"utf8\");\r\n }\r\n\r\n return rawData.toString(\"utf8\");\r\n}\r\n\r\nfunction rawDataToBuffer(rawData: RawData): Buffer {\r\n if (typeof rawData === \"string\") {\r\n return Buffer.from(rawData, \"utf8\");\r\n }\r\n\r\n if (rawData instanceof ArrayBuffer) {\r\n return Buffer.from(rawData);\r\n }\r\n\r\n if (Array.isArray(rawData)) {\r\n return Buffer.concat(rawData);\r\n }\r\n\r\n return Buffer.from(rawData);\r\n}\r\n\r\nfunction delay(ms: number): Promise<void> {\r\n return new Promise((resolve) => {\r\n setTimeout(resolve, ms);\r\n });\r\n}\r\n\r\nfunction isBlobValue(value: unknown): value is Blob {\r\n return typeof Blob !== \"undefined\" && value instanceof Blob;\r\n}\r\n\r\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\r\n if (typeof value !== \"object\" || value === null) {\r\n return false;\r\n }\r\n\r\n const prototype = Object.getPrototypeOf(value);\r\n return prototype === Object.prototype || prototype === null;\r\n}\r\n\r\nfunction encodeBinaryPayload(\r\n kind: BinaryPayloadKind,\r\n payloadBuffer: Buffer,\r\n mimeType?: string\r\n): EncodedBinaryPayload {\r\n const encodedPayload: EncodedBinaryPayload = {\r\n [BINARY_PAYLOAD_MARKER]: BINARY_PAYLOAD_VERSION,\r\n kind,\r\n base64: payloadBuffer.toString(\"base64\")\r\n };\r\n\r\n if (mimeType !== undefined && mimeType.length > 0) {\r\n encodedPayload.mimeType = mimeType;\r\n }\r\n\r\n return encodedPayload;\r\n}\r\n\r\nasync function encodeEnvelopeData(value: unknown): Promise<unknown> {\r\n if (Buffer.isBuffer(value)) {\r\n return encodeBinaryPayload(\"buffer\", value);\r\n }\r\n\r\n if (value instanceof Uint8Array) {\r\n const typedArrayBuffer = Buffer.from(value.buffer, value.byteOffset, value.byteLength);\r\n return encodeBinaryPayload(\"uint8array\", typedArrayBuffer);\r\n }\r\n\r\n if (isBlobValue(value)) {\r\n const blobBuffer = Buffer.from(await value.arrayBuffer());\r\n return encodeBinaryPayload(\"blob\", blobBuffer, value.type);\r\n }\r\n\r\n if (Array.isArray(value)) {\r\n return Promise.all(value.map((item) => encodeEnvelopeData(item)));\r\n }\r\n\r\n if (isPlainObject(value)) {\r\n const encodedEntries = await Promise.all(\r\n Object.entries(value).map(async ([key, entryValue]) => {\r\n return [key, await encodeEnvelopeData(entryValue)] as const;\r\n })\r\n );\r\n\r\n return Object.fromEntries(encodedEntries);\r\n }\r\n\r\n return value;\r\n}\r\n\r\nfunction isEncodedBinaryPayload(value: unknown): value is EncodedBinaryPayload {\r\n if (!isPlainObject(value)) {\r\n return false;\r\n }\r\n\r\n if (value[BINARY_PAYLOAD_MARKER] !== BINARY_PAYLOAD_VERSION) {\r\n return false;\r\n }\r\n\r\n if (\r\n value.kind !== \"buffer\" &&\r\n value.kind !== \"uint8array\" &&\r\n value.kind !== \"blob\"\r\n ) {\r\n return false;\r\n }\r\n\r\n if (typeof value.base64 !== \"string\") {\r\n return false;\r\n }\r\n\r\n if (value.mimeType !== undefined && typeof value.mimeType !== \"string\") {\r\n return false;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nfunction decodeEnvelopeData(value: unknown): unknown {\r\n if (Array.isArray(value)) {\r\n return value.map((item) => decodeEnvelopeData(item));\r\n }\r\n\r\n if (isEncodedBinaryPayload(value)) {\r\n const binaryBuffer = Buffer.from(value.base64, \"base64\");\r\n\r\n if (value.kind === \"buffer\") {\r\n return binaryBuffer;\r\n }\r\n\r\n if (value.kind === \"uint8array\") {\r\n return Uint8Array.from(binaryBuffer);\r\n }\r\n\r\n if (typeof Blob === \"undefined\") {\r\n return binaryBuffer;\r\n }\r\n\r\n return new Blob([binaryBuffer], {\r\n type: value.mimeType ?? \"\"\r\n });\r\n }\r\n\r\n if (isPlainObject(value)) {\r\n const decodedEntries = Object.entries(value).map(([key, entryValue]) => {\r\n return [key, decodeEnvelopeData(entryValue)] as const;\r\n });\r\n\r\n return Object.fromEntries(decodedEntries);\r\n }\r\n\r\n return value;\r\n}\r\n\r\nasync function serializeEnvelope(event: string, data: unknown): Promise<string> {\r\n const encodedData = await encodeEnvelopeData(data);\r\n const envelope: SecureEnvelope = { event, data: encodedData };\r\n return JSON.stringify(envelope);\r\n}\r\n\r\nfunction serializePlainEnvelope(event: string, data: unknown): string {\r\n const envelope: SecureEnvelope = { event, data };\r\n return JSON.stringify(envelope);\r\n}\r\n\r\nfunction parseEnvelope(rawData: RawData): SecureEnvelope {\r\n const decoded = decodeRawData(rawData);\r\n const parsed = JSON.parse(decoded) as Partial<SecureEnvelope>;\r\n\r\n if (\r\n typeof parsed !== \"object\" ||\r\n parsed === null ||\r\n typeof parsed.event !== \"string\"\r\n ) {\r\n throw new Error(\"Invalid message format. Expected { event: string, data: unknown }.\");\r\n }\r\n\r\n return {\r\n event: parsed.event,\r\n data: decodeEnvelopeData(parsed.data)\r\n };\r\n}\r\n\r\nfunction parseEnvelopeFromText(decodedPayload: string): SecureEnvelope {\r\n const parsed = JSON.parse(decodedPayload) as Partial<SecureEnvelope>;\r\n\r\n if (\r\n typeof parsed !== \"object\" ||\r\n parsed === null ||\r\n typeof parsed.event !== \"string\"\r\n ) {\r\n throw new Error(\"Invalid message format. Expected { event: string, data: unknown }.\");\r\n }\r\n\r\n return {\r\n event: parsed.event,\r\n data: decodeEnvelopeData(parsed.data)\r\n };\r\n}\r\n\r\nfunction decodeCloseReason(reason: Buffer): string {\r\n return reason.toString(\"utf8\");\r\n}\r\n\r\nfunction isReservedEmitEvent(event: string): boolean {\r\n return (\r\n event === INTERNAL_HANDSHAKE_EVENT ||\r\n event === INTERNAL_SESSION_TICKET_EVENT ||\r\n event === INTERNAL_RPC_REQUEST_EVENT ||\r\n event === INTERNAL_RPC_RESPONSE_EVENT ||\r\n event === INTERNAL_STREAM_FRAME_EVENT ||\r\n event === READY_EVENT\r\n );\r\n}\r\n\r\nfunction isPromiseLike(value: unknown): value is PromiseLike<unknown> {\r\n return typeof value === \"object\" && value !== null && \"then\" in value;\r\n}\r\n\r\nfunction normalizeRpcTimeout(timeoutMs: number | undefined): number {\r\n const resolvedTimeoutMs = timeoutMs ?? DEFAULT_RPC_TIMEOUT_MS;\r\n\r\n if (!Number.isFinite(resolvedTimeoutMs) || resolvedTimeoutMs <= 0) {\r\n throw new Error(\"ACK timeoutMs must be a positive number.\");\r\n }\r\n\r\n return resolvedTimeoutMs;\r\n}\r\n\r\nfunction normalizeStreamChunkSize(chunkSizeBytes: number | undefined): number {\r\n const resolvedChunkSize = chunkSizeBytes ?? DEFAULT_STREAM_CHUNK_SIZE_BYTES;\r\n\r\n if (!Number.isInteger(resolvedChunkSize) || resolvedChunkSize <= 0) {\r\n throw new Error(\"Stream chunkSizeBytes must be a positive integer.\");\r\n }\r\n\r\n if (resolvedChunkSize > MAX_STREAM_CHUNK_SIZE_BYTES) {\r\n throw new Error(\r\n `Stream chunkSizeBytes cannot exceed ${MAX_STREAM_CHUNK_SIZE_BYTES} bytes.`\r\n );\r\n }\r\n\r\n return resolvedChunkSize;\r\n}\r\n\r\nfunction resolveKnownStreamSourceSize(\r\n source: SecureChunkedStreamSource,\r\n hint: number | undefined\r\n): number | undefined {\r\n if (hint !== undefined) {\r\n if (!Number.isInteger(hint) || hint < 0) {\r\n throw new Error(\"Stream totalBytes must be a non-negative integer.\");\r\n }\r\n\r\n return hint;\r\n }\r\n\r\n if (Buffer.isBuffer(source)) {\r\n return source.length;\r\n }\r\n\r\n if (source instanceof Uint8Array) {\r\n return source.byteLength;\r\n }\r\n\r\n return undefined;\r\n}\r\n\r\nfunction normalizeChunkSourceValue(value: unknown): Buffer {\r\n if (Buffer.isBuffer(value)) {\r\n return value;\r\n }\r\n\r\n if (value instanceof Uint8Array) {\r\n return Buffer.from(value.buffer, value.byteOffset, value.byteLength);\r\n }\r\n\r\n if (value instanceof ArrayBuffer) {\r\n return Buffer.from(value);\r\n }\r\n\r\n if (typeof value === \"string\") {\r\n return Buffer.from(value, \"utf8\");\r\n }\r\n\r\n throw new Error(\"Stream source yielded an unsupported chunk value.\");\r\n}\r\n\r\nfunction isAsyncIterableValue(value: unknown): value is AsyncIterable<unknown> {\r\n return (\r\n typeof value === \"object\" &&\r\n value !== null &&\r\n Symbol.asyncIterator in value\r\n );\r\n}\r\n\r\nfunction isReadableSource(value: unknown): value is Readable {\r\n return value instanceof Readable;\r\n}\r\n\r\nfunction splitChunkBuffer(chunk: Buffer, chunkSizeBytes: number): Buffer[] {\r\n if (chunk.length <= chunkSizeBytes) {\r\n return [chunk];\r\n }\r\n\r\n const splitChunks: Buffer[] = [];\r\n\r\n for (let offset = 0; offset < chunk.length; offset += chunkSizeBytes) {\r\n splitChunks.push(chunk.subarray(offset, offset + chunkSizeBytes));\r\n }\r\n\r\n return splitChunks;\r\n}\r\n\r\nasync function* createChunkStreamIterator(\r\n source: SecureChunkedStreamSource,\r\n chunkSizeBytes: number\r\n): AsyncGenerator<Buffer> {\r\n if (Buffer.isBuffer(source)) {\r\n yield* splitChunkBuffer(source, chunkSizeBytes);\r\n return;\r\n }\r\n\r\n if (source instanceof Uint8Array) {\r\n yield* splitChunkBuffer(\r\n Buffer.from(source.buffer, source.byteOffset, source.byteLength),\r\n chunkSizeBytes\r\n );\r\n return;\r\n }\r\n\r\n if (isReadableSource(source) || isAsyncIterableValue(source)) {\r\n for await (const chunkValue of source) {\r\n const normalizedChunk = normalizeChunkSourceValue(chunkValue);\r\n\r\n if (normalizedChunk.length === 0) {\r\n continue;\r\n }\r\n\r\n yield* splitChunkBuffer(normalizedChunk, chunkSizeBytes);\r\n }\r\n\r\n return;\r\n }\r\n\r\n throw new Error(\"Unsupported stream source type.\");\r\n}\r\n\r\nfunction parseStreamFramePayload(data: unknown): StreamFramePayload {\r\n if (typeof data !== \"object\" || data === null) {\r\n throw new Error(\"Invalid stream frame payload format.\");\r\n }\r\n\r\n const payload = data as Partial<StreamFramePayload> & {\r\n metadata?: unknown;\r\n };\r\n\r\n if (payload.version !== STREAM_FRAME_VERSION) {\r\n throw new Error(`Unsupported stream frame version: ${String(payload.version)}.`);\r\n }\r\n\r\n if (typeof payload.streamId !== \"string\" || payload.streamId.trim().length === 0) {\r\n throw new Error(\"Stream frame streamId must be a non-empty string.\");\r\n }\r\n\r\n if (payload.type === \"start\") {\r\n if (typeof payload.event !== \"string\" || payload.event.trim().length === 0) {\r\n throw new Error(\"Stream start frame event must be a non-empty string.\");\r\n }\r\n\r\n if (\r\n payload.totalBytes !== undefined &&\r\n (!Number.isInteger(payload.totalBytes) || payload.totalBytes < 0)\r\n ) {\r\n throw new Error(\"Stream start frame totalBytes must be a non-negative integer.\");\r\n }\r\n\r\n if (payload.metadata !== undefined && !isPlainObject(payload.metadata)) {\r\n throw new Error(\"Stream start frame metadata must be a plain object when provided.\");\r\n }\r\n\r\n return {\r\n version: STREAM_FRAME_VERSION,\r\n type: \"start\",\r\n streamId: payload.streamId.trim(),\r\n event: payload.event.trim(),\r\n ...(payload.metadata ? { metadata: payload.metadata } : {}),\r\n ...(payload.totalBytes !== undefined\r\n ? { totalBytes: payload.totalBytes }\r\n : {})\r\n };\r\n }\r\n\r\n if (payload.type === \"chunk\") {\r\n const { index, byteLength } = payload;\r\n\r\n if (typeof index !== \"number\" || !Number.isInteger(index) || index < 0) {\r\n throw new Error(\"Stream chunk frame index must be a non-negative integer.\");\r\n }\r\n\r\n if (typeof payload.payload !== \"string\" || payload.payload.length === 0) {\r\n throw new Error(\"Stream chunk frame payload must be a non-empty base64 string.\");\r\n }\r\n\r\n if (\r\n typeof byteLength !== \"number\" ||\r\n !Number.isInteger(byteLength) ||\r\n byteLength <= 0\r\n ) {\r\n throw new Error(\"Stream chunk frame byteLength must be a positive integer.\");\r\n }\r\n\r\n return {\r\n version: STREAM_FRAME_VERSION,\r\n type: \"chunk\",\r\n streamId: payload.streamId.trim(),\r\n index,\r\n payload: payload.payload,\r\n byteLength\r\n };\r\n }\r\n\r\n if (payload.type === \"end\") {\r\n const { chunkCount, totalBytes } = payload;\r\n\r\n if (\r\n typeof chunkCount !== \"number\" ||\r\n !Number.isInteger(chunkCount) ||\r\n chunkCount < 0\r\n ) {\r\n throw new Error(\"Stream end frame chunkCount must be a non-negative integer.\");\r\n }\r\n\r\n if (\r\n typeof totalBytes !== \"number\" ||\r\n !Number.isInteger(totalBytes) ||\r\n totalBytes < 0\r\n ) {\r\n throw new Error(\"Stream end frame totalBytes must be a non-negative integer.\");\r\n }\r\n\r\n return {\r\n version: STREAM_FRAME_VERSION,\r\n type: \"end\",\r\n streamId: payload.streamId.trim(),\r\n chunkCount,\r\n totalBytes\r\n };\r\n }\r\n\r\n if (payload.type === \"abort\") {\r\n if (typeof payload.reason !== \"string\" || payload.reason.trim().length === 0) {\r\n throw new Error(\"Stream abort frame reason must be a non-empty string.\");\r\n }\r\n\r\n return {\r\n version: STREAM_FRAME_VERSION,\r\n type: \"abort\",\r\n streamId: payload.streamId.trim(),\r\n reason: payload.reason.trim()\r\n };\r\n }\r\n\r\n throw new Error(\"Unsupported stream frame type.\");\r\n}\r\n\r\nasync function transmitChunkedStreamFrames(\r\n event: string,\r\n source: SecureChunkedStreamSource,\r\n options: SecureChunkedStreamOptions | undefined,\r\n sendFrame: (framePayload: StreamFramePayload) => Promise<void>\r\n): Promise<SecureStreamSendResult> {\r\n const chunkSizeBytes = normalizeStreamChunkSize(options?.chunkSizeBytes);\r\n const totalBytesHint = resolveKnownStreamSourceSize(source, options?.totalBytes);\r\n\r\n if (options?.metadata !== undefined && !isPlainObject(options.metadata)) {\r\n throw new Error(\"Stream metadata must be a plain object when provided.\");\r\n }\r\n\r\n if (options?.signal?.aborted) {\r\n throw new Error(\"Stream transfer aborted before dispatch.\");\r\n }\r\n\r\n const streamId = randomUUID();\r\n let chunkCount = 0;\r\n let totalBytes = 0;\r\n\r\n await sendFrame({\r\n version: STREAM_FRAME_VERSION,\r\n type: \"start\",\r\n streamId,\r\n event,\r\n ...(options?.metadata ? { metadata: options.metadata } : {}),\r\n ...(totalBytesHint !== undefined ? { totalBytes: totalBytesHint } : {})\r\n });\r\n\r\n try {\r\n for await (const chunkBuffer of createChunkStreamIterator(source, chunkSizeBytes)) {\r\n if (options?.signal?.aborted) {\r\n throw new Error(\"Stream transfer aborted by caller signal.\");\r\n }\r\n\r\n if (chunkBuffer.length === 0) {\r\n continue;\r\n }\r\n\r\n await sendFrame({\r\n version: STREAM_FRAME_VERSION,\r\n type: \"chunk\",\r\n streamId,\r\n index: chunkCount,\r\n payload: chunkBuffer.toString(\"base64\"),\r\n byteLength: chunkBuffer.length\r\n });\r\n\r\n chunkCount += 1;\r\n totalBytes += chunkBuffer.length;\r\n }\r\n\r\n if (totalBytesHint !== undefined && totalBytes !== totalBytesHint) {\r\n throw new Error(\r\n `Stream totalBytes mismatch. Expected ${totalBytesHint}, received ${totalBytes}.`\r\n );\r\n }\r\n\r\n await sendFrame({\r\n version: STREAM_FRAME_VERSION,\r\n type: \"end\",\r\n streamId,\r\n chunkCount,\r\n totalBytes\r\n });\r\n\r\n return {\r\n streamId,\r\n chunkCount,\r\n totalBytes\r\n };\r\n } catch (error) {\r\n const normalizedError = normalizeToError(\r\n error,\r\n `Chunked stream transfer failed for event \"${event}\".`\r\n );\r\n\r\n try {\r\n await sendFrame({\r\n version: STREAM_FRAME_VERSION,\r\n type: \"abort\",\r\n streamId,\r\n reason: normalizedError.message\r\n });\r\n } catch {\r\n // Best effort abort frame dispatch.\r\n }\r\n\r\n throw normalizedError;\r\n }\r\n}\r\n\r\nfunction parseRpcRequestPayload(data: unknown): RpcRequestPayload {\r\n if (typeof data !== \"object\" || data === null) {\r\n throw new Error(\"Invalid RPC request payload format.\");\r\n }\r\n\r\n const payload = data as Partial<RpcRequestPayload>;\r\n\r\n if (typeof payload.id !== \"string\" || payload.id.trim().length === 0) {\r\n throw new Error(\"RPC request payload must include a non-empty id.\");\r\n }\r\n\r\n if (typeof payload.event !== \"string\" || payload.event.trim().length === 0) {\r\n throw new Error(\"RPC request payload must include a non-empty event.\");\r\n }\r\n\r\n return {\r\n id: payload.id,\r\n event: payload.event,\r\n data: payload.data\r\n };\r\n}\r\n\r\nfunction parseRpcResponsePayload(data: unknown): RpcResponsePayload {\r\n if (typeof data !== \"object\" || data === null) {\r\n throw new Error(\"Invalid RPC response payload format.\");\r\n }\r\n\r\n const payload = data as Partial<RpcResponsePayload>;\r\n\r\n if (typeof payload.id !== \"string\" || payload.id.trim().length === 0) {\r\n throw new Error(\"RPC response payload must include a non-empty id.\");\r\n }\r\n\r\n if (typeof payload.ok !== \"boolean\") {\r\n throw new Error(\"RPC response payload must include a boolean ok field.\");\r\n }\r\n\r\n if (payload.error !== undefined && typeof payload.error !== \"string\") {\r\n throw new Error(\"RPC response payload error must be a string when provided.\");\r\n }\r\n\r\n const parsedPayload: RpcResponsePayload = {\r\n id: payload.id,\r\n ok: payload.ok,\r\n data: payload.data\r\n };\r\n\r\n if (payload.error !== undefined) {\r\n parsedPayload.error = payload.error;\r\n }\r\n\r\n return parsedPayload;\r\n}\r\n\r\nfunction resolveAckArguments(\r\n callbackOrOptions?: SecureAckCallback | SecureAckOptions,\r\n maybeCallback?: SecureAckCallback\r\n): {\r\n expectsAck: boolean;\r\n callback?: SecureAckCallback;\r\n timeoutMs: number;\r\n} {\r\n if (callbackOrOptions === undefined && maybeCallback === undefined) {\r\n return {\r\n expectsAck: false,\r\n timeoutMs: DEFAULT_RPC_TIMEOUT_MS\r\n };\r\n }\r\n\r\n if (typeof callbackOrOptions === \"function\") {\r\n if (maybeCallback !== undefined) {\r\n throw new Error(\"ACK callback was provided more than once.\");\r\n }\r\n\r\n return {\r\n expectsAck: true,\r\n callback: callbackOrOptions,\r\n timeoutMs: DEFAULT_RPC_TIMEOUT_MS\r\n };\r\n }\r\n\r\n const options = callbackOrOptions;\r\n\r\n if (options !== undefined && (typeof options !== \"object\" || options === null)) {\r\n throw new Error(\"ACK options must be an object.\");\r\n }\r\n\r\n if (maybeCallback !== undefined && typeof maybeCallback !== \"function\") {\r\n throw new Error(\"ACK callback must be a function.\");\r\n }\r\n\r\n return {\r\n ...(maybeCallback ? { callback: maybeCallback } : {}),\r\n expectsAck: true,\r\n timeoutMs: normalizeRpcTimeout(options?.timeoutMs)\r\n };\r\n}\r\n\r\nfunction createEphemeralHandshakeState(): { ecdh: ECDH; localPublicKey: string } {\r\n const ecdh = createECDH(HANDSHAKE_CURVE);\r\n ecdh.generateKeys();\r\n\r\n return {\r\n ecdh,\r\n localPublicKey: ecdh.getPublicKey(\"base64\")\r\n };\r\n}\r\n\r\nfunction decodeBase64ToBuffer(value: string, fieldName: string): Buffer {\r\n if (typeof value !== \"string\") {\r\n throw new Error(`${fieldName} must be a base64 string.`);\r\n }\r\n\r\n const normalizedValue = value.trim();\r\n\r\n if (normalizedValue.length === 0) {\r\n throw new Error(`${fieldName} must be a non-empty base64 string.`);\r\n }\r\n\r\n const decodedBuffer = Buffer.from(normalizedValue, \"base64\");\r\n\r\n if (decodedBuffer.length === 0) {\r\n throw new Error(`${fieldName} could not be decoded from base64.`);\r\n }\r\n\r\n const canonicalInput = normalizedValue.replace(/=+$/u, \"\");\r\n const canonicalDecoded = decodedBuffer.toString(\"base64\").replace(/=+$/u, \"\");\r\n\r\n if (canonicalInput !== canonicalDecoded) {\r\n throw new Error(`${fieldName} is not valid base64 content.`);\r\n }\r\n\r\n return decodedBuffer;\r\n}\r\n\r\nfunction equalsConstantTime(left: Buffer, right: Buffer): boolean {\r\n if (left.length !== right.length) {\r\n return false;\r\n }\r\n\r\n return timingSafeEqual(left, right);\r\n}\r\n\r\nfunction createResumeClientProof(\r\n sessionSecret: Buffer,\r\n sessionId: string,\r\n clientNonce: Buffer\r\n): Buffer {\r\n return createHmac(\"sha256\", sessionSecret)\r\n .update(\"afx-resume-client-proof:v1\")\r\n .update(sessionId)\r\n .update(clientNonce)\r\n .digest();\r\n}\r\n\r\nfunction createResumeServerProof(\r\n resumedKey: Buffer,\r\n sessionId: string,\r\n clientNonce: Buffer\r\n): Buffer {\r\n return createHmac(\"sha256\", resumedKey)\r\n .update(\"afx-resume-server-proof:v1\")\r\n .update(sessionId)\r\n .update(clientNonce)\r\n .digest();\r\n}\r\n\r\nfunction deriveSessionTicketSecret(baseKey: Buffer): Buffer {\r\n return createHmac(\"sha256\", baseKey)\r\n .update(\"afx-session-ticket:v1\")\r\n .digest();\r\n}\r\n\r\nfunction deriveResumedEncryptionKey(sessionSecret: Buffer, clientNonce: Buffer): Buffer {\r\n const derivedKey = createHash(\"sha256\")\r\n .update(\"afx-resume-encryption-key:v1\")\r\n .update(sessionSecret)\r\n .update(clientNonce)\r\n .digest();\r\n\r\n if (derivedKey.length !== ENCRYPTION_KEY_LENGTH) {\r\n throw new Error(\"Failed to derive a valid resumed AES-256 key.\");\r\n }\r\n\r\n return derivedKey;\r\n}\r\n\r\nfunction parseHandshakePayload(data: unknown): HandshakePayload {\r\n if (typeof data !== \"object\" || data === null) {\r\n throw new Error(\"Invalid handshake payload format.\");\r\n }\r\n\r\n const payload = data as Record<string, unknown>;\r\n\r\n if (typeof payload.type !== \"string\") {\r\n if (typeof payload.publicKey === \"string\" && payload.publicKey.length > 0) {\r\n return {\r\n type: \"hello\",\r\n protocolVersion: HANDSHAKE_PROTOCOL_VERSION,\r\n publicKey: payload.publicKey\r\n };\r\n }\r\n\r\n throw new Error(\"Handshake payload must include a valid type.\");\r\n }\r\n\r\n const protocolVersion =\r\n payload.protocolVersion === undefined\r\n ? HANDSHAKE_PROTOCOL_VERSION\r\n : payload.protocolVersion;\r\n\r\n if (protocolVersion !== HANDSHAKE_PROTOCOL_VERSION) {\r\n throw new Error(\r\n `Unsupported handshake protocol version: ${String(protocolVersion)}.`\r\n );\r\n }\r\n\r\n if (payload.type === \"hello\") {\r\n if (typeof payload.publicKey !== \"string\" || payload.publicKey.length === 0) {\r\n throw new Error(\"Handshake hello payload must include a non-empty public key.\");\r\n }\r\n\r\n return {\r\n type: \"hello\",\r\n protocolVersion: HANDSHAKE_PROTOCOL_VERSION,\r\n publicKey: payload.publicKey\r\n };\r\n }\r\n\r\n if (payload.type === \"resume\") {\r\n if (typeof payload.sessionId !== \"string\" || payload.sessionId.trim().length === 0) {\r\n throw new Error(\"Handshake resume payload must include a non-empty sessionId.\");\r\n }\r\n\r\n if (typeof payload.clientNonce !== \"string\" || payload.clientNonce.length === 0) {\r\n throw new Error(\"Handshake resume payload must include a non-empty clientNonce.\");\r\n }\r\n\r\n if (typeof payload.clientProof !== \"string\" || payload.clientProof.length === 0) {\r\n throw new Error(\"Handshake resume payload must include a non-empty clientProof.\");\r\n }\r\n\r\n return {\r\n type: \"resume\",\r\n protocolVersion: HANDSHAKE_PROTOCOL_VERSION,\r\n sessionId: payload.sessionId.trim(),\r\n clientNonce: payload.clientNonce,\r\n clientProof: payload.clientProof\r\n };\r\n }\r\n\r\n if (payload.type === \"resume-ack\") {\r\n if (typeof payload.ok !== \"boolean\") {\r\n throw new Error(\"Handshake resume-ack payload must include boolean ok.\");\r\n }\r\n\r\n const normalizedPayload: HandshakeResumeAckPayload = {\r\n type: \"resume-ack\",\r\n protocolVersion: HANDSHAKE_PROTOCOL_VERSION,\r\n ok: payload.ok\r\n };\r\n\r\n if (typeof payload.sessionId === \"string\" && payload.sessionId.trim().length > 0) {\r\n normalizedPayload.sessionId = payload.sessionId.trim();\r\n }\r\n\r\n if (typeof payload.serverProof === \"string\" && payload.serverProof.length > 0) {\r\n normalizedPayload.serverProof = payload.serverProof;\r\n }\r\n\r\n if (typeof payload.reason === \"string\" && payload.reason.trim().length > 0) {\r\n normalizedPayload.reason = payload.reason.trim();\r\n }\r\n\r\n return normalizedPayload;\r\n }\r\n\r\n throw new Error(`Unsupported handshake payload type: ${payload.type}.`);\r\n}\r\n\r\nfunction parseSessionTicketPayload(data: unknown): SessionTicketPayload {\r\n if (typeof data !== \"object\" || data === null) {\r\n throw new Error(\"Invalid session ticket payload format.\");\r\n }\r\n\r\n const payload = data as Partial<SessionTicketPayload>;\r\n\r\n if (payload.version !== SESSION_TICKET_VERSION) {\r\n throw new Error(\r\n `Unsupported session ticket payload version: ${String(payload.version)}.`\r\n );\r\n }\r\n\r\n if (typeof payload.sessionId !== \"string\" || payload.sessionId.trim().length === 0) {\r\n throw new Error(\"Session ticket payload must include a non-empty sessionId.\");\r\n }\r\n\r\n if (typeof payload.secret !== \"string\" || payload.secret.length === 0) {\r\n throw new Error(\"Session ticket payload must include a non-empty secret.\");\r\n }\r\n\r\n if (typeof payload.issuedAt !== \"number\" || !Number.isFinite(payload.issuedAt)) {\r\n throw new Error(\"Session ticket payload issuedAt must be a finite number.\");\r\n }\r\n\r\n if (typeof payload.expiresAt !== \"number\" || !Number.isFinite(payload.expiresAt)) {\r\n throw new Error(\"Session ticket payload expiresAt must be a finite number.\");\r\n }\r\n\r\n if (payload.expiresAt <= payload.issuedAt) {\r\n throw new Error(\"Session ticket payload expiresAt must be greater than issuedAt.\");\r\n }\r\n\r\n return {\r\n version: SESSION_TICKET_VERSION,\r\n sessionId: payload.sessionId.trim(),\r\n secret: payload.secret,\r\n issuedAt: payload.issuedAt,\r\n expiresAt: payload.expiresAt\r\n };\r\n}\r\n\r\nfunction deriveEncryptionKey(sharedSecret: Buffer): Buffer {\r\n const derivedKey = createHash(\"sha256\").update(sharedSecret).digest();\r\n\r\n if (derivedKey.length !== ENCRYPTION_KEY_LENGTH) {\r\n throw new Error(\"Failed to derive a valid AES-256 key.\");\r\n }\r\n\r\n return derivedKey;\r\n}\r\n\r\nfunction encryptSerializedEnvelope(serializedEnvelope: string, encryptionKey: Buffer): Buffer {\r\n const iv = randomBytes(GCM_IV_LENGTH);\r\n const cipher = createCipheriv(ENCRYPTION_ALGORITHM, encryptionKey, iv);\r\n const ciphertext = Buffer.concat([\r\n cipher.update(serializedEnvelope, \"utf8\"),\r\n cipher.final()\r\n ]);\r\n const authTag = cipher.getAuthTag();\r\n\r\n return Buffer.concat([\r\n Buffer.from([ENCRYPTED_PACKET_VERSION]),\r\n iv,\r\n authTag,\r\n ciphertext\r\n ]);\r\n}\r\n\r\nfunction parseEncryptedPacket(rawData: RawData): EncryptedPacketParts {\r\n const packetBuffer = rawDataToBuffer(rawData);\r\n\r\n if (packetBuffer.length <= ENCRYPTED_PACKET_PREFIX_LENGTH) {\r\n throw new Error(\"Encrypted packet is too short.\");\r\n }\r\n\r\n const version = packetBuffer.readUInt8(0);\r\n\r\n if (version !== ENCRYPTED_PACKET_VERSION) {\r\n throw new Error(\"Unsupported encrypted packet version.\");\r\n }\r\n\r\n const ivStart = 1;\r\n const ivEnd = ivStart + GCM_IV_LENGTH;\r\n const authTagStart = ivEnd;\r\n const authTagEnd = authTagStart + GCM_AUTH_TAG_LENGTH;\r\n\r\n const iv = packetBuffer.subarray(ivStart, ivEnd);\r\n const authTag = packetBuffer.subarray(authTagStart, authTagEnd);\r\n const ciphertext = packetBuffer.subarray(authTagEnd);\r\n\r\n if (ciphertext.length === 0) {\r\n throw new Error(\"Encrypted payload is empty.\");\r\n }\r\n\r\n return {\r\n iv,\r\n authTag,\r\n ciphertext\r\n };\r\n}\r\n\r\nfunction decryptSerializedEnvelope(rawData: RawData, encryptionKey: Buffer): string {\r\n const encryptedPacket = parseEncryptedPacket(rawData);\r\n const decipher = createDecipheriv(\r\n ENCRYPTION_ALGORITHM,\r\n encryptionKey,\r\n encryptedPacket.iv\r\n );\r\n\r\n decipher.setAuthTag(encryptedPacket.authTag);\r\n\r\n const plaintext = Buffer.concat([\r\n decipher.update(encryptedPacket.ciphertext),\r\n decipher.final()\r\n ]);\r\n\r\n return plaintext.toString(\"utf8\");\r\n}\r\n\r\nexport class SecureServer {\r\n private readonly instanceId = randomUUID();\r\n\r\n private readonly socketServer: WebSocketServer;\r\n\r\n private adapter: SecureServerAdapter | null = null;\r\n\r\n private readonly heartbeatConfig: Required<SecureServerHeartbeatOptions>;\r\n\r\n private readonly rateLimitConfig: Required<SecureServerRateLimitOptions>;\r\n\r\n private readonly sessionResumptionConfig: Required<SecureServerSessionResumptionOptions>;\r\n\r\n private heartbeatIntervalHandle: ReturnType<typeof setInterval> | null = null;\r\n\r\n private readonly clientsById = new Map<string, SecureServerClient>();\r\n\r\n private readonly clientIdBySocket = new Map<WebSocket, string>();\r\n\r\n private readonly customEventHandlers = new Map<string, Set<SecureServerEventHandler>>();\r\n\r\n private readonly streamEventHandlers = new Map<string, Set<SecureServerStreamHandler>>();\r\n\r\n private readonly connectionHandlers = new Set<SecureServerConnectionHandler>();\r\n\r\n private readonly disconnectHandlers = new Set<SecureServerDisconnectHandler>();\r\n\r\n private readonly readyHandlers = new Set<SecureServerReadyHandler>();\r\n\r\n private readonly errorHandlers = new Set<SecureErrorHandler>();\r\n\r\n private readonly middlewareHandlers: SecureServerMiddleware[] = [];\r\n\r\n private readonly handshakeStateBySocket = new WeakMap<WebSocket, ServerHandshakeState>();\r\n\r\n private readonly middlewareMetadataBySocket = new WeakMap<\r\n WebSocket,\r\n Map<string, unknown>\r\n >();\r\n\r\n private readonly sharedSecretBySocket = new WeakMap<WebSocket, Buffer>();\r\n\r\n private readonly encryptionKeyBySocket = new WeakMap<WebSocket, Buffer>();\r\n\r\n private readonly pendingPayloadsBySocket = new WeakMap<WebSocket, SecureEnvelope[]>();\r\n\r\n private readonly incomingStreamsBySocket = new WeakMap<\r\n WebSocket,\r\n Map<string, IncomingServerStreamState>\r\n >();\r\n\r\n private readonly pendingRpcRequestsBySocket = new WeakMap<\r\n WebSocket,\r\n Map<string, PendingRpcRequest>\r\n >();\r\n\r\n private readonly heartbeatStateBySocket = new WeakMap<\r\n WebSocket,\r\n { awaitingPong: boolean; lastPingAt: number }\r\n >();\r\n\r\n private readonly roomMembersByName = new Map<string, Set<string>>();\r\n\r\n private readonly roomNamesByClientId = new Map<string, Set<string>>();\r\n\r\n private readonly clientIpByClientId = new Map<string, string>();\r\n\r\n private readonly rateLimitBucketsByClientId = new Map<\r\n string,\r\n SecureServerRateLimitBucket\r\n >();\r\n\r\n private readonly rateLimitBucketsByIp = new Map<\r\n string,\r\n SecureServerRateLimitBucket\r\n >();\r\n\r\n private readonly sessionTicketStore = new Map<string, ServerSessionTicketRecord>();\r\n\r\n public constructor(options: SecureServerOptions) {\r\n const { heartbeat, rateLimit, sessionResumption, adapter, ...socketServerOptions } = options;\r\n\r\n this.heartbeatConfig = this.resolveHeartbeatConfig(heartbeat);\r\n this.rateLimitConfig = this.resolveRateLimitConfig(rateLimit);\r\n this.sessionResumptionConfig = this.resolveSessionResumptionConfig(sessionResumption);\r\n this.socketServer = new WebSocketServer(socketServerOptions);\r\n this.bindSocketServerEvents();\r\n this.startHeartbeatLoop();\r\n\r\n if (adapter) {\r\n void this.setAdapter(adapter).catch(() => {\r\n return undefined;\r\n });\r\n }\r\n }\r\n\r\n public get clientCount(): number {\r\n return this.clientsById.size;\r\n }\r\n\r\n public get serverId(): string {\r\n return this.instanceId;\r\n }\r\n\r\n public get clients(): ReadonlyMap<string, SecureServerClient> {\r\n return this.clientsById;\r\n }\r\n\r\n public async setAdapter(adapter: SecureServerAdapter | null): Promise<void> {\r\n const previousAdapter = this.adapter;\r\n\r\n if (previousAdapter === adapter) {\r\n return;\r\n }\r\n\r\n try {\r\n if (previousAdapter?.detach) {\r\n await Promise.resolve(previousAdapter.detach(this));\r\n }\r\n\r\n this.adapter = null;\r\n\r\n if (!adapter) {\r\n return;\r\n }\r\n\r\n await Promise.resolve(adapter.attach(this));\r\n this.adapter = adapter;\r\n } catch (error) {\r\n const normalizedError = normalizeToError(\r\n error,\r\n \"Failed to set SecureServer adapter.\"\r\n );\r\n\r\n this.notifyError(normalizedError);\r\n throw normalizedError;\r\n }\r\n }\r\n\r\n public async handleAdapterMessage(message: unknown): Promise<void> {\r\n try {\r\n const normalizedMessage = normalizeSecureServerAdapterMessage(message);\r\n\r\n if (normalizedMessage.originServerId === this.instanceId) {\r\n return;\r\n }\r\n\r\n if (normalizedMessage.scope === \"broadcast\") {\r\n this.emitLocally(normalizedMessage.event, normalizedMessage.data);\r\n return;\r\n }\r\n\r\n if (!normalizedMessage.room) {\r\n return;\r\n }\r\n\r\n this.emitToRoom(\r\n normalizedMessage.room,\r\n normalizedMessage.event,\r\n normalizedMessage.data,\r\n false\r\n );\r\n } catch (error) {\r\n this.notifyError(\r\n normalizeToError(error, \"Failed to process SecureServer adapter message.\")\r\n );\r\n }\r\n }\r\n\r\n public on(event: \"connection\", handler: SecureServerConnectionHandler): this;\r\n public on(event: \"disconnect\", handler: SecureServerDisconnectHandler): this;\r\n public on(event: \"ready\", handler: SecureServerReadyHandler): this;\r\n public on(event: \"error\", handler: SecureErrorHandler): this;\r\n public on(event: string, handler: SecureServerEventHandler): this;\r\n public on(event: string, handler: unknown): this {\r\n try {\r\n if (event === \"connection\") {\r\n this.connectionHandlers.add(handler as SecureServerConnectionHandler);\r\n return this;\r\n }\r\n\r\n if (event === \"disconnect\") {\r\n this.disconnectHandlers.add(handler as SecureServerDisconnectHandler);\r\n return this;\r\n }\r\n\r\n if (event === READY_EVENT) {\r\n this.readyHandlers.add(handler as SecureServerReadyHandler);\r\n return this;\r\n }\r\n\r\n if (event === \"error\") {\r\n this.errorHandlers.add(handler as SecureErrorHandler);\r\n return this;\r\n }\r\n\r\n if (event === INTERNAL_HANDSHAKE_EVENT || event === INTERNAL_SESSION_TICKET_EVENT) {\r\n throw new Error(`The event \"${event}\" is reserved for internal use.`);\r\n }\r\n\r\n const typedHandler = handler as SecureServerEventHandler;\r\n const listeners = this.customEventHandlers.get(event) ?? new Set<SecureServerEventHandler>();\r\n listeners.add(typedHandler);\r\n this.customEventHandlers.set(event, listeners);\r\n } catch (error) {\r\n this.notifyError(\r\n normalizeToError(error, \"Failed to register server event handler.\")\r\n );\r\n }\r\n\r\n return this;\r\n }\r\n\r\n public off(event: \"connection\", handler: SecureServerConnectionHandler): this;\r\n public off(event: \"disconnect\", handler: SecureServerDisconnectHandler): this;\r\n public off(event: \"ready\", handler: SecureServerReadyHandler): this;\r\n public off(event: \"error\", handler: SecureErrorHandler): this;\r\n public off(event: string, handler: SecureServerEventHandler): this;\r\n public off(event: string, handler: unknown): this {\r\n try {\r\n if (event === \"connection\") {\r\n this.connectionHandlers.delete(handler as SecureServerConnectionHandler);\r\n return this;\r\n }\r\n\r\n if (event === \"disconnect\") {\r\n this.disconnectHandlers.delete(handler as SecureServerDisconnectHandler);\r\n return this;\r\n }\r\n\r\n if (event === READY_EVENT) {\r\n this.readyHandlers.delete(handler as SecureServerReadyHandler);\r\n return this;\r\n }\r\n\r\n if (event === \"error\") {\r\n this.errorHandlers.delete(handler as SecureErrorHandler);\r\n return this;\r\n }\r\n\r\n if (event === INTERNAL_HANDSHAKE_EVENT || event === INTERNAL_SESSION_TICKET_EVENT) {\r\n return this;\r\n }\r\n\r\n const listeners = this.customEventHandlers.get(event);\r\n\r\n if (!listeners) {\r\n return this;\r\n }\r\n\r\n listeners.delete(handler as SecureServerEventHandler);\r\n\r\n if (listeners.size === 0) {\r\n this.customEventHandlers.delete(event);\r\n }\r\n } catch (error) {\r\n this.notifyError(\r\n normalizeToError(error, \"Failed to remove server event handler.\")\r\n );\r\n }\r\n\r\n return this;\r\n }\r\n\r\n public onStream(event: string, handler: SecureServerStreamHandler): this {\r\n try {\r\n if (isReservedEmitEvent(event)) {\r\n throw new Error(`The event \"${event}\" is reserved and cannot be used as a stream event.`);\r\n }\r\n\r\n const listeners = this.streamEventHandlers.get(event) ?? new Set<SecureServerStreamHandler>();\r\n listeners.add(handler);\r\n this.streamEventHandlers.set(event, listeners);\r\n } catch (error) {\r\n this.notifyError(\r\n normalizeToError(error, \"Failed to register server stream handler.\")\r\n );\r\n }\r\n\r\n return this;\r\n }\r\n\r\n public offStream(event: string, handler: SecureServerStreamHandler): this {\r\n try {\r\n const listeners = this.streamEventHandlers.get(event);\r\n\r\n if (!listeners) {\r\n return this;\r\n }\r\n\r\n listeners.delete(handler);\r\n\r\n if (listeners.size === 0) {\r\n this.streamEventHandlers.delete(event);\r\n }\r\n } catch (error) {\r\n this.notifyError(\r\n normalizeToError(error, \"Failed to remove server stream handler.\")\r\n );\r\n }\r\n\r\n return this;\r\n }\r\n\r\n public use(middleware: SecureServerMiddleware): this {\r\n try {\r\n if (typeof middleware !== \"function\") {\r\n throw new Error(\"Server middleware must be a function.\");\r\n }\r\n\r\n this.middlewareHandlers.push(middleware);\r\n } catch (error) {\r\n this.notifyError(\r\n normalizeToError(error, \"Failed to register server middleware.\")\r\n );\r\n }\r\n\r\n return this;\r\n }\r\n\r\n public emit(event: string, data: unknown): this {\r\n try {\r\n if (isReservedEmitEvent(event)) {\r\n throw new Error(`The event \"${event}\" is reserved and cannot be emitted manually.`);\r\n }\r\n\r\n this.emitLocally(event, data);\r\n this.publishAdapterMessage({\r\n scope: \"broadcast\",\r\n event,\r\n data\r\n });\r\n } catch (error) {\r\n this.notifyError(normalizeToError(error, \"Failed to emit server event.\"));\r\n }\r\n\r\n return this;\r\n }\r\n\r\n public emitTo(clientId: string, event: string, data: unknown): boolean;\r\n public emitTo(\r\n clientId: string,\r\n event: string,\r\n data: unknown,\r\n callback: SecureAckCallback\r\n ): boolean;\r\n public emitTo(\r\n clientId: string,\r\n event: string,\r\n data: unknown,\r\n options: SecureAckOptions\r\n ): Promise<unknown>;\r\n public emitTo(\r\n clientId: string,\r\n event: string,\r\n data: unknown,\r\n options: SecureAckOptions,\r\n callback: SecureAckCallback\r\n ): boolean;\r\n public emitTo(\r\n clientId: string,\r\n event: string,\r\n data: unknown,\r\n callbackOrOptions?: SecureAckCallback | SecureAckOptions,\r\n maybeCallback?: SecureAckCallback\r\n ): boolean | Promise<unknown> {\r\n const ackArgs = resolveAckArguments(callbackOrOptions, maybeCallback);\r\n\r\n try {\r\n if (isReservedEmitEvent(event)) {\r\n throw new Error(`The event \"${event}\" is reserved and cannot be emitted manually.`);\r\n }\r\n\r\n const client = this.clientsById.get(clientId);\r\n\r\n if (!client) {\r\n throw new Error(`Client with id ${clientId} was not found.`);\r\n }\r\n\r\n if (!ackArgs.expectsAck) {\r\n void this.sendOrQueuePayload(client.socket, { event, data }).catch(() => {\r\n return undefined;\r\n });\r\n return true;\r\n }\r\n\r\n const ackPromise = this.sendRpcRequest(\r\n client.socket,\r\n event,\r\n data,\r\n ackArgs.timeoutMs\r\n );\r\n\r\n if (ackArgs.callback) {\r\n ackPromise\r\n .then((response) => {\r\n ackArgs.callback?.(null, response);\r\n })\r\n .catch((error) => {\r\n ackArgs.callback?.(\r\n normalizeToError(error, `ACK callback failed for client ${client.id}.`)\r\n );\r\n });\r\n\r\n return true;\r\n }\r\n\r\n return ackPromise;\r\n } catch (error) {\r\n const normalizedError = normalizeToError(error, \"Failed to emit event to client.\");\r\n this.notifyError(normalizedError);\r\n\r\n if (ackArgs.callback) {\r\n ackArgs.callback(normalizedError);\r\n return false;\r\n }\r\n\r\n if (ackArgs.expectsAck) {\r\n return Promise.reject(normalizedError);\r\n }\r\n\r\n return false;\r\n }\r\n }\r\n\r\n public async emitStreamTo(\r\n clientId: string,\r\n event: string,\r\n source: SecureChunkedStreamSource,\r\n options?: SecureChunkedStreamOptions\r\n ): Promise<SecureStreamSendResult> {\r\n try {\r\n if (isReservedEmitEvent(event)) {\r\n throw new Error(`The event \"${event}\" is reserved and cannot be emitted manually.`);\r\n }\r\n\r\n const client = this.clientsById.get(clientId);\r\n\r\n if (!client) {\r\n throw new Error(`Client with id ${clientId} was not found.`);\r\n }\r\n\r\n if (!this.isClientHandshakeReady(client.socket)) {\r\n throw new Error(\r\n `Cannot stream event \"${event}\" before secure handshake completion for client ${client.id}.`\r\n );\r\n }\r\n\r\n return await transmitChunkedStreamFrames(\r\n event,\r\n source,\r\n options,\r\n async (framePayload) => {\r\n await this.sendEncryptedEnvelope(client.socket, {\r\n event: INTERNAL_STREAM_FRAME_EVENT,\r\n data: framePayload\r\n });\r\n }\r\n );\r\n } catch (error) {\r\n const normalizedError = normalizeToError(\r\n error,\r\n `Failed to emit chunked stream event \"${event}\" to client ${clientId}.`\r\n );\r\n\r\n this.notifyError(normalizedError);\r\n throw normalizedError;\r\n }\r\n }\r\n\r\n public to(room: string): SecureServerRoomOperator {\r\n const normalizedRoom = this.normalizeRoomName(room);\r\n\r\n return {\r\n emit: (event: string, data: unknown): SecureServer => {\r\n try {\r\n this.emitToRoom(normalizedRoom, event, data, true);\r\n } catch (error) {\r\n this.notifyError(\r\n normalizeToError(error, `Failed to emit event to room ${normalizedRoom}.`)\r\n );\r\n }\r\n\r\n return this;\r\n }\r\n };\r\n }\r\n\r\n public close(\r\n code: number = DEFAULT_CLOSE_CODE,\r\n reason: string = DEFAULT_CLOSE_REASON\r\n ): void {\r\n try {\r\n this.stopHeartbeatLoop();\r\n\r\n const activeAdapter = this.adapter;\r\n this.adapter = null;\r\n\r\n if (activeAdapter?.detach) {\r\n void Promise.resolve(activeAdapter.detach(this)).catch((error) => {\r\n this.notifyError(\r\n normalizeToError(error, \"Failed to detach SecureServer adapter during close.\")\r\n );\r\n });\r\n }\r\n\r\n for (const client of this.clientsById.values()) {\r\n this.rejectPendingRpcRequests(\r\n client.socket,\r\n new Error(\"Server closed before ACK response was received.\")\r\n );\r\n this.cleanupIncomingStreamsForSocket(\r\n client.socket,\r\n \"Server closed before stream transfer completed.\"\r\n );\r\n this.middlewareMetadataBySocket.delete(client.socket);\r\n\r\n if (\r\n client.socket.readyState === WebSocket.OPEN ||\r\n client.socket.readyState === WebSocket.CONNECTING\r\n ) {\r\n client.socket.close(code, reason);\r\n }\r\n }\r\n\r\n this.rateLimitBucketsByClientId.clear();\r\n this.rateLimitBucketsByIp.clear();\r\n this.clientIpByClientId.clear();\r\n this.sessionTicketStore.clear();\r\n\r\n this.socketServer.close();\r\n } catch (error) {\r\n this.notifyError(normalizeToError(error, \"Failed to close server.\"));\r\n }\r\n }\r\n\r\n private resolveHeartbeatConfig(\r\n heartbeatOptions: SecureServerHeartbeatOptions | undefined\r\n ): Required<SecureServerHeartbeatOptions> {\r\n const intervalMs = heartbeatOptions?.intervalMs ?? DEFAULT_HEARTBEAT_INTERVAL_MS;\r\n const timeoutMs = heartbeatOptions?.timeoutMs ?? DEFAULT_HEARTBEAT_TIMEOUT_MS;\r\n\r\n if (!Number.isFinite(intervalMs) || intervalMs <= 0) {\r\n throw new Error(\"Server heartbeat intervalMs must be a positive number.\");\r\n }\r\n\r\n if (!Number.isFinite(timeoutMs) || timeoutMs <= 0) {\r\n throw new Error(\"Server heartbeat timeoutMs must be a positive number.\");\r\n }\r\n\r\n return {\r\n enabled: heartbeatOptions?.enabled ?? true,\r\n intervalMs,\r\n timeoutMs\r\n };\r\n }\r\n\r\n private resolveRateLimitConfig(\r\n rateLimitOptions: SecureServerRateLimitOptions | undefined\r\n ): Required<SecureServerRateLimitOptions> {\r\n const windowMs = rateLimitOptions?.windowMs ?? DEFAULT_RATE_LIMIT_WINDOW_MS;\r\n const maxEventsPerConnection =\r\n rateLimitOptions?.maxEventsPerConnection ??\r\n DEFAULT_RATE_LIMIT_MAX_EVENTS_PER_CONNECTION;\r\n const maxEventsPerIp =\r\n rateLimitOptions?.maxEventsPerIp ?? DEFAULT_RATE_LIMIT_MAX_EVENTS_PER_IP;\r\n const action = rateLimitOptions?.action ?? \"throttle\";\r\n const throttleMs = rateLimitOptions?.throttleMs ?? DEFAULT_RATE_LIMIT_THROTTLE_MS;\r\n const maxThrottleMs =\r\n rateLimitOptions?.maxThrottleMs ?? DEFAULT_RATE_LIMIT_MAX_THROTTLE_MS;\r\n const disconnectAfterViolations =\r\n rateLimitOptions?.disconnectAfterViolations ??\r\n DEFAULT_RATE_LIMIT_DISCONNECT_AFTER_VIOLATIONS;\r\n const disconnectCode =\r\n rateLimitOptions?.disconnectCode ?? DEFAULT_RATE_LIMIT_CLOSE_CODE;\r\n const disconnectReason =\r\n rateLimitOptions?.disconnectReason ?? DEFAULT_RATE_LIMIT_CLOSE_REASON;\r\n\r\n if (!Number.isFinite(windowMs) || windowMs <= 0) {\r\n throw new Error(\"Server rateLimit windowMs must be a positive number.\");\r\n }\r\n\r\n if (!Number.isFinite(maxEventsPerConnection) || maxEventsPerConnection <= 0) {\r\n throw new Error(\r\n \"Server rateLimit maxEventsPerConnection must be a positive number.\"\r\n );\r\n }\r\n\r\n if (!Number.isFinite(maxEventsPerIp) || maxEventsPerIp <= 0) {\r\n throw new Error(\"Server rateLimit maxEventsPerIp must be a positive number.\");\r\n }\r\n\r\n if (action !== \"throttle\" && action !== \"disconnect\") {\r\n throw new Error('Server rateLimit action must be either \"throttle\" or \"disconnect\".');\r\n }\r\n\r\n if (!Number.isFinite(throttleMs) || throttleMs <= 0) {\r\n throw new Error(\"Server rateLimit throttleMs must be a positive number.\");\r\n }\r\n\r\n if (!Number.isFinite(maxThrottleMs) || maxThrottleMs <= 0) {\r\n throw new Error(\"Server rateLimit maxThrottleMs must be a positive number.\");\r\n }\r\n\r\n if (maxThrottleMs < throttleMs) {\r\n throw new Error(\r\n \"Server rateLimit maxThrottleMs must be greater than or equal to throttleMs.\"\r\n );\r\n }\r\n\r\n if (\r\n !Number.isInteger(disconnectAfterViolations) ||\r\n disconnectAfterViolations <= 0\r\n ) {\r\n throw new Error(\r\n \"Server rateLimit disconnectAfterViolations must be a positive integer.\"\r\n );\r\n }\r\n\r\n if (!Number.isInteger(disconnectCode) || disconnectCode < 1000 || disconnectCode > 4999) {\r\n throw new Error(\"Server rateLimit disconnectCode must be a valid WebSocket close code.\");\r\n }\r\n\r\n return {\r\n enabled: rateLimitOptions?.enabled ?? true,\r\n windowMs,\r\n maxEventsPerConnection,\r\n maxEventsPerIp,\r\n action,\r\n throttleMs,\r\n maxThrottleMs,\r\n disconnectAfterViolations,\r\n disconnectCode,\r\n disconnectReason\r\n };\r\n }\r\n\r\n private resolveSessionResumptionConfig(\r\n sessionResumptionOptions: SecureServerSessionResumptionOptions | undefined\r\n ): Required<SecureServerSessionResumptionOptions> {\r\n const ticketTtlMs =\r\n sessionResumptionOptions?.ticketTtlMs ?? DEFAULT_SESSION_TICKET_TTL_MS;\r\n const maxCachedTickets =\r\n sessionResumptionOptions?.maxCachedTickets ??\r\n DEFAULT_SESSION_TICKET_MAX_CACHE_SIZE;\r\n\r\n if (!Number.isFinite(ticketTtlMs) || ticketTtlMs <= 0) {\r\n throw new Error(\r\n \"Server sessionResumption ticketTtlMs must be a positive number.\"\r\n );\r\n }\r\n\r\n if (!Number.isInteger(maxCachedTickets) || maxCachedTickets <= 0) {\r\n throw new Error(\r\n \"Server sessionResumption maxCachedTickets must be a positive integer.\"\r\n );\r\n }\r\n\r\n return {\r\n enabled:\r\n sessionResumptionOptions?.enabled ?? DEFAULT_SESSION_RESUMPTION_ENABLED,\r\n ticketTtlMs,\r\n maxCachedTickets\r\n };\r\n }\r\n\r\n private pruneExpiredSessionTickets(now: number): void {\r\n for (const [sessionId, ticketRecord] of this.sessionTicketStore.entries()) {\r\n if (ticketRecord.expiresAt <= now) {\r\n this.sessionTicketStore.delete(sessionId);\r\n }\r\n }\r\n }\r\n\r\n private evictSessionTicketsIfNeeded(): void {\r\n while (this.sessionTicketStore.size > this.sessionResumptionConfig.maxCachedTickets) {\r\n let oldestSessionId: string | null = null;\r\n let oldestIssuedAt = Number.POSITIVE_INFINITY;\r\n\r\n for (const [sessionId, ticketRecord] of this.sessionTicketStore.entries()) {\r\n if (ticketRecord.issuedAt < oldestIssuedAt) {\r\n oldestIssuedAt = ticketRecord.issuedAt;\r\n oldestSessionId = sessionId;\r\n }\r\n }\r\n\r\n if (!oldestSessionId) {\r\n break;\r\n }\r\n\r\n this.sessionTicketStore.delete(oldestSessionId);\r\n }\r\n }\r\n\r\n private getSessionTicket(sessionId: string): ServerSessionTicketRecord | null {\r\n const now = Date.now();\r\n this.pruneExpiredSessionTickets(now);\r\n\r\n const ticketRecord = this.sessionTicketStore.get(sessionId);\r\n\r\n if (!ticketRecord) {\r\n return null;\r\n }\r\n\r\n if (ticketRecord.expiresAt <= now) {\r\n this.sessionTicketStore.delete(sessionId);\r\n return null;\r\n }\r\n\r\n return ticketRecord;\r\n }\r\n\r\n private issueSessionTicket(socket: WebSocket, baseKey: Buffer): void {\r\n if (!this.sessionResumptionConfig.enabled) {\r\n return;\r\n }\r\n\r\n const now = Date.now();\r\n this.pruneExpiredSessionTickets(now);\r\n\r\n const sessionId = randomUUID();\r\n const sessionSecret = deriveSessionTicketSecret(baseKey);\r\n const expiresAt = now + this.sessionResumptionConfig.ticketTtlMs;\r\n\r\n const ticketRecord: ServerSessionTicketRecord = {\r\n sessionId,\r\n secret: sessionSecret,\r\n issuedAt: now,\r\n expiresAt\r\n };\r\n\r\n this.sessionTicketStore.set(sessionId, ticketRecord);\r\n this.evictSessionTicketsIfNeeded();\r\n\r\n const ticketPayload: SessionTicketPayload = {\r\n version: SESSION_TICKET_VERSION,\r\n sessionId,\r\n secret: sessionSecret.toString(\"base64\"),\r\n issuedAt: now,\r\n expiresAt\r\n };\r\n\r\n void this.sendOrQueuePayload(socket, {\r\n event: INTERNAL_SESSION_TICKET_EVENT,\r\n data: ticketPayload\r\n }).catch((error) => {\r\n this.notifyError(\r\n normalizeToError(error, \"Failed to deliver secure session ticket.\")\r\n );\r\n });\r\n }\r\n\r\n private createRateLimitBucket(now: number): SecureServerRateLimitBucket {\r\n return {\r\n windowStartedAt: now,\r\n count: 0,\r\n violationCount: 0,\r\n throttleUntil: 0,\r\n lastSeenAt: now\r\n };\r\n }\r\n\r\n private getOrCreateRateLimitBucket(\r\n map: Map<string, SecureServerRateLimitBucket>,\r\n key: string,\r\n now: number\r\n ): SecureServerRateLimitBucket {\r\n const existingBucket = map.get(key);\r\n\r\n if (existingBucket) {\r\n return existingBucket;\r\n }\r\n\r\n const bucket = this.createRateLimitBucket(now);\r\n map.set(key, bucket);\r\n return bucket;\r\n }\r\n\r\n private updateRateLimitBucket(bucket: SecureServerRateLimitBucket, now: number): void {\r\n if (now - bucket.windowStartedAt >= this.rateLimitConfig.windowMs) {\r\n bucket.windowStartedAt = now;\r\n bucket.count = 0;\r\n bucket.violationCount = 0;\r\n bucket.throttleUntil = 0;\r\n }\r\n\r\n bucket.count += 1;\r\n bucket.lastSeenAt = now;\r\n }\r\n\r\n private pruneRateLimitBucketMap(\r\n map: Map<string, SecureServerRateLimitBucket>,\r\n now: number,\r\n maxIdleMs: number\r\n ): void {\r\n for (const [key, bucket] of map.entries()) {\r\n if (now - bucket.lastSeenAt >= maxIdleMs) {\r\n map.delete(key);\r\n }\r\n }\r\n }\r\n\r\n private pruneRateLimitBuckets(now: number): void {\r\n const maxIdleMs = this.rateLimitConfig.windowMs * 4;\r\n this.pruneRateLimitBucketMap(this.rateLimitBucketsByClientId, now, maxIdleMs);\r\n this.pruneRateLimitBucketMap(this.rateLimitBucketsByIp, now, maxIdleMs);\r\n }\r\n\r\n private normalizeIpAddress(ipAddress: string): string {\r\n let normalized = ipAddress.trim().toLowerCase();\r\n\r\n if (normalized.startsWith(\"::ffff:\")) {\r\n normalized = normalized.slice(7);\r\n }\r\n\r\n if (normalized.startsWith(\"[\") && normalized.endsWith(\"]\")) {\r\n normalized = normalized.slice(1, -1);\r\n }\r\n\r\n const zoneIndex = normalized.indexOf(\"%\");\r\n\r\n if (zoneIndex >= 0) {\r\n normalized = normalized.slice(0, zoneIndex);\r\n }\r\n\r\n return normalized.length > 0 ? normalized : \"unknown\";\r\n }\r\n\r\n private resolveClientIp(request: IncomingMessage): string {\r\n const forwardedHeader = request.headers[\"x-forwarded-for\"];\r\n const forwardedValue = Array.isArray(forwardedHeader)\r\n ? forwardedHeader[0]\r\n : forwardedHeader;\r\n\r\n if (typeof forwardedValue === \"string\") {\r\n const firstForwardedIp = forwardedValue\r\n .split(\",\")\r\n .map((item) => item.trim())\r\n .find((item) => item.length > 0);\r\n\r\n if (firstForwardedIp) {\r\n return this.normalizeIpAddress(firstForwardedIp);\r\n }\r\n }\r\n\r\n return this.normalizeIpAddress(request.socket.remoteAddress ?? \"unknown\");\r\n }\r\n\r\n private isIpStillConnected(ipAddress: string): boolean {\r\n for (const connectedIp of this.clientIpByClientId.values()) {\r\n if (connectedIp === ipAddress) {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private evaluateIncomingRateLimit(\r\n client: SecureServerClient\r\n ): SecureServerRateLimitDecision {\r\n const noLimitDecision: SecureServerRateLimitDecision = {\r\n shouldDisconnect: false,\r\n shouldDrop: false,\r\n throttleDelayMs: 0\r\n };\r\n\r\n if (!this.rateLimitConfig.enabled) {\r\n return noLimitDecision;\r\n }\r\n\r\n const now = Date.now();\r\n const clientBucket = this.getOrCreateRateLimitBucket(\r\n this.rateLimitBucketsByClientId,\r\n client.id,\r\n now\r\n );\r\n\r\n this.updateRateLimitBucket(clientBucket, now);\r\n\r\n const clientIp = this.clientIpByClientId.get(client.id);\r\n const ipBucket = clientIp\r\n ? this.getOrCreateRateLimitBucket(this.rateLimitBucketsByIp, clientIp, now)\r\n : null;\r\n\r\n if (ipBucket) {\r\n this.updateRateLimitBucket(ipBucket, now);\r\n }\r\n\r\n const activeThrottleUntil = Math.max(\r\n clientBucket.throttleUntil,\r\n ipBucket?.throttleUntil ?? 0\r\n );\r\n\r\n if (activeThrottleUntil > now) {\r\n return {\r\n shouldDisconnect: false,\r\n shouldDrop: true,\r\n throttleDelayMs: 0\r\n };\r\n }\r\n\r\n const isConnectionLimitExceeded =\r\n clientBucket.count > this.rateLimitConfig.maxEventsPerConnection;\r\n const isIpLimitExceeded = ipBucket\r\n ? ipBucket.count > this.rateLimitConfig.maxEventsPerIp\r\n : false;\r\n\r\n if (!isConnectionLimitExceeded && !isIpLimitExceeded) {\r\n if (\r\n this.rateLimitBucketsByClientId.size > 1_024 ||\r\n this.rateLimitBucketsByIp.size > 1_024\r\n ) {\r\n this.pruneRateLimitBuckets(now);\r\n }\r\n\r\n return noLimitDecision;\r\n }\r\n\r\n if (isConnectionLimitExceeded) {\r\n clientBucket.violationCount += 1;\r\n }\r\n\r\n if (ipBucket && isIpLimitExceeded) {\r\n ipBucket.violationCount += 1;\r\n }\r\n\r\n const violationCount = Math.max(\r\n clientBucket.violationCount,\r\n ipBucket?.violationCount ?? 0\r\n );\r\n\r\n const shouldDisconnect =\r\n this.rateLimitConfig.action === \"disconnect\" ||\r\n violationCount >= this.rateLimitConfig.disconnectAfterViolations;\r\n\r\n if (shouldDisconnect) {\r\n return {\r\n shouldDisconnect: true,\r\n shouldDrop: true,\r\n throttleDelayMs: 0\r\n };\r\n }\r\n\r\n const throttleDelayMs = Math.min(\r\n this.rateLimitConfig.maxThrottleMs,\r\n Math.max(\r\n this.rateLimitConfig.throttleMs,\r\n this.rateLimitConfig.throttleMs * violationCount\r\n )\r\n );\r\n\r\n const throttleUntil = now + throttleDelayMs;\r\n clientBucket.throttleUntil = throttleUntil;\r\n\r\n if (ipBucket) {\r\n ipBucket.throttleUntil = throttleUntil;\r\n }\r\n\r\n return {\r\n shouldDisconnect: false,\r\n shouldDrop: false,\r\n throttleDelayMs\r\n };\r\n }\r\n\r\n private startHeartbeatLoop(): void {\r\n if (!this.heartbeatConfig.enabled || this.heartbeatIntervalHandle) {\r\n return;\r\n }\r\n\r\n this.heartbeatIntervalHandle = setInterval(() => {\r\n this.performHeartbeatSweep();\r\n }, this.heartbeatConfig.intervalMs);\r\n\r\n this.heartbeatIntervalHandle.unref?.();\r\n }\r\n\r\n private stopHeartbeatLoop(): void {\r\n if (!this.heartbeatIntervalHandle) {\r\n return;\r\n }\r\n\r\n clearInterval(this.heartbeatIntervalHandle);\r\n this.heartbeatIntervalHandle = null;\r\n }\r\n\r\n private performHeartbeatSweep(): void {\r\n const now = Date.now();\r\n\r\n for (const client of this.clientsById.values()) {\r\n const socket = client.socket;\r\n\r\n if (socket.readyState !== WebSocket.OPEN) {\r\n continue;\r\n }\r\n\r\n const heartbeatState = this.heartbeatStateBySocket.get(socket) ?? {\r\n awaitingPong: false,\r\n lastPingAt: 0\r\n };\r\n\r\n if (\r\n heartbeatState.awaitingPong &&\r\n now - heartbeatState.lastPingAt >= this.heartbeatConfig.timeoutMs\r\n ) {\r\n this.rejectPendingRpcRequests(\r\n socket,\r\n new Error(`Heartbeat timeout while waiting for client ${client.id} ACK response.`)\r\n );\r\n this.sharedSecretBySocket.delete(socket);\r\n this.encryptionKeyBySocket.delete(socket);\r\n this.pendingPayloadsBySocket.delete(socket);\r\n this.pendingRpcRequestsBySocket.delete(socket);\r\n this.handshakeStateBySocket.delete(socket);\r\n this.heartbeatStateBySocket.delete(socket);\r\n this.middlewareMetadataBySocket.delete(socket);\r\n socket.terminate();\r\n continue;\r\n }\r\n\r\n if (heartbeatState.awaitingPong) {\r\n continue;\r\n }\r\n\r\n heartbeatState.awaitingPong = true;\r\n heartbeatState.lastPingAt = now;\r\n this.heartbeatStateBySocket.set(socket, heartbeatState);\r\n\r\n try {\r\n socket.ping();\r\n } catch (error) {\r\n this.notifyError(\r\n normalizeToError(error, `Failed to send heartbeat ping to client ${client.id}.`)\r\n );\r\n }\r\n }\r\n }\r\n\r\n private handleHeartbeatPong(socket: WebSocket): void {\r\n const heartbeatState = this.heartbeatStateBySocket.get(socket);\r\n\r\n if (!heartbeatState) {\r\n return;\r\n }\r\n\r\n heartbeatState.awaitingPong = false;\r\n heartbeatState.lastPingAt = 0;\r\n this.heartbeatStateBySocket.set(socket, heartbeatState);\r\n }\r\n\r\n private bindSocketServerEvents(): void {\r\n this.socketServer.on(\"connection\", (socket: WebSocket, request: IncomingMessage) => {\r\n void this.handleConnection(socket, request);\r\n });\r\n\r\n this.socketServer.on(\"error\", (error: Error) => {\r\n this.notifyError(normalizeToError(error, \"WebSocket server encountered an error.\"));\r\n });\r\n }\r\n\r\n private async handleConnection(socket: WebSocket, request: IncomingMessage): Promise<void> {\r\n const connectionMetadata = new Map<string, unknown>();\r\n this.middlewareMetadataBySocket.set(socket, connectionMetadata);\r\n\r\n try {\r\n await this.executeServerMiddleware({\r\n phase: \"connection\",\r\n socket,\r\n request,\r\n metadata: connectionMetadata\r\n });\r\n } catch (error) {\r\n const normalizedError = normalizeToError(\r\n error,\r\n \"Connection middleware rejected the incoming socket.\"\r\n );\r\n\r\n this.notifyError(normalizedError);\r\n this.middlewareMetadataBySocket.delete(socket);\r\n\r\n if (\r\n socket.readyState === WebSocket.OPEN ||\r\n socket.readyState === WebSocket.CONNECTING\r\n ) {\r\n socket.close(\r\n POLICY_VIOLATION_CLOSE_CODE,\r\n normalizedError.message || POLICY_VIOLATION_CLOSE_REASON\r\n );\r\n }\r\n\r\n return;\r\n }\r\n\r\n try {\r\n const clientId = randomUUID();\r\n const handshakeState = this.createServerHandshakeState();\r\n const clientIp = this.resolveClientIp(request);\r\n\r\n connectionMetadata.set(\"network.ip\", clientIp);\r\n\r\n const client = this.createSecureServerClient(\r\n clientId,\r\n socket,\r\n request,\r\n connectionMetadata\r\n );\r\n\r\n this.clientsById.set(clientId, client);\r\n this.clientIdBySocket.set(socket, clientId);\r\n this.clientIpByClientId.set(clientId, clientIp);\r\n this.handshakeStateBySocket.set(socket, handshakeState);\r\n this.pendingPayloadsBySocket.set(socket, []);\r\n this.pendingRpcRequestsBySocket.set(socket, new Map<string, PendingRpcRequest>());\r\n this.heartbeatStateBySocket.set(socket, {\r\n awaitingPong: false,\r\n lastPingAt: 0\r\n });\r\n this.roomNamesByClientId.set(clientId, new Set<string>());\r\n\r\n socket.on(\"message\", (rawData: RawData) => {\r\n void this.handleIncomingMessage(client, rawData);\r\n });\r\n\r\n socket.on(\"close\", (code: number, reason: Buffer) => {\r\n this.handleDisconnection(client, code, reason);\r\n });\r\n\r\n socket.on(\"pong\", () => {\r\n this.handleHeartbeatPong(client.socket);\r\n });\r\n\r\n socket.on(\"error\", (error: Error) => {\r\n this.notifyError(\r\n normalizeToError(\r\n error,\r\n `Client socket error detected for client ${client.id}.`\r\n )\r\n );\r\n });\r\n\r\n this.sendInternalHandshake(socket, handshakeState.localPublicKey);\r\n this.notifyConnection(client);\r\n } catch (error) {\r\n this.notifyError(normalizeToError(error, \"Failed to handle client connection.\"));\r\n this.middlewareMetadataBySocket.delete(socket);\r\n }\r\n }\r\n\r\n private async handleIncomingMessage(\r\n client: SecureServerClient,\r\n rawData: RawData\r\n ): Promise<void> {\r\n try {\r\n const rateLimitDecision = this.evaluateIncomingRateLimit(client);\r\n\r\n if (rateLimitDecision.shouldDisconnect) {\r\n this.notifyError(\r\n new Error(\r\n `Rate limit disconnect triggered for client ${client.id}.`\r\n )\r\n );\r\n\r\n if (\r\n client.socket.readyState === WebSocket.OPEN ||\r\n client.socket.readyState === WebSocket.CONNECTING\r\n ) {\r\n client.socket.close(\r\n this.rateLimitConfig.disconnectCode,\r\n this.rateLimitConfig.disconnectReason\r\n );\r\n }\r\n\r\n return;\r\n }\r\n\r\n if (rateLimitDecision.shouldDrop) {\r\n return;\r\n }\r\n\r\n if (rateLimitDecision.throttleDelayMs > 0) {\r\n this.notifyError(\r\n new Error(\r\n `Rate limit throttle applied to client ${client.id} for ${rateLimitDecision.throttleDelayMs}ms.`\r\n )\r\n );\r\n\r\n await delay(rateLimitDecision.throttleDelayMs);\r\n\r\n if (client.socket.readyState !== WebSocket.OPEN) {\r\n return;\r\n }\r\n }\r\n\r\n let envelope: SecureEnvelope | null = null;\r\n\r\n try {\r\n envelope = parseEnvelope(rawData);\r\n } catch {\r\n envelope = null;\r\n }\r\n\r\n if (envelope?.event === INTERNAL_HANDSHAKE_EVENT) {\r\n this.handleInternalHandshake(client, envelope.data);\r\n return;\r\n }\r\n\r\n if (envelope !== null) {\r\n this.notifyError(\r\n new Error(\r\n `Plaintext event \"${envelope.event}\" was rejected for client ${client.id}.`\r\n )\r\n );\r\n return;\r\n }\r\n\r\n if (!this.isClientHandshakeReady(client.socket)) {\r\n this.notifyError(\r\n new Error(`Encrypted payload was received before handshake completion for client ${client.id}.`)\r\n );\r\n return;\r\n }\r\n\r\n const encryptionKey = this.encryptionKeyBySocket.get(client.socket);\r\n\r\n if (!encryptionKey) {\r\n this.notifyError(new Error(`Missing encryption key for client ${client.id}.`));\r\n return;\r\n }\r\n\r\n let decryptedPayload: string;\r\n\r\n try {\r\n decryptedPayload = decryptSerializedEnvelope(rawData, encryptionKey);\r\n } catch {\r\n console.warn(\"Tampered data detected and dropped\");\r\n return;\r\n }\r\n\r\n const decryptedEnvelope = parseEnvelopeFromText(decryptedPayload);\r\n\r\n if (decryptedEnvelope.event === INTERNAL_RPC_RESPONSE_EVENT) {\r\n this.handleRpcResponse(client.socket, decryptedEnvelope.data);\r\n return;\r\n }\r\n\r\n if (decryptedEnvelope.event === INTERNAL_RPC_REQUEST_EVENT) {\r\n await this.handleRpcRequest(client, decryptedEnvelope.data);\r\n return;\r\n }\r\n\r\n if (decryptedEnvelope.event === INTERNAL_STREAM_FRAME_EVENT) {\r\n this.handleIncomingStreamFrame(client, decryptedEnvelope.data);\r\n return;\r\n }\r\n\r\n if (decryptedEnvelope.event === INTERNAL_SESSION_TICKET_EVENT) {\r\n this.notifyError(\r\n new Error(\r\n `Client ${client.id} attempted to send reserved internal session ticket event.`\r\n )\r\n );\r\n return;\r\n }\r\n\r\n const interceptedData = await this.applyMessageMiddleware(\r\n \"incoming\",\r\n client,\r\n decryptedEnvelope.event,\r\n decryptedEnvelope.data\r\n );\r\n\r\n this.dispatchCustomEvent(decryptedEnvelope.event, interceptedData, client);\r\n } catch (error) {\r\n this.notifyError(normalizeToError(error, \"Failed to process incoming server message.\"));\r\n }\r\n }\r\n\r\n private handleDisconnection(client: SecureServerClient, code: number, reason: Buffer): void {\r\n try {\r\n client.leaveAll();\r\n this.clientsById.delete(client.id);\r\n this.clientIdBySocket.delete(client.socket);\r\n\r\n const disconnectedIp = this.clientIpByClientId.get(client.id);\r\n\r\n this.clientIpByClientId.delete(client.id);\r\n this.rateLimitBucketsByClientId.delete(client.id);\r\n\r\n if (disconnectedIp && !this.isIpStillConnected(disconnectedIp)) {\r\n this.rateLimitBucketsByIp.delete(disconnectedIp);\r\n }\r\n\r\n this.handshakeStateBySocket.delete(client.socket);\r\n this.sharedSecretBySocket.delete(client.socket);\r\n this.encryptionKeyBySocket.delete(client.socket);\r\n this.pendingPayloadsBySocket.delete(client.socket);\r\n this.rejectPendingRpcRequests(\r\n client.socket,\r\n new Error(`Client ${client.id} disconnected before ACK response was received.`)\r\n );\r\n this.pendingRpcRequestsBySocket.delete(client.socket);\r\n this.heartbeatStateBySocket.delete(client.socket);\r\n this.middlewareMetadataBySocket.delete(client.socket);\r\n this.cleanupIncomingStreamsForSocket(\r\n client.socket,\r\n `Client ${client.id} disconnected before stream transfer completed.`\r\n );\r\n\r\n const decodedReason = decodeCloseReason(reason);\r\n\r\n for (const handler of this.disconnectHandlers) {\r\n try {\r\n handler(client, code, decodedReason);\r\n } catch (handlerError) {\r\n this.notifyError(\r\n normalizeToError(\r\n handlerError,\r\n `Disconnect handler failed for client ${client.id}.`\r\n )\r\n );\r\n }\r\n }\r\n } catch (error) {\r\n this.notifyError(normalizeToError(error, \"Failed to process client disconnection.\"));\r\n }\r\n }\r\n\r\n private dispatchCustomEvent(\r\n event: string,\r\n data: unknown,\r\n client: SecureServerClient\r\n ): void {\r\n const handlers = this.customEventHandlers.get(event);\r\n\r\n if (!handlers || handlers.size === 0) {\r\n return;\r\n }\r\n\r\n for (const handler of handlers) {\r\n try {\r\n const handlerResult = handler(data, client);\r\n\r\n if (isPromiseLike(handlerResult)) {\r\n void Promise.resolve(handlerResult).catch((error) => {\r\n this.notifyError(\r\n normalizeToError(\r\n error,\r\n `Server event handler failed for event ${event}.`\r\n )\r\n );\r\n });\r\n }\r\n } catch (error) {\r\n this.notifyError(\r\n normalizeToError(\r\n error,\r\n `Server event handler failed for event ${event}.`\r\n )\r\n );\r\n }\r\n }\r\n }\r\n\r\n private getOrCreateIncomingServerStreams(\r\n socket: WebSocket\r\n ): Map<string, IncomingServerStreamState> {\r\n const existingStreams = this.incomingStreamsBySocket.get(socket);\r\n\r\n if (existingStreams) {\r\n return existingStreams;\r\n }\r\n\r\n const streamMap = new Map<string, IncomingServerStreamState>();\r\n this.incomingStreamsBySocket.set(socket, streamMap);\r\n return streamMap;\r\n }\r\n\r\n private cleanupIncomingStreamsForSocket(socket: WebSocket, reason: string): void {\r\n const streamMap = this.incomingStreamsBySocket.get(socket);\r\n\r\n if (!streamMap) {\r\n return;\r\n }\r\n\r\n for (const streamState of streamMap.values()) {\r\n streamState.stream.destroy(new Error(reason));\r\n }\r\n\r\n streamMap.clear();\r\n this.incomingStreamsBySocket.delete(socket);\r\n }\r\n\r\n private abortIncomingServerStream(\r\n socket: WebSocket,\r\n streamId: string,\r\n reason: string\r\n ): void {\r\n const streamMap = this.incomingStreamsBySocket.get(socket);\r\n\r\n if (!streamMap) {\r\n return;\r\n }\r\n\r\n const streamState = streamMap.get(streamId);\r\n\r\n if (!streamState) {\r\n return;\r\n }\r\n\r\n streamState.stream.destroy(new Error(reason));\r\n streamMap.delete(streamId);\r\n\r\n if (streamMap.size === 0) {\r\n this.incomingStreamsBySocket.delete(socket);\r\n }\r\n }\r\n\r\n private dispatchServerStreamEvent(\r\n event: string,\r\n stream: Readable,\r\n info: SecureIncomingStreamInfo,\r\n client: SecureServerClient\r\n ): void {\r\n const handlers = this.streamEventHandlers.get(event);\r\n\r\n if (!handlers || handlers.size === 0) {\r\n stream.resume();\r\n this.notifyError(\r\n new Error(\r\n `No stream handler is registered for event \"${event}\" on server client ${client.id}.`\r\n )\r\n );\r\n return;\r\n }\r\n\r\n for (const handler of handlers) {\r\n try {\r\n const handlerResult = handler(stream, info, client);\r\n\r\n if (isPromiseLike(handlerResult)) {\r\n void Promise.resolve(handlerResult).catch((error) => {\r\n this.notifyError(\r\n normalizeToError(\r\n error,\r\n `Server stream handler failed for event ${event}.`\r\n )\r\n );\r\n });\r\n }\r\n } catch (error) {\r\n this.notifyError(\r\n normalizeToError(\r\n error,\r\n `Server stream handler failed for event ${event}.`\r\n )\r\n );\r\n }\r\n }\r\n }\r\n\r\n private handleIncomingStreamStartFrame(\r\n client: SecureServerClient,\r\n framePayload: StreamFrameStartPayload\r\n ): void {\r\n if (isReservedEmitEvent(framePayload.event)) {\r\n throw new Error(\r\n `Reserved event \"${framePayload.event}\" cannot be used for stream transport.`\r\n );\r\n }\r\n\r\n const incomingStreams = this.getOrCreateIncomingServerStreams(client.socket);\r\n\r\n if (incomingStreams.has(framePayload.streamId)) {\r\n throw new Error(\r\n `Stream ${framePayload.streamId} already exists for client ${client.id}.`\r\n );\r\n }\r\n\r\n const stream = new PassThrough();\r\n const streamInfo: SecureIncomingStreamInfo = {\r\n streamId: framePayload.streamId,\r\n event: framePayload.event,\r\n startedAt: Date.now(),\r\n ...(framePayload.metadata !== undefined ? { metadata: framePayload.metadata } : {}),\r\n ...(framePayload.totalBytes !== undefined ? { totalBytes: framePayload.totalBytes } : {})\r\n };\r\n\r\n incomingStreams.set(framePayload.streamId, {\r\n info: streamInfo,\r\n stream,\r\n expectedChunkIndex: 0,\r\n receivedBytes: 0\r\n });\r\n\r\n this.dispatchServerStreamEvent(framePayload.event, stream, streamInfo, client);\r\n }\r\n\r\n private handleIncomingStreamChunkFrame(\r\n client: SecureServerClient,\r\n framePayload: StreamFrameChunkPayload\r\n ): void {\r\n const incomingStreams = this.incomingStreamsBySocket.get(client.socket);\r\n const streamState = incomingStreams?.get(framePayload.streamId);\r\n\r\n if (!incomingStreams || !streamState) {\r\n throw new Error(\r\n `Stream ${framePayload.streamId} is unknown for client ${client.id}.`\r\n );\r\n }\r\n\r\n if (framePayload.index !== streamState.expectedChunkIndex) {\r\n throw new Error(\r\n `Out-of-order chunk index for stream ${framePayload.streamId}. Expected ${streamState.expectedChunkIndex}, received ${framePayload.index}.`\r\n );\r\n }\r\n\r\n const chunkBuffer = decodeBase64ToBuffer(\r\n framePayload.payload,\r\n `Stream chunk payload (${framePayload.streamId})`\r\n );\r\n\r\n if (chunkBuffer.length !== framePayload.byteLength) {\r\n throw new Error(\r\n `Stream ${framePayload.streamId} byteLength mismatch. Expected ${framePayload.byteLength}, received ${chunkBuffer.length}.`\r\n );\r\n }\r\n\r\n streamState.expectedChunkIndex += 1;\r\n streamState.receivedBytes += chunkBuffer.length;\r\n streamState.stream.write(chunkBuffer);\r\n }\r\n\r\n private handleIncomingStreamEndFrame(\r\n client: SecureServerClient,\r\n framePayload: StreamFrameEndPayload\r\n ): void {\r\n const incomingStreams = this.incomingStreamsBySocket.get(client.socket);\r\n const streamState = incomingStreams?.get(framePayload.streamId);\r\n\r\n if (!incomingStreams || !streamState) {\r\n throw new Error(\r\n `Stream ${framePayload.streamId} is unknown for client ${client.id}.`\r\n );\r\n }\r\n\r\n if (framePayload.chunkCount !== streamState.expectedChunkIndex) {\r\n throw new Error(\r\n `Stream ${framePayload.streamId} chunkCount mismatch. Expected ${streamState.expectedChunkIndex}, received ${framePayload.chunkCount}.`\r\n );\r\n }\r\n\r\n if (framePayload.totalBytes !== streamState.receivedBytes) {\r\n throw new Error(\r\n `Stream ${framePayload.streamId} totalBytes mismatch. Expected ${streamState.receivedBytes}, received ${framePayload.totalBytes}.`\r\n );\r\n }\r\n\r\n if (\r\n streamState.info.totalBytes !== undefined &&\r\n streamState.info.totalBytes !== streamState.receivedBytes\r\n ) {\r\n throw new Error(\r\n `Stream ${framePayload.streamId} violated announced totalBytes (${streamState.info.totalBytes}).`\r\n );\r\n }\r\n\r\n streamState.stream.end();\r\n incomingStreams.delete(framePayload.streamId);\r\n\r\n if (incomingStreams.size === 0) {\r\n this.incomingStreamsBySocket.delete(client.socket);\r\n }\r\n }\r\n\r\n private handleIncomingStreamAbortFrame(\r\n client: SecureServerClient,\r\n framePayload: StreamFrameAbortPayload\r\n ): void {\r\n this.abortIncomingServerStream(\r\n client.socket,\r\n framePayload.streamId,\r\n framePayload.reason\r\n );\r\n }\r\n\r\n private handleIncomingStreamFrame(client: SecureServerClient, data: unknown): void {\r\n let framePayload: StreamFramePayload | null = null;\r\n\r\n try {\r\n framePayload = parseStreamFramePayload(data);\r\n\r\n if (framePayload.type === \"start\") {\r\n this.handleIncomingStreamStartFrame(client, framePayload);\r\n return;\r\n }\r\n\r\n if (framePayload.type === \"chunk\") {\r\n this.handleIncomingStreamChunkFrame(client, framePayload);\r\n return;\r\n }\r\n\r\n if (framePayload.type === \"end\") {\r\n this.handleIncomingStreamEndFrame(client, framePayload);\r\n return;\r\n }\r\n\r\n this.handleIncomingStreamAbortFrame(client, framePayload);\r\n } catch (error) {\r\n const normalizedError = normalizeToError(\r\n error,\r\n `Failed to process incoming stream frame for client ${client.id}.`\r\n );\r\n\r\n if (framePayload) {\r\n this.abortIncomingServerStream(\r\n client.socket,\r\n framePayload.streamId,\r\n normalizedError.message\r\n );\r\n }\r\n\r\n this.notifyError(normalizedError);\r\n }\r\n }\r\n\r\n private async executeServerMiddleware(\r\n context: SecureServerMiddlewareContext\r\n ): Promise<void> {\r\n if (this.middlewareHandlers.length === 0) {\r\n return;\r\n }\r\n\r\n let currentIndex = -1;\r\n\r\n const dispatch = async (index: number): Promise<void> => {\r\n if (index <= currentIndex) {\r\n throw new Error(\"Server middleware next() was called multiple times.\");\r\n }\r\n\r\n currentIndex = index;\r\n const middleware = this.middlewareHandlers[index];\r\n\r\n if (!middleware) {\r\n return;\r\n }\r\n\r\n await Promise.resolve(\r\n middleware(context, async () => {\r\n await dispatch(index + 1);\r\n })\r\n );\r\n };\r\n\r\n await dispatch(0);\r\n }\r\n\r\n private async applyMessageMiddleware(\r\n phase: \"incoming\" | \"outgoing\",\r\n client: SecureServerClient,\r\n event: string,\r\n data: unknown\r\n ): Promise<unknown> {\r\n const metadata =\r\n this.middlewareMetadataBySocket.get(client.socket) ?? new Map<string, unknown>();\r\n\r\n this.middlewareMetadataBySocket.set(client.socket, metadata);\r\n\r\n const middlewareContext: SecureServerMessageMiddlewareContext = {\r\n phase,\r\n client,\r\n event,\r\n data,\r\n metadata\r\n };\r\n\r\n await this.executeServerMiddleware(middlewareContext);\r\n return middlewareContext.data;\r\n }\r\n\r\n private resolveClientBySocket(socket: WebSocket): SecureServerClient | null {\r\n const clientId = this.clientIdBySocket.get(socket);\r\n\r\n if (!clientId) {\r\n return null;\r\n }\r\n\r\n return this.clientsById.get(clientId) ?? null;\r\n }\r\n\r\n private sendRaw(socket: WebSocket, payload: string): void {\r\n try {\r\n if (socket.readyState !== WebSocket.OPEN) {\r\n return;\r\n }\r\n\r\n socket.send(payload);\r\n } catch (error) {\r\n this.notifyError(normalizeToError(error, \"Failed to send server payload.\"));\r\n }\r\n }\r\n\r\n private async sendEncryptedEnvelope(socket: WebSocket, envelope: SecureEnvelope): Promise<void> {\r\n if (socket.readyState !== WebSocket.OPEN) {\r\n return;\r\n }\r\n\r\n const encryptionKey = this.encryptionKeyBySocket.get(socket);\r\n\r\n if (!encryptionKey) {\r\n const missingKeyError = new Error(\"Missing encryption key for connected socket.\");\r\n this.notifyError(missingKeyError);\r\n throw missingKeyError;\r\n }\r\n\r\n try {\r\n const serializedEnvelope = await serializeEnvelope(envelope.event, envelope.data);\r\n const encryptedPayload = encryptSerializedEnvelope(serializedEnvelope, encryptionKey);\r\n socket.send(encryptedPayload);\r\n } catch (error) {\r\n const normalizedError = normalizeToError(error, \"Failed to send encrypted server payload.\");\r\n this.notifyError(normalizedError);\r\n throw normalizedError;\r\n }\r\n }\r\n\r\n private sendRpcRequest(\r\n socket: WebSocket,\r\n event: string,\r\n data: unknown,\r\n timeoutMs: number\r\n ): Promise<unknown> {\r\n if (socket.readyState !== WebSocket.OPEN && socket.readyState !== WebSocket.CONNECTING) {\r\n throw new Error(\"Client socket is not connected for ACK request.\");\r\n }\r\n\r\n const pendingRequests =\r\n this.pendingRpcRequestsBySocket.get(socket) ?? new Map<string, PendingRpcRequest>();\r\n this.pendingRpcRequestsBySocket.set(socket, pendingRequests);\r\n\r\n const requestId = randomUUID();\r\n\r\n return new Promise<unknown>((resolve, reject) => {\r\n const timeoutHandle = setTimeout(() => {\r\n pendingRequests.delete(requestId);\r\n reject(new Error(`ACK response timed out after ${timeoutMs}ms for event \"${event}\".`));\r\n }, timeoutMs);\r\n\r\n timeoutHandle.unref?.();\r\n\r\n pendingRequests.set(requestId, {\r\n resolve,\r\n reject,\r\n timeoutHandle\r\n });\r\n\r\n void this.sendOrQueuePayload(socket, {\r\n event: INTERNAL_RPC_REQUEST_EVENT,\r\n data: {\r\n id: requestId,\r\n event,\r\n data\r\n } satisfies RpcRequestPayload\r\n }).catch((error) => {\r\n clearTimeout(timeoutHandle);\r\n pendingRequests.delete(requestId);\r\n reject(\r\n normalizeToError(error, `Failed to dispatch ACK request for event \"${event}\".`)\r\n );\r\n });\r\n });\r\n }\r\n\r\n private handleRpcResponse(socket: WebSocket, data: unknown): void {\r\n try {\r\n const responsePayload = parseRpcResponsePayload(data);\r\n const pendingRequests = this.pendingRpcRequestsBySocket.get(socket);\r\n\r\n if (!pendingRequests) {\r\n return;\r\n }\r\n\r\n const pendingRequest = pendingRequests.get(responsePayload.id);\r\n\r\n if (!pendingRequest) {\r\n return;\r\n }\r\n\r\n clearTimeout(pendingRequest.timeoutHandle);\r\n pendingRequests.delete(responsePayload.id);\r\n\r\n if (responsePayload.ok) {\r\n pendingRequest.resolve(responsePayload.data);\r\n return;\r\n }\r\n\r\n pendingRequest.reject(\r\n new Error(responsePayload.error ?? \"ACK request failed without an error message.\")\r\n );\r\n } catch (error) {\r\n this.notifyError(normalizeToError(error, \"Failed to process server ACK response.\"));\r\n }\r\n }\r\n\r\n private async handleRpcRequest(client: SecureServerClient, data: unknown): Promise<void> {\r\n let rpcRequestPayload: RpcRequestPayload;\r\n\r\n try {\r\n rpcRequestPayload = parseRpcRequestPayload(data);\r\n } catch (error) {\r\n this.notifyError(normalizeToError(error, \"Invalid server ACK request payload.\"));\r\n return;\r\n }\r\n\r\n try {\r\n const interceptedData = await this.applyMessageMiddleware(\r\n \"incoming\",\r\n client,\r\n rpcRequestPayload.event,\r\n rpcRequestPayload.data\r\n );\r\n\r\n const ackResponse = await this.executeRpcRequestHandler(\r\n rpcRequestPayload.event,\r\n interceptedData,\r\n client\r\n );\r\n\r\n await this.sendEncryptedEnvelope(client.socket, {\r\n event: INTERNAL_RPC_RESPONSE_EVENT,\r\n data: {\r\n id: rpcRequestPayload.id,\r\n ok: true,\r\n data: ackResponse\r\n } satisfies RpcResponsePayload\r\n });\r\n } catch (error) {\r\n const normalizedError = normalizeToError(error, \"Server ACK request handler failed.\");\r\n\r\n await this.sendEncryptedEnvelope(client.socket, {\r\n event: INTERNAL_RPC_RESPONSE_EVENT,\r\n data: {\r\n id: rpcRequestPayload.id,\r\n ok: false,\r\n error: normalizedError.message\r\n } satisfies RpcResponsePayload\r\n });\r\n\r\n this.notifyError(normalizedError);\r\n }\r\n }\r\n\r\n private async executeRpcRequestHandler(\r\n event: string,\r\n data: unknown,\r\n client: SecureServerClient\r\n ): Promise<unknown> {\r\n const handlers = this.customEventHandlers.get(event);\r\n\r\n if (!handlers || handlers.size === 0) {\r\n throw new Error(`No handler is registered for ACK request event \"${event}\".`);\r\n }\r\n\r\n const firstHandler = handlers.values().next().value as SecureServerEventHandler;\r\n return Promise.resolve(firstHandler(data, client));\r\n }\r\n\r\n private rejectPendingRpcRequests(socket: WebSocket, error: Error): void {\r\n const pendingRequests = this.pendingRpcRequestsBySocket.get(socket);\r\n\r\n if (!pendingRequests) {\r\n return;\r\n }\r\n\r\n for (const pendingRequest of pendingRequests.values()) {\r\n clearTimeout(pendingRequest.timeoutHandle);\r\n pendingRequest.reject(error);\r\n }\r\n\r\n pendingRequests.clear();\r\n }\r\n\r\n private notifyConnection(client: SecureServerClient): void {\r\n for (const handler of this.connectionHandlers) {\r\n try {\r\n handler(client);\r\n } catch (error) {\r\n this.notifyError(\r\n normalizeToError(error, `Connection handler failed for client ${client.id}.`)\r\n );\r\n }\r\n }\r\n }\r\n\r\n private notifyReady(client: SecureServerClient): void {\r\n for (const handler of this.readyHandlers) {\r\n try {\r\n handler(client);\r\n } catch (error) {\r\n this.notifyError(\r\n normalizeToError(error, `Ready handler failed for client ${client.id}.`)\r\n );\r\n }\r\n }\r\n }\r\n\r\n private notifyError(error: Error): void {\r\n if (this.errorHandlers.size === 0) {\r\n return;\r\n }\r\n\r\n for (const handler of this.errorHandlers) {\r\n try {\r\n handler(error);\r\n } catch {\r\n // Error handlers should not throw into the event loop.\r\n }\r\n }\r\n }\r\n\r\n private createServerHandshakeState(): ServerHandshakeState {\r\n const { ecdh, localPublicKey } = createEphemeralHandshakeState();\r\n\r\n return {\r\n ecdh,\r\n localPublicKey,\r\n isReady: false\r\n };\r\n }\r\n\r\n private sendInternalHandshake(socket: WebSocket, localPublicKey: string): void {\r\n this.sendRaw(\r\n socket,\r\n serializePlainEnvelope(INTERNAL_HANDSHAKE_EVENT, {\r\n type: \"hello\",\r\n protocolVersion: HANDSHAKE_PROTOCOL_VERSION,\r\n publicKey: localPublicKey\r\n })\r\n );\r\n }\r\n\r\n private sendResumeAck(\r\n socket: WebSocket,\r\n payload: {\r\n ok: boolean;\r\n sessionId?: string;\r\n serverProof?: string;\r\n reason?: string;\r\n }\r\n ): void {\r\n const responsePayload: HandshakeResumeAckPayload = {\r\n type: \"resume-ack\",\r\n protocolVersion: HANDSHAKE_PROTOCOL_VERSION,\r\n ok: payload.ok\r\n };\r\n\r\n if (payload.sessionId !== undefined && payload.sessionId.length > 0) {\r\n responsePayload.sessionId = payload.sessionId;\r\n }\r\n\r\n if (payload.serverProof !== undefined && payload.serverProof.length > 0) {\r\n responsePayload.serverProof = payload.serverProof;\r\n }\r\n\r\n if (payload.reason !== undefined && payload.reason.length > 0) {\r\n responsePayload.reason = payload.reason;\r\n }\r\n\r\n this.sendRaw(\r\n socket,\r\n serializePlainEnvelope(INTERNAL_HANDSHAKE_EVENT, responsePayload)\r\n );\r\n }\r\n\r\n private handleResumeHandshake(\r\n client: SecureServerClient,\r\n payload: HandshakeResumePayload\r\n ): void {\r\n if (!this.sessionResumptionConfig.enabled) {\r\n this.sendResumeAck(client.socket, {\r\n ok: false,\r\n reason: \"Session resumption is disabled.\"\r\n });\r\n return;\r\n }\r\n\r\n const ticketRecord = this.getSessionTicket(payload.sessionId);\r\n\r\n if (!ticketRecord) {\r\n this.sendResumeAck(client.socket, {\r\n ok: false,\r\n reason: \"Session ticket is unknown or expired.\"\r\n });\r\n return;\r\n }\r\n\r\n try {\r\n const clientNonce = decodeBase64ToBuffer(\r\n payload.clientNonce,\r\n \"Handshake resume clientNonce\"\r\n );\r\n\r\n if (clientNonce.length !== RESUMPTION_NONCE_LENGTH) {\r\n throw new Error(\r\n `Handshake resume clientNonce must be ${RESUMPTION_NONCE_LENGTH} bytes.`\r\n );\r\n }\r\n\r\n const receivedProof = decodeBase64ToBuffer(\r\n payload.clientProof,\r\n \"Handshake resume clientProof\"\r\n );\r\n\r\n const expectedProof = createResumeClientProof(\r\n ticketRecord.secret,\r\n ticketRecord.sessionId,\r\n clientNonce\r\n );\r\n\r\n if (!equalsConstantTime(receivedProof, expectedProof)) {\r\n this.sendResumeAck(client.socket, {\r\n ok: false,\r\n reason: \"Session resumption proof validation failed.\"\r\n });\r\n return;\r\n }\r\n\r\n this.sessionTicketStore.delete(ticketRecord.sessionId);\r\n\r\n const resumedKey = deriveResumedEncryptionKey(ticketRecord.secret, clientNonce);\r\n const serverProof = createResumeServerProof(\r\n resumedKey,\r\n ticketRecord.sessionId,\r\n clientNonce\r\n ).toString(\"base64\");\r\n const handshakeState = this.handshakeStateBySocket.get(client.socket);\r\n\r\n if (!handshakeState) {\r\n throw new Error(`Missing handshake state for client ${client.id}.`);\r\n }\r\n\r\n this.sharedSecretBySocket.set(client.socket, resumedKey);\r\n this.encryptionKeyBySocket.set(client.socket, resumedKey);\r\n handshakeState.isReady = true;\r\n\r\n this.sendResumeAck(client.socket, {\r\n ok: true,\r\n sessionId: ticketRecord.sessionId,\r\n serverProof\r\n });\r\n\r\n void this.flushQueuedPayloads(client.socket);\r\n this.notifyReady(client);\r\n this.issueSessionTicket(client.socket, resumedKey);\r\n } catch (error) {\r\n this.sendResumeAck(client.socket, {\r\n ok: false,\r\n reason: \"Session resumption payload was invalid.\"\r\n });\r\n\r\n this.notifyError(normalizeToError(error, \"Failed to resume secure server session.\"));\r\n }\r\n }\r\n\r\n private handleInternalHandshake(client: SecureServerClient, data: unknown): void {\r\n try {\r\n const payload = parseHandshakePayload(data);\r\n const handshakeState = this.handshakeStateBySocket.get(client.socket);\r\n\r\n if (!handshakeState) {\r\n throw new Error(`Missing handshake state for client ${client.id}.`);\r\n }\r\n\r\n if (handshakeState.isReady) {\r\n return;\r\n }\r\n\r\n if (payload.type === \"resume\") {\r\n this.handleResumeHandshake(client, payload);\r\n return;\r\n }\r\n\r\n if (payload.type === \"resume-ack\") {\r\n throw new Error(\"SecureServer received unexpected resume-ack handshake payload.\");\r\n }\r\n\r\n const remotePublicKey = Buffer.from(payload.publicKey, \"base64\");\r\n const sharedSecret = handshakeState.ecdh.computeSecret(remotePublicKey);\r\n const encryptionKey = deriveEncryptionKey(sharedSecret);\r\n\r\n this.sharedSecretBySocket.set(client.socket, sharedSecret);\r\n this.encryptionKeyBySocket.set(client.socket, encryptionKey);\r\n handshakeState.isReady = true;\r\n\r\n void this.flushQueuedPayloads(client.socket);\r\n this.notifyReady(client);\r\n this.issueSessionTicket(client.socket, encryptionKey);\r\n } catch (error) {\r\n this.notifyError(normalizeToError(error, \"Failed to complete server handshake.\"));\r\n }\r\n }\r\n\r\n private isClientHandshakeReady(socket: WebSocket): boolean {\r\n return this.handshakeStateBySocket.get(socket)?.isReady ?? false;\r\n }\r\n\r\n private async sendOrQueuePayload(\r\n socket: WebSocket,\r\n envelope: SecureEnvelope\r\n ): Promise<void> {\r\n let interceptedEnvelope = envelope;\r\n\r\n if (!isReservedEmitEvent(envelope.event)) {\r\n const targetClient = this.resolveClientBySocket(socket);\r\n\r\n if (targetClient) {\r\n const interceptedData = await this.applyMessageMiddleware(\r\n \"outgoing\",\r\n targetClient,\r\n envelope.event,\r\n envelope.data\r\n );\r\n\r\n interceptedEnvelope = {\r\n event: envelope.event,\r\n data: interceptedData\r\n };\r\n }\r\n }\r\n\r\n if (!this.isClientHandshakeReady(socket)) {\r\n this.queuePayload(socket, interceptedEnvelope);\r\n return;\r\n }\r\n\r\n await this.sendEncryptedEnvelope(socket, interceptedEnvelope);\r\n }\r\n\r\n private queuePayload(socket: WebSocket, envelope: SecureEnvelope): void {\r\n const pendingPayloads = this.pendingPayloadsBySocket.get(socket) ?? [];\r\n pendingPayloads.push(envelope);\r\n this.pendingPayloadsBySocket.set(socket, pendingPayloads);\r\n }\r\n\r\n private async flushQueuedPayloads(socket: WebSocket): Promise<void> {\r\n const pendingPayloads = this.pendingPayloadsBySocket.get(socket);\r\n\r\n if (!pendingPayloads || pendingPayloads.length === 0) {\r\n return;\r\n }\r\n\r\n this.pendingPayloadsBySocket.delete(socket);\r\n\r\n for (const envelope of pendingPayloads) {\r\n await this.sendEncryptedEnvelope(socket, envelope);\r\n }\r\n }\r\n\r\n private createSecureServerClient(\r\n clientId: string,\r\n socket: WebSocket,\r\n request: IncomingMessage,\r\n metadata: Map<string, unknown>\r\n ): SecureServerClient {\r\n return {\r\n id: clientId,\r\n socket,\r\n request,\r\n metadata,\r\n emit: (\r\n event: string,\r\n data: unknown,\r\n callbackOrOptions?: SecureAckCallback | SecureAckOptions,\r\n maybeCallback?: SecureAckCallback\r\n ): boolean | Promise<unknown> => {\r\n if (callbackOrOptions === undefined && maybeCallback === undefined) {\r\n return this.emitTo(clientId, event, data);\r\n }\r\n\r\n if (typeof callbackOrOptions === \"function\") {\r\n return this.emitTo(clientId, event, data, callbackOrOptions);\r\n }\r\n\r\n if (maybeCallback) {\r\n return this.emitTo(\r\n clientId,\r\n event,\r\n data,\r\n callbackOrOptions ?? {},\r\n maybeCallback\r\n );\r\n }\r\n\r\n return this.emitTo(clientId, event, data, callbackOrOptions ?? {});\r\n },\r\n emitStream: (\r\n event: string,\r\n source: SecureChunkedStreamSource,\r\n options?: SecureChunkedStreamOptions\r\n ): Promise<SecureStreamSendResult> => {\r\n return this.emitStreamTo(clientId, event, source, options);\r\n },\r\n join: (room: string): boolean => this.joinClientToRoom(clientId, room),\r\n leave: (room: string): boolean => this.leaveClientFromRoom(clientId, room),\r\n leaveAll: (): number => this.leaveClientFromAllRooms(clientId)\r\n };\r\n }\r\n\r\n private emitLocally(event: string, data: unknown): void {\r\n const envelope: SecureEnvelope = { event, data };\r\n\r\n for (const client of this.clientsById.values()) {\r\n void this.sendOrQueuePayload(client.socket, envelope).catch(() => {\r\n return undefined;\r\n });\r\n }\r\n }\r\n\r\n private publishAdapterMessage(\r\n message: Omit<SecureServerAdapterMessage, \"version\" | \"originServerId\" | \"emittedAt\">\r\n ): void {\r\n if (!this.adapter) {\r\n return;\r\n }\r\n\r\n let adapterMessage: SecureServerAdapterMessage;\r\n\r\n if (message.scope === \"room\") {\r\n if (!message.room) {\r\n return;\r\n }\r\n\r\n adapterMessage = {\r\n version: SECURE_SERVER_ADAPTER_MESSAGE_VERSION,\r\n originServerId: this.instanceId,\r\n scope: \"room\",\r\n event: message.event,\r\n data: message.data,\r\n emittedAt: Date.now(),\r\n room: message.room\r\n };\r\n } else {\r\n adapterMessage = {\r\n version: SECURE_SERVER_ADAPTER_MESSAGE_VERSION,\r\n originServerId: this.instanceId,\r\n scope: \"broadcast\",\r\n event: message.event,\r\n data: message.data,\r\n emittedAt: Date.now()\r\n };\r\n }\r\n\r\n void Promise.resolve(this.adapter.publish(adapterMessage)).catch((error) => {\r\n this.notifyError(\r\n normalizeToError(error, \"Failed to publish SecureServer adapter message.\")\r\n );\r\n });\r\n }\r\n\r\n private normalizeRoomName(room: string): string {\r\n if (typeof room !== \"string\") {\r\n throw new Error(\"Room name must be a string.\");\r\n }\r\n\r\n const normalizedRoom = room.trim();\r\n\r\n if (normalizedRoom.length === 0) {\r\n throw new Error(\"Room name cannot be empty.\");\r\n }\r\n\r\n return normalizedRoom;\r\n }\r\n\r\n private joinClientToRoom(clientId: string, room: string): boolean {\r\n const normalizedRoom = this.normalizeRoomName(room);\r\n\r\n if (!this.clientsById.has(clientId)) {\r\n return false;\r\n }\r\n\r\n const clientRooms = this.roomNamesByClientId.get(clientId) ?? new Set<string>();\r\n\r\n if (clientRooms.has(normalizedRoom)) {\r\n this.roomNamesByClientId.set(clientId, clientRooms);\r\n return false;\r\n }\r\n\r\n clientRooms.add(normalizedRoom);\r\n this.roomNamesByClientId.set(clientId, clientRooms);\r\n\r\n const roomMembers = this.roomMembersByName.get(normalizedRoom) ?? new Set<string>();\r\n roomMembers.add(clientId);\r\n this.roomMembersByName.set(normalizedRoom, roomMembers);\r\n\r\n return true;\r\n }\r\n\r\n private leaveClientFromRoom(clientId: string, room: string): boolean {\r\n const normalizedRoom = this.normalizeRoomName(room);\r\n const clientRooms = this.roomNamesByClientId.get(clientId);\r\n\r\n if (!clientRooms || !clientRooms.delete(normalizedRoom)) {\r\n return false;\r\n }\r\n\r\n if (clientRooms.size === 0) {\r\n this.roomNamesByClientId.delete(clientId);\r\n }\r\n\r\n const roomMembers = this.roomMembersByName.get(normalizedRoom);\r\n\r\n if (roomMembers) {\r\n roomMembers.delete(clientId);\r\n\r\n if (roomMembers.size === 0) {\r\n this.roomMembersByName.delete(normalizedRoom);\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private leaveClientFromAllRooms(clientId: string): number {\r\n const clientRooms = this.roomNamesByClientId.get(clientId);\r\n\r\n if (!clientRooms || clientRooms.size === 0) {\r\n this.roomNamesByClientId.delete(clientId);\r\n return 0;\r\n }\r\n\r\n const roomNames = [...clientRooms];\r\n this.roomNamesByClientId.delete(clientId);\r\n\r\n for (const roomName of roomNames) {\r\n const roomMembers = this.roomMembersByName.get(roomName);\r\n\r\n if (!roomMembers) {\r\n continue;\r\n }\r\n\r\n roomMembers.delete(clientId);\r\n\r\n if (roomMembers.size === 0) {\r\n this.roomMembersByName.delete(roomName);\r\n }\r\n }\r\n\r\n return roomNames.length;\r\n }\r\n\r\n private emitToRoom(\r\n room: string,\r\n event: string,\r\n data: unknown,\r\n replicate: boolean\r\n ): void {\r\n if (isReservedEmitEvent(event)) {\r\n throw new Error(`The event \"${event}\" is reserved and cannot be emitted manually.`);\r\n }\r\n\r\n const roomMembers = this.roomMembersByName.get(room);\r\n\r\n if (roomMembers && roomMembers.size > 0) {\r\n const envelope: SecureEnvelope = { event, data };\r\n\r\n for (const clientId of roomMembers) {\r\n const client = this.clientsById.get(clientId);\r\n\r\n if (!client) {\r\n continue;\r\n }\r\n\r\n void this.sendOrQueuePayload(client.socket, envelope).catch(() => {\r\n return undefined;\r\n });\r\n }\r\n }\r\n\r\n if (replicate) {\r\n this.publishAdapterMessage({\r\n scope: \"room\",\r\n room,\r\n event,\r\n data\r\n });\r\n }\r\n }\r\n}\r\n\r\nexport class SecureClient {\r\n private socket: WebSocket | null = null;\r\n\r\n private readonly reconnectConfig: Required<SecureClientReconnectOptions>;\r\n\r\n private readonly sessionResumptionConfig: Required<SecureClientSessionResumptionOptions>;\r\n\r\n private reconnectAttemptCount = 0;\r\n\r\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null;\r\n\r\n private isManualDisconnectRequested = false;\r\n\r\n private readonly customEventHandlers = new Map<string, Set<SecureClientEventHandler>>();\r\n\r\n private readonly streamEventHandlers = new Map<string, Set<SecureClientStreamHandler>>();\r\n\r\n private readonly connectHandlers = new Set<SecureClientConnectHandler>();\r\n\r\n private readonly disconnectHandlers = new Set<SecureClientDisconnectHandler>();\r\n\r\n private readonly readyHandlers = new Set<SecureClientReadyHandler>();\r\n\r\n private readonly errorHandlers = new Set<SecureErrorHandler>();\r\n\r\n private handshakeState: ClientHandshakeState | null = null;\r\n\r\n private pendingPayloadQueue: SecureEnvelope[] = [];\r\n\r\n private readonly pendingRpcRequests = new Map<string, PendingRpcRequest>();\r\n\r\n private readonly incomingStreams = new Map<string, IncomingClientStreamState>();\r\n\r\n private sessionTicket: ClientSessionTicketRecord | null = null;\r\n\r\n public constructor(\r\n private readonly url: string,\r\n private readonly options: SecureClientOptions = {}\r\n ) {\r\n this.reconnectConfig = this.resolveReconnectConfig(this.options.reconnect);\r\n this.sessionResumptionConfig = this.resolveSessionResumptionConfig(\r\n this.options.sessionResumption\r\n );\r\n\r\n if (this.options.autoConnect ?? true) {\r\n this.connect();\r\n }\r\n }\r\n\r\n public get readyState(): number | null {\r\n return this.socket?.readyState ?? null;\r\n }\r\n\r\n public isConnected(): boolean {\r\n return this.socket?.readyState === WebSocket.OPEN;\r\n }\r\n\r\n public connect(): void {\r\n try {\r\n if (\r\n this.socket &&\r\n (this.socket.readyState === WebSocket.OPEN ||\r\n this.socket.readyState === WebSocket.CONNECTING)\r\n ) {\r\n return;\r\n }\r\n\r\n this.clearReconnectTimer();\r\n this.isManualDisconnectRequested = false;\r\n\r\n const socket = this.createSocket();\r\n this.socket = socket;\r\n this.handshakeState = this.createClientHandshakeState();\r\n this.pendingPayloadQueue = [];\r\n this.bindSocketEvents(socket);\r\n } catch (error) {\r\n this.notifyError(normalizeToError(error, \"Failed to connect client.\"));\r\n\r\n if (!this.isManualDisconnectRequested) {\r\n this.scheduleReconnect();\r\n }\r\n }\r\n }\r\n\r\n public disconnect(\r\n code: number = DEFAULT_CLOSE_CODE,\r\n reason: string = DEFAULT_CLOSE_REASON\r\n ): void {\r\n try {\r\n this.isManualDisconnectRequested = true;\r\n this.clearReconnectTimer();\r\n\r\n if (!this.socket) {\r\n return;\r\n }\r\n\r\n if (\r\n this.socket.readyState === WebSocket.CLOSING ||\r\n this.socket.readyState === WebSocket.CLOSED\r\n ) {\r\n return;\r\n }\r\n\r\n this.socket.close(code, reason);\r\n } catch (error) {\r\n this.notifyError(normalizeToError(error, \"Failed to disconnect client.\"));\r\n }\r\n }\r\n\r\n public on(event: \"connect\", handler: SecureClientConnectHandler): this;\r\n public on(event: \"disconnect\", handler: SecureClientDisconnectHandler): this;\r\n public on(event: \"ready\", handler: SecureClientReadyHandler): this;\r\n public on(event: \"error\", handler: SecureErrorHandler): this;\r\n public on(event: string, handler: SecureClientEventHandler): this;\r\n public on(event: string, handler: unknown): this {\r\n try {\r\n if (event === \"connect\") {\r\n this.connectHandlers.add(handler as SecureClientConnectHandler);\r\n return this;\r\n }\r\n\r\n if (event === \"disconnect\") {\r\n this.disconnectHandlers.add(handler as SecureClientDisconnectHandler);\r\n return this;\r\n }\r\n\r\n if (event === READY_EVENT) {\r\n this.readyHandlers.add(handler as SecureClientReadyHandler);\r\n return this;\r\n }\r\n\r\n if (event === \"error\") {\r\n this.errorHandlers.add(handler as SecureErrorHandler);\r\n return this;\r\n }\r\n\r\n if (event === INTERNAL_HANDSHAKE_EVENT || event === INTERNAL_SESSION_TICKET_EVENT) {\r\n throw new Error(`The event \"${event}\" is reserved for internal use.`);\r\n }\r\n\r\n const typedHandler = handler as SecureClientEventHandler;\r\n const listeners = this.customEventHandlers.get(event) ?? new Set<SecureClientEventHandler>();\r\n listeners.add(typedHandler);\r\n this.customEventHandlers.set(event, listeners);\r\n } catch (error) {\r\n this.notifyError(\r\n normalizeToError(error, \"Failed to register client event handler.\")\r\n );\r\n }\r\n\r\n return this;\r\n }\r\n\r\n public off(event: \"connect\", handler: SecureClientConnectHandler): this;\r\n public off(event: \"disconnect\", handler: SecureClientDisconnectHandler): this;\r\n public off(event: \"ready\", handler: SecureClientReadyHandler): this;\r\n public off(event: \"error\", handler: SecureErrorHandler): this;\r\n public off(event: string, handler: SecureClientEventHandler): this;\r\n public off(event: string, handler: unknown): this {\r\n try {\r\n if (event === \"connect\") {\r\n this.connectHandlers.delete(handler as SecureClientConnectHandler);\r\n return this;\r\n }\r\n\r\n if (event === \"disconnect\") {\r\n this.disconnectHandlers.delete(handler as SecureClientDisconnectHandler);\r\n return this;\r\n }\r\n\r\n if (event === READY_EVENT) {\r\n this.readyHandlers.delete(handler as SecureClientReadyHandler);\r\n return this;\r\n }\r\n\r\n if (event === \"error\") {\r\n this.errorHandlers.delete(handler as SecureErrorHandler);\r\n return this;\r\n }\r\n\r\n if (event === INTERNAL_HANDSHAKE_EVENT || event === INTERNAL_SESSION_TICKET_EVENT) {\r\n return this;\r\n }\r\n\r\n const listeners = this.customEventHandlers.get(event);\r\n\r\n if (!listeners) {\r\n return this;\r\n }\r\n\r\n listeners.delete(handler as SecureClientEventHandler);\r\n\r\n if (listeners.size === 0) {\r\n this.customEventHandlers.delete(event);\r\n }\r\n } catch (error) {\r\n this.notifyError(\r\n normalizeToError(error, \"Failed to remove client event handler.\")\r\n );\r\n }\r\n\r\n return this;\r\n }\r\n\r\n public onStream(event: string, handler: SecureClientStreamHandler): this {\r\n try {\r\n if (isReservedEmitEvent(event)) {\r\n throw new Error(`The event \"${event}\" is reserved and cannot be used as a stream event.`);\r\n }\r\n\r\n const listeners = this.streamEventHandlers.get(event) ?? new Set<SecureClientStreamHandler>();\r\n listeners.add(handler);\r\n this.streamEventHandlers.set(event, listeners);\r\n } catch (error) {\r\n this.notifyError(\r\n normalizeToError(error, \"Failed to register client stream handler.\")\r\n );\r\n }\r\n\r\n return this;\r\n }\r\n\r\n public offStream(event: string, handler: SecureClientStreamHandler): this {\r\n try {\r\n const listeners = this.streamEventHandlers.get(event);\r\n\r\n if (!listeners) {\r\n return this;\r\n }\r\n\r\n listeners.delete(handler);\r\n\r\n if (listeners.size === 0) {\r\n this.streamEventHandlers.delete(event);\r\n }\r\n } catch (error) {\r\n this.notifyError(\r\n normalizeToError(error, \"Failed to remove client stream handler.\")\r\n );\r\n }\r\n\r\n return this;\r\n }\r\n\r\n public emit(event: string, data: unknown): boolean;\r\n public emit(event: string, data: unknown, callback: SecureAckCallback): boolean;\r\n public emit(event: string, data: unknown, options: SecureAckOptions): Promise<unknown>;\r\n public emit(\r\n event: string,\r\n data: unknown,\r\n options: SecureAckOptions,\r\n callback: SecureAckCallback\r\n ): boolean;\r\n public emit(\r\n event: string,\r\n data: unknown,\r\n callbackOrOptions?: SecureAckCallback | SecureAckOptions,\r\n maybeCallback?: SecureAckCallback\r\n ): boolean | Promise<unknown> {\r\n const ackArgs = resolveAckArguments(callbackOrOptions, maybeCallback);\r\n\r\n try {\r\n if (isReservedEmitEvent(event)) {\r\n throw new Error(`The event \"${event}\" is reserved and cannot be emitted manually.`);\r\n }\r\n\r\n if (!this.socket || this.socket.readyState !== WebSocket.OPEN) {\r\n throw new Error(\"Client socket is not connected.\");\r\n }\r\n\r\n if (ackArgs.expectsAck) {\r\n const ackPromise = this.sendRpcRequest(event, data, ackArgs.timeoutMs);\r\n\r\n if (ackArgs.callback) {\r\n ackPromise\r\n .then((response) => {\r\n ackArgs.callback?.(null, response);\r\n })\r\n .catch((error) => {\r\n ackArgs.callback?.(\r\n normalizeToError(error, `ACK callback failed for event \"${event}\".`)\r\n );\r\n });\r\n\r\n return true;\r\n }\r\n\r\n return ackPromise;\r\n }\r\n\r\n const envelope: SecureEnvelope = { event, data };\r\n\r\n if (!this.isHandshakeReady()) {\r\n this.pendingPayloadQueue.push(envelope);\r\n return true;\r\n }\r\n\r\n void this.sendEncryptedEnvelope(envelope).catch(() => {\r\n return undefined;\r\n });\r\n return true;\r\n } catch (error) {\r\n const normalizedError = normalizeToError(error, \"Failed to emit client event.\");\r\n this.notifyError(normalizedError);\r\n\r\n if (ackArgs.callback) {\r\n ackArgs.callback(normalizedError);\r\n return false;\r\n }\r\n\r\n if (ackArgs.expectsAck) {\r\n return Promise.reject(normalizedError);\r\n }\r\n\r\n return false;\r\n }\r\n }\r\n\r\n public async emitStream(\r\n event: string,\r\n source: SecureChunkedStreamSource,\r\n options?: SecureChunkedStreamOptions\r\n ): Promise<SecureStreamSendResult> {\r\n try {\r\n if (isReservedEmitEvent(event)) {\r\n throw new Error(`The event \"${event}\" is reserved and cannot be emitted manually.`);\r\n }\r\n\r\n if (!this.socket || this.socket.readyState !== WebSocket.OPEN) {\r\n throw new Error(\"Client socket is not connected.\");\r\n }\r\n\r\n if (!this.isHandshakeReady()) {\r\n throw new Error(\r\n `Cannot stream event \"${event}\" before secure handshake completion.`\r\n );\r\n }\r\n\r\n return await transmitChunkedStreamFrames(\r\n event,\r\n source,\r\n options,\r\n async (framePayload) => {\r\n await this.sendEncryptedEnvelope({\r\n event: INTERNAL_STREAM_FRAME_EVENT,\r\n data: framePayload\r\n });\r\n }\r\n );\r\n } catch (error) {\r\n const normalizedError = normalizeToError(\r\n error,\r\n `Failed to emit chunked stream event \"${event}\".`\r\n );\r\n\r\n this.notifyError(normalizedError);\r\n throw normalizedError;\r\n }\r\n }\r\n\r\n private resolveReconnectConfig(\r\n reconnectOptions: boolean | SecureClientReconnectOptions | undefined\r\n ): Required<SecureClientReconnectOptions> {\r\n if (typeof reconnectOptions === \"boolean\") {\r\n return {\r\n enabled: reconnectOptions,\r\n initialDelayMs: DEFAULT_RECONNECT_INITIAL_DELAY_MS,\r\n maxDelayMs: DEFAULT_RECONNECT_MAX_DELAY_MS,\r\n factor: DEFAULT_RECONNECT_FACTOR,\r\n jitterRatio: DEFAULT_RECONNECT_JITTER_RATIO,\r\n maxAttempts: null\r\n };\r\n }\r\n\r\n const initialDelayMs = reconnectOptions?.initialDelayMs ?? DEFAULT_RECONNECT_INITIAL_DELAY_MS;\r\n const maxDelayMs = reconnectOptions?.maxDelayMs ?? DEFAULT_RECONNECT_MAX_DELAY_MS;\r\n const factor = reconnectOptions?.factor ?? DEFAULT_RECONNECT_FACTOR;\r\n const jitterRatio = reconnectOptions?.jitterRatio ?? DEFAULT_RECONNECT_JITTER_RATIO;\r\n const maxAttempts = reconnectOptions?.maxAttempts ?? null;\r\n\r\n if (!Number.isFinite(initialDelayMs) || initialDelayMs < 0) {\r\n throw new Error(\"Client reconnect initialDelayMs must be a non-negative number.\");\r\n }\r\n\r\n if (!Number.isFinite(maxDelayMs) || maxDelayMs < 0) {\r\n throw new Error(\"Client reconnect maxDelayMs must be a non-negative number.\");\r\n }\r\n\r\n if (maxDelayMs < initialDelayMs) {\r\n throw new Error(\"Client reconnect maxDelayMs must be greater than or equal to initialDelayMs.\");\r\n }\r\n\r\n if (!Number.isFinite(factor) || factor < 1) {\r\n throw new Error(\"Client reconnect factor must be greater than or equal to 1.\");\r\n }\r\n\r\n if (!Number.isFinite(jitterRatio) || jitterRatio < 0 || jitterRatio > 1) {\r\n throw new Error(\"Client reconnect jitterRatio must be between 0 and 1.\");\r\n }\r\n\r\n if (\r\n maxAttempts !== null &&\r\n (!Number.isInteger(maxAttempts) || maxAttempts < 0)\r\n ) {\r\n throw new Error(\"Client reconnect maxAttempts must be a non-negative integer or null.\");\r\n }\r\n\r\n return {\r\n enabled: reconnectOptions?.enabled ?? true,\r\n initialDelayMs,\r\n maxDelayMs,\r\n factor,\r\n jitterRatio,\r\n maxAttempts\r\n };\r\n }\r\n\r\n private resolveSessionResumptionConfig(\r\n sessionResumptionOptions: boolean | SecureClientSessionResumptionOptions | undefined\r\n ): Required<SecureClientSessionResumptionOptions> {\r\n if (typeof sessionResumptionOptions === \"boolean\") {\r\n return {\r\n enabled: sessionResumptionOptions,\r\n maxAcceptedTicketTtlMs: DEFAULT_SESSION_TICKET_TTL_MS\r\n };\r\n }\r\n\r\n const maxAcceptedTicketTtlMs =\r\n sessionResumptionOptions?.maxAcceptedTicketTtlMs ??\r\n DEFAULT_SESSION_TICKET_TTL_MS;\r\n\r\n if (!Number.isFinite(maxAcceptedTicketTtlMs) || maxAcceptedTicketTtlMs <= 0) {\r\n throw new Error(\r\n \"Client sessionResumption maxAcceptedTicketTtlMs must be a positive number.\"\r\n );\r\n }\r\n\r\n return {\r\n enabled:\r\n sessionResumptionOptions?.enabled ?? DEFAULT_SESSION_RESUMPTION_ENABLED,\r\n maxAcceptedTicketTtlMs\r\n };\r\n }\r\n\r\n private scheduleReconnect(): void {\r\n if (!this.reconnectConfig.enabled || this.reconnectTimer) {\r\n return;\r\n }\r\n\r\n if (\r\n this.reconnectConfig.maxAttempts !== null &&\r\n this.reconnectAttemptCount >= this.reconnectConfig.maxAttempts\r\n ) {\r\n return;\r\n }\r\n\r\n this.reconnectAttemptCount += 1;\r\n const delayMs = this.computeReconnectDelay(this.reconnectAttemptCount);\r\n\r\n this.reconnectTimer = setTimeout(() => {\r\n this.reconnectTimer = null;\r\n this.connect();\r\n }, delayMs);\r\n\r\n this.reconnectTimer.unref?.();\r\n }\r\n\r\n private computeReconnectDelay(attemptNumber: number): number {\r\n const exponentialDelay = Math.min(\r\n this.reconnectConfig.maxDelayMs,\r\n this.reconnectConfig.initialDelayMs *\r\n Math.pow(this.reconnectConfig.factor, Math.max(0, attemptNumber - 1))\r\n );\r\n\r\n if (this.reconnectConfig.jitterRatio === 0 || exponentialDelay === 0) {\r\n return Math.round(exponentialDelay);\r\n }\r\n\r\n const jitterDelta = exponentialDelay * this.reconnectConfig.jitterRatio;\r\n const jitterOffset = (Math.random() * 2 - 1) * jitterDelta;\r\n\r\n return Math.max(0, Math.round(exponentialDelay + jitterOffset));\r\n }\r\n\r\n private clearReconnectTimer(): void {\r\n if (!this.reconnectTimer) {\r\n return;\r\n }\r\n\r\n clearTimeout(this.reconnectTimer);\r\n this.reconnectTimer = null;\r\n }\r\n\r\n private createSocket(): WebSocket {\r\n if (this.options.protocols !== undefined) {\r\n return new WebSocket(this.url, this.options.protocols, this.options.wsOptions);\r\n }\r\n\r\n if (this.options.wsOptions !== undefined) {\r\n return new WebSocket(this.url, this.options.wsOptions);\r\n }\r\n\r\n return new WebSocket(this.url);\r\n }\r\n\r\n private bindSocketEvents(socket: WebSocket): void {\r\n socket.on(\"open\", () => {\r\n this.clearReconnectTimer();\r\n this.reconnectAttemptCount = 0;\r\n this.notifyConnect();\r\n });\r\n\r\n socket.on(\"message\", (rawData: RawData) => {\r\n this.handleIncomingMessage(rawData);\r\n });\r\n\r\n socket.on(\"close\", (code: number, reason: Buffer) => {\r\n this.handleDisconnect(code, reason);\r\n });\r\n\r\n socket.on(\"error\", (error: Error) => {\r\n this.notifyError(normalizeToError(error, \"Client socket encountered an error.\"));\r\n });\r\n }\r\n\r\n private handleIncomingMessage(rawData: RawData): void {\r\n try {\r\n let envelope: SecureEnvelope | null = null;\r\n\r\n try {\r\n envelope = parseEnvelope(rawData);\r\n } catch {\r\n envelope = null;\r\n }\r\n\r\n if (envelope?.event === INTERNAL_HANDSHAKE_EVENT) {\r\n this.handleInternalHandshake(envelope.data);\r\n return;\r\n }\r\n\r\n if (envelope !== null) {\r\n this.notifyError(\r\n new Error(`Plaintext event \"${envelope.event}\" was rejected on client.`)\r\n );\r\n return;\r\n }\r\n\r\n if (!this.isHandshakeReady()) {\r\n this.notifyError(new Error(\"Encrypted payload was received before handshake completion.\"));\r\n return;\r\n }\r\n\r\n const encryptionKey = this.handshakeState?.encryptionKey;\r\n\r\n if (!encryptionKey) {\r\n this.notifyError(new Error(\"Missing encryption key for client payload decryption.\"));\r\n return;\r\n }\r\n\r\n let decryptedPayload: string;\r\n\r\n try {\r\n decryptedPayload = decryptSerializedEnvelope(rawData, encryptionKey);\r\n } catch {\r\n console.warn(\"Tampered data detected and dropped\");\r\n return;\r\n }\r\n\r\n const decryptedEnvelope = parseEnvelopeFromText(decryptedPayload);\r\n\r\n if (decryptedEnvelope.event === INTERNAL_RPC_RESPONSE_EVENT) {\r\n this.handleRpcResponse(decryptedEnvelope.data);\r\n return;\r\n }\r\n\r\n if (decryptedEnvelope.event === INTERNAL_RPC_REQUEST_EVENT) {\r\n void this.handleRpcRequest(decryptedEnvelope.data);\r\n return;\r\n }\r\n\r\n if (decryptedEnvelope.event === INTERNAL_STREAM_FRAME_EVENT) {\r\n this.handleIncomingStreamFrame(decryptedEnvelope.data);\r\n return;\r\n }\r\n\r\n if (decryptedEnvelope.event === INTERNAL_SESSION_TICKET_EVENT) {\r\n this.handleSessionTicket(decryptedEnvelope.data);\r\n return;\r\n }\r\n\r\n this.dispatchCustomEvent(decryptedEnvelope.event, decryptedEnvelope.data);\r\n } catch (error) {\r\n this.notifyError(normalizeToError(error, \"Failed to process incoming client message.\"));\r\n }\r\n }\r\n\r\n private handleDisconnect(code: number, reason: Buffer): void {\r\n try {\r\n this.socket = null;\r\n this.handshakeState = null;\r\n this.pendingPayloadQueue = [];\r\n this.cleanupIncomingStreams(\r\n \"Client disconnected before stream transfer completed.\"\r\n );\r\n this.rejectPendingRpcRequests(\r\n new Error(\"Client disconnected before ACK response was received.\")\r\n );\r\n const decodedReason = decodeCloseReason(reason);\r\n\r\n for (const handler of this.disconnectHandlers) {\r\n try {\r\n handler(code, decodedReason);\r\n } catch (handlerError) {\r\n this.notifyError(\r\n normalizeToError(handlerError, \"Client disconnect handler failed.\")\r\n );\r\n }\r\n }\r\n\r\n if (!this.isManualDisconnectRequested) {\r\n this.scheduleReconnect();\r\n }\r\n\r\n this.isManualDisconnectRequested = false;\r\n } catch (error) {\r\n this.notifyError(normalizeToError(error, \"Failed to handle client disconnect.\"));\r\n }\r\n }\r\n\r\n private dispatchCustomEvent(event: string, data: unknown): void {\r\n const handlers = this.customEventHandlers.get(event);\r\n\r\n if (!handlers || handlers.size === 0) {\r\n return;\r\n }\r\n\r\n for (const handler of handlers) {\r\n try {\r\n const handlerResult = handler(data);\r\n\r\n if (isPromiseLike(handlerResult)) {\r\n void Promise.resolve(handlerResult).catch((error) => {\r\n this.notifyError(\r\n normalizeToError(\r\n error,\r\n `Client event handler failed for event ${event}.`\r\n )\r\n );\r\n });\r\n }\r\n } catch (error) {\r\n this.notifyError(\r\n normalizeToError(error, `Client event handler failed for event ${event}.`)\r\n );\r\n }\r\n }\r\n }\r\n\r\n private cleanupIncomingStreams(reason: string): void {\r\n for (const streamState of this.incomingStreams.values()) {\r\n streamState.stream.destroy(new Error(reason));\r\n }\r\n\r\n this.incomingStreams.clear();\r\n }\r\n\r\n private abortIncomingClientStream(streamId: string, reason: string): void {\r\n const streamState = this.incomingStreams.get(streamId);\r\n\r\n if (!streamState) {\r\n return;\r\n }\r\n\r\n streamState.stream.destroy(new Error(reason));\r\n this.incomingStreams.delete(streamId);\r\n }\r\n\r\n private dispatchClientStreamEvent(\r\n event: string,\r\n stream: Readable,\r\n info: SecureIncomingStreamInfo\r\n ): void {\r\n const handlers = this.streamEventHandlers.get(event);\r\n\r\n if (!handlers || handlers.size === 0) {\r\n stream.resume();\r\n this.notifyError(\r\n new Error(`No stream handler is registered for event \"${event}\" on client.`)\r\n );\r\n return;\r\n }\r\n\r\n for (const handler of handlers) {\r\n try {\r\n const handlerResult = handler(stream, info);\r\n\r\n if (isPromiseLike(handlerResult)) {\r\n void Promise.resolve(handlerResult).catch((error) => {\r\n this.notifyError(\r\n normalizeToError(\r\n error,\r\n `Client stream handler failed for event ${event}.`\r\n )\r\n );\r\n });\r\n }\r\n } catch (error) {\r\n this.notifyError(\r\n normalizeToError(error, `Client stream handler failed for event ${event}.`)\r\n );\r\n }\r\n }\r\n }\r\n\r\n private handleIncomingClientStreamStartFrame(framePayload: StreamFrameStartPayload): void {\r\n if (isReservedEmitEvent(framePayload.event)) {\r\n throw new Error(\r\n `Reserved event \"${framePayload.event}\" cannot be used for stream transport.`\r\n );\r\n }\r\n\r\n if (this.incomingStreams.has(framePayload.streamId)) {\r\n throw new Error(`Stream ${framePayload.streamId} already exists on client.`);\r\n }\r\n\r\n const stream = new PassThrough();\r\n const streamInfo: SecureIncomingStreamInfo = {\r\n streamId: framePayload.streamId,\r\n event: framePayload.event,\r\n startedAt: Date.now(),\r\n ...(framePayload.metadata !== undefined ? { metadata: framePayload.metadata } : {}),\r\n ...(framePayload.totalBytes !== undefined ? { totalBytes: framePayload.totalBytes } : {})\r\n };\r\n\r\n this.incomingStreams.set(framePayload.streamId, {\r\n info: streamInfo,\r\n stream,\r\n expectedChunkIndex: 0,\r\n receivedBytes: 0\r\n });\r\n\r\n this.dispatchClientStreamEvent(framePayload.event, stream, streamInfo);\r\n }\r\n\r\n private handleIncomingClientStreamChunkFrame(framePayload: StreamFrameChunkPayload): void {\r\n const streamState = this.incomingStreams.get(framePayload.streamId);\r\n\r\n if (!streamState) {\r\n throw new Error(`Stream ${framePayload.streamId} is unknown on client.`);\r\n }\r\n\r\n if (framePayload.index !== streamState.expectedChunkIndex) {\r\n throw new Error(\r\n `Out-of-order chunk index for stream ${framePayload.streamId}. Expected ${streamState.expectedChunkIndex}, received ${framePayload.index}.`\r\n );\r\n }\r\n\r\n const chunkBuffer = decodeBase64ToBuffer(\r\n framePayload.payload,\r\n `Stream chunk payload (${framePayload.streamId})`\r\n );\r\n\r\n if (chunkBuffer.length !== framePayload.byteLength) {\r\n throw new Error(\r\n `Stream ${framePayload.streamId} byteLength mismatch. Expected ${framePayload.byteLength}, received ${chunkBuffer.length}.`\r\n );\r\n }\r\n\r\n streamState.expectedChunkIndex += 1;\r\n streamState.receivedBytes += chunkBuffer.length;\r\n streamState.stream.write(chunkBuffer);\r\n }\r\n\r\n private handleIncomingClientStreamEndFrame(framePayload: StreamFrameEndPayload): void {\r\n const streamState = this.incomingStreams.get(framePayload.streamId);\r\n\r\n if (!streamState) {\r\n throw new Error(`Stream ${framePayload.streamId} is unknown on client.`);\r\n }\r\n\r\n if (framePayload.chunkCount !== streamState.expectedChunkIndex) {\r\n throw new Error(\r\n `Stream ${framePayload.streamId} chunkCount mismatch. Expected ${streamState.expectedChunkIndex}, received ${framePayload.chunkCount}.`\r\n );\r\n }\r\n\r\n if (framePayload.totalBytes !== streamState.receivedBytes) {\r\n throw new Error(\r\n `Stream ${framePayload.streamId} totalBytes mismatch. Expected ${streamState.receivedBytes}, received ${framePayload.totalBytes}.`\r\n );\r\n }\r\n\r\n if (\r\n streamState.info.totalBytes !== undefined &&\r\n streamState.info.totalBytes !== streamState.receivedBytes\r\n ) {\r\n throw new Error(\r\n `Stream ${framePayload.streamId} violated announced totalBytes (${streamState.info.totalBytes}).`\r\n );\r\n }\r\n\r\n streamState.stream.end();\r\n this.incomingStreams.delete(framePayload.streamId);\r\n }\r\n\r\n private handleIncomingClientStreamAbortFrame(framePayload: StreamFrameAbortPayload): void {\r\n this.abortIncomingClientStream(framePayload.streamId, framePayload.reason);\r\n }\r\n\r\n private handleIncomingStreamFrame(data: unknown): void {\r\n let framePayload: StreamFramePayload | null = null;\r\n\r\n try {\r\n framePayload = parseStreamFramePayload(data);\r\n\r\n if (framePayload.type === \"start\") {\r\n this.handleIncomingClientStreamStartFrame(framePayload);\r\n return;\r\n }\r\n\r\n if (framePayload.type === \"chunk\") {\r\n this.handleIncomingClientStreamChunkFrame(framePayload);\r\n return;\r\n }\r\n\r\n if (framePayload.type === \"end\") {\r\n this.handleIncomingClientStreamEndFrame(framePayload);\r\n return;\r\n }\r\n\r\n this.handleIncomingClientStreamAbortFrame(framePayload);\r\n } catch (error) {\r\n const normalizedError = normalizeToError(\r\n error,\r\n \"Failed to process incoming stream frame on client.\"\r\n );\r\n\r\n if (framePayload) {\r\n this.abortIncomingClientStream(framePayload.streamId, normalizedError.message);\r\n }\r\n\r\n this.notifyError(normalizedError);\r\n }\r\n }\r\n\r\n private notifyConnect(): void {\r\n for (const handler of this.connectHandlers) {\r\n try {\r\n handler();\r\n } catch (error) {\r\n this.notifyError(normalizeToError(error, \"Client connect handler failed.\"));\r\n }\r\n }\r\n }\r\n\r\n private notifyReady(): void {\r\n for (const handler of this.readyHandlers) {\r\n try {\r\n handler();\r\n } catch (error) {\r\n this.notifyError(normalizeToError(error, \"Client ready handler failed.\"));\r\n }\r\n }\r\n }\r\n\r\n private notifyError(error: Error): void {\r\n if (this.errorHandlers.size === 0) {\r\n return;\r\n }\r\n\r\n for (const handler of this.errorHandlers) {\r\n try {\r\n handler(error);\r\n } catch {\r\n // Error handlers should not throw into the event loop.\r\n }\r\n }\r\n }\r\n\r\n private async sendEncryptedEnvelope(envelope: SecureEnvelope): Promise<void> {\r\n if (!this.socket || this.socket.readyState !== WebSocket.OPEN) {\r\n const socketStateError = new Error(\"Client socket is not connected.\");\r\n this.notifyError(socketStateError);\r\n throw socketStateError;\r\n }\r\n\r\n const encryptionKey = this.handshakeState?.encryptionKey;\r\n\r\n if (!encryptionKey) {\r\n const missingKeyError = new Error(\"Missing encryption key for client payload encryption.\");\r\n this.notifyError(missingKeyError);\r\n throw missingKeyError;\r\n }\r\n\r\n try {\r\n const serializedEnvelope = await serializeEnvelope(envelope.event, envelope.data);\r\n const encryptedPayload = encryptSerializedEnvelope(serializedEnvelope, encryptionKey);\r\n this.socket.send(encryptedPayload);\r\n } catch (error) {\r\n const normalizedError = normalizeToError(error, \"Failed to send encrypted client payload.\");\r\n this.notifyError(normalizedError);\r\n throw normalizedError;\r\n }\r\n }\r\n\r\n private sendRpcRequest(\r\n event: string,\r\n data: unknown,\r\n timeoutMs: number\r\n ): Promise<unknown> {\r\n if (!this.socket || this.socket.readyState !== WebSocket.OPEN) {\r\n throw new Error(\"Client socket is not connected for ACK request.\");\r\n }\r\n\r\n const requestId = randomUUID();\r\n\r\n return new Promise<unknown>((resolve, reject) => {\r\n const timeoutHandle = setTimeout(() => {\r\n this.pendingRpcRequests.delete(requestId);\r\n reject(new Error(`ACK response timed out after ${timeoutMs}ms for event \"${event}\".`));\r\n }, timeoutMs);\r\n\r\n timeoutHandle.unref?.();\r\n\r\n this.pendingRpcRequests.set(requestId, {\r\n resolve,\r\n reject,\r\n timeoutHandle\r\n });\r\n\r\n const rpcRequestEnvelope: SecureEnvelope<RpcRequestPayload> = {\r\n event: INTERNAL_RPC_REQUEST_EVENT,\r\n data: {\r\n id: requestId,\r\n event,\r\n data\r\n }\r\n };\r\n\r\n if (!this.isHandshakeReady()) {\r\n this.pendingPayloadQueue.push(rpcRequestEnvelope);\r\n return;\r\n }\r\n\r\n void this.sendEncryptedEnvelope(rpcRequestEnvelope).catch((error) => {\r\n clearTimeout(timeoutHandle);\r\n this.pendingRpcRequests.delete(requestId);\r\n reject(\r\n normalizeToError(error, `Failed to dispatch ACK request for event \"${event}\".`)\r\n );\r\n });\r\n });\r\n }\r\n\r\n private handleRpcResponse(data: unknown): void {\r\n try {\r\n const responsePayload = parseRpcResponsePayload(data);\r\n const pendingRequest = this.pendingRpcRequests.get(responsePayload.id);\r\n\r\n if (!pendingRequest) {\r\n return;\r\n }\r\n\r\n clearTimeout(pendingRequest.timeoutHandle);\r\n this.pendingRpcRequests.delete(responsePayload.id);\r\n\r\n if (responsePayload.ok) {\r\n pendingRequest.resolve(responsePayload.data);\r\n return;\r\n }\r\n\r\n pendingRequest.reject(\r\n new Error(responsePayload.error ?? \"ACK request failed without an error message.\")\r\n );\r\n } catch (error) {\r\n this.notifyError(normalizeToError(error, \"Failed to process client ACK response.\"));\r\n }\r\n }\r\n\r\n private async handleRpcRequest(data: unknown): Promise<void> {\r\n let rpcRequestPayload: RpcRequestPayload;\r\n\r\n try {\r\n rpcRequestPayload = parseRpcRequestPayload(data);\r\n } catch (error) {\r\n this.notifyError(normalizeToError(error, \"Invalid client ACK request payload.\"));\r\n return;\r\n }\r\n\r\n try {\r\n const ackResponse = await this.executeRpcRequestHandler(\r\n rpcRequestPayload.event,\r\n rpcRequestPayload.data\r\n );\r\n\r\n await this.sendEncryptedEnvelope({\r\n event: INTERNAL_RPC_RESPONSE_EVENT,\r\n data: {\r\n id: rpcRequestPayload.id,\r\n ok: true,\r\n data: ackResponse\r\n } satisfies RpcResponsePayload\r\n });\r\n } catch (error) {\r\n const normalizedError = normalizeToError(error, \"Client ACK request handler failed.\");\r\n\r\n await this.sendEncryptedEnvelope({\r\n event: INTERNAL_RPC_RESPONSE_EVENT,\r\n data: {\r\n id: rpcRequestPayload.id,\r\n ok: false,\r\n error: normalizedError.message\r\n } satisfies RpcResponsePayload\r\n });\r\n\r\n this.notifyError(normalizedError);\r\n }\r\n }\r\n\r\n private async executeRpcRequestHandler(event: string, data: unknown): Promise<unknown> {\r\n const handlers = this.customEventHandlers.get(event);\r\n\r\n if (!handlers || handlers.size === 0) {\r\n throw new Error(`No handler is registered for ACK request event \"${event}\".`);\r\n }\r\n\r\n const firstHandler = handlers.values().next().value as SecureClientEventHandler;\r\n return Promise.resolve(firstHandler(data));\r\n }\r\n\r\n private rejectPendingRpcRequests(error: Error): void {\r\n for (const pendingRequest of this.pendingRpcRequests.values()) {\r\n clearTimeout(pendingRequest.timeoutHandle);\r\n pendingRequest.reject(error);\r\n }\r\n\r\n this.pendingRpcRequests.clear();\r\n }\r\n\r\n private handleSessionTicket(data: unknown): void {\r\n if (!this.sessionResumptionConfig.enabled) {\r\n return;\r\n }\r\n\r\n try {\r\n const ticketPayload = parseSessionTicketPayload(data);\r\n const now = Date.now();\r\n\r\n if (ticketPayload.expiresAt <= now) {\r\n return;\r\n }\r\n\r\n const ticketTtlMs = ticketPayload.expiresAt - ticketPayload.issuedAt;\r\n\r\n if (ticketTtlMs > this.sessionResumptionConfig.maxAcceptedTicketTtlMs) {\r\n throw new Error(\"Session ticket TTL exceeds client trust policy.\");\r\n }\r\n\r\n const sessionSecret = decodeBase64ToBuffer(\r\n ticketPayload.secret,\r\n \"Session ticket secret\"\r\n );\r\n\r\n if (sessionSecret.length !== ENCRYPTION_KEY_LENGTH) {\r\n throw new Error(\"Session ticket secret has invalid length.\");\r\n }\r\n\r\n this.sessionTicket = {\r\n sessionId: ticketPayload.sessionId,\r\n secret: sessionSecret,\r\n issuedAt: ticketPayload.issuedAt,\r\n expiresAt: ticketPayload.expiresAt\r\n };\r\n } catch (error) {\r\n this.notifyError(normalizeToError(error, \"Failed to process session ticket payload.\"));\r\n }\r\n }\r\n\r\n private createClientHandshakeState(): ClientHandshakeState {\r\n const { ecdh, localPublicKey } = createEphemeralHandshakeState();\r\n\r\n return {\r\n ecdh,\r\n localPublicKey,\r\n clientHelloSent: false,\r\n pendingServerPublicKey: null,\r\n resumeAttempt: null,\r\n isReady: false,\r\n sharedSecret: null,\r\n encryptionKey: null\r\n };\r\n }\r\n\r\n private sendInternalHandshake(): void {\r\n try {\r\n if (!this.socket || this.socket.readyState !== WebSocket.OPEN) {\r\n return;\r\n }\r\n\r\n if (!this.handshakeState) {\r\n throw new Error(\"Missing client handshake state.\");\r\n }\r\n\r\n if (this.handshakeState.clientHelloSent) {\r\n return;\r\n }\r\n\r\n this.socket.send(\r\n serializePlainEnvelope(INTERNAL_HANDSHAKE_EVENT, {\r\n type: \"hello\",\r\n protocolVersion: HANDSHAKE_PROTOCOL_VERSION,\r\n publicKey: this.handshakeState.localPublicKey\r\n })\r\n );\r\n\r\n this.handshakeState.clientHelloSent = true;\r\n } catch (error) {\r\n this.notifyError(normalizeToError(error, \"Failed to send client handshake payload.\"));\r\n }\r\n }\r\n\r\n private shouldAttemptSessionResumption(): boolean {\r\n if (!this.sessionResumptionConfig.enabled) {\r\n return false;\r\n }\r\n\r\n const sessionTicket = this.sessionTicket;\r\n\r\n if (!sessionTicket) {\r\n return false;\r\n }\r\n\r\n const now = Date.now();\r\n\r\n if (sessionTicket.expiresAt <= now) {\r\n this.sessionTicket = null;\r\n return false;\r\n }\r\n\r\n const ticketTtlMs = sessionTicket.expiresAt - sessionTicket.issuedAt;\r\n\r\n if (ticketTtlMs > this.sessionResumptionConfig.maxAcceptedTicketTtlMs) {\r\n this.sessionTicket = null;\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private sendResumeHandshake(): boolean {\r\n if (!this.socket || this.socket.readyState !== WebSocket.OPEN) {\r\n return false;\r\n }\r\n\r\n if (!this.handshakeState || !this.sessionTicket) {\r\n return false;\r\n }\r\n\r\n if (this.handshakeState.clientHelloSent) {\r\n return false;\r\n }\r\n\r\n if (this.handshakeState.resumeAttempt?.status === \"pending\") {\r\n return true;\r\n }\r\n\r\n try {\r\n const clientNonce = randomBytes(RESUMPTION_NONCE_LENGTH);\r\n const resumedKey = deriveResumedEncryptionKey(this.sessionTicket.secret, clientNonce);\r\n const clientProof = createResumeClientProof(\r\n this.sessionTicket.secret,\r\n this.sessionTicket.sessionId,\r\n clientNonce\r\n );\r\n\r\n this.socket.send(\r\n serializePlainEnvelope(INTERNAL_HANDSHAKE_EVENT, {\r\n type: \"resume\",\r\n protocolVersion: HANDSHAKE_PROTOCOL_VERSION,\r\n sessionId: this.sessionTicket.sessionId,\r\n clientNonce: clientNonce.toString(\"base64\"),\r\n clientProof: clientProof.toString(\"base64\")\r\n } satisfies HandshakeResumePayload)\r\n );\r\n\r\n this.handshakeState.resumeAttempt = {\r\n status: \"pending\",\r\n sessionId: this.sessionTicket.sessionId,\r\n clientNonce,\r\n resumedKey\r\n };\r\n\r\n return true;\r\n } catch (error) {\r\n this.notifyError(normalizeToError(error, \"Failed to dispatch resume handshake payload.\"));\r\n this.sessionTicket = null;\r\n this.handshakeState.resumeAttempt = null;\r\n return false;\r\n }\r\n }\r\n\r\n private completeFullHandshake(serverPublicKey: string): void {\r\n if (!this.handshakeState) {\r\n throw new Error(\"Missing client handshake state.\");\r\n }\r\n\r\n if (this.handshakeState.isReady) {\r\n return;\r\n }\r\n\r\n this.sendInternalHandshake();\r\n\r\n const remotePublicKey = Buffer.from(serverPublicKey, \"base64\");\r\n const sharedSecret = this.handshakeState.ecdh.computeSecret(remotePublicKey);\r\n\r\n this.handshakeState.sharedSecret = sharedSecret;\r\n this.handshakeState.encryptionKey = deriveEncryptionKey(sharedSecret);\r\n this.handshakeState.resumeAttempt = null;\r\n this.handshakeState.pendingServerPublicKey = null;\r\n this.handshakeState.isReady = true;\r\n\r\n void this.flushPendingPayloadQueue();\r\n this.notifyReady();\r\n }\r\n\r\n private fallbackToFullHandshake(): void {\r\n if (!this.handshakeState || this.handshakeState.isReady) {\r\n return;\r\n }\r\n\r\n if (this.handshakeState.resumeAttempt) {\r\n this.handshakeState.resumeAttempt.status = \"failed\";\r\n }\r\n\r\n const pendingServerPublicKey = this.handshakeState.pendingServerPublicKey;\r\n\r\n if (pendingServerPublicKey) {\r\n this.completeFullHandshake(pendingServerPublicKey);\r\n return;\r\n }\r\n\r\n this.sendInternalHandshake();\r\n }\r\n\r\n private handleServerHelloHandshake(payload: HandshakeHelloPayload): void {\r\n if (!this.handshakeState || this.handshakeState.isReady) {\r\n return;\r\n }\r\n\r\n this.handshakeState.pendingServerPublicKey = payload.publicKey;\r\n\r\n if (this.shouldAttemptSessionResumption() && this.sendResumeHandshake()) {\r\n return;\r\n }\r\n\r\n this.completeFullHandshake(payload.publicKey);\r\n }\r\n\r\n private handleResumeAckHandshake(payload: HandshakeResumeAckPayload): void {\r\n if (!this.handshakeState || this.handshakeState.isReady) {\r\n return;\r\n }\r\n\r\n const resumeAttempt = this.handshakeState.resumeAttempt;\r\n\r\n if (!resumeAttempt || resumeAttempt.status !== \"pending\") {\r\n return;\r\n }\r\n\r\n if (!payload.ok) {\r\n this.sessionTicket = null;\r\n this.fallbackToFullHandshake();\r\n return;\r\n }\r\n\r\n if (payload.sessionId !== resumeAttempt.sessionId || !payload.serverProof) {\r\n this.sessionTicket = null;\r\n this.fallbackToFullHandshake();\r\n return;\r\n }\r\n\r\n try {\r\n const receivedServerProof = decodeBase64ToBuffer(\r\n payload.serverProof,\r\n \"Handshake resume-ack serverProof\"\r\n );\r\n\r\n const expectedServerProof = createResumeServerProof(\r\n resumeAttempt.resumedKey,\r\n resumeAttempt.sessionId,\r\n resumeAttempt.clientNonce\r\n );\r\n\r\n if (!equalsConstantTime(receivedServerProof, expectedServerProof)) {\r\n throw new Error(\"Resume server proof validation failed.\");\r\n }\r\n\r\n this.handshakeState.sharedSecret = resumeAttempt.resumedKey;\r\n this.handshakeState.encryptionKey = resumeAttempt.resumedKey;\r\n this.handshakeState.pendingServerPublicKey = null;\r\n resumeAttempt.status = \"accepted\";\r\n this.handshakeState.isReady = true;\r\n\r\n void this.flushPendingPayloadQueue();\r\n this.notifyReady();\r\n } catch (error) {\r\n this.notifyError(normalizeToError(error, \"Failed to verify resume server proof.\"));\r\n this.sessionTicket = null;\r\n this.fallbackToFullHandshake();\r\n }\r\n }\r\n\r\n private handleInternalHandshake(data: unknown): void {\r\n try {\r\n const payload = parseHandshakePayload(data);\r\n\r\n if (!this.handshakeState) {\r\n throw new Error(\"Missing client handshake state.\");\r\n }\r\n\r\n if (this.handshakeState.isReady) {\r\n return;\r\n }\r\n\r\n if (payload.type === \"hello\") {\r\n this.handleServerHelloHandshake(payload);\r\n return;\r\n }\r\n\r\n if (payload.type === \"resume-ack\") {\r\n this.handleResumeAckHandshake(payload);\r\n return;\r\n }\r\n\r\n throw new Error(\"SecureClient received unexpected resume request handshake payload.\");\r\n } catch (error) {\r\n this.notifyError(normalizeToError(error, \"Failed to complete client handshake.\"));\r\n }\r\n }\r\n\r\n private isHandshakeReady(): boolean {\r\n return this.handshakeState?.isReady ?? false;\r\n }\r\n\r\n private async flushPendingPayloadQueue(): Promise<void> {\r\n if (!this.socket || this.socket.readyState !== WebSocket.OPEN || !this.isHandshakeReady()) {\r\n return;\r\n }\r\n\r\n const pendingPayloads = this.pendingPayloadQueue;\r\n this.pendingPayloadQueue = [];\r\n\r\n for (const envelope of pendingPayloads) {\r\n await this.sendEncryptedEnvelope(envelope);\r\n }\r\n }\r\n}\r\n"]}