@ethora/chat-component-rn 26.9.1 → 26.10.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +30 -0
- package/README.md +19 -0
- package/lib/commonjs/assets/icons.js +2 -2
- package/lib/commonjs/assets/icons.js.map +1 -1
- package/lib/commonjs/components/Header/HeaderRoomList.js +22 -6
- package/lib/commonjs/components/Header/HeaderRoomList.js.map +1 -1
- package/lib/commonjs/components/InputComponents/Search.js +38 -1
- package/lib/commonjs/components/InputComponents/Search.js.map +1 -1
- package/lib/commonjs/components/MainComponents/ArchivedMessageCard.js +166 -0
- package/lib/commonjs/components/MainComponents/ArchivedMessageCard.js.map +1 -0
- package/lib/commonjs/components/MainComponents/ChatHeader.js +22 -5
- package/lib/commonjs/components/MainComponents/ChatHeader.js.map +1 -1
- package/lib/commonjs/components/MainComponents/ChatRoom.js +56 -25
- package/lib/commonjs/components/MainComponents/ChatRoom.js.map +1 -1
- package/lib/commonjs/components/MainComponents/ChatWrapper.js +31 -1
- package/lib/commonjs/components/MainComponents/ChatWrapper.js.map +1 -1
- package/lib/commonjs/components/MainComponents/MediaMessage.js +18 -3
- package/lib/commonjs/components/MainComponents/MediaMessage.js.map +1 -1
- package/lib/commonjs/components/MainComponents/MessageList.js +739 -42
- package/lib/commonjs/components/MainComponents/MessageList.js.map +1 -1
- package/lib/commonjs/components/MainComponents/MessageSearchButton.js +58 -0
- package/lib/commonjs/components/MainComponents/MessageSearchButton.js.map +1 -0
- package/lib/commonjs/components/MainComponents/ReduxWrapper.js +15 -6
- package/lib/commonjs/components/MainComponents/ReduxWrapper.js.map +1 -1
- package/lib/commonjs/components/MainComponents/RoomList.js +110 -1
- package/lib/commonjs/components/MainComponents/RoomList.js.map +1 -1
- package/lib/commonjs/components/Menu/HeaderRoomListMenu.js +14 -3
- package/lib/commonjs/components/Menu/HeaderRoomListMenu.js.map +1 -1
- package/lib/commonjs/components/MessageBubble/BubbleHighlight.js +112 -0
- package/lib/commonjs/components/MessageBubble/BubbleHighlight.js.map +1 -0
- package/lib/commonjs/components/MessageBubble/Message.js +169 -125
- package/lib/commonjs/components/MessageBubble/Message.js.map +1 -1
- package/lib/commonjs/components/MessageBubble/MessageInteractions.js +98 -78
- package/lib/commonjs/components/MessageBubble/MessageInteractions.js.map +1 -1
- package/lib/commonjs/components/MessageBubble/messageMenuLayout.js +50 -0
- package/lib/commonjs/components/MessageBubble/messageMenuLayout.js.map +1 -0
- package/lib/commonjs/components/Modals/ChatProfileModal/ChatProfileModal.js +73 -37
- package/lib/commonjs/components/Modals/ChatProfileModal/ChatProfileModal.js.map +1 -1
- package/lib/commonjs/components/Modals/MessageSearchModal/MessageHitResults.js +253 -0
- package/lib/commonjs/components/Modals/MessageSearchModal/MessageHitResults.js.map +1 -0
- package/lib/commonjs/components/Modals/MessageSearchModal/MessageSearchModal.js +488 -0
- package/lib/commonjs/components/Modals/MessageSearchModal/MessageSearchModal.js.map +1 -0
- package/lib/commonjs/components/Modals/MessageSearchModal/openHit.js +51 -0
- package/lib/commonjs/components/Modals/MessageSearchModal/openHit.js.map +1 -0
- package/lib/commonjs/components/Modals/MessageSearchModal/resolveSender.js +47 -0
- package/lib/commonjs/components/Modals/MessageSearchModal/resolveSender.js.map +1 -0
- package/lib/commonjs/components/Modals/MessageSearchModal/searchFilters.js +83 -0
- package/lib/commonjs/components/Modals/MessageSearchModal/searchFilters.js.map +1 -0
- package/lib/commonjs/components/Modals/MessageSearchModal/snippet.js +61 -0
- package/lib/commonjs/components/Modals/MessageSearchModal/snippet.js.map +1 -0
- package/lib/commonjs/components/Modals/MessageSearchModal/useMessageSearch.js +136 -0
- package/lib/commonjs/components/Modals/MessageSearchModal/useMessageSearch.js.map +1 -0
- package/lib/commonjs/components/Modals/PublicChatsModal/PublicChatsModal.js +306 -0
- package/lib/commonjs/components/Modals/PublicChatsModal/PublicChatsModal.js.map +1 -0
- package/lib/commonjs/components/Modals/PublicChatsModal/publicChatsLogic.js +36 -0
- package/lib/commonjs/components/Modals/PublicChatsModal/publicChatsLogic.js.map +1 -0
- package/lib/commonjs/components/Modals/SelectUsersModal/SelectUsersModal.js +8 -1
- package/lib/commonjs/components/Modals/SelectUsersModal/SelectUsersModal.js.map +1 -1
- package/lib/commonjs/components/Modals/SettingsModals/BlockedUsers/BlockedUsersModal.js +14 -12
- package/lib/commonjs/components/Modals/SettingsModals/BlockedUsers/BlockedUsersModal.js.map +1 -1
- package/lib/commonjs/components/Modals/SettingsModals/DocumentShares/DocumentSharesModal.js +41 -39
- package/lib/commonjs/components/Modals/SettingsModals/DocumentShares/DocumentSharesModal.js.map +1 -1
- package/lib/commonjs/components/Modals/SettingsModals/ManageDataModal/ManageDataModal.js +137 -50
- package/lib/commonjs/components/Modals/SettingsModals/ManageDataModal/ManageDataModal.js.map +1 -1
- package/lib/commonjs/components/Modals/SettingsModals/ProfileShares/ProfileShares.js +15 -13
- package/lib/commonjs/components/Modals/SettingsModals/ProfileShares/ProfileShares.js.map +1 -1
- package/lib/commonjs/components/Modals/SettingsModals/Referrals/Referrals.js +57 -55
- package/lib/commonjs/components/Modals/SettingsModals/Referrals/Referrals.js.map +1 -1
- package/lib/commonjs/components/Modals/SettingsModals/SharedStyledComponents.js +15 -1
- package/lib/commonjs/components/Modals/SettingsModals/SharedStyledComponents.js.map +1 -1
- package/lib/commonjs/components/Modals/SettingsModals/Visibility/VisibilityModal.js +61 -59
- package/lib/commonjs/components/Modals/SettingsModals/Visibility/VisibilityModal.js.map +1 -1
- package/lib/commonjs/components/Modals/UserSettingsModal/UserSettingsModal.js +8 -3
- package/lib/commonjs/components/Modals/UserSettingsModal/UserSettingsModal.js.map +1 -1
- package/lib/commonjs/components/RoomComponents/ChatRoomItem.js +13 -2
- package/lib/commonjs/components/RoomComponents/ChatRoomItem.js.map +1 -1
- package/lib/commonjs/components/RoomComponents/SwipeableRoomRow.js +38 -6
- package/lib/commonjs/components/RoomComponents/SwipeableRoomRow.js.map +1 -1
- package/lib/commonjs/components/Thread/ThreadHeader.js +3 -1
- package/lib/commonjs/components/Thread/ThreadHeader.js.map +1 -1
- package/lib/commonjs/components/Thread/ThreadWrapper.js +90 -10
- package/lib/commonjs/components/Thread/ThreadWrapper.js.map +1 -1
- package/lib/commonjs/components/styled/AudioDecoderHost.js +338 -0
- package/lib/commonjs/components/styled/AudioDecoderHost.js.map +1 -0
- package/lib/commonjs/components/styled/AudioMessage.js +493 -420
- package/lib/commonjs/components/styled/AudioMessage.js.map +1 -1
- package/lib/commonjs/components/styled/SendInput.js +31 -5
- package/lib/commonjs/components/styled/SendInput.js.map +1 -1
- package/lib/commonjs/context/MessageNotificationContext.js +14 -4
- package/lib/commonjs/context/MessageNotificationContext.js.map +1 -1
- package/lib/commonjs/context/xmppProvider.js +41 -77
- package/lib/commonjs/context/xmppProvider.js.map +1 -1
- package/lib/commonjs/helpers/audioWaveform.js +165 -0
- package/lib/commonjs/helpers/audioWaveform.js.map +1 -0
- package/lib/commonjs/helpers/backgroundJoinSweep.js +36 -0
- package/lib/commonjs/helpers/backgroundJoinSweep.js.map +1 -0
- package/lib/commonjs/helpers/bubbleHighlight.js +44 -0
- package/lib/commonjs/helpers/bubbleHighlight.js.map +1 -0
- package/lib/commonjs/helpers/checkUniqueUsers.js +14 -12
- package/lib/commonjs/helpers/checkUniqueUsers.js.map +1 -1
- package/lib/commonjs/helpers/constants/MODAL_COMPONENTS.js +5 -1
- package/lib/commonjs/helpers/constants/MODAL_COMPONENTS.js.map +1 -1
- package/lib/commonjs/helpers/constants/MODAL_TYPES.js +3 -1
- package/lib/commonjs/helpers/constants/MODAL_TYPES.js.map +1 -1
- package/lib/commonjs/helpers/createRoomFromApi.js +40 -3
- package/lib/commonjs/helpers/createRoomFromApi.js.map +1 -1
- package/lib/commonjs/helpers/dedupeMembers.js +34 -0
- package/lib/commonjs/helpers/dedupeMembers.js.map +1 -0
- package/lib/commonjs/helpers/ethoraLogger.js +56 -0
- package/lib/commonjs/helpers/ethoraLogger.js.map +1 -0
- package/lib/commonjs/helpers/getUnnamedUsers.js +9 -4
- package/lib/commonjs/helpers/getUnnamedUsers.js.map +1 -1
- package/lib/commonjs/helpers/historyPreloadConfig.js +44 -0
- package/lib/commonjs/helpers/historyPreloadConfig.js.map +1 -0
- package/lib/commonjs/helpers/historyPreloadScheduler.js +372 -137
- package/lib/commonjs/helpers/historyPreloadScheduler.js.map +1 -1
- package/lib/commonjs/helpers/initRoomsPresence.js +17 -5
- package/lib/commonjs/helpers/initRoomsPresence.js.map +1 -1
- package/lib/commonjs/helpers/insertMessageWithDelimiter.js +5 -0
- package/lib/commonjs/helpers/insertMessageWithDelimiter.js.map +1 -1
- package/lib/commonjs/helpers/isLikelyMucJid.js +67 -0
- package/lib/commonjs/helpers/isLikelyMucJid.js.map +1 -0
- package/lib/commonjs/helpers/isMessageSearchEnabled.js +18 -0
- package/lib/commonjs/helpers/isMessageSearchEnabled.js.map +1 -0
- package/lib/commonjs/helpers/joiningRoom.js +14 -0
- package/lib/commonjs/helpers/joiningRoom.js.map +1 -0
- package/lib/commonjs/helpers/jumpThread.js +100 -0
- package/lib/commonjs/helpers/jumpThread.js.map +1 -0
- package/lib/commonjs/helpers/jumpToMessage.js +58 -0
- package/lib/commonjs/helpers/jumpToMessage.js.map +1 -0
- package/lib/commonjs/helpers/jumpWindow.js +187 -0
- package/lib/commonjs/helpers/jumpWindow.js.map +1 -0
- package/lib/commonjs/helpers/loadRoomHistory.js +75 -0
- package/lib/commonjs/helpers/loadRoomHistory.js.map +1 -0
- package/lib/commonjs/helpers/notificationPolicy.js +77 -0
- package/lib/commonjs/helpers/notificationPolicy.js.map +1 -0
- package/lib/commonjs/helpers/openRoomAtMessage.js +47 -0
- package/lib/commonjs/helpers/openRoomAtMessage.js.map +1 -0
- package/lib/commonjs/helpers/openThreadForJump.js +72 -0
- package/lib/commonjs/helpers/openThreadForJump.js.map +1 -0
- package/lib/commonjs/helpers/parseMessageReference.js +27 -8
- package/lib/commonjs/helpers/parseMessageReference.js.map +1 -1
- package/lib/commonjs/helpers/publicChatsEntry.js +17 -0
- package/lib/commonjs/helpers/publicChatsEntry.js.map +1 -0
- package/lib/commonjs/helpers/roomActivityScore.js +37 -0
- package/lib/commonjs/helpers/roomActivityScore.js.map +1 -0
- package/lib/commonjs/helpers/roomUserCount.js +36 -0
- package/lib/commonjs/helpers/roomUserCount.js.map +1 -0
- package/lib/commonjs/helpers/runConfiguredHistoryPreload.js +68 -0
- package/lib/commonjs/helpers/runConfiguredHistoryPreload.js.map +1 -0
- package/lib/commonjs/helpers/sessionAppId.js +24 -0
- package/lib/commonjs/helpers/sessionAppId.js.map +1 -0
- package/lib/commonjs/helpers/timestamp.js +43 -0
- package/lib/commonjs/helpers/timestamp.js.map +1 -0
- package/lib/commonjs/helpers/userResolver.js +517 -0
- package/lib/commonjs/helpers/userResolver.js.map +1 -0
- package/lib/commonjs/helpers/xmppIdShape.js +52 -0
- package/lib/commonjs/helpers/xmppIdShape.js.map +1 -0
- package/lib/commonjs/hooks/useChatWrapperInit.js +27 -5
- package/lib/commonjs/hooks/useChatWrapperInit.js.map +1 -1
- package/lib/commonjs/hooks/useHeapSender.js +54 -3
- package/lib/commonjs/hooks/useHeapSender.js.map +1 -1
- package/lib/commonjs/hooks/useJumpToMessage.js +411 -0
- package/lib/commonjs/hooks/useJumpToMessage.js.map +1 -0
- package/lib/commonjs/hooks/useMessageLoaderQueue.js +32 -5
- package/lib/commonjs/hooks/useMessageLoaderQueue.js.map +1 -1
- package/lib/commonjs/hooks/useMessageQueue.js +13 -5
- package/lib/commonjs/hooks/useMessageQueue.js.map +1 -1
- package/lib/commonjs/hooks/useRoomDirectory.js +29 -0
- package/lib/commonjs/hooks/useRoomDirectory.js.map +1 -0
- package/lib/commonjs/hooks/useRoomInitialization.js +27 -5
- package/lib/commonjs/hooks/useRoomInitialization.js.map +1 -1
- package/lib/commonjs/hooks/useRoomMute.js +62 -0
- package/lib/commonjs/hooks/useRoomMute.js.map +1 -0
- package/lib/commonjs/hooks/useRoomState.js +3 -1
- package/lib/commonjs/hooks/useRoomState.js.map +1 -1
- package/lib/commonjs/hooks/useSendMessage.js +13 -3
- package/lib/commonjs/hooks/useSendMessage.js.map +1 -1
- package/lib/commonjs/i18n/strings.js +312 -6
- package/lib/commonjs/i18n/strings.js.map +1 -1
- package/lib/commonjs/networking/api-requests/messageSearch.api.js +87 -0
- package/lib/commonjs/networking/api-requests/messageSearch.api.js.map +1 -0
- package/lib/commonjs/networking/api-requests/publicChats.api.js +48 -0
- package/lib/commonjs/networking/api-requests/publicChats.api.js.map +1 -0
- package/lib/commonjs/networking/api-requests/roomMembers.api.js +253 -4
- package/lib/commonjs/networking/api-requests/roomMembers.api.js.map +1 -1
- package/lib/commonjs/networking/api-requests/rooms.api.js +48 -12
- package/lib/commonjs/networking/api-requests/rooms.api.js.map +1 -1
- package/lib/commonjs/networking/api-requests/user.api.js +32 -3
- package/lib/commonjs/networking/api-requests/user.api.js.map +1 -1
- package/lib/commonjs/networking/api-requests/xmppToken.api.js +71 -0
- package/lib/commonjs/networking/api-requests/xmppToken.api.js.map +1 -0
- package/lib/commonjs/networking/ethoraEvents.js +227 -0
- package/lib/commonjs/networking/ethoraEvents.js.map +1 -0
- package/lib/commonjs/networking/stanzaHandlers.js +153 -16
- package/lib/commonjs/networking/stanzaHandlers.js.map +1 -1
- package/lib/commonjs/networking/xmpp/allRoomPresences.xmpp.js +124 -3
- package/lib/commonjs/networking/xmpp/allRoomPresences.xmpp.js.map +1 -1
- package/lib/commonjs/networking/xmpp/getHistory.xmpp.js +319 -35
- package/lib/commonjs/networking/xmpp/getHistory.xmpp.js.map +1 -1
- package/lib/commonjs/networking/xmpp/handleStanzas.xmpp.js +7 -0
- package/lib/commonjs/networking/xmpp/handleStanzas.xmpp.js.map +1 -1
- package/lib/commonjs/networking/xmpp/historyCursor.js +101 -0
- package/lib/commonjs/networking/xmpp/historyCursor.js.map +1 -0
- package/lib/commonjs/networking/xmpp/mamQueryIds.js +17 -0
- package/lib/commonjs/networking/xmpp/mamQueryIds.js.map +1 -0
- package/lib/commonjs/networking/xmpp/mamRouter.js +24 -9
- package/lib/commonjs/networking/xmpp/mamRouter.js.map +1 -1
- package/lib/commonjs/networking/xmpp/presenceInRoom.xmpp.js +70 -65
- package/lib/commonjs/networking/xmpp/presenceInRoom.xmpp.js.map +1 -1
- package/lib/commonjs/networking/xmpp/roomJoinSweep.js +389 -0
- package/lib/commonjs/networking/xmpp/roomJoinSweep.js.map +1 -0
- package/lib/commonjs/networking/xmpp/sendMediaMessage.xmpp.js +0 -1
- package/lib/commonjs/networking/xmpp/sendMediaMessage.xmpp.js.map +1 -1
- package/lib/commonjs/networking/xmpp/sendTextMessage.xmpp.js +0 -1
- package/lib/commonjs/networking/xmpp/sendTextMessage.xmpp.js.map +1 -1
- package/lib/commonjs/networking/xmpp/sendTextMessageWithTranslateTag.xmpp.js +0 -1
- package/lib/commonjs/networking/xmpp/sendTextMessageWithTranslateTag.xmpp.js.map +1 -1
- package/lib/commonjs/networking/xmppClient.js +269 -41
- package/lib/commonjs/networking/xmppClient.js.map +1 -1
- package/lib/commonjs/networking/xmppCredentials.js +80 -0
- package/lib/commonjs/networking/xmppCredentials.js.map +1 -0
- package/lib/commonjs/roomStore/Middleware/jumpThreadMiddleware.js +158 -0
- package/lib/commonjs/roomStore/Middleware/jumpThreadMiddleware.js.map +1 -0
- package/lib/commonjs/roomStore/Middleware/reactionsMiddleware.js +6 -0
- package/lib/commonjs/roomStore/Middleware/reactionsMiddleware.js.map +1 -1
- package/lib/commonjs/roomStore/Middleware/unreadMidlleware.js +45 -7
- package/lib/commonjs/roomStore/Middleware/unreadMidlleware.js.map +1 -1
- package/lib/commonjs/roomStore/chatSettingsSlice.js +21 -1
- package/lib/commonjs/roomStore/chatSettingsSlice.js.map +1 -1
- package/lib/commonjs/roomStore/index.js +13 -3
- package/lib/commonjs/roomStore/index.js.map +1 -1
- package/lib/commonjs/roomStore/persistence.js +48 -1
- package/lib/commonjs/roomStore/persistence.js.map +1 -1
- package/lib/commonjs/roomStore/roomsSlice.js +474 -60
- package/lib/commonjs/roomStore/roomsSlice.js.map +1 -1
- package/lib/commonjs/roomStore/safeKey.js +44 -0
- package/lib/commonjs/roomStore/safeKey.js.map +1 -0
- package/lib/commonjs/roomStore/usersSetCap.js +37 -0
- package/lib/commonjs/roomStore/usersSetCap.js.map +1 -0
- package/lib/commonjs/version.js +1 -1
- package/lib/commonjs/version.js.map +1 -1
- package/lib/module/assets/icons.js +1 -1
- package/lib/module/assets/icons.js.map +1 -1
- package/lib/module/components/Header/HeaderRoomList.js +23 -7
- package/lib/module/components/Header/HeaderRoomList.js.map +1 -1
- package/lib/module/components/InputComponents/Search.js +39 -2
- package/lib/module/components/InputComponents/Search.js.map +1 -1
- package/lib/module/components/MainComponents/ArchivedMessageCard.js +161 -0
- package/lib/module/components/MainComponents/ArchivedMessageCard.js.map +1 -0
- package/lib/module/components/MainComponents/ChatHeader.js +22 -5
- package/lib/module/components/MainComponents/ChatHeader.js.map +1 -1
- package/lib/module/components/MainComponents/ChatRoom.js +57 -26
- package/lib/module/components/MainComponents/ChatRoom.js.map +1 -1
- package/lib/module/components/MainComponents/ChatWrapper.js +31 -1
- package/lib/module/components/MainComponents/ChatWrapper.js.map +1 -1
- package/lib/module/components/MainComponents/MediaMessage.js +18 -3
- package/lib/module/components/MainComponents/MediaMessage.js.map +1 -1
- package/lib/module/components/MainComponents/MessageList.js +740 -42
- package/lib/module/components/MainComponents/MessageList.js.map +1 -1
- package/lib/module/components/MainComponents/MessageSearchButton.js +48 -0
- package/lib/module/components/MainComponents/MessageSearchButton.js.map +1 -0
- package/lib/module/components/MainComponents/ReduxWrapper.js +15 -7
- package/lib/module/components/MainComponents/ReduxWrapper.js.map +1 -1
- package/lib/module/components/MainComponents/RoomList.js +111 -2
- package/lib/module/components/MainComponents/RoomList.js.map +1 -1
- package/lib/module/components/Menu/HeaderRoomListMenu.js +15 -4
- package/lib/module/components/Menu/HeaderRoomListMenu.js.map +1 -1
- package/lib/module/components/MessageBubble/BubbleHighlight.js +106 -0
- package/lib/module/components/MessageBubble/BubbleHighlight.js.map +1 -0
- package/lib/module/components/MessageBubble/Message.js +172 -127
- package/lib/module/components/MessageBubble/Message.js.map +1 -1
- package/lib/module/components/MessageBubble/MessageInteractions.js +98 -78
- package/lib/module/components/MessageBubble/MessageInteractions.js.map +1 -1
- package/lib/module/components/MessageBubble/messageMenuLayout.js +45 -0
- package/lib/module/components/MessageBubble/messageMenuLayout.js.map +1 -0
- package/lib/module/components/Modals/ChatProfileModal/ChatProfileModal.js +74 -38
- package/lib/module/components/Modals/ChatProfileModal/ChatProfileModal.js.map +1 -1
- package/lib/module/components/Modals/MessageSearchModal/MessageHitResults.js +243 -0
- package/lib/module/components/Modals/MessageSearchModal/MessageHitResults.js.map +1 -0
- package/lib/module/components/Modals/MessageSearchModal/MessageSearchModal.js +482 -0
- package/lib/module/components/Modals/MessageSearchModal/MessageSearchModal.js.map +1 -0
- package/lib/module/components/Modals/MessageSearchModal/openHit.js +45 -0
- package/lib/module/components/Modals/MessageSearchModal/openHit.js.map +1 -0
- package/lib/module/components/Modals/MessageSearchModal/resolveSender.js +41 -0
- package/lib/module/components/Modals/MessageSearchModal/resolveSender.js.map +1 -0
- package/lib/module/components/Modals/MessageSearchModal/searchFilters.js +74 -0
- package/lib/module/components/Modals/MessageSearchModal/searchFilters.js.map +1 -0
- package/lib/module/components/Modals/MessageSearchModal/snippet.js +57 -0
- package/lib/module/components/Modals/MessageSearchModal/snippet.js.map +1 -0
- package/lib/module/components/Modals/MessageSearchModal/useMessageSearch.js +131 -0
- package/lib/module/components/Modals/MessageSearchModal/useMessageSearch.js.map +1 -0
- package/lib/module/components/Modals/PublicChatsModal/PublicChatsModal.js +300 -0
- package/lib/module/components/Modals/PublicChatsModal/PublicChatsModal.js.map +1 -0
- package/lib/module/components/Modals/PublicChatsModal/publicChatsLogic.js +30 -0
- package/lib/module/components/Modals/PublicChatsModal/publicChatsLogic.js.map +1 -0
- package/lib/module/components/Modals/SelectUsersModal/SelectUsersModal.js +8 -1
- package/lib/module/components/Modals/SelectUsersModal/SelectUsersModal.js.map +1 -1
- package/lib/module/components/Modals/SettingsModals/BlockedUsers/BlockedUsersModal.js +15 -13
- package/lib/module/components/Modals/SettingsModals/BlockedUsers/BlockedUsersModal.js.map +1 -1
- package/lib/module/components/Modals/SettingsModals/DocumentShares/DocumentSharesModal.js +42 -40
- package/lib/module/components/Modals/SettingsModals/DocumentShares/DocumentSharesModal.js.map +1 -1
- package/lib/module/components/Modals/SettingsModals/ManageDataModal/ManageDataModal.js +138 -52
- package/lib/module/components/Modals/SettingsModals/ManageDataModal/ManageDataModal.js.map +1 -1
- package/lib/module/components/Modals/SettingsModals/ProfileShares/ProfileShares.js +16 -14
- package/lib/module/components/Modals/SettingsModals/ProfileShares/ProfileShares.js.map +1 -1
- package/lib/module/components/Modals/SettingsModals/Referrals/Referrals.js +58 -56
- package/lib/module/components/Modals/SettingsModals/Referrals/Referrals.js.map +1 -1
- package/lib/module/components/Modals/SettingsModals/SharedStyledComponents.js +14 -0
- package/lib/module/components/Modals/SettingsModals/SharedStyledComponents.js.map +1 -1
- package/lib/module/components/Modals/SettingsModals/Visibility/VisibilityModal.js +62 -60
- package/lib/module/components/Modals/SettingsModals/Visibility/VisibilityModal.js.map +1 -1
- package/lib/module/components/Modals/UserSettingsModal/UserSettingsModal.js +9 -4
- package/lib/module/components/Modals/UserSettingsModal/UserSettingsModal.js.map +1 -1
- package/lib/module/components/RoomComponents/ChatRoomItem.js +14 -3
- package/lib/module/components/RoomComponents/ChatRoomItem.js.map +1 -1
- package/lib/module/components/RoomComponents/SwipeableRoomRow.js +39 -7
- package/lib/module/components/RoomComponents/SwipeableRoomRow.js.map +1 -1
- package/lib/module/components/Thread/ThreadHeader.js +3 -1
- package/lib/module/components/Thread/ThreadHeader.js.map +1 -1
- package/lib/module/components/Thread/ThreadWrapper.js +89 -9
- package/lib/module/components/Thread/ThreadWrapper.js.map +1 -1
- package/lib/module/components/styled/AudioDecoderHost.js +332 -0
- package/lib/module/components/styled/AudioDecoderHost.js.map +1 -0
- package/lib/module/components/styled/AudioMessage.js +495 -422
- package/lib/module/components/styled/AudioMessage.js.map +1 -1
- package/lib/module/components/styled/SendInput.js +32 -6
- package/lib/module/components/styled/SendInput.js.map +1 -1
- package/lib/module/context/MessageNotificationContext.js +15 -5
- package/lib/module/context/MessageNotificationContext.js.map +1 -1
- package/lib/module/context/xmppProvider.js +42 -78
- package/lib/module/context/xmppProvider.js.map +1 -1
- package/lib/module/helpers/audioWaveform.js +153 -0
- package/lib/module/helpers/audioWaveform.js.map +1 -0
- package/lib/module/helpers/backgroundJoinSweep.js +30 -0
- package/lib/module/helpers/backgroundJoinSweep.js.map +1 -0
- package/lib/module/helpers/bubbleHighlight.js +38 -0
- package/lib/module/helpers/bubbleHighlight.js.map +1 -0
- package/lib/module/helpers/checkUniqueUsers.js +15 -13
- package/lib/module/helpers/checkUniqueUsers.js.map +1 -1
- package/lib/module/helpers/constants/MODAL_COMPONENTS.js +5 -1
- package/lib/module/helpers/constants/MODAL_COMPONENTS.js.map +1 -1
- package/lib/module/helpers/constants/MODAL_TYPES.js +3 -1
- package/lib/module/helpers/constants/MODAL_TYPES.js.map +1 -1
- package/lib/module/helpers/createRoomFromApi.js +37 -3
- package/lib/module/helpers/createRoomFromApi.js.map +1 -1
- package/lib/module/helpers/dedupeMembers.js +28 -0
- package/lib/module/helpers/dedupeMembers.js.map +1 -0
- package/lib/module/helpers/ethoraLogger.js +52 -0
- package/lib/module/helpers/ethoraLogger.js.map +1 -0
- package/lib/module/helpers/getUnnamedUsers.js +9 -4
- package/lib/module/helpers/getUnnamedUsers.js.map +1 -1
- package/lib/module/helpers/historyPreloadConfig.js +39 -0
- package/lib/module/helpers/historyPreloadConfig.js.map +1 -0
- package/lib/module/helpers/historyPreloadScheduler.js +368 -134
- package/lib/module/helpers/historyPreloadScheduler.js.map +1 -1
- package/lib/module/helpers/initRoomsPresence.js +18 -5
- package/lib/module/helpers/initRoomsPresence.js.map +1 -1
- package/lib/module/helpers/insertMessageWithDelimiter.js +5 -0
- package/lib/module/helpers/insertMessageWithDelimiter.js.map +1 -1
- package/lib/module/helpers/isLikelyMucJid.js +60 -0
- package/lib/module/helpers/isLikelyMucJid.js.map +1 -0
- package/lib/module/helpers/isMessageSearchEnabled.js +13 -0
- package/lib/module/helpers/isMessageSearchEnabled.js.map +1 -0
- package/lib/module/helpers/joiningRoom.js +9 -0
- package/lib/module/helpers/joiningRoom.js.map +1 -0
- package/lib/module/helpers/jumpThread.js +83 -0
- package/lib/module/helpers/jumpThread.js.map +1 -0
- package/lib/module/helpers/jumpToMessage.js +52 -0
- package/lib/module/helpers/jumpToMessage.js.map +1 -0
- package/lib/module/helpers/jumpWindow.js +177 -0
- package/lib/module/helpers/jumpWindow.js.map +1 -0
- package/lib/module/helpers/loadRoomHistory.js +69 -0
- package/lib/module/helpers/loadRoomHistory.js.map +1 -0
- package/lib/module/helpers/notificationPolicy.js +70 -0
- package/lib/module/helpers/notificationPolicy.js.map +1 -0
- package/lib/module/helpers/openRoomAtMessage.js +41 -0
- package/lib/module/helpers/openRoomAtMessage.js.map +1 -0
- package/lib/module/helpers/openThreadForJump.js +68 -0
- package/lib/module/helpers/openThreadForJump.js.map +1 -0
- package/lib/module/helpers/parseMessageReference.js +26 -6
- package/lib/module/helpers/parseMessageReference.js.map +1 -1
- package/lib/module/helpers/publicChatsEntry.js +12 -0
- package/lib/module/helpers/publicChatsEntry.js.map +1 -0
- package/lib/module/helpers/roomActivityScore.js +30 -0
- package/lib/module/helpers/roomActivityScore.js.map +1 -0
- package/lib/module/helpers/roomUserCount.js +29 -0
- package/lib/module/helpers/roomUserCount.js.map +1 -0
- package/lib/module/helpers/runConfiguredHistoryPreload.js +63 -0
- package/lib/module/helpers/runConfiguredHistoryPreload.js.map +1 -0
- package/lib/module/helpers/sessionAppId.js +20 -0
- package/lib/module/helpers/sessionAppId.js.map +1 -0
- package/lib/module/helpers/timestamp.js +37 -0
- package/lib/module/helpers/timestamp.js.map +1 -0
- package/lib/module/helpers/userResolver.js +503 -0
- package/lib/module/helpers/userResolver.js.map +1 -0
- package/lib/module/helpers/xmppIdShape.js +46 -0
- package/lib/module/helpers/xmppIdShape.js.map +1 -0
- package/lib/module/hooks/useChatWrapperInit.js +16 -5
- package/lib/module/hooks/useChatWrapperInit.js.map +1 -1
- package/lib/module/hooks/useHeapSender.js +54 -3
- package/lib/module/hooks/useHeapSender.js.map +1 -1
- package/lib/module/hooks/useJumpToMessage.js +389 -0
- package/lib/module/hooks/useJumpToMessage.js.map +1 -0
- package/lib/module/hooks/useMessageLoaderQueue.js +32 -5
- package/lib/module/hooks/useMessageLoaderQueue.js.map +1 -1
- package/lib/module/hooks/useMessageQueue.js +13 -5
- package/lib/module/hooks/useMessageQueue.js.map +1 -1
- package/lib/module/hooks/useRoomDirectory.js +24 -0
- package/lib/module/hooks/useRoomDirectory.js.map +1 -0
- package/lib/module/hooks/useRoomInitialization.js +29 -7
- package/lib/module/hooks/useRoomInitialization.js.map +1 -1
- package/lib/module/hooks/useRoomMute.js +58 -0
- package/lib/module/hooks/useRoomMute.js.map +1 -0
- package/lib/module/hooks/useRoomState.js +3 -1
- package/lib/module/hooks/useRoomState.js.map +1 -1
- package/lib/module/hooks/useSendMessage.js +13 -3
- package/lib/module/hooks/useSendMessage.js.map +1 -1
- package/lib/module/i18n/strings.js +312 -6
- package/lib/module/i18n/strings.js.map +1 -1
- package/lib/module/networking/api-requests/messageSearch.api.js +81 -0
- package/lib/module/networking/api-requests/messageSearch.api.js.map +1 -0
- package/lib/module/networking/api-requests/publicChats.api.js +43 -0
- package/lib/module/networking/api-requests/publicChats.api.js.map +1 -0
- package/lib/module/networking/api-requests/roomMembers.api.js +248 -4
- package/lib/module/networking/api-requests/roomMembers.api.js.map +1 -1
- package/lib/module/networking/api-requests/rooms.api.js +48 -12
- package/lib/module/networking/api-requests/rooms.api.js.map +1 -1
- package/lib/module/networking/api-requests/user.api.js +31 -3
- package/lib/module/networking/api-requests/user.api.js.map +1 -1
- package/lib/module/networking/api-requests/xmppToken.api.js +66 -0
- package/lib/module/networking/api-requests/xmppToken.api.js.map +1 -0
- package/lib/module/networking/ethoraEvents.js +220 -0
- package/lib/module/networking/ethoraEvents.js.map +1 -0
- package/lib/module/networking/stanzaHandlers.js +155 -18
- package/lib/module/networking/stanzaHandlers.js.map +1 -1
- package/lib/module/networking/xmpp/allRoomPresences.xmpp.js +125 -3
- package/lib/module/networking/xmpp/allRoomPresences.xmpp.js.map +1 -1
- package/lib/module/networking/xmpp/getHistory.xmpp.js +318 -35
- package/lib/module/networking/xmpp/getHistory.xmpp.js.map +1 -1
- package/lib/module/networking/xmpp/handleStanzas.xmpp.js +7 -0
- package/lib/module/networking/xmpp/handleStanzas.xmpp.js.map +1 -1
- package/lib/module/networking/xmpp/historyCursor.js +95 -0
- package/lib/module/networking/xmpp/historyCursor.js.map +1 -0
- package/lib/module/networking/xmpp/mamQueryIds.js +12 -0
- package/lib/module/networking/xmpp/mamQueryIds.js.map +1 -0
- package/lib/module/networking/xmpp/mamRouter.js +22 -8
- package/lib/module/networking/xmpp/mamRouter.js.map +1 -1
- package/lib/module/networking/xmpp/presenceInRoom.xmpp.js +68 -62
- package/lib/module/networking/xmpp/presenceInRoom.xmpp.js.map +1 -1
- package/lib/module/networking/xmpp/roomJoinSweep.js +385 -0
- package/lib/module/networking/xmpp/roomJoinSweep.js.map +1 -0
- package/lib/module/networking/xmpp/sendMediaMessage.xmpp.js +0 -1
- package/lib/module/networking/xmpp/sendMediaMessage.xmpp.js.map +1 -1
- package/lib/module/networking/xmpp/sendTextMessage.xmpp.js +0 -1
- package/lib/module/networking/xmpp/sendTextMessage.xmpp.js.map +1 -1
- package/lib/module/networking/xmpp/sendTextMessageWithTranslateTag.xmpp.js +0 -1
- package/lib/module/networking/xmpp/sendTextMessageWithTranslateTag.xmpp.js.map +1 -1
- package/lib/module/networking/xmppClient.js +269 -41
- package/lib/module/networking/xmppClient.js.map +1 -1
- package/lib/module/networking/xmppCredentials.js +76 -0
- package/lib/module/networking/xmppCredentials.js.map +1 -0
- package/lib/module/roomStore/Middleware/jumpThreadMiddleware.js +153 -0
- package/lib/module/roomStore/Middleware/jumpThreadMiddleware.js.map +1 -0
- package/lib/module/roomStore/Middleware/reactionsMiddleware.js +6 -0
- package/lib/module/roomStore/Middleware/reactionsMiddleware.js.map +1 -1
- package/lib/module/roomStore/Middleware/unreadMidlleware.js +46 -7
- package/lib/module/roomStore/Middleware/unreadMidlleware.js.map +1 -1
- package/lib/module/roomStore/chatSettingsSlice.js +19 -0
- package/lib/module/roomStore/chatSettingsSlice.js.map +1 -1
- package/lib/module/roomStore/index.js +7 -3
- package/lib/module/roomStore/index.js.map +1 -1
- package/lib/module/roomStore/persistence.js +46 -1
- package/lib/module/roomStore/persistence.js.map +1 -1
- package/lib/module/roomStore/roomsSlice.js +459 -58
- package/lib/module/roomStore/roomsSlice.js.map +1 -1
- package/lib/module/roomStore/safeKey.js +37 -0
- package/lib/module/roomStore/safeKey.js.map +1 -0
- package/lib/module/roomStore/usersSetCap.js +32 -0
- package/lib/module/roomStore/usersSetCap.js.map +1 -0
- package/lib/module/version.js +1 -1
- package/lib/module/version.js.map +1 -1
- package/lib/typescript/assets/icons.d.ts +4 -0
- package/lib/typescript/assets/icons.d.ts.map +1 -1
- package/lib/typescript/components/Header/HeaderRoomList.d.ts.map +1 -1
- package/lib/typescript/components/InputComponents/Search.d.ts.map +1 -1
- package/lib/typescript/components/MainComponents/ArchivedMessageCard.d.ts +12 -0
- package/lib/typescript/components/MainComponents/ArchivedMessageCard.d.ts.map +1 -0
- package/lib/typescript/components/MainComponents/ChatHeader.d.ts.map +1 -1
- package/lib/typescript/components/MainComponents/ChatRoom.d.ts.map +1 -1
- package/lib/typescript/components/MainComponents/ChatWrapper.d.ts.map +1 -1
- package/lib/typescript/components/MainComponents/MediaMessage.d.ts.map +1 -1
- package/lib/typescript/components/MainComponents/MessageList.d.ts +22 -1
- package/lib/typescript/components/MainComponents/MessageList.d.ts.map +1 -1
- package/lib/typescript/components/MainComponents/MessageSearchButton.d.ts +7 -0
- package/lib/typescript/components/MainComponents/MessageSearchButton.d.ts.map +1 -0
- package/lib/typescript/components/MainComponents/ReduxWrapper.d.ts.map +1 -1
- package/lib/typescript/components/MainComponents/RoomList.d.ts.map +1 -1
- package/lib/typescript/components/Menu/HeaderRoomListMenu.d.ts.map +1 -1
- package/lib/typescript/components/MessageBubble/BubbleHighlight.d.ts +12 -0
- package/lib/typescript/components/MessageBubble/BubbleHighlight.d.ts.map +1 -0
- package/lib/typescript/components/MessageBubble/Message.d.ts.map +1 -1
- package/lib/typescript/components/MessageBubble/MessageInteractions.d.ts +5 -0
- package/lib/typescript/components/MessageBubble/MessageInteractions.d.ts.map +1 -1
- package/lib/typescript/components/MessageBubble/messageMenuLayout.d.ts +29 -0
- package/lib/typescript/components/MessageBubble/messageMenuLayout.d.ts.map +1 -0
- package/lib/typescript/components/Modals/ChatProfileModal/ChatProfileModal.d.ts +2 -0
- package/lib/typescript/components/Modals/ChatProfileModal/ChatProfileModal.d.ts.map +1 -1
- package/lib/typescript/components/Modals/MessageSearchModal/MessageHitResults.d.ts +44 -0
- package/lib/typescript/components/Modals/MessageSearchModal/MessageHitResults.d.ts.map +1 -0
- package/lib/typescript/components/Modals/MessageSearchModal/MessageSearchModal.d.ts +12 -0
- package/lib/typescript/components/Modals/MessageSearchModal/MessageSearchModal.d.ts.map +1 -0
- package/lib/typescript/components/Modals/MessageSearchModal/openHit.d.ts +15 -0
- package/lib/typescript/components/Modals/MessageSearchModal/openHit.d.ts.map +1 -0
- package/lib/typescript/components/Modals/MessageSearchModal/resolveSender.d.ts +34 -0
- package/lib/typescript/components/Modals/MessageSearchModal/resolveSender.d.ts.map +1 -0
- package/lib/typescript/components/Modals/MessageSearchModal/searchFilters.d.ts +41 -0
- package/lib/typescript/components/Modals/MessageSearchModal/searchFilters.d.ts.map +1 -0
- package/lib/typescript/components/Modals/MessageSearchModal/snippet.d.ts +15 -0
- package/lib/typescript/components/Modals/MessageSearchModal/snippet.d.ts.map +1 -0
- package/lib/typescript/components/Modals/MessageSearchModal/useMessageSearch.d.ts +23 -0
- package/lib/typescript/components/Modals/MessageSearchModal/useMessageSearch.d.ts.map +1 -0
- package/lib/typescript/components/Modals/PublicChatsModal/PublicChatsModal.d.ts +16 -0
- package/lib/typescript/components/Modals/PublicChatsModal/PublicChatsModal.d.ts.map +1 -0
- package/lib/typescript/components/Modals/PublicChatsModal/publicChatsLogic.d.ts +14 -0
- package/lib/typescript/components/Modals/PublicChatsModal/publicChatsLogic.d.ts.map +1 -0
- package/lib/typescript/components/Modals/SelectUsersModal/SelectUsersModal.d.ts.map +1 -1
- package/lib/typescript/components/Modals/SettingsModals/BlockedUsers/BlockedUsersModal.d.ts.map +1 -1
- package/lib/typescript/components/Modals/SettingsModals/DocumentShares/DocumentSharesModal.d.ts.map +1 -1
- package/lib/typescript/components/Modals/SettingsModals/ManageDataModal/ManageDataModal.d.ts.map +1 -1
- package/lib/typescript/components/Modals/SettingsModals/ProfileShares/ProfileShares.d.ts.map +1 -1
- package/lib/typescript/components/Modals/SettingsModals/Referrals/Referrals.d.ts.map +1 -1
- package/lib/typescript/components/Modals/SettingsModals/SharedStyledComponents.d.ts +1 -0
- package/lib/typescript/components/Modals/SettingsModals/SharedStyledComponents.d.ts.map +1 -1
- package/lib/typescript/components/Modals/SettingsModals/Visibility/VisibilityModal.d.ts.map +1 -1
- package/lib/typescript/components/Modals/UserSettingsModal/UserSettingsModal.d.ts.map +1 -1
- package/lib/typescript/components/RoomComponents/ChatRoomItem.d.ts.map +1 -1
- package/lib/typescript/components/RoomComponents/SwipeableRoomRow.d.ts +5 -1
- package/lib/typescript/components/RoomComponents/SwipeableRoomRow.d.ts.map +1 -1
- package/lib/typescript/components/Thread/ThreadHeader.d.ts.map +1 -1
- package/lib/typescript/components/Thread/ThreadWrapper.d.ts +1 -0
- package/lib/typescript/components/Thread/ThreadWrapper.d.ts.map +1 -1
- package/lib/typescript/components/styled/AudioDecoderHost.d.ts +39 -0
- package/lib/typescript/components/styled/AudioDecoderHost.d.ts.map +1 -0
- package/lib/typescript/components/styled/AudioMessage.d.ts +14 -1
- package/lib/typescript/components/styled/AudioMessage.d.ts.map +1 -1
- package/lib/typescript/components/styled/SendInput.d.ts.map +1 -1
- package/lib/typescript/context/MessageNotificationContext.d.ts.map +1 -1
- package/lib/typescript/context/xmppProvider.d.ts.map +1 -1
- package/lib/typescript/helpers/audioWaveform.d.ts +54 -0
- package/lib/typescript/helpers/audioWaveform.d.ts.map +1 -0
- package/lib/typescript/helpers/backgroundJoinSweep.d.ts +14 -0
- package/lib/typescript/helpers/backgroundJoinSweep.d.ts.map +1 -0
- package/lib/typescript/helpers/bubbleHighlight.d.ts +17 -0
- package/lib/typescript/helpers/bubbleHighlight.d.ts.map +1 -0
- package/lib/typescript/helpers/checkUniqueUsers.d.ts +2 -2
- package/lib/typescript/helpers/checkUniqueUsers.d.ts.map +1 -1
- package/lib/typescript/helpers/constants/MODAL_COMPONENTS.d.ts.map +1 -1
- package/lib/typescript/helpers/constants/MODAL_TYPES.d.ts +2 -0
- package/lib/typescript/helpers/constants/MODAL_TYPES.d.ts.map +1 -1
- package/lib/typescript/helpers/createRoomFromApi.d.ts +25 -0
- package/lib/typescript/helpers/createRoomFromApi.d.ts.map +1 -1
- package/lib/typescript/helpers/dedupeMembers.d.ts +11 -0
- package/lib/typescript/helpers/dedupeMembers.d.ts.map +1 -0
- package/lib/typescript/helpers/ethoraLogger.d.ts +13 -0
- package/lib/typescript/helpers/ethoraLogger.d.ts.map +1 -0
- package/lib/typescript/helpers/getUnnamedUsers.d.ts.map +1 -1
- package/lib/typescript/helpers/historyPreloadConfig.d.ts +26 -0
- package/lib/typescript/helpers/historyPreloadConfig.d.ts.map +1 -0
- package/lib/typescript/helpers/historyPreloadScheduler.d.ts +8 -4
- package/lib/typescript/helpers/historyPreloadScheduler.d.ts.map +1 -1
- package/lib/typescript/helpers/initRoomsPresence.d.ts +7 -0
- package/lib/typescript/helpers/initRoomsPresence.d.ts.map +1 -1
- package/lib/typescript/helpers/insertMessageWithDelimiter.d.ts.map +1 -1
- package/lib/typescript/helpers/isLikelyMucJid.d.ts +19 -0
- package/lib/typescript/helpers/isLikelyMucJid.d.ts.map +1 -0
- package/lib/typescript/helpers/isMessageSearchEnabled.d.ts +12 -0
- package/lib/typescript/helpers/isMessageSearchEnabled.d.ts.map +1 -0
- package/lib/typescript/helpers/joiningRoom.d.ts +7 -0
- package/lib/typescript/helpers/joiningRoom.d.ts.map +1 -0
- package/lib/typescript/helpers/jumpThread.d.ts +48 -0
- package/lib/typescript/helpers/jumpThread.d.ts.map +1 -0
- package/lib/typescript/helpers/jumpToMessage.d.ts +26 -0
- package/lib/typescript/helpers/jumpToMessage.d.ts.map +1 -0
- package/lib/typescript/helpers/jumpWindow.d.ts +74 -0
- package/lib/typescript/helpers/jumpWindow.d.ts.map +1 -0
- package/lib/typescript/helpers/loadRoomHistory.d.ts +34 -0
- package/lib/typescript/helpers/loadRoomHistory.d.ts.map +1 -0
- package/lib/typescript/helpers/notificationPolicy.d.ts +42 -0
- package/lib/typescript/helpers/notificationPolicy.d.ts.map +1 -0
- package/lib/typescript/helpers/openRoomAtMessage.d.ts +17 -0
- package/lib/typescript/helpers/openRoomAtMessage.d.ts.map +1 -0
- package/lib/typescript/helpers/openThreadForJump.d.ts +27 -0
- package/lib/typescript/helpers/openThreadForJump.d.ts.map +1 -0
- package/lib/typescript/helpers/parseMessageReference.d.ts +18 -5
- package/lib/typescript/helpers/parseMessageReference.d.ts.map +1 -1
- package/lib/typescript/helpers/publicChatsEntry.d.ts +11 -0
- package/lib/typescript/helpers/publicChatsEntry.d.ts.map +1 -0
- package/lib/typescript/helpers/roomActivityScore.d.ts +5 -0
- package/lib/typescript/helpers/roomActivityScore.d.ts.map +1 -0
- package/lib/typescript/helpers/roomUserCount.d.ts +20 -0
- package/lib/typescript/helpers/roomUserCount.d.ts.map +1 -0
- package/lib/typescript/helpers/runConfiguredHistoryPreload.d.ts +21 -0
- package/lib/typescript/helpers/runConfiguredHistoryPreload.d.ts.map +1 -0
- package/lib/typescript/helpers/sessionAppId.d.ts +8 -0
- package/lib/typescript/helpers/sessionAppId.d.ts.map +1 -0
- package/lib/typescript/helpers/timestamp.d.ts +3 -0
- package/lib/typescript/helpers/timestamp.d.ts.map +1 -0
- package/lib/typescript/helpers/userResolver.d.ts +58 -0
- package/lib/typescript/helpers/userResolver.d.ts.map +1 -0
- package/lib/typescript/helpers/xmppIdShape.d.ts +10 -0
- package/lib/typescript/helpers/xmppIdShape.d.ts.map +1 -0
- package/lib/typescript/hooks/useChatWrapperInit.d.ts +2 -0
- package/lib/typescript/hooks/useChatWrapperInit.d.ts.map +1 -1
- package/lib/typescript/hooks/useHeapSender.d.ts.map +1 -1
- package/lib/typescript/hooks/useJumpToMessage.d.ts +116 -0
- package/lib/typescript/hooks/useJumpToMessage.d.ts.map +1 -0
- package/lib/typescript/hooks/useMessageLoaderQueue.d.ts.map +1 -1
- package/lib/typescript/hooks/useMessageQueue.d.ts.map +1 -1
- package/lib/typescript/hooks/useRoomDirectory.d.ts +12 -0
- package/lib/typescript/hooks/useRoomDirectory.d.ts.map +1 -0
- package/lib/typescript/hooks/useRoomInitialization.d.ts.map +1 -1
- package/lib/typescript/hooks/useRoomMute.d.ts +8 -0
- package/lib/typescript/hooks/useRoomMute.d.ts.map +1 -0
- package/lib/typescript/hooks/useRoomState.d.ts +1 -0
- package/lib/typescript/hooks/useRoomState.d.ts.map +1 -1
- package/lib/typescript/hooks/useSendMessage.d.ts.map +1 -1
- package/lib/typescript/i18n/strings.d.ts.map +1 -1
- package/lib/typescript/networking/api-requests/messageSearch.api.d.ts +57 -0
- package/lib/typescript/networking/api-requests/messageSearch.api.d.ts.map +1 -0
- package/lib/typescript/networking/api-requests/publicChats.api.d.ts +24 -0
- package/lib/typescript/networking/api-requests/publicChats.api.d.ts.map +1 -0
- package/lib/typescript/networking/api-requests/roomMembers.api.d.ts +19 -1
- package/lib/typescript/networking/api-requests/roomMembers.api.d.ts.map +1 -1
- package/lib/typescript/networking/api-requests/rooms.api.d.ts.map +1 -1
- package/lib/typescript/networking/api-requests/user.api.d.ts +8 -0
- package/lib/typescript/networking/api-requests/user.api.d.ts.map +1 -1
- package/lib/typescript/networking/api-requests/xmppToken.api.d.ts +2 -0
- package/lib/typescript/networking/api-requests/xmppToken.api.d.ts.map +1 -0
- package/lib/typescript/networking/ethoraEvents.d.ts +45 -0
- package/lib/typescript/networking/ethoraEvents.d.ts.map +1 -0
- package/lib/typescript/networking/stanzaHandlers.d.ts +1 -1
- package/lib/typescript/networking/stanzaHandlers.d.ts.map +1 -1
- package/lib/typescript/networking/xmpp/allRoomPresences.xmpp.d.ts +32 -1
- package/lib/typescript/networking/xmpp/allRoomPresences.xmpp.d.ts.map +1 -1
- package/lib/typescript/networking/xmpp/getHistory.xmpp.d.ts +64 -0
- package/lib/typescript/networking/xmpp/getHistory.xmpp.d.ts.map +1 -1
- package/lib/typescript/networking/xmpp/handleStanzas.xmpp.d.ts.map +1 -1
- package/lib/typescript/networking/xmpp/historyCursor.d.ts +35 -0
- package/lib/typescript/networking/xmpp/historyCursor.d.ts.map +1 -0
- package/lib/typescript/networking/xmpp/mamQueryIds.d.ts +10 -0
- package/lib/typescript/networking/xmpp/mamQueryIds.d.ts.map +1 -0
- package/lib/typescript/networking/xmpp/mamRouter.d.ts +7 -0
- package/lib/typescript/networking/xmpp/mamRouter.d.ts.map +1 -1
- package/lib/typescript/networking/xmpp/presenceInRoom.xmpp.d.ts +13 -2
- package/lib/typescript/networking/xmpp/presenceInRoom.xmpp.d.ts.map +1 -1
- package/lib/typescript/networking/xmpp/roomJoinSweep.d.ts +82 -0
- package/lib/typescript/networking/xmpp/roomJoinSweep.d.ts.map +1 -0
- package/lib/typescript/networking/xmpp/sendMediaMessage.xmpp.d.ts.map +1 -1
- package/lib/typescript/networking/xmpp/sendTextMessage.xmpp.d.ts.map +1 -1
- package/lib/typescript/networking/xmpp/sendTextMessageWithTranslateTag.xmpp.d.ts.map +1 -1
- package/lib/typescript/networking/xmppClient.d.ts +90 -4
- package/lib/typescript/networking/xmppClient.d.ts.map +1 -1
- package/lib/typescript/networking/xmppCredentials.d.ts +12 -0
- package/lib/typescript/networking/xmppCredentials.d.ts.map +1 -0
- package/lib/typescript/roomStore/Middleware/jumpThreadMiddleware.d.ts +3 -0
- package/lib/typescript/roomStore/Middleware/jumpThreadMiddleware.d.ts.map +1 -0
- package/lib/typescript/roomStore/Middleware/reactionsMiddleware.d.ts.map +1 -1
- package/lib/typescript/roomStore/Middleware/unreadMidlleware.d.ts.map +1 -1
- package/lib/typescript/roomStore/chatSettingsSlice.d.ts +8 -1
- package/lib/typescript/roomStore/chatSettingsSlice.d.ts.map +1 -1
- package/lib/typescript/roomStore/index.d.ts +2 -1
- package/lib/typescript/roomStore/index.d.ts.map +1 -1
- package/lib/typescript/roomStore/persistence.d.ts +8 -0
- package/lib/typescript/roomStore/persistence.d.ts.map +1 -1
- package/lib/typescript/roomStore/roomsSlice.d.ts +138 -2
- package/lib/typescript/roomStore/roomsSlice.d.ts.map +1 -1
- package/lib/typescript/roomStore/safeKey.d.ts +13 -0
- package/lib/typescript/roomStore/safeKey.d.ts.map +1 -0
- package/lib/typescript/roomStore/usersSetCap.d.ts +16 -0
- package/lib/typescript/roomStore/usersSetCap.d.ts.map +1 -0
- package/lib/typescript/types/models/media.model.d.ts +2 -0
- package/lib/typescript/types/models/media.model.d.ts.map +1 -1
- package/lib/typescript/types/models/room.model.d.ts +18 -5
- package/lib/typescript/types/models/room.model.d.ts.map +1 -1
- package/lib/typescript/types/models/xmpp.model.d.ts +8 -1
- package/lib/typescript/types/models/xmpp.model.d.ts.map +1 -1
- package/lib/typescript/types/types.d.ts +88 -5
- package/lib/typescript/types/types.d.ts.map +1 -1
- package/lib/typescript/version.d.ts +1 -1
- package/lib/typescript/version.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/assets/icons.tsx +13 -0
- package/src/components/Header/HeaderRoomList.tsx +21 -4
- package/src/components/InputComponents/Search.tsx +33 -0
- package/src/components/MainComponents/ArchivedMessageCard.tsx +139 -0
- package/src/components/MainComponents/ChatHeader.tsx +19 -3
- package/src/components/MainComponents/ChatRoom.tsx +60 -23
- package/src/components/MainComponents/ChatWrapper.tsx +23 -4
- package/src/components/MainComponents/MediaMessage.tsx +17 -0
- package/src/components/MainComponents/MessageList.tsx +823 -84
- package/src/components/MainComponents/MessageSearchButton.tsx +48 -0
- package/src/components/MainComponents/ReduxWrapper.tsx +16 -5
- package/src/components/MainComponents/RoomList.tsx +125 -0
- package/src/components/Menu/HeaderRoomListMenu.tsx +26 -2
- package/src/components/MessageBubble/BubbleHighlight.tsx +106 -0
- package/src/components/MessageBubble/Message.tsx +265 -177
- package/src/components/MessageBubble/MessageInteractions.tsx +109 -86
- package/src/components/MessageBubble/messageMenuLayout.ts +59 -0
- package/src/components/Modals/ChatProfileModal/ChatProfileModal.tsx +92 -21
- package/src/components/Modals/MessageSearchModal/MessageHitResults.tsx +271 -0
- package/src/components/Modals/MessageSearchModal/MessageSearchModal.tsx +487 -0
- package/src/components/Modals/MessageSearchModal/openHit.ts +50 -0
- package/src/components/Modals/MessageSearchModal/resolveSender.ts +57 -0
- package/src/components/Modals/MessageSearchModal/searchFilters.ts +109 -0
- package/src/components/Modals/MessageSearchModal/snippet.ts +58 -0
- package/src/components/Modals/MessageSearchModal/useMessageSearch.ts +151 -0
- package/src/components/Modals/PublicChatsModal/PublicChatsModal.tsx +288 -0
- package/src/components/Modals/PublicChatsModal/publicChatsLogic.ts +36 -0
- package/src/components/Modals/SelectUsersModal/SelectUsersModal.tsx +8 -1
- package/src/components/Modals/SettingsModals/BlockedUsers/BlockedUsersModal.tsx +20 -17
- package/src/components/Modals/SettingsModals/DocumentShares/DocumentSharesModal.tsx +58 -55
- package/src/components/Modals/SettingsModals/ManageDataModal/ManageDataModal.tsx +156 -62
- package/src/components/Modals/SettingsModals/ProfileShares/ProfileShares.tsx +22 -19
- package/src/components/Modals/SettingsModals/Referrals/Referrals.tsx +48 -45
- package/src/components/Modals/SettingsModals/SharedStyledComponents.ts +11 -0
- package/src/components/Modals/SettingsModals/Visibility/VisibilityModal.tsx +63 -60
- package/src/components/Modals/UserSettingsModal/UserSettingsModal.tsx +11 -3
- package/src/components/RoomComponents/ChatRoomItem.tsx +16 -3
- package/src/components/RoomComponents/SwipeableRoomRow.tsx +39 -6
- package/src/components/Thread/ThreadHeader.tsx +3 -1
- package/src/components/Thread/ThreadWrapper.tsx +96 -10
- package/src/components/styled/AudioDecoderHost.tsx +351 -0
- package/src/components/styled/AudioMessage.tsx +482 -425
- package/src/components/styled/SendInput.tsx +42 -4
- package/src/context/MessageNotificationContext.tsx +19 -5
- package/src/context/xmppProvider.tsx +44 -91
- package/src/helpers/audioWaveform.ts +142 -0
- package/src/helpers/backgroundJoinSweep.ts +35 -0
- package/src/helpers/bubbleHighlight.ts +47 -0
- package/src/helpers/checkUniqueUsers.tsx +15 -17
- package/src/helpers/constants/MODAL_COMPONENTS.tsx +4 -0
- package/src/helpers/constants/MODAL_TYPES.ts +3 -0
- package/src/helpers/createRoomFromApi.tsx +45 -4
- package/src/helpers/dedupeMembers.ts +29 -0
- package/src/helpers/ethoraLogger.ts +50 -0
- package/src/helpers/getUnnamedUsers.ts +7 -4
- package/src/helpers/historyPreloadConfig.ts +68 -0
- package/src/helpers/historyPreloadScheduler.ts +437 -199
- package/src/helpers/initRoomsPresence.ts +20 -7
- package/src/helpers/insertMessageWithDelimiter.ts +3 -0
- package/src/helpers/isLikelyMucJid.ts +72 -0
- package/src/helpers/isMessageSearchEnabled.ts +18 -0
- package/src/helpers/joiningRoom.ts +13 -0
- package/src/helpers/jumpThread.ts +102 -0
- package/src/helpers/jumpToMessage.ts +57 -0
- package/src/helpers/jumpWindow.ts +212 -0
- package/src/helpers/loadRoomHistory.ts +83 -0
- package/src/helpers/notificationPolicy.ts +82 -0
- package/src/helpers/openRoomAtMessage.ts +38 -0
- package/src/helpers/openThreadForJump.ts +96 -0
- package/src/helpers/parseMessageReference.ts +37 -8
- package/src/helpers/publicChatsEntry.ts +15 -0
- package/src/helpers/roomActivityScore.ts +45 -0
- package/src/helpers/roomUserCount.ts +44 -0
- package/src/helpers/runConfiguredHistoryPreload.ts +76 -0
- package/src/helpers/sessionAppId.ts +17 -0
- package/src/helpers/timestamp.ts +44 -0
- package/src/helpers/userResolver.ts +542 -0
- package/src/helpers/xmppIdShape.ts +46 -0
- package/src/hooks/useChatWrapperInit.ts +22 -4
- package/src/hooks/useHeapSender.tsx +54 -3
- package/src/hooks/useJumpToMessage.ts +538 -0
- package/src/hooks/useMessageLoaderQueue.tsx +40 -4
- package/src/hooks/useMessageQueue.ts +9 -5
- package/src/hooks/useRoomDirectory.ts +39 -0
- package/src/hooks/useRoomInitialization.tsx +33 -7
- package/src/hooks/useRoomMute.ts +42 -0
- package/src/hooks/useRoomState.tsx +6 -0
- package/src/hooks/useSendMessage.tsx +14 -2
- package/src/i18n/strings.ts +306 -0
- package/src/networking/api-requests/messageSearch.api.ts +130 -0
- package/src/networking/api-requests/publicChats.api.ts +71 -0
- package/src/networking/api-requests/roomMembers.api.ts +263 -11
- package/src/networking/api-requests/rooms.api.ts +52 -12
- package/src/networking/api-requests/user.api.ts +28 -2
- package/src/networking/api-requests/xmppToken.api.ts +62 -0
- package/src/networking/ethoraEvents.ts +262 -0
- package/src/networking/stanzaHandlers.ts +145 -19
- package/src/networking/xmpp/allRoomPresences.xmpp.ts +155 -5
- package/src/networking/xmpp/getHistory.xmpp.ts +433 -47
- package/src/networking/xmpp/handleStanzas.xmpp.ts +8 -0
- package/src/networking/xmpp/historyCursor.ts +124 -0
- package/src/networking/xmpp/mamQueryIds.ts +11 -0
- package/src/networking/xmpp/mamRouter.ts +24 -10
- package/src/networking/xmpp/presenceInRoom.xmpp.ts +91 -68
- package/src/networking/xmpp/roomJoinSweep.ts +412 -0
- package/src/networking/xmpp/sendMediaMessage.xmpp.ts +0 -1
- package/src/networking/xmpp/sendTextMessage.xmpp.ts +0 -1
- package/src/networking/xmpp/sendTextMessageWithTranslateTag.xmpp.ts +0 -1
- package/src/networking/xmppClient.ts +323 -47
- package/src/networking/xmppCredentials.ts +87 -0
- package/src/roomStore/Middleware/jumpThreadMiddleware.ts +163 -0
- package/src/roomStore/Middleware/reactionsMiddleware.tsx +4 -0
- package/src/roomStore/Middleware/unreadMidlleware.tsx +59 -11
- package/src/roomStore/chatSettingsSlice.ts +17 -0
- package/src/roomStore/index.ts +10 -3
- package/src/roomStore/persistence.ts +54 -0
- package/src/roomStore/roomsSlice.ts +547 -65
- package/src/roomStore/safeKey.ts +49 -0
- package/src/roomStore/usersSetCap.ts +37 -0
- package/src/types/models/media.model.ts +4 -0
- package/src/types/models/room.model.ts +18 -5
- package/src/types/models/xmpp.model.ts +15 -1
- package/src/types/types.ts +93 -5
- package/src/version.ts +1 -1
|
@@ -7,6 +7,10 @@ import {
|
|
|
7
7
|
RUNTIME_MESSAGE_LIMIT,
|
|
8
8
|
} from '../roomStore/roomsSlice';
|
|
9
9
|
import { IMessage, IRoom } from '../types/types';
|
|
10
|
+
import {
|
|
11
|
+
getMessageTimestamp,
|
|
12
|
+
getRoomLastActivityScore,
|
|
13
|
+
} from './roomActivityScore';
|
|
10
14
|
|
|
11
15
|
interface HistoryPreloadSchedulerOptions {
|
|
12
16
|
client: XmppClient;
|
|
@@ -19,6 +23,15 @@ interface HistoryPreloadSchedulerOptions {
|
|
|
19
23
|
selectedRoomJid?: string | null;
|
|
20
24
|
defaultRoomJids?: string[];
|
|
21
25
|
forceReload?: boolean;
|
|
26
|
+
// State stamped on successfully preloaded rooms. The staged flow's first
|
|
27
|
+
// (preview) pass uses 'partial' so the second, bigger-page pass still
|
|
28
|
+
// processes those rooms; only 'done' short-circuits future preloads.
|
|
29
|
+
completionState?: 'done' | 'partial';
|
|
30
|
+
// Preview pass: skip rooms that already have a list preview (loaded
|
|
31
|
+
// messages, or an API `lastMessage` seed from /chats/my). The pass exists
|
|
32
|
+
// only to fill that preview, so for those rooms it would be a wasted MAM
|
|
33
|
+
// query. `roomLimit` then counts the rooms that actually needed one.
|
|
34
|
+
skipApiPreview?: boolean;
|
|
22
35
|
}
|
|
23
36
|
|
|
24
37
|
interface QueueItem {
|
|
@@ -33,28 +46,38 @@ const DEFAULT_CONCURRENCY = 3;
|
|
|
33
46
|
const DEFAULT_PAGE_SIZE = 10;
|
|
34
47
|
const DEFAULT_RETRY_LIMIT = 2;
|
|
35
48
|
const DEFAULT_FIRST_WAVE = 30;
|
|
36
|
-
|
|
49
|
+
// Past the first wave a worker rests this long between rooms, so a long
|
|
50
|
+
// background sweep does not saturate the socket a user is also chatting on.
|
|
51
|
+
const BACKGROUND_ROOM_PAUSE_MS = 400;
|
|
52
|
+
// When the first page is entirely unread (every fetched message is newer
|
|
53
|
+
// than `lastViewedTimestamp`), the true unread count could be far bigger
|
|
54
|
+
// than `pageSize` - `useUnread()` only ever sees what's been loaded. Page
|
|
55
|
+
// further back, up to this many extra fetches, until we either find the
|
|
56
|
+
// boundary or give up (`unreadCapped` then stays true so callers at least
|
|
57
|
+
// know the count is a floor, not exact). Customer-reported #34.
|
|
58
|
+
const MAX_UNREAD_CATCHUP_PAGES = 8;
|
|
59
|
+
// How many older pages one room may pull when its newest page has rows but
|
|
60
|
+
// nothing displayable (reactions / receipts only). Bounds the worst case.
|
|
61
|
+
const MAX_EMPTY_PAGE_FOLLOWS = 4;
|
|
62
|
+
const FOLLOW_PAGE_SIZE = 10;
|
|
63
|
+
// A room's first MAM page waits at most this long for its (deduped) join.
|
|
64
|
+
const JOIN_BEFORE_FETCH_TIMEOUT_MS = 3000;
|
|
65
|
+
|
|
66
|
+
// Marker for "MAM returned an empty page for a room the server hasn't
|
|
67
|
+
// declared complete" - retried like a failure, but never terminal.
|
|
68
|
+
const EMPTY_PAGE_ERROR = 'history_empty_page';
|
|
37
69
|
|
|
38
70
|
const sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
39
71
|
|
|
40
72
|
declare const __DEV__: boolean | undefined;
|
|
41
73
|
|
|
42
|
-
const messageTimestamp = (m: IMessage): number =>
|
|
43
|
-
if (!m) {return 0;}
|
|
44
|
-
const t = (m as any).timestamp;
|
|
45
|
-
if (Number.isFinite(t) && t > 0) {return Number(t);}
|
|
46
|
-
const id = Number(m.id);
|
|
47
|
-
if (Number.isFinite(id) && id > 0) {return id;}
|
|
48
|
-
return 0;
|
|
49
|
-
};
|
|
74
|
+
const messageTimestamp = (m: IMessage): number => getMessageTimestamp(m);
|
|
50
75
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
const fromSeed = Number(room?.lastMessage?.id) || 0;
|
|
57
|
-
return Math.max(fromMessages, fromStamp, fromSeed);
|
|
76
|
+
// Store keys that can be a room (`local@domain`); root-slice keys that leak
|
|
77
|
+
// into `rooms.rooms` from corrupted persisted state have no `@`.
|
|
78
|
+
const isRoomKey = (jid: string): boolean => {
|
|
79
|
+
const at = jid.indexOf('@');
|
|
80
|
+
return at > 0 && at < jid.length - 1;
|
|
58
81
|
};
|
|
59
82
|
|
|
60
83
|
const computeUnreadCapped = (
|
|
@@ -102,13 +125,63 @@ const shouldPauseForVisibility = (): boolean => {
|
|
|
102
125
|
return AppState.currentState !== 'active';
|
|
103
126
|
};
|
|
104
127
|
|
|
128
|
+
// A room list preview that came from /chats/my: a seeded `lastMessage` and no
|
|
129
|
+
// loaded messages. Exported for the scheduler's tests.
|
|
130
|
+
export const hasApiPreview = (room?: IRoom): boolean =>
|
|
131
|
+
!!room &&
|
|
132
|
+
(room.messages?.length ?? 0) === 0 &&
|
|
133
|
+
!!String(room.lastMessage?.body || '').trim();
|
|
134
|
+
|
|
135
|
+
// Anything the room list can already render a preview from.
|
|
136
|
+
const hasListPreview = (room?: IRoom): boolean =>
|
|
137
|
+
!!room &&
|
|
138
|
+
((room.messages?.length ?? 0) > 0 ||
|
|
139
|
+
!!String(room.lastMessage?.body || '').trim());
|
|
140
|
+
|
|
141
|
+
// Sweeps of one client run one after the other (the staged flow's preview
|
|
142
|
+
// and full-page passes, a bootstrap racing the chat wrapper's own start).
|
|
143
|
+
// CHAINED, not deduped onto one promise: each caller carries its own
|
|
144
|
+
// pageSize/completionState, so handing a late caller someone else's promise
|
|
145
|
+
// would silently skip its work; the per-room historyPreloadState guard makes
|
|
146
|
+
// the follow-up cheap wherever an earlier sweep already did the job.
|
|
147
|
+
const preloadChainByClient = new Map<string, Promise<void>>();
|
|
148
|
+
// The "unread syncing" flag stays up while ANY sweep runs (a counter, not a
|
|
149
|
+
// per-sweep toggle, so chained sweeps do not flicker it off between them).
|
|
150
|
+
let activeSweeps = 0;
|
|
151
|
+
|
|
152
|
+
const getClientKey = (client: XmppClient): string =>
|
|
153
|
+
(client as any)?.client?.jid?.toString?.() ||
|
|
154
|
+
(client as any)?.username ||
|
|
155
|
+
'xmpp-client';
|
|
156
|
+
|
|
105
157
|
/**
|
|
106
|
-
* Background-loads message history
|
|
107
|
-
*
|
|
108
|
-
*
|
|
109
|
-
*
|
|
158
|
+
* Background-loads message history into the redux store. Rooms are picked by
|
|
159
|
+
* selected/default rooms first, then by recent activity; a room the user
|
|
160
|
+
* opens while the sweep runs jumps the queue. Coalesces with the XMPP
|
|
161
|
+
* client's MAM queue (so the active-room scroll fetch wins).
|
|
110
162
|
*/
|
|
111
|
-
export const runHistoryPreloadScheduler =
|
|
163
|
+
export const runHistoryPreloadScheduler = (
|
|
164
|
+
options: HistoryPreloadSchedulerOptions
|
|
165
|
+
): Promise<void> => {
|
|
166
|
+
const clientKey = getClientKey(options.client);
|
|
167
|
+
const previous = preloadChainByClient.get(clientKey) || Promise.resolve();
|
|
168
|
+
|
|
169
|
+
const run = previous
|
|
170
|
+
.catch(() => {})
|
|
171
|
+
.then(() => runHistoryPreloadSweep(options));
|
|
172
|
+
|
|
173
|
+
const tracked = run
|
|
174
|
+
.catch(() => {})
|
|
175
|
+
.finally(() => {
|
|
176
|
+
if (preloadChainByClient.get(clientKey) === tracked) {
|
|
177
|
+
preloadChainByClient.delete(clientKey);
|
|
178
|
+
}
|
|
179
|
+
});
|
|
180
|
+
preloadChainByClient.set(clientKey, tracked);
|
|
181
|
+
return run;
|
|
182
|
+
};
|
|
183
|
+
|
|
184
|
+
const runHistoryPreloadSweep = async (
|
|
112
185
|
options: HistoryPreloadSchedulerOptions
|
|
113
186
|
): Promise<void> => {
|
|
114
187
|
const {
|
|
@@ -122,210 +195,375 @@ export const runHistoryPreloadScheduler = async (
|
|
|
122
195
|
selectedRoomJid = null,
|
|
123
196
|
defaultRoomJids = [],
|
|
124
197
|
forceReload = false,
|
|
198
|
+
completionState = 'done',
|
|
199
|
+
skipApiPreview = false,
|
|
125
200
|
} = options;
|
|
126
201
|
|
|
127
202
|
if (signal?.aborted) {return;}
|
|
128
203
|
|
|
129
204
|
const startedAt = Date.now();
|
|
130
205
|
let firstWaveLogged = false;
|
|
206
|
+
let started = 0;
|
|
131
207
|
const devLog = (msg: string) => {
|
|
132
208
|
if (typeof __DEV__ !== 'undefined' && __DEV__) {console.log(msg);}
|
|
133
209
|
};
|
|
134
210
|
|
|
135
|
-
|
|
211
|
+
activeSweeps += 1;
|
|
212
|
+
if (activeSweeps === 1) {store.dispatch(setUnreadSyncing(true));}
|
|
136
213
|
try {
|
|
214
|
+
await runSweepBody();
|
|
215
|
+
} finally {
|
|
216
|
+
devLog(`[preload] finished in ${Date.now() - startedAt}ms`);
|
|
217
|
+
activeSweeps -= 1;
|
|
218
|
+
if (activeSweeps === 0) {store.dispatch(setUnreadSyncing(false));}
|
|
219
|
+
}
|
|
137
220
|
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
jid,
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
const now = Date.now();
|
|
183
|
-
const readyItems = queue.filter(
|
|
184
|
-
(item) => item.readyAt <= now && !inFlightByRoom.has(item.jid)
|
|
185
|
-
);
|
|
186
|
-
if (readyItems.length === 0) {
|
|
187
|
-
await sleep(60);
|
|
188
|
-
continue;
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
const batch = readyItems.slice(0, Math.max(1, concurrency));
|
|
192
|
-
const inBackgroundWave = started >= firstWave;
|
|
193
|
-
if (inBackgroundWave && !firstWaveLogged) {
|
|
194
|
-
firstWaveLogged = true;
|
|
195
|
-
devLog(`[preload] first wave done in ${Date.now() - startedAt}ms`);
|
|
196
|
-
}
|
|
197
|
-
started += batch.length;
|
|
198
|
-
|
|
199
|
-
// Snapshot each room's historyPreloadState BEFORE marking the
|
|
200
|
-
// batch as 'loading'. Without this snapshot the per-task
|
|
201
|
-
// `currentRoom.historyPreloadState === 'done'` skip check below
|
|
202
|
-
// is dead — the dispatch immediately overwrites 'done' with
|
|
203
|
-
// 'loading', so the task never sees the original value and
|
|
204
|
-
// always re-fetches.
|
|
205
|
-
const preBatchPreloadStateByJid = new Map<string, string | undefined>(
|
|
206
|
-
batch.map((item) => [
|
|
207
|
-
item.jid,
|
|
208
|
-
store.getState().rooms.rooms[item.jid]?.historyPreloadState,
|
|
209
|
-
])
|
|
221
|
+
async function runSweepBody(): Promise<void> {
|
|
222
|
+
const rooms = (store.getState().rooms.rooms || {}) as Record<string, IRoom>;
|
|
223
|
+
const defaultSet = new Set(defaultRoomJids);
|
|
224
|
+
|
|
225
|
+
const sortedQueue: QueueItem[] = Object.entries(rooms)
|
|
226
|
+
.filter(([jid]) => isRoomKey(jid))
|
|
227
|
+
.map(([jid, room]: [string, IRoom]) => ({
|
|
228
|
+
jid,
|
|
229
|
+
priority: getRoomPriority(jid, room, selectedRoomJid, defaultSet),
|
|
230
|
+
activityScore: getRoomLastActivityScore(room),
|
|
231
|
+
attempts: 0,
|
|
232
|
+
readyAt: Date.now(),
|
|
233
|
+
}))
|
|
234
|
+
.sort((a, b) => {
|
|
235
|
+
if (a.priority !== b.priority) {return a.priority - b.priority;}
|
|
236
|
+
if (a.activityScore !== b.activityScore) {
|
|
237
|
+
return b.activityScore - a.activityScore;
|
|
238
|
+
}
|
|
239
|
+
return a.jid.localeCompare(b.jid);
|
|
240
|
+
});
|
|
241
|
+
// Top-N by recent activity FIRST, then drop what needs no work.
|
|
242
|
+
// Filtering 'done' rooms before the cut would let every reconnect slide
|
|
243
|
+
// the window down the list (the 8 done rooms vanish, the next 8 get
|
|
244
|
+
// preloaded), so "top N" would quietly grow into "all" over a few
|
|
245
|
+
// reconnects. The preview pass is the exception: it counts rooms that
|
|
246
|
+
// still LACK a preview, because a room the API gave no `lastMessage`
|
|
247
|
+
// for ranks at the bottom of an activity sort and would otherwise never
|
|
248
|
+
// get one.
|
|
249
|
+
const needsWork = (item: QueueItem): boolean => {
|
|
250
|
+
const room = rooms[item.jid];
|
|
251
|
+
if (!forceReload && room?.historyPreloadState === 'done') {return false;}
|
|
252
|
+
if (skipApiPreview && hasListPreview(room)) {return false;}
|
|
253
|
+
return true;
|
|
254
|
+
};
|
|
255
|
+
const withLimit = (items: QueueItem[]) =>
|
|
256
|
+
roomLimit && roomLimit > 0 ? items.slice(0, roomLimit) : items;
|
|
257
|
+
const queue: QueueItem[] = skipApiPreview
|
|
258
|
+
? withLimit(sortedQueue.filter(needsWork))
|
|
259
|
+
: withLimit(sortedQueue).filter(needsWork);
|
|
260
|
+
|
|
261
|
+
const inFlightByRoom = new Map<string, Promise<void>>();
|
|
262
|
+
let consecutiveErrorCount = 0;
|
|
263
|
+
devLog(
|
|
264
|
+
`[preload] ${queue.length} rooms queued, first wave ${Math.min(firstWave, queue.length)}, page ${pageSize}`
|
|
210
265
|
);
|
|
211
266
|
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
267
|
+
// Rooms that no longer need this sweep's work: preloaded by another path
|
|
268
|
+
// (the user opened them, a parallel bootstrap, an earlier sweep) or gone.
|
|
269
|
+
// Checked when an item is PICKED, before the 'loading' flag is written:
|
|
270
|
+
// flagging a batch 'loading' first and asking "already done?" after could
|
|
271
|
+
// never be true, so every reconnect refetched done rooms and flickered
|
|
272
|
+
// them through 'loading'.
|
|
273
|
+
const isSatisfied = (jid: string): boolean => {
|
|
274
|
+
const current = store.getState().rooms.rooms[jid];
|
|
275
|
+
if (!current) {return true;}
|
|
276
|
+
if (forceReload) {return false;}
|
|
277
|
+
return current.historyPreloadState === 'done';
|
|
278
|
+
};
|
|
279
|
+
|
|
280
|
+
const pickNext = (): QueueItem | null => {
|
|
281
|
+
const now = Date.now();
|
|
282
|
+
const activeJid = store.getState().rooms.activeRoomJID;
|
|
283
|
+
// A room the user opened while the sweep runs jumps the queue.
|
|
284
|
+
let best = -1;
|
|
285
|
+
for (let index = 0; index < queue.length; index += 1) {
|
|
286
|
+
const item = queue[index];
|
|
287
|
+
if (item.readyAt > now || inFlightByRoom.has(item.jid)) {continue;}
|
|
288
|
+
if (best === -1) {
|
|
289
|
+
best = index;
|
|
290
|
+
continue;
|
|
291
|
+
}
|
|
292
|
+
if (activeJid && item.jid === activeJid) {
|
|
293
|
+
best = index;
|
|
294
|
+
break;
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
if (best === -1) {return null;}
|
|
298
|
+
return queue.splice(best, 1)[0];
|
|
299
|
+
};
|
|
300
|
+
|
|
301
|
+
const processItem = async (item: QueueItem): Promise<void> => {
|
|
302
|
+
if (isSatisfied(item.jid)) {
|
|
303
|
+
// Nothing to fetch. Leave the state alone: stamping 'done' on a room
|
|
304
|
+
// that is merely missing would resurrect it as a ghost entry.
|
|
305
|
+
return;
|
|
306
|
+
}
|
|
220
307
|
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
) {
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
308
|
+
store.dispatch(
|
|
309
|
+
applyRoomsPreloadBatch({
|
|
310
|
+
rooms: [{ jid: item.jid, historyPreloadState: 'loading' }],
|
|
311
|
+
})
|
|
312
|
+
);
|
|
313
|
+
|
|
314
|
+
try {
|
|
315
|
+
// MAM does not need the room joined, but a room that is not joined
|
|
316
|
+
// yet gets its (deduped) join first, best effort: the join sweep may
|
|
317
|
+
// not have reached it, and a members-only archive wants it.
|
|
318
|
+
try {
|
|
319
|
+
await (client as any).ensureRoomPresence?.(item.jid, {
|
|
320
|
+
timeoutMs: JOIN_BEFORE_FETCH_TIMEOUT_MS,
|
|
321
|
+
source: 'background',
|
|
322
|
+
// The sweep merges pages itself (one batch per room, with gap and
|
|
323
|
+
// unread detection): the MAM router must not apply them as well.
|
|
324
|
+
selfApplied: true,
|
|
325
|
+
});
|
|
326
|
+
} catch {}
|
|
327
|
+
if (signal?.aborted) {return;}
|
|
328
|
+
|
|
329
|
+
const fetchPage = (max: number, before?: number) =>
|
|
330
|
+
client.getHistoryStanza(item.jid, max, before, undefined, {
|
|
331
|
+
coalesceRoom: true,
|
|
332
|
+
skipIfPreloaded: !forceReload,
|
|
333
|
+
source: 'background',
|
|
334
|
+
});
|
|
335
|
+
|
|
336
|
+
let fetchedMessages = await fetchPage(pageSize);
|
|
337
|
+
if (signal?.aborted) {return;}
|
|
338
|
+
if (typeof fetchedMessages === 'undefined') {
|
|
339
|
+
throw new Error('history_timeout');
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
// A page can hold rows and still yield nothing displayable: a room
|
|
343
|
+
// whose newest archive rows are reactions or receipts parses to an
|
|
344
|
+
// empty list. That page is inconclusive, not a failure. Follow the
|
|
345
|
+
// server's RSM cursor (stored as messageStats.firstMessageTimestamp)
|
|
346
|
+
// to older pages until something displayable turns up, the archive
|
|
347
|
+
// is exhausted or the budget is spent.
|
|
348
|
+
let pagesFetched = 1;
|
|
349
|
+
let followedCursor = false;
|
|
350
|
+
let lastCursor: number | undefined;
|
|
351
|
+
while (
|
|
352
|
+
fetchedMessages.length === 0 &&
|
|
353
|
+
pagesFetched < MAX_EMPTY_PAGE_FOLLOWS + 1
|
|
354
|
+
) {
|
|
355
|
+
const roomNow = store.getState().rooms.rooms[item.jid];
|
|
356
|
+
if (roomNow?.historyComplete === true) {break;}
|
|
357
|
+
const cursor = roomNow?.messageStats?.firstMessageTimestamp;
|
|
358
|
+
// No cursor means the server returned no rows at all (not joined /
|
|
359
|
+
// archive not ready): nothing to follow, the retry path handles it.
|
|
360
|
+
if (!cursor || !Number.isFinite(cursor) || cursor === lastCursor) {
|
|
361
|
+
break;
|
|
239
362
|
}
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
// pulled the true boundary can still have it silently dropped
|
|
266
|
-
// by that cap, leaving a falsely-confident `unreadCapped:false`
|
|
267
|
-
// (bug #34's failure mode again, just one layer downstream).
|
|
268
|
-
// Simulate that cap here so the flag reflects what will
|
|
269
|
-
// actually survive, not just what this fetch retrieved.
|
|
270
|
-
const simulatedStored =
|
|
271
|
-
combined.length > RUNTIME_MESSAGE_LIMIT
|
|
272
|
-
? combined.slice(-RUNTIME_MESSAGE_LIMIT)
|
|
273
|
-
: combined;
|
|
274
|
-
const unreadCapped = computeUnreadCapped(
|
|
275
|
-
nextRoom,
|
|
276
|
-
simulatedStored,
|
|
277
|
-
pageSize
|
|
278
|
-
);
|
|
279
|
-
|
|
363
|
+
lastCursor = cursor;
|
|
364
|
+
followedCursor = true;
|
|
365
|
+
const older = await fetchPage(
|
|
366
|
+
Math.max(pageSize, FOLLOW_PAGE_SIZE),
|
|
367
|
+
cursor
|
|
368
|
+
);
|
|
369
|
+
if (signal?.aborted) {return;}
|
|
370
|
+
if (typeof older === 'undefined') {throw new Error('history_timeout');}
|
|
371
|
+
pagesFetched += 1;
|
|
372
|
+
fetchedMessages = older;
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
const nextRoom = store.getState().rooms.rooms[item.jid];
|
|
376
|
+
|
|
377
|
+
// An empty page for a room the server hasn't declared complete is
|
|
378
|
+
// almost always "not joined / archive not ready yet", not "this room
|
|
379
|
+
// has no messages". Marking it 'done' froze the room with an empty
|
|
380
|
+
// transcript forever. When the cursor was followed and the budget
|
|
381
|
+
// ran out the archive does have rows (just none displayable yet),
|
|
382
|
+
// so that settles as 'partial' straight away; without a cursor the
|
|
383
|
+
// sweep retries.
|
|
384
|
+
const isInconclusiveEmptyPage =
|
|
385
|
+
fetchedMessages.length === 0 && nextRoom?.historyComplete !== true;
|
|
386
|
+
if (isInconclusiveEmptyPage) {
|
|
387
|
+
if (followedCursor) {
|
|
280
388
|
store.dispatch(
|
|
281
389
|
applyRoomsPreloadBatch({
|
|
282
|
-
rooms: [
|
|
283
|
-
{
|
|
284
|
-
jid: item.jid,
|
|
285
|
-
messages: combined,
|
|
286
|
-
unreadCapped,
|
|
287
|
-
historyPreloadState: 'done',
|
|
288
|
-
},
|
|
289
|
-
],
|
|
390
|
+
rooms: [{ jid: item.jid, historyPreloadState: 'partial' }],
|
|
290
391
|
})
|
|
291
392
|
);
|
|
292
393
|
consecutiveErrorCount = 0;
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
394
|
+
return;
|
|
395
|
+
}
|
|
396
|
+
throw new Error(EMPTY_PAGE_ERROR);
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
let combined: IMessage[] = fetchedMessages;
|
|
400
|
+
const lastViewed = Number(nextRoom?.lastViewedTimestamp) || 0;
|
|
401
|
+
|
|
402
|
+
// The first page was entirely unread: keep paging older until a
|
|
403
|
+
// message at/before `lastViewedTimestamp` (the true boundary) is
|
|
404
|
+
// found or the catch-up budget runs out, so the count isn't silently
|
|
405
|
+
// truncated at `pageSize`.
|
|
406
|
+
if (
|
|
407
|
+
lastViewed > 0 &&
|
|
408
|
+
computeUnreadCapped(nextRoom, combined, pageSize)
|
|
409
|
+
) {
|
|
410
|
+
let lastPageLen = combined.length;
|
|
411
|
+
let extraPages = 0;
|
|
412
|
+
while (
|
|
413
|
+
extraPages < MAX_UNREAD_CATCHUP_PAGES &&
|
|
414
|
+
lastPageLen >= pageSize &&
|
|
415
|
+
!signal?.aborted
|
|
416
|
+
) {
|
|
417
|
+
const oldestId = combined.reduce<number | null>((min, m) => {
|
|
418
|
+
const idNum = Number((m as any)?.id);
|
|
419
|
+
if (!Number.isFinite(idNum)) {return min;}
|
|
420
|
+
return min === null || idNum < min ? idNum : min;
|
|
421
|
+
}, null);
|
|
422
|
+
if (oldestId === null) {break;}
|
|
423
|
+
|
|
424
|
+
let older: IMessage[] | undefined;
|
|
425
|
+
try {
|
|
426
|
+
older = await fetchPage(pageSize, oldestId);
|
|
427
|
+
} catch {
|
|
428
|
+
break;
|
|
310
429
|
}
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
430
|
+
if (!older || !older.length) {break;}
|
|
431
|
+
|
|
432
|
+
combined = [...older, ...combined];
|
|
433
|
+
lastPageLen = older.length;
|
|
434
|
+
extraPages++;
|
|
435
|
+
|
|
436
|
+
const oldestTs = combined.reduce<number>((minTs, m) => {
|
|
437
|
+
const ts = messageTimestamp(m);
|
|
438
|
+
return ts > 0 ? Math.min(minTs, ts) : minTs;
|
|
439
|
+
}, Number.MAX_SAFE_INTEGER);
|
|
440
|
+
if (oldestTs !== Number.MAX_SAFE_INTEGER && oldestTs <= lastViewed) {
|
|
441
|
+
break;
|
|
315
442
|
}
|
|
316
443
|
}
|
|
317
|
-
}
|
|
318
|
-
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
// `mergeHistoryIntoCache` (roomsSlice) caps whatever we dispatch to
|
|
447
|
+
// the newest RUNTIME_MESSAGE_LIMIT messages before it reaches
|
|
448
|
+
// `unreadMiddleware`, so a catch-up that pulled the true boundary can
|
|
449
|
+
// still have it dropped by that cap (bug #34's failure mode one layer
|
|
450
|
+
// downstream). Simulate the cap so the flag reflects what survives.
|
|
451
|
+
const simulatedStored =
|
|
452
|
+
combined.length > RUNTIME_MESSAGE_LIMIT
|
|
453
|
+
? combined.slice(-RUNTIME_MESSAGE_LIMIT)
|
|
454
|
+
: combined;
|
|
455
|
+
const unreadCapped = computeUnreadCapped(
|
|
456
|
+
nextRoom,
|
|
457
|
+
simulatedStored,
|
|
458
|
+
pageSize
|
|
459
|
+
);
|
|
460
|
+
|
|
461
|
+
store.dispatch(
|
|
462
|
+
applyRoomsPreloadBatch({
|
|
463
|
+
rooms: [
|
|
464
|
+
{
|
|
465
|
+
jid: item.jid,
|
|
466
|
+
messages: combined,
|
|
467
|
+
unreadCapped,
|
|
468
|
+
historyPreloadState: completionState,
|
|
469
|
+
},
|
|
470
|
+
],
|
|
471
|
+
})
|
|
472
|
+
);
|
|
473
|
+
consecutiveErrorCount = 0;
|
|
474
|
+
} catch (error) {
|
|
475
|
+
const isEmptyPage = (error as Error)?.message === EMPTY_PAGE_ERROR;
|
|
476
|
+
const retries = item.attempts + 1;
|
|
477
|
+
const canRetry = retries <= retryLimit;
|
|
478
|
+
|
|
479
|
+
if (canRetry) {
|
|
480
|
+
const jitter = Math.floor(Math.random() * 120);
|
|
481
|
+
const backoff = Math.min(1600, 240 * 2 ** item.attempts) + jitter;
|
|
482
|
+
queue.push({
|
|
483
|
+
...item,
|
|
484
|
+
attempts: retries,
|
|
485
|
+
readyAt: Date.now() + backoff,
|
|
486
|
+
});
|
|
487
|
+
} else {
|
|
488
|
+
store.dispatch(
|
|
489
|
+
applyRoomsPreloadBatch({
|
|
490
|
+
rooms: [
|
|
491
|
+
{
|
|
492
|
+
jid: item.jid,
|
|
493
|
+
// An empty page is inconclusive, not a failure: keep it
|
|
494
|
+
// retryable so a later pass (or opening the room) can
|
|
495
|
+
// still fill it in. Real failures end 'error' (retryable
|
|
496
|
+
// by the next sweep too).
|
|
497
|
+
historyPreloadState: isEmptyPage ? 'partial' : 'error',
|
|
498
|
+
},
|
|
499
|
+
],
|
|
500
|
+
})
|
|
501
|
+
);
|
|
502
|
+
}
|
|
503
|
+
|
|
504
|
+
// An empty page says nothing about connection health: only real
|
|
505
|
+
// failures trip the circuit breaker below.
|
|
506
|
+
if (isEmptyPage) {return;}
|
|
507
|
+
consecutiveErrorCount += 1;
|
|
508
|
+
if (consecutiveErrorCount >= 3) {
|
|
509
|
+
await sleep(300);
|
|
510
|
+
consecutiveErrorCount = 0;
|
|
511
|
+
}
|
|
512
|
+
}
|
|
513
|
+
};
|
|
514
|
+
|
|
515
|
+
// A worker pool, not batches: one slow room (a 10 s MAM timeout) must not
|
|
516
|
+
// idle the other slots. Each worker pulls the next room the moment it is
|
|
517
|
+
// free.
|
|
518
|
+
let activeWorkers = 0;
|
|
519
|
+
const worker = async (): Promise<void> => {
|
|
520
|
+
while (true) {
|
|
521
|
+
if (signal?.aborted) {return;}
|
|
522
|
+
if (queue.length === 0 && activeWorkers === 0) {return;}
|
|
523
|
+
|
|
524
|
+
if (!client.isActiveRoomGateOpen()) {
|
|
525
|
+
await sleep(80);
|
|
526
|
+
continue;
|
|
527
|
+
}
|
|
528
|
+
if (shouldPauseForVisibility()) {
|
|
529
|
+
await sleep(250);
|
|
530
|
+
continue;
|
|
531
|
+
}
|
|
532
|
+
|
|
533
|
+
const item = pickNext();
|
|
534
|
+
if (!item) {
|
|
535
|
+
// Queue is empty (another worker may still push a retry) or every
|
|
536
|
+
// remaining item is backing off / in flight.
|
|
537
|
+
if (queue.length === 0 && activeWorkers === 0) {return;}
|
|
538
|
+
await sleep(60);
|
|
539
|
+
continue;
|
|
540
|
+
}
|
|
541
|
+
|
|
542
|
+
activeWorkers += 1;
|
|
543
|
+
started += 1;
|
|
544
|
+
const task = processItem(item);
|
|
319
545
|
inFlightByRoom.set(item.jid, task);
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
546
|
+
try {
|
|
547
|
+
await task;
|
|
548
|
+
} finally {
|
|
549
|
+
inFlightByRoom.delete(item.jid);
|
|
550
|
+
activeWorkers -= 1;
|
|
551
|
+
}
|
|
552
|
+
|
|
553
|
+
// Yield to the JS event loop (no requestIdleCallback in RN); past the
|
|
554
|
+
// first wave, rest a little between rooms.
|
|
555
|
+
const inBackgroundWave = started >= firstWave;
|
|
556
|
+
if (inBackgroundWave && !firstWaveLogged) {
|
|
557
|
+
firstWaveLogged = true;
|
|
558
|
+
devLog(`[preload] first wave done in ${Date.now() - startedAt}ms`);
|
|
559
|
+
}
|
|
560
|
+
await sleep(inBackgroundWave ? BACKGROUND_ROOM_PAUSE_MS : 0);
|
|
561
|
+
}
|
|
562
|
+
};
|
|
323
563
|
|
|
324
|
-
await
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
devLog(`[preload] finished in ${Date.now() - startedAt}ms`);
|
|
328
|
-
store.dispatch(setUnreadSyncing(false));
|
|
564
|
+
await Promise.all(
|
|
565
|
+
Array.from({ length: Math.max(1, concurrency) }, () => worker())
|
|
566
|
+
);
|
|
329
567
|
}
|
|
330
568
|
};
|
|
331
569
|
|