Page Menu
Home
Phorge
Search
Configure Global Search
Log In
Files
F32185818
D15311.1765084115.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Flag For Later
Award Token
Size
14 KB
Referenced Files
None
Subscribers
None
D15311.1765084115.diff
View Options
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
@@ -8,6 +8,7 @@
type ProcessFarcasterOpsPayload,
} from './farcaster-actions.js';
import {
+ type FetchFarcasterConversationResult,
useFetchFarcasterConversation,
useFetchFarcasterInbox,
useFetchFarcasterMessages,
@@ -19,9 +20,17 @@
} from './farcaster-messages-types.js';
import { useIsUserDataReady } from '../../hooks/backup-hooks.js';
import { useGetCommFCUsersForFIDs } from '../../hooks/user-identities-hooks.js';
+import type { GetCommFCUsersForFIDs } from '../../hooks/user-identities-hooks.js';
import { isLoggedIn } from '../../selectors/user-selectors.js';
import type { RawMessageInfo } from '../../types/message-types.js';
-import { messageTruncationStatus } from '../../types/message-types.js';
+import {
+ messageTruncationStatus,
+ defaultNumberPerThread,
+} from '../../types/message-types.js';
+import type {
+ MemberInfoSansPermissions,
+ FarcasterRawThreadInfo,
+} from '../../types/minimally-encoded-thread-permissions-types';
import type { Dispatch } from '../../types/redux-types.js';
import { updateTypes } from '../../types/update-types-enum.js';
import type { ClientUpdateInfo } from '../../types/update-types.js';
@@ -190,6 +199,52 @@
return results;
}
+type ConversationFetchResult = {
+ +farcasterConversation: FarcasterConversation,
+ +thread: FarcasterRawThreadInfo,
+ +threadMembers: Array<MemberInfoSansPermissions>,
+};
+async function fetchAndProcessConversation(
+ conversationID: string,
+ fetchFarcasterConversation: (input: {
+ conversationId: string,
+ }) => Promise<?FetchFarcasterConversationResult>,
+ fetchUsersByFIDs: GetCommFCUsersForFIDs,
+): Promise<?ConversationFetchResult> {
+ const conversationResult = await withRetry(
+ () =>
+ fetchFarcasterConversation({
+ conversationId: conversationID,
+ }),
+ MAX_RETRIES,
+ RETRY_DELAY_MS,
+ );
+
+ if (!conversationResult) {
+ return null;
+ }
+
+ const farcasterConversation = conversationResult.result.conversation;
+ let thread = createFarcasterRawThreadInfo(farcasterConversation);
+ const fids = thread.members.map(member => member.id);
+ const commFCUsersForFIDs = await fetchUsersByFIDs(fids);
+ const threadMembers = thread.members.map(
+ member =>
+ ({
+ ...member,
+ id:
+ commFCUsersForFIDs.get(member.id)?.userID ?? userIDFromFID(member.id),
+ }: MemberInfoSansPermissions),
+ );
+
+ thread = {
+ ...thread,
+ members: threadMembers,
+ };
+
+ return { farcasterConversation, thread, threadMembers };
+}
+
function useFetchConversationWithBatching(): (
conversationID: string,
batchedUpdates: BatchedUpdates,
@@ -203,34 +258,17 @@
batchedUpdates: BatchedUpdates,
): Promise<?FarcasterConversation> => {
try {
- const conversationResult = await withRetry(
- () =>
- fetchFarcasterConversation({
- conversationId: conversationID,
- }),
- MAX_RETRIES,
- RETRY_DELAY_MS,
+ const result = await fetchAndProcessConversation(
+ conversationID,
+ fetchFarcasterConversation,
+ fetchUsersByFIDs,
);
- if (!conversationResult) {
+ if (!result) {
return null;
}
- const farcasterConversation = conversationResult.result.conversation;
- let thread = createFarcasterRawThreadInfo(farcasterConversation);
- const fids = thread.members.map(member => member.id);
- const commFCUsersForFIDs = await fetchUsersByFIDs(fids);
- const threadMembers = thread.members.map(member => ({
- ...member,
- id:
- commFCUsersForFIDs.get(member.id)?.userID ??
- userIDFromFID(member.id),
- }));
-
- thread = {
- ...thread,
- members: threadMembers,
- };
+ const { farcasterConversation, thread, threadMembers } = result;
const update = {
type: updateTypes.JOIN_THREAD,
@@ -257,11 +295,88 @@
);
}
+function useFetchConversationWithMessages(): (
+ conversationID: string,
+ messagesLimit: number,
+ batchedUpdates: BatchedUpdates,
+) => Promise<?FarcasterConversation> {
+ const fetchUsersByFIDs = useGetCommFCUsersForFIDs();
+ const fetchFarcasterConversation = useFetchFarcasterConversation();
+ const fetchFarcasterMessages = useFetchMessagesForConversation();
+
+ return React.useCallback(
+ async (
+ conversationID: string,
+ messagesLimit: number,
+ batchedUpdates: BatchedUpdates,
+ ): Promise<?FarcasterConversation> => {
+ try {
+ const result = await fetchAndProcessConversation(
+ conversationID,
+ fetchFarcasterConversation,
+ fetchUsersByFIDs,
+ );
+
+ if (!result) {
+ return null;
+ }
+
+ const { farcasterConversation, thread, threadMembers } = result;
+
+ if (threadMembers.length > 0) {
+ threadMembers.forEach(member => batchedUpdates.addUserID(member.id));
+ }
+
+ const messagesResult = await fetchFarcasterMessages(
+ conversationID,
+ messagesLimit,
+ );
+ batchedUpdates.addUserIDs(messagesResult.userIDs);
+
+ const reduxMessages = messagesResult.messages.slice(
+ 0,
+ defaultNumberPerThread,
+ );
+ const dbMessages = messagesResult.messages.slice(
+ defaultNumberPerThread,
+ );
+ const truncationStatus =
+ dbMessages.length > 0
+ ? messageTruncationStatus.UNCHANGED
+ : messageTruncationStatus.EXHAUSTIVE;
+ batchedUpdates.addAdditionalMessageInfos(dbMessages);
+
+ const update = {
+ type: updateTypes.JOIN_THREAD,
+ id: uuid.v4(),
+ time: thread.creationTime,
+ threadInfo: thread,
+ rawMessageInfos: reduxMessages,
+ truncationStatus,
+ rawEntryInfos: [],
+ };
+ batchedUpdates.addUpdateInfo(update);
+
+ return farcasterConversation;
+ } catch (e) {
+ console.error(
+ `Failed fetching conversation ${conversationID} with messages:`,
+ e,
+ );
+ return null;
+ }
+ },
+ [fetchFarcasterConversation, fetchFarcasterMessages, fetchUsersByFIDs],
+ );
+}
+
function useFetchMessagesForConversation(): (
conversationID: string,
messagesNumberLimit?: number,
- batchedUpdates: BatchedUpdates,
-) => Promise<void> {
+) => Promise<{
+ +messages: Array<RawMessageInfo>,
+ +userIDs: Array<string>,
+}> {
const fetchFarcasterMessages = useFetchFarcasterMessages();
const fetchUsersByFIDs = useGetCommFCUsersForFIDs();
@@ -269,15 +384,19 @@
async (
conversationID: string,
messagesNumberLimit: number = 20,
- batchedUpdates: BatchedUpdates,
- ): Promise<void> => {
+ ): Promise<{
+ +messages: Array<RawMessageInfo>,
+ +userIDs: Array<string>,
+ }> => {
+ const result: Array<RawMessageInfo> = [];
+ const userIDs: Array<string> = [];
try {
let cursor: ?string = null;
let totalMessagesFetched = 0;
do {
const batchLimit = Math.min(
- 20,
+ 50,
messagesNumberLimit - totalMessagesFetched,
);
@@ -312,18 +431,12 @@
convertFarcasterMessageToCommMessages(message, fcUserInfos),
);
- if (fcUserInfos.size > 0) {
- Array.from(fcUserInfos.entries()).forEach(([fid, user]) =>
- batchedUpdates.addUserID(user?.userID ?? userIDFromFID(fid)),
- );
- }
- if (rawMessageInfos.length > 0) {
- if (totalMessagesFetched === 0) {
- batchedUpdates.addMessageInfos(rawMessageInfos);
- } else {
- batchedUpdates.addAdditionalMessageInfos(rawMessageInfos);
- }
- }
+ userIDs.push(
+ ...Array.from(fcUserInfos.entries()).map(
+ ([fid, user]) => user?.userID ?? userIDFromFID(fid),
+ ),
+ );
+ result.push(...rawMessageInfos);
totalMessagesFetched += farcasterMessages.length;
cursor = messagesResult.next?.cursor;
@@ -336,6 +449,10 @@
} catch (e) {
console.error(`Failed fetching messages for ${conversationID}:`, e);
}
+ return {
+ messages: result,
+ userIDs: Array.from(new Set(userIDs)),
+ };
},
[fetchFarcasterMessages, fetchUsersByFIDs],
);
@@ -344,16 +461,14 @@
function useRefreshFarcasterConversation(): (
conversationID: string,
) => Promise<void> {
- const fetchConversation = useFetchConversationWithBatching();
- const fetchMessagesForConversation = useFetchMessagesForConversation();
+ const fetchConversationWithMessages = useFetchConversationWithMessages();
const dispatch = useDispatch();
return React.useCallback(
async (conversationID: string) => {
const batchedUpdates = new BatchedUpdates();
- await fetchConversation(conversationID, batchedUpdates);
- await fetchMessagesForConversation(conversationID, 20, batchedUpdates);
+ await fetchConversationWithMessages(conversationID, 20, batchedUpdates);
if (!batchedUpdates.isEmpty()) {
dispatch({
@@ -362,22 +477,17 @@
});
}
},
- [fetchConversation, fetchMessagesForConversation, dispatch],
+ [fetchConversationWithMessages, dispatch],
);
}
function useFarcasterConversationsSync(): (
limit: number,
- onProgress?: (
- completed: number,
- total: number,
- phase: 'conversations' | 'messages',
- ) => void,
+ onProgress?: (completed: number, total: number) => void,
) => Promise<void> {
const fetchFarcasterInbox = useFetchFarcasterInbox();
const dispatch = useDispatch();
- const fetchConversation = useFetchConversationWithBatching();
- const fetchMessagesForConversation = useFetchMessagesForConversation();
+ const fetchConversationWithMessages = useFetchConversationWithMessages();
const setFarcasterDCsLoaded = useSetFarcasterDCsLoaded();
const threadInfos = useSelector(state => state.threadStore.threadInfos);
@@ -457,11 +567,7 @@
return React.useCallback(
async (
limit: number,
- onProgress?: (
- completed: number,
- total: number,
- phase: 'conversations' | 'messages',
- ) => void,
+ onProgress?: (completed: number, total: number) => void,
) => {
try {
const conversations = await fetchInboxes(null);
@@ -473,33 +579,18 @@
return;
}
- const farcasterConversations: Array<FarcasterConversation> = [];
-
- onProgress?.(0, conversations.length, 'conversations');
- const conversationResults = await processInBatchesWithReduxBatching(
+ onProgress?.(0, conversations.length);
+ await processInBatchesWithReduxBatching(
conversations,
FARCASTER_DATA_BATCH_SIZE,
(conversationID, batchedUpdates) =>
- fetchConversation(conversationID, batchedUpdates),
- dispatch,
- (completed, total) => onProgress?.(completed, total, 'conversations'),
- );
-
- const successfulConversations = conversationResults.filter(Boolean);
- farcasterConversations.push(...successfulConversations);
-
- onProgress?.(0, conversations.length, 'messages');
- await processInBatchesWithReduxBatching(
- farcasterConversations,
- FARCASTER_DATA_BATCH_SIZE,
- (conversation, batchedUpdates) =>
- fetchMessagesForConversation(
- conversation.conversationId,
+ fetchConversationWithMessages(
+ conversationID,
limit,
batchedUpdates,
),
dispatch,
- (completed, total) => onProgress?.(completed, total, 'messages'),
+ (completed, total) => onProgress?.(completed, total),
);
setFarcasterDCsLoaded(true);
@@ -509,12 +600,11 @@
}
},
[
+ dispatch,
+ fetchConversationWithMessages,
fetchInboxes,
removeDeadThreads,
- dispatch,
setFarcasterDCsLoaded,
- fetchConversation,
- fetchMessagesForConversation,
],
);
}
@@ -574,7 +664,6 @@
+progress: ?{
completed: number,
total: number,
- phase: 'conversations' | 'messages',
},
} {
const syncFarcasterConversations = useFarcasterConversationsSync();
@@ -587,15 +676,13 @@
const [progress, setProgress] = React.useState<?{
completed: number,
total: number,
- phase: 'conversations' | 'messages',
}>(null);
const handleProgress = React.useCallback(
- (completed: number, total: number, phase: 'conversations' | 'messages') =>
+ (completed: number, total: number) =>
setProgress({
completed,
total,
- phase,
}),
[],
);
@@ -639,6 +726,7 @@
export {
useFarcasterConversationsSync,
useFetchConversationWithBatching,
+ useFetchConversationWithMessages,
useFetchConversation,
useFetchMessagesForConversation,
useRefreshFarcasterConversation,
diff --git a/native/farcaster/farcaster-sync-loading-screen.react.js b/native/farcaster/farcaster-sync-loading-screen.react.js
--- a/native/farcaster/farcaster-sync-loading-screen.react.js
+++ b/native/farcaster/farcaster-sync-loading-screen.react.js
@@ -30,17 +30,6 @@
? progress.completed / progress.total
: undefined;
- const phase = React.useMemo(() => {
- if (!progress?.phase) {
- return null;
- }
- const phaseText =
- progress.phase === 'conversations'
- ? 'Loading conversations...'
- : 'Loading messages...';
- return <Text style={styles.section}>{phaseText}</Text>;
- }, [progress?.phase, styles.section]);
-
return (
<SafeAreaView edges={safeAreaEdges} style={styles.container}>
<Text style={styles.header}>Fetching Farcaster conversations</Text>
@@ -50,7 +39,6 @@
<Text style={styles.section}>
This could take a while depending on how many conversations you have.
</Text>
- {phase}
<View style={styles.progressContainer}>
{progress ? (
<Progress.Circle
diff --git a/web/farcaster/farcaster-sync-loading-screen.react.js b/web/farcaster/farcaster-sync-loading-screen.react.js
--- a/web/farcaster/farcaster-sync-loading-screen.react.js
+++ b/web/farcaster/farcaster-sync-loading-screen.react.js
@@ -16,11 +16,7 @@
}
return (
<>
- <p className={css.description}>
- {progress.phase === 'conversations'
- ? 'Loading conversations...'
- : 'Loading messages...'}
- </p>
+ <p className={css.description}>Loading conversations...</p>
<p className={css.description}>
{progress.completed} of {progress.total} (
{progress.total
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Sun, Dec 7, 5:08 AM (15 h, 6 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
5842036
Default Alt Text
D15311.1765084115.diff (14 KB)
Attached To
Mode
D15311: [lib] Improve Farcaster sync by handling messages and conversations together
Attached
Detach File
Event Timeline
Log In to Comment