config-generator.ts 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. import type { IApiRateLimitEndpointMap } from '../config';
  2. import { defaultConfig, defaultConfigWithRegExp } from '../config';
  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 = (
  7. envVar: NodeJS.ProcessEnv,
  8. targets: string[],
  9. withRegExp: boolean,
  10. ): IApiRateLimitEndpointMap => {
  11. const apiRateLimitConfig: IApiRateLimitEndpointMap = {};
  12. targets.forEach((target) => {
  13. const endpointKey = withRegExp
  14. ? `API_RATE_LIMIT_${target}_ENDPOINT_WITH_REGEXP`
  15. : `API_RATE_LIMIT_${target}_ENDPOINT`;
  16. const endpoint = envVar[endpointKey];
  17. if (endpoint == null) {
  18. return;
  19. }
  20. const methodKey = `API_RATE_LIMIT_${target}_METHODS`;
  21. const maxRequestsKey = `API_RATE_LIMIT_${target}_MAX_REQUESTS`;
  22. const usersPerIpProspectionKey = `API_RATE_LIMIT_${target}_USERS_PER_IP`;
  23. const method = envVar[methodKey] ?? 'ALL';
  24. const maxRequests = Number(envVar[maxRequestsKey]);
  25. const usersPerIpProspection = Number(envVar[usersPerIpProspectionKey]);
  26. if (endpoint == null || maxRequests == null) {
  27. return;
  28. }
  29. const config = {
  30. method,
  31. maxRequests,
  32. usersPerIpProspection,
  33. };
  34. apiRateLimitConfig[endpoint] = config;
  35. });
  36. return apiRateLimitConfig;
  37. };
  38. type ApiRateLimitConfigResult = {
  39. withoutRegExp: IApiRateLimitEndpointMap;
  40. withRegExp: IApiRateLimitEndpointMap;
  41. };
  42. export const generateApiRateLimitConfig = (): ApiRateLimitConfigResult => {
  43. const apiRateConfigTargets: string[] = [];
  44. const apiRateConfigTargetsWithRegExp: string[] = [];
  45. Object.keys(envVar).forEach((key) => {
  46. const result = key.match(regExp);
  47. if (result == null) {
  48. return;
  49. }
  50. const target = result[1];
  51. const isWithRegExp = result[2] != null;
  52. if (isWithRegExp) {
  53. apiRateConfigTargetsWithRegExp.push(target);
  54. } else {
  55. apiRateConfigTargets.push(target);
  56. }
  57. });
  58. // sort priority
  59. apiRateConfigTargets.sort();
  60. apiRateConfigTargetsWithRegExp.sort();
  61. // get config
  62. const apiRateLimitConfig = generateApiRateLimitConfigFromEndpoint(
  63. envVar,
  64. apiRateConfigTargets,
  65. false,
  66. );
  67. const apiRateLimitConfigWithRegExp = generateApiRateLimitConfigFromEndpoint(
  68. envVar,
  69. apiRateConfigTargetsWithRegExp,
  70. true,
  71. );
  72. const config = { ...defaultConfig, ...apiRateLimitConfig };
  73. const configWithRegExp = {
  74. ...defaultConfigWithRegExp,
  75. ...apiRateLimitConfigWithRegExp,
  76. };
  77. const result: ApiRateLimitConfigResult = {
  78. withoutRegExp: config,
  79. withRegExp: configWithRegExp,
  80. };
  81. return result;
  82. };