keyval.ts (1962B)
1 import { browser } from "$app/environment"; 2 import { fmt_id, IdbKeyval } from "@radroots/apps-lib"; 3 import { _env_lib } from "$lib/utils/_env"; 4 5 export let idb_kv: IdbKeyval | undefined; 6 if (browser) idb_kv = new IdbKeyval({ name: _env_lib.KEYVAL_NAME }); 7 8 export const idb_kv_init = async (): Promise<void> => { 9 if (!browser || !idb_kv) return; 10 const kv = idb_kv; 11 const range = IdbKeyval.prefix(`*`); 12 const idb_kv_list = await kv.each({ range }, `keys`); 13 await Promise.all(idb_kv_list.map((i) => kv.delete(i))); 14 }; 15 16 export const idb_kv_init_page = async (): Promise<void> => { 17 if (!browser || !idb_kv) return; 18 const kv = idb_kv; 19 const idb_kv_pref = fmt_id(); 20 const range = IdbKeyval.prefix(idb_kv_pref); 21 const idb_kv_list = await kv.each({ range }, `keys`); 22 await Promise.all(idb_kv_list.map((i) => kv.delete(i))); 23 }; 24 25 export const idb_kv_sync = async (list: [string, string][]): Promise<void> => { 26 if (!browser || !idb_kv) return; 27 const kv = idb_kv; 28 for (const [key, val] of list) await kv.set(key, val); 29 }; 30 31 export interface IIdbLib<T extends string> { 32 init: () => Promise<void>; 33 save: (key: T, value: string) => Promise<void>; 34 read: (key: T) => Promise<string | undefined>; 35 del: (key: T) => Promise<void>; 36 } 37 38 export class IdbLib<T extends string> implements IIdbLib<T> { 39 private _idb: IdbKeyval; 40 41 constructor(kv: IdbKeyval) { 42 this._idb = kv; 43 } 44 45 public init = async (): Promise<void> => { 46 await idb_kv_init_page(); 47 }; 48 49 public save = async (key: T, value: string): Promise<void> => { 50 await this._idb.set(fmt_id(key), value); 51 }; 52 53 public read = async (key: T): Promise<string | undefined> => { 54 const result = await this._idb.get<string>(fmt_id(key)); 55 if (result) return result; 56 return undefined; 57 }; 58 59 public del = async (key: T): Promise<void> => { 60 await this._idb.delete(fmt_id(key)); 61 }; 62 }