directus

Форк
0
/
rate-limiter.ts 
61 строка · 1.8 Кб
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';
6

7
import { createRequire } from 'node:module';
8

9
const require = createRequire(import.meta.url);
10

11
type IRateLimiterOptionsOverrides = Partial<IRateLimiterOptions> | Partial<IRateLimiterStoreOptions>;
12

13
export function createRateLimiter(
14
	configPrefix = 'RATE_LIMITER',
15
	configOverrides?: IRateLimiterOptionsOverrides,
16
): RateLimiterAbstract {
17
	const env = useEnv();
18

19
	switch (env['RATE_LIMITER_STORE']) {
20
		case 'redis':
21
			return new RateLimiterRedis(getConfig('redis', configPrefix, configOverrides));
22
		case 'memory':
23
		default:
24
			return new RateLimiterMemory(getConfig('memory', configPrefix, configOverrides));
25
	}
26
}
27

28
export { RateLimiterRes };
29

30
function getConfig(
31
	store: 'memory',
32
	configPrefix: string,
33
	overrides?: IRateLimiterOptionsOverrides,
34
): IRateLimiterOptions;
35
function getConfig(
36
	store: 'redis',
37
	configPrefix: string,
38
	overrides?: IRateLimiterOptionsOverrides,
39
): IRateLimiterStoreOptions;
40
function getConfig(
41
	store: 'memory' | 'redis' = 'memory',
42
	configPrefix = 'RATE_LIMITER',
43
	overrides?: IRateLimiterOptionsOverrides,
44
): IRateLimiterOptions | IRateLimiterStoreOptions {
45
	const config: any = getConfigFromEnv(`${configPrefix}_`, `${configPrefix}_${store}_`);
46

47
	if (store === 'redis') {
48
		const Redis = require('ioredis');
49

50
		const env = useEnv();
51

52
		config.storeClient = new Redis(env[`REDIS`] || getConfigFromEnv(`REDIS_`));
53
	}
54

55
	delete config.enabled;
56
	delete config.store;
57

58
	merge(config, overrides || {});
59

60
	return config;
61
}
62

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.