/// <reference types="node" />
import { EventEmitter } from 'events';
import { JsonObject } from 'type-fest';
import Context from '../context/Context';
import SessionStore from '../session/SessionStore';
import { Action, Client, Plugin, RequestContext } from '../types';
import { Event } from '../context/Event';
import { Connector } from './Connector';
declare type Builder<C extends Context> = {
    build: () => Action<C, any>;
};
export declare function run<C extends Context>(action: Action<C, any>): Action<C, any>;
declare type RequestHandler<B> = (body: B, requestContext?: RequestContext) => void | Promise<void>;
export declare type OnRequest = (body: JsonObject, requestContext?: RequestContext) => void;
export default class Bot<B extends JsonObject, C extends Client, E extends Event, Ctx extends Context<C, E>> {
    _sessions: SessionStore;
    _initialized: boolean;
    _connector: Connector<B, C>;
    _handler: Action<Ctx, any> | null;
    _errorHandler: Action<Ctx, any> | null;
    _initialState: JsonObject;
    _plugins: Function[];
    _sync: boolean;
    _emitter: EventEmitter;
    _onRequest: OnRequest | undefined;
    constructor({ connector, sessionStore, sync, onRequest, }: {
        connector: Connector<B, C>;
        sessionStore?: SessionStore;
        sync?: boolean;
        onRequest?: OnRequest;
    });
    get connector(): Connector<B, C>;
    get sessions(): SessionStore;
    get handler(): Action<Ctx, any> | null;
    get emitter(): EventEmitter;
    onEvent(handler: Action<Ctx, any> | Builder<Ctx>): Bot<B, C, E, Ctx>;
    onError(handler: Action<Ctx, any> | Builder<Ctx>): Bot<B, C, E, Ctx>;
    setInitialState(initialState: JsonObject): Bot<B, C, E, Ctx>;
    use(plugin: Plugin<Ctx>): Bot<B, C, E, Ctx>;
    initSessionStore(): Promise<void>;
    createRequestHandler(): RequestHandler<B>;
}
export {};
//# sourceMappingURL=Bot.d.ts.map