defmodule GrpcBuilder.Client.ConnSupervisor do @moduledoc """ Supervise the connections. """ use DynamicSupervisor alias GrpcBuilder.Client.RpcConn def start_link(_arg) do DynamicSupervisor.start_link(__MODULE__, [], name: __MODULE__) end def init([]) do DynamicSupervisor.init(strategy: :one_for_one) end def add(name, addr, callback \\ nil) do child_spec = %{ id: name, # disable retry on gun's part to prevent undesired zombie connections start: {RpcConn, :start_link, [name, addr, [adapter_opts: %{retry: 0}], callback]}, type: :worker, restart: :permanent, shutdown: 500 } DynamicSupervisor.start_child(__MODULE__, child_spec) end def remove(pid) do DynamicSupervisor.terminate_child(__MODULE__, pid) end def children do DynamicSupervisor.which_children(__MODULE__) end def get_names do Enum.map(children(), fn {_, p, _, _} -> p |> Process.info(:registered_name) |> elem(1) end) end def count_children do DynamicSupervisor.count_children(__MODULE__) end end