rate_limiter.cpp 808 B

123456789101112131415161718192021
  1. #include "rate_limiter.hpp"
  2. #include <chrono>
  3. namespace svapi {
  4. RateLimiter::RateLimiter()
  5. : now_([]{ return std::chrono::duration_cast<std::chrono::seconds>(
  6. std::chrono::system_clock::now().time_since_epoch()).count(); }) {}
  7. bool RateLimiter::allow(const std::string& keyId, uint32_t limitPerMin) {
  8. if (limitPerMin == 0) return true;
  9. std::lock_guard<std::mutex> lk(mu_);
  10. int64_t minute = now_() / 60;
  11. auto& w = windows_[keyId];
  12. if (w.minute != minute) { w.minute = minute; w.count = 0; }
  13. if (w.count >= limitPerMin) return false;
  14. ++w.count;
  15. return true;
  16. }
  17. void RateLimiter::setClockForTesting(std::function<int64_t()> fn) {
  18. std::lock_guard<std::mutex> lk(mu_); now_ = std::move(fn);
  19. }
  20. RateLimiter& rateLimiter() { static RateLimiter inst; return inst; }
  21. }