diff options
| author | syuilo <Syuilotan@yahoo.co.jp> | 2023-01-15 16:52:12 +0900 |
|---|---|---|
| committer | syuilo <Syuilotan@yahoo.co.jp> | 2023-01-15 16:52:12 +0900 |
| commit | 7fc8d2e6d5cc0d34c4188af94c4c66ac70e1ee9f (patch) | |
| tree | 7e292e345fc8bf7dee8461b3e3adbd46b452dc78 /packages/backend/src/server | |
| parent | Update actions/github-script (#9588) (diff) | |
| download | sharkey-7fc8d2e6d5cc0d34c4188af94c4c66ac70e1ee9f.tar.gz sharkey-7fc8d2e6d5cc0d34c4188af94c4c66ac70e1ee9f.tar.bz2 sharkey-7fc8d2e6d5cc0d34c4188af94c4c66ac70e1ee9f.zip | |
ロールでレートリミットを調整できるように
Resolve #9584
Diffstat (limited to 'packages/backend/src/server')
| -rw-r--r-- | packages/backend/src/server/api/ApiCallService.ts | 5 | ||||
| -rw-r--r-- | packages/backend/src/server/api/RateLimiterService.ts | 8 |
2 files changed, 8 insertions, 5 deletions
diff --git a/packages/backend/src/server/api/ApiCallService.ts b/packages/backend/src/server/api/ApiCallService.ts index c19e861a5a..dcc9342a82 100644 --- a/packages/backend/src/server/api/ApiCallService.ts +++ b/packages/backend/src/server/api/ApiCallService.ts @@ -224,8 +224,11 @@ export class ApiCallService implements OnApplicationShutdown { limit.key = ep.name; } + // TODO: 毎リクエスト計算するのもあれだしキャッシュしたい + const factor = user ? (await this.roleService.getUserRoleOptions(user.id)).rateLimitFactor : 1; + // Rate limit - await this.rateLimiterService.limit(limit as IEndpointMeta['limit'] & { key: NonNullable<string> }, limitActor).catch(err => { + await this.rateLimiterService.limit(limit as IEndpointMeta['limit'] & { key: NonNullable<string> }, limitActor, factor).catch(err => { throw new ApiError({ message: 'Rate limit exceeded. Please try again later.', code: 'RATE_LIMIT_EXCEEDED', diff --git a/packages/backend/src/server/api/RateLimiterService.ts b/packages/backend/src/server/api/RateLimiterService.ts index c893b60baf..a9c34e363a 100644 --- a/packages/backend/src/server/api/RateLimiterService.ts +++ b/packages/backend/src/server/api/RateLimiterService.ts @@ -26,7 +26,7 @@ export class RateLimiterService { } @bindThis - public limit(limitation: IEndpointMeta['limit'] & { key: NonNullable<string> }, actor: string) { + public limit(limitation: IEndpointMeta['limit'] & { key: NonNullable<string> }, actor: string, factor = 1) { return new Promise<void>((ok, reject) => { if (this.disabled) ok(); @@ -34,7 +34,7 @@ export class RateLimiterService { const min = (): void => { const minIntervalLimiter = new Limiter({ id: `${actor}:${limitation.key}:min`, - duration: limitation.minInterval, + duration: limitation.minInterval * factor, max: 1, db: this.redisClient, }); @@ -62,8 +62,8 @@ export class RateLimiterService { const max = (): void => { const limiter = new Limiter({ id: `${actor}:${limitation.key}`, - duration: limitation.duration, - max: limitation.max, + duration: limitation.duration * factor, + max: limitation.max / factor, db: this.redisClient, }); |