UNPKG

@daiso-tech/core

Version:

The library offers flexible, framework-agnostic solutions for modern web applications, built on adaptable components that integrate seamlessly with popular frameworks like Next Js.

59 lines 3.14 kB
/** * @module CircuitBreaker */ import {} from "../../../../backoff-policies/contracts/_module.js"; import { exponentialBackoff } from "../../../../backoff-policies/implementations/_module.js"; import {} from "../../../../circuit-breaker/contracts/_module.js"; import { CircuitBreakerStateManager } from "../../../../circuit-breaker/implementations/adapters/database-circuit-breaker-adapter/circuit-breaker-state-manager.js"; import { CircuitBreakerStorage } from "../../../../circuit-breaker/implementations/adapters/database-circuit-breaker-adapter/circuit-breaker-storage.js"; import { InternalCircuitBreakerPolicy, } from "../../../../circuit-breaker/implementations/adapters/database-circuit-breaker-adapter/internal-circuit-breaker-policy.js"; import { ConsecutiveBreaker } from "../../../../circuit-breaker/implementations/policies/_module.js"; import {} from "../../../../execution-context/contracts/_module.js"; /** * IMPORT_PATH: `"@daiso-tech/core/circuit-breaker/database-circuit-breaker-adapter"` * @group Adapters */ export class DatabaseCircuitBreakerAdapter { circuitBreakerStorage; circuitBreakerStateManager; /** * @example * ```ts * import { DatabaseCircuitBreakerAdapter } from "@daiso-tech/core/circuit-breaker/database-circuit-breaker-adapter"; * import { MemoryCircuitBreakerStorageAdapter } from "@daiso-tech/core/circuit-breaker/memory-circuit-breaker-storage-adapter"; * * const circuitBreakerStorageAdapter = new MemoryCircuitBreakerStorageAdapter(); * const circuitBreakerAdapter = new DatabaseCircuitBreakerAdapter({ * adapter: circuitBreakerStorageAdapter * }); * ``` */ constructor(settings) { const { adapter, backoffPolicy = exponentialBackoff(), circuitBreakerPolicy = new ConsecutiveBreaker({ failureThreshold: 5, }), } = settings; const internalCircuitBreakerPolicy = new InternalCircuitBreakerPolicy(circuitBreakerPolicy); this.circuitBreakerStorage = new CircuitBreakerStorage(adapter, internalCircuitBreakerPolicy); this.circuitBreakerStateManager = new CircuitBreakerStateManager(internalCircuitBreakerPolicy, backoffPolicy); } async getState(context, key) { const state = await this.circuitBreakerStorage.find(context, key); return state.type; } async updateState(context, key) { return await this.circuitBreakerStorage.atomicUpdate(context, key, this.circuitBreakerStateManager.updateState); } async trackFailure(context, key) { await this.circuitBreakerStorage.atomicUpdate(context, key, this.circuitBreakerStateManager.trackFailure); } async trackSuccess(context, key) { await this.circuitBreakerStorage.atomicUpdate(context, key, this.circuitBreakerStateManager.trackSuccess); } async reset(context, key) { await this.circuitBreakerStorage.remove(context, key); } async isolate(context, key) { await this.circuitBreakerStorage.atomicUpdate(context, key, this.circuitBreakerStateManager.isolate); } } //# sourceMappingURL=database-circuit-breaker-adapter.js.map