UNPKG

@hazae41/glacier

Version:

Yet another React data (re)fetching library

48 lines (45 loc) 1.93 kB
import { Database } from '@hazae41/serac'; import { useRef } from 'react'; import { AwaitingQueryStorage } from '../awaiting/index.mjs'; class SeracQueryStorage { database; encoders; constructor(database, encoders) { this.database = database; this.encoders = encoders; } static async openAndCollectOrThrow(params) { const { name, version, upgrader, collector, encoders } = params; const database = await Database.openOrThrow(name, version, upgrader); const storage = new SeracQueryStorage(database, encoders); for await (const key of database.collectOrThrow()) await collector(storage, key); return storage; } async getStoredOrThrow(storageKey) { const storageValue = await this.database.getOrThrow(storageKey); if (storageValue == null) return; return await Promise.resolve(this.encoders.value.decodeOrThrow(storageValue)); } async setStoredOrThrow(storageKey, state) { if (state == null) return await this.database.deleteOrThrow(storageKey); const storageValue = await Promise.resolve(this.encoders.value.encodeOrThrow(state)); await this.database.setOrThrow(storageKey, storageValue, state.expiration ?? undefined); } async getOrThrow(cacheKey) { return await this.getStoredOrThrow(await Promise.resolve(this.encoders.key.encodeOrThrow(cacheKey))); } async setOrThrow(cacheKey, state) { return await this.setStoredOrThrow(await Promise.resolve(this.encoders.key.encodeOrThrow(cacheKey)), state); } } function useSeracStorage(params) { const storage = useRef(); if (storage.current == null) storage.current = new AwaitingQueryStorage(SeracQueryStorage.openAndCollectOrThrow(params)); return storage.current; } export { SeracQueryStorage, useSeracStorage }; //# sourceMappingURL=index.mjs.map