@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.
115 lines (114 loc) • 4.77 kB
TypeScript
/**
* @module RateLimiter
*/
import { type EventListener, type IEventBus, type Unsubscribe } from "../../../../event-bus/contracts/_module.js";
import { Namespace } from "../../../../namespace/_module.js";
import { type IRateLimiter, type IRateLimiterAdapter, type IRateLimiterProvider, type RateLimiterEventMap, type RateLimiterProviderCreateSettings } from "../../../../rate-limiter/contracts/_module.js";
import { type ITask } from "../../../../task/contracts/_module.js";
import { type ErrorPolicySettings } from "../../../../utilities/_module.js";
/**
*
* IMPORT_PATH: `"@daiso-tech/core/rate-limiter"`
* @group Derivables
*/
export type RateLimiterProviderSettingsBase = ErrorPolicySettings & {
/**
* @default
* ```ts
* import { Namespace } from "@daiso-tech/core/namespace";
*
* new Namespace("@rate-limiter")
* ```
*/
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;
/**
* If true will only apply rate limiting when function errors and not when function is called.
* @default false
*/
onlyError?: boolean;
/**
* If true, metric tracking will run asynchronously in the background and won't block the function utilizing the circuit breaker logic.
* This will only have effect if `onlyError` settings is true.
* @default true
*/
enableAsyncTracking?: boolean;
};
/**
*
* IMPORT_PATH: `"@daiso-tech/core/rate-limiter"`
* @group Derivables
*/
export type RateLimiterProviderSettings = RateLimiterProviderSettingsBase & {
adapter: IRateLimiterAdapter;
};
/**
*
* IMPORT_PATH: `"@daiso-tech/core/rate-limiter"`
* @group Derivables
*/
export declare const DEFAULT_CIRCUIT_BREAKER_PROVIDER_NAMESPACE: Namespace;
/**
* The `RateLimiterProvider` class can be derived from any {@link IRateLimiterAdapter | `IRateLimiterAdapter`}.
*
* IMPORT_PATH: `"@daiso-tech/core/rate-limiter"`
* @group Derivables
*/
export declare class RateLimiterProvider implements IRateLimiterProvider {
private readonly namespace;
private readonly eventBus;
private readonly adapter;
private readonly onlyError;
private readonly errorPolicy;
private readonly enableAsyncTracking;
/**
* @example
* ```ts
* import { KyselyRateLimiterStorageAdapter } from "@daiso-tech/core/rate-limiter/kysely-rate-limiter-storage-adapter";
* import { DatabaseRateLimiterAdapter } from "@daiso-tech/core/rate-limiter/database-rate-limiter-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 rateLimiterStorageAdapter = new KyselyRateLimiterStorageAdapter({
* kysely: new Kysely({
* dialect: new SqliteDialect({
* database: new Sqlite("local.db"),
* }),
* }),
* serde
* });
* // You need initialize the adapter once before using it.
* await rateLimiterStorageAdapter.init();
*
* const rateLimiterAdapter = new DatabaseRateLimiterAdapter({
* adapter: rateLimiterStorageAdapter
* });
*
* const rateLimiterProvider = new RateLimiterProvider({
* adapter: rateLimiterAdapter
* })
* ```
*/
constructor(settings: RateLimiterProviderSettings);
addListener<TEventName extends keyof RateLimiterEventMap>(eventName: TEventName, listener: EventListener<RateLimiterEventMap[TEventName]>): ITask<void>;
removeListener<TEventName extends keyof RateLimiterEventMap>(eventName: TEventName, listener: EventListener<RateLimiterEventMap[TEventName]>): ITask<void>;
listenOnce<TEventName extends keyof RateLimiterEventMap>(eventName: TEventName, listener: EventListener<RateLimiterEventMap[TEventName]>): ITask<void>;
asTask<TEventName extends keyof RateLimiterEventMap>(eventName: TEventName): ITask<RateLimiterEventMap[TEventName]>;
subscribeOnce<TEventName extends keyof RateLimiterEventMap>(eventName: TEventName, listener: EventListener<RateLimiterEventMap[TEventName]>): ITask<Unsubscribe>;
subscribe<TEventName extends keyof RateLimiterEventMap>(eventName: TEventName, listener: EventListener<RateLimiterEventMap[TEventName]>): ITask<Unsubscribe>;
create(key: string, settings: RateLimiterProviderCreateSettings): IRateLimiter;
}