Skip to main content

lib/dust/subscriber_registrar.ex

defmodule Dust.SubscriberRegistrar do
  @moduledoc """
  One-off GenServer that starts last in the supervision tree and registers
  all declared `Dust.Subscriber` modules with their respective SyncEngines.

  This exists because subscriber registration needs the SyncEngines to be
  running, but the Supervisor hasn't started its children yet during `init/1`.
  By placing the registrar last in the children list, we guarantee all
  SyncEngines are up before registration runs.
  """

  # PubSubBridge is conditionally defined (only when Phoenix.PubSub is
  # available). The Code.ensure_loaded? check below guards the call.
  @compile {:no_warn_undefined, Dust.PubSubBridge}

  use GenServer

  def start_link(opts) do
    GenServer.start_link(__MODULE__, opts)
  end

  @impl true
  def init(opts) do
    subscribers = Keyword.get(opts, :subscribers, [])

    Enum.each(subscribers, fn subscriber_module ->
      subscriber_module.__dust_register__()
    end)

    pubsub = Keyword.get(opts, :pubsub)
    stores = Keyword.get(opts, :stores, [])

    if pubsub && Code.ensure_loaded?(Dust.PubSubBridge) do
      Dust.PubSubBridge.register(pubsub, stores)
    end

    :ignore
  end
end