// queue storage that persists to IndexedDB across sessions class QueueStorage { constructor() { this.db = null; } async ensureDB() { if (this.db) return this.db; try { return await new Promise((resolve) => { const req = indexedDB.open("tinysub", 2); req.onsuccess = () => { this.db = req.result; resolve(this.db); }; req.onupgradeneeded = (e) => { const db = e.target.result; if (!db.objectStoreNames.contains("queueStorage")) { db.createObjectStore("queueStorage"); } }; req.onerror = () => resolve(null); }); } catch (error) { console.error("[QueueStorage] IndexedDB initialization failed:", error); return null; } } async save(songs, queueIndex) { const db = await this.ensureDB(); if (!db) return; return new Promise((resolve) => { try { const tx = db.transaction(["queueStorage"], "readwrite"); const store = tx.objectStore("queueStorage"); store.put(songs, "songs"); store.put(queueIndex, "queueIndex"); tx.onerror = () => { console.error("[QueueStorage] Failed to save queue"); resolve(); }; tx.oncomplete = () => resolve(); } catch (error) { console.error("[QueueStorage] Save failed:", error); resolve(); } }); } async load() { const db = await this.ensureDB(); if (!db) return { songs: [], queueIndex: -1 }; return new Promise((resolve) => { try { const tx = db.transaction(["queueStorage"], "readonly"); const store = tx.objectStore("queueStorage"); const songsReq = store.get("songs"); const indexReq = store.get("queueIndex"); tx.onerror = () => { console.error("[QueueStorage] Failed to load queue"); resolve({ songs: [], queueIndex: -1 }); }; tx.oncomplete = () => { resolve({ songs: songsReq.result || [], queueIndex: indexReq.result ?? -1, }); }; } catch (error) { console.error("[QueueStorage] Load failed:", error); resolve({ songs: [], queueIndex: -1 }); } }); } } const queueStorage = new QueueStorage();