defmodule Phoenix.LiveDashboard.SocketInfoComponent do
use Phoenix.LiveDashboard.Web, :live_component
alias Phoenix.LiveDashboard.SystemInfo
@info_keys [
:module,
:send_oct,
:recv_oct,
:local_address,
:foreign_address,
:state,
:type,
:connected
]
@impl true
def render(assigns) do
~L"""
<%= if @alive do %>
| Module | <%= @module %> |
| Sent | <%= @send_oct %> |
| Received | <%= @recv_oct %> |
| Local Address | <%= @local_address %> |
| Foreign Address | <%= @foreign_address %> |
| State | <%= @state %> |
| Type | <%= @type %> |
| Owner | <%= @connected %> |
<% else %>
Port was closed or does not exist.
<% end %>
"""
end
@impl true
def mount(socket) do
{:ok, Enum.reduce(@info_keys, socket, &assign(&2, &1, nil))}
end
@impl true
def update(%{port: port} = assigns, socket) do
{:ok,
socket
|> assign(assigns)
|> assign(port: port)
|> assign_info()}
end
defp assign_info(%{assigns: assigns} = socket) do
case SystemInfo.fetch_socket_info(assigns.port, @info_keys) do
:error ->
assign(socket, alive: false)
{:ok, info} ->
Enum.reduce(info, socket, fn {key, val}, acc ->
assign(acc, key, format_info(key, val, assigns.live_dashboard_path))
end)
|> assign(alive: true)
end
end
defp format_info(key, val, _live_dashboard_path)
when key in [:send_oct, :recv_oct],
do: format_bytes(val)
defp format_info(key, val, live_dashboard_path)
when key in [:connected, :port],
do: format_value(val, live_dashboard_path)
defp format_info(key, val, _live_dashboard_path)
when key in [:module, :local_address, :foreign_address, :state, :type],
do: val
end