summaryrefslogtreecommitdiff
path: root/lib/web/controllers/icecast_see_controller.ex
diff options
context:
space:
mode:
authorJordan Bracco <href@random.sh>2022-12-20 02:19:42 +0000
committerJordan Bracco <href@random.sh>2022-12-20 19:29:41 +0100
commit9958e90eb5eb5a2cc171c40860745e95a96bd429 (patch)
treeb49cdb1d0041b9c0a81a14950d38c0203896f527 /lib/web/controllers/icecast_see_controller.ex
parentRename 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.ex41
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