Class: RubyRateLimiter::TokenBucket

Inherits:
Object
  • Object
show all
Extended by:
Forwardable
Defined in:
lib/ruby_rate_limiter/token_bucket.rb

Constant Summary collapse

DEFAULT_BUCKET_SIZE =
10
DEFAULT_REFILL_RATE =
1
DEFAULT_STORAGE =
RubyRateLimiter::Storage::RedisStorage.new
TIME_UNITS =
{
  second: 1,
  minute: 60,
  hour: 3600
}.freeze

Instance Method Summary collapse

Constructor Details

#initialize(user_identifier:, bucket_size: DEFAULT_BUCKET_SIZE, refill_rate: DEFAULT_REFILL_RATE, time_unit: :second, storage: DEFAULT_STORAGE) ⇒ TokenBucket

Returns a new instance of TokenBucket.



21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# File 'lib/ruby_rate_limiter/token_bucket.rb', line 21

def initialize(
  user_identifier:,
  bucket_size: DEFAULT_BUCKET_SIZE,
  refill_rate: DEFAULT_REFILL_RATE,
  time_unit: :second,
  storage: DEFAULT_STORAGE
)
  @user_id = user_identifier
  @bucket_size = bucket_size
  @refill_rate_per_second = refill_rate.to_f / TIME_UNITS[time_unit]
  @storage = storage

  @logger = Logger.new(STDOUT)
  @logger.level = Logger::DEBUG 
  initialize_bucket
end

Instance Method Details

#allow_request?Boolean

Returns:

  • (Boolean)


38
39
40
41
42
43
44
45
46
47
48
# File 'lib/ruby_rate_limiter/token_bucket.rb', line 38

def allow_request?
  refill_tokens
  tokens = get_bucket_size
  @logger.info "Allow request: tokens before = #{tokens}" 

  return false if tokens < 1

  update_bucket_size(tokens - 1)
  @logger.info "Allow request: tokens after = #{get_bucket_size}" 
  true
end