diff --git a/src/Simplex/Messaging/Server/QueueStore/STM.hs b/src/Simplex/Messaging/Server/QueueStore/STM.hs index 00e87d520..101c26251 100644 --- a/src/Simplex/Messaging/Server/QueueStore/STM.hs +++ b/src/Simplex/Messaging/Server/QueueStore/STM.hs @@ -62,15 +62,14 @@ instance MonadQueueStore QueueStore STM where _ -> writeTVar qVar q {senderKey = Just sKey} $> Just q addQueueNotifier :: QueueStore -> RecipientId -> NtfCreds -> STM (Either ErrorType QueueRec) - addQueueNotifier QueueStore {queues, notifiers} rId ntfCreds@NtfCreds {notifierId} = do - ifM (TM.member notifierId notifiers) (pure $ Left DUPLICATE_) $ - withQueue rId queues $ \qVar -> - readTVar qVar >>= \q -> case notifier q of - Just _ -> pure Nothing - _ -> do - writeTVar qVar q {notifier = Just ntfCreds} - TM.insert notifierId rId notifiers - pure $ Just q + addQueueNotifier QueueStore {queues, notifiers} rId ntfCreds@NtfCreds {notifierId = nId} = do + ifM (TM.member nId notifiers) (pure $ Left DUPLICATE_) $ + withQueue rId queues $ \qVar -> do + q <- readTVar qVar + forM_ (notifier q) $ (`TM.delete` notifiers) . notifierId + writeTVar qVar q {notifier = Just ntfCreds} + TM.insert nId rId notifiers + pure $ Just q suspendQueue :: QueueStore -> RecipientId -> STM (Either ErrorType ()) suspendQueue QueueStore {queues} rId = diff --git a/tests/ServerTests.hs b/tests/ServerTests.hs index 591f4c085..72d87fb28 100644 --- a/tests/ServerTests.hs +++ b/tests/ServerTests.hs @@ -612,7 +612,9 @@ testMessageNotifications (ATransport t) = (sId, rId, rKey, dhShared) <- createAndSecureQueue rh sPub let dec nonce = C.cbDecrypt dhShared (C.cbNonce nonce) (rcvNtfPubDhKey, _) <- C.generateKeyPair' - Resp "1" _ (NID nId _) <- signSendRecv rh rKey ("1", rId, NKEY nPub rcvNtfPubDhKey) + Resp "1" _ (NID nId' _) <- signSendRecv rh rKey ("1", rId, NKEY nPub rcvNtfPubDhKey) + Resp "1a" _ (NID nId _) <- signSendRecv rh rKey ("1a", rId, NKEY nPub rcvNtfPubDhKey) + nId' `shouldNotBe` nId Resp "2" _ OK <- signSendRecv nh1 nKey ("2", nId, NSUB) Resp "3" _ OK <- signSendRecv sh sKey ("3", sId, _SEND' "hello") Resp "" _ (MSG mId1 _ _ msg1) <- tGet rh