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;
}