diff --git a/cabal.project b/cabal.project index 5a8ce0c7f5..82629ff698 100644 --- a/cabal.project +++ b/cabal.project @@ -12,7 +12,7 @@ constraints: zip +disable-bzip2 +disable-zstd source-repository-package type: git location: https://github.com/simplex-chat/simplexmq.git - tag: ca68eca86ef92ae266a4005ab1ad57b589f83933 + tag: 9cc2dac110affa90fac579da3fe2fe56f7ea5177 source-repository-package type: git diff --git a/scripts/nix/sha256map.nix b/scripts/nix/sha256map.nix index 0e9846e31f..b89a2de419 100644 --- a/scripts/nix/sha256map.nix +++ b/scripts/nix/sha256map.nix @@ -1,5 +1,5 @@ { - "https://github.com/simplex-chat/simplexmq.git"."ca68eca86ef92ae266a4005ab1ad57b589f83933" = "10p1bn42hbmisdjk272q6jshrcx1vq1072r50n80hj6n6z1a0szf"; + "https://github.com/simplex-chat/simplexmq.git"."9cc2dac110affa90fac579da3fe2fe56f7ea5177" = "0s64z48vh7d3qw16jvqnqc0mcdc4ynsy9fgdq2rin88zh31r5sw4"; "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/sqlcipher-simple.git"."a46bd361a19376c5211f1058908fc0ae6bf42446" = "1z0r78d8f0812kxbgsm735qf6xx8lvaz27k1a0b4a2m0sshpd5gl"; diff --git a/src/Simplex/Chat.hs b/src/Simplex/Chat.hs index 2460a6c763..cdb6f90a98 100644 --- a/src/Simplex/Chat.hs +++ b/src/Simplex/Chat.hs @@ -98,7 +98,6 @@ import Simplex.Messaging.Agent.Store.SQLite.DB (SlowQueryStats (..)) import qualified Simplex.Messaging.Agent.Store.SQLite.DB as DB import qualified Simplex.Messaging.Agent.Store.SQLite.Migrations as Migrations import Simplex.Messaging.Client (defaultNetworkConfig) -import Simplex.Messaging.Compression (withCompressCtx) import qualified Simplex.Messaging.Crypto as C import Simplex.Messaging.Crypto.File (CryptoFile (..), CryptoFileArgs (..)) import qualified Simplex.Messaging.Crypto.File as CF @@ -6129,7 +6128,7 @@ sendGroupMemberMessages user conn events groupId = do forM_ (L.nonEmpty msgs) $ \msgs' -> do -- TODO v5.7 based on version (?) -- let shouldCompress = False - -- batched <- if shouldCompress then batchSndMessagesBinary msgs' else pure $ batchSndMessagesJSON msgs' + -- let batched = if shouldCompress then batchSndMessagesBinary msgs' else batchSndMessagesJSON msgs' let batched = batchSndMessagesJSON msgs' let (errs', msgBatches) = partitionEithers batched -- shouldn't happen, as large messages would have caused createNewSndMessage to throw SELargeMsg @@ -6147,12 +6146,9 @@ processSndMessageBatch conn@Connection {connId} (MsgBatch batchBody sndMsgs) = d batchSndMessagesJSON :: NonEmpty SndMessage -> [Either ChatError MsgBatch] batchSndMessagesJSON = batchMessages maxEncodedMsgLength . L.toList --- batchSndMessagesBinary :: forall m. ChatMonad m => NonEmpty SndMessage -> m [Either ChatError MsgBatch] --- batchSndMessagesBinary msgs = do --- compressed <- liftIO $ withCompressCtx maxChatMsgSize $ \cctx -> mapM (compressForBatch cctx) msgs --- pure . map toMsgBatch . SMP.batchTransmissions_ (maxEncodedMsgLength) $ L.zip compressed msgs +-- batchSndMessagesBinary :: NonEmpty SndMessage -> [Either ChatError MsgBatch] +-- batchSndMessagesBinary msgs = map toMsgBatch . SMP.batchTransmissions_ (maxEncodedMsgLength) $ L.zip (map compress1 msgs) msgs -- where --- compressForBatch cctx SndMessage {msgBody} = bimap (const TELargeMsg) smpEncode <$> compress cctx msgBody -- toMsgBatch :: SMP.TransportBatch SndMessage -> Either ChatError MsgBatch -- toMsgBatch = \case -- SMP.TBTransmissions combined _n sms -> Right $ MsgBatch (markCompressedBatch combined) sms @@ -6171,12 +6167,10 @@ encodeConnInfoPQ pqSup v chatMsgEvent = do case encodeChatMessage maxEncodedInfoLength info of ECMEncoded connInfo -> case pqSup of PQSupportOn | v >= pqEncryptionCompressionVersion && B.length connInfo > maxCompressedInfoLength -> do - connInfo' <- liftIO compressedBatchMsgBody + let connInfo' = compressedBatchMsgBody_ connInfo when (B.length connInfo' > maxCompressedInfoLength) $ throwChatError $ CEException "large compressed info" pure connInfo' _ -> pure connInfo - where - compressedBatchMsgBody = withCompressCtx (toEnum $ B.length connInfo) (`compressedBatchMsgBody_` connInfo) ECMLarge -> throwChatError $ CEException "large info" deliverMessage :: ChatMonad m => Connection -> CMEventTag e -> MsgBody -> MessageId -> m (Int64, PQEncryption) @@ -6197,12 +6191,12 @@ deliverMessages msgs = deliverMessagesB $ L.map Right msgs deliverMessagesB :: forall m. ChatMonad' m => NonEmpty (Either ChatError MsgReq) -> m (NonEmpty (Either ChatError (Int64, PQEncryption))) deliverMessagesB msgReqs = do - msgReqs' <- compressBodies + msgReqs' <- liftIO compressBodies sent <- L.zipWith prepareBatch msgReqs' <$> withAgent' (`sendMessagesB` L.map toAgent msgReqs') void $ withStoreBatch' $ \db -> map (updatePQSndEnabled db) (rights . L.toList $ sent) withStoreBatch $ \db -> L.map (bindRight $ createDelivery db) sent where - compressBodies = liftIO $ withCompressCtx (toEnum maxEncodedMsgLength) $ \cxt -> + compressBodies = forME msgReqs $ \mr@(conn@Connection {pqSupport, connChatVersion = v}, msgFlags, msgBody, msgId) -> runExceptT $ case pqSupport of -- we only compress messages when: @@ -6210,7 +6204,7 @@ deliverMessagesB msgReqs = do -- 2) version is compatible with compression -- 3) message is longer than max compressed size (as this function is not used for batched messages anyway) PQSupportOn | v >= pqEncryptionCompressionVersion && B.length msgBody > maxCompressedMsgLength -> do - msgBody' <- liftIO $ compressedBatchMsgBody_ cxt msgBody + let msgBody' = compressedBatchMsgBody_ msgBody when (B.length msgBody' > maxCompressedMsgLength) $ throwError $ ChatError $ CEException "large compressed message" pure (conn, msgFlags, msgBody', msgId) _ -> pure mr diff --git a/src/Simplex/Chat/Protocol.hs b/src/Simplex/Chat/Protocol.hs index 85ef027335..e2810dafa9 100644 --- a/src/Simplex/Chat/Protocol.hs +++ b/src/Simplex/Chat/Protocol.hs @@ -47,7 +47,7 @@ import Simplex.Chat.Call import Simplex.Chat.Types import Simplex.Chat.Types.Util import Simplex.Messaging.Agent.Protocol (VersionSMPA, pqdrSMPAgentVersion) -import Simplex.Messaging.Compression (CompressCtx, compress, decompressBatch) +import Simplex.Messaging.Compression (compress1, decompressBatch) import Simplex.Messaging.Crypto.Ratchet (PQSupport (..), pattern PQSupportOn, pattern PQSupportOff) import Simplex.Messaging.Encoding import Simplex.Messaging.Encoding.String @@ -576,8 +576,8 @@ parseChatMessages s = case B.head s of -- TODO v5.7 don't reserve multiple large buffers when decoding batches Right compressed -> concatMap (either (pure . Left) parseChatMessages) . L.toList $ decompressBatch maxEncodedMsgLength compressed -compressedBatchMsgBody_ :: CompressCtx -> MsgBody -> IO ByteString -compressedBatchMsgBody_ ctx msgBody = markCompressedBatch . smpEncode . (L.:| []) <$> compress ctx msgBody +compressedBatchMsgBody_ :: MsgBody -> ByteString +compressedBatchMsgBody_ = markCompressedBatch . smpEncode . (L.:| []) . compress1 markCompressedBatch :: ByteString -> ByteString markCompressedBatch = B.cons 'X'