import { config } from "./config.ts"; import { logger } from "./logger.ts"; interface RateLimitEntry { count: number; resetTime: number; } class RateLimiter { private storage = new Map(); isRateLimited(ip: string): boolean { const now = Date.now(); const entry = this.storage.get(ip); if (!entry || now > entry.resetTime) { this.storage.set(ip, { count: 1, resetTime: now + config.rateLimit.windowMs, }); return false; } if (entry.count >= config.rateLimit.maxUploads) { logger.security("WARN", "Rate limit exceeded", { ip, count: entry.count }); return true; } entry.count++; return false; } cleanup() { const now = Date.now(); for (const [ip, entry] of this.storage.entries()) { if (now > entry.resetTime) { this.storage.delete(ip); } } } } export const rateLimiter = new RateLimiter(); // Cleanup expired entries every 5 minutes setInterval(() => rateLimiter.cleanup(), 5 * 60 * 1000);