ping.ex (1064B)
1 # Pleroma: A lightweight social networking server 2 # Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/> 3 # SPDX-License-Identifier: AGPL-3.0-only 4 5 defmodule Pleroma.Web.Streamer.Ping do 6 use GenServer 7 require Logger 8 9 alias Pleroma.Web.Streamer.State 10 alias Pleroma.Web.Streamer.StreamerSocket 11 12 @keepalive_interval :timer.seconds(30) 13 14 def start_link(opts) do 15 ping_interval = Keyword.get(opts, :ping_interval, @keepalive_interval) 16 GenServer.start_link(__MODULE__, %{ping_interval: ping_interval}, name: __MODULE__) 17 end 18 19 def init(%{ping_interval: ping_interval} = args) do 20 Process.send_after(self(), :ping, ping_interval) 21 {:ok, args} 22 end 23 24 def handle_info(:ping, %{ping_interval: ping_interval} = state) do 25 State.get_sockets() 26 |> Map.values() 27 |> List.flatten() 28 |> Enum.each(fn %StreamerSocket{transport_pid: transport_pid} -> 29 Logger.debug("Sending keepalive ping") 30 send(transport_pid, {:text, ""}) 31 end) 32 33 Process.send_after(self(), :ping, ping_interval) 34 35 {:noreply, state} 36 end 37 end