Class: RobustServerSocket::RateLimiter
- Inherits:
-
Object
- Object
- RobustServerSocket::RateLimiter
- Defined in:
- lib/robust_server_socket/rate_limiter.rb
Constant Summary collapse
- RateLimitExceeded =
Class.new(StandardError)
Class Method Summary collapse
- .check(client_name) ⇒ Object
- .check!(client_name) ⇒ Object
- .current_attempts(client_name) ⇒ Object
- .reset!(client_name) ⇒ Object
Class Method Details
.check(client_name) ⇒ Object
17 18 19 20 21 22 23 24 25 26 |
# File 'lib/robust_server_socket/rate_limiter.rb', line 17 def check(client_name) return 0 unless rate_limit_enabled? key = rate_limit_key(client_name) attempts = increment_attempts(key) return false if attempts > max_requests attempts end |
.check!(client_name) ⇒ Object
8 9 10 11 12 13 14 15 |
# File 'lib/robust_server_socket/rate_limiter.rb', line 8 def check!(client_name) unless (attempts = check(client_name)) actual_attempts = current_attempts(client_name) raise RateLimitExceeded, "Rate limit exceeded for #{client_name}: #{actual_attempts}/#{max_requests} requests per #{window_seconds}s" end attempts end |
.current_attempts(client_name) ⇒ Object
28 29 30 31 32 33 |
# File 'lib/robust_server_socket/rate_limiter.rb', line 28 def current_attempts(client_name) return 0 unless rate_limit_enabled? key = rate_limit_key(client_name) SecureToken::Cacher.get(key).to_i end |
.reset!(client_name) ⇒ Object
35 36 37 38 39 40 41 42 43 |
# File 'lib/robust_server_socket/rate_limiter.rb', line 35 def reset!(client_name) key = rate_limit_key(client_name) SecureToken::Cacher.with_redis do |conn| conn.del(key) end rescue SecureToken::Cacher::RedisConnectionError => e handle_redis_error(e, 'reset') nil end |