@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.
155 lines (154 loc) • 6.27 kB
TypeScript
/**
* @module CircuitBreaker
*/
import { type CircuitBreakerEventMap, type CircuitBreakerProviderCreateSettings, type ICircuitBreaker, type ICircuitBreakerProvider, type ICircuitBreakerAdapter, type CircuitBreakerTrigger } from "../../../../circuit-breaker/contracts/_module.js";
import { type EventListener, type IEventBus, type Unsubscribe } from "../../../../event-bus/contracts/_module.js";
import { Namespace } from "../../../../namespace/_module.js";
import { type ISerderRegister } from "../../../../serde/contracts/_module.js";
import { type ITask } from "../../../../task/contracts/_module.js";
import { type ITimeSpan } from "../../../../time-span/contracts/_module.js";
import { type ErrorPolicy, type OneOrMore } from "../../../../utilities/_module.js";
/**
*
* IMPORT_PATH: `"@daiso-tech/core/circuit-breaker"`
* @group Derivables
*/
export type CircuitBreakerProviderSettingsBase = {
/**
* @default
* ```ts
* import { Namespace } from "@daiso-tech/core/namespace";
*
* new Namespace("@circuit-breaker")
* ```
*/
namespace?: Namespace;
/**
* @default
* ```ts
* import { EventBus } from "@daiso-tech/core/event-bus";
* import { NoOpEventBusAdapter } from "@daiso-tech/core/event-bus/no-op-event-bus-adapter";
*
* new EventBus({
* adapter: new NoOpEventBusAdapter()
* })
* ```
*/
eventBus?: IEventBus;
/**
* You can set the default `ErrorPolicy`
*
* @default
* ```ts
* (_error: unknown) => true
* ```
*/
defaultErrorPolicy?: ErrorPolicy;
/**
* You can set the default slow call threshold.
*
* @default
* ```ts
* import { TimeSpan } from "@daiso-tech/core/time-span";
*
* TimeSpan.fromSeconds(10);
* ```
*/
defaultSlowCallTime?: ITimeSpan;
/**
* You set the default trigger.
*
* @default
* ```ts
* import { CIRCUIT_BREAKER_TRIGGER} from "@daiso-tech/core/circuit-breaker/contracts";
*
* CIRCUIT_BREAKER_TRIGGER.BOTH
* ```
*/
defaultTrigger?: CircuitBreakerTrigger;
/**
* If true, metric tracking will run asynchronously in the background and won't block the function utilizing the circuit breaker logic.
* @default true
*/
enableAsyncTracking?: boolean;
serde?: OneOrMore<ISerderRegister>;
/**
* @default ""
*/
serdeTransformerName?: string;
};
/**
*
* IMPORT_PATH: `"@daiso-tech/core/circuit-breaker"`
* @group Derivables
*/
export type CircuitBreakerProviderSettings = CircuitBreakerProviderSettingsBase & {
adapter: ICircuitBreakerAdapter;
};
/**
*
* IMPORT_PATH: `"@daiso-tech/core/circuit-breaker"`
* @group Derivables
*/
export declare const DEFAULT_CIRCUIT_BREAKER_PROVIDER_NAMESPACE: Namespace;
/**
* `CircuitBreakerProvider` class can be derived from any {@link ICircuitBreakerAdapter | `ICircuitBreakerAdapter`}.
*
* Note the {@link ICircuitBreaker | `ICircuitBreaker`} instances created by the `CircuitBreakerProvider` class are serializable and deserializable,
* allowing them to be seamlessly transferred across different servers, processes, and databases.
* This can be done directly using {@link ISerderRegister | `ISerderRegister`} or indirectly through components that rely on {@link ISerderRegister | `ISerderRegister`} internally.
*
* IMPORT_PATH: `"@daiso-tech/core/circuit-breaker"`
* @group Derivables
*/
export declare class CircuitBreakerProvider implements ICircuitBreakerProvider {
private readonly namespace;
private readonly eventBus;
private readonly adapter;
private readonly defaultSlowCallTime;
private readonly defaultTrigger;
private readonly defaultErrorPolicy;
private readonly serde;
private readonly serdeTransformerName;
private readonly enableAsyncTracking;
/**
* @example
* ```ts
* import { KyselyCircuitBreakerStorageAdapter } from "@daiso-tech/core/circuit-breaker/kysely-circuit-breaker-storage-adapter";
* import { DatabaseCircuitBreakerAdapter } from "@daiso-tech/core/circuit-breaker/database-circuit-breaker-adapter";
* import { Serde } from "@daiso-tech/core/serde";
* import { SuperJsonSerdeAdapter } from "@daiso-tech/core/serde/super-json-serde-adapter"
* import Sqlite from "better-sqlite3";
* import { Kysely, SqliteDialect } from "kysely";
*
* const serde = new Serde(new SuperJsonSerdeAdapter());
* const circuitBreakerStorageAdapter = new KyselyCircuitBreakerStorageAdapter({
* kysely: new Kysely({
* dialect: new SqliteDialect({
* database: new Sqlite("local.db"),
* }),
* }),
* serde
* });
* // You need initialize the adapter once before using it.
* await circuitBreakerStorageAdapter.init();
*
* const circuitBreakerAdapter = new DatabaseCircuitBreakerAdapter({
* adapter: circuitBreakerStorageAdapter
* });
*
* const circuitBreakerProvider = new CircuitBreakerProvider({
* adapter: circuitBreakerAdapter
* })
* ```
*/
constructor(settings: CircuitBreakerProviderSettings);
private registerToSerde;
addListener<TEventName extends keyof CircuitBreakerEventMap>(eventName: TEventName, listener: EventListener<CircuitBreakerEventMap[TEventName]>): ITask<void>;
removeListener<TEventName extends keyof CircuitBreakerEventMap>(eventName: TEventName, listener: EventListener<CircuitBreakerEventMap[TEventName]>): ITask<void>;
listenOnce<TEventName extends keyof CircuitBreakerEventMap>(eventName: TEventName, listener: EventListener<CircuitBreakerEventMap[TEventName]>): ITask<void>;
asTask<TEventName extends keyof CircuitBreakerEventMap>(eventName: TEventName): ITask<CircuitBreakerEventMap[TEventName]>;
subscribeOnce<TEventName extends keyof CircuitBreakerEventMap>(eventName: TEventName, listener: EventListener<CircuitBreakerEventMap[TEventName]>): ITask<Unsubscribe>;
subscribe<TEventName extends keyof CircuitBreakerEventMap>(eventName: TEventName, listener: EventListener<CircuitBreakerEventMap[TEventName]>): ITask<Unsubscribe>;
create(key: string, settings?: CircuitBreakerProviderCreateSettings): ICircuitBreaker;
}