diff --git a/src/js/db.js b/src/js/db.js new file mode 100644 index 0000000..3e40ccb --- /dev/null +++ b/src/js/db.js @@ -0,0 +1,63 @@ +class Db { + constructor() { + this.db = null; + this.dbName = "tinysub"; + this.dbVersion = 3; + } + + async open() { + if (this.db) { + return this.db; + } + + const db = await this._openDatabase(); + return db; + } + + async _openDatabase() { + try { + return await new Promise((resolve, reject) => { + const req = indexedDB.open(this.dbName, this.dbVersion); + + req.onsuccess = () => { + this.db = req.result; + resolve(this.db); + }; + + req.onerror = () => reject(req.error); + + req.onupgradeneeded = (e) => { + const db = e.target.result; + const oldVersion = e.oldVersion; + + // 1 -> 2: create queueStorage + if (oldVersion < 2 && !db.objectStoreNames.contains("queueStorage")) { + db.createObjectStore("queueStorage"); + } + + // 2 -> 3: create apiCache and cacheMetadata + if (oldVersion < 3) { + if (!db.objectStoreNames.contains("apiCache")) { + db.createObjectStore("apiCache"); + } + if (!db.objectStoreNames.contains("cacheMetadata")) { + db.createObjectStore("cacheMetadata"); + } + } + }; + }); + } catch (err) { + console.error("[Db] Failed to open IndexedDB:", err); + return null; + } + } + + close() { + if (this.db) { + this.db.close(); + this.db = null; + } + } +} + +const db = new Db(); diff --git a/src/js/queue-storage.js b/src/js/queue-storage.js index 3f7b652..18a8408 100644 --- a/src/js/queue-storage.js +++ b/src/js/queue-storage.js @@ -1,35 +1,8 @@ // 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; - } + return await db.open(); } async save(songs, queueIndex) { const db = await this.ensureDB();