Skip to content

Read Models

Read models are shared Chronicle concepts. Querying, snapshots, watching, and consistency are documented in the shared Chronicle section.

Chronicle.ReadModels.watch/2 subscribes the calling process to live changesets for a read model over the kernel’s server-streaming Watch RPC. Elixir has no IObservable/ async-iterable equivalent to the C# and TypeScript clients’ Watch<TReadModel>(), so this follows the same message-based idiom as Chronicle.Connections.Lifecycle.subscribe/1.

{:ok, watcher} = Chronicle.ReadModels.watch(MyApp.ReadModels.AccountInfo)
receive do
{:chronicle_read_model_changed, MyApp.ReadModels.AccountInfo, changeset} ->
# changeset is a %Chronicle.ReadModels.Changeset{} with :model_key, :read_model,
# :change_type (:added | :modified | :removed), :event_sequence_number, and more.
IO.inspect(changeset.read_model)
{:chronicle_read_model_watch_error, MyApp.ReadModels.AccountInfo, reason} ->
# The stream failed and the watch has ended — call watch/2 again to resume.
IO.inspect(reason)
end
Chronicle.ReadModels.unwatch(watcher)

A read-model session (created implicitly whenever you read with a :session_id) normally expires on its own. dehydrate_session/4 explicitly cleans one up once the caller is done with it, releasing the resources Chronicle held for it right away.

:ok =
Chronicle.ReadModels.dehydrate_session(
MyApp.ReadModels.AccountInfo,
account_id,
session_id
)