55 lines
1.3 KiB
Elixir
55 lines
1.3 KiB
Elixir
# Pleroma: A lightweight social networking server
|
|
# Copyright © 2017-2022 Pleroma Authors <https://pleroma.social/>
|
|
# SPDX-License-Identifier: AGPL-3.0-only
|
|
|
|
defmodule Pleroma.Web.Plugs.RateLimiter.LimiterSupervisor do
|
|
use DynamicSupervisor
|
|
|
|
import Cachex.Spec
|
|
|
|
def start_link(init_arg) do
|
|
DynamicSupervisor.start_link(__MODULE__, init_arg, name: __MODULE__)
|
|
end
|
|
|
|
def add_or_return_limiter(limiter_name, expiration) do
|
|
result =
|
|
DynamicSupervisor.start_child(
|
|
__MODULE__,
|
|
%{
|
|
id: String.to_atom("rl_#{limiter_name}"),
|
|
start:
|
|
{Cachex, :start_link,
|
|
[
|
|
limiter_name,
|
|
[
|
|
expiration:
|
|
expiration(
|
|
default: expiration,
|
|
interval: check_interval(expiration),
|
|
lazy: true
|
|
)
|
|
]
|
|
]}
|
|
}
|
|
)
|
|
|
|
case result do
|
|
{:ok, _pid} = result -> result
|
|
{:error, {:already_started, pid}} -> {:ok, pid}
|
|
_ -> result
|
|
end
|
|
end
|
|
|
|
@impl true
|
|
def init(_init_arg) do
|
|
DynamicSupervisor.init(strategy: :one_for_one)
|
|
end
|
|
|
|
defp check_interval(exp) do
|
|
(exp / 2)
|
|
|> Kernel.trunc()
|
|
|> Kernel.min(5000)
|
|
|> Kernel.max(1)
|
|
end
|
|
end
|