misc: migrated to structured singleton pattern

This commit is contained in:
Sheen Capadngan
2024-06-14 02:32:21 +08:00
parent 46b48cea63
commit bc3f21809e
3 changed files with 56 additions and 55 deletions
+10 -32
View File
@@ -1,31 +1,20 @@
import type { RateLimitOptions, RateLimitPluginOptions } from "@fastify/rate-limit";
import { Redis } from "ioredis";
import { TRateLimit } from "@app/db/schemas";
import { getConfig } from "@app/lib/config/env";
export const rateLimitMaxConfiguration = {
readLimit: 60,
publicEndpointLimit: 30,
writeLimit: 200,
secretsLimit: 60,
authRateLimit: 60,
inviteUserRateLimit: 30,
mfaRateLimit: 20,
creationLimit: 30
};
import { getRateLimiterConfig } from "@app/services/rate-limit/rate-limit-service";
// GET endpoints
export const readLimit: RateLimitOptions = {
timeWindow: 60 * 1000,
max: () => rateLimitMaxConfiguration.readLimit,
max: () => getRateLimiterConfig().readLimit,
keyGenerator: (req) => req.realIp
};
// POST, PATCH, PUT, DELETE endpoints
export const writeLimit: RateLimitOptions = {
timeWindow: 60 * 1000,
max: () => rateLimitMaxConfiguration.writeLimit, // (too low, FA having issues so increasing it - maidul)
max: () => getRateLimiterConfig().writeLimit,
keyGenerator: (req) => req.realIp
};
@@ -33,25 +22,25 @@ export const writeLimit: RateLimitOptions = {
export const secretsLimit: RateLimitOptions = {
// secrets, folders, secret imports
timeWindow: 60 * 1000,
max: () => rateLimitMaxConfiguration.secretsLimit,
max: () => getRateLimiterConfig().secretsLimit,
keyGenerator: (req) => req.realIp
};
export const authRateLimit: RateLimitOptions = {
timeWindow: 60 * 1000,
max: () => rateLimitMaxConfiguration.authRateLimit,
max: () => getRateLimiterConfig().authRateLimit,
keyGenerator: (req) => req.realIp
};
export const inviteUserRateLimit: RateLimitOptions = {
timeWindow: 60 * 1000,
max: () => rateLimitMaxConfiguration.inviteUserRateLimit,
max: () => getRateLimiterConfig().inviteUserRateLimit,
keyGenerator: (req) => req.realIp
};
export const mfaRateLimit: RateLimitOptions = {
timeWindow: 60 * 1000,
max: () => rateLimitMaxConfiguration.mfaRateLimit,
max: () => getRateLimiterConfig().mfaRateLimit,
keyGenerator: (req) => {
return req.headers.authorization?.split(" ")[1] || req.realIp;
}
@@ -60,7 +49,7 @@ export const mfaRateLimit: RateLimitOptions = {
export const creationLimit: RateLimitOptions = {
// identity, project, org
timeWindow: 60 * 1000,
max: () => rateLimitMaxConfiguration.creationLimit,
max: () => getRateLimiterConfig().creationLimit,
keyGenerator: (req) => req.realIp
};
@@ -68,27 +57,16 @@ export const creationLimit: RateLimitOptions = {
export const publicEndpointLimit: RateLimitOptions = {
// Shared Secrets
timeWindow: 60 * 1000,
max: () => rateLimitMaxConfiguration.publicEndpointLimit,
max: () => getRateLimiterConfig().publicEndpointLimit,
keyGenerator: (req) => req.realIp
};
export const globalRateLimiterCfg = async (customRateLimits?: TRateLimit): Promise<RateLimitPluginOptions> => {
export const globalRateLimiterCfg = (): RateLimitPluginOptions => {
const appCfg = getConfig();
const redis = appCfg.isRedisConfigured
? new Redis(appCfg.REDIS_URL, { connectTimeout: 500, maxRetriesPerRequest: 1 })
: null;
if (customRateLimits) {
rateLimitMaxConfiguration.readLimit = customRateLimits.readRateLimit;
rateLimitMaxConfiguration.publicEndpointLimit = customRateLimits.publicEndpointLimit;
rateLimitMaxConfiguration.writeLimit = customRateLimits.writeRateLimit;
rateLimitMaxConfiguration.secretsLimit = customRateLimits.secretsRateLimit;
rateLimitMaxConfiguration.authRateLimit = customRateLimits.authRateLimit;
rateLimitMaxConfiguration.inviteUserRateLimit = customRateLimits.inviteUserRateLimit;
rateLimitMaxConfiguration.mfaRateLimit = customRateLimits.mfaRateLimit;
rateLimitMaxConfiguration.creationLimit = customRateLimits.creationLimit;
}
return {
timeWindow: 60 * 1000,
max: 600,