logo

pleroma

My custom branche(s) on git.pleroma.social/pleroma/pleroma

limiter_supervisor.ex (1142B)


  1. defmodule Pleroma.Plugs.RateLimiter.LimiterSupervisor do
  2. use DynamicSupervisor
  3. import Cachex.Spec
  4. def start_link(init_arg) do
  5. DynamicSupervisor.start_link(__MODULE__, init_arg, name: __MODULE__)
  6. end
  7. def add_or_return_limiter(limiter_name, expiration) do
  8. result =
  9. DynamicSupervisor.start_child(
  10. __MODULE__,
  11. %{
  12. id: String.to_atom("rl_#{limiter_name}"),
  13. start:
  14. {Cachex, :start_link,
  15. [
  16. limiter_name,
  17. [
  18. expiration:
  19. expiration(
  20. default: expiration,
  21. interval: check_interval(expiration),
  22. lazy: true
  23. )
  24. ]
  25. ]}
  26. }
  27. )
  28. case result do
  29. {:ok, _pid} = result -> result
  30. {:error, {:already_started, pid}} -> {:ok, pid}
  31. _ -> result
  32. end
  33. end
  34. @impl true
  35. def init(_init_arg) do
  36. DynamicSupervisor.init(strategy: :one_for_one)
  37. end
  38. defp check_interval(exp) do
  39. (exp / 2)
  40. |> Kernel.trunc()
  41. |> Kernel.min(5000)
  42. |> Kernel.max(1)
  43. end
  44. end