82 lines
1.8 KiB
Ruby
82 lines
1.8 KiB
Ruby
module Carto
|
|
class RateLimitValues
|
|
extend Forwardable
|
|
delegate [:<<,
|
|
:[],
|
|
:[]=,
|
|
:all,
|
|
:clear,
|
|
:each,
|
|
:empty?,
|
|
:flat_map,
|
|
:first,
|
|
:length,
|
|
:pop,
|
|
:present?,
|
|
:push,
|
|
:second] => :@rate_limits
|
|
|
|
VALUES_PER_RATE_LIMIT = 3
|
|
|
|
def initialize(values)
|
|
@rate_limits = []
|
|
values = convert_from_db_array(values)
|
|
|
|
values.each_slice(VALUES_PER_RATE_LIMIT) do |slice|
|
|
push(RateLimitValue.new(slice))
|
|
end
|
|
end
|
|
|
|
def to_array
|
|
flat_map(&:to_array)
|
|
end
|
|
|
|
def ==(other)
|
|
other.class == self.class && to_array == other.try(:to_array)
|
|
end
|
|
|
|
def to_redis_array
|
|
RateLimitValues.dump(self)
|
|
end
|
|
|
|
def self.dump(rate_limit_values)
|
|
return [] if rate_limit_values.nil?
|
|
|
|
rate_limit_values.flat_map(&:to_array)
|
|
end
|
|
|
|
def self.load(values)
|
|
RateLimitValues.new(values)
|
|
end
|
|
|
|
private
|
|
|
|
def convert_from_db_array(values)
|
|
return [] if values.nil? || values.empty?
|
|
return values.delete('{}').split(',') if values.is_a? String
|
|
values
|
|
end
|
|
end
|
|
|
|
class RateLimitValue
|
|
attr_accessor :max_burst, :count_per_period, :period
|
|
|
|
def initialize(values)
|
|
@values = values
|
|
self.max_burst, self.count_per_period, self.period = values.map(&:to_i) if valid?
|
|
end
|
|
|
|
def valid?
|
|
values_per_rate_limit = Carto::RateLimitValues::VALUES_PER_RATE_LIMIT
|
|
if !@values || @values.length < values_per_rate_limit && @values.length % values_per_rate_limit != 0
|
|
raise 'Error: Number of rate limits needs to be multiple of three'
|
|
end
|
|
true
|
|
end
|
|
|
|
def to_array
|
|
[max_burst, count_per_period, period]
|
|
end
|
|
end
|
|
end
|