27 lines
858 B
TypeScript
27 lines
858 B
TypeScript
type RateLimitEntry = { count: number; resetAt: number };
|
|
|
|
const entries = new Map<string, RateLimitEntry>();
|
|
const windowMs = 10 * 60 * 1000;
|
|
const maxRequests = 5;
|
|
|
|
export function consumeRateLimit(key: string, limit: number, durationMs: number) {
|
|
const now = Date.now();
|
|
const current = entries.get(key);
|
|
if (!current || current.resetAt <= now) {
|
|
entries.set(key, { count: 1, resetAt: now + durationMs });
|
|
return true;
|
|
}
|
|
if (current.count >= limit) return false;
|
|
current.count += 1;
|
|
return true;
|
|
}
|
|
|
|
export function consumeContactRateLimit(key: string) {
|
|
return consumeRateLimit(key, maxRequests, windowMs);
|
|
}
|
|
|
|
export function getClientIp(requestHeaders: Headers) {
|
|
const forwardedFor = requestHeaders.get("x-forwarded-for")?.split(",")[0]?.trim();
|
|
return forwardedFor || requestHeaders.get("x-real-ip")?.trim() || "unknown";
|
|
}
|