Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code

Unified Diff: lib/ioIndexedDB.js

Issue 29860578: Issue 6775 - Work around filter data stored in IndexedDB getting lost on Microsoft Edge (Closed)
Patch Set: Created Aug. 31, 2018, 3:36 p.m.
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: lib/ioIndexedDB.js
diff --git a/lib/ioIndexedDB.js b/lib/ioIndexedDB.js
index 5ffb55e4d2186207e760ccb35ba3ec8dfb8a0d21..59a5df57b21714101b7db1f6f3c604de7d2b0420 100644
--- a/lib/ioIndexedDB.js
+++ b/lib/ioIndexedDB.js
@@ -157,23 +157,61 @@ function getObjectStore(dbInstance, storeName)
.objectStore(storeName);
}
+function reestablishConnection(dbInstance, retries)
+{
+ dbInstance.close();
+ retries = retries || 1;
Sebastian Noack 2018/08/31 18:07:05 You can use default arguments. Also I would rather
geo 2018/09/04 16:12:08 Done.
+ db = openDB(dbConfig);
+
+ return db.catch(err =>
+ {
+ if (retries == 10)
+ throw err;
+
+ return reestablishConnection(dbInstance, ++retries);
+ });
+}
+
function getFile(fileName, dbInstance, storeName)
+{
+ return getFromIndexedDB(fileToKey(fileName), dbInstance, storeName)
+ .then(indexedDBResult =>
+ {
+ if (!indexedDBResult)
+ {
+ const {IndexedDBBackup} = require("./indexedDBBackup");
Sebastian Noack 2018/08/31 18:07:05 Nit: Can this import be moved to the top of the mo
geo 2018/09/04 16:12:08 Yes, we end up with a circular dependency, as inde
+
+ return IndexedDBBackup.getBackupData()
+ .then(backupData =>
+ saveFile(
+ {
+ fileName: fileToKey(fileName),
+ content: backupData.content,
+ lastModified: backupData.lastModified
+ },
+ dbInstance,
+ storeName)
+ .then(() => backupData));
Sebastian Noack 2018/08/31 18:07:05 Nit: The indentation is a little off here: .the
geo 2018/09/04 16:12:08 I've changed a bit the indentation, hopefully it's
+ }
+ return indexedDBResult;
+ });
+}
+
+function getFromIndexedDB(fileName, dbInstance, storeName)
{
return new Promise((resolve, reject) =>
{
let store = getObjectStore(dbInstance, storeName);
- let req = store.get(fileToKey(fileName));
+ let req = store.get(fileName);
- req.onsuccess = event =>
- {
- let {result} = event.currentTarget;
-
- if (result)
- resolve(result);
- else
- reject({type: "NoSuchFile"});
- };
- req.onerror = reject;
+ req.onsuccess = event => resolve(event.currentTarget.result);
+ req.onerror = event => reject(event.target.error);
+ })
+ .catch(error =>
+ {
+ if (error.name == "UnknownError")
+ return reestablishConnection(dbInstance)
+ .then(() => Promise.resolve());
});
}
@@ -185,7 +223,16 @@ function saveFile(data, dbInstance, storeName)
let req = store.put(data);
req.onsuccess = resolve;
- req.onerror = reject;
+ req.onerror = event => reject(event.target.error);
+ })
+ .catch(error =>
+ {
+ if (error.name == "UnknownError")
+ {
+ return reestablishConnection(dbInstance)
+ .then(newDbInstance =>
+ saveFile(data, newDbInstance, storeName));
Sebastian Noack 2018/08/31 18:07:05 Nit: For consistent with other code, can you inden
geo 2018/09/04 16:12:08 Done.
+ }
});
}
@@ -197,7 +244,12 @@ function deleteFile(fileName, dbInstance, storeName)
let req = store.delete(fileToKey(fileName));
req.onsuccess = resolve;
- req.onerror = reject;
+ req.onerror = event => reject(event.target.error);
+ })
+ .catch(error =>
+ {
+ if (error.name == "UnknownError")
+ return reestablishConnection(dbInstance);
});
}
« lib/indexedDBBackup.js ('K') | « lib/indexedDBBackup.js ('k') | metadata.edge » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld