]> git.openstreetmap.org Git - rails.git/blob - lib/rate_limiter.rb
Merge remote-tracking branch 'upstream/pull/4356'
[rails.git] / lib / rate_limiter.rb
1 class RateLimiter
2   def initialize(cache, interval, limit, max_burst)
3     @cache = cache
4     @requests_per_second = limit.to_f / interval
5     @burst_limit = max_burst
6   end
7
8   def allow?(key)
9     last_update, requests = @cache.get(key)
10
11     if last_update
12       elapsed = Time.now.to_i - last_update
13
14       requests -= elapsed * @requests_per_second
15     else
16       requests = 0.0
17     end
18
19     requests < @burst_limit
20   end
21
22   def update(key)
23     now = Time.now.to_i
24
25     last_update, requests = @cache.get(key)
26
27     if last_update
28       elapsed = now - last_update
29
30       requests -= elapsed * @requests_per_second
31       requests += 1.0
32     else
33       requests = 1.0
34     end
35
36     @cache.set(key, [now, [requests, 1.0].max])
37   end
38 end