diff --git a/lib/tunnelbroker/use-peer-to-peer-message-handler.js b/lib/tunnelbroker/use-peer-to-peer-message-handler.js --- a/lib/tunnelbroker/use-peer-to-peer-message-handler.js +++ b/lib/tunnelbroker/use-peer-to-peer-message-handler.js @@ -196,9 +196,19 @@ return; } - if (restoreBackupState.status !== 'no_backup') { + // Device should attempt to restore in two cases: + // 1. No backup, first restore ever. + // 2. Restore wasn't concluded, and the user decided to proceed. + // This could happen when adding a secondary with backup support on + // a primary that hasn't uploaded its first backup yet. + const needsRestore = + restoreBackupState.status === 'no_backup' || + (restoreBackupState.status === 'user_data_restore_completed' && + restoreBackupState.payload.forced); + + if (!needsRestore) { console.warn( - 'Received backup data but backup action was already dispatched', + 'Received backup data but backup action should be ignored', ); await sqliteAPI.removeInboundP2PMessages([messageID]); return; @@ -217,9 +227,11 @@ return; } - await userDataRestore(false, userID, accessToken, backupData); - - await sqliteAPI.removeInboundP2PMessages([messageID]); + try { + await userDataRestore(false, userID, accessToken, backupData); + } finally { + await sqliteAPI.removeInboundP2PMessages([messageID]); + } } else if ( userActionMessage.type === userActionsP2PMessageTypes.FARCASTER_CONNECTION_UPDATED @@ -240,7 +252,7 @@ primaryDeviceRequestedLogOut, processDMOperation, reBroadcastAccountDeletion, - restoreBackupState.status, + restoreBackupState, runDeviceListUpdate, setLocalDCsSupport, setLocalFID,