podbox_ash/lib/podbox/download/pub_sub.ex

37 lines
996 B
Elixir

defmodule Podbox.Download.PubSub do
@moduledoc """
A wrapper around a registry for PubSub.
"""
@doc false
@spec child_spec(any) :: Supervisor.child_spec()
def child_spec(_) do
Registry.child_spec(
keys: :duplicate,
name: __MODULE__,
partitions: System.schedulers_online()
)
end
@doc "Subscribe to a topic"
@spec subscribe(String.t(), Keyword.t()) :: :ok | {:error, any}
def subscribe(topic, _opts \\ []) do
with {:ok, _} <- Registry.register(__MODULE__, topic, nil) do
:ok
end
end
@doc "Unsubscribe from a topic"
@spec unsubscribe(String.t()) :: :ok | {:error, any}
def unsubscribe(topic) do
Registry.unregister(__MODULE__, topic)
end
@doc "Broadcast a message to a topic"
@spec broadcast(String.t(), any, any) :: :ok | {:error, any}
def broadcast(topic, _event, message) do
Registry.dispatch(__MODULE__, topic, fn entries ->
for {pid, _} <- entries, do: send(pid, {topic, message})
end)
end
end