From 520c6e5b9e9177b7935372cb73792c8730ec5156 Mon Sep 17 00:00:00 2001 From: Ashoat Tevosyan Date: Fri, 14 Feb 2025 07:46:12 +0700 Subject: [PATCH] [lib] Avoid creating Promises for showInMessagePreview if not needed Summary: This solves [ENG-10201](https://linear.app/comm/issue/ENG-10201/cold-start-is-significantly-slower-in-build-460), in a similar way to how D14136 (and associated stack) solved [ENG-9952](https://linear.app/comm/issue/ENG-9952/investigate-performance-regression-on-mobile-build-444). The basic story is that creating too many `Promise`s overwhelms Hermes, and in particular this occurs for many Farcaster-linked communities where all of the recent messages are membership robotext messages about users joining the community. Luckily, we only need `Promise`s for `showInMessagePreview` in `reactionMessageSpec`. This diff simply updates the signature of `showInMessagePreview` to allow for returning immediately (instead of a `Promise`), which solves the performance regression. More context on Linear [here](https://linear.app/comm/issue/ENG-10201/cold-start-is-significantly-slower-in-build-460#comment-8746a762). Test Plan: Deployed a Release build to my iOS device. Prior to this diff, it reproduced the cold start performance regression. Following this diff, it no longer reproduced. Reviewers: tomek, angelika Reviewed By: tomek Differential Revision: https://phab.comm.dev/D14361 --- lib/hooks/message-hooks.js | 5 ++++- lib/shared/messages/add-members-message-spec.js | 2 +- lib/shared/messages/join-thread-message-spec.js | 2 +- lib/shared/messages/leave-thread-message-spec.js | 2 +- lib/shared/messages/message-spec.js | 2 +- lib/shared/messages/multimedia-message-spec.js | 2 +- lib/shared/messages/remove-members-message-spec.js | 2 +- 7 files changed, 10 insertions(+), 7 deletions(-) diff --git a/lib/hooks/message-hooks.js b/lib/hooks/message-hooks.js index a0ce7c7066..dec186b2c4 100644 --- a/lib/hooks/message-hooks.js +++ b/lib/hooks/message-hooks.js @@ -71,10 +71,13 @@ function useGetMessageInfoForPreview(): ( shouldFetchOlderMessages: false, }; } - const shouldShow = await showInMessagePreview( + let shouldShow = showInMessagePreview( messageInfo, showInMessagePreviewParams, ); + if (shouldShow instanceof Promise) { + shouldShow = await shouldShow; + } if (shouldShow) { return { messageInfoForPreview: messageInfo, diff --git a/lib/shared/messages/add-members-message-spec.js b/lib/shared/messages/add-members-message-spec.js index 75566ab3d1..da3b0ab300 100644 --- a/lib/shared/messages/add-members-message-spec.js +++ b/lib/shared/messages/add-members-message-spec.js @@ -229,7 +229,7 @@ export const addMembersMessageSpec: AddMembersMessageSpec = Object.freeze({ return { shouldMerge: true, item: mergedItem }; }, - showInMessagePreview: async ( + showInMessagePreview: ( messageInfo: AddMembersMessageInfo, params: ShowInMessagePreviewParams, ) => threadTypeIsThick(params.threadInfo.type), diff --git a/lib/shared/messages/join-thread-message-spec.js b/lib/shared/messages/join-thread-message-spec.js index ebd13ca221..291e1fb230 100644 --- a/lib/shared/messages/join-thread-message-spec.js +++ b/lib/shared/messages/join-thread-message-spec.js @@ -175,7 +175,7 @@ export const joinThreadMessageSpec: MessageSpec< return { shouldMerge: true, item: mergedItem }; }, - showInMessagePreview: async ( + showInMessagePreview: ( messageInfo: JoinThreadMessageInfo, params: ShowInMessagePreviewParams, ) => threadTypeIsThick(params.threadInfo.type), diff --git a/lib/shared/messages/leave-thread-message-spec.js b/lib/shared/messages/leave-thread-message-spec.js index 47aa2e429f..9a65519ddb 100644 --- a/lib/shared/messages/leave-thread-message-spec.js +++ b/lib/shared/messages/leave-thread-message-spec.js @@ -175,7 +175,7 @@ export const leaveThreadMessageSpec: MessageSpec< return { shouldMerge: true, item: mergedItem }; }, - showInMessagePreview: async ( + showInMessagePreview: ( messageInfo: LeaveThreadMessageInfo, params: ShowInMessagePreviewParams, ) => threadTypeIsThick(params.threadInfo.type), diff --git a/lib/shared/messages/message-spec.js b/lib/shared/messages/message-spec.js index 79f04afc0c..dcecfc9b61 100644 --- a/lib/shared/messages/message-spec.js +++ b/lib/shared/messages/message-spec.js @@ -145,7 +145,7 @@ export type MessageSpec = { +showInMessagePreview?: ( messageInfo: Info, params: ShowInMessagePreviewParams, - ) => Promise, + ) => boolean | Promise, +getLastUpdatedTime?: ( messageInfoOrRawMessageInfo: Info | RawInfo, params: ShowInMessagePreviewParams, diff --git a/lib/shared/messages/multimedia-message-spec.js b/lib/shared/messages/multimedia-message-spec.js index 81e842a702..dfa86fb0fe 100644 --- a/lib/shared/messages/multimedia-message-spec.js +++ b/lib/shared/messages/multimedia-message-spec.js @@ -379,7 +379,7 @@ export const multimediaMessageSpec: MultimediaMessageSpec = Object.freeze({ validator: rawMultimediaMessageInfoValidator, showInMessagePreview: (messageInfo: MediaMessageInfo | ImagesMessageInfo) => - Promise.resolve(messageInfo.media.length > 0), + messageInfo.media.length > 0, getLastUpdatedTime: ( messageInfo: diff --git a/lib/shared/messages/remove-members-message-spec.js b/lib/shared/messages/remove-members-message-spec.js index 3541854d62..cd59724f06 100644 --- a/lib/shared/messages/remove-members-message-spec.js +++ b/lib/shared/messages/remove-members-message-spec.js @@ -235,7 +235,7 @@ export const removeMembersMessageSpec: RemoveMembersMessageSpec = Object.freeze( return { shouldMerge: true, item: mergedItem }; }, - showInMessagePreview: async ( + showInMessagePreview: ( messageInfo: RemoveMembersMessageInfo, params: ShowInMessagePreviewParams, ) => threadTypeIsThick(params.threadInfo.type),