/// <reference types="node" />
import { EventEmitter } from "events";
export interface Options {
    redis: {
        host?: string;
        port?: number;
        url?: string;
    };
    kind?: string;
    meta?: any;
}
export declare type State = "candidate" | "leader" | "follower";
export interface Instance {
    id: string;
    state: State;
    meta: any;
}
export declare class Candidate extends EventEmitter {
    private kind;
    private __meta;
    private running;
    private __instanceId;
    private redisClient;
    private subscriptionClient;
    private leaderSubscription;
    private followerSubscription;
    private privateSubsciption;
    private votes;
    private votedFor;
    private __currentTerm;
    private __state;
    private timeout;
    private requestInterval;
    private leadershipInterval;
    private countNodesInterval;
    private stopCheckInterval;
    private startCheckInterval;
    constructor(options: Options);
    private keepAlive;
    private getInstanceCount;
    getInstances(): Promise<Instance[]>;
    startTimeout(): Promise<void>;
    private startLeadership;
    private setState;
    private _stop;
    private subscribePrivateChannel;
    private unsubscribePrivateChannel;
    private subscribeFollowerChannel;
    private unsubscribeFollowerChannel;
    private subscribeLeaderChannel;
    private unsubscribeLeaderChannel;
    private _start;
    start(): Promise<void>;
    stop(): Promise<void>;
    reelect(): Promise<void>;
    stepdown(): Promise<void>;
    messageFollowers(message: string): Promise<void>;
    messageTo(to: string, message: string): Promise<void>;
    messageAll(message: string): Promise<void>;
    messageLeader(message: string): Promise<void>;
    get currentTerm(): number;
    get id(): string;
    get state(): State;
    getLeader(): Promise<Instance | undefined>;
    setMeta(meta: any): Promise<void>;
    get meta(): {};
}
export default Candidate;
