@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.
75 lines • 3.15 kB
JavaScript
/**
* @module RateLimiter
*/
import { exponentialBackoff, } from "../../../../backoff-policies/_module.js";
import {} from "../../../../rate-limiter/contracts/_module.js";
import { RateLimiterPolicy, } from "../../../../rate-limiter/implementations/adapters/database-rate-limiter-adapter/rate-limiter-policy.js";
import { RateLimiterStateManager } from "../../../../rate-limiter/implementations/adapters/database-rate-limiter-adapter/rate-limiter-state-manager.js";
import { RateLimiterStorage } from "../../../../rate-limiter/implementations/adapters/database-rate-limiter-adapter/rate-limiter-storage.js";
import { FixedWindowLimiter } from "../../../../rate-limiter/implementations/policies/_module.js";
import { TimeSpan } from "../../../../time-span/implementations/_module.js";
/**
* IMPORT_PATH: `"@daiso-tech/core/rate-limiter/database-rate-limiter-adapter"`
* @group Adapters
*/
export class DatabaseRateLimiterAdapter {
rateLimiterStorage;
rateLimiterStateManager;
/**
* @example
* ```ts
* import { DatabaseRateLimiterAdapter } from "@daiso-tech/core/rate-limiter/database-rate-limiter-adapter";
* import { MemoryRateLimiterStorageAdapter } from "@daiso-tech/core/rate-limiter/memory-rate-limiter-storage-adapter";
*
* const rateLimiterStorageAdapter = new MemoryRateLimiterStorageAdapter();
* const rateLimiterAdapter = new DatabaseRateLimiterAdapter({
* adapter: rateLimiterStorageAdapter
* });
* ```
*/
constructor(settings) {
const { adapter, backoffPolicy = exponentialBackoff(), rateLimiterPolicy = new FixedWindowLimiter(), } = settings;
const internalRateLimiterPolicy = new RateLimiterPolicy(rateLimiterPolicy);
this.rateLimiterStorage = new RateLimiterStorage({
adapter: adapter,
rateLimiterPolicy: internalRateLimiterPolicy,
backoffPolicy,
});
this.rateLimiterStateManager = new RateLimiterStateManager(internalRateLimiterPolicy, backoffPolicy);
}
async getState(key) {
const state = await this.rateLimiterStorage.find(key);
if (state === null) {
return null;
}
return {
...state,
resetTime: state.resetTime === null
? null
: TimeSpan.fromDateRange({
end: state.resetTime,
}),
};
}
async updateState(key, limit) {
const currentDate = new Date();
const state = await this.rateLimiterStorage.atomicUpdate({
key,
update: (state) => {
return this.rateLimiterStateManager.updateState(limit, currentDate)(this.rateLimiterStateManager.track(currentDate)(state));
},
});
return {
...state,
resetTime: state.resetTime === null
? null
: TimeSpan.fromDateRange({
end: state.resetTime,
}),
};
}
async reset(key) {
await this.rateLimiterStorage.remove(key);
}
}
//# sourceMappingURL=database-rate-limiter-adapter.js.map