core: process message errors (#3709)
* core: process message errors * update simplexmq commit sha * style Co-authored-by: spaced4ndy <8711996+spaced4ndy@users.noreply.github.com> * simplexmq --------- Co-authored-by: spaced4ndy <8711996+spaced4ndy@users.noreply.github.com>
This commit is contained in:
parent
68de2b7540
commit
cc05434b31
@ -12,7 +12,7 @@ constraints: zip +disable-bzip2 +disable-zstd
|
|||||||
source-repository-package
|
source-repository-package
|
||||||
type: git
|
type: git
|
||||||
location: https://github.com/simplex-chat/simplexmq.git
|
location: https://github.com/simplex-chat/simplexmq.git
|
||||||
tag: eb41abfb8fe84c7212abca8d1179b5308d937274
|
tag: baf2c470658a675f383a0aa628f37b39337f41d9
|
||||||
|
|
||||||
source-repository-package
|
source-repository-package
|
||||||
type: git
|
type: git
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"https://github.com/simplex-chat/simplexmq.git"."eb41abfb8fe84c7212abca8d1179b5308d937274" = "1hxrwib82gzx4j251dz88ivhi288sajg7fccdxbig28dj1gfz4s7";
|
"https://github.com/simplex-chat/simplexmq.git"."baf2c470658a675f383a0aa628f37b39337f41d9" = "0zg94ycr72x7zyp1zqnwbld2l6znqiqdygzl5mfn9yclpv76ihmg";
|
||||||
"https://github.com/simplex-chat/hs-socks.git"."a30cc7a79a08d8108316094f8f2f82a0c5e1ac51" = "0yasvnr7g91k76mjkamvzab2kvlb1g5pspjyjn2fr6v83swjhj38";
|
"https://github.com/simplex-chat/hs-socks.git"."a30cc7a79a08d8108316094f8f2f82a0c5e1ac51" = "0yasvnr7g91k76mjkamvzab2kvlb1g5pspjyjn2fr6v83swjhj38";
|
||||||
"https://github.com/simplex-chat/direct-sqlcipher.git"."f814ee68b16a9447fbb467ccc8f29bdd3546bfd9" = "1ql13f4kfwkbaq7nygkxgw84213i0zm7c1a8hwvramayxl38dq5d";
|
"https://github.com/simplex-chat/direct-sqlcipher.git"."f814ee68b16a9447fbb467ccc8f29bdd3546bfd9" = "1ql13f4kfwkbaq7nygkxgw84213i0zm7c1a8hwvramayxl38dq5d";
|
||||||
"https://github.com/simplex-chat/sqlcipher-simple.git"."a46bd361a19376c5211f1058908fc0ae6bf42446" = "1z0r78d8f0812kxbgsm735qf6xx8lvaz27k1a0b4a2m0sshpd5gl";
|
"https://github.com/simplex-chat/sqlcipher-simple.git"."a46bd361a19376c5211f1058908fc0ae6bf42446" = "1z0r78d8f0812kxbgsm735qf6xx8lvaz27k1a0b4a2m0sshpd5gl";
|
||||||
|
@ -3472,6 +3472,9 @@ processAgentMessageConn vr user@User {userId} corrId agentConnId agentMessage =
|
|||||||
MERR _ err -> do
|
MERR _ err -> do
|
||||||
toView $ CRChatError (Just user) (ChatErrorAgent err $ Just connEntity)
|
toView $ CRChatError (Just user) (ChatErrorAgent err $ Just connEntity)
|
||||||
incAuthErrCounter connEntity conn err
|
incAuthErrCounter connEntity conn err
|
||||||
|
MERRS _ err -> do
|
||||||
|
-- error cannot be AUTH error here
|
||||||
|
toView $ CRChatError (Just user) (ChatErrorAgent err $ Just connEntity)
|
||||||
ERR err -> do
|
ERR err -> do
|
||||||
toView $ CRChatError (Just user) (ChatErrorAgent err $ Just connEntity)
|
toView $ CRChatError (Just user) (ChatErrorAgent err $ Just connEntity)
|
||||||
when (corrId /= "") $ withCompletedCommand conn agentMsg $ \_cmdData -> pure ()
|
when (corrId /= "") $ withCompletedCommand conn agentMsg $ \_cmdData -> pure ()
|
||||||
@ -3633,6 +3636,10 @@ processAgentMessageConn vr user@User {userId} corrId agentConnId agentMessage =
|
|||||||
updateDirectItemStatus ct conn msgId $ agentErrToItemStatus err
|
updateDirectItemStatus ct conn msgId $ agentErrToItemStatus err
|
||||||
toView $ CRChatError (Just user) (ChatErrorAgent err $ Just connEntity)
|
toView $ CRChatError (Just user) (ChatErrorAgent err $ Just connEntity)
|
||||||
incAuthErrCounter connEntity conn err
|
incAuthErrCounter connEntity conn err
|
||||||
|
MERRS msgIds err -> do
|
||||||
|
-- error cannot be AUTH error here
|
||||||
|
updateDirectItemsStatus ct conn (L.toList msgIds) $ agentErrToItemStatus err
|
||||||
|
toView $ CRChatError (Just user) (ChatErrorAgent err $ Just connEntity)
|
||||||
ERR err -> do
|
ERR err -> do
|
||||||
toView $ CRChatError (Just user) (ChatErrorAgent err $ Just connEntity)
|
toView $ CRChatError (Just user) (ChatErrorAgent err $ Just connEntity)
|
||||||
when (corrId /= "") $ withCompletedCommand conn agentMsg $ \_cmdData -> pure ()
|
when (corrId /= "") $ withCompletedCommand conn agentMsg $ \_cmdData -> pure ()
|
||||||
@ -4003,18 +4010,26 @@ processAgentMessageConn vr user@User {userId} corrId agentConnId agentMessage =
|
|||||||
withCompletedCommand conn agentMsg $ \CommandData {cmdFunction, cmdId} ->
|
withCompletedCommand conn agentMsg $ \CommandData {cmdFunction, cmdId} ->
|
||||||
when (cmdFunction == CFAckMessage) $ ackMsgDeliveryEvent conn cmdId
|
when (cmdFunction == CFAckMessage) $ ackMsgDeliveryEvent conn cmdId
|
||||||
MERR msgId err -> do
|
MERR msgId err -> do
|
||||||
chatItemId_ <- withStore' $ \db -> getChatItemIdByAgentMsgId db connId msgId
|
withStore' $ \db -> updateGroupItemErrorStatus db msgId (groupMemberId' m) $ agentErrToItemStatus err
|
||||||
forM_ chatItemId_ $ \itemId -> do
|
|
||||||
let GroupMember {groupMemberId} = m
|
|
||||||
updateGroupMemSndStatus itemId groupMemberId $ agentErrToItemStatus err
|
|
||||||
-- group errors are silenced to reduce load on UI event log
|
-- group errors are silenced to reduce load on UI event log
|
||||||
-- toView $ CRChatError (Just user) (ChatErrorAgent err $ Just connEntity)
|
-- toView $ CRChatError (Just user) (ChatErrorAgent err $ Just connEntity)
|
||||||
incAuthErrCounter connEntity conn err
|
incAuthErrCounter connEntity conn err
|
||||||
|
MERRS msgIds err -> do
|
||||||
|
let newStatus = agentErrToItemStatus err
|
||||||
|
-- error cannot be AUTH error here
|
||||||
|
withStore' $ \db -> forM_ msgIds $ \msgId ->
|
||||||
|
updateGroupItemErrorStatus db msgId (groupMemberId' m) newStatus `catchAll_` pure ()
|
||||||
|
toView $ CRChatError (Just user) (ChatErrorAgent err $ Just connEntity)
|
||||||
ERR err -> do
|
ERR err -> do
|
||||||
toView $ CRChatError (Just user) (ChatErrorAgent err $ Just connEntity)
|
toView $ CRChatError (Just user) (ChatErrorAgent err $ Just connEntity)
|
||||||
when (corrId /= "") $ withCompletedCommand conn agentMsg $ \_cmdData -> pure ()
|
when (corrId /= "") $ withCompletedCommand conn agentMsg $ \_cmdData -> pure ()
|
||||||
-- TODO add debugging output
|
-- TODO add debugging output
|
||||||
_ -> pure ()
|
_ -> pure ()
|
||||||
|
where
|
||||||
|
updateGroupItemErrorStatus :: DB.Connection -> AgentMsgId -> GroupMemberId -> CIStatus 'MDSnd -> IO ()
|
||||||
|
updateGroupItemErrorStatus db msgId groupMemberId newStatus = do
|
||||||
|
chatItemId_ <- getChatItemIdByAgentMsgId db connId msgId
|
||||||
|
forM_ chatItemId_ $ \itemId -> updateGroupMemSndStatus' db itemId groupMemberId newStatus
|
||||||
|
|
||||||
agentMsgDecryptError :: AgentCryptoError -> (MsgDecryptError, Word32)
|
agentMsgDecryptError :: AgentCryptoError -> (MsgDecryptError, Word32)
|
||||||
agentMsgDecryptError = \case
|
agentMsgDecryptError = \case
|
||||||
@ -5609,24 +5624,39 @@ processAgentMessageConn vr user@User {userId} corrId agentConnId agentMessage =
|
|||||||
withStore' $ \db -> updateSndMsgDeliveryStatus db connId agentMsgId $ MDSSndRcvd msgRcptStatus
|
withStore' $ \db -> updateSndMsgDeliveryStatus db connId agentMsgId $ MDSSndRcvd msgRcptStatus
|
||||||
updateGroupItemStatus gInfo m conn agentMsgId $ CISSndRcvd msgRcptStatus SSPComplete
|
updateGroupItemStatus gInfo m conn agentMsgId $ CISSndRcvd msgRcptStatus SSPComplete
|
||||||
|
|
||||||
updateDirectItemStatus :: Contact -> Connection -> AgentMsgId -> CIStatus 'MDSnd -> m ()
|
updateDirectItemsStatus :: Contact -> Connection -> [AgentMsgId] -> CIStatus 'MDSnd -> m ()
|
||||||
updateDirectItemStatus ct@Contact {contactId} Connection {connId} msgId newStatus =
|
updateDirectItemsStatus ct conn msgIds newStatus = do
|
||||||
withStore' (\db -> getDirectChatItemByAgentMsgId db user contactId connId msgId) >>= \case
|
cis_ <- withStore' $ \db -> forM msgIds $ \msgId -> runExceptT $ updateDirectItemStatus' db ct conn msgId newStatus
|
||||||
Just (CChatItem SMDSnd ChatItem {meta = CIMeta {itemStatus = CISSndRcvd _ _}}) -> pure ()
|
-- only send the last expired item event to view
|
||||||
Just (CChatItem SMDSnd ChatItem {meta = CIMeta {itemId, itemStatus}})
|
case catMaybes $ rights $ reverse cis_ of
|
||||||
| itemStatus == newStatus -> pure ()
|
ci : _ -> toView $ CRChatItemStatusUpdated user (AChatItem SCTDirect SMDSnd (DirectChat ct) ci)
|
||||||
| otherwise -> do
|
|
||||||
chatItem <- withStore $ \db -> updateDirectChatItemStatus db user ct itemId newStatus
|
|
||||||
toView $ CRChatItemStatusUpdated user (AChatItem SCTDirect SMDSnd (DirectChat ct) chatItem)
|
|
||||||
_ -> pure ()
|
_ -> pure ()
|
||||||
|
|
||||||
|
updateDirectItemStatus :: Contact -> Connection -> AgentMsgId -> CIStatus 'MDSnd -> m ()
|
||||||
|
updateDirectItemStatus ct conn msgId newStatus = do
|
||||||
|
ci_ <- withStore $ \db -> updateDirectItemStatus' db ct conn msgId newStatus
|
||||||
|
forM_ ci_ $ \ci -> toView $ CRChatItemStatusUpdated user (AChatItem SCTDirect SMDSnd (DirectChat ct) ci)
|
||||||
|
|
||||||
|
updateDirectItemStatus' :: DB.Connection -> Contact -> Connection -> AgentMsgId -> CIStatus 'MDSnd -> ExceptT StoreError IO (Maybe (ChatItem 'CTDirect 'MDSnd))
|
||||||
|
updateDirectItemStatus' db ct@Contact {contactId} Connection {connId} msgId newStatus =
|
||||||
|
liftIO (getDirectChatItemByAgentMsgId db user contactId connId msgId) >>= \case
|
||||||
|
Just (CChatItem SMDSnd ChatItem {meta = CIMeta {itemStatus = CISSndRcvd _ _}}) -> pure Nothing
|
||||||
|
Just (CChatItem SMDSnd ChatItem {meta = CIMeta {itemId, itemStatus}})
|
||||||
|
| itemStatus == newStatus -> pure Nothing
|
||||||
|
| otherwise -> Just <$> updateDirectChatItemStatus db user ct itemId newStatus
|
||||||
|
_ -> pure Nothing
|
||||||
|
|
||||||
updateGroupMemSndStatus :: ChatItemId -> GroupMemberId -> CIStatus 'MDSnd -> m Bool
|
updateGroupMemSndStatus :: ChatItemId -> GroupMemberId -> CIStatus 'MDSnd -> m Bool
|
||||||
updateGroupMemSndStatus itemId groupMemberId newStatus =
|
updateGroupMemSndStatus itemId groupMemberId newStatus =
|
||||||
runExceptT (withStore $ \db -> getGroupSndStatus db itemId groupMemberId) >>= \case
|
withStore' $ \db -> updateGroupMemSndStatus' db itemId groupMemberId newStatus
|
||||||
|
|
||||||
|
updateGroupMemSndStatus' :: DB.Connection -> ChatItemId -> GroupMemberId -> CIStatus 'MDSnd -> IO Bool
|
||||||
|
updateGroupMemSndStatus' db itemId groupMemberId newStatus =
|
||||||
|
runExceptT (getGroupSndStatus db itemId groupMemberId) >>= \case
|
||||||
Right (CISSndRcvd _ _) -> pure False
|
Right (CISSndRcvd _ _) -> pure False
|
||||||
Right memStatus
|
Right memStatus
|
||||||
| memStatus == newStatus -> pure False
|
| memStatus == newStatus -> pure False
|
||||||
| otherwise -> withStore' (\db -> updateGroupSndStatus db itemId groupMemberId newStatus) $> True
|
| otherwise -> updateGroupSndStatus db itemId groupMemberId newStatus $> True
|
||||||
_ -> pure False
|
_ -> pure False
|
||||||
|
|
||||||
updateGroupItemStatus :: GroupInfo -> GroupMember -> Connection -> AgentMsgId -> CIStatus 'MDSnd -> m ()
|
updateGroupItemStatus :: GroupInfo -> GroupMember -> Connection -> AgentMsgId -> CIStatus 'MDSnd -> m ()
|
||||||
|
Loading…
Reference in New Issue
Block a user