UNPKG

@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

42 lines (41 loc) • 1.94 kB
import { r as CrossTabEventTarget, u as PersistStorage } from "../persist-core-B649IGlX.mjs"; //#region src/adapters/transport/crosstab.d.ts interface CreateBroadcastCrossTabOptions { /** BroadcastChannel name — all tabs sharing this name sync. */ channelName: string; } interface BroadcastCrossTab<S> { /** Pass as `crossTabEventTarget`. Listens for `message` events and dispatches * storage-shaped events (storageArea: null → key-only matching in every tab). */ crossTabEventTarget: CrossTabEventTarget; /** Wrap a base `PersistStorage` so writes/removes broadcast. Pass the result * as `storage`. Preserves `raw`. */ wrap: (storage: PersistStorage<S>) => PersistStorage<S>; /** Close the underlying channel — call from the persist `destroy()` path. */ close: () => void; } /** * Bridge a `BroadcastChannel` as the cross-tab transport for backends that * fire no `storage` events (IndexedDB). Posts `storageArea: null` on every * event so key-only matching applies in every tab (each tab owns its own * backend instance — reference equality on `raw` would fail across tabs). * * @example * ```ts * import { createBroadcastCrossTab } from "@stainless-code/persist/transport/crosstab"; * import { createIdbStorage } from "@stainless-code/persist/backends/idb"; * import { persistStore } from "@stainless-code/persist/sources/tanstack-store"; * * const bridge = createBroadcastCrossTab({ channelName: "app:prefs" })!; * const persist = persistStore(store, { * name: "app:prefs:v1", * storage: bridge.wrap(createIdbStorage()!), * crossTab: true, * crossTabEventTarget: bridge.crossTabEventTarget, * }); * // on teardown: persist.destroy(); bridge.close(); * ``` */ declare function createBroadcastCrossTab<S>(options: CreateBroadcastCrossTabOptions): BroadcastCrossTab<S> | undefined; //#endregion export { BroadcastCrossTab, CreateBroadcastCrossTabOptions, createBroadcastCrossTab };