Some work has been done on making the Connection feel nicer, but also more work is needed to not have the channel be exposed to the upper layers of the application. We should wrap all the GRPC calls in the GenServer (which may also allow caching on certain calls such as get_sys_info)
		
			
				
	
	
		
			87 lines
		
	
	
	
		
			2.2 KiB
		
	
	
	
		
			Elixir
		
	
	
	
	
	
			
		
		
	
	
			87 lines
		
	
	
	
		
			2.2 KiB
		
	
	
	
		
			Elixir
		
	
	
	
	
	
| defmodule PrymnWeb.ServerLive.Index do
 | |
|   require Logger
 | |
| 
 | |
|   alias Prymn.{Servers, Agents}
 | |
| 
 | |
|   use PrymnWeb, :live_view
 | |
| 
 | |
|   @impl true
 | |
|   def mount(_params, _session, socket) do
 | |
|     servers = Servers.list_servers()
 | |
| 
 | |
|     healths =
 | |
|       if connected?(socket) do
 | |
|         for %Servers.Server{status: :registered, public_ip: ip} <- servers, into: %{} do
 | |
|           Agents.subscribe_to_health(ip)
 | |
|           Agents.start_connection(ip)
 | |
|           {ip, Agents.get_health(ip)}
 | |
|         end
 | |
|       else
 | |
|         %{}
 | |
|       end
 | |
| 
 | |
|     {:ok,
 | |
|      socket
 | |
|      |> assign(:servers, servers)
 | |
|      |> assign(:healths, healths)}
 | |
|   end
 | |
| 
 | |
|   @impl true
 | |
|   def handle_params(_params, _url, socket) do
 | |
|     socket =
 | |
|       case socket.assigns.live_action do
 | |
|         :new -> assign(socket, :page_title, gettext("Connect a Server"))
 | |
|         :index -> assign(socket, :page_title, gettext("Listing Servers"))
 | |
|       end
 | |
| 
 | |
|     {:noreply, socket}
 | |
|   end
 | |
| 
 | |
|   @impl true
 | |
|   def handle_info({:connect, %Servers.Server{} = server}, socket) do
 | |
|     {:noreply,
 | |
|      socket
 | |
|      |> update(:servers, fn servers -> [server | servers] end)}
 | |
|   end
 | |
| 
 | |
|   def handle_info(%Agents.Health{} = health, socket) do
 | |
|     healths = Map.put(socket.assigns.healths, health.host, health)
 | |
|     {:noreply, assign(socket, :healths, healths)}
 | |
|   end
 | |
| 
 | |
|   def handle_info(msg, state) do
 | |
|     Logger.debug("received unexpected message #{inspect(msg)}")
 | |
|     {:noreply, state}
 | |
|   end
 | |
| 
 | |
|   defp server_status(assigns) do
 | |
|     case {assigns.status, assigns.health} do
 | |
|       {:unregistered, _} ->
 | |
|         ~H"""
 | |
|         <span class="text-gray-500">Needs registration</span>
 | |
|         """
 | |
| 
 | |
|       {:registered, nil} ->
 | |
|         ~H"""
 | |
|         <span class="text-yellow-600">Connecting...</span>
 | |
|         """
 | |
| 
 | |
|       {:registered, %Agents.Health{message: "Connected"}} ->
 | |
|         ~H"""
 | |
|         <span class="text-green-600">Connected</span>
 | |
|         """
 | |
| 
 | |
|       {:registered, %Agents.Health{message: "Disconnected"}} ->
 | |
|         ~H"""
 | |
|         <span class="text-red-600">Disconnected</span>
 | |
|         """
 | |
| 
 | |
|       {:registered, %Agents.Health{message: message}} ->
 | |
|         assigns = assign(assigns, :message, message)
 | |
| 
 | |
|         ~H"""
 | |
|         <span class="text-yellow-900"><%= @message %></span>
 | |
|         """
 | |
|     end
 | |
|   end
 | |
| end
 |