Current section

Files

Jump to
kvasir_agent_server lib kvasir agent_server client connection_manager.ex
Raw

lib/kvasir/agent_server/client/connection_manager.ex

defmodule Kvasir.AgentServer.Client.ConnectionManager do
@all Kvasir.AgentServer.Client
@scope Kvasir.AgentServer.Client.Subscription
@super Kvasir.AgentServer.Client.ConnectionManager
@proto Kvasir.AgentServer.Client.Protocol
@doc @moduledoc
@spec start_link(opts :: Keyword.t()) :: Supervisor.on_start()
def start_link(_opts \\ []) do
:ets.new(@all, [:named_table, :public, :set, read_concurrency: true])
Supervisor.start_link(
[
%{
id: @scope,
start: {:pg, :start_link, [@scope]}
},
DynamicSupervisor.child_spec(strategy: :one_for_one, name: @super)
],
strategy: :rest_for_one,
name: @all
)
end
def connect(host, port, client_pid) do
h = if(is_binary(host), do: String.to_charlist(host), else: host)
p = if(is_binary(port), do: String.to_integer(port), else: port)
name = :"#{@super}.#{host}.#{port}"
spec =
Kvasir.AgentServer.Control.Connection.child_spec(
host: h,
port: p,
name: name,
protocol: @proto
)
if client_pid, do: :pg.join(@scope, name, client_pid)
case DynamicSupervisor.start_child(@super, spec) do
{:ok, _pid} -> {:ok, name}
{:error, {:already_started, _pid}} -> {:ok, name}
err -> err
end
end
@spec status(atom) :: atom
defdelegate status(connection), to: Kvasir.AgentServer.Client.Protocol
@spec agents(atom) :: %{required(String.t()) => list}
defdelegate agents(connection), to: Kvasir.AgentServer.Client.Protocol
@spec agents(atom, String.t()) :: list
defdelegate agents(connection, id), to: Kvasir.AgentServer.Client.Protocol
end