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



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