generateApiRateLimitConfig.ts 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. import { IApiRateLimitConfig } from '../../interfaces/api-rate-limit-config';
  2. import { defaultConfig, defaultConfigWithRegExp } from './defaultApiRateLimitConfig';
  3. const envVar = process.env;
  4. // https://regex101.com/r/aNDjmI/1
  5. const regExp = /^API_RATE_LIMIT_(\w+)_ENDPOINT(_WITH_REGEXP)?$/;
  6. const generateApiRateLimitConfigFromEndpoint = (envVar: NodeJS.ProcessEnv, targets: string[], withRegExp: boolean): IApiRateLimitConfig => {
  7. const apiRateLimitConfig: IApiRateLimitConfig = {};
  8. targets.forEach((target) => {
  9. const endpointKey = withRegExp ? `API_RATE_LIMIT_${target}_ENDPOINT_WITH_REGEXP` : `API_RATE_LIMIT_${target}_ENDPOINT`;
  10. const endpoint = envVar[endpointKey];
  11. if (endpoint == null) {
  12. return;
  13. }
  14. const methodKey = `API_RATE_LIMIT_${target}_METHODS`;
  15. const maxRequestsKey = `API_RATE_LIMIT_${target}_MAX_REQUESTS`;
  16. const method = envVar[methodKey] ?? 'ALL';
  17. const maxRequests = Number(envVar[maxRequestsKey]);
  18. if (endpoint == null || maxRequests == null) {
  19. return;
  20. }
  21. const config = {
  22. method,
  23. maxRequests,
  24. };
  25. apiRateLimitConfig[endpoint] = config;
  26. });
  27. return apiRateLimitConfig;
  28. };
  29. type ApiRateLimitConfigResult = {
  30. 'withoutRegExp': IApiRateLimitConfig,
  31. 'withRegExp': IApiRateLimitConfig
  32. }
  33. export const generateApiRateLimitConfig = (): ApiRateLimitConfigResult => {
  34. const apiRateConfigTargets: string[] = [];
  35. const apiRateConfigTargetsWithRegExp: string[] = [];
  36. Object.keys(envVar).forEach((key) => {
  37. const result = key.match(regExp);
  38. if (result == null) { return null }
  39. const target = result[1];
  40. const isWithRegExp = result[2] != null;
  41. if (isWithRegExp) {
  42. apiRateConfigTargetsWithRegExp.push(target);
  43. }
  44. else {
  45. apiRateConfigTargets.push(target);
  46. }
  47. });
  48. // sort priority
  49. apiRateConfigTargets.sort();
  50. apiRateConfigTargetsWithRegExp.sort();
  51. // get config
  52. const apiRateLimitConfig = generateApiRateLimitConfigFromEndpoint(envVar, apiRateConfigTargets, false);
  53. const apiRateLimitConfigWithRegExp = generateApiRateLimitConfigFromEndpoint(envVar, apiRateConfigTargetsWithRegExp, true);
  54. const config = { ...defaultConfig, ...apiRateLimitConfig };
  55. const configWithRegExp = { ...defaultConfigWithRegExp, ...apiRateLimitConfigWithRegExp };
  56. const result: ApiRateLimitConfigResult = {
  57. withoutRegExp: config,
  58. withRegExp: configWithRegExp,
  59. };
  60. return result;
  61. };