From 32635ecc25d328314988db3c3f91e3d1c7d9d6c2 Mon Sep 17 00:00:00 2001 From: Hazelnoot Date: Sat, 7 Dec 2024 12:15:38 -0500 Subject: fix rate limit storage in redis --- .../backend/src/server/api/SkRateLimiterService.ts | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) (limited to 'packages/backend/src/server/api') diff --git a/packages/backend/src/server/api/SkRateLimiterService.ts b/packages/backend/src/server/api/SkRateLimiterService.ts index 3e4b125e79..763de0029b 100644 --- a/packages/backend/src/server/api/SkRateLimiterService.ts +++ b/packages/backend/src/server/api/SkRateLimiterService.ts @@ -209,7 +209,7 @@ export class SkRateLimiterService extends RateLimiterService { // Update the limit counter, but not if blocked if (!blocked) { // Don't await, or we will slow down the API. - this.setLimitCounter(limit, actor, counter, resetMs, 'min') + this.setLimitCounter(limit, actor, counter, fullResetSec, 'min') .catch(err => this.logger.error(`Failed to update limit ${limit.key}:min for ${actor}:`, err)); } @@ -217,7 +217,7 @@ export class SkRateLimiterService extends RateLimiterService { } private async limitBucket(limit: RateLimit, actor: string, factor: number): Promise { - const counter = await this.getLimitCounter(limit, actor); + const counter = await this.getLimitCounter(limit, actor, 'bucket'); const dripRate = (limit.dripRate ?? 1000); const dripSize = (limit.dripSize ?? 1); const bucketSize = (limit.size * factor); @@ -245,14 +245,14 @@ export class SkRateLimiterService extends RateLimiterService { // Update the limit counter, but not if blocked if (!blocked) { // Don't await, or we will slow down the API. - this.setLimitCounter(limit, actor, counter, fullResetMs) + this.setLimitCounter(limit, actor, counter, fullResetSec, 'bucket') .catch(err => this.logger.error(`Failed to update limit ${limit.key} for ${actor}:`, err)); } return limitInfo; } - private async getLimitCounter(limit: SupportedRateLimit, actor: string, subject?: string): Promise { + private async getLimitCounter(limit: SupportedRateLimit, actor: string, subject: string): Promise { const key = createLimitKey(limit, actor, subject); const value = await this.redisClient.get(key); @@ -263,19 +263,16 @@ export class SkRateLimiterService extends RateLimiterService { return JSON.parse(value); } - private async setLimitCounter(limit: SupportedRateLimit, actor: string, counter: LimitCounter, expirationMs: number, subject?: string): Promise { + private async setLimitCounter(limit: SupportedRateLimit, actor: string, counter: LimitCounter, expiration: number, subject: string): Promise { const key = createLimitKey(limit, actor, subject); const value = JSON.stringify(counter); - await this.redisClient.set(key, value, 'PX', expirationMs); + const expirationSec = Math.max(expiration, 1); + await this.redisClient.set(key, value, 'EX', expirationSec); } } -function createLimitKey(limit: SupportedRateLimit, actor: string, subject?: string): string { - if (subject) { - return `rl_${actor}_${limit.key}_${subject}`; - } else { - return `rl_${actor}_${limit.key}`; - } +function createLimitKey(limit: SupportedRateLimit, actor: string, subject: string): string { + return `rl_${actor}_${limit.key}_${subject}`; } export interface LimitCounter { -- cgit v1.2.3-freya