From 10589b056f1a7f4f262283bcbe5c660532a663d0 Mon Sep 17 00:00:00 2001 From: Sosthene Date: Tue, 1 Jul 2025 18:03:04 +0200 Subject: [PATCH] Solve potential race conditions in dumpStore() --- src/services/database.service.ts | 34 +++++++++++++++++--------------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/src/services/database.service.ts b/src/services/database.service.ts index 663de5e..ac942b9 100755 --- a/src/services/database.service.ts +++ b/src/services/database.service.ts @@ -341,23 +341,25 @@ export class Database { const store = tx.objectStore(storeName); try { - // Wait for both getAllKeys() and getAll() to resolve - const [keys, values] = await Promise.all([ - new Promise((resolve, reject) => { - const request = store.getAllKeys(); - request.onsuccess = () => resolve(request.result); - request.onerror = () => reject(request.error); - }), - new Promise((resolve, reject) => { - const request = store.getAll(); - request.onsuccess = () => resolve(request.result); - request.onerror = () => reject(request.error); - }), - ]); + return new Promise((resolve, reject) => { + const result: Record = {}; + const cursor = store.openCursor(); - // Combine keys and values into an object - const result: Record = Object.fromEntries(keys.map((key, index) => [key, values[index]])); - return result; + cursor.onsuccess = (event) => { + const request = event.target as IDBRequest; + const cursor = request.result; + if (cursor) { + result[cursor.key as string] = cursor.value; + cursor.continue(); + } else { + resolve(result); + } + }; + + cursor.onerror = () => { + reject(cursor.error); + }; + }); } catch (error) { console.error('Error fetching data from IndexedDB:', error); throw error;