diff --git a/src/utils/StorageManager.js b/src/utils/StorageManager.js index 472e1c93d4..89fa0d290b 100644 --- a/src/utils/StorageManager.js +++ b/src/utils/StorageManager.js @@ -15,6 +15,7 @@ limitations under the License. */ import Matrix from 'matrix-js-sdk'; +import LocalStorageCryptoStore from 'matrix-js-sdk/lib/crypto/store/localStorage-crypto-store'; import Analytics from '../Analytics'; const localStorage = window.localStorage; @@ -61,15 +62,9 @@ export async function checkConsistency() { } if (indexedDB && localStorage) { - try { - const dataInSyncStore = await Matrix.IndexedDBStore.exists( - indexedDB, SYNC_STORE_NAME, - ); - log(`Sync store contains data? ${dataInSyncStore}`); - } catch (e) { + const results = await checkSyncStore(); + if (!results.healthy) { healthy = false; - error("Sync store inaccessible", e); - track("Sync store inaccessible"); } } else { healthy = false; @@ -78,15 +73,10 @@ export async function checkConsistency() { } if (indexedDB) { - try { - dataInCryptoStore = await Matrix.IndexedDBCryptoStore.exists( - indexedDB, CRYPTO_STORE_NAME, - ); - log(`Crypto store contains data? ${dataInCryptoStore}`); - } catch (e) { + const results = await checkCryptoStore(); + dataInCryptoStore = results.exists; + if (!results.healthy) { healthy = false; - error("Crypto store inaccessible", e); - track("Crypto store inaccessible"); } } else { healthy = false; @@ -111,3 +101,43 @@ export async function checkConsistency() { track("Consistency checks failed"); } } + +async function checkSyncStore() { + let exists = false; + try { + exists = await Matrix.IndexedDBStore.exists( + indexedDB, SYNC_STORE_NAME, + ); + log(`Sync store using IndexedDB contains data? ${exists}`); + return { exists, healthy: true }; + } catch (e) { + error("Sync store using IndexedDB inaccessible", e); + track("Sync store using IndexedDB inaccessible"); + } + log("Sync store using memory only"); + return { exists, healthy: false }; +} + +async function checkCryptoStore() { + let exists = false; + try { + exists = await Matrix.IndexedDBCryptoStore.exists( + indexedDB, CRYPTO_STORE_NAME, + ); + log(`Crypto store using IndexedDB contains data? ${exists}`); + return { exists, healthy: true }; + } catch (e) { + error("Crypto store using IndexedDB inaccessible", e); + track("Crypto store using IndexedDB inaccessible"); + } + try { + exists = await LocalStorageCryptoStore.exists(localStorage); + log(`Crypto store using local storage contains data? ${exists}`); + return { exists, healthy: true }; + } catch (e) { + error("Crypto store using local storage inaccessible", e); + track("Crypto store using local storage inaccessible"); + } + log("Crypto store using memory only"); + return { exists, healthy: false }; +}