defmodule Prymn.Agents do @moduledoc ~S""" Prymn Agents are programs that manage a remote client machine. Prymn backend communicates with them using GRPC calls. GRPC connections are started using the Prymn.Agents.Supervisor (a DynamicSupervisor) and are book-kept using the Prymn.Agents.Registry. ## Examples TODO """ @doc """ Ensures a connection with the Prymn Agent exists and is kept in memory. Returns `:ok` when a new connection is successfuly established or is already established Returns `{:error, reason}` when the connection could not be established """ @spec ensure_connection(String.t()) :: :ok | {:error, term} def ensure_connection(address) do child = {Prymn.Agents.Connection, address} case DynamicSupervisor.start_child(Prymn.Agents.Supervisor, child) do {:ok, _pid} -> :ok {:error, {:already_started, _pid}} -> :ok {:error, error} -> {:error, error} end end @doc """ Terminates the process and drops the connection gracefully. """ @spec drop_connection(String.t()) :: :ok | {:error, :not_found} def drop_connection(address) do :ok = Prymn.Agents.Connection.drop(address) catch :exit, _ -> {:error, :not_found} end @doc """ Get the channel for the given `address`. The channel is used to make GRPC calls. """ @spec get_channel(String.t()) :: GRPC.Channel.t() | {:error, :not_found} def get_channel(address) do Prymn.Agents.Connection.get_channel(address) catch :exit, _ -> {:error, :not_found} end end