45 lines
1.4 KiB
JavaScript
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();
|
|
}
|