From 5c24089f9ffcd4a8700bf2f6b1ece79609a31880 Mon Sep 17 00:00:00 2001 From: Efim Poberezkin <8711996+efim-poberezkin@users.noreply.github.com> Date: Thu, 10 Feb 2022 17:03:36 +0400 Subject: [PATCH] check group member connection status before delivery; best effort delivery per group member (#286) --- src/Simplex/Chat.hs | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/Simplex/Chat.hs b/src/Simplex/Chat.hs index ff98129e1e..bb700c3425 100644 --- a/src/Simplex/Chat.hs +++ b/src/Simplex/Chat.hs @@ -25,7 +25,6 @@ import Data.Bifunctor (first) import Data.ByteString.Char8 (ByteString) import qualified Data.ByteString.Char8 as B import Data.Char (isSpace) -import Data.Foldable (for_) import Data.Functor (($>)) import Data.Int (Int64) import Data.List (find) @@ -1220,17 +1219,21 @@ sendXGrpMemInv reMember chatMsgEvent introId = sendGroupMessage' :: ChatMonad m => [GroupMember] -> ChatMsgEvent -> Maybe Int64 -> m () -> m MessageId sendGroupMessage' members chatMsgEvent introId_ postDeliver = do (msgId, msgBody) <- createSndMessage chatMsgEvent - for_ (filter memberCurrent members) $ \m@GroupMember {groupMemberId} -> + -- TODO collect failed deliveries into a single error + forM_ (filter memberCurrent members) $ \m@GroupMember {groupMemberId} -> case memberConn m of Nothing -> withStore $ \st -> createPendingGroupMessage st groupMemberId msgId introId_ - Just conn -> deliverMessage conn msgBody msgId >> postDeliver + Just conn@Connection {connStatus} -> + if not (connStatus == ConnSndReady || connStatus == ConnReady) + then unless (connStatus == ConnDeleted) $ withStore (\st -> createPendingGroupMessage st groupMemberId msgId introId_) + else (deliverMessage conn msgBody msgId >> postDeliver) `catchError` const (pure ()) pure msgId sendPendingGroupMessages :: ChatMonad m => GroupMember -> Connection -> m () sendPendingGroupMessages GroupMember {groupMemberId, localDisplayName} conn = do pendingMessages <- withStore $ \st -> getPendingGroupMessages st groupMemberId -- TODO ensure order - pending messages interleave with user input messages - for_ pendingMessages $ \PendingGroupMessage {msgId, cmEventTag, msgBody, introId_} -> do + forM_ pendingMessages $ \PendingGroupMessage {msgId, cmEventTag, msgBody, introId_} -> do deliverMessage conn msgBody msgId withStore (\st -> deletePendingGroupMessage st groupMemberId msgId) when (cmEventTag == XGrpMemFwd_) $ case introId_ of