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
16 17 18 19 20 21 22 23 |
# File 'lib/robust_server_socket/rate_limiter.rb', line 16 def check(client_name) key = rate_limit_key(client_name) attempts = increment_attempts(key) return false if attempts > max_requests attempts end |
.check!(client_name) ⇒ Object
6 7 8 9 10 11 12 13 14 |
# File 'lib/robust_server_socket/rate_limiter.rb', line 6 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
25 26 27 28 |
# File 'lib/robust_server_socket/rate_limiter.rb', line 25 def current_attempts(client_name) key = rate_limit_key(client_name) Cacher.get(key).to_i end |
.reset!(client_name) ⇒ Object
30 31 32 33 34 35 36 37 38 |
# File 'lib/robust_server_socket/rate_limiter.rb', line 30 def reset!(client_name) key = rate_limit_key(client_name) Cacher.with_redis do |conn| conn.del(key) end rescue Cacher::RedisConnectionError => e handle_redis_error(e, 'reset') nil end |