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.

75 lines 3.15 kB
/** * @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