From 2d83df8b32bff7f0028923bb5b64dc0b55f20d03 Mon Sep 17 00:00:00 2001 From: Jordan Bracco Date: Tue, 20 Dec 2022 00:21:54 +0000 Subject: Nola rename: The Big Move, Refs T77 --- lib/nola_web/controllers/icecast_see_controller.ex | 41 ++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 lib/nola_web/controllers/icecast_see_controller.ex (limited to 'lib/nola_web/controllers/icecast_see_controller.ex') diff --git a/lib/nola_web/controllers/icecast_see_controller.ex b/lib/nola_web/controllers/icecast_see_controller.ex new file mode 100644 index 0000000..877ad4e --- /dev/null +++ b/lib/nola_web/controllers/icecast_see_controller.ex @@ -0,0 +1,41 @@ +defmodule NolaWeb.IcecastSseController do + use NolaWeb, :controller + require Logger + + @ping_interval 20_000 + + def sse(conn, _params) do + conn + |> put_resp_header("X-Accel-Buffering", "no") + |> put_resp_header("content-type", "text/event-stream") + |> send_chunked(200) + |> subscribe + |> send_sse_message("ping", "ping") + |> send_sse_message("icecast", Nola.IcecastAgent.get) + |> sse_loop + end + + def subscribe(conn) do + :timer.send_interval(@ping_interval, {:event, :ping}) + {:ok, _} = Registry.register(Nola.BroadcastRegistry, "icecast", []) + conn + end + + def sse_loop(conn) do + {type, event} = receive do + {:event, :ping} -> {"ping", "ping"} + {:icecast, stats} -> {"icecast", stats} + end + + conn + |> send_sse_message(type, event) + |> sse_loop() + end + + defp send_sse_message(conn, type, data) do + json = Jason.encode!(%{type => data}) + {:ok, conn} = chunk(conn, "event: #{type}\ndata: #{json}\n\n") + conn + end + +end -- cgit v1.2.3