@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
text/typescript
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 };