Class: RubyReactor::RateLimitRegistry

Inherits:
Object
  • Object
show all
Defined in:
lib/ruby_reactor/rate_limit_registry.rb

Overview

Global registry of named rate limits, configured once via ‘RubyReactor.configure`. Lets multiple reactors share a single quota for an external service (e.g. all Stripe-calling reactors throttle against one `:stripe` bucket).

Examples:

RubyReactor.configure do |config|
  config.rate_limits.register(:stripe, limit: 3, period: :second)
  config.rate_limits.register(:twilio, limits: { second: 10, minute: 100 })
end

class ChargeReactor < RubyReactor::Reactor
  with_rate_limit(:stripe)
end

Defined Under Namespace

Classes: UnknownLimitError

Instance Method Summary collapse

Constructor Details

#initializeRateLimitRegistry

Returns a new instance of RateLimitRegistry.



24
25
26
# File 'lib/ruby_reactor/rate_limit_registry.rb', line 24

def initialize
  @limits = {}
end

Instance Method Details

#fetch(name) ⇒ Object

Return the normalized spec array for a registered name, or raise if the name was never registered (resolved lazily at execute time, so the error surfaces with a clear message instead of a nil dereference).



40
41
42
43
44
45
# File 'lib/ruby_reactor/rate_limit_registry.rb', line 40

def fetch(name)
  @limits.fetch(name.to_sym) do
    raise UnknownLimitError, "Unknown rate limit #{name.inspect}. " \
                             "Register it with config.rate_limits.register(#{name.inspect}, ...)."
  end
end

#register(name, limit: nil, period: nil, limits: nil) ⇒ Object

Register a named rate limit. Same window args as the inline DSL form: a single window (‘limit:` + `period:`) or layered windows (`limits:`).



30
31
32
33
34
35
# File 'lib/ruby_reactor/rate_limit_registry.rb', line 30

def register(name, limit: nil, period: nil, limits: nil)
  @limits[name.to_sym] = RubyReactor::RateLimit.normalize_specs(
    limit: limit, period: period, limits: limits
  )
  self
end

#registered?(name) ⇒ Boolean

Returns:

  • (Boolean)


47
48
49
# File 'lib/ruby_reactor/rate_limit_registry.rb', line 47

def registered?(name)
  @limits.key?(name.to_sym)
end