rate-limiter.ts 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. export type IApiRateLimitConfig = {
  2. method: string,
  3. maxRequests: number,
  4. usersPerIpProspection?: number,
  5. }
  6. export type IApiRateLimitEndpointMap = {
  7. [endpoint: string]: IApiRateLimitConfig
  8. }
  9. export const DEFAULT_MAX_REQUESTS = 500;
  10. export const DEFAULT_DURATION_SEC = 60;
  11. export const DEFAULT_USERS_PER_IP_PROSPECTION = 5;
  12. const MAX_REQUESTS_TIER_1 = 5;
  13. const MAX_REQUESTS_TIER_2 = 20;
  14. const MAX_REQUESTS_TIER_3 = 50;
  15. const MAX_REQUESTS_TIER_4 = 100;
  16. // default config without reg exp
  17. export const defaultConfig: IApiRateLimitEndpointMap = {
  18. '/_api/v3/healthcheck': {
  19. method: 'GET',
  20. maxRequests: 60,
  21. usersPerIpProspection: 1,
  22. },
  23. '/installer': {
  24. method: 'POST',
  25. maxRequests: MAX_REQUESTS_TIER_1,
  26. usersPerIpProspection: 1,
  27. },
  28. '/login': {
  29. method: 'POST',
  30. maxRequests: MAX_REQUESTS_TIER_1,
  31. usersPerIpProspection: 100,
  32. },
  33. '/invited': {
  34. method: 'POST',
  35. maxRequests: MAX_REQUESTS_TIER_2,
  36. },
  37. '/register': {
  38. method: 'POST',
  39. maxRequests: MAX_REQUESTS_TIER_1,
  40. usersPerIpProspection: 20,
  41. },
  42. '/user-activation/register': {
  43. method: 'POST',
  44. maxRequests: MAX_REQUESTS_TIER_1,
  45. usersPerIpProspection: 20,
  46. },
  47. '/_api/login/testLdap': {
  48. method: 'POST',
  49. maxRequests: MAX_REQUESTS_TIER_2,
  50. usersPerIpProspection: 1,
  51. },
  52. '/_api/check_username': {
  53. method: 'GET',
  54. maxRequests: MAX_REQUESTS_TIER_3,
  55. },
  56. };
  57. // default config with reg exp
  58. export const defaultConfigWithRegExp = {
  59. '/forgot-password/.*': {
  60. method: 'ALL',
  61. maxRequests: MAX_REQUESTS_TIER_1,
  62. },
  63. '/user-activation/.*': {
  64. method: 'GET',
  65. maxRequests: MAX_REQUESTS_TIER_1,
  66. },
  67. '/attachment/[0-9a-z]{24}': {
  68. method: 'GET',
  69. maxRequests: MAX_REQUESTS_TIER_4,
  70. },
  71. '/download/[0-9a-z]{24}': {
  72. method: 'GET',
  73. maxRequests: MAX_REQUESTS_TIER_4,
  74. },
  75. '/share/[0-9a-z]{24}': {
  76. method: 'GET',
  77. maxRequests: MAX_REQUESTS_TIER_4,
  78. },
  79. };