| 1234567891011121314151617181920 |
- #pragma once
- #include <cstdint>
- #include <functional>
- #include <mutex>
- #include <string>
- #include <unordered_map>
- namespace svapi {
- class RateLimiter {
- public:
- RateLimiter();
- bool allow(const std::string& keyId, uint32_t limitPerMin); // true if under limit; 0 = unlimited
- void setClockForTesting(std::function<int64_t()> fn);
- private:
- struct Window { int64_t minute = -1; uint32_t count = 0; };
- std::unordered_map<std::string, Window> windows_;
- std::function<int64_t()> now_; // epoch seconds
- std::mutex mu_;
- };
- RateLimiter& rateLimiter(); // process singleton
- }
|