/// <reference types="node" />
import { PadLocalClient } from "../PadLocalClient";
import { EventEmitter } from "events";
import { Bytes } from "../utils/ByteUtils";
import { LongLinkMessage, WeChatLongLinkRequest } from "../proto/padlocal_pb";
import VError from "verror";
import { Host } from "../utils/Host";
export declare type WeChatLongLinkProxyEvent = "heartbeat" | "message-push" | "push" | "status";
export declare class WeChatLongLinkProxy extends EventEmitter {
    private static readonly REQUEST_TIMEOUT;
    private static readonly CONNECT_TIMEOUT;
    private static readonly SOCKET_TIMEOUT;
    private static readonly HEART_BEAT_INTERVAL;
    private _heartBeatTimer?;
    private _hostList?;
    private _status;
    private _socket?;
    private _socketConnectTimeout?;
    private _id?;
    private readonly _instanceId;
    private _socketPromise?;
    private _reconnectDelayTimer?;
    private readonly _reconnectStrategy;
    private readonly _requestCallbackMap;
    private readonly _serialExecutor;
    private _streamCallback?;
    private readonly _client;
    emit(event: "heartbeat", detail: HeartBeatEventPayload): boolean;
    emit(event: "message-push"): boolean;
    emit(event: "push", detail: Array<LongLinkMessage>): boolean;
    emit(event: "status", detail: StatusEventPayload): boolean;
    constructor(client: PadLocalClient);
    updateHostList(hostList: Array<Host>): boolean;
    reconnect(): Promise<void>;
    /**
     * disconnect long link
     */
    shutdown(clearHost?: boolean): void;
    isConnected(): boolean;
    isIdle(): boolean;
    getId(): string | undefined;
    makeSureConnected(): Promise<void>;
    sendStreamData(data: Bytes, streamCallback?: LongLinkStreamCallback): void;
    sendRequest(longLinkRequest: WeChatLongLinkRequest): Promise<void>;
    private _updateStatus;
    private _resetHeartBeatTimer;
    private _startHeartbeat;
    private _stopHeartbeat;
    private _clearReconnectTimer;
    private _notifyRequestCallback;
    private _notifyAllRequestCallbackWithError;
    private _destroyLongLink;
    private _onSocketError;
    private _tryReconnect;
    private _connect;
    private _onSocketData;
    private _adjustHostQuality;
    private _currentHost;
}
export declare enum Status {
    IDLE = 0,
    CONNECTING = 1,
    HALF_CONNECTED = 2,
    CONNECTED = 3,
    STOP = 4,
    ERROR = 5
}
export interface StatusEventPayload {
    newStatus: Status;
    oldStatus: Status;
}
export interface HeartBeatEventPayload {
    heartBeatSeq: number;
}
export declare class IOError extends VError {
}
export interface LongLinkStreamCallback {
    onStreamData(data: Bytes): Promise<boolean>;
}
