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. 21, 2018, 4:40 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..92e140c4d093cbb60e3e5c30b9d06ddd3784244b 100644
--- a/lib/ioIndexedDB.js
+++ b/lib/ioIndexedDB.js
@@ -157,23 +157,69 @@ function getObjectStore(dbInstance, storeName)
.objectStore(storeName);
}
+function reestablishConnection(dbInstance, retries)
+{
+ dbInstance.close();
+ retries = retries || 1;
+
+ return new Promise((resolve) =>
+ {
+ setTimeout(() =>
+ {
+ db = openDB(dbConfig);
+ return resolve(db);
+ }, 0);
Sebastian Noack 2018/08/21 20:26:25 Is this timeout necessary?
geo 2018/08/31 15:49:25 This part here is mostly from experimentation. If
Sebastian Noack 2018/08/31 18:07:04 Ok, let's stick with the delay then.
+ })
+ .catch(err =>
+ {
+ if (retries == 10)
+ return Promise.reject(err);
Sebastian Noack 2018/08/21 20:26:25 Nit: You can just throw the error in here. This wi
geo 2018/08/31 15:49:24 Done.
+
+ return reestablishConnection(dbInstance, ++retries);
+ });
+}
+
function getFile(fileName, dbInstance, storeName)
+{
+ return getFromIndexedDB(fileToKey(fileName), dbInstance, storeName)
+ .then(indexedDBResult =>
+ {
+ if (!indexedDBResult)
+ {
+ const {IndexedDBBackup} = require("./indexedDBBackup");
+
+ return IndexedDBBackup.getBackupData()
Sebastian Noack 2018/08/21 20:26:25 I wonder whether we also have to trigger the subsc
geo 2018/08/31 15:49:24 No need with the information we are currently savi
+ .then(backupData =>
+ saveFile(
+ {
+ fileName: fileToKey(fileName),
+ content: backupData.content,
+ lastModified: backupData.lastModified
+ },
+ dbInstance,
+ storeName)
+ .then(() => backupData));
+ }
+ return indexedDBResult;
+ });
+}
+
+function getFromIndexedDB(fileName, dbInstance, storeName)
{
return new Promise((resolve, reject) =>
{
let store = getObjectStore(dbInstance, storeName);
- let req = store.get(fileToKey(fileName));
-
- req.onsuccess = event =>
- {
- let {result} = event.currentTarget;
+ let req = store.get(fileName);
- 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());
Sebastian Noack 2018/08/21 20:26:25 Nit: This seems redundant.
geo 2018/08/31 15:49:25 I want this to resolve with `undefined` so that `g
Sebastian Noack 2018/08/31 18:07:04 I see, then this should be: .then(() => undefin
geo 2018/09/04 16:12:07 Done.
+ return Promise.reject(error);
Sebastian Noack 2018/08/21 20:26:25 Nit: See above.
geo 2018/08/31 15:49:25 Done.
});
}
@@ -185,7 +231,17 @@ 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));
+ }
+ return Promise.reject(error);
});
}
@@ -197,7 +253,17 @@ 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)
+ .then(() => Promise.resolve());
Sebastian Noack 2018/08/21 20:26:25 Nit: This seems redundant.
geo 2018/08/31 15:49:24 Done.
+ }
+
+ return Promise.reject(error);
Sebastian Noack 2018/08/21 20:26:25 Nit: See above.
geo 2018/08/31 15:49:25 Done.
});
}

Powered by Google App Engine
This is Rietveld