1
import { useEnv } from '@directus/env';
2
import { merge } from 'lodash-es';
3
import type { IRateLimiterOptions, IRateLimiterStoreOptions, RateLimiterAbstract } from 'rate-limiter-flexible';
4
import { RateLimiterMemory, RateLimiterRedis, RateLimiterRes } from 'rate-limiter-flexible';
5
import { getConfigFromEnv } from './utils/get-config-from-env.js';
7
import { createRequire } from 'node:module';
9
const require = createRequire(import.meta.url);
11
type IRateLimiterOptionsOverrides = Partial<IRateLimiterOptions> | Partial<IRateLimiterStoreOptions>;
13
export function createRateLimiter(
14
configPrefix = 'RATE_LIMITER',
15
configOverrides?: IRateLimiterOptionsOverrides,
16
): RateLimiterAbstract {
19
switch (env['RATE_LIMITER_STORE']) {
21
return new RateLimiterRedis(getConfig('redis', configPrefix, configOverrides));
24
return new RateLimiterMemory(getConfig('memory', configPrefix, configOverrides));
28
export { RateLimiterRes };
33
overrides?: IRateLimiterOptionsOverrides,
34
): IRateLimiterOptions;
38
overrides?: IRateLimiterOptionsOverrides,
39
): IRateLimiterStoreOptions;
41
store: 'memory' | 'redis' = 'memory',
42
configPrefix = 'RATE_LIMITER',
43
overrides?: IRateLimiterOptionsOverrides,
44
): IRateLimiterOptions | IRateLimiterStoreOptions {
45
const config: any = getConfigFromEnv(`${configPrefix}_`, `${configPrefix}_${store}_`);
47
if (store === 'redis') {
48
const Redis = require('ioredis');
52
config.storeClient = new Redis(env[`REDIS`] || getConfigFromEnv(`REDIS_`));
55
delete config.enabled;
58
merge(config, overrides || {});