Current section
Files
Jump to
Current section
Files
lib/rate_limiter_man.ex
defmodule RateLimiterMan do
@moduledoc """
A rate limiter implementation, based heavily on a blog post by [Alex
Koutmous](https://akoutmos.com/post/rate-limiting-with-genservers/).
This package handles logic for limiting the rate at which HTTP requests are sent.
> #### TODO {: .warning}
>
> Add more documentation.
"""
@type response_handler :: tuple() | :no_response_handler
@callback make_request(atom(), tuple(), response_handler(), keyword()) :: :ok
def make_request(api_provider, request_handler, response_handler, opts \\ []) do
get_rate_limiter(api_provider).make_request(request_handler, response_handler, opts)
end
def skip_response_handler(res), do: fn -> res end
def get_rate_limiter(api_provider),
do: get_rate_limiter_config(api_provider, :rate_limiter)
def get_max_requests_per_second(api_provider),
do: get_rate_limiter_config(api_provider, :rate_limiter_max_requests_per_second)
def calculate_refresh_rate(max_requests_per_second),
do: floor(:timer.seconds(1) / max_requests_per_second)
defp get_rate_limiter_config(api_provider, config_key) do
api_provider_config = Application.fetch_env!(:resort_indexer, api_provider)
Keyword.fetch!(api_provider_config, config_key)
end
end