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 @@ -40,6 +40,7 @@ import type { GetCommFCUsersForFIDs } from '../../hooks/user-identities-hooks.js'; import { isLoggedIn } from '../../selectors/user-selectors.js'; import { useTunnelbroker } from '../../tunnelbroker/tunnelbroker-context.js'; +import type { FarcasterUser } from '../../types/identity-service-types.js'; import { messageTypes } from '../../types/message-types-enum.js'; import type { RawMessageInfo } from '../../types/message-types.js'; import { @@ -776,8 +777,8 @@ +newCursor?: ?string, }> => { const result: Array = []; - const userIDs: Array = []; const messageIDs = new Set(); + const identityCache = new Map(); let batchNumber = 0; try { @@ -849,12 +850,22 @@ message, ), ); - const fcUserInfos = await fetchUsersByFIDs(userFIDs); + + const uncachedFIDs = userFIDs.filter( + fid => !identityCache.has(`${fid}`), + ); + + if (uncachedFIDs.length > 0) { + const fetchedUserInfos = await fetchUsersByFIDs(uncachedFIDs); + for (const [fid, user] of fetchedUserInfos.entries()) { + identityCache.set(fid, user); + } + } const rawMessageInfos = farcasterMessages.flatMap(message => convertFarcasterMessageToCommMessages( message, - fcUserInfos, + identityCache, addLog, ), ); @@ -872,11 +883,6 @@ ); } - userIDs.push( - ...Array.from(fcUserInfos.entries()).map( - ([fid, user]) => user?.userID ?? userIDFromFID(fid), - ), - ); result.push(...rawMessageInfos); totalMessagesFetched += farcasterMessages.length; @@ -900,6 +906,10 @@ new Set([logTypes.FARCASTER]), ); } + + const userIDs = Array.from(identityCache.entries()).map( + ([fid, user]) => user?.userID ?? userIDFromFID(fid), + ); return { messages: result, userIDs: Array.from(new Set(userIDs)),