diff --git a/lib/backup/user-data-restore-context.js b/lib/backup/user-data-restore-context.js --- a/lib/backup/user-data-restore-context.js +++ b/lib/backup/user-data-restore-context.js @@ -14,10 +14,12 @@ import { generateOpsToEstablishHoldersOnDevice } from '../actions/holder-actions.js'; import { logTypes, useDebugLogs } from '../components/debug-logs-context.js'; import { IdentityClientContext } from '../shared/identity-client-context.js'; +import { useIsCurrentUserStaff } from '../shared/staff-utils.js'; import { restoreUserDataStepsOrder } from '../types/backup-types.js'; import { databaseIdentifier } from '../types/database-identifier-types.js'; import type { QRAuthBackupData } from '../types/tunnelbroker/qr-code-auth-message-types.js'; import { getConfig } from '../utils/config.js'; +import { isDev } from '../utils/dev-utils.js'; import { BackupIsNewerError } from '../utils/errors.js'; import { withAuthMetadataOverride } from '../utils/identity-service.js'; import { useDispatchActionPromise } from '../utils/redux-promise-utils.js'; @@ -48,6 +50,7 @@ const { addLog } = useDebugLogs(); const restoreBackupState = useSelector(state => state.restoreBackupState); const identityContext = React.useContext(IdentityClientContext); + const isCurrentUserStaff = useIsCurrentUserStaff(); invariant(identityContext, 'Identity client context not set'); const executeRestoreUserData = React.useCallback( @@ -59,6 +62,20 @@ ) => { const { sqliteAPI } = getConfig(); + const stepTimings: Array<{ step: string, duration: number }> = []; + + const measureStepTime = async ( + stepName: string, + stepPromise: Promise, + ): Promise => { + const startTime = performance.now(); + const result = await stepPromise; + const endTime = performance.now(); + const duration = endTime - startTime; + stepTimings.push({ step: stepName, duration }); + return result; + }; + // Determine starting step based on current state let startStepIndex = 0; @@ -103,7 +120,7 @@ undefined, { step: 'restore_database' }, ); - await restoreUserDataPromise; + await measureStepTime('restore_database', restoreUserDataPromise); } // 2. Check database versions and migrate if needed @@ -154,7 +171,10 @@ undefined, { step: 'migrate_backup_schema' }, ); - await migrateBackupSchemaPromise; + await measureStepTime( + 'migrate_backup_schema', + migrateBackupSchemaPromise, + ); } // 3. Check store versions and migrate if needed @@ -206,7 +226,10 @@ undefined, { step: 'run_restored_backup_migrations' }, ); - await runRestoredMigrationsPromise; + await measureStepTime( + 'run_restored_backup_migrations', + runRestoredMigrationsPromise, + ); } // 4. Assign holders for the new device @@ -230,7 +253,7 @@ undefined, { step: 'assign_new_holders' }, ); - await assignHoldersPromise; + await measureStepTime('assign_new_holders', assignHoldersPromise); } // 5. Remove local message infos @@ -246,7 +269,10 @@ undefined, { step: 'remove_local_message_infos' }, ); - await removeLocalMessageInfosPromise; + await measureStepTime( + 'remove_local_message_infos', + removeLocalMessageInfosPromise, + ); } // 6. Update peer device lists @@ -280,7 +306,7 @@ undefined, { step: 'update_peers' }, ); - await updatePeersPromise; + await measureStepTime('update_peers', updatePeersPromise); } // 7. Copy content to main database @@ -292,7 +318,10 @@ undefined, { step: 'copy_content_from_backup_db' }, ); - await copyContentPromise; + await measureStepTime( + 'copy_content_from_backup_db', + copyContentPromise, + ); } // 8. Populate store @@ -301,6 +330,23 @@ userID, ); + if ((isCurrentUserStaff || isDev) && stepTimings.length > 0) { + const totalTime = stepTimings.reduce( + (sum, timing) => sum + timing.duration, + 0, + ); + const timingDetails = stepTimings + .map( + ({ step, duration }) => `${step}: ${(duration / 1000).toFixed(2)}s`, + ) + .join('\n'); + + getConfig().showAlert( + 'Restore Timing Summary:', + `${timingDetails}\n\nTotal: ${(totalTime / 1000).toFixed(2)}s`, + ); + } + dispatch({ type: setClientDBStoreActionType, payload: clientDBStore, @@ -311,6 +357,7 @@ dispatch, dispatchActionPromise, identityContext, + isCurrentUserStaff, restoreBackupState, ], );