defmodule Dust.Subscriber do @moduledoc """ Declarative callback handler for Dust store events. Define a subscriber module to react to store changes matching a glob pattern: defmodule MyApp.PostSubscriber do use Dust.Subscriber, store: "myapp/data", pattern: "posts/*" @impl true def handle_event(event) do # event is a map with :store, :path, :op, :value, etc. IO.inspect(event, label: "post changed") :ok end end Then register it in your Dust config: config :my_app, MyApp.Dust, stores: ["myapp/data"], subscribers: [MyApp.PostSubscriber] ## Options * `:store` (required) - the store name to subscribe to * `:pattern` (required) - glob pattern for matching paths (e.g. `"posts/*"`) * `:max_queue_size` - maximum pending events before the subscription is dropped due to backpressure (default: `1000`) """ @callback handle_event(event :: map()) :: :ok | {:error, term()} defmacro __using__(opts) do store = Keyword.fetch!(opts, :store) pattern = Keyword.fetch!(opts, :pattern) max_queue_size = Keyword.get(opts, :max_queue_size, 1000) quote do @behaviour Dust.Subscriber def __dust_store__, do: unquote(store) def __dust_pattern__, do: unquote(pattern) def __dust_max_queue_size__, do: unquote(max_queue_size) def __dust_register__ do Dust.SyncEngine.on( __dust_store__(), __dust_pattern__(), fn event -> __MODULE__.handle_event(event) end, max_queue_size: __dust_max_queue_size__() ) end end end end