Current section
Files
Jump to
Current section
Files
lib/wobserver/web/client.ex
defmodule Wobserver.Web.Client do
@moduledoc ~S"""
Modules handles WebSocket connects to the client.
"""
use Wobserver.Web.ClientSocket
alias Wobserver.Allocator
alias Wobserver.Page
alias Wobserver.Table
alias Wobserver.System
alias Wobserver.Util.Application
alias Wobserver.Util.Process
alias Wobserver.Util.Node.Discovery
def client_opts do
{:ok, %{}}
end
@doc ~S"""
Starts the websocket client.
Returns a map as state.
"""
@spec client_init :: {:ok, map}
def client_init do
{:ok, %{}}
end
@doc ~S"""
Handles the `command` given by the websocket interface.
The current `state` is passed and can be modified.
Returns a map as state.
"""
@spec client_handle(atom | list(atom), state :: map) ::
{:reply, atom | list(atom), map, map}
| {:reply, atom | list(atom), map}
| {:noreply, map}
def client_handle(command, state)
def client_handle(:hello, state) do
{:reply, :ehlo, Discovery.local(), state}
end
def client_handle(:ping, state) do
{:reply, :pong, state}
end
def client_handle(:system, state) do
{:reply, :system, System.overview(), state}
end
def client_handle(:about, state) do
{:reply, :about, Wobserver.about(), state}
end
def client_handle(:application, state) do
{:reply, :application, Application.list(), state}
end
def client_handle([:application, app], state) do
{:reply, [:application, app], Application.info(app), state}
end
def client_handle(:process, state) do
{:reply, :process, Process.list(), state}
end
def client_handle([:process, process], state) do
data =
process
|> Atom.to_string()
|> Process.info()
{:reply, [:process, process], data, state}
end
def client_handle(:ports, state) do
{:reply, :ports, Wobserver.Port.list(), state}
end
def client_handle(:allocators, state) do
{:reply, :allocators, Allocator.list(), state}
end
def client_handle(:table, state) do
{:reply, :table, Table.list(), state}
end
def client_handle([:table, table], state) do
data =
table
|> Atom.to_string()
|> Table.sanitize()
|> Table.info(true)
{:reply, [:table, table], data, state}
end
def client_handle(:custom, state) do
{:reply, :custom, Page.list(), state}
end
def client_handle(custom, state) do
case Page.call(custom) do
:page_not_found -> {:noreply, state}
data -> {:reply, custom, data, state}
end
end
@doc ~S"""
Handles process messages.
Should not be used, the `do` is ignored and the `state` is returned unmodified.
"""
@spec client_info(any, state :: map) :: {:noreply, map}
def client_info(_do, state) do
{:noreply, state}
end
@doc false
@spec handle(:cowboy_req.req(), any) :: {:ok, :cowboy_req.req(), any}
def handle(req, state), do: {:ok, req, state}
end