import { BatchOption, CancelableOption, CancelablePromise, ComplexTypesOption, DataType, ResponseTimeoutOption, ReturnDataTypeOption, SendTimeoutOption } from "ziron-client";
import EventEmitter from "emitix";
import Logger from "./Logger";
type LocalEventEmitter = EventEmitter<{
    'leadershipChange': [boolean];
    'brokersChange': [string[]];
    'sessionIdChange': [string];
    'sessionSharedUpdate': [any, any];
    'error': [Error];
}>;
export default class StateClient {
    private readonly options;
    private readonly _logger;
    private readonly _localEmitter;
    readonly once: LocalEventEmitter['once'];
    readonly on: LocalEventEmitter['on'];
    readonly off: LocalEventEmitter['off'];
    private readonly _emit;
    private readonly _stateSocket;
    private _invokeJoinRetryTicker;
    private _initJoinCalled;
    get connected(): boolean;
    readonly stateId?: string;
    private initJoined;
    private initJoinResolve;
    private initJoinReject;
    readonly initJoin: Promise<void>;
    /**
     * @description
     * Do custom invokes with the state socket.
     * Be careful only to use custom procedures.
     * @param procedure
     * @param data
     * @param options
     */
    invoke<RDT extends true | false | undefined, C extends boolean | undefined = undefined>(procedure: Exclude<string, '#join' | '#leave'>, data?: any, options?: BatchOption & SendTimeoutOption & CancelableOption<C> & ResponseTimeoutOption & ComplexTypesOption & ReturnDataTypeOption<RDT>): C extends true ? CancelablePromise<RDT extends true ? [any, DataType] : any> : Promise<RDT extends true ? [any, DataType] : any>;
    /**
     * @description
     * Do custom transmits with the state socket.
     * Be careful only to use custom receivers.
     * @param receiver
     * @param data
     * @param options
     */
    transmit<C extends boolean | undefined = undefined>(receiver: string, data?: any, options?: BatchOption & SendTimeoutOption & CancelableOption<C> & ComplexTypesOption): C extends true ? CancelablePromise<void> : Promise<void>;
    readonly sessionShared: Record<any, any>;
    readonly clusterSessionId: string;
    readonly leader: boolean;
    get brokers(): string[];
    private _currentBrokerUpdate;
    private readonly _joinData;
    constructor(options: {
        joinTokenUri: string;
        joinTokenSecret: string;
        sharedData: Record<any, any>;
        joinPayload: Record<any, any>;
        id: string;
        path: string;
        port: number;
    }, _logger: Logger);
    private _invokeJoin;
    join(): Promise<void>;
    private _handleBrokerUpdate;
    private _updateLeadership;
    private _updateClusterSessionId;
    private _updateClusterSessionShared;
}
export {};
