@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
JavaScript
/**
* @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