From 5a9452380a89fc2cf935cbc4cbecc09b8bce0207 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Tue, 27 Jan 2026 02:17:18 +0000 Subject: [PATCH] fix(storage): close IndexedDB connection after operations in directMessagesStore Ensures `db.close()` is called in `js/directMessagesStore.js` methods (`loadDirectMessageSnapshot`, `saveDirectMessageSnapshot`, `clearDirectMessageSnapshot`) to prevent hanging `deleteDatabase` calls in tests (and potentially in app teardown). This resolves the timeout issue in `tests/nostr/dm-direct-message-flow.test.mjs`. Co-authored-by: PR0M3TH3AN <53631862+PR0M3TH3AN@users.noreply.github.com> --- js/directMessagesStore.js | 67 +++++++++++++++++++++++---------------- 1 file changed, 39 insertions(+), 28 deletions(-) diff --git a/js/directMessagesStore.js b/js/directMessagesStore.js index 45653a2c..7f5c83a4 100644 --- a/js/directMessagesStore.js +++ b/js/directMessagesStore.js @@ -192,16 +192,19 @@ export async function loadDirectMessageSnapshot(pubkey) { try { const db = await openSettingsDb(); if (db) { - const stored = await new Promise((resolve, reject) => { - const tx = db.transaction(STORE_NAME, "readonly"); - const store = tx.objectStore(STORE_NAME); - const request = store.get(dbKey); - request.onsuccess = () => resolve(request.result || []); - request.onerror = () => - reject(request.error || new Error("Failed to load snapshot")); - }); - - return normalizeSnapshotList(stored); + try { + const stored = await new Promise((resolve, reject) => { + const tx = db.transaction(STORE_NAME, "readonly"); + const store = tx.objectStore(STORE_NAME); + const request = store.get(dbKey); + request.onsuccess = () => resolve(request.result || []); + request.onerror = () => + reject(request.error || new Error("Failed to load snapshot")); + }); + return normalizeSnapshotList(stored); + } finally { + db.close(); + } } } catch (error) { userLogger.warn( @@ -244,15 +247,19 @@ export async function saveDirectMessageSnapshot(pubkey, snapshot) { try { const db = await openSettingsDb(); if (db) { - await new Promise((resolve, reject) => { - const tx = db.transaction(STORE_NAME, "readwrite"); - const store = tx.objectStore(STORE_NAME); - const request = store.put(normalizedSnapshot, dbKey); - request.onsuccess = () => resolve(); - request.onerror = () => - reject(request.error || new Error("Failed to write snapshot")); - }); - return normalizedSnapshot; + try { + await new Promise((resolve, reject) => { + const tx = db.transaction(STORE_NAME, "readwrite"); + const store = tx.objectStore(STORE_NAME); + const request = store.put(normalizedSnapshot, dbKey); + request.onsuccess = () => resolve(); + request.onerror = () => + reject(request.error || new Error("Failed to write snapshot")); + }); + return normalizedSnapshot; + } finally { + db.close(); + } } } catch (error) { userLogger.warn( @@ -290,15 +297,19 @@ export async function clearDirectMessageSnapshot(pubkey) { try { const db = await openSettingsDb(); if (db) { - await new Promise((resolve, reject) => { - const tx = db.transaction(STORE_NAME, "readwrite"); - const store = tx.objectStore(STORE_NAME); - const request = store.delete(dbKey); - request.onsuccess = () => resolve(); - request.onerror = () => - reject(request.error || new Error("Failed to clear snapshot")); - }); - cleared = true; + try { + await new Promise((resolve, reject) => { + const tx = db.transaction(STORE_NAME, "readwrite"); + const store = tx.objectStore(STORE_NAME); + const request = store.delete(dbKey); + request.onsuccess = () => resolve(); + request.onerror = () => + reject(request.error || new Error("Failed to clear snapshot")); + }); + cleared = true; + } finally { + db.close(); + } } } catch (error) { userLogger.warn(