diff --git a/server/rpc/src/sliding.ts b/server/rpc/src/sliding.ts index 4917765a9b..6deb39e47d 100644 --- a/server/rpc/src/sliding.ts +++ b/server/rpc/src/sliding.ts @@ -40,15 +40,13 @@ export class SlidingWindowRateLimitter { // Update reset time rateLimit.resetTime = now + this.rateLimitWindow - rateLimit.requests.push(now + (rateLimit.rejectedRequests > this.rateLimitMax * 2 ? this.rateLimitWindow * 5 : 0)) + if (rateLimit.requests.length <= this.rateLimitMax) { + rateLimit.requests.push(now + (rateLimit.rejectedRequests > this.rateLimitMax * 2 ? this.rateLimitWindow * 5 : 0)) + } if (rateLimit.requests.length > this.rateLimitMax) { rateLimit.rejectedRequests++ - if (rateLimit.requests.length > this.rateLimitMax * 2) { - // Keep only last requests - rateLimit.requests.splice(0, rateLimit.requests.length - this.rateLimitMax) - } // Find when the oldest request will exit the window const someRequest = Math.round(Math.random() * rateLimit.requests.length) const nextAvailableTime = rateLimit.requests[someRequest] + this.rateLimitWindow diff --git a/server/rpc/src/test/rateLimit.spec.ts b/server/rpc/src/test/rateLimit.spec.ts index a22e91abf3..cdafa573db 100644 --- a/server/rpc/src/test/rateLimit.spec.ts +++ b/server/rpc/src/test/rateLimit.spec.ts @@ -123,7 +123,6 @@ describe('SlidingWindowRateLimitter', () => { clock += 10000 const r2 = limiter.checkRateLimit('user1') - expect(r2.remaining).toBe(0) - expect(r2.retryAfter).toBeDefined() + expect(r2.remaining).toBe(9) }) })