founders card

This commit is contained in:
2026-09-14 13:23:14 +00:00
parent c5084170b8
commit 64759ce17d
57 changed files with 5013 additions and 188 deletions
+40
View File
@@ -0,0 +1,40 @@
const WINDOW_MS = 60_000;
const MAX_CARD_HITS = 60;
const MAX_SIGNUP_HITS = 10;
const cardHitsByIp = new Map<string, number[]>();
const signupHitsByIp = new Map<string, number[]>();
function checkLimit(
store: Map<string, number[]>,
ip: string,
maxHits: number,
): { allowed: true } | { allowed: false; retryAfterSeconds: number } {
const now = Date.now();
const cutoff = now - WINDOW_MS;
const prev = store.get(ip) ?? [];
const recent = prev.filter((t) => t > cutoff);
if (recent.length >= maxHits) {
const retryAfterSeconds = Math.max(
1,
Math.ceil((recent[0]! + WINDOW_MS - now) / 1000),
);
store.set(ip, recent);
return { allowed: false, retryAfterSeconds };
}
recent.push(now);
store.set(ip, recent);
return { allowed: true };
}
export function checkPublicCardRateLimit(
ip: string,
): { allowed: true } | { allowed: false; retryAfterSeconds: number } {
return checkLimit(cardHitsByIp, ip, MAX_CARD_HITS);
}
export function checkPublicSignupRateLimit(
ip: string,
): { allowed: true } | { allowed: false; retryAfterSeconds: number } {
return checkLimit(signupHitsByIp, ip, MAX_SIGNUP_HITS);
}