Files
Genarrative/src/persistence/storage.ts
kdletters cbc27bad4a
Some checks failed
CI / verify (push) Has been cancelled
init with react+axum+spacetimedb
2026-04-26 18:06:23 +08:00

66 lines
1.3 KiB
TypeScript

export type JsonStorage = Pick<Storage, 'getItem' | 'setItem' | 'removeItem'>;
export function isRecord(value: unknown): value is Record<string, unknown> {
return Boolean(value) && typeof value === 'object' && !Array.isArray(value);
}
export function getJsonStorage(storage?: JsonStorage | null) {
if (storage !== undefined) {
return storage;
}
if (typeof window === 'undefined') {
return null;
}
return window.localStorage;
}
export function readStoredJson<T>({
key,
parse,
storage,
}: {
key: string;
parse: (value: unknown) => T | null;
storage?: JsonStorage | null;
}) {
const resolvedStorage = getJsonStorage(storage);
if (!resolvedStorage) {
return null;
}
const raw = resolvedStorage.getItem(key);
if (!raw) {
return null;
}
try {
return parse(JSON.parse(raw));
} catch {
return null;
}
}
export function writeStoredJson({
key,
value,
storage,
}: {
key: string;
value: unknown;
storage?: JsonStorage | null;
}) {
const resolvedStorage = getJsonStorage(storage);
if (!resolvedStorage) {
return false;
}
resolvedStorage.setItem(key, JSON.stringify(value));
return true;
}
export function removeStoredJson(key: string, storage?: JsonStorage | null) {
getJsonStorage(storage)?.removeItem(key);
}