import { createService } from '@owlmeans/context' import { DEFAULT_ALIAS } from './consts.js' import type { WebDbService } from './types.js' import type { ClientDb } from '@owlmeans/client-resource' import { get, set, del, clear } from 'idb-keyval' import type { ClientConfig, ClientContext } from '@owlmeans/client-context' type Config = ClientConfig interface Context extends ClientContext { } export const makeWebDbService = (alias: string = DEFAULT_ALIAS): WebDbService => { const stores: Record = {} const service = createService(alias, { initialize: async alias => { alias = alias ?? DEFAULT_ALIAS if (stores[alias] != null) { return stores[alias] } const _key = (id: string) => alias + ':' + id const db: ClientDb = { get: async (id: string) => { return await get(_key(id)) }, set: async (id: string, value: T) => { await set(_key(id), value) }, has: async id => { return null != await get(_key(id)) }, del: async id => { const has = await db.has(id) if (has) { await del(_key(id)) } return has } } return stores[alias] = db }, erase: async () => { await clear() } }, service => async () => { service.initialized = true }) return service } export const appendWebDbService = = Context>( context: T, alias: string = DEFAULT_ALIAS ): T => { const service = makeWebDbService(alias) context.registerService(service) return context }