{"version":3,"sources":["../src/circuit-breaker/circuit-breaker.ts","../src/circuit-breaker/circuit-breaker.registry.ts"],"names":["CircuitBreakerState"],"mappings":"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","file":"chunk-KCOD4FUT.cjs","sourcesContent":["export enum CircuitBreakerState {\n  CLOSED    = 'closed',\n  OPEN      = 'open',\n  HALF_OPEN = 'half_open',\n}\n\nexport interface CircuitBreakerConfig {\n  name: string;\n\n  /** % of calls in the sliding window that must fail to open the circuit (0-100). Default: 50 */\n  failureThreshold: number;\n\n  /** % of calls in the sliding window that are slow to open the circuit (0-100). Default: 100 (disabled) */\n  slowCallThreshold: number;\n\n  /** Duration in ms above which a successful call is considered slow. Default: 60000 */\n  slowCallDurationMs: number;\n\n  /** Minimum number of calls in the window before thresholds are evaluated. Default: 5 */\n  minimumCalls: number;\n\n  /** Size of the count-based sliding window. Default: 10 */\n  slidingWindowSize: number;\n\n  /** Number of test calls allowed in HALF_OPEN before deciding to close or reopen. Default: 3 */\n  halfOpenMaxCalls: number;\n\n  /** Time in ms to wait in OPEN before transitioning to HALF_OPEN. Default: 60000 */\n  openTimeoutMs: number;\n\n  /**\n   * Classifies whether a thrown error counts as an infrastructure failure\n   * (opens the circuit) or a business error (transparent pass-through).\n   *\n   * Return `true`  -> infrastructure error -- counted against the circuit.\n   * Return `false` -> business error -- the circuit treats the call as a success.\n   *\n   * Default: all errors count as infrastructure failures.\n   *\n   * @example\n   * // Only HTTP 5xx and non-HTTP errors open the circuit\n   * isFailure: (err) => !(err instanceof HttpException) || err.getStatus() >= 500\n   */\n  isFailure: (error: unknown) => boolean;\n\n  /**\n   * Called every time the circuit transitions between states.\n   * Use it for logging, alerting, or updating external dashboards.\n   *\n   * @example\n   * onStateChange: (from, to, metrics) => {\n   *   logger.warn(`Circuit ${metrics.name}: ${from} -> ${to}`);\n   *   if (to === CircuitBreakerState.OPEN) alerting.trigger(metrics);\n   * }\n   */\n  onStateChange?: (\n    from: CircuitBreakerState,\n    to: CircuitBreakerState,\n    metrics: CircuitBreakerMetrics,\n  ) => void;\n}\n\nexport interface CircuitBreakerMetrics {\n  name: string;\n  state: CircuitBreakerState;\n  failureRate: number;\n  slowCallRate: number;\n  bufferedCalls: number;\n  totalCalls: number;\n  successfulCalls: number;\n  failedCalls: number;\n  slowCalls: number;\n  notPermittedCalls: number;\n}\n\nexport class CircuitBreakerOpenError extends Error {\n  constructor(name: string) {\n    super(`Circuit breaker '${name}' is OPEN -- calls not permitted`);\n    this.name = 'CircuitBreakerOpenError';\n  }\n}\n\ntype CallOutcome = 'success' | 'failure' | 'slow';\n\nexport const DEFAULT_CIRCUIT_BREAKER_CONFIG: Omit<CircuitBreakerConfig, 'name'> = {\n  failureThreshold:  50,\n  slowCallThreshold: 100,\n  slowCallDurationMs: 60_000,\n  minimumCalls:      5,\n  slidingWindowSize: 10,\n  halfOpenMaxCalls:  3,\n  openTimeoutMs:     60_000,\n  isFailure: () => true,\n};\n\n/**\n * Simple mutex for serializing async access to shared state.\n * Uses a queue of resolvers to ensure FIFO ordering.\n */\nclass AsyncMutex {\n  private locked = false;\n  private queue: Array<() => void> = [];\n\n  async acquire(): Promise<void> {\n    if (!this.locked) {\n      this.locked = true;\n      return;\n    }\n    return new Promise<void>((resolve) => {\n      this.queue.push(resolve);\n    });\n  }\n\n  release(): void {\n    if (this.queue.length > 0) {\n      const next = this.queue.shift()!;\n      next();\n    } else {\n      this.locked = false;\n    }\n  }\n}\n\nexport class CircuitBreaker {\n  private state: CircuitBreakerState = CircuitBreakerState.CLOSED;\n  private window: CallOutcome[] = [];\n  private openedAt: number | null = null;\n  private halfOpenCalls = 0;\n  private halfOpenSuccesses = 0;\n\n  private totalCalls = 0;\n  private successfulCalls = 0;\n  private failedCalls = 0;\n  private slowCalls = 0;\n  private notPermittedCalls = 0;\n\n  private readonly mutex = new AsyncMutex();\n\n  constructor(private config: CircuitBreakerConfig) {\n    this.validateConfig(config);\n  }\n\n  updateConfig(partial: Partial<Omit<CircuitBreakerConfig, 'name'>>): void {\n    // Prevent overwriting 'name' at runtime\n    const merged = { ...this.config, ...partial, name: this.config.name };\n    this.validateConfig(merged);\n    this.config = merged;\n  }\n\n  private validateConfig(config: CircuitBreakerConfig): void {\n    if (config.failureThreshold < 0 || config.failureThreshold > 100) {\n      throw new RangeError(`CircuitBreaker '${config.name}': failureThreshold must be 0-100, got ${config.failureThreshold}`);\n    }\n    if (config.slowCallThreshold < 0 || config.slowCallThreshold > 100) {\n      throw new RangeError(`CircuitBreaker '${config.name}': slowCallThreshold must be 0-100, got ${config.slowCallThreshold}`);\n    }\n    if (config.slidingWindowSize < 1) {\n      throw new RangeError(`CircuitBreaker '${config.name}': slidingWindowSize must be >= 1, got ${config.slidingWindowSize}`);\n    }\n    if (config.minimumCalls < 1) {\n      throw new RangeError(`CircuitBreaker '${config.name}': minimumCalls must be >= 1, got ${config.minimumCalls}`);\n    }\n    if (config.halfOpenMaxCalls < 1) {\n      throw new RangeError(`CircuitBreaker '${config.name}': halfOpenMaxCalls must be >= 1, got ${config.halfOpenMaxCalls}`);\n    }\n    if (config.openTimeoutMs < 1) {\n      throw new RangeError(`CircuitBreaker '${config.name}': openTimeoutMs must be >= 1, got ${config.openTimeoutMs}`);\n    }\n    if (config.slowCallDurationMs < 1) {\n      throw new RangeError(`CircuitBreaker '${config.name}': slowCallDurationMs must be >= 1, got ${config.slowCallDurationMs}`);\n    }\n  }\n\n  /**\n   * Executes a task inside the circuit breaker.\n   *\n   * @param task - The operation to protect.\n   * @param fallback - Optional controlled exit when the circuit is OPEN or an\n   *   infrastructure error occurs. Receives the error so you can distinguish\n   *   between `CircuitBreakerOpenError` (circuit was already open) and an\n   *   actual failure. Business errors (where `isFailure` returns `false`) are\n   *   always re-thrown without invoking the fallback.\n   *\n   * @example\n   * const data = await cb.execute(\n   *   () => fetchFromApi(id),\n   *   (err) => err instanceof CircuitBreakerOpenError\n   *     ? cache.get(id)          // circuit open  -> serve cache\n   *     : defaultResponse(id),   // infra failure -> safe default\n   * );\n   */\n  async execute<T>(\n    task: () => Promise<T>,\n    fallback?: (error: unknown) => T | Promise<T>,\n  ): Promise<T> {\n    await this.mutex.acquire();\n    try {\n      if (!this.canAttempt()) {\n        this.notPermittedCalls++;\n        const openError = new CircuitBreakerOpenError(this.config.name);\n        if (fallback) return fallback(openError);\n        throw openError;\n      }\n\n      if (this.state === CircuitBreakerState.HALF_OPEN) {\n        this.halfOpenCalls++;\n      }\n\n      this.totalCalls++;\n    } finally {\n      this.mutex.release();\n    }\n\n    const startTime = Date.now();\n\n    try {\n      const result = await task();\n      await this.mutex.acquire();\n      try {\n        this.onSuccess(Date.now() - startTime);\n      } finally {\n        this.mutex.release();\n      }\n      return result;\n    } catch (error: unknown) {\n      const isInfrastructure = this.config.isFailure(error);\n      await this.mutex.acquire();\n      try {\n        this.onError(error);\n      } finally {\n        this.mutex.release();\n      }\n\n      if (fallback && isInfrastructure) return fallback(error);\n      throw error;\n    }\n  }\n\n  private onSuccess(durationMs: number): void {\n    const isSlow = durationMs >= this.config.slowCallDurationMs;\n    this.successfulCalls++;\n\n    if (isSlow) {\n      this.slowCalls++;\n      this.record('slow');\n    } else {\n      this.record('success');\n    }\n\n    if (this.state === CircuitBreakerState.HALF_OPEN) {\n      this.halfOpenSuccesses++;\n      if (this.halfOpenSuccesses >= this.config.halfOpenMaxCalls) {\n        this.transitionTo(CircuitBreakerState.CLOSED);\n      }\n    }\n  }\n\n  private onError(error: unknown): void {\n    const isInfrastructure = this.config.isFailure(error);\n\n    if (isInfrastructure) {\n      this.failedCalls++;\n      this.record('failure');\n      if (this.state === CircuitBreakerState.HALF_OPEN) {\n        this.transitionTo(CircuitBreakerState.OPEN);\n      }\n    } else {\n      // Business error -- transparent to the circuit breaker\n      this.successfulCalls++;\n      this.record('success');\n    }\n  }\n\n  private record(outcome: CallOutcome): void {\n    if (this.window.length >= this.config.slidingWindowSize) {\n      this.window.shift();\n    }\n    this.window.push(outcome);\n\n    if (this.state === CircuitBreakerState.CLOSED) {\n      this.evaluateThresholds();\n    }\n  }\n\n  private evaluateThresholds(): void {\n    if (this.window.length < this.config.minimumCalls) return;\n\n    const total    = this.window.length;\n    const failures = this.window.filter(o => o === 'failure').length;\n    const slow     = this.window.filter(o => o === 'slow').length;\n\n    const failureRate  = (failures / total) * 100;\n    const slowCallRate = (slow / total) * 100;\n\n    if (\n      failureRate  >= this.config.failureThreshold ||\n      slowCallRate >= this.config.slowCallThreshold\n    ) {\n      this.transitionTo(CircuitBreakerState.OPEN);\n    }\n  }\n\n  private syncState(): void {\n    if (\n      this.state === CircuitBreakerState.OPEN &&\n      this.openedAt !== null &&\n      Date.now() - this.openedAt >= this.config.openTimeoutMs\n    ) {\n      this.transitionTo(CircuitBreakerState.HALF_OPEN);\n    }\n  }\n\n  private transitionTo(next: CircuitBreakerState): void {\n    const prev = this.state;\n    this.state = next;\n\n    if (next === CircuitBreakerState.OPEN) {\n      this.openedAt          = Date.now();\n      this.halfOpenCalls     = 0;\n      this.halfOpenSuccesses = 0;\n    } else if (next === CircuitBreakerState.HALF_OPEN) {\n      this.halfOpenCalls     = 0;\n      this.halfOpenSuccesses = 0;\n      this.window            = [];\n    } else {\n      this.openedAt          = null;\n      this.halfOpenCalls     = 0;\n      this.halfOpenSuccesses = 0;\n      this.window            = [];\n    }\n\n    // Wrap onStateChange in try-catch so a faulty callback never breaks the CB\n    if (this.config.onStateChange) {\n      try {\n        this.config.onStateChange(prev, next, this.getMetrics());\n      } catch {\n        // Swallow -- callback errors must not affect circuit breaker state\n      }\n    }\n  }\n\n  canAttempt(): boolean {\n    this.syncState();\n    if (this.state === CircuitBreakerState.CLOSED)   return true;\n    if (this.state === CircuitBreakerState.OPEN)      return false;\n    return this.halfOpenCalls < this.config.halfOpenMaxCalls;\n  }\n\n  getState(): CircuitBreakerState {\n    this.syncState();\n    return this.state;\n  }\n\n  getMetrics(): CircuitBreakerMetrics {\n    this.syncState();\n    const total    = this.window.length;\n    const failures = this.window.filter(o => o === 'failure').length;\n    const slow     = this.window.filter(o => o === 'slow').length;\n\n    return {\n      name:              this.config.name,\n      state:             this.state,\n      failureRate:       total > 0 ? Math.round((failures / total) * 100) : 0,\n      slowCallRate:      total > 0 ? Math.round((slow / total) * 100) : 0,\n      bufferedCalls:     total,\n      totalCalls:        this.totalCalls,\n      successfulCalls:   this.successfulCalls,\n      failedCalls:       this.failedCalls,\n      slowCalls:         this.slowCalls,\n      notPermittedCalls: this.notPermittedCalls,\n    };\n  }\n\n  reset(): void {\n    this.transitionTo(CircuitBreakerState.CLOSED);\n    this.totalCalls       = 0;\n    this.successfulCalls  = 0;\n    this.failedCalls      = 0;\n    this.slowCalls        = 0;\n    this.notPermittedCalls = 0;\n  }\n}\n","import {\n  CircuitBreaker,\n  CircuitBreakerConfig,\n  CircuitBreakerMetrics,\n  CircuitBreakerState,\n  DEFAULT_CIRCUIT_BREAKER_CONFIG,\n} from './circuit-breaker.js';\n\nexport interface CircuitBreakerOptions extends Partial<CircuitBreakerConfig> {\n  name: string;\n}\n\nexport class CircuitBreakerRegistry {\n  private readonly breakers = new Map<string, CircuitBreaker>();\n\n  getOrCreate(options: CircuitBreakerOptions): CircuitBreaker {\n    if (!this.breakers.has(options.name)) {\n      const config: CircuitBreakerConfig = {\n        ...DEFAULT_CIRCUIT_BREAKER_CONFIG,\n        ...options,\n        name: options.name,\n      };\n      this.breakers.set(options.name, new CircuitBreaker(config));\n    }\n    return this.breakers.get(options.name)!;\n  }\n\n  /**\n   * For external HTTP calls.\n   * Only HTTP 5xx and non-HTTP errors (network, timeout) open the circuit.\n   * HTTP 4xx (business errors like 404, 401, 422) pass through transparently.\n   */\n  getForHttpExternal(serviceName: string): CircuitBreaker {\n    return this.getOrCreate({\n      name: `http:${serviceName}`,\n      failureThreshold: 50,\n      minimumCalls: 5,\n      openTimeoutMs: 30_000,\n      isFailure: isHttpServerError,\n    });\n  }\n\n  /**\n   * For internal service-to-service calls.\n   * All errors count — services should not throw business errors at each other.\n   */\n  getForService(serviceName: string): CircuitBreaker {\n    return this.getOrCreate({\n      name: `service:${serviceName}`,\n      failureThreshold: 50,\n      minimumCalls: 5,\n      openTimeoutMs: 30_000,\n    });\n  }\n\n  /**\n   * For database operations.\n   * All errors count. More sensitive threshold (30%) and shorter timeout.\n   */\n  getForDatabase(schema: string): CircuitBreaker {\n    return this.getOrCreate({\n      name: `database:${schema}`,\n      failureThreshold: 30,\n      minimumCalls: 3,\n      slidingWindowSize: 5,\n      openTimeoutMs: 15_000,\n    });\n  }\n\n  getAllMetrics(): Record<string, CircuitBreakerMetrics> {\n    const metrics: Record<string, CircuitBreakerMetrics> = {};\n    for (const [name, cb] of this.breakers) {\n      metrics[name] = cb.getMetrics();\n    }\n    return metrics;\n  }\n\n  getOpenBreakers(): CircuitBreakerMetrics[] {\n    return [...this.breakers.values()]\n      .map(cb => cb.getMetrics())\n      .filter(m => m.state !== CircuitBreakerState.CLOSED);\n  }\n\n  reset(name: string): void {\n    this.breakers.get(name)?.reset();\n  }\n\n  resetAll(): void {\n    for (const cb of this.breakers.values()) cb.reset();\n  }\n}\n\n/**\n * Counts only HTTP 5xx and non-HTTP errors as infrastructure failures.\n * HTTP 4xx (404, 401, 403, 422…) are business errors — transparent to the circuit.\n *\n * Works with NestJS HttpException and any object with a `getStatus(): number` method.\n */\nexport function isHttpServerError(error: unknown): boolean {\n  if (\n    typeof error === 'object' &&\n    error !== null &&\n    typeof (error as Record<string, unknown>)['getStatus'] === 'function'\n  ) {\n    return (error as { getStatus(): number }).getStatus() >= 500;\n  }\n  return true;\n}\n"]}