# frozen_string_literal: true

##
# Middleware responsible for implementing
# rate limiting
class RateLimiterMiddleware
  attr_reader :window_size, :max_requests

  def initialize(window_size, max_requests)
    @window_size = window_size
    @max_requests = max_requests
    @client_timestamps = Hash.new { |key, value| key[value] = [] }
    @mutex = Mutex.new
  end

  def allow?(client_id)
    @mutex.synchronize do
      now = Time.now.to_i
      timestamps = @client_timestamps[client_id]

      timestamps.reject! { |timestamp| timestamp <= now - window_size }

      if timestamps.length < max_requests
        timestamps << now
        true
      else
        false
      end
    end
  end
end