class Berater::RateLimiter

Constants

LUA_SCRIPT

Public Class Methods

new(key, capacity, interval, **opts) click to toggle source
Calls superclass method Berater::Limiter::new
# File lib/berater/rate_limiter.rb, line 4
def initialize(key, capacity, interval, **opts)
  super(key, capacity, interval, **opts)
  self.interval = interval
end

Public Instance Methods

interval() click to toggle source
# File lib/berater/rate_limiter.rb, line 9
def interval
  args[0]
end
to_s() click to toggle source
# File lib/berater/rate_limiter.rb, line 91
def to_s
  msg = if interval.is_a? Numeric
    if interval == 1
      "every second"
    else
      "every #{interval} seconds"
    end
  else
    "per #{interval}"
  end

  "#<#{self.class}(#{key}: #{capacity} #{msg})>"
end

Protected Instance Methods

acquire_lock(capacity, cost) click to toggle source
# File lib/berater/rate_limiter.rb, line 74
          def acquire_lock(capacity, cost)
  # timestamp in milliseconds
  ts = (Time.now.to_f * 10**3).to_i

  count, allowed = LUA_SCRIPT.eval(
    redis,
    [ cache_key ],
    [ ts, capacity, @interval, cost ]
  )

  count = count.include?('.') ? count.to_f : count.to_i

  raise Overloaded unless allowed

  Lock.new(capacity, count)
end

Private Instance Methods

interval=(interval) click to toggle source
# File lib/berater/rate_limiter.rb, line 13
        def interval=(interval)
  @interval = Berater::Utils.to_msec(interval)

  unless @interval > 0
    raise ArgumentError, 'interval must be > 0'
  end
end