Current section
Files
Jump to
Current section
Files
src/telega@internal@rate_limiter.erl
-module(telega@internal@rate_limiter).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/telega/internal/rate_limiter.gleam").
-export([new/2, hit/2]).
-export_type([ets_table/0, rate_limiter/0]).
-if(?OTP_RELEASE >= 27).
-define(MODULEDOC(Str), -moduledoc(Str)).
-define(DOC(Str), -doc(Str)).
-else.
-define(MODULEDOC(Str), -compile([])).
-define(DOC(Str), -compile([])).
-endif.
?MODULEDOC(false).
-type ets_table() :: any().
-opaque rate_limiter() :: {rate_limiter, ets_table(), integer(), integer()}.
-file("src/telega/internal/rate_limiter.gleam", 22).
?DOC(false).
-spec new(integer(), integer()) -> rate_limiter().
new(Limit, Window_ms) ->
Table = ets:new(
erlang:binary_to_atom(<<"telega_rate_limiter"/utf8>>),
[erlang:binary_to_atom(<<"set"/utf8>>),
erlang:binary_to_atom(<<"public"/utf8>>)]
),
{rate_limiter, Table, Limit, Window_ms}.
-file("src/telega/internal/rate_limiter.gleam", 32).
?DOC(false).
-spec hit(rate_limiter(), binary()) -> boolean().
hit(Limiter, Key) ->
{rate_limiter, Table, Limit, Window_ms} = Limiter,
Now = telega@internal@utils:current_time_ms(),
case ets:lookup(Table, Key) of
[{_, Count, Window_started_at} | _] when (Now - Window_started_at) < Window_ms ->
case Count < Limit of
true ->
ets:insert(Table, {Key, Count + 1, Window_started_at}),
true;
false ->
false
end;
_ ->
ets:insert(Table, {Key, 1, Now}),
true
end.