@hazae41/glacier
Version:
Yet another React data (re)fetching library
48 lines (45 loc) • 1.93 kB
JavaScript
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