diff --git a/lib/components/secondary-device-qr-auth-context-provider.react.js b/lib/components/secondary-device-qr-auth-context-provider.react.js --- a/lib/components/secondary-device-qr-auth-context-provider.react.js +++ b/lib/components/secondary-device-qr-auth-context-provider.react.js @@ -28,6 +28,7 @@ import { getContentSigningKey } from '../utils/crypto-utils.js'; import { getMessageForException } from '../utils/errors.js'; import { useSelector } from '../utils/redux-utils.js'; +import { waitUntilDatabaseReady } from '../utils/wait-until-db-deleted.js'; type Props = { +children: React.Node, @@ -88,6 +89,8 @@ const identityClient = identityContext?.identityClient; const openSecondaryQRAuth = React.useCallback(async () => { + await waitUntilDatabaseReady(); + const [ed25519, rawAESKey] = await Promise.all([ getContentSigningKey(), generateAESKey(), diff --git a/lib/utils/wait-until-db-deleted.js b/lib/utils/wait-until-db-deleted.js --- a/lib/utils/wait-until-db-deleted.js +++ b/lib/utils/wait-until-db-deleted.js @@ -1,5 +1,24 @@ // @flow +type DatabaseResetStatus = 'RESET_IN_PROGRESS' | 'READY'; + +const databaseResetStatus = Object.freeze({ + RESET_IN_PROGRESS: 'RESET_IN_PROGRESS', + READY: 'READY', +}); + +let currentDatabaseStatus: DatabaseResetStatus = 'READY'; + +async function waitUntilDatabaseReady() { + if (currentDatabaseStatus !== databaseResetStatus.READY) { + await waitUntilDatabaseDeleted(); + } +} + +function setDatabaseResetStatus(newStatus: DatabaseResetStatus) { + currentDatabaseStatus = newStatus; +} + let waitingOnDatabaseDeletion = []; function waitUntilDatabaseDeleted(): Promise { @@ -17,4 +36,10 @@ } } -export { waitUntilDatabaseDeleted, reportDatabaseDeleted }; +export { + databaseResetStatus, + setDatabaseResetStatus, + waitUntilDatabaseReady, + waitUntilDatabaseDeleted, + reportDatabaseDeleted, +}; diff --git a/native/data/sqlite-data-handler.js b/native/data/sqlite-data-handler.js --- a/native/data/sqlite-data-handler.js +++ b/native/data/sqlite-data-handler.js @@ -30,7 +30,11 @@ import { useDispatchActionPromise } from 'lib/utils/redux-promise-utils.js'; import { useDispatch } from 'lib/utils/redux-utils.js'; import { supportingMultipleKeyservers } from 'lib/utils/services-utils.js'; -import { reportDatabaseDeleted } from 'lib/utils/wait-until-db-deleted.js'; +import { + reportDatabaseDeleted, + databaseResetStatus, + setDatabaseResetStatus, +} from 'lib/utils/wait-until-db-deleted.js'; import { resolveKeyserverSessionInvalidationUsingNativeCredentials } from '../account/legacy-recover-keyserver-session.js'; import { authoritativeKeyserverID } from '../authoritative-keyserver.js'; @@ -44,7 +48,9 @@ async function clearSensitiveData() { try { + setDatabaseResetStatus(databaseResetStatus.RESET_IN_PROGRESS); await commCoreModule.clearSensitiveData(); + setDatabaseResetStatus(databaseResetStatus.READY); reportDatabaseDeleted(); } catch (error) { console.log( diff --git a/web/shared-worker/sqlite-data-handler.js b/web/shared-worker/sqlite-data-handler.js --- a/web/shared-worker/sqlite-data-handler.js +++ b/web/shared-worker/sqlite-data-handler.js @@ -5,7 +5,11 @@ import { shouldClearData } from 'lib/shared/data-utils.js'; import { getMessageForException } from 'lib/utils/errors.js'; import { useDispatch } from 'lib/utils/redux-utils.js'; -import { reportDatabaseDeleted } from 'lib/utils/wait-until-db-deleted.js'; +import { + reportDatabaseDeleted, + databaseResetStatus, + setDatabaseResetStatus, +} from 'lib/utils/wait-until-db-deleted.js'; import { getCommSharedWorker } from './shared-worker-provider.js'; import { useSelector } from '../redux/redux-utils.js'; @@ -43,7 +47,9 @@ shouldClearData(sqliteStampedUserID, currentLoggedInUserID) ) { try { + setDatabaseResetStatus(databaseResetStatus.RESET_IN_PROGRESS); await sharedWorker.init({ clearDatabase: true }); + setDatabaseResetStatus(databaseResetStatus.READY); reportDatabaseDeleted(); } catch (error) { console.error(