import type { WebSocket as WebSocketRawType } from 'ws';
import { WebSocketServer as WebSocketServerRaw } from 'ws';
import { NormalizedServerConfig } from '../index.js';
import { HmrEngine } from './hmr-engine.js';
import { Server } from './type.js';
import type { ILogger } from '../index.js';
export interface IWebSocketServer {
    clients: Set<WebSocketClient>;
    listen(): void;
    send(payload: any): void;
    send<T extends string>(event: T, payload?: any): void;
    close(): Promise<void>;
    on(event: string, listener: any): void;
    off(event: string, listener: any): void;
}
export type WebSocketCustomListener<T> = (data: T, client: WebSocketClient) => void;
export interface WebSocketClient {
    send(payload: any): void;
    send(event: string, payload?: any['data']): void;
    rawSend(str: string): void;
    socket: WebSocketRawType;
}
export default class WsServer implements IWebSocketServer {
    private httpServer;
    private config;
    private hmrEngine;
    wss: WebSocketServerRaw;
    customListeners: Map<string, Set<WebSocketCustomListener<any>>>;
    clientsMap: WeakMap<WebSocketRawType, WebSocketClient>;
    bufferedError: any;
    logger: ILogger;
    private hmrOrigins;
    constructor(httpServer: Server, config: NormalizedServerConfig, hmrEngine: HmrEngine, logger?: ILogger);
    private generateHMROrigins;
    private createWebSocketServer;
    private upgradeWsServer;
    listen(): void;
    send(...args: any[]): void;
    private isHMRRequest;
    private handleHMRUpgrade;
    get clients(): Set<WebSocketClient>;
    sendCustomEvent<T extends string>(event: T, payload?: any): void;
    on(event: string, listener: (...args: any[]) => void): void;
    off(event: string, listener: () => void): void;
    connection(): void;
    close(): Promise<void>;
    private terminateAllClients;
    private closeWebSocketServer;
    private addCustomEventListener;
    private removeCustomEventListener;
    private getSocketClient;
    private sendMessage;
    private handleSocketError;
}
