import { Context } from "../context";
import { LambdaMiddleware } from "./lambda.middleware";
export type MiddlewareConstructor<TC extends Context = Context, TM extends Middleware<TC> = Middleware<TC>> = {
    new (...args: any[]): TM;
};
export type MiddlewareItem = LambdaMiddleware | ((ctx: Context) => Middleware) | [(ctx: Context) => Middleware, MiddlewareConstructor] | ((ctx: Context) => Promise<Middleware>) | [(ctx: Context) => Promise<Middleware>, MiddlewareConstructor] | ((ctx: Context) => MiddlewareConstructor) | [(ctx: Context) => MiddlewareConstructor, MiddlewareConstructor] | ((ctx: Context) => Promise<MiddlewareConstructor>) | Middleware | MiddlewareConstructor;
export declare function createMiddleware(ctx: Context, middleware: MiddlewareItem): Promise<Middleware>;
export declare abstract class Middleware<TC extends Context = Context> {
    #private;
    get ctx(): TC;
    get logger(): import("..").ILogger;
    set logger(val: import("..").ILogger);
    isPrevInstanceOf<TM extends Middleware<TC> = Middleware<TC>>(target: MiddlewareConstructor<TC, TM>): target is MiddlewareConstructor<TC, TM>;
    isNextInstanceOf<TM extends Middleware<TC> = Middleware<TC>>(target: MiddlewareConstructor<TC, TM>): target is MiddlewareConstructor<TC, TM>;
    abstract invoke(): void | Promise<void>;
    protected next(): Promise<void>;
    private init;
}
export declare function invokeMiddlewares(ctx: Context, mds: MiddlewareItem[]): Promise<void>;
