mirror of
https://github.com/ruvnet/RuView
synced 2026-07-19 16:53:18 +00:00
7f5a692632
Squashed merge of feat/nvsim-pipeline-simulator (29 commits). ## Shipped - ADR-089 nvsim crate (Accepted) — 50/50 tests, ~4.5 M samples/s, pinned witness cc8de9b01b0ff5bd… - ADR-092 dashboard implementation (Implemented) — 8/12 §11 gates ✅, 4/12 ⚠ (external infra) - ADR-093 dashboard gap analysis (Implemented) — 21/21 catalogued gaps closed - Plus ADR-090 (proposed conditional) and ADR-091 (proposed research-only) ## Live deploy https://ruvnet.github.io/RuView/nvsim/ ## Infra - nvsim-server Dockerfile + GHCR publish workflow (.github/workflows/nvsim-server-docker.yml) - axe-core + Playwright cross-browser CI (.github/workflows/dashboard-a11y.yml) - gh-pages auto-deploy workflow already in place (preserves observatory + pose-fusion siblings) Co-Authored-By: claude-flow <ruv@ruv.net>
53 lines
1.7 KiB
TypeScript
53 lines
1.7 KiB
TypeScript
/* IndexedDB-backed persistence for settings and saved scenes.
|
|
* Mirrors the mockup's `nvsim/kv` store. */
|
|
|
|
const DB_NAME = 'nvsim';
|
|
const DB_VER = 1;
|
|
const STORE = 'kv';
|
|
|
|
let dbPromise: Promise<IDBDatabase> | null = null;
|
|
|
|
function openDb(): Promise<IDBDatabase> {
|
|
if (dbPromise) return dbPromise;
|
|
dbPromise = new Promise<IDBDatabase>((resolve, reject) => {
|
|
const req = indexedDB.open(DB_NAME, DB_VER);
|
|
req.onupgradeneeded = () => {
|
|
const db = req.result;
|
|
if (!db.objectStoreNames.contains(STORE)) db.createObjectStore(STORE);
|
|
};
|
|
req.onsuccess = () => resolve(req.result);
|
|
req.onerror = () => reject(req.error);
|
|
});
|
|
return dbPromise;
|
|
}
|
|
|
|
export async function kvGet<T = unknown>(key: string): Promise<T | undefined> {
|
|
const db = await openDb();
|
|
return await new Promise<T | undefined>((resolve, reject) => {
|
|
const tx = db.transaction(STORE, 'readonly');
|
|
const r = tx.objectStore(STORE).get(key);
|
|
r.onsuccess = () => resolve(r.result as T | undefined);
|
|
r.onerror = () => reject(r.error);
|
|
});
|
|
}
|
|
|
|
export async function kvSet(key: string, value: unknown): Promise<void> {
|
|
const db = await openDb();
|
|
return await new Promise<void>((resolve, reject) => {
|
|
const tx = db.transaction(STORE, 'readwrite');
|
|
tx.objectStore(STORE).put(value, key);
|
|
tx.oncomplete = () => resolve();
|
|
tx.onerror = () => reject(tx.error);
|
|
});
|
|
}
|
|
|
|
export async function kvDelete(key: string): Promise<void> {
|
|
const db = await openDb();
|
|
return await new Promise<void>((resolve, reject) => {
|
|
const tx = db.transaction(STORE, 'readwrite');
|
|
tx.objectStore(STORE).delete(key);
|
|
tx.oncomplete = () => resolve();
|
|
tx.onerror = () => reject(tx.error);
|
|
});
|
|
}
|