Files
digitalcatalog/server/rate-limit.ts
T

26 lines
554 B
TypeScript

export type RateLimiter = {
check: (ip: string) => boolean;
};
export function createRateLimiter(
limit: number,
windowMs: number,
now: () => number = () => Date.now(),
): RateLimiter {
const hits = new Map<string, number[]>();
return {
check(ip: string) {
const t = now();
const recent = (hits.get(ip) ?? []).filter((ts) => t - ts < windowMs);
if (recent.length >= limit) {
hits.set(ip, recent);
return false;
}
recent.push(t);
hits.set(ip, recent);
return true;
},
};
}