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