diff options
| author | Jordan Bracco <href@random.sh> | 2022-12-20 02:19:42 +0000 |
|---|---|---|
| committer | Jordan Bracco <href@random.sh> | 2022-12-20 19:29:41 +0100 |
| commit | 9958e90eb5eb5a2cc171c40860745e95a96bd429 (patch) | |
| tree | b49cdb1d0041b9c0a81a14950d38c0203896f527 /lib/web/controllers/icecast_see_controller.ex | |
| parent | Rename to Nola (diff) | |
Actually do not prefix folders with nola_ refs T77
Diffstat (limited to 'lib/web/controllers/icecast_see_controller.ex')
| -rw-r--r-- | lib/web/controllers/icecast_see_controller.ex | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/lib/web/controllers/icecast_see_controller.ex b/lib/web/controllers/icecast_see_controller.ex new file mode 100644 index 0000000..877ad4e --- /dev/null +++ b/lib/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 |
