Skip to content

Commit 906da42

Browse files
separate starting agent
1 parent b9b1de7 commit 906da42

2 files changed

Lines changed: 23 additions & 18 deletions

File tree

src/Simplex/Messaging/Agent.hs

Lines changed: 21 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ module Simplex.Messaging.Agent
4040
vrValue,
4141
getSMPAgentClient,
4242
getSMPAgentClient_,
43+
startSMPAgentClient,
4344
disconnectAgentClient,
4445
disposeAgentClient,
4546
resumeAgentClient,
@@ -256,42 +257,45 @@ import UnliftIO.STM
256257
type AE a = ExceptT AgentErrorType IO a
257258

258259
-- | Creates an SMP agent client instance
259-
getSMPAgentClient :: AgentConfig -> InitialAgentServers -> DBStore -> Bool -> (ATransmission -> IO ()) -> AE AgentClient
260+
getSMPAgentClient :: AgentConfig -> InitialAgentServers -> DBStore -> (ATransmission -> IO ()) -> AE AgentClient
260261
getSMPAgentClient = getSMPAgentClient_ 1
261262
{-# INLINE getSMPAgentClient #-}
262263

263-
getSMPAgentClient_ :: Int -> AgentConfig -> InitialAgentServers -> DBStore -> Bool -> (ATransmission -> IO ()) -> AE AgentClient
264-
getSMPAgentClient_ clientId cfg initServers@InitialAgentServers {smp, xftp, netCfg, useServices, presetServers} store backgroundMode processEvent = do
264+
getSMPAgentClient_ :: Int -> AgentConfig -> InitialAgentServers -> DBStore -> (ATransmission -> IO ()) -> AE AgentClient
265+
getSMPAgentClient_ clientId cfg initServers@InitialAgentServers {smp, xftp, netCfg, useServices, presetServers} store processEvent = do
265266
-- This error should be prevented in the app
266267
when (any id useServices && sessionMode netCfg == TSMEntity) $ throwE $ CMD PROHIBITED "newAgentClient"
267-
liftIO $ newSMPAgentEnv cfg store >>= runReaderT runAgent
268+
liftIO $ newSMPAgentEnv cfg store >>= runReaderT createAgent
268269
where
269-
runAgent = do
270+
createAgent = do
270271
liftIO $ checkServers "SMP" smp >> checkServers "XFTP" xftp
271272
currentTs <- liftIO getCurrentTime
272273
notices <- liftIO $ withTransaction store (`getClientNotices` presetServers) `catchAll_` pure []
273274
env <- ask
274275
let processMsg c t = subscriber c t `runReaderT` env
275-
c@AgentClient {acThread, generalQ} <- liftIO $ newAgentClient clientId initServers currentTs notices processEvent processMsg env
276-
void $ liftIO $ forkIO $ connWorkerLoop c generalQ
277-
unless backgroundMode $ do
278-
t <- runAgentThreads c `forkFinally` const (liftIO $ disconnectAgentClient c)
279-
atomically . writeTVar acThread . Just =<< mkWeakThreadId t
280-
pure c
276+
liftIO $ newAgentClient clientId initServers currentTs notices processEvent processMsg env
281277
checkServers protocol srvs =
282278
forM_ (M.assocs srvs) $ \(userId, srvs') -> checkUserServers ("getSMPAgentClient " <> protocol <> " " <> tshow userId) srvs'
283-
runAgentThreads c = do
279+
280+
startSMPAgentClient :: AgentClient -> Bool -> IO ()
281+
startSMPAgentClient c@AgentClient {acThread, generalQ, agentEnv} backgroundMode = do
282+
void $ forkIO $ connWorkerLoop c generalQ
283+
unless backgroundMode $ do
284+
t <- runAgentThreads `forkFinally` const (disconnectAgentClient c)
285+
atomically . writeTVar acThread . Just =<< mkWeakThreadId t
286+
where
287+
runAgentThreads = flip runReaderT agentEnv $ do
284288
restoreServersStats c
285289
raceAny_
286-
[ run c "runNtfSupervisor" $ runNtfSupervisor c,
287-
run c "cleanupManager" $ cleanupManager c,
288-
run c "logServersStats" $ logServersStats c
290+
[ run "runNtfSupervisor" $ runNtfSupervisor c,
291+
run "cleanupManager" $ cleanupManager c,
292+
run "logServersStats" $ logServersStats c
289293
]
290294
`E.finally` saveServersStats c
291-
run c'@AgentClient {acThread} name a =
295+
run name a =
292296
a `E.catchAny` \e -> whenM (isJust <$> readTVarIO acThread) $ do
293297
logError $ "Agent thread " <> name <> " crashed: " <> tshow e
294-
liftIO $ notifyEvent c' ("", "", AEvt SAEConn $ ERR $ CRITICAL True $ show e)
298+
liftIO $ notifyEvent c ("", "", AEvt SAEConn $ ERR $ CRITICAL True $ show e)
295299

296300
logServersStats :: AgentClient -> AM' ()
297301
logServersStats c = do

tests/AgentTests/FunctionalAPITests.hs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4333,8 +4333,9 @@ getSMPAgentClient' :: Int -> AgentConfig -> InitialAgentServers -> String -> IO
43334333
getSMPAgentClient' clientId cfg' initServers dbPath = do
43344334
Right st <- liftIO $ createStore dbPath
43354335
subQ <- newTBQueueIO 1024
4336-
Right client <- runExceptT $ getSMPAgentClient_ clientId cfg' initServers st False (atomically . writeTBQueue subQ)
4336+
Right client <- runExceptT $ getSMPAgentClient_ clientId cfg' initServers st (atomically . writeTBQueue subQ)
43374337
when (dbNew st) $ insertUser st
4338+
startSMPAgentClient client False
43384339
pure AgentClient {client, subQ}
43394340

43404341
#if defined(dbPostgres)

0 commit comments

Comments
 (0)