/// <reference types="node" />
/// <reference types="node" />
/// <reference types="node" />
/// <reference types="node" />
/// <reference types="node" />
import * as http from 'http';
import * as tls from 'tls';
import { UrlWithStringQuery } from 'url';
import WebSocket from 'ws';
import { Request, Response, RuntimeOptions } from './core';
export declare enum WebSocketMessageType {
    Text = 0,
    Binary = 1,
    Ping = 2,
    Pong = 3,
    Close = 4
}
export interface WebSocketMessage {
    type: WebSocketMessageType;
    payload: Buffer;
    headers: {
        [key: string]: string;
    };
    timestamp: Date;
}
export interface WebSocketSessionInfo {
    sessionID: string;
    requestID: string;
    connectedAt: Date;
    remoteAddr: string;
    localAddr: string;
    attributes: {
        [key: string]: any;
    };
}
export declare function getWebSocketPingInterval(runtime: RuntimeOptions | null | undefined): number | undefined;
export declare function getWebSocketPongTimeout(runtime: RuntimeOptions | null | undefined): number | undefined;
export declare function getWebSocketEnableReconnect(runtime: RuntimeOptions | null | undefined): boolean | undefined;
export declare function getWebSocketReconnectInterval(runtime: RuntimeOptions | null | undefined): number | undefined;
export declare function getWebSocketMaxReconnectTimes(runtime: RuntimeOptions | null | undefined): number | undefined;
export declare function getWebSocketWriteTimeout(runtime: RuntimeOptions | null | undefined): number | undefined;
export declare function getWebSocketHandshakeTimeout(runtime: RuntimeOptions | null | undefined): number | undefined;
export declare function getWebSocketHandler(runtime: RuntimeOptions | null | undefined): WebSocketHandler | undefined;
export declare function newWebSocketResponse(statusCode: number, statusMessage: string, headers: http.IncomingHttpHeaders): Response;
export interface WebSocketHandler {
    afterConnectionEstablished(session: WebSocketSessionInfo): Promise<void> | void;
    handleRawMessage(session: WebSocketSessionInfo, message: WebSocketMessage): Promise<void> | void;
    handleError(session: WebSocketSessionInfo, err: Error): Promise<void> | void;
    afterConnectionClosed(session: WebSocketSessionInfo, code: number, reason: string): Promise<void> | void;
}
export declare class AbstractWebSocketHandler implements WebSocketHandler {
    afterConnectionEstablished(_session: WebSocketSessionInfo): void;
    handleRawMessage(_session: WebSocketSessionInfo, _message: WebSocketMessage): void;
    handleError(_session: WebSocketSessionInfo, _err: Error): void;
    afterConnectionClosed(_session: WebSocketSessionInfo, _code: number, _reason: string): void;
}
export interface WebSocketClient {
    connect(request: Request, runtimeObject: RuntimeOptions): Promise<Response>;
    disconnect(): Promise<void>;
    reconnect(): Promise<Response>;
    reconnectGracefully(): Promise<Response>;
    isConnected(): boolean;
    sendText(text: string): Promise<void>;
    sendBinary(data: Buffer): Promise<void>;
    getSessionInfo(): WebSocketSessionInfo | null;
    close(): Promise<void>;
}
export declare class DefaultWebSocketClient implements WebSocketClient {
    private handler;
    private stopped;
    private pongReceived;
    private state;
    private conn;
    session: WebSocketSessionInfo | null;
    private request;
    private runtimeObject;
    private reconnectCount;
    private pingTimer;
    private pingInterval;
    private reconnectInterval;
    private writeTimeout;
    private readTimeout;
    private pongTimeout;
    private maxReconnectTimes;
    private reconnectLock;
    private abortController;
    private messageHandlersStarted;
    constructor(handler: WebSocketHandler);
    connect(request: Request, runtimeObject: RuntimeOptions): Promise<Response>;
    disconnect(): Promise<void>;
    private disconnectInternal;
    reconnect(): Promise<Response>;
    reconnectGracefully(): Promise<Response>;
    private reconnectInternal;
    private cleanupResources;
    isConnected(): boolean;
    sendText(text: string): Promise<void>;
    sendBinary(data: Buffer): Promise<void>;
    getSessionInfo(): WebSocketSessionInfo | null;
    close(): Promise<void>;
    configureTLS(runtimeObject: RuntimeOptions): tls.ConnectionOptions;
    configureProxy(wsOptions: WebSocket.ClientOptions, parsed: UrlWithStringQuery | null, runtimeObject: RuntimeOptions, request: Request): void;
    configureSOCKS5Proxy(wsOptions: WebSocket.ClientOptions, runtimeObject: RuntimeOptions): void;
    configureHTTPProxy(wsOptions: WebSocket.ClientOptions, parsed: UrlWithStringQuery | null, runtimeObject: RuntimeOptions, request: Request): void;
    configureNetDialer(_wsOptions: WebSocket.ClientOptions, _runtimeObject: RuntimeOptions, _connectTimeout: number): void;
    private updateTimeoutConfig;
    private setupPongHandler;
    private startMessageHandlers;
    private startPingPong;
    private stopPingPong;
    private cleanupConnection;
    private sendWithTimeout;
    private waitForClose;
    private sleepInterruptible;
}
export declare function newDefaultWebSocketClient(handler: WebSocketHandler): DefaultWebSocketClient;
export declare function newWebSocketClientAndConnect(request: Request, runtimeObject: RuntimeOptions): Promise<{
    client: DefaultWebSocketClient;
    response: Response;
}>;
export declare function buildWebSocketURL(request: Request): string;
export declare function convertToWebSocketMessageType(messageType: number): WebSocketMessageType;
