Files
Moltbot/src/infra/fixed-window-rate-limit.ts
2026-02-19 14:55:06 +01:00

49 lines
1.1 KiB
TypeScript

export type FixedWindowRateLimiter = {
consume: () => {
allowed: boolean;
retryAfterMs: number;
remaining: number;
};
reset: () => void;
};
export function createFixedWindowRateLimiter(params: {
maxRequests: number;
windowMs: number;
now?: () => number;
}): FixedWindowRateLimiter {
const maxRequests = Math.max(1, Math.floor(params.maxRequests));
const windowMs = Math.max(1, Math.floor(params.windowMs));
const now = params.now ?? Date.now;
let count = 0;
let windowStartMs = 0;
return {
consume() {
const nowMs = now();
if (nowMs - windowStartMs >= windowMs) {
windowStartMs = nowMs;
count = 0;
}
if (count >= maxRequests) {
return {
allowed: false,
retryAfterMs: Math.max(0, windowStartMs + windowMs - nowMs),
remaining: 0,
};
}
count += 1;
return {
allowed: true,
retryAfterMs: 0,
remaining: Math.max(0, maxRequests - count),
};
},
reset() {
count = 0;
windowStartMs = 0;
},
};
}