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.

117 lines 5.29 kB
/** * @module RateLimiter */ import {} from "../../../../event-bus/contracts/_module.js"; import { NoOpEventBusAdapter } from "../../../../event-bus/implementations/adapters/_module.js"; import { resolveEventBusInput, } from "../../../../event-bus/implementations/derivables/_module.js"; import {} from "../../../../execution-context/contracts/_module.js"; import { NoOpExecutionContextAdapter } from "../../../../execution-context/implementations/adapters/no-op-execution-context-adapter/_module.js"; import { ExecutionContext } from "../../../../execution-context/implementations/derivables/_module.js"; import {} from "../../../../namespace/contracts/_module.js"; import { NoOpNamespace } from "../../../../namespace/implementations/_module.js"; import {} from "../../../../rate-limiter/contracts/_module.js"; import { RateLimiterSerdeTransformer } from "../../../../rate-limiter/implementations/derivables/rate-limiter-factory/rate-limiter-serde-transformer.js"; import { RateLimiter } from "../../../../rate-limiter/implementations/derivables/rate-limiter-factory/rate-limiter.js"; import {} from "../../../../serde/contracts/_module.js"; import { NoOpSerdeAdapter } from "../../../../serde/implementations/adapters/_module.js"; import { Serde } from "../../../../serde/implementations/derivables/_module.js"; import { CORE, defaultWaitUntil, resolveOneOrMore, } from "../../../../utilities/_module.js"; /** * The `RateLimiterFactory` class can be derived from any {@link IRateLimiterAdapter | `IRateLimiterAdapter`}. * * IMPORT_PATH: `"@daiso-tech/core/rate-limiter"` * @group Derivables */ export class RateLimiterFactory { namespace; eventBus; adapter; onlyError; defaultErrorPolicy; enableAsyncTracking; serde; serdeTransformerName; waitUntil; executionContext; /** * @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 rateLimiterFactory = new RateLimiterFactory({ * adapter: rateLimiterAdapter * }) * ``` */ constructor(settings) { const { enableAsyncTracking = true, namespace = new NoOpNamespace(), eventBus = new NoOpEventBusAdapter(), adapter, onlyError = false, defaultErrorPolicy = () => true, serde = new Serde(new NoOpSerdeAdapter()), serdeTransformerName = "", waitUntil = defaultWaitUntil, executionContext = new ExecutionContext(new NoOpExecutionContextAdapter()), } = settings; this.executionContext = executionContext; this.waitUntil = waitUntil; this.serdeTransformerName = serdeTransformerName; this.enableAsyncTracking = enableAsyncTracking; this.namespace = namespace; this.eventBus = resolveEventBusInput(namespace, eventBus); this.adapter = adapter; this.onlyError = onlyError; this.defaultErrorPolicy = defaultErrorPolicy; this.serde = serde; this.registerToSerde(); } registerToSerde() { const transformer = new RateLimiterSerdeTransformer({ executionContext: this.executionContext, waitUntil: this.waitUntil, enableAsyncTracking: this.enableAsyncTracking, namespace: this.namespace, eventBus: this.eventBus, adapter: this.adapter, onlyError: this.onlyError, errorPolicy: this.defaultErrorPolicy, serdeTransformerName: this.serdeTransformerName, }); for (const serde of resolveOneOrMore(this.serde)) { serde.registerCustom(transformer, CORE); } } get events() { return this.eventBus; } create(key, settings) { const { errorPolicy = this.defaultErrorPolicy, onlyError = this.onlyError, limit, } = settings; return new RateLimiter({ executionContext: this.executionContext, limit, waitUntil: this.waitUntil, enableAsyncTracking: this.enableAsyncTracking, eventDispatcher: this.eventBus, adapter: this.adapter, key: this.namespace.create(key), errorPolicy, onlyError, serdeTransformerName: this.serdeTransformerName, namespace: this.namespace, }); } } //# sourceMappingURL=rate-limiter-factory.js.map