if Code.ensure_loaded?(Phoenix.PubSub) do
defmodule Dust.PubSubBridge do
@moduledoc """
Bridges Dust events to Phoenix.PubSub.
When configured with a `:pubsub` option, registers a catch-all `**` callback
on each store that broadcasts every event to the PubSub topic `"dust:{store}"`.
Subscribers subscribe to the store topic and filter in `handle_info`:
Phoenix.PubSub.subscribe(MyApp.PubSub, "dust:james/blog")
def handle_info({:dust_event, event}, state) do
# event is a map with :store, :path, :op, :value, etc.
end
"""
@doc "Register PubSub broadcasting for all configured stores."
def register(pubsub, stores) do
Enum.each(stores, fn store ->
Dust.SyncEngine.on(store, "**", fn event ->
Phoenix.PubSub.broadcast(pubsub, "dust:#{store}", {:dust_event, event})
end)
end)
end
end
end