import { Type } from '@nestjs/common';
import { ModuleRef } from '@nestjs/core';
import { MiddlewareFn } from '../interfaces/middleware.interface';
export interface InjectableMiddleware<TContext = any> {
    use: MiddlewareFn<TContext>;
}
export declare class MiddlewareRegistry {
    private static moduleRef;
    private static middlewareCache;
    static setModuleRef(moduleRef: ModuleRef): void;
    static getMiddleware<T extends InjectableMiddleware>(MiddlewareClass: Type<T>): MiddlewareFn;
    static createMiddleware<T extends InjectableMiddleware>(MiddlewareClass: Type<T>): MiddlewareFn;
}
export declare class MiddlewareRegistryModule {
    private readonly moduleRef;
    constructor(moduleRef: ModuleRef);
}
export declare function createMiddleware<T extends InjectableMiddleware>(MiddlewareClass: Type<T>): MiddlewareFn;
export declare function createMiddlewareFactory<TDeps, TContext = any>(factory: (deps: TDeps) => MiddlewareFn<TContext>): (deps: TDeps) => MiddlewareFn<TContext>;
export declare abstract class BaseMiddleware<TContext = any> implements InjectableMiddleware<TContext> {
    abstract use: MiddlewareFn<TContext>;
}
