ruby_rate_limiter 2.0.2 → 2.0.3
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 +4 -4
- data/README.md +30 -24
- data/lib/ruby_rate_limiter/token_bucket.rb +13 -2
- data/lib/ruby_rate_limiter/version.rb +1 -1
- data/lib/ruby_rate_limiter.rb +0 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b60324c24d3fc51e14f066637e25ff4ac9b4ada858e58847faf3038412071228
|
4
|
+
data.tar.gz: f93cf75cb76aa970caa2d09c49899ebbb13a637fad485d4bf8e4e804a0af6ff4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: eeeaca8c796fd0431016764af4c6c6d7a4535bbac91a93d616fa7e4dbc196d21b13667fa5e1f612d0226b47431925dad7b7dbc642e7312122123d56a4a971ed7
|
7
|
+
data.tar.gz: 6d18b90e23f0b6b0597cd27a62b3ce7e05c8d5aa01fce90c00d6a96df939bf9d2b7fbc63496343bb3382a84760a71d4a0c44ad8eb59fd85e22feaf168f5e6aa3
|
data/README.md
CHANGED
@@ -44,57 +44,63 @@ require 'ruby_rate_limiter'
|
|
44
44
|
require 'redis'
|
45
45
|
|
46
46
|
module RateLimiter
|
47
|
-
|
48
|
-
|
49
|
-
|
47
|
+
DEFAULT_BUCKET_SIZE = 10
|
48
|
+
DEFAULT_REFILL_RATE = 1
|
49
|
+
DEFAULT_TIME_UNIT = :minute
|
50
|
+
|
51
|
+
def self.for(user_identifier:, bucket_size: DEFAULT_BUCKET_SIZE, refill_rate: DEFAULT_REFILL_RATE, time_unit: DEFAULT_TIME_UNIT)
|
52
|
+
RubyRateLimiter::TokenBucket.new(
|
53
|
+
user_identifier: user_identifier,
|
50
54
|
storage: RubyRateLimiter::Storage::RedisStorage.new(redis_client),
|
51
|
-
bucket_size:
|
52
|
-
refill_rate:
|
55
|
+
bucket_size: bucket_size,
|
56
|
+
refill_rate: refill_rate,
|
57
|
+
time_unit: time_unit
|
53
58
|
)
|
54
59
|
end
|
55
60
|
|
56
61
|
private
|
57
62
|
|
58
63
|
def self.redis_client
|
59
|
-
@redis_client ||= Redis.new(url: '
|
64
|
+
@redis_client ||= Redis.new(url: ENV['REDIS_URL'])
|
60
65
|
end
|
61
66
|
end
|
62
67
|
|
68
|
+
|
69
|
+
|
63
70
|
```
|
64
71
|
|
65
72
|
### Usage somewhere, in the controller or better still in a service
|
66
73
|
|
74
|
+
Maybe have some service
|
75
|
+
|
67
76
|
```ruby
|
68
|
-
class
|
69
|
-
def
|
70
|
-
|
71
|
-
|
72
|
-
render json: { message: 'Request processed' }
|
73
|
-
else
|
74
|
-
# Rate limit exceeded
|
75
|
-
render status: 429, json: { error: 'Too many requests' }
|
76
|
-
end
|
77
|
+
class RateLimiterService
|
78
|
+
def self.rate_limit_exceeded?(user_identifier)
|
79
|
+
rate_limiter = RateLimiter.for(user_identifier: user_identifier)
|
80
|
+
!rate_limiter.allow_request?
|
77
81
|
end
|
78
82
|
end
|
83
|
+
|
79
84
|
```
|
80
85
|
|
86
|
+
Usage in the controller
|
87
|
+
|
81
88
|
```ruby
|
82
|
-
class
|
83
|
-
def
|
84
|
-
|
85
|
-
|
86
|
-
|
89
|
+
class SomeController < ApplicationController
|
90
|
+
def some_action
|
91
|
+
user_identifier = current_user ? "user:#{current_user.id}" : "ip:#{request.remote_ip}"
|
92
|
+
if RateLimiterService.rate_limit_exceeded?(user_identifier)
|
93
|
+
render status: 429, json: { error: 'Too many requests' }
|
87
94
|
else
|
88
|
-
#
|
89
|
-
|
95
|
+
# Process the request
|
96
|
+
render json: { message: 'Request processed' }
|
90
97
|
end
|
91
98
|
end
|
92
99
|
end
|
93
100
|
|
94
|
-
```
|
95
|
-
|
96
101
|
Contributing
|
97
102
|
Bug reports and pull requests are welcome on GitHub at https://github.com/Mutuba/ruby-rate-limiter.
|
98
103
|
|
99
104
|
License
|
100
105
|
The gem is available as open source under the terms of the MIT License.
|
106
|
+
```
|
@@ -34,28 +34,36 @@ module RubyRateLimiter
|
|
34
34
|
def allow_request?
|
35
35
|
refill_tokens
|
36
36
|
tokens = get_bucket_size
|
37
|
+
puts "Allow request: tokens before = #{tokens}" # Debugging line
|
37
38
|
return false if tokens < 1
|
38
39
|
|
39
40
|
update_bucket_size(tokens - 1)
|
41
|
+
puts "Allow request: tokens after = #{get_bucket_size}" # Debugging line
|
40
42
|
true
|
41
43
|
end
|
42
44
|
|
43
45
|
private
|
44
46
|
|
45
47
|
def get_bucket_size
|
46
|
-
(@storage.get("#{@user_id}_tokens") || @bucket_size).to_i
|
48
|
+
size = (@storage.get("#{@user_id}_tokens") || @bucket_size).to_i
|
49
|
+
puts "get_bucket_size: #{@user_id}_tokens = #{size}"
|
50
|
+
size
|
47
51
|
end
|
48
52
|
|
49
53
|
def get_last_refill_time
|
50
|
-
(@storage.get("#{@user_id}_last_refill") || Time.now.to_f).to_f
|
54
|
+
time = (@storage.get("#{@user_id}_last_refill") || Time.now.to_f).to_f
|
55
|
+
puts "get_last_refill_time: #{@user_id}_last_refill = #{time}"
|
56
|
+
time
|
51
57
|
end
|
52
58
|
|
53
59
|
def update_bucket_size(tokens)
|
60
|
+
puts "update_bucket_size: #{@user_id}_tokens = #{tokens}"
|
54
61
|
@storage.set("#{@user_id}_tokens", tokens)
|
55
62
|
end
|
56
63
|
|
57
64
|
def update_last_refill_time(timestamp)
|
58
65
|
@storage.set("#{@user_id}_last_refill", timestamp)
|
66
|
+
puts "update_last_refill_time: #{@user_id}_last_refill = #{timestamp}"
|
59
67
|
end
|
60
68
|
|
61
69
|
def refill_tokens
|
@@ -64,11 +72,14 @@ module RubyRateLimiter
|
|
64
72
|
elapsed_time = current_time - last_refill_time
|
65
73
|
|
66
74
|
new_tokens = (elapsed_time * @refill_rate_per_second).to_i
|
75
|
+
puts "Refill tokens: elapsed_time = #{elapsed_time}, new_tokens = #{new_tokens}" # Debugging line
|
76
|
+
|
67
77
|
return if new_tokens <= 0
|
68
78
|
|
69
79
|
tokens = [get_bucket_size + new_tokens, @bucket_size].min
|
70
80
|
update_bucket_size(tokens)
|
71
81
|
update_last_refill_time(current_time)
|
82
|
+
puts "Refill tokens: updated tokens = #{tokens}, current_time = #{current_time}" # Debugging line
|
72
83
|
end
|
73
84
|
end
|
74
85
|
end
|
data/lib/ruby_rate_limiter.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby_rate_limiter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.
|
4
|
+
version: 2.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mutuba
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-07-
|
11
|
+
date: 2024-07-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: redis
|