summaryrefslogtreecommitdiff
path: root/packages/backend/src
diff options
context:
space:
mode:
authorsyuilo <Syuilotan@yahoo.co.jp>2023-01-15 16:52:12 +0900
committersyuilo <Syuilotan@yahoo.co.jp>2023-01-15 16:52:12 +0900
commit7fc8d2e6d5cc0d34c4188af94c4c66ac70e1ee9f (patch)
tree7e292e345fc8bf7dee8461b3e3adbd46b452dc78 /packages/backend/src
parentUpdate actions/github-script (#9588) (diff)
downloadsharkey-7fc8d2e6d5cc0d34c4188af94c4c66ac70e1ee9f.tar.gz
sharkey-7fc8d2e6d5cc0d34c4188af94c4c66ac70e1ee9f.tar.bz2
sharkey-7fc8d2e6d5cc0d34c4188af94c4c66ac70e1ee9f.zip
ロールでレートリミットを調整できるように
Resolve #9584
Diffstat (limited to 'packages/backend/src')
-rw-r--r--packages/backend/src/core/RoleService.ts3
-rw-r--r--packages/backend/src/server/api/ApiCallService.ts5
-rw-r--r--packages/backend/src/server/api/RateLimiterService.ts8
3 files changed, 11 insertions, 5 deletions
diff --git a/packages/backend/src/core/RoleService.ts b/packages/backend/src/core/RoleService.ts
index 13fbfaf418..9fd612c96e 100644
--- a/packages/backend/src/core/RoleService.ts
+++ b/packages/backend/src/core/RoleService.ts
@@ -28,6 +28,7 @@ export type RoleOptions = {
noteEachClipsLimit: number;
userListLimit: number;
userEachUserListsLimit: number;
+ rateLimitFactor: number;
};
export const DEFAULT_ROLE: RoleOptions = {
@@ -45,6 +46,7 @@ export const DEFAULT_ROLE: RoleOptions = {
noteEachClipsLimit: 200,
userListLimit: 10,
userEachUserListsLimit: 50,
+ rateLimitFactor: 1,
};
@Injectable()
@@ -221,6 +223,7 @@ export class RoleService implements OnApplicationShutdown {
noteEachClipsLimit: Math.max(...getOptionValues('noteEachClipsLimit')),
userListLimit: Math.max(...getOptionValues('userListLimit')),
userEachUserListsLimit: Math.max(...getOptionValues('userEachUserListsLimit')),
+ rateLimitFactor: Math.max(...getOptionValues('rateLimitFactor')),
};
}
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,
});