import type { JSONValue, WebSocketBackend } from './types.js';
import type { UserAgentResponse } from './user-agent/response.js';
import EventEmitter from 'node:events';
interface WebSocketControlEvents {
    close: (this: WebSocket, ...args: any[]) => void;
    ping: (this: WebSocket, ...args: any[]) => void;
    pong: (this: WebSocket, ...args: any[]) => void;
}
interface WebSocketEvents extends WebSocketControlEvents {
    error: (this: WebSocket, error: Error) => void;
    message: (this: WebSocket, message: JSONValue | Buffer) => void;
}
declare interface WebSocketEventEmitter {
    on: <T extends keyof WebSocketEvents>(event: T, listener: WebSocketEvents[T]) => this;
    emit: <T extends keyof WebSocketEvents>(event: T, ...args: Parameters<WebSocketEvents[T]>) => boolean;
}
/**
 * WebSocket connection class.
 */
declare class WebSocket extends EventEmitter implements WebSocketEventEmitter {
    /**
     * WebSocket handshake.
     */
    handshake: UserAgentResponse | null;
    /**
     * JSON mode.
     */
    jsonMode: boolean;
    _ws: WebSocketBackend;
    constructor(ws: WebSocketBackend, handshake: UserAgentResponse | null, options: {
        jsonMode: boolean;
    });
    [Symbol.asyncIterator](): AsyncIterableIterator<JSONValue | Buffer>;
    /**
     * Close WebSocket connection.
     */
    close(code?: number, reason?: string): void;
    /**
     * Send WebSocket ping frame.
     */
    ping(data: Buffer): Promise<void>;
    /**
     * Send WebSocket message.
     */
    send(message: any): Promise<void>;
    _messageIterator(): AsyncIterableIterator<(JSONValue | Buffer)[]>;
    _safeHandler<T extends keyof WebSocketControlEvents>(event: T, ...args: Parameters<WebSocketControlEvents[T]>): void;
    _safeMessageHandler(message: Buffer, isBinary: boolean): void;
}
export { WebSocket };
