UNPKG

diffable-objects

Version:

A package for dynamic state tracking for Cloudflare's Durable Objects using SQLite

26 lines (25 loc) 840 B
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}`); } }); }