zenin-limiter
Version:
Universal rate & throttle limiter middleware for Express, Fastify, and custom handlers
1 lines • 64.2 kB
Source Map (JSON)
{"version":3,"sources":["../src/strategies/memoryStore.ts","../src/strategies/slidingWindow.ts","../src/strategies/tokenBucket.ts","../src/utils/configDefaults.ts","../src/utils/configValidator.ts","../src/core/RateLimiter.ts","../src/utils/keyGenerator.ts","../src/middleware/express.ts","../src/middleware/fastify.ts","../src/middleware/nest.ts","../src/middleware/handler.ts"],"names":["gcInterval","sweepExpiredKeys"],"mappings":"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","file":"index.mjs","sourcesContent":["import { RateLimiterConfig } from \"../types\";\r\n\r\n/**\r\n * A record to track individual key usage, expiration, and LRU node.\r\n */\r\ntype MemoryStoreData = {\r\n count: number;\r\n expiresAt: number;\r\n lruNode: LruNode;\r\n};\r\n\r\n/**\r\n * A node in the expiry min-heap.\r\n */\r\ntype HeapNode = {\r\n key: string;\r\n expiresAt: number;\r\n};\r\n\r\n/**\r\n * A node in the LRU doubly-linked list.\r\n */\r\ntype LruNode = {\r\n key: string;\r\n prev: LruNode | null;\r\n next: LruNode | null;\r\n};\r\n\r\n/**\r\n * Rate limiter state.\r\n */\r\nconst memoryStore = new Map<string, MemoryStoreData>();\r\nconst heap: HeapNode[] = []; // Min-heap for expirations\r\nlet hits = 0;\r\nlet rejections = 0;\r\nlet callCount = 0;\r\nlet lruHead: LruNode | null = null; // LRU list head\r\nlet lruTail: LruNode | null = null; // LRU list tail\r\nconst perKeyStats = new Map<string, { hits: number; rejections: number }>(); // Optional per-key metrics\r\nlet lockPromise: Promise<void> = Promise.resolve(); // Concurrency lock\r\nlet gcInterval: NodeJS.Timeout | null = null;\r\n\r\n/**\r\n * Min-heap operations for expiry queue.\r\n */\r\nfunction heapPush(node: HeapNode): void {\r\n heap.push(node);\r\n let i = heap.length - 1;\r\n while (i > 0) {\r\n const parent = Math.floor((i - 1) / 2);\r\n if (heap[parent].expiresAt <= node.expiresAt) break;\r\n heap[i] = heap[parent];\r\n i = parent;\r\n }\r\n heap[i] = node;\r\n}\r\n\r\nfunction heapPop(): HeapNode | undefined {\r\n if (heap.length === 0) return undefined;\r\n const result = heap[0];\r\n const last = heap.pop()!;\r\n if (heap.length > 0) {\r\n heap[0] = last;\r\n let i = 0;\r\n while (true) {\r\n const left = 2 * i + 1;\r\n const right = 2 * i + 2;\r\n let smallest = i;\r\n if (\r\n left < heap.length &&\r\n heap[left].expiresAt < heap[smallest].expiresAt\r\n ) {\r\n smallest = left;\r\n }\r\n if (\r\n right < heap.length &&\r\n heap[right].expiresAt < heap[smallest].expiresAt\r\n ) {\r\n smallest = right;\r\n }\r\n if (smallest === i) break;\r\n [heap[i], heap[smallest]] = [heap[smallest], heap[i]];\r\n i = smallest;\r\n }\r\n }\r\n return result;\r\n}\r\n\r\n/**\r\n * LRU operations for memory capping.\r\n */\r\nfunction addLruNode(key: string): LruNode {\r\n const node: LruNode = { key, prev: null, next: lruHead };\r\n if (lruHead) lruHead.prev = node;\r\n lruHead = node;\r\n if (!lruTail) lruTail = node;\r\n return node;\r\n}\r\n\r\nfunction moveToFront(node: LruNode): void {\r\n if (node === lruHead) return;\r\n if (node.prev) node.prev.next = node.next;\r\n if (node.next) node.next.prev = node.prev;\r\n if (node === lruTail) lruTail = node.prev;\r\n node.next = lruHead;\r\n node.prev = null;\r\n if (lruHead) lruHead.prev = node;\r\n lruHead = node;\r\n if (!lruTail) lruTail = node;\r\n}\r\n\r\nfunction removeLruTail(): void {\r\n if (!lruTail) return;\r\n memoryStore.delete(lruTail.key);\r\n perKeyStats.delete(lruTail.key);\r\n if (lruTail.prev) {\r\n lruTail.prev.next = null;\r\n lruTail = lruTail.prev;\r\n } else {\r\n lruHead = null;\r\n lruTail = null;\r\n }\r\n}\r\n\r\n/**\r\n * Resets the rate limit for a specific key.\r\n * @param key The key to reset\r\n * @throws Error if key is invalid\r\n */\r\nexport async function resetKey(key: string): Promise<void> {\r\n if (typeof key !== \"string\" || key.trim() === \"\") {\r\n throw new Error(\"Invalid key\");\r\n }\r\n const unlock = await acquireLock();\r\n try {\r\n const entry = memoryStore.get(key);\r\n if (entry) {\r\n if (entry.lruNode.prev) entry.lruNode.prev.next = entry.lruNode.next;\r\n if (entry.lruNode.next) entry.lruNode.next.prev = entry.lruNode.prev;\r\n if (entry.lruNode === lruHead) lruHead = entry.lruNode.next;\r\n if (entry.lruNode === lruTail) lruTail = entry.lruNode.prev;\r\n memoryStore.delete(key);\r\n perKeyStats.delete(key);\r\n }\r\n } finally {\r\n unlock();\r\n }\r\n}\r\n\r\n/**\r\n * Resets all rate limit state.\r\n */\r\nexport async function resetAll(): Promise<void> {\r\n const unlock = await acquireLock();\r\n try {\r\n memoryStore.clear();\r\n heap.length = 0;\r\n hits = 0;\r\n rejections = 0;\r\n callCount = 0;\r\n lruHead = null;\r\n lruTail = null;\r\n perKeyStats.clear();\r\n } finally {\r\n unlock();\r\n }\r\n}\r\n\r\n/**\r\n * Returns current rate limit metrics.\r\n * @param key Optional key for per-key stats\r\n * @returns Object containing hits and rejections (global or per-key)\r\n */\r\nexport async function getMetrics(\r\n key?: string\r\n): Promise<{ hits: number; rejections: number }> {\r\n const unlock = await acquireLock();\r\n try {\r\n if (key && perKeyStats.has(key)) {\r\n return { ...perKeyStats.get(key)! };\r\n }\r\n return { hits, rejections };\r\n } finally {\r\n unlock();\r\n }\r\n}\r\n\r\n/**\r\n * Acquires a lock for concurrency safety in JavaScript's event loop.\r\n * @returns A function to release the lock\r\n */\r\nasync function acquireLock(): Promise<() => void> {\r\n const currentLock = lockPromise;\r\n let resolveLock: () => void;\r\n lockPromise = new Promise((resolve) => {\r\n resolveLock = resolve;\r\n });\r\n await currentLock;\r\n return () => resolveLock!();\r\n}\r\n\r\nfunction sweepExpiredKeys(maxBatchCleanup: number = 1000) {\r\n const now = Date.now();\r\n let cleaned = 0;\r\n while (\r\n heap.length > 0 &&\r\n heap[0].expiresAt <= now &&\r\n cleaned < maxBatchCleanup\r\n ) {\r\n const expired = heapPop()!;\r\n const current = memoryStore.get(expired.key);\r\n if (current && current.expiresAt === expired.expiresAt) {\r\n if (current.lruNode.prev)\r\n current.lruNode.prev.next = current.lruNode.next;\r\n if (current.lruNode.next)\r\n current.lruNode.next.prev = current.lruNode.prev;\r\n if (current.lruNode === lruHead) lruHead = current.lruNode.next;\r\n if (current.lruNode === lruTail) lruTail = current.lruNode.prev;\r\n memoryStore.delete(expired.key);\r\n perKeyStats.delete(expired.key);\r\n }\r\n cleaned++;\r\n }\r\n}\r\n\r\n/**\r\n * Checks if a key is allowed based on rate limit.\r\n * Uses a min-heap for expirations, LRU for memory capping, and Promise-based locking.\r\n * Handles millions of users with hybrid cleanup (on-demand + periodic).\r\n * @param key Unique identifier for rate limiting\r\n * @param limit Maximum requests allowed in window\r\n * @param windowInSeconds Time window in seconds\r\n * @param config Optional configuration (maxStoreSize, cleanupInterval, enablePerKeyStats, maxBatchCleanup)\r\n * @param now Optional time source for testing (defaults to Date.now)\r\n * @returns True if allowed, false if rate limit exceeded\r\n * @throws Error if inputs are invalid\r\n */\r\nexport async function isAllowedMemory(\r\n key: string,\r\n limit: number,\r\n windowInSeconds: number,\r\n config: RateLimiterConfig = {},\r\n now: () => number = Date.now\r\n): Promise<boolean> {\r\n /* Validate inputs start*/\r\n if (typeof key !== \"string\" || key.trim() === \"\")\r\n throw new Error(\"Invalid key\");\r\n\r\n if (\r\n !Number.isFinite(limit) ||\r\n limit <= 0 ||\r\n !Number.isFinite(windowInSeconds) ||\r\n windowInSeconds <= 0\r\n )\r\n throw new Error(\"Invalid limit or windowInSeconds\");\r\n\r\n if (windowInSeconds * 1000 > Number.MAX_SAFE_INTEGER) {\r\n throw new Error(\"Window too large for safe expiration\");\r\n }\r\n /* Validate inputs start*/\r\n\r\n const {\r\n maxStoreSize = 1000000,\r\n cleanupInterval = 1000,\r\n enablePerKeyStats = false,\r\n maxBatchCleanup = 1000,\r\n } = config;\r\n const unlock = await acquireLock();\r\n try {\r\n const currentTime = now();\r\n callCount++;\r\n\r\n // Step 1: On-demand cleanup for recent expirations\r\n let cleanupCount = 0;\r\n while (\r\n heap.length > 0 &&\r\n heap[0].expiresAt <= currentTime &&\r\n cleanupCount < maxBatchCleanup\r\n ) {\r\n const expired = heapPop()!;\r\n const current = memoryStore.get(expired.key);\r\n if (current && current.expiresAt === expired.expiresAt) {\r\n if (current.lruNode.prev)\r\n current.lruNode.prev.next = current.lruNode.next;\r\n if (current.lruNode.next)\r\n current.lruNode.next.prev = current.lruNode.prev;\r\n if (current.lruNode === lruHead) lruHead = current.lruNode.next;\r\n if (current.lruNode === lruTail) lruTail = current.lruNode.prev;\r\n memoryStore.delete(expired.key);\r\n perKeyStats.delete(expired.key);\r\n }\r\n cleanupCount++;\r\n }\r\n\r\n // Step 2: Periodic cleanup for older expirations\r\n if (callCount % cleanupInterval === 0 && heap.length > 0) {\r\n const threshold = currentTime - windowInSeconds * 1000;\r\n cleanupCount = 0;\r\n while (\r\n heap.length > 0 &&\r\n heap[0].expiresAt <= threshold &&\r\n cleanupCount < maxBatchCleanup\r\n ) {\r\n const expired = heapPop()!;\r\n const current = memoryStore.get(expired.key);\r\n if (current && current.expiresAt === expired.expiresAt) {\r\n if (current.lruNode.prev)\r\n current.lruNode.prev.next = current.lruNode.next;\r\n if (current.lruNode.next)\r\n current.lruNode.next.prev = current.lruNode.prev;\r\n if (current.lruNode === lruHead) lruHead = current.lruNode.next;\r\n if (current.lruNode === lruTail) lruTail = current.lruNode.prev;\r\n memoryStore.delete(expired.key);\r\n perKeyStats.delete(expired.key);\r\n }\r\n cleanupCount++;\r\n }\r\n }\r\n\r\n // Step 3: Enforce memory cap\r\n while (memoryStore.size >= maxStoreSize) {\r\n removeLruTail();\r\n }\r\n\r\n // Step 4: Process the current key\r\n let entry = memoryStore.get(key);\r\n if (!entry) {\r\n // New entry\r\n const expiresAt = currentTime + windowInSeconds * 1000;\r\n const lruNode = addLruNode(key);\r\n entry = { count: 1, expiresAt, lruNode };\r\n memoryStore.set(key, entry);\r\n heapPush({ key, expiresAt });\r\n hits++;\r\n if (enablePerKeyStats) {\r\n perKeyStats.set(key, {\r\n hits: (perKeyStats.get(key)?.hits || 0) + 1,\r\n rejections: perKeyStats.get(key)?.rejections || 0,\r\n });\r\n }\r\n return true;\r\n }\r\n\r\n moveToFront(entry.lruNode);\r\n\r\n if (entry.expiresAt <= currentTime) {\r\n // Expired entry\r\n const expiresAt = currentTime + windowInSeconds * 1000;\r\n entry.count = 1;\r\n entry.expiresAt = expiresAt;\r\n heapPush({ key, expiresAt });\r\n hits++;\r\n if (enablePerKeyStats) {\r\n perKeyStats.set(key, {\r\n hits: (perKeyStats.get(key)?.hits || 0) + 1,\r\n rejections: perKeyStats.get(key)?.rejections || 0,\r\n });\r\n }\r\n return true;\r\n }\r\n\r\n if (entry.count < limit) {\r\n entry.count++;\r\n hits++;\r\n if (enablePerKeyStats) {\r\n perKeyStats.set(key, {\r\n hits: (perKeyStats.get(key)?.hits || 0) + 1,\r\n rejections: perKeyStats.get(key)?.rejections || 0,\r\n });\r\n }\r\n return true;\r\n }\r\n\r\n rejections++;\r\n if (enablePerKeyStats) {\r\n perKeyStats.set(key, {\r\n hits: perKeyStats.get(key)?.hits || 0,\r\n rejections: (perKeyStats.get(key)?.rejections || 0) + 1,\r\n });\r\n }\r\n return false; // Rate limit exceeded\r\n } finally {\r\n unlock();\r\n }\r\n}\r\n\r\nimport { RateLimitStrategy, RateLimitState } from \"../types\";\r\n\r\nexport class FixedWindowStrategy implements RateLimitStrategy {\r\n private config: any;\r\n private maxEntries: number;\r\n private gcStarted = false;\r\n private getLimitFn?: (req?: any) => number;\r\n\r\n constructor(config: any) {\r\n this.config = config;\r\n this.maxEntries = config.limiterConfig?.maxStoreSize || 1000000;\r\n this.getLimitFn =\r\n typeof config.limit === \"function\" ? config.limit : undefined;\r\n this.startGC();\r\n }\r\n\r\n private getLimit(req?: any): number {\r\n if (this.getLimitFn) {\r\n return this.getLimitFn(req);\r\n }\r\n return this.config.limit;\r\n }\r\n\r\n private startGC() {\r\n if (this.gcStarted) return;\r\n gcInterval = setInterval(() => {\r\n sweepExpiredKeys(this.config.limiterConfig?.maxBatchCleanup || 1000);\r\n // Enforce maxEntries\r\n while (memoryStore.size > this.maxEntries) {\r\n removeLruTail();\r\n }\r\n }, 30000); // 30 seconds\r\n this.gcStarted = true;\r\n }\r\n\r\n stopGC() {\r\n if (gcInterval) clearInterval(gcInterval);\r\n this.gcStarted = false;\r\n }\r\n\r\n async isAllowed(key: string, req?: any): Promise<boolean> {\r\n // Enforce maxEntries before allowing\r\n while (memoryStore.size >= this.maxEntries) {\r\n removeLruTail();\r\n }\r\n return isAllowedMemory(\r\n key,\r\n this.getLimit(req),\r\n this.config.windowInSeconds,\r\n this.config.limiterConfig\r\n );\r\n }\r\n\r\n async reset(key: string): Promise<void> {\r\n return resetKey(key);\r\n }\r\n\r\n async getState(key: string): Promise<RateLimitState> {\r\n // Not implemented in original logic, return dummy for now\r\n return {\r\n remaining: 0,\r\n resetAt: 0,\r\n limit: this.config.limit,\r\n };\r\n }\r\n\r\n static async resetAll(): Promise<void> {\r\n await resetAll();\r\n }\r\n}\r\n","import { RateLimitStrategy, RateLimitState } from \"../types\";\r\n\r\ntype SlidingWindowData = {\r\n timestamps: number[];\r\n expiresAt: number;\r\n};\r\n\r\nconst slidingWindowStore = new Map<string, SlidingWindowData>();\r\n\r\nlet gcInterval: NodeJS.Timeout | null = null;\r\n\r\nfunction sweepExpiredKeys(maxEntries: number = 1000000) {\r\n const now = Date.now();\r\n for (const [key, entry] of slidingWindowStore.entries()) {\r\n entry.timestamps = entry.timestamps.filter(\r\n (ts) => ts > now - entry.expiresAt\r\n );\r\n if (entry.timestamps.length === 0) {\r\n slidingWindowStore.delete(key);\r\n }\r\n }\r\n // Enforce maxEntries\r\n while (slidingWindowStore.size > maxEntries) {\r\n // Remove oldest (not LRU, but simple for now)\r\n const firstKey = slidingWindowStore.keys().next().value;\r\n slidingWindowStore.delete(firstKey);\r\n }\r\n}\r\n\r\nexport class SlidingWindowStrategy implements RateLimitStrategy {\r\n private limit: number;\r\n private windowMs: number;\r\n private config: any;\r\n private maxEntries: number;\r\n private gcStarted = false;\r\n private getLimitFn?: (req?: any) => number;\r\n\r\n constructor(config: any) {\r\n this.config = config;\r\n this.limit = config.limit;\r\n this.windowMs = config.windowInSeconds * 1000;\r\n this.maxEntries = config.limiterConfig?.maxStoreSize || 1000000;\r\n this.getLimitFn =\r\n typeof config.limit === \"function\" ? config.limit : undefined;\r\n this.startGC();\r\n }\r\n\r\n private startGC() {\r\n if (this.gcStarted) return;\r\n gcInterval = setInterval(() => {\r\n sweepExpiredKeys(this.maxEntries);\r\n }, 30000);\r\n this.gcStarted = true;\r\n }\r\n\r\n stopGC() {\r\n if (gcInterval) clearInterval(gcInterval);\r\n this.gcStarted = false;\r\n }\r\n\r\n private getLimit(req?: any): number {\r\n if (this.getLimitFn) {\r\n return this.getLimitFn(req);\r\n }\r\n return this.limit;\r\n }\r\n\r\n async isAllowed(key: string, req?: any): Promise<boolean> {\r\n // Enforce maxEntries before allowing\r\n while (slidingWindowStore.size >= this.maxEntries) {\r\n const firstKey = slidingWindowStore.keys().next().value;\r\n slidingWindowStore.delete(firstKey);\r\n }\r\n const now = Date.now();\r\n const windowStart = now - this.windowMs;\r\n let entry = slidingWindowStore.get(key);\r\n if (!entry) {\r\n entry = { timestamps: [], expiresAt: now + this.windowMs };\r\n slidingWindowStore.set(key, entry);\r\n }\r\n entry.timestamps = entry.timestamps.filter(\r\n (timestamp) => timestamp > windowStart\r\n );\r\n if (entry.timestamps.length < this.getLimit(req)) {\r\n entry.timestamps.push(now);\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n async getState(key: string, req?: any): Promise<RateLimitState> {\r\n const now = Date.now();\r\n const windowStart = now - this.windowMs;\r\n const entry = slidingWindowStore.get(key);\r\n const limit = this.getLimit(req);\r\n if (!entry) {\r\n return {\r\n remaining: limit,\r\n resetAt: now + this.windowMs,\r\n limit: limit,\r\n };\r\n }\r\n entry.timestamps = entry.timestamps.filter(\r\n (timestamp) => timestamp > windowStart\r\n );\r\n return {\r\n remaining: Math.max(0, limit - entry.timestamps.length),\r\n resetAt:\r\n entry.timestamps.length > 0\r\n ? entry.timestamps[0] + this.windowMs\r\n : now + this.windowMs,\r\n limit: limit,\r\n };\r\n }\r\n\r\n async reset(key: string): Promise<void> {\r\n slidingWindowStore.delete(key);\r\n }\r\n\r\n static async resetAll(): Promise<void> {\r\n slidingWindowStore.clear();\r\n }\r\n}\r\n","import { RateLimitStrategy, RateLimitState } from \"../types\";\r\n\r\ntype TokenBucketData = {\r\n tokens: number;\r\n lastRefill: number;\r\n capacity: number;\r\n refillRate: number; // tokens per millisecond\r\n};\r\n\r\nconst tokenBucketStore = new Map<string, TokenBucketData>();\r\n\r\nlet gcInterval: NodeJS.Timeout | null = null;\r\n\r\nfunction sweepExpiredKeys(maxEntries: number = 1000000) {\r\n const now = Date.now();\r\n for (const [key, entry] of tokenBucketStore.entries()) {\r\n // If tokens are 0 and lastRefill is older than a window, delete\r\n if (\r\n entry.tokens <= 0 &&\r\n now - entry.lastRefill > entry.capacity / entry.refillRate\r\n ) {\r\n tokenBucketStore.delete(key);\r\n }\r\n }\r\n // Enforce maxEntries\r\n while (tokenBucketStore.size > maxEntries) {\r\n const firstKey = tokenBucketStore.keys().next().value;\r\n tokenBucketStore.delete(firstKey);\r\n }\r\n}\r\n\r\nexport class TokenBucketStrategy implements RateLimitStrategy {\r\n private capacity: number;\r\n private refillRate: number;\r\n private config: any;\r\n private maxEntries: number;\r\n private gcStarted = false;\r\n private getLimitFn?: (req?: any) => number;\r\n\r\n constructor(config: any) {\r\n this.config = config;\r\n this.capacity = config.limit;\r\n this.refillRate = config.limit / (config.windowInSeconds * 1000);\r\n this.maxEntries = config.limiterConfig?.maxStoreSize || 1000000;\r\n this.getLimitFn =\r\n typeof config.limit === \"function\" ? config.limit : undefined;\r\n this.startGC();\r\n }\r\n\r\n private startGC() {\r\n if (this.gcStarted) return;\r\n gcInterval = setInterval(() => {\r\n sweepExpiredKeys(this.maxEntries);\r\n }, 30000);\r\n this.gcStarted = true;\r\n }\r\n\r\n stopGC() {\r\n if (gcInterval) clearInterval(gcInterval);\r\n this.gcStarted = false;\r\n }\r\n\r\n private getLimit(req?: any): number {\r\n if (this.getLimitFn) {\r\n return this.getLimitFn(req);\r\n }\r\n return this.capacity;\r\n }\r\n\r\n async isAllowed(key: string, req?: any): Promise<boolean> {\r\n // Enforce maxEntries before allowing\r\n while (tokenBucketStore.size >= this.maxEntries) {\r\n const firstKey = tokenBucketStore.keys().next().value;\r\n tokenBucketStore.delete(firstKey);\r\n }\r\n const now = Date.now();\r\n const limit = this.getLimit(req);\r\n let entry = tokenBucketStore.get(key);\r\n if (!entry) {\r\n entry = {\r\n tokens: limit,\r\n lastRefill: now,\r\n capacity: limit,\r\n refillRate: limit / (this.config.windowInSeconds * 1000),\r\n };\r\n tokenBucketStore.set(key, entry);\r\n }\r\n const timeElapsed = now - entry.lastRefill;\r\n const tokensToAdd = timeElapsed * entry.refillRate;\r\n entry.tokens = Math.min(entry.capacity, entry.tokens + tokensToAdd);\r\n entry.lastRefill = now;\r\n if (entry.tokens >= 1) {\r\n entry.tokens -= 1;\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n async getState(key: string, req?: any): Promise<RateLimitState> {\r\n const now = Date.now();\r\n const limit = this.getLimit(req);\r\n const entry = tokenBucketStore.get(key);\r\n if (!entry) {\r\n return {\r\n remaining: limit,\r\n resetAt: now + limit / (limit / (this.config.windowInSeconds * 1000)),\r\n limit: limit,\r\n };\r\n }\r\n const timeElapsed = now - entry.lastRefill;\r\n const tokensToAdd = timeElapsed * entry.refillRate;\r\n const currentTokens = Math.min(entry.capacity, entry.tokens + tokensToAdd);\r\n return {\r\n remaining: Math.floor(currentTokens),\r\n resetAt: now + (limit - currentTokens) / entry.refillRate,\r\n limit: limit,\r\n };\r\n }\r\n\r\n async reset(key: string): Promise<void> {\r\n tokenBucketStore.delete(key);\r\n }\r\n\r\n static async resetAll(): Promise<void> {\r\n tokenBucketStore.clear();\r\n }\r\n}\r\n","import { LimiterConfig, RateLimiterConfig } from \"../types\";\r\n\r\nexport function applyDefaults(config: Partial<LimiterConfig>): LimiterConfig {\r\n const defaultLimiterConfig = {\r\n maxStoreSize: 1000000,\r\n cleanupInterval: 1000,\r\n enablePerKeyStats: false,\r\n maxBatchCleanup: 1000,\r\n };\r\n\r\n return {\r\n limit: 100,\r\n windowInSeconds: 60,\r\n strategy: \"fixed\",\