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.

115 lines (114 loc) 4.77 kB
/** * @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; }