import * as signalR from "@microsoft/signalr";
import { IDataFrame } from "../DataFrame";
import { ConnectionResult, IExalusConnectionService, AuthorizationInfo, ConnectionState, StreamHandler } from "./IExalusConnectionService";
import { ITypedEvent } from "../TypedEvent";
export declare class SignalrLogger implements signalR.ILogger {
    private readonly _log;
    log(level: signalR.LogLevel, message: string): void;
}
export declare class ExalusConnectionService implements IExalusConnectionService {
    private static readonly PING_INTERVAL_MS;
    private static readonly MAX_CONSECUTIVE_PING_FAILURES;
    private static readonly SERVER_TIMOUT_MS;
    static SignalRLogLevel: signalR.LogLevel;
    private _connection?;
    private _connectTask;
    private _pingTimerId;
    private _consecutivePingFailures;
    private _disconnectedOnPurpose;
    private _address;
    private _serversBrokerAddress;
    private readonly _serversBrokerAddressList;
    private _allBrokersChecked;
    private readonly _packetsBrokerServers;
    private _serialId?;
    private _PIN?;
    private _lastReceivedPacket;
    private _everConnected;
    private readonly _pendingRequests;
    private readonly _log;
    private _controllerConfiguration;
    private _cache;
    private _session;
    private readonly _dataReceivedEvent;
    private readonly _pongReceivedEvent;
    private readonly _authorizationReceivedEvent;
    private readonly _registrationReceivedEvent;
    private readonly _streamStartedEvent;
    private readonly _connectionStateChangedEvent;
    private readonly _errorOccuredEvent;
    static readonly ServiceName = "ExalusConnectionService";
    GetServiceName(): string;
    GetAuthorizationInfo(): AuthorizationInfo | null;
    GetControllerSerialNumber(): string | undefined;
    GetControllerPin(): string | undefined;
    SetServersBrokerAddress(a: string): void;
    SetDefaultPacketsBrokerAddress(a: string): void;
    EnablePacketsLogging(): void;
    DisablePacketsLogging(): void;
    SubscribeTo<T>(resourceId: string, handler: (d: IDataFrame<T>) => void): () => void;
    GetServerAddressAsync(): Promise<string | null>;
    private rotateServersBroker;
    ConnectAsync(address: string): Promise<ConnectionResult>;
    ConnectAndAuthorizeAsync(info: AuthorizationInfo): Promise<ConnectionResult>;
    AuthorizeAsync(info: AuthorizationInfo): Promise<boolean>;
    IsConnected(): boolean;
    DisconnectAsync(): Promise<void>;
    SendAsync(dataFrame: IDataFrame<any>, logTx?: boolean): Promise<boolean>;
    SendAndWaitForResponseAsync<T>(dataFrame: IDataFrame<any>, timeout: number, useCache: boolean, logTransmission?: boolean): Promise<IDataFrame<T>>;
    SendAndHandleResponseAsync<T>(dataFrame: IDataFrame<any>, timeout: number, dataHandler: (r: IDataFrame<T>) => void, logTransmission?: boolean): Promise<void>;
    SendAndHandleStreamAsync<T>(dataFrame: IDataFrame<any>, streamHandler: StreamHandler<T>, logTransmission?: boolean): Promise<void>;
    PingControllerAsync(): Promise<boolean>;
    OnDataReceivedEvent(): ITypedEvent<any>;
    OnConnectionStateChangedEvent(): ITypedEvent<ConnectionState>;
    OnErrorOccuredEvent(): ITypedEvent<[string, string]>;
    private serialisedConnect;
    private connectCore;
    private waitForReconnection;
    private initializeServices;
    private wireConnectionEvents;
    private startPingLoop;
    private pingOnce;
    private validateConnectionToController;
    private _tryReconnect;
    private _onVisibility;
    private _onHidden;
    private _onVisible;
    private cleanup;
}
