diff --git a/packages/backend/src/server/api/SkRateLimiterService.ts b/packages/backend/src/server/api/SkRateLimiterService.ts index 027d05310b..d9abbfd406 100644 --- a/packages/backend/src/server/api/SkRateLimiterService.ts +++ b/packages/backend/src/server/api/SkRateLimiterService.ts @@ -35,7 +35,7 @@ export class SkRateLimiterService { } public async limit(limit: RateLimit, actor: string, factor = 1): Promise { - if (this.disabled) { + if (this.disabled || factor === 0) { return { blocked: false, remaining: Number.MAX_SAFE_INTEGER, @@ -46,7 +46,7 @@ export class SkRateLimiterService { }; } - if (factor <= 0) { + if (factor < 0) { throw new Error(`Rate limit factor is zero or negative: ${factor}`); } diff --git a/packages/backend/test/unit/server/api/SkRateLimiterServiceTests.ts b/packages/backend/test/unit/server/api/SkRateLimiterServiceTests.ts index 215b83b53f..c7fac85706 100644 --- a/packages/backend/test/unit/server/api/SkRateLimiterServiceTests.ts +++ b/packages/backend/test/unit/server/api/SkRateLimiterServiceTests.ts @@ -300,10 +300,11 @@ describe(SkRateLimiterService, () => { expect(counter?.t).toBe(0); }); - it('should throw if factor is zero', async () => { - const promise = serviceUnderTest().limit(limit, actor, 0); + it('should skip if factor is zero', async () => { + const info = await serviceUnderTest().limit(limit, actor, 0); - await expect(promise).rejects.toThrow(/factor is zero or negative/); + expect(info.blocked).toBeFalsy(); + expect(info.remaining).toBe(Number.MAX_SAFE_INTEGER); }); it('should throw if factor is negative', async () => { @@ -537,10 +538,11 @@ describe(SkRateLimiterService, () => { expect(minCounter?.t).toBe(0); }); - it('should throw if factor is zero', async () => { - const promise = serviceUnderTest().limit(limit, actor, 0); + it('should skip if factor is zero', async () => { + const info = await serviceUnderTest().limit(limit, actor, 0); - await expect(promise).rejects.toThrow(/factor is zero or negative/); + expect(info.blocked).toBeFalsy(); + expect(info.remaining).toBe(Number.MAX_SAFE_INTEGER); }); it('should throw if factor is negative', async () => { @@ -693,10 +695,11 @@ describe(SkRateLimiterService, () => { expect(i2.blocked).toBeFalsy(); }); - it('should throw if factor is zero', async () => { - const promise = serviceUnderTest().limit(limit, actor, 0); + it('should skip if factor is zero', async () => { + const info = await serviceUnderTest().limit(limit, actor, 0); - await expect(promise).rejects.toThrow(/factor is zero or negative/); + expect(info.blocked).toBeFalsy(); + expect(info.remaining).toBe(Number.MAX_SAFE_INTEGER); }); it('should throw if factor is negative', async () => {