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.

104 lines 3.97 kB
/** * @module RateLimiter */ import {} from "../../../../event-bus/contracts/_module.js"; import { NoOpEventBusAdapter } from "../../../../event-bus/implementations/adapters/_module.js"; import { EventBus } from "../../../../event-bus/implementations/derivables/_module.js"; import { Namespace } from "../../../../namespace/_module.js"; import {} from "../../../../rate-limiter/contracts/_module.js"; import { RateLimiter } from "../../../../rate-limiter/implementations/derivables/rate-limiter-provider/rate-limiter.js"; import {} from "../../../../task/contracts/_module.js"; import {} from "../../../../utilities/_module.js"; /** * * IMPORT_PATH: `"@daiso-tech/core/rate-limiter"` * @group Derivables */ export const DEFAULT_CIRCUIT_BREAKER_PROVIDER_NAMESPACE = new Namespace("@rate-limiter"); /** * The `RateLimiterProvider` class can be derived from any {@link IRateLimiterAdapter | `IRateLimiterAdapter`}. * * IMPORT_PATH: `"@daiso-tech/core/rate-limiter"` * @group Derivables */ export class RateLimiterProvider { namespace; eventBus; adapter; onlyError; errorPolicy; 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) { const { enableAsyncTracking = true, namespace = DEFAULT_CIRCUIT_BREAKER_PROVIDER_NAMESPACE, eventBus = new EventBus({ adapter: new NoOpEventBusAdapter(), }), adapter, onlyError = false, errorPolicy = () => true, } = settings; this.enableAsyncTracking = enableAsyncTracking; this.namespace = namespace; this.eventBus = eventBus; this.adapter = adapter; this.onlyError = onlyError; this.errorPolicy = errorPolicy; } addListener(eventName, listener) { return this.eventBus.addListener(eventName, listener); } removeListener(eventName, listener) { return this.eventBus.removeListener(eventName, listener); } listenOnce(eventName, listener) { return this.eventBus.listenOnce(eventName, listener); } asTask(eventName) { return this.eventBus.asTask(eventName); } subscribeOnce(eventName, listener) { return this.eventBus.subscribeOnce(eventName, listener); } subscribe(eventName, listener) { return this.eventBus.subscribe(eventName, listener); } create(key, settings) { const { errorPolicy = this.errorPolicy, onlyError = this.onlyError, limit, } = settings; return new RateLimiter({ limit, enableAsyncTracking: this.enableAsyncTracking, eventDispatcher: this.eventBus, adapter: this.adapter, key: this.namespace.create(key), errorPolicy, onlyError, }); } } //# sourceMappingURL=rate-limiter-provider.js.map