defmodule Phoenix.PubSub.Adapter do
@moduledoc """
Specification to implement a custom PubSub adapter.
"""
@type adapter_name :: atom
@doc """
Returns the node name as an atom or a binary.
"""
@callback node_name(adapter_name) :: Phoenix.PubSub.node_name()
@doc """
Returns a child specification that mounts the processes
required for the adapter.
`child_spec` will receive all options given `Phoenix.PubSub`.
Note, however, that the `:name` under options is the name
of the complete PubSub system. The reserved key space to
be used by the adapter is under the `:adapter_name` key.
"""
@callback child_spec(keyword) :: Supervisor.child_spec()
@doc """
Broadcasts the given topic, message, and dispatcher to
all nodes in the cluster (except the current node itself).
"""
@callback broadcast(
adapter_name,
topic :: Phoenix.PubSub.topic(),
message :: Phoenix.PubSub.message(),
dispatcher :: Phoenix.PubSub.dispatcher()
) :: :ok | {:error, term}
@doc """
Broadcasts the given topic, message, and dispatcher to
given node in the cluster (it may point to itself).
"""
@callback direct_broadcast(
adapter_name,
node_name :: Phoenix.PubSub.node_name(),
topic :: Phoenix.PubSub.topic(),
message :: Phoenix.PubSub.message(),
dispatcher :: Phoenix.PubSub.dispatcher()
) :: :ok | {:error, term}
end