summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHazelnoot <acomputerdog@gmail.com>2024-12-08 09:22:38 -0500
committerHazelnoot <acomputerdog@gmail.com>2024-12-08 09:22:38 -0500
commita7a1edc92ea2c40ddaacf804c268e31f383816c5 (patch)
tree4498472a6a745f27813e6e5e9795d2a99d224a52
parentsupport fractional rate limit scaling (diff)
downloadsharkey-a7a1edc92ea2c40ddaacf804c268e31f383816c5.tar.gz
sharkey-a7a1edc92ea2c40ddaacf804c268e31f383816c5.tar.bz2
sharkey-a7a1edc92ea2c40ddaacf804c268e31f383816c5.zip
fix NaN from extremely high rate limits
-rw-r--r--packages/backend/src/server/api/SkRateLimiterService.ts2
-rw-r--r--packages/backend/test/unit/server/api/SkRateLimiterServiceTests.ts14
2 files changed, 15 insertions, 1 deletions
diff --git a/packages/backend/src/server/api/SkRateLimiterService.ts b/packages/backend/src/server/api/SkRateLimiterService.ts
index fb100be286..7726edfb31 100644
--- a/packages/backend/src/server/api/SkRateLimiterService.ts
+++ b/packages/backend/src/server/api/SkRateLimiterService.ts
@@ -155,7 +155,7 @@ export class SkRateLimiterService {
type: 'bucket',
key: limit.key,
size: limit.max,
- dripRate: Math.round(limit.duration / limit.max),
+ dripRate: Math.max(Math.round(limit.duration / limit.max), 1),
}, actor, factor),
);
}
diff --git a/packages/backend/test/unit/server/api/SkRateLimiterServiceTests.ts b/packages/backend/test/unit/server/api/SkRateLimiterServiceTests.ts
index 07bcfb6309..7e0c01f849 100644
--- a/packages/backend/test/unit/server/api/SkRateLimiterServiceTests.ts
+++ b/packages/backend/test/unit/server/api/SkRateLimiterServiceTests.ts
@@ -564,6 +564,20 @@ describe(SkRateLimiterService, () => {
expect(counter?.c).toBe(1);
expect(counter?.t).toBe(0);
});
+
+ it('should not allow dripRate to be lower than 0', async () => {
+ // real-world case; taken from StreamingApiServerService
+ limit.max = 4096;
+ limit.duration = 2000;
+ counter = { c: 4096, t: 0 };
+
+ const i1 = await serviceUnderTest().limit(limit, actor);
+ mockTimeService.now = 1;
+ const i2 = await serviceUnderTest().limit(limit, actor);
+
+ expect(i1.blocked).toBeTruthy();
+ expect(i2.blocked).toBeFalsy();
+ });
});
describe('with legacy limit and min interval', () => {