rate_limiter.hpp 595 B

1234567891011121314151617181920
  1. #pragma once
  2. #include <cstdint>
  3. #include <functional>
  4. #include <mutex>
  5. #include <string>
  6. #include <unordered_map>
  7. namespace svapi {
  8. class RateLimiter {
  9. public:
  10. RateLimiter();
  11. bool allow(const std::string& keyId, uint32_t limitPerMin); // true if under limit; 0 = unlimited
  12. void setClockForTesting(std::function<int64_t()> fn);
  13. private:
  14. struct Window { int64_t minute = -1; uint32_t count = 0; };
  15. std::unordered_map<std::string, Window> windows_;
  16. std::function<int64_t()> now_; // epoch seconds
  17. std::mutex mu_;
  18. };
  19. RateLimiter& rateLimiter(); // process singleton
  20. }