Subscribe once and receive one post-commit event per affected record for
EVERY canonical write, regardless of origin: direct calls, batch methods,
transact(), imports, and Virtual Filesystem writes all funnel through the
same commit points the feed is emitted from. This is the authoritative
in-process signal for live UIs, cache invalidation, and realtime sync layers
that forward it over their own transports.
Architecture — the post-commit dual of the ifRev precommit hook: mutation
methods hand lightweight event descriptors to the commit seam
(persistSingleOp / transact's plan), which stamps the committed
{generation, timestamp}, enriches entity deletes with the record's LAST
committed state from the commit's own before-images (free — Model B reads
them anyway; removeMany's id-only deletes gain full payloads this way), and
emits only after the commit succeeds — a losing CAS or rejected batch never
announces anything. Dispatch is a microtask FIFO after the mutex releases:
commit-ordered, a slow listener never delays a write, a throwing listener is
logged and isolated, and with no subscribers the write path constructs no
events at all. Single-point emission was chosen over per-method hooks
because the aggregation-hook pattern demonstrably drifted (relation ops and
removeMany were silently missing from it).
Coverage: add/update/remove (+ cascade unrelate per deleted relationship),
relate (both edges when bidirectional)/unrelate/updateRelation, per-item
events for addMany/updateMany/relateMany/removeMany, per-item events sharing
one generation for transact(), and transitively imports + VFS. clear() and
restore() — wholesale raw-state operations outside the per-record commit
path — emit a single store-level event meaning "refetch everything".
brain.close() drops all listeners.
New module src/events/changeFeed.ts (BrainyChangeEvent + ChangeFeed,
exported from the package root); guide docs/guides/reacting-to-changes.md.
Integration suite pins the contract: per-op payload fidelity, delete
last-state payloads, batch per-item emission, one-generation transact
batches, VFS-origin events, CAS-loser silence, ordering, listener isolation,
unsubscribe, and store-level events.
|
||
|---|---|---|
| .. | ||
| aggregation.md | ||
| enterprise-for-everyone.md | ||
| export-and-import.md | ||
| find-limits.md | ||
| framework-integration.md | ||
| import-anything.md | ||
| import-flow.md | ||
| import-progress-examples.md | ||
| import-progress-implementation.md | ||
| import-quick-reference.md | ||
| inspection.md | ||
| installation.md | ||
| migrating-to-v4.md | ||
| MIGRATING_TO_V5.11.md | ||
| migration-3.36.0.md | ||
| model-loading.md | ||
| natural-language.md | ||
| nextjs-integration.md | ||
| optimistic-concurrency.md | ||
| quick-start.md | ||
| reacting-to-changes.md | ||
| schema-migrations.md | ||
| snapshots-and-time-travel.md | ||
| standard-import-progress.md | ||
| storage-adapters.md | ||
| streaming-imports.md | ||
| subtypes-and-facets.md | ||
| upgrading-7-to-8.md | ||
| vue-integration.md | ||