@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
JavaScript
/**
* @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