32 lines
876 B
TypeScript
32 lines
876 B
TypeScript
const attempts = new Map<string, { count: number; resetAt: number }>()
|
|
|
|
export function checkRateLimit(
|
|
key: string,
|
|
maxAttempts = 5,
|
|
windowMs = 60000,
|
|
): { allowed: boolean; remaining: number; resetAt: number } {
|
|
const now = Date.now()
|
|
const entry = attempts.get(key)
|
|
|
|
if (!entry || now > entry.resetAt) {
|
|
attempts.set(key, { count: 1, resetAt: now + windowMs })
|
|
return { allowed: true, remaining: maxAttempts - 1, resetAt: now + windowMs }
|
|
}
|
|
|
|
entry.count++
|
|
|
|
if (entry.count > maxAttempts) {
|
|
return { allowed: false, remaining: 0, resetAt: entry.resetAt }
|
|
}
|
|
|
|
return { allowed: true, remaining: maxAttempts - entry.count, resetAt: entry.resetAt }
|
|
}
|
|
|
|
// Cleanup stale entries every 5 minutes
|
|
setInterval(() => {
|
|
const now = Date.now()
|
|
for (const [key, entry] of attempts) {
|
|
if (now > entry.resetAt) attempts.delete(key)
|
|
}
|
|
}, 300000)
|