From 4270f5a6351d6d550419e2426c5a69c0f2c3eff1 Mon Sep 17 00:00:00 2001 From: Ashutosh Palhare Date: Mon, 2 Nov 2026 22:47:06 +0530 Subject: [PATCH 1/3] fix(core): reject non-finite rate limit values --- packages/core/src/limits/rate-limit.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/core/src/limits/rate-limit.ts b/packages/core/src/limits/rate-limit.ts index 2f2aca3f..63e96a3c 100644 --- a/packages/core/src/limits/rate-limit.ts +++ b/packages/core/src/limits/rate-limit.ts @@ -56,8 +56,8 @@ export function createRateLimiter( rule: RateLimitRule, options: RateLimiterOptions = {} ): { check(key: string): Promise } { - if (rule.limit <= 0) throw new Error('limit must be greater than 0'); - if (rule.windowMs <= 0) throw new Error('windowMs must be greater than 0'); + if (!Number.isFinite(rule.limit) || rule.limit <= 0) throw new Error('limit must be a finite number greater than 0'); + if (!Number.isFinite(rule.windowMs) || rule.windowMs <= 0) throw new Error('windowMs must be a finite number greater than 0'); const prefix = options.prefix ?? 'rl'; const now = options.now ?? Date.now; From a0653281b0882e004d000d8c2007effa2535e340 Mon Sep 17 00:00:00 2001 From: Ashutosh Palhare Date: Mon, 2 Nov 2026 22:47:09 +0530 Subject: [PATCH 2/3] test(core): cover non-finite rate limit values --- packages/core/tests/limits/rate-limit.test.ts | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/packages/core/tests/limits/rate-limit.test.ts b/packages/core/tests/limits/rate-limit.test.ts index 3626bb36..876440bc 100644 --- a/packages/core/tests/limits/rate-limit.test.ts +++ b/packages/core/tests/limits/rate-limit.test.ts @@ -20,10 +20,14 @@ function countersOf(options?: Parameters[0]): CounterStore describe('createRateLimiter', () => { it('throws on invalid rule', () => { const counters = countersOf(); - expect(() => createRateLimiter(counters, { limit: 0, windowMs: 1000 })).toThrow('limit must be greater than 0'); - expect(() => createRateLimiter(counters, { limit: -1, windowMs: 1000 })).toThrow('limit must be greater than 0'); - expect(() => createRateLimiter(counters, { limit: 5, windowMs: 0 })).toThrow('windowMs must be greater than 0'); - expect(() => createRateLimiter(counters, { limit: 5, windowMs: -1 })).toThrow('windowMs must be greater than 0'); + expect(() => createRateLimiter(counters, { limit: 0, windowMs: 1000 })).toThrow('limit must be a finite number greater than 0'); + expect(() => createRateLimiter(counters, { limit: -1, windowMs: 1000 })).toThrow('limit must be a finite number greater than 0'); + expect(() => createRateLimiter(counters, { limit: Number.NaN, windowMs: 1000 })).toThrow('limit must be a finite number greater than 0'); + expect(() => createRateLimiter(counters, { limit: Number.POSITIVE_INFINITY, windowMs: 1000 })).toThrow('limit must be a finite number greater than 0'); + expect(() => createRateLimiter(counters, { limit: 5, windowMs: 0 })).toThrow('windowMs must be a finite number greater than 0'); + expect(() => createRateLimiter(counters, { limit: 5, windowMs: -1 })).toThrow('windowMs must be a finite number greater than 0'); + expect(() => createRateLimiter(counters, { limit: 5, windowMs: Number.NaN })).toThrow('windowMs must be a finite number greater than 0'); + expect(() => createRateLimiter(counters, { limit: 5, windowMs: Number.POSITIVE_INFINITY })).toThrow('windowMs must be a finite number greater than 0'); }); it('allows exactly limit requests and blocks the next one', async () => { From 46a8889fee3828e96ec9446e445f0a3a32557575 Mon Sep 17 00:00:00 2001 From: Ashutosh Palhare Date: Mon, 2 Nov 2026 22:47:13 +0530 Subject: [PATCH 3/3] chore: add rate limiter validation changeset --- .changeset/finite-rate-limit-values.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/finite-rate-limit-values.md diff --git a/.changeset/finite-rate-limit-values.md b/.changeset/finite-rate-limit-values.md new file mode 100644 index 00000000..1474980d --- /dev/null +++ b/.changeset/finite-rate-limit-values.md @@ -0,0 +1,5 @@ +--- +"@chatcops/core": patch +--- + +Reject non-finite rate limit values during limiter creation.