limiter_supervisor.ex (1142B)
- defmodule Pleroma.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