diffable-objects
Version:
A package for dynamic state tracking for Cloudflare's Durable Objects using SQLite
26 lines (25 loc) • 840 B
JavaScript
import { applyChangeset, unatomizeChangeset, } from "json-diff-ts";
export function replay(actions, initialValue) {
if (actions.length === 0) {
return initialValue;
}
let data = actions[0].type === "snapshot" ? actions[0].value : initialValue;
assertChanges(actions);
const atomicChanges = actions.map((it) => it.atomicChange);
const changeSet = unatomizeChangeset(atomicChanges);
data = applyChangeset(data, changeSet);
return data;
}
function assertChanges(actions) {
if (actions.length === 0) {
throw new Error("No changes to assert");
}
if (actions[0].type === "snapshot") {
actions.shift();
}
actions.forEach((it, i) => {
if (it.type !== "change") {
throw new Error(`Expected changes, but got snapshot at index ${i}`);
}
});
}