import { UIEventSource } from "../UIEventSource" import * as idb from "idb-keyval" import { Utils } from "../../Utils" /** * UIEventsource-wrapper around indexedDB key-value */ export class IdbLocalStorage { private static readonly _sourceCache: Record> = {} public static Get( key: string, options?: { defaultValue?: T; whenLoaded?: (t: T | null) => void } ): UIEventSource { if (IdbLocalStorage._sourceCache[key] !== undefined) { return IdbLocalStorage._sourceCache[key] } const src = new UIEventSource(options?.defaultValue, "idb-local-storage:" + key) if (Utils.runningFromConsole) { return src } src.addCallback((v) => idb.set(key, v)) idb.get(key) .then((v) => { src.setData(v ?? options?.defaultValue) if (options?.whenLoaded !== undefined) { options?.whenLoaded(v) } }) .catch((err) => { console.warn("Loading from local storage failed due to", err) if (options?.whenLoaded !== undefined) { options?.whenLoaded(null) } }) IdbLocalStorage._sourceCache[key] = src return src } public static SetDirectly(key: string, value) { idb.set(key, value) } static GetDirectly(key: string) { return idb.get(key) } }