API reference · generated from source
Function: createChangeLogTap()#
function createChangeLogTap(sink, options?): () => void;Defined in: createChangeLogTap.ts:53
Register a structured-logging tap over the Retree debug tap stream.
Parameters#
| Parameter | Type | Description |
|---|---|---|
sink | TRetreeChangeLogSink | Callback receiving one entry per emission. |
options? | IChangeLogTapOptions | Optional IChangeLogTapOptions. |
Returns#
Unsubscribe function; safe to call more than once.
() => void
Remarks#
This is the low-level building block for custom tooling: every Retree
emission — including emissions inside Retree.runSilent windows, which
application listeners never see — is delivered to sink as one
IRetreeChangeLogEntry with the root name, a best-effort key path,
the raw change records, and transaction/silent flags.
connectReduxDevTools is the batteries-included consumer of the
same stream; reach for createChangeLogTap when piping changes into your
own logger, test harness, or panel.
The sink runs synchronously inside Retree's write path, before application listeners. Keep it passive: a slow sink slows every write, and a sink that mutates Retree state re-enters the emit path.
Example#
import { Retree } from "@retreejs/core";
import { createChangeLogTap } from "@retreejs/devtools";
const app = Retree.root({ tasks: [{ title: "write docs", done: false }] });
Retree.registerRootName(app, "app");
const removeTap = createChangeLogTap((entry) => {
console.log(entry.rootName, entry.path?.join("."), entry.records);
});
app.tasks[0].done = true;
// logs: "app", "tasks.0", [{ key: "done", previous: false, new: true, ... }]
removeTap();