Skip to content

Commit 293c4f1

Browse files
committed
WIP: send UP from initial subscriptions
1 parent bd67844 commit 293c4f1

File tree

1 file changed

+20
-26
lines changed

1 file changed

+20
-26
lines changed

src/Simplex/Messaging/Agent/Client.hs

Lines changed: 20 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,7 @@ import Data.List.NonEmpty (NonEmpty (..), (<|))
170170
import qualified Data.List.NonEmpty as L
171171
import Data.Map.Strict (Map)
172172
import qualified Data.Map.Strict as M
173-
import Data.Maybe (isJust, isNothing, listToMaybe)
173+
import Data.Maybe (catMaybes, isJust, isNothing, listToMaybe)
174174
import Data.Set (Set)
175175
import qualified Data.Set as S
176176
import Data.Text (Text)
@@ -678,15 +678,12 @@ smpClientDisconnected c@AgentClient {active, smpClients, smpProxiedRelays} tSess
678678
serverDown :: ([RcvQueue], [ConnId]) -> IO ()
679679
serverDown (qs, conns) = whenM (readTVarIO active) $ do
680680
incClientStat' c userId client "DISCONNECT" ""
681-
notifySub "" $ hostEvent' DISCONNECT client
682-
unless (null conns) $ notifySub "" $ DOWN srv conns
681+
notifySub c "" $ hostEvent' DISCONNECT client
682+
unless (null conns) $ notifySub c "" $ DOWN srv conns
683683
unless (null qs) $ do
684684
atomically $ mapM_ (releaseGetLock c) qs
685685
runReaderT (resubscribeSMPSession c tSess) env
686686

687-
notifySub :: forall e. AEntityI e => ConnId -> ACommand 'Agent e -> IO ()
688-
notifySub connId cmd = atomically $ writeTBQueue (subQ c) ("", connId, APC (sAEntity @e) cmd)
689-
690687
resubscribeSMPSession :: AgentClient -> SMPTransportSession -> AM' ()
691688
resubscribeSMPSession c@AgentClient {smpSubWorkers, workerSeq} tSess =
692689
atomically getWorkerVar >>= mapM_ (either newSubWorker (\_ -> pure ()))
@@ -721,21 +718,22 @@ reconnectSMPClient c tSess@(_, srv, _) qs = handleNotify $ do
721718
(rs, sessId_) <- subscribeQueues c $ L.toList qs
722719
let (errs, okConns) = partitionEithers $ map (\(RcvQueue {connId}, r) -> bimap (connId,) (const connId) r) rs
723720
conns = filter (`M.notMember` cs) okConns
724-
unless (null conns) $ notifySub "" $ UP srv conns
721+
unless (null conns) $ notifySub c "" $ UP srv conns
725722
let (tempErrs, finalErrs) = partition (temporaryAgentError . snd) errs
726-
mapM_ (\(connId, e) -> notifySub connId $ ERR e) finalErrs
723+
mapM_ (\(connId, e) -> notifySub c connId $ ERR e) finalErrs
727724
forM_ (listToMaybe tempErrs) $ \(connId, e) -> do
728725
when (null okConns && M.null cs && null finalErrs) . liftIO $
729726
forM_ sessId_ $ \sessId -> do
730727
-- We only close the client session that was used to subscribe.
731728
v_ <- atomically $ ifM (activeClientSession c tSess sessId) (TM.lookupDelete tSess $ smpClients c) (pure Nothing)
732729
mapM_ (closeClient_ c) v_
733-
notifySub connId $ ERR e
730+
notifySub c connId $ ERR e
734731
where
735732
handleNotify :: AM' () -> AM' ()
736-
handleNotify = E.handleAny $ notifySub "" . ERR . INTERNAL . show
737-
notifySub :: forall e. AEntityI e => ConnId -> ACommand 'Agent e -> AM' ()
738-
notifySub connId cmd = atomically $ writeTBQueue (subQ c) ("", connId, APC (sAEntity @e) cmd)
733+
handleNotify = E.handleAny $ notifySub c "" . ERR . INTERNAL . show
734+
735+
notifySub :: forall e m. (AEntityI e, MonadIO m) => AgentClient -> ConnId -> ACommand 'Agent e -> m ()
736+
notifySub c connId cmd = atomically $ writeTBQueue (subQ c) ("", connId, APC (sAEntity @e) cmd)
739737

