@stainless-code/persist
Version:
Hydration-aware persistence for any reactive store — zero-dep persistSource core; codecs, backends, cross-tab transport, source + framework hydration adapters ship as opt-in recipes
32 lines (31 loc) • 942 B
JavaScript
import { l as persistSource } from "../persist-core-B5VikEft.mjs";
import { observe, runInAction, toJS } from "mobx";
//#region src/adapters/sources/mobx.ts
/**
* Persist a mobx observable object. `toJS` for reads, `Object.assign` for
* writes, `observe` for change tracking.
*
* @example
* ```ts
* import { observable } from "mobx";
* import { persistObservable } from "@stainless-code/persist/sources/mobx";
* const state = observable.object({ count: 0 });
* const persist = persistObservable(state, { name: "count" });
* ```
*/
function persistObservable(observable, options) {
return persistSource({
getState: () => toJS(observable),
setState: (updater) => {
runInAction(() => {
const next = updater(toJS(observable));
Object.assign(observable, next);
});
},
subscribe: (listener) => {
return { unsubscribe: observe(observable, () => listener()) };
}
}, options);
}
//#endregion
export { persistObservable };