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 @@ -6,6 +6,7 @@ import * as React from 'react'; import uuid from 'uuid'; +import { useConfirmPeerToPeerMessage } from './use-confirm-peer-to-peer-message.js'; import { useResendPeerToPeerMessages, useResendP2PMessagesToNewPrimaryDevices, @@ -112,6 +113,22 @@ const setLocalDCsSupport = useSetLocalCurrentUserSupportsDCs(); const clearFarcasterThreads = useClearFarcasterThreads(); const syncFarcasterConversations = useFarcasterConversationsSync(); + const confirmPeerToPeerMessage = useConfirmPeerToPeerMessage(); + + const removeAndConfirmMessage = React.useCallback( + async (messageID: string, senderDeviceID: string) => { + const { sqliteAPI } = getConfig(); + + await Promise.all([ + sqliteAPI.removeInboundP2PMessages([messageID]), + confirmPeerToPeerMessage({ + senderDeviceID, + messageID, + }), + ]); + }, + [confirmPeerToPeerMessage], + ); const fullBackupSupport = useFullBackupSupportEnabled(); @@ -188,7 +205,7 @@ type: removePeerUsersActionType, payload: { updatesResult: { newUpdates: [deleteUserUpdate] } }, }); - await sqliteAPI.removeInboundP2PMessages([messageID]); + await removeAndConfirmMessage(messageID, senderInfo.deviceID); } } else if ( userActionMessage.type === userActionsP2PMessageTypes.BACKUP_DATA @@ -214,7 +231,7 @@ console.warn( 'Received backup data but backup action should be ignored', ); - await sqliteAPI.removeInboundP2PMessages([messageID]); + await removeAndConfirmMessage(messageID, senderInfo.deviceID); return; } @@ -223,7 +240,7 @@ if (userID !== currentUserID) { console.warn('Received backup data from wrong user'); - await sqliteAPI.removeInboundP2PMessages([messageID]); + await removeAndConfirmMessage(messageID, senderInfo.deviceID); return; } @@ -234,7 +251,7 @@ try { await userDataRestore(false, userID, accessToken, backupData); } finally { - await sqliteAPI.removeInboundP2PMessages([messageID]); + await removeAndConfirmMessage(messageID, senderInfo.deviceID); } } else if ( userActionMessage.type === @@ -242,10 +259,14 @@ ) { setLocalFID(userActionMessage.farcasterID); setLocalDCsSupport(userActionMessage.hasDCsToken); - if (!userActionMessage.hasDCsToken) { - clearFarcasterThreads(); - } else { - await syncFarcasterConversations(Number.POSITIVE_INFINITY); + try { + if (!userActionMessage.hasDCsToken) { + clearFarcasterThreads(); + } else { + await syncFarcasterConversations(Number.POSITIVE_INFINITY); + } + } finally { + await removeAndConfirmMessage(messageID, senderInfo.deviceID); } } else { console.warn( @@ -255,20 +276,22 @@ } }, [ - dispatch, dispatchActionPromise, - getAuthMetadata, primaryDeviceRequestedLogOut, + runDeviceListUpdate, processDMOperation, + getAuthMetadata, reBroadcastAccountDeletion, - restoreBackupState, - runDeviceListUpdate, - setLocalDCsSupport, - setLocalFID, - userDataRestore, + dispatch, fullBackupSupport, + restoreBackupState.status, + restoreBackupState.payload.forced, + userDataRestore, + setLocalFID, + setLocalDCsSupport, clearFarcasterThreads, syncFarcasterConversations, + removeAndConfirmMessage, ], ); }