import { EventEmitter } from 'events';
import type { Request, RequestHandler, Response } from 'express';
export interface CircuitBreakerConfig {
    failureThreshold?: number;
    successThreshold?: number;
    timeWindow?: number;
    resetTimeout?: number;
    requestTimeout?: number;
    errorThresholdPercentage?: number;
    volumeThreshold?: number;
    isFailure?: (error: Error | null, response?: Response) => boolean;
    fallback?: (req: Request, res: Response) => void;
    onOpen?: (metrics: CircuitMetrics) => void;
    onClose?: (metrics: CircuitMetrics) => void;
    onHalfOpen?: (metrics: CircuitMetrics) => void;
    healthCheck?: () => Promise<boolean>;
    healthCheckInterval?: number;
}
type CircuitState = 'CLOSED' | 'OPEN' | 'HALF_OPEN';
interface CircuitMetrics {
    failures: number;
    successes: number;
    totalRequests: number;
    errorPercentage: number;
    lastFailureTime?: Date;
    lastSuccessTime?: Date;
    consecutiveFailures: number;
    consecutiveSuccesses: number;
    state: CircuitState;
    stateChangedAt: Date;
}
export declare class CircuitBreaker extends EventEmitter {
    private state;
    private config;
    private metrics;
    private requestHistory;
    private nextAttempt;
    private healthCheckTimer?;
    constructor(config?: CircuitBreakerConfig);
    middleware(routeName?: string): RequestHandler;
    execute<T>(fn: () => Promise<T>): Promise<T>;
    getState(): CircuitState;
    getMetrics(): Readonly<CircuitMetrics>;
    reset(): void;
    open(): void;
    close(): void;
    stop(): void;
    private initializeMetrics;
    private recordSuccess;
    private recordFailure;
    private shouldOpen;
    private transitionTo;
    private cleanupHistory;
    private getRecentRequests;
    private updateErrorPercentage;
    private defaultIsFailure;
    private defaultFallback;
    private startHealthCheck;
}
export declare function createCircuitBreaker(config?: CircuitBreakerConfig): CircuitBreaker;
export {};
//# sourceMappingURL=circuit-breaker-middleware.d.ts.map