forked from mirrors/akkoma
34 lines
905 B
Elixir
34 lines
905 B
Elixir
|
defmodule Pleroma.Web.Streamer.Ping do
|
||
|
use GenServer
|
||
|
require Logger
|
||
|
|
||
|
alias Pleroma.Web.Streamer.State
|
||
|
alias Pleroma.Web.Streamer.StreamerSocket
|
||
|
|
||
|
@keepalive_interval :timer.seconds(30)
|
||
|
|
||
|
def start_link(opts) do
|
||
|
ping_interval = Keyword.get(opts, :ping_interval, @keepalive_interval)
|
||
|
GenServer.start_link(__MODULE__, %{ping_interval: ping_interval}, name: __MODULE__)
|
||
|
end
|
||
|
|
||
|
def init(%{ping_interval: ping_interval} = args) do
|
||
|
Process.send_after(self(), :ping, ping_interval)
|
||
|
{:ok, args}
|
||
|
end
|
||
|
|
||
|
def handle_info(:ping, %{ping_interval: ping_interval} = state) do
|
||
|
State.get_sockets()
|
||
|
|> Map.values()
|
||
|
|> List.flatten()
|
||
|
|> Enum.each(fn %StreamerSocket{transport_pid: transport_pid} ->
|
||
|
Logger.debug("Sending keepalive ping")
|
||
|
send(transport_pid, {:text, ""})
|
||
|
end)
|
||
|
|
||
|
Process.send_after(self(), :ping, ping_interval)
|
||
|
|
||
|
{:noreply, state}
|
||
|
end
|
||
|
end
|