diff --git a/lib/components/peer-olm-session-creator-provider.react.js b/lib/components/peer-olm-session-creator-provider.react.js --- a/lib/components/peer-olm-session-creator-provider.react.js +++ b/lib/components/peer-olm-session-creator-provider.react.js @@ -4,12 +4,14 @@ import * as React from 'react'; import { useOlmDebugLogs } from './debug-logs-context.js'; +import { getPeersDeadDeviceIDs } from '../selectors/user-selectors.js'; import { IdentityClientContext } from '../shared/identity-client-context.js'; import { useTunnelbroker } from '../tunnelbroker/tunnelbroker-context.js'; import { createOlmSessionsWithUser, type DeviceSessionCreationRequest, } from '../utils/crypto-utils.js'; +import { useSelector } from '../utils/redux-utils.js'; export type CreateOlmSessionsWithUser = ( userID: string, @@ -40,6 +42,8 @@ const olmDebugLog = useOlmDebugLogs(); + const deadDevices = useSelector(getPeersDeadDeviceIDs); + const createOlmSessionsWithUserCallback = React.useCallback( async ( userID: string, @@ -51,7 +55,9 @@ } const filteredDevices = devices.filter( - request => !runningPromises.current[userID][request.deviceID], + request => + !runningPromises.current[userID][request.deviceID] && + !deadDevices.has(request.deviceID), ); const promise = (async () => { @@ -84,7 +90,13 @@ await Promise.all(promises); }, - [getAuthMetadata, identityClient, olmDebugLog, sendMessageToDevice], + [ + deadDevices, + getAuthMetadata, + identityClient, + olmDebugLog, + sendMessageToDevice, + ], ); const peerOlmSessionCreatorContextValue: PeerOlmSessionCreatorContextType = diff --git a/lib/selectors/user-selectors.js b/lib/selectors/user-selectors.js --- a/lib/selectors/user-selectors.js +++ b/lib/selectors/user-selectors.js @@ -328,6 +328,20 @@ ), ); +const getPeersDeadDeviceIDs: (state: BaseAppState<>) => Set = + createSelector( + (state: BaseAppState<>) => state.auxUserStore.auxUserInfos, + (auxUserInfos: AuxUserInfos) => + new Set( + values(auxUserInfos).flatMap(auxUserInfo => { + const deviceList = auxUserInfo.deviceList?.devices ?? []; + return deviceList.filter( + deviceID => !auxUserInfo.devicesPlatformDetails?.[deviceID], + ); + }), + ), + ); + const getPeersPrimaryDeviceIDs: (state: BaseAppState<>) => { +[userID: string]: ?string, } = createSelector( @@ -366,6 +380,7 @@ getKeyserverDeviceID, getAllPeerDevices, getAllPeerUserIDAndDeviceIDs, + getPeersDeadDeviceIDs, getPeersPrimaryDeviceIDs, getOwnPrimaryDeviceID, getOwnRawDeviceList,