Files
elixir-websocket-testing/backend/lib/backend_web/channels/cluster_status_channel.ex

57 lines
1.4 KiB
Elixir

defmodule BackendWeb.ClusterStatusChannel do
@moduledoc """
Channel for cluster status information
"""
use BackendWeb, :channel
require Logger
@impl true
def join("cluster_status", _params, socket) do
Logger.info("Client joined clusterstatus channel")
:net_kernel.monitor_nodes(true)
{:ok, %{status: "connected"}, socket}
end
@impl true
def handle_in("get_nodes", _payload, socket) do
send_node_list(socket)
{:noreply, socket}
end
@impl true
def handle_in("kill_node", %{"node" => node_to_kill}, socket) do
Logger.warning("Client requested to kill node: #{node_to_kill}")
Backend.Cluster.kill_node(node_to_kill)
{:noreply, socket}
end
@impl true
def handle_in(_event, _payload, socket) do
{:noreply, socket}
end
@impl true
def handle_info({:nodeup, node_name}, socket) do
Logger.info("Node up: #{node_name}, broadcasting updated node list")
send_node_list(socket)
{:noreply, socket}
end
@impl true
def handle_info({:nodedown, node_name}, socket) do
Logger.info("Node down: #{node_name}, broadcasting updated node list")
send_node_list(socket)
{:noreply, socket}
end
defp send_node_list(socket) do
game_pid = Backend.GameRunner.get_pid()
push(socket, "node_list", %{
other_nodes: Node.list(),
connected_node: node(),
game_node: node(game_pid)
})
end
end