import {writable, Writable} from "svelte/store" import {getJson, setJson} from "@welshman/lib" export interface StorageProvider { get: (key: string) => Promise set: (key: string, value: any) => Promise } export const localStorageProvider: StorageProvider = { get: async (key: string) => getJson(key), set: async (key: string, value: any) => setJson(key, value), } export interface SyncConfig { key: string store: Writable storage: StorageProvider } export type Synced = Writable & {ready: Promise} export const sync = async ({key, store, storage}: SyncConfig) => { const storedValue = await storage.get(key) if (storedValue !== undefined) { store.set(storedValue) } store.subscribe(async (value: T) => { await storage.set(key, value) }) } export interface SyncedConfig { key: string storage: StorageProvider defaultValue: T } export const synced = ({key, storage, defaultValue}: SyncedConfig) => { const store = writable(defaultValue) as Synced store.ready = sync({key, store, storage}) return store }