Files
takeyourmeds/frontend/lib/offlineQueue.js
T
Frank Schwenk 7cec3030c1 feat: PWA update strategy with hashed assets and cache control
Move frontend sources to frontend/, build content-hashed assets at deploy,
network-first SW for shell/JS, immutable cache for /assets/, version.json
update banner, and Cache-Control middleware. Docs in docs/PWA-STRATEGY.md.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-08 08:51:12 +02:00

45 lines
1.4 KiB
JavaScript

const DB_NAME = "tym-offline";
const STORE = "queue";
function openDb() {
return new Promise((resolve, reject) => {
const req = indexedDB.open(DB_NAME, 1);
req.onupgradeneeded = () => req.result.createObjectStore(STORE, { keyPath: "id", autoIncrement: true });
req.onsuccess = () => resolve(req.result);
req.onerror = () => reject(req.error);
});
}
export async function enqueue(entry) {
const db = await openDb();
return new Promise((resolve, reject) => {
const tx = db.transaction(STORE, "readwrite");
tx.objectStore(STORE).add({ ...entry, queued_at: Date.now() });
tx.oncomplete = () => { db.close(); resolve(); };
tx.onerror = () => reject(tx.error);
});
}
export async function flushQueue(apiLog) {
const db = await openDb();
const entries = await new Promise((resolve, reject) => {
const tx = db.transaction(STORE, "readonly");
const req = tx.objectStore(STORE).getAll();
req.onsuccess = () => resolve(req.result || []);
req.onerror = () => reject(req.error);
});
for (const entry of entries) {
try {
await apiLog({ slot_id: entry.slot_id, status: entry.status, source: "offline" });
await new Promise((resolve, reject) => {
const tx = db.transaction(STORE, "readwrite");
tx.objectStore(STORE).delete(entry.id);
tx.oncomplete = resolve;
tx.onerror = () => reject(tx.error);
});
} catch { break; }
}
db.close();
}