Packages

What if GitHub gists, AWS Lambdas and Elixir Plugs had a baby?

Current section

Files

Jump to
vik lib vik_web system_handler.ex
Raw

lib/vik_web/system_handler.ex

defmodule VikWeb.SystemHandler do
@moduledoc false
use VikWeb, :live_hook
alias Vik.System
import Structo
@interval :timer.seconds(1)
def on_mount(type, _params, session, socket) do
if connected?(socket) do
:net_kernel.monitor_nodes(true, node_type: :all)
if type == :realtime do
Process.send_after(self(), :refresh, @interval)
end
end
{:cont, socket
|> assign_node(session)
|> assign_system_info()
|> attach_hook(:refresh, :handle_info, &handle_info/2)}
end
def handle_info(:refresh, socket) do
Process.send_after(self(), :refresh, @interval)
{:halt, assign_system_info(socket)}
end
def handle_info(_message, socket) do
{:cont, socket}
end
defp assign_node(socket, session) do
socket
|> assign(:node, find_node(session))
|> assign(:nodes, System.nodes())
end
defp assign_system_info(socket) do
~m{versions, system_info, system_usage, system_limits} =
System.fetch_system_info(socket.assigns.node)
socket
|> assign(:versions, versions)
|> assign(:info, system_info)
|> assign(:limits, system_limits)
|> assign(:usage, system_usage)
end
defp find_node(session) do
if node = session["node"] do
Enum.find(System.nodes(), &(Atom.to_string(&1) == node))
else
node()
end
end
end