UNPKG

@felixgeelhaar/govee-api-client

Version:

Enterprise-grade TypeScript client library for the Govee Developer REST API

148 lines 4.77 kB
import { Logger } from 'pino'; import { GoveeApiClientError } from '../../errors'; /** * Backoff strategy configuration for retry policies */ export interface BackoffStrategy { /** Type of backoff algorithm */ type: 'exponential' | 'linear' | 'fixed' | 'custom'; /** Initial delay in milliseconds */ initialDelayMs: number; /** Maximum delay between retries in milliseconds */ maxDelayMs: number; /** Multiplier for exponential backoff (default: 2.0) */ multiplier?: number; /** Custom backoff function for 'custom' type */ customBackoff?: (attempt: number, error: GoveeApiClientError) => number; } /** * Jitter configuration to prevent thundering herd problems */ export interface JitterConfig { /** Type of jitter algorithm */ type: 'none' | 'full' | 'equal' | 'decorrelated'; /** Jitter factor (0.0 to 1.0) */ factor?: number; } /** * Retry condition configuration */ export interface RetryCondition { /** Maximum number of retry attempts */ maxAttempts: number; /** Maximum total time to spend retrying in milliseconds */ maxTotalTimeMs: number; /** HTTP status codes that should trigger retries */ retryableStatusCodes: number[]; /** Error types that should trigger retries */ retryableErrorTypes: (new (...args: any[]) => GoveeApiClientError)[]; /** Custom retry decision function */ shouldRetry?: (error: GoveeApiClientError, attempt: number, elapsed: number) => boolean; } /** * Circuit breaker configuration for retry policies */ export interface CircuitBreakerConfig { /** Enable circuit breaker functionality */ enabled: boolean; /** Number of consecutive failures to open circuit */ failureThreshold: number; /** Time to wait before attempting to close circuit (ms) */ recoveryTimeoutMs: number; /** Percentage of requests to allow through when half-open */ halfOpenSuccessThreshold: number; } /** * Retry metrics for observability */ export interface RetryMetrics { /** Total number of retry attempts */ totalAttempts: number; /** Total number of successful retries */ successfulRetries: number; /** Total number of failed retries */ failedRetries: number; /** Total time spent retrying */ totalRetryTimeMs: number; /** Average retry delay */ averageRetryDelayMs: number; /** Circuit breaker state */ circuitBreakerState: 'closed' | 'open' | 'half-open'; /** Last error encountered */ lastError?: GoveeApiClientError; /** Timestamp of last retry attempt */ lastRetryTimestamp?: Date; } /** * Complete retry policy configuration */ export interface RetryPolicyConfig { /** Backoff strategy configuration */ backoff: BackoffStrategy; /** Jitter configuration */ jitter: JitterConfig; /** Retry condition configuration */ condition: RetryCondition; /** Circuit breaker configuration */ circuitBreaker?: CircuitBreakerConfig; /** Logger instance for retry operations */ logger?: Logger; /** Enable detailed metrics collection */ enableMetrics?: boolean; } /** * Enterprise-grade retry policy with exponential backoff, jitter, and circuit breaker */ export declare class RetryPolicy { private readonly config; private readonly circuitBreaker?; private readonly metrics; private readonly logger?; constructor(config: RetryPolicyConfig); private validateConfig; /** * Determines if an error should trigger a retry attempt */ shouldRetry(error: GoveeApiClientError, attempt: number, elapsedTimeMs: number): boolean; /** * Calculates the delay before the next retry attempt */ calculateDelay(attempt: number, error: GoveeApiClientError): number; /** * Applies jitter to prevent thundering herd problems */ private applyJitter; /** * Records a successful operation */ recordSuccess(): void; /** * Records a failed operation */ recordFailure(error: GoveeApiClientError): void; /** * Updates retry metrics */ private updateMetrics; /** * Gets current retry metrics */ getMetrics(): Readonly<RetryMetrics>; /** * Resets retry metrics and circuit breaker */ reset(): void; /** * Creates a default retry policy optimized for Govee API */ static createGoveeOptimized(logger?: Logger): RetryPolicy; /** * Creates a conservative retry policy for production environments */ static createConservative(logger?: Logger): RetryPolicy; /** * Creates an aggressive retry policy for development/testing */ static createAggressive(logger?: Logger): RetryPolicy; } //# sourceMappingURL=RetryPolicy.d.ts.map