import { Message } from './message';
import { MessageHandler } from './messageHandler';
import { MessageResult } from './messageResult';
export type Middleware<TMessage extends Message = Message> = (message: TMessage, next: () => Promise<MessageResult<TMessage>>) => Promise<MessageResult<TMessage>>;
type AddMessageMiddlewaresOptions<TMessage extends Message> = {
    messageType: TMessage['type'] | Array<TMessage['type']>;
    middlewares: ReadonlyArray<Middleware<TMessage>>;
};
type AddHandlerMiddlewaresOptions<TMessage extends Message> = {
    handler: MessageHandler<TMessage>;
    middlewares: ReadonlyArray<Middleware<TMessage>>;
};
type AddGlobalMiddlewaresOptions = {
    middlewares: ReadonlyArray<Middleware>;
};
export type AddOptions<TMessage extends Message> = AddMessageMiddlewaresOptions<TMessage> | AddHandlerMiddlewaresOptions<TMessage> | AddGlobalMiddlewaresOptions;
export declare const middlewares: {
    add: <TMessage extends Message>(options: AddOptions<TMessage>) => void;
    apply: <TMessage extends Message>(messageType: TMessage["type"], handler: MessageHandler<TMessage>) => MessageHandler<TMessage>;
    clear: () => void;
};
export {};
