import EventEmitter from 'node:events'; import type { WebSocket } from 'ws'; import type { Encryption } from './encrypt.js'; import type { Header, Message } from './protocol.js'; import { Version } from './version.js'; export interface Frame

= Header

> { session: Session; message: Message; header: H; body: B; purpose: P; requestId: string; version: Version; } export type Handler = Frame

> = (this: This, frame: F) => boolean | undefined; export type ExtendEventMap> = C extends { new (...args: infer Args): infer Inst; } ? Inst extends EventEmitter ? { new (...args: Args): Inst & EventEmitter; } : C : C; export interface SessionEvents { customFrame: [frame: Frame]; disconnect: [session: Session]; encryptionEnabled: [session: Session]; error: [err: unknown]; message: [frame: Frame]; } export declare class Session extends EventEmitter { socket: WebSocket; version: Version; encrypted: boolean; encryption: Encryption | null; private responserMap; private handlerMap; constructor(socket: WebSocket, version?: Version); isEncrypted(): boolean; sendMessage(message: object): void; sendFrame(purpose: string, body: unknown, requestId?: string, extraHeaders?: Record): void; hasResponser(requestId: string): boolean; /** * Do not specify the type of frame in responser if you want to validate the frame. */ setResponser(requestId: string, responser: Handler): void; clearResponser(requestId: string): boolean; hasHandler(purpose: string): boolean; /** * Do not specify the type of frame in handler if you want to validate the frame. */ setHandler

= Frame

>(purpose: P, handler: Handler): void; clearHandler(purpose: string): boolean; setEncryption(encryption: Encryption | null): void; }