Files
directus/api/src/rate-limiter.ts
rijkvanzanten 801e868554 Fix remaining eslint errors
h/t @paescuj
2021-04-29 15:55:12 -04:00

53 lines
1.7 KiB
TypeScript

import { merge } from 'lodash';
import {
IRateLimiterOptions,
IRateLimiterStoreOptions,
RateLimiterAbstract,
RateLimiterMemcache,
RateLimiterMemory,
RateLimiterRedis,
} from 'rate-limiter-flexible';
import env from './env';
import { getConfigFromEnv } from './utils/get-config-from-env';
type IRateLimiterOptionsOverrides = Partial<IRateLimiterOptions> | Partial<IRateLimiterStoreOptions>;
export function createRateLimiter(configOverrides?: IRateLimiterOptionsOverrides): RateLimiterAbstract {
switch (env.RATE_LIMITER_STORE) {
case 'redis':
return new RateLimiterRedis(getConfig('redis', configOverrides));
case 'memcache':
return new RateLimiterMemcache(getConfig('memcache', configOverrides));
case 'memory':
default:
return new RateLimiterMemory(getConfig('memory', configOverrides));
}
}
function getConfig(store: 'memory', overrides?: IRateLimiterOptionsOverrides): IRateLimiterOptions;
function getConfig(store: 'redis' | 'memcache', overrides?: IRateLimiterOptionsOverrides): IRateLimiterStoreOptions;
function getConfig(
store: 'memory' | 'redis' | 'memcache' = 'memory',
overrides?: IRateLimiterOptionsOverrides
): IRateLimiterOptions | IRateLimiterStoreOptions {
const config: any = getConfigFromEnv('RATE_LIMITER_', `RATE_LIMITER_${store}_`);
if (store === 'redis') {
const Redis = require('ioredis');
delete config.redis;
config.storeClient = new Redis(env.RATE_LIMITER_REDIS || getConfigFromEnv('RATE_LIMITER_REDIS_'));
}
if (store === 'memcache') {
const Memcached = require('memcached');
config.storeClient = new Memcached(env.RATE_LIMITER_MEMCACHE, getConfigFromEnv('RATE_LIMITER_MEMCACHE_'));
}
delete config.enabled;
delete config.store;
merge(config, overrides || {});
return config;
}