diffable-objects
Version:
A package for dynamic state tracking for Cloudflare's Durable Objects using SQLite
34 lines (33 loc) • 1.08 kB
JavaScript
import { atomizeChangeset, diff } from "json-diff-ts";
export function recursivelyObservable(data, opts) {
const processUpdate = opts.processUpdate ??
((applyChanges) => {
const old = structuredClone(data);
applyChanges();
const diffs = diff(old, data);
const atomicChanges = atomizeChangeset(diffs);
if (atomicChanges.length > 0) {
opts.onUpdate(atomicChanges, data);
}
});
const proxyOpts = {
get(target, p) {
const property = target[p];
if (property !== null && typeof property === "object") {
// @ts-ignore TODO
return recursivelyObservable(property, {
...opts,
processUpdate,
});
}
return target[p];
},
set(target, p, newValue) {
processUpdate(() => {
target[p] = newValue;
});
return true;
},
};
return new Proxy(data, proxyOpts);
}