diff --git a/lib/components/debug-logs-context.js b/lib/components/debug-logs-context.js --- a/lib/components/debug-logs-context.js +++ b/lib/components/debug-logs-context.js @@ -12,6 +12,7 @@ OLM: 'olm', TUNNELBROKER: 'tunnelbroker', BACKUP: 'backup', + FARCASTER: 'farcaster', }); export type LogType = $Values; 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 @@ -19,6 +19,7 @@ type FarcasterMessage, farcasterMessageValidator, } from './farcaster-messages-types.js'; +import { logTypes, useDebugLogs } from '../../components/debug-logs-context.js'; import { useIsUserDataReady } from '../../hooks/backup-hooks.js'; import { useGetLatestMessageEdit } from '../../hooks/latest-message-edit.js'; import { useGetCommFCUsersForFIDs } from '../../hooks/user-identities-hooks.js'; @@ -40,6 +41,7 @@ import { extractFarcasterIDsFromPayload } from '../../utils/conversion-utils.js'; import { convertFarcasterMessageToCommMessages } from '../../utils/convert-farcaster-message-to-comm-messages.js'; import { createFarcasterRawThreadInfo } from '../../utils/create-farcaster-raw-thread-info.js'; +import { getMessageForException } from '../../utils/errors.js'; import { useCurrentUserSupportsDCs, useFarcasterDCsLoaded, @@ -256,6 +258,7 @@ ) => Promise { const fetchUsersByFIDs = useGetCommFCUsersForFIDs(); const fetchFarcasterConversation = useFetchFarcasterConversation(); + const { addLog } = useDebugLogs(); return React.useCallback( async ( @@ -292,11 +295,18 @@ return farcasterConversation; } catch (e) { - console.error(`Failed fetching conversation ${conversationID}:`, e); + addLog( + 'Farcaster: Failed to fetch conversation', + JSON.stringify({ + conversationID, + error: getMessageForException(e), + }), + new Set([logTypes.FARCASTER]), + ); return null; } }, - [fetchFarcasterConversation, fetchUsersByFIDs], + [addLog, fetchFarcasterConversation, fetchUsersByFIDs], ); } @@ -308,6 +318,7 @@ const fetchUsersByFIDs = useGetCommFCUsersForFIDs(); const fetchFarcasterConversation = useFetchFarcasterConversation(); const fetchFarcasterMessages = useFetchMessagesForConversation(); + const { addLog } = useDebugLogs(); return React.useCallback( async ( @@ -364,14 +375,24 @@ return farcasterConversation; } catch (e) { - console.error( - `Failed fetching conversation ${conversationID} with messages:`, - e, + addLog( + 'Farcaster: Failed to fetch conversation with messages', + JSON.stringify({ + conversationID, + messagesLimit, + error: getMessageForException(e), + }), + new Set([logTypes.FARCASTER]), ); return null; } }, - [fetchFarcasterConversation, fetchFarcasterMessages, fetchUsersByFIDs], + [ + addLog, + fetchFarcasterConversation, + fetchFarcasterMessages, + fetchUsersByFIDs, + ], ); } @@ -386,6 +407,7 @@ }> { const fetchFarcasterMessages = useFetchFarcasterMessages(); const fetchUsersByFIDs = useGetCommFCUsersForFIDs(); + const { addLog } = useDebugLogs(); return React.useCallback( async ( @@ -465,7 +487,16 @@ await sleep(0); } while (cursor && totalMessagesFetched < messagesNumberLimit); } catch (e) { - console.error(`Failed fetching messages for ${conversationID}:`, e); + addLog( + 'Farcaster: Failed to fetch messages', + JSON.stringify({ + conversationID, + messagesNumberLimit, + cursor, + error: getMessageForException(e), + }), + new Set([logTypes.FARCASTER]), + ); } return { messages: result, @@ -473,7 +504,7 @@ newCursor: cursor, }; }, - [fetchFarcasterMessages, fetchUsersByFIDs], + [addLog, fetchFarcasterMessages, fetchUsersByFIDs], ); } @@ -508,6 +539,7 @@ const dispatch = useDispatch(); const fetchConversationWithMessages = useFetchConversationWithMessages(); const setFarcasterDCsLoaded = useSetFarcasterDCsLoaded(); + const { addLog } = useDebugLogs(); const threadInfos = useSelector(state => state.threadStore.threadInfos); @@ -544,14 +576,22 @@ break; } } catch (e) { - console.error('Error fetching inbox', e); + addLog( + 'Farcaster: Failed to fetch inbox', + JSON.stringify({ + category: category || 'main', + cursor: currentCursor, + error: getMessageForException(e), + }), + new Set([logTypes.FARCASTER]), + ); break; } } return allConversations; }, - [fetchFarcasterInbox], + [addLog, fetchFarcasterInbox], ); const removeDeadThreads = React.useCallback( @@ -629,11 +669,18 @@ setFarcasterDCsLoaded(true); } catch (e) { - console.error('Error syncing Farcaster conversations', e); + addLog( + 'Farcaster: Failed to sync conversations', + JSON.stringify({ + error: getMessageForException(e), + }), + new Set([logTypes.FARCASTER]), + ); throw e; } }, [ + addLog, dispatch, fetchConversationWithMessages, fetchInboxes, diff --git a/lib/shared/timeouts.js b/lib/shared/timeouts.js --- a/lib/shared/timeouts.js +++ b/lib/shared/timeouts.js @@ -45,7 +45,7 @@ export const tunnelbrokerRequestTimeout = 10000; // in milliseconds // Client-side timeout duration for certain Farcaster requests. -export const farcasterRequestTimeout = 5000; // in milliseconds +export const farcasterRequestTimeout = 30000; // in milliseconds // This controls how long the client waits before trying to reconnect a // disconnected Tunnelbroker socket. diff --git a/web/settings/debug-logs-modal.css b/web/settings/debug-logs-modal.css --- a/web/settings/debug-logs-modal.css +++ b/web/settings/debug-logs-modal.css @@ -1,7 +1,7 @@ .container { display: flex; flex-direction: column; - height: 60vh; + height: 80vh; gap: 8px; }