@@ -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
256257type 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
260261getSMPAgentClient = 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
296300logServersStats :: AgentClient -> AM' ()
297301logServersStats c = do
0 commit comments