Class: RobustServerSocket::RateLimiter

Inherits:
Object
  • Object
show all
Defined in:
lib/robust_server_socket/rate_limiter.rb

Constant Summary collapse

RateLimitExceeded =
Class.new(StandardError)

Class Method Summary collapse

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