diff --git a/lib/hooks/user-identities-hooks.js b/lib/hooks/user-identities-hooks.js --- a/lib/hooks/user-identities-hooks.js +++ b/lib/hooks/user-identities-hooks.js @@ -4,10 +4,12 @@ import * as React from 'react'; import { useFindUserIdentities } from '../actions/find-user-identities-actions.js'; +import { logTypes, useDebugLogs } from '../components/debug-logs-context.js'; import { extractFIDFromUserID } from '../shared/id-utils.js'; import { IdentityClientContext } from '../shared/identity-client-context.js'; import type { FarcasterUser } from '../types/identity-service-types.js'; import type { AccountUserInfo } from '../types/user-types.js'; +import { getMessageForException } from '../utils/errors.js'; import { useSelector } from '../utils/redux-utils.js'; import { useIsFarcasterDCsIntegrationEnabled } from '../utils/services-utils.js'; @@ -154,9 +156,10 @@ function useGetCommFCUsersForFIDs(): GetCommFCUsersForFIDs { const auxUserInfos = useSelector(state => state.auxUserStore.auxUserInfos); const userInfos = useSelector(state => state.userStore.userInfos); + const { addLog } = useDebugLogs(); const identityClientContext = React.useContext(IdentityClientContext); - invariant(identityClientContext, 'NeynarClientContext is missing'); + invariant(identityClientContext, 'IdentityClientContext is missing'); const { identityClient } = identityClientContext; @@ -181,19 +184,30 @@ } if (unresolvedFIDs.size > 0) { - const fetchedInfos = await identityClient.getFarcasterUsers([ - ...unresolvedFIDs, - ]); - for (const fcUserInfo of fetchedInfos) { - fcUsers.set(fcUserInfo.farcasterID, fcUserInfo); - unresolvedFIDs.delete(fcUserInfo.farcasterID); + try { + const fetchedInfos = await identityClient.getFarcasterUsers([ + ...unresolvedFIDs, + ]); + for (const fcUserInfo of fetchedInfos) { + fcUsers.set(fcUserInfo.farcasterID, fcUserInfo); + unresolvedFIDs.delete(fcUserInfo.farcasterID); + } + } catch (error) { + addLog( + 'Farcaster: Failed to fetch users from Identity service', + JSON.stringify({ + unresolvedFIDsCount: unresolvedFIDs.size, + error: getMessageForException(error), + }), + new Set([logTypes.FARCASTER]), + ); } } unresolvedFIDs.forEach(missingFID => fcUsers.set(missingFID, undefined)); return fcUsers; }, - [userInfos, auxUserInfos, identityClient], + [userInfos, auxUserInfos, identityClient, addLog], ); } diff --git a/lib/shared/farcaster/farcaster-hooks.js b/lib/shared/farcaster/farcaster-hooks.js --- a/lib/shared/farcaster/farcaster-hooks.js +++ b/lib/shared/farcaster/farcaster-hooks.js @@ -775,8 +775,7 @@ +userIDs: Array, +newCursor?: ?string, }> => { - const result: Array = []; - const userIDs: Array = []; + const allFarcasterMessages: Array = []; const messageIDs = new Set(); let batchNumber = 0; @@ -843,41 +842,7 @@ break; } - const userFIDs = farcasterMessages.flatMap(message => - extractFarcasterIDsFromPayload( - farcasterMessageValidator, - message, - ), - ); - const fcUserInfos = await fetchUsersByFIDs(userFIDs); - - const rawMessageInfos = farcasterMessages.flatMap(message => - convertFarcasterMessageToCommMessages( - message, - fcUserInfos, - addLog, - ), - ); - - if (rawMessageInfos.length < farcasterMessages.length) { - addLog( - 'Farcaster: Some messages failed to convert', - JSON.stringify({ - conversationID, - farcasterMessages: farcasterMessages.length, - convertedMessages: rawMessageInfos.length, - batchNumber, - }), - new Set([logTypes.FARCASTER]), - ); - } - - userIDs.push( - ...Array.from(fcUserInfos.entries()).map( - ([fid, user]) => user?.userID ?? userIDFromFID(fid), - ), - ); - result.push(...rawMessageInfos); + allFarcasterMessages.push(...farcasterMessages); totalMessagesFetched += farcasterMessages.length; cursor = messagesResult.next?.cursor; @@ -900,9 +865,36 @@ new Set([logTypes.FARCASTER]), ); } + + const allUserFIDs = allFarcasterMessages.flatMap(message => + extractFarcasterIDsFromPayload(farcasterMessageValidator, message), + ); + + const fcUserInfos = await fetchUsersByFIDs(allUserFIDs); + + const result = allFarcasterMessages.flatMap(message => + convertFarcasterMessageToCommMessages(message, fcUserInfos, addLog), + ); + + if (result.length < allFarcasterMessages.length) { + addLog( + 'Farcaster: Some messages failed to convert', + JSON.stringify({ + conversationID, + farcasterMessages: allFarcasterMessages.length, + convertedMessages: result.length, + }), + new Set([logTypes.FARCASTER]), + ); + } + + const userIDs = Array.from(fcUserInfos.entries()).map( + ([fid, user]) => user?.userID ?? userIDFromFID(fid), + ); + return { messages: result, - userIDs: Array.from(new Set(userIDs)), + userIDs, newCursor: cursor, }; },