import ' rollup-plugin-inject-process-env';
import { Request, Response } from "stentor-models";
import { ActionType } from "../store/ChatAction";
import { ChatServer, ChatServerOptions, OfflineMessage, VisitorInfoMessage } from "./ChatServer";
import { ChatMessageRequest, ChatServerMessage } from "./ChatServerMessage";
export interface StentorRouterChatConfig {
    readonly url: string;
}
export interface FailureData {
    readonly type: "BOT";
    readonly tries: number;
    readonly delay: number;
    readonly error: string;
}
export type MessageData = Request | Response | ConnectionStatus | FailureData | undefined;
export interface ConnectionStatus {
    sessionCreated: boolean;
    errorMessage?: string;
}
export type EventType = "account status" | "connection update" | "new message" | "user joined" | "user left" | "typing" | "stop typing" | "disconnect" | "reconnect" | "reconnect failed" | "reconnect error" | "barge in" | "barge out" | "failure";
export interface RouterMessage {
    event: EventType;
    data: MessageData;
    sender: VisitorInfo;
    sessionId: string;
    timeMs: number;
}
export interface VisitorInfo {
    deviceId: "Widget" | "Bot" | "Router";
    userId: string;
    isAdmin: boolean;
    avatarPath?: string;
    displayName?: string;
    email?: string;
    urlAttributes: {
        path?: string[];
        query?: {
            [name: string]: string;
        };
    };
}
export type HandlerStore = {
    [event in EventType]: (data: MessageData, sender: VisitorInfo, ts: number) => void;
};
export declare const ROUTER_USER = "router";
export declare class StentorRouterChat implements ChatServer {
    private dispatch;
    private isDisposed;
    private _userId;
    private _sessionId;
    private visitorInfo;
    private accessToken;
    private attributes;
    private isNewSession;
    private isAdmin;
    private urlAttributes;
    private readonly config;
    private readonly options;
    private readonly configurableMessages;
    private serverUrl;
    private ws;
    private handlers;
    private sessionCreated;
    private appId;
    private noOfServerErrors;
    constructor(config: StentorRouterChatConfig, options?: ChatServerOptions);
    init(dispatch: (action: ActionType) => void): void;
    private autoReconnect;
    private wsClose;
    private wsCreate;
    private checkConnection;
    private emit;
    private setAccountStatus;
    private setConnectionStatus;
    sendOfflineMsg(_: OfflineMessage, cb: (error?: Error) => void): void;
    sendChatMsg(message: ChatServerMessage, cb: (err?: Error) => void): Promise<void>;
    private sendFailureMessage;
    private sendDisconnectMessage;
    private checkSession;
    sendChatMsgRequest(serviceRequest: ChatMessageRequest, cb: (err?: Error) => void): Promise<void>;
    sendTyping(_isTyping: boolean): void;
    setVisitorInfo(visitorInfoMessage: VisitorInfoMessage, sessionId: string, cb: (error?: Error) => void): void;
    sendChatRating(): void;
    sendFile(_: File, cb: (err?: Error) => void): void;
    markAsRead(): void;
    flush(): void;
    dispose(): void;
    sleep(): void;
    wakeup(): void;
    bargeOut(_cb: (err?: Error) => void): Promise<void>;
    bargeIn(agentName: string, _cb: (err?: Error) => void): Promise<void>;
    private postVisitorInfo;
    private postMessage;
    private startSession;
}
/**
 *
 * @param check Function that return true/false if the resource is available
 * @param stepMs check period in ms
 * @param timeoutMs max wait in ms
 * @param resource optional resource name. you will see a log message for every check (step)
 *
 * @returns the elapsed time in ms (both resolve/reject)
 */
export declare function waitFor(check: {
    (): boolean;
}, stepMs: number, timeoutMs: number, resource?: string): Promise<unknown>;
