26 lines
554 B
TypeScript
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;
|
|
},
|
|
};
|
|
}
|