congestion 0.0.3 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/.travis.yml +5 -1
- data/README.md +6 -0
- data/congestion.gemspec +1 -2
- data/lib/congestion/rate_limiter.rb +20 -9
- data/lib/congestion/version.rb +1 -1
- metadata +7 -22
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 74d38ac534e68ff635448423e59608ea399916f7932262dcaa22447a194ab9aa
|
4
|
+
data.tar.gz: 435974e094f5c37727c69aa80449776bbd7fd85ea71d54b35e9f3b0bad714f36
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bc94b2ca6204b54f2df7981250bb847fd8e618c4f3a2e9369e44a9f4e18eda6f8e9b5ab08ff7e603955765068401f7618cb247f5f61553a16b94d294c3e56346
|
7
|
+
data.tar.gz: c7b9073c138665cd1115a02a2c14f00ccc6074787b1311e732e43e3f34adc0f2c2f9082cb0b10baf59d750cad42c34af0b1cc612d9a7d9899915d4af1a49e5d2
|
data/.travis.yml
CHANGED
@@ -7,5 +7,9 @@ rvm:
|
|
7
7
|
- jruby-19mode
|
8
8
|
services:
|
9
9
|
- redis-server
|
10
|
-
jruby_before_script:
|
10
|
+
jruby_before_script:
|
11
11
|
- bundle exec jbundle install
|
12
|
+
addons:
|
13
|
+
code_climate:
|
14
|
+
repo_token:
|
15
|
+
secure: IRJtjJW5EFgmD8dVa/E338jrnsry1FuKRpz943HKUG0AT2b3PgSafm4DCIycnxCEtvwmTrh75ZNt/9jUQyEktO5NM4f2V2WqlL53wVJPiRwr7kyySbPSeZF6D8/1M95yTphmL6yJ2gLtuJA35lG+hTPq+VkMAQGGu5NcwNp6HkU=
|
data/README.md
CHANGED
@@ -3,9 +3,15 @@
|
|
3
3
|
[](https://travis-ci.org/parrish/Congestion)
|
4
4
|
[](https://codeclimate.com/github/parrish/Congestion)
|
5
5
|
[](https://codeclimate.com/github/parrish/Congestion)
|
6
|
+
[](http://badge.fury.io/rb/congestion)
|
6
7
|
|
7
8
|
A Redis rate limiter that provides both time-based limits and quantity-based limits based on [classdojo/rolling-rate-limiter](https://github.com/classdojo/rolling-rate-limiter).
|
8
9
|
|
10
|
+
## Middleware
|
11
|
+
|
12
|
+
- [Sidekiq-Congestion](https://github.com/parrish/Sidekiq-Congestion)
|
13
|
+
- [Rack-Congestion](https://github.com/parrish/Rack-Congestion)
|
14
|
+
|
9
15
|
## Installation
|
10
16
|
|
11
17
|
Add this line to your application's Gemfile:
|
data/congestion.gemspec
CHANGED
@@ -22,11 +22,10 @@ Gem::Specification.new do |spec|
|
|
22
22
|
spec.add_runtime_dependency 'redis', '>= 3.1'
|
23
23
|
spec.add_runtime_dependency 'connection_pool', '>= 2.0'
|
24
24
|
spec.add_development_dependency 'bundler', '>= 1.5'
|
25
|
-
spec.add_development_dependency 'rake', '
|
25
|
+
spec.add_development_dependency 'rake', '>= 12.3.3'
|
26
26
|
spec.add_development_dependency 'rspec', '~> 3.2'
|
27
27
|
spec.add_development_dependency 'rspec-its', '~> 1.2'
|
28
28
|
spec.add_development_dependency 'guard-rspec', '~> 4.5'
|
29
29
|
spec.add_development_dependency 'timecop', '~> 0.7'
|
30
30
|
spec.add_development_dependency 'pry'
|
31
|
-
spec.add_development_dependency 'codeclimate-test-reporter'
|
32
31
|
end
|
@@ -84,20 +84,31 @@ module Congestion
|
|
84
84
|
|
85
85
|
def add_request
|
86
86
|
unless options[:track_rejected]
|
87
|
-
redis.
|
87
|
+
add_request = redis.multi do |t|
|
88
|
+
t.zadd key, current_time, current_time # [0] - key added
|
89
|
+
t.ttl key # [1] - key ttl
|
90
|
+
end
|
91
|
+
# TTL is -1 if not set, https://redis.io/commands/ttl
|
92
|
+
if add_request[1] == -1
|
93
|
+
# ensure we set the expire TTL on the request key
|
94
|
+
# using the raw interval here after the 'get_requests' limit check
|
95
|
+
# should be close enough to the actual interval folks desire
|
96
|
+
redis.pexpire key, options[:interval]
|
97
|
+
end
|
88
98
|
end
|
89
99
|
end
|
90
100
|
|
91
101
|
def get_requests
|
92
102
|
@requests ||= redis.multi do |t|
|
93
|
-
t.zremrangebyscore key, 0, expired_at
|
94
|
-
t.zcount key, '-inf', '+inf'
|
95
|
-
t.zrange key, 0, 0
|
96
|
-
t.zrange key, -1, -1
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
103
|
+
t.zremrangebyscore key, 0, expired_at # [0] - clear old requests
|
104
|
+
t.zcount key, '-inf', '+inf' # [1] - number of requests
|
105
|
+
t.zrange key, 0, 0 # [2] - first request
|
106
|
+
t.zrange key, -1, -1 # [3] - last request
|
107
|
+
if options[:track_rejected]
|
108
|
+
t.zadd(key, current_time, current_time) # [4] - Add the request if tracking rejected
|
109
|
+
end
|
110
|
+
# ensure the TTL is set after we've added the key if tracking rejected
|
111
|
+
t.pexpire key, options[:interval] # [5] - expire request key
|
101
112
|
end
|
102
113
|
end
|
103
114
|
end
|
data/lib/congestion/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: congestion
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Michael Parrish
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-07-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: redis
|
@@ -56,16 +56,16 @@ dependencies:
|
|
56
56
|
name: rake
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- - "
|
59
|
+
- - ">="
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version:
|
61
|
+
version: 12.3.3
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- - "
|
66
|
+
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version:
|
68
|
+
version: 12.3.3
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: rspec
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -136,20 +136,6 @@ dependencies:
|
|
136
136
|
- - ">="
|
137
137
|
- !ruby/object:Gem::Version
|
138
138
|
version: '0'
|
139
|
-
- !ruby/object:Gem::Dependency
|
140
|
-
name: codeclimate-test-reporter
|
141
|
-
requirement: !ruby/object:Gem::Requirement
|
142
|
-
requirements:
|
143
|
-
- - ">="
|
144
|
-
- !ruby/object:Gem::Version
|
145
|
-
version: '0'
|
146
|
-
type: :development
|
147
|
-
prerelease: false
|
148
|
-
version_requirements: !ruby/object:Gem::Requirement
|
149
|
-
requirements:
|
150
|
-
- - ">="
|
151
|
-
- !ruby/object:Gem::Version
|
152
|
-
version: '0'
|
153
139
|
description: Redis rate limiter that provides both time-based limits and quantity-based
|
154
140
|
limits
|
155
141
|
email:
|
@@ -193,8 +179,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
193
179
|
- !ruby/object:Gem::Version
|
194
180
|
version: '0'
|
195
181
|
requirements: []
|
196
|
-
|
197
|
-
rubygems_version: 2.4.6
|
182
|
+
rubygems_version: 3.0.6
|
198
183
|
signing_key:
|
199
184
|
specification_version: 4
|
200
185
|
summary: Redis rate limiter
|