import { EventEmitter } from 'events';
import { NextFunction, Request, RequestHandler, Response } from 'express';
export interface MiddlewareContext {
    [key: string]: any;
}
export interface ComposerRequest extends Request {
    context?: MiddlewareContext;
    startTime?: number;
    middlewareStack?: string[];
}
export type MiddlewareFunction = (req: ComposerRequest, res: Response, next: NextFunction) => void | Promise<void>;
export interface MiddlewareOptions {
    name?: string;
    timeout?: number;
    errorHandler?: ErrorHandler;
    condition?: ConditionFunction;
    parallel?: boolean;
    retries?: number;
    retryDelay?: number;
}
export type ErrorHandler = (error: Error, req: ComposerRequest, res: Response, next: NextFunction) => void | Promise<void>;
export type ConditionFunction = (req: ComposerRequest, res: Response) => boolean | Promise<boolean>;
export interface ComposerOptions {
    errorHandler?: ErrorHandler;
    timeout?: number;
    monitoring?: boolean;
    contextKey?: string;
}
export interface MiddlewareMetrics {
    name: string;
    executions: number;
    errors: number;
    totalTime: number;
    averageTime: number;
    minTime: number;
    maxTime: number;
}
export declare class MiddlewareComposer extends EventEmitter {
    private middleware;
    private metrics;
    private options;
    constructor(options?: ComposerOptions);
    use(fn: MiddlewareFunction | MiddlewareFunction[], options?: MiddlewareOptions): this;
    when(condition: ConditionFunction, trueBranch: MiddlewareFunction | MiddlewareComposer, falseBranch?: MiddlewareFunction | MiddlewareComposer): this;
    parallel(middleware: MiddlewareFunction[], options?: {
        waitForAll?: boolean;
        errorHandler?: ErrorHandler;
    }): this;
    group(name: string): MiddlewareComposer;
    compose(): RequestHandler;
    private updateMetrics;
    getMetrics(): MiddlewareMetrics[];
    clear(): void;
    private defaultErrorHandler;
    rateLimit(limit: number, window: number, keyGenerator?: (req: Request) => string): this;
    log(logger?: (req: Request, res: Response, duration: number) => void): this;
    cors(options?: {
        origin?: string | string[] | ((origin: string) => boolean);
        methods?: string[];
        headers?: string[];
        credentials?: boolean;
    }): this;
}
export declare function createComposer(options?: ComposerOptions): MiddlewareComposer;
//# sourceMappingURL=middleware-composer.d.ts.map