summaryrefslogtreecommitdiff
path: root/lib/pleroma/plugs/rate_limiter/limiter_supervisor.ex
blob: 884268d96249572784d3b0458fa6f7fc43feb28e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
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