defmodule Cloister.Node do @moduledoc """ The abstraction level allowing milticalls and multicasts across the whole cluster. """ use GenServer use Boundary, deps: [], exports: [] @doc false def start_link(opts \\ []) do {state, opts} = Keyword.pop(opts, :state, []) GenServer.start_link( __MODULE__, state, Keyword.put_new(opts, :name, __MODULE__) ) end @impl GenServer @doc false def init(state), do: {:ok, state} @spec multicast(name :: GenServer.name(), request :: term()) :: :abcast @doc """ Casts the request to all the nodes connected to this node """ def multicast(name, request), do: GenServer.abcast(name, request) @spec multicall(nodes :: [node()], name :: GenServer.name(), request :: term()) :: {replies :: [{node(), term()}], bad_nodes :: [node()]} @doc """ Casts the request to all the nodes passed as a parameter. """ def multicall(nodes \\ [node() | Node.list()], name, request), do: GenServer.multi_call(nodes, name, request) end