config-generator.ts 2.6 KB

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