740738
getNtfServerClient :: AgentClient -> NtfTransportSession -> AM NtfClient
741739
getNtfServerClient c@AgentClient {active, ntfClients, workerSeq} tSess@(userId, srv, _) = do
@@ -1274,14 +1272,10 @@ newRcvQueue c userId connId (ProtoServerWithAuth srv auth) vRange subMode = do
12741272
qUri = SMPQueueUri vRange $ SMPQueueAddress srv sndId e2eDhKey
12751273
pure (rq, qUri, tSess, sessId)
12761274

1277-
processSubResult :: AgentClient -> RcvQueue -> Either SMPClientError () -> STM ()
1275+
processSubResult :: AgentClient -> RcvQueue -> Either SMPClientError () -> STM (Maybe ConnId)
12781276
processSubResult c rq@RcvQueue {connId} = \case
1279-
Left e ->
1280-
unless (temporaryClientError e) $
1281-
failSubscription c rq e
1282-
Right () ->
1283-
whenM (hasPendingSubscription c connId) $
1284-
addSubscription c rq
1277+
Left e -> Nothing <$ unless (temporaryClientError e) (failSubscription c rq e)
1278+
Right () -> ifM (hasPendingSubscription c connId) (Just connId <$ addSubscription c rq) (pure Nothing)
12851279

12861280
temporaryAgentError :: AgentErrorType -> Bool
12871281
temporaryAgentError = \case
@@ -1331,23 +1325,23 @@ subscribeQueues c qs = do
13311325
subscribeQueues_ :: Env -> TVar (Maybe SessionId) -> SMPClient -> NonEmpty RcvQueue -> IO (BatchResponses SMPClientError ())
13321326
subscribeQueues_ env session smp qs' = do
13331327
rs <- sendBatch subscribeSMPQueues smp qs'
1334-
active <-
1328+
(active, up) <-
13351329
atomically $
13361330
ifM
13371331
(activeClientSession c tSess sessId)
1338-
(writeTVar session (Just sessId) >> processSubResults rs $> True)
1339-
(pure False)
1332+
(writeTVar session (Just sessId) >> ((True,) <$> processSubResults rs))
1333+
(pure (False, []))
13401334
if active
1341-
then when (hasTempErrors rs) resubscribe $> rs
1335+
then rs <$ if hasTempErrors rs then resubscribe else unless (null up) (notifySub c "" $ UP srv up)
13421336
else do
13431337
logWarn "subcription batch result for replaced SMP client, resubscribing"
13441338
resubscribe $> L.map (second $ \_ -> Left PCENetworkError) rs
13451339
where
1346-
tSess = transportSession' smp
1340+
tSess@(_, srv, _) = transportSession' smp
13471341
sessId = sessionId $ thParams smp
13481342
hasTempErrors = any (either temporaryClientError (const False) . snd)
1349-
processSubResults :: NonEmpty (RcvQueue, Either SMPClientError ()) -> STM ()
1350-
processSubResults = mapM_ $ uncurry $ processSubResult c
1343+
processSubResults :: NonEmpty (RcvQueue, Either SMPClientError ()) -> STM [ConnId]
1344+
processSubResults = fmap catMaybes . mapM (uncurry $ processSubResult c) . L.toList
13511345
resubscribe = resubscribeSMPSession c tSess `runReaderT` env
13521346

13531347
activeClientSession :: AgentClient -> SMPTransportSession -> SessionId -> STM Bool

0 commit comments

Comments
 (0)