/** * Interfaces for resilience patterns and error handling */ export interface RetryOptions { maxAttempts: number; baseDelay: number; maxDelay: number; exponentialBase: number; jitter: boolean; } export interface CircuitBreakerOptions { failureThreshold: number; timeoutMs: number; resetTimeoutMs: number; monitoringPeriodMs: number; } export interface CircuitBreakerState { state: 'closed' | 'open' | 'half-open'; failureCount: number; nextAttempt: Date; lastFailure?: Date; lastSuccess?: Date; } export interface TimeoutOptions { timeoutMs: number; signal?: AbortSignal; } export interface BulkheadOptions { maxConcurrent: number; maxQueue: number; timeoutMs: number; } export interface RateLimitOptions { maxRequests: number; windowMs: number; skipSuccessfulRequests?: boolean; skipFailedRequests?: boolean; } export interface ErrorContext { operation: string; attempt: number; totalAttempts: number; error: Error; startTime: Date; duration: number; metadata?: Record; } export interface IRetryPolicy { execute(operation: () => Promise, options?: Partial): Promise; canRetry(error: Error, attempt: number): boolean; calculateDelay(attempt: number, baseDelay: number, maxDelay: number): number; } export interface ICircuitBreaker { execute(operation: () => Promise): Promise; getState(): CircuitBreakerState; forceOpen(): void; forceClose(): void; reset(): void; } export interface IBulkhead { execute(operation: () => Promise, key?: string): Promise; getStats(key?: string): { active: number; queued: number; rejected: number; completed: number; }; } export interface IRateLimit { checkLimit(key: string): Promise<{ allowed: boolean; remaining: number; resetTime: Date; retryAfter?: number; }>; reset(key: string): Promise; } export interface ErrorRecoveryStrategy { name: string; canHandle(error: Error): boolean; recover(error: Error, context: ErrorContext): Promise; } export interface HealthCheckStatus { healthy: boolean; lastCheck: Date; consecutiveFailures: number; details?: Record; } export interface DeadLetterQueueItem { id: string; operation: string; payload: any; error: Error; attempts: number; failedAt: Date; nextRetryAt?: Date; metadata?: Record; }