@@ -15,6 +15,7 @@ module Simplex.Messaging.Client.Agent
1515 ( SMPClientAgent (.. ),
1616 SMPClientAgentConfig (.. ),
1717 SMPClientAgentEvent (.. ),
18+ DBService (.. ),
1819 OwnServer ,
1920 defaultSMPClientAgentConfig ,
2021 newSMPClientAgent ,
@@ -133,6 +134,7 @@ defaultSMPClientAgentConfig =
133134data SMPClientAgent p = SMPClientAgent
134135 { agentCfg :: SMPClientAgentConfig ,
135136 agentParty :: SParty p ,
137+ dbService :: Maybe DBService ,
136138 active :: TVar Bool ,
137139 startedAt :: UTCTime ,
138140 msgQ :: TBQueue (ServerTransmissionBatch SMPVersion ErrorType BrokerMsg ),
@@ -155,8 +157,8 @@ data SMPClientAgent p = SMPClientAgent
155157
156158type OwnServer = Bool
157159
158- newSMPClientAgent :: SParty p -> SMPClientAgentConfig -> TVar ChaChaDRG -> IO (SMPClientAgent p )
159- newSMPClientAgent agentParty agentCfg@ SMPClientAgentConfig {msgQSize, agentQSize} randomDrg = do
160+ newSMPClientAgent :: SParty p -> SMPClientAgentConfig -> Maybe DBService -> TVar ChaChaDRG -> IO (SMPClientAgent p )
161+ newSMPClientAgent agentParty agentCfg@ SMPClientAgentConfig {msgQSize, agentQSize} dbService randomDrg = do
160162 active <- newTVarIO True
161163 startedAt <- getCurrentTime
162164 msgQ <- newTBQueueIO msgQSize
@@ -173,6 +175,7 @@ newSMPClientAgent agentParty agentCfg@SMPClientAgentConfig {msgQSize, agentQSize
173175 SMPClientAgent
174176 { agentCfg,
175177 agentParty,
178+ dbService,
176179 active,
177180 startedAt,
178181 msgQ,
@@ -188,6 +191,11 @@ newSMPClientAgent agentParty agentCfg@SMPClientAgentConfig {msgQSize, agentQSize
188191 workerSeq
189192 }
190193
194+ data DBService = DBService
195+ { getCredentials :: SMPServer -> IO (Either SMPClientError ServiceCredentials ),
196+ updateServiceId :: SMPServer -> Maybe ServiceId -> IO (Either SMPClientError () )
197+ }
198+
191199-- | Get or create SMP client for SMPServer
192200getSMPServerClient' :: SMPClientAgent p -> SMPServer -> ExceptT SMPClientError IO SMPClient
193201getSMPServerClient' ca srv = snd <$> getSMPServerClient'' ca srv
@@ -218,7 +226,7 @@ getSMPServerClient'' ca@SMPClientAgent {agentCfg, smpClients, smpSessions, worke
218226
219227 newSMPClient :: SMPClientVar -> IO (Either SMPClientError (OwnServer , SMPClient ))
220228 newSMPClient v = do
221- r <- connectClient ca srv v `E.catch` ( pure . Left . PCEIOError )
229+ r <- connectClient ca srv v `E.catch` \ (e :: E. SomeException ) -> pure $ Left $ PCEIOError $ E. displayException e
222230 case r of
223231 Right smp -> do
224232 logInfo . decodeUtf8 $ " Agent connected to " <> showServer srv
@@ -227,8 +235,7 @@ getSMPServerClient'' ca@SMPClientAgent {agentCfg, smpClients, smpSessions, worke
227235 atomically $ do
228236 putTMVar (sessionVar v) (Right c)
229237 TM. insert (sessionId $ thParams smp) c smpSessions
230- let serviceId_ = (\ THClientService {serviceId} -> serviceId) <$> smpClientService smp
231- notify ca $ CAConnected srv serviceId_
238+ notify ca $ CAConnected srv $ smpClientServiceId smp
232239 pure $ Right c
233240 Left e -> do
234241 let ei = persistErrorInterval agentCfg
@@ -249,9 +256,18 @@ isOwnServer SMPClientAgent {agentCfg} ProtocolServer {host} =
249256
250257-- | Run an SMP client for SMPClientVar
251258connectClient :: SMPClientAgent p -> SMPServer -> SMPClientVar -> IO (Either SMPClientError SMPClient )
252- connectClient ca@ SMPClientAgent {agentCfg, smpClients, smpSessions, msgQ, randomDrg, startedAt} srv v =
253- getProtocolClient randomDrg NRMBackground (1 , srv, Nothing ) (smpCfg agentCfg) [] (Just msgQ) startedAt clientDisconnected
259+ connectClient ca@ SMPClientAgent {agentCfg, dbService, smpClients, smpSessions, msgQ, randomDrg, startedAt} srv v = case dbService of
260+ Just dbs -> runExceptT $ do
261+ creds <- ExceptT $ getCredentials dbs srv
262+ smp <- ExceptT $ getClient cfg {serviceCredentials = Just creds}
263+ whenM (atomically $ activeClientSession ca smp srv) $
264+ ExceptT $ updateServiceId dbs srv $ smpClientServiceId smp
265+ pure smp
266+ Nothing -> getClient cfg
254267 where
268+ cfg = smpCfg agentCfg
269+ getClient cfg' = getProtocolClient randomDrg NRMBackground (1 , srv, Nothing ) cfg' [] (Just msgQ) startedAt clientDisconnected
270+
255271 clientDisconnected :: SMPClient -> IO ()
256272 clientDisconnected smp = do
257273 removeClientAndSubs smp >>= serverDown
@@ -435,7 +451,7 @@ smpSubscribeQueues ca smp srv subs = do
435451 unless (null notPending) $ removePendingSubs ca srv notPending
436452 pure acc
437453 sessId = sessionId $ thParams smp
438- smpServiceId = ( \ THClientService {serviceId} -> serviceId) <$> smpClientService smp
454+ smpServiceId = smpClientServiceId smp
439455 groupSub ::
440456 Map QueueId C. APrivateAuthKey ->
441457 ((QueueId , C. APrivateAuthKey ), Either SMPClientError (Maybe ServiceId )) ->
0 commit comments