chat_recv_msg_wait with STM timeout

This commit is contained in:
Evgeny Poberezkin
2025-08-11 20:06:35 +01:00
parent 805d9377c8
commit fdfa2964c5

View File

@@ -25,7 +25,6 @@ import qualified Data.ByteString.Lazy.Char8 as LB
import Data.Functor (($>))
import Data.List (find)
import qualified Data.List.NonEmpty as L
import Data.Maybe (fromMaybe)
import Data.Text (Text)
import Data.Word (Word8)
import Foreign.C.String
@@ -57,7 +56,6 @@ import Simplex.Messaging.Parsers (defaultJSON, dropPrefix, sumTypeJSON)
import Simplex.Messaging.Protocol (AProtoServerWithAuth (..), AProtocolType (..), BasicAuth (..), ProtoServerWithAuth (..), ProtocolServer (..))
import Simplex.Messaging.Util (catchAll, liftEitherWith, safeDecodeUtf8)
import System.IO (utf8)
import System.Timeout (timeout)
import qualified URI.ByteString as U
#if !defined(dbPostgres)
import Data.ByteArray (ScrubbedBytes)
@@ -348,7 +346,17 @@ chatRecvMsg ChatController {outputQ} = J.encode . uncurry eitherToResult <$> rea
out -> pure out
chatRecvMsgWait :: ChatController -> Int -> IO JSONByteString
chatRecvMsgWait cc time = fromMaybe "" <$> timeout time (chatRecvMsg cc)
chatRecvMsgWait ChatController {outputQ} time = maybe "" (J.encode . uncurry eitherToResult) <$> readChatResponse
where
readChatResponse =
readTBQueueTimeout >>= \case
Just (_, Right CEvtTerminalEvent {}) -> readChatResponse
out -> pure out
readTBQueueTimeout = do
delay <- registerDelay time
atomically $
(Just <$> readTBQueue outputQ)
`orElse` (readTVar delay >>= \d -> if d then pure Nothing else retry )
chatParseMarkdown :: ByteString -> JSONByteString
chatParseMarkdown = J.encode . ParsedMarkdown . parseMaybeMarkdownList . safeDecodeUtf8