import { Socket as SocketIOClient } from 'socket.io-client';
/**
 * Опции для WebSocket клиента
 */
export interface WebSocketClientOptions {
    /**
     * HTTP заголовки для WebSocket соединения
     */
    headers?: Record<string, string>;
    /**
     * Таймаут подключения в миллисекундах
     */
    connectionTimeout?: number;
    /**
     * Протоколы WebSocket
     */
    protocols?: string | string[];
    /**
     * Максимальное количество попыток переподключения
     */
    maxRetries?: number;
    /**
     * Задержка перед попыткой переподключения в миллисекундах
     */
    retryDelay?: number;
    /**
     * Максимальная задержка перед попыткой переподключения
     */
    maxRetryDelay?: number;
    /**
     * Автоматически переподключаться при потере соединения
     */
    autoReconnect?: boolean;
    /**
     * Отклонять неавторизованные соединения
     */
    rejectUnauthorized?: boolean;
    /**
     * API ключ для аутентификации
     */
    apiKey?: string;
    /**
     * Пространство имен Socket.IO для подключения
     */
    namespace?: string;
    /**
     * Функция для логирования сообщений
     */
    logger?: (level: string, message: string, data?: any) => void;
    /**
     * Интервал для отправки ping-сообщений (мс)
     */
    pingInterval?: number;
    /**
     * Таймаут ожидания pong-ответа (мс)
     */
    pingTimeout?: number;
    /**
     * Включить расширенную отладку
     */
    debug?: boolean;
}
/**
 * Интерфейс для обработчика события WebSocket
 */
export interface WebSocketEventHandler {
    (event: any): void;
}
/**
 * Базовый класс для WebSocket клиентов, реализованный на базе Socket.IO
 */
export declare class WebSocketClient {
    /** URL для подключения */
    protected readonly url: string;
    /** Опции клиента */
    protected readonly options: WebSocketClientOptions;
    /** Экземпляр Socket.IO */
    protected socket: SocketIOClient | null;
    /** Счетчик попыток переподключения */
    protected retryCount: number;
    /** Флаг, указывающий, что соединение было закрыто намеренно */
    protected intentionallyClosed: boolean;
    /** Таймер переподключения */
    protected reconnectTimer: any;
    /** Таймер таймаута соединения */
    protected connectionTimeoutTimer: any;
    /** Обработчики событий */
    protected eventHandlers: Record<string, WebSocketEventHandler[]>;
    /** Очередь сообщений для отправки после подключения */
    protected messageQueue: Array<any>;
    /** Состояние соединения */
    protected connected: boolean;
    /** Среда выполнения */
    protected readonly isBrowser: boolean;
    /** Аутентифицировано ли соединение */
    protected authenticated: boolean;
    /** Пространство имен Socket.IO */
    protected namespace: string;
    /** Функция логирования */
    protected logger: (level: string, message: string, data?: any) => void;
    /** ID сокета */
    protected socketId: string | null;
    /** Хранилище ожидающих callback-функций */
    protected _pendingCallbacks: Map<string, (response: any) => void>;
    /** Таймер проверки состояния соединения */
    protected healthCheckTimer: any;
    /** Время последнего полученного pong */
    protected lastPongTimestamp: number;
    /** Интервал проверки здоровья соединения */
    protected healthCheckInterval: number;
    /**
     * Тип для хранения отложенных обработчиков событий
     * @private
     */
    protected _pendingCallbackHandlers: Map<string, WebSocketEventHandler>;
    /**
     * Создает новый WebSocket клиент
     * @param {string} url URL для подключения
     * @param {WebSocketClientOptions} [options] Опции клиента
     */
    constructor(url: string, options?: WebSocketClientOptions);
    /**
     * Получает WebSocket URL из HTTP URL
     * @returns {string} WebSocket URL
     * @private
     */
    private getWebSocketURL;
    /**
     * Подключается к WebSocket серверу используя Socket.IO клиент
     * @returns {Promise<void>}
     */
    connect(): Promise<void>;
    /**
     * Получает код закрытия WebSocket из строки причины Socket.IO
     * @param {string} reason Причина закрытия Socket.IO
     * @returns {number} Код закрытия WebSocket
     * @private
     */
    private getCloseCodeFromReason;
    /**
     * Настраивает проверку состояния соединения для обнаружения "зависших" подключений
     * @private
     */
    protected setupConnectionHealthCheck(): void;
    /**
     * Останавливает проверку состояния соединения
     * @private
     */
    protected stopConnectionHealthCheck(): void;
    /**
     * Закрывает соединение WebSocket
     * @param {number} code Код закрытия
     * @param {string} reason Причина закрытия
     */
    close(code?: number, reason?: string): void;
    /**
     * Отправляет сообщение в WebSocket
     * @param {any} data Данные для отправки
     * @returns {boolean} Успешно ли отправлено сообщение
     */
    send(data: any): boolean;
    /**
     * Отправляет событие с данными и ожидает ответа с помощью Promise
     * @param {string} event Название события
     * @param {any} data Данные события
     * @param {number} [timeout=5000] Таймаут ожидания ответа в мс
     * @returns {Promise<any>} Promise с ответом
     */
    emitWithAck(event: string, data: any, timeout?: number): Promise<any>;
    /**
     * Добавляет обработчик события
     * @param {string} eventType Тип события
     * @param {WebSocketEventHandler} handler Обработчик события
     */
    on(eventType: string, handler: WebSocketEventHandler): void;
    /**
     * Удаляет обработчик события
     * @param {string} eventType Тип события
     * @param {WebSocketEventHandler} [handler] Обработчик события (если не указан, удаляются все обработчики)
     */
    off(eventType: string, handler?: WebSocketEventHandler): void;
    /**
     * Отправляет событие в обработчики
     * @param {string} eventType Тип события
     * @param {any} data Данные события
     * @private
     */
    protected dispatchEvent(eventType: string, data: any): void;
    /**
     * Возвращает текущий статус соединения
     * @returns {boolean} Подключен ли клиент
     */
    isConnected(): boolean;
    /**
     * Выполняет принудительное переподключение
     * @returns {Promise<void>} Promise без результата
     */
    reconnect(): Promise<void>;
    /**
     * Отправляет событие (алиас для более удобного использования)
     * @param {string} eventName Название события
     * @param {any} data Данные события
     * @returns {boolean} Успешно ли отправлено событие
     */
    emit(eventName: string, data: any): boolean;
    /**
     * Возвращает ID сокета, если соединение установлено
     * @returns {string|null} ID сокета или null, если соединение не установлено
     */
    getSocketId(): string | null;
    /**
     * Устанавливает функцию логирования
     * @param {Function} loggerFn Функция для логирования
     */
    setLogger(loggerFn: (level: string, message: string, data?: any) => void): void;
    /**
     * Регистрирует обработчик события, который будет вызван один раз и удален
     * @param {string} event Название события
     * @param {WebSocketEventHandler} handler Обработчик события
     * @returns {void}
     */
    once(event: string, handler: WebSocketEventHandler): void;
    /**
     * Отправляет событие Socket.IO через WebSocket соединение
     * @param {string} event Имя события
     * @param {any} data Данные события
     * @param {(response: any) => void} [callback] Функция обратного вызова для получения ответа
     * @param {string} [namespace=''] Namespace для Socket.IO
     * @returns {boolean} Успешно ли отправлено сообщение
     */
    sendSocketIOEvent(event: string, data: any, callback?: (response: any) => void, namespace?: string): boolean;
}
//# sourceMappingURL=websocket-client.d.ts.map