@@ -17,6 +17,7 @@ module Simplex.Messaging.Agent.Env.SQLite
1717 AgentConfig (.. ),
1818 InitialAgentServers (.. ),
1919 ServerCfg (.. ),
20+ OperatorId ,
2021 UserServers (.. ),
2122 NetworkConfig (.. ),
2223 presetServerCfg ,
@@ -54,6 +55,8 @@ import Data.List.NonEmpty (NonEmpty)
5455import qualified Data.List.NonEmpty as L
5556import Data.Map.Strict (Map )
5657import Data.Maybe (fromMaybe )
58+ import Data.Set (Set )
59+ import qualified Data.Set as S
5760import Data.Time.Clock (NominalDiffTime , nominalDay )
5861import Data.Time.Clock.System (SystemTime (.. ))
5962import Data.Word (Word16 )
@@ -71,10 +74,11 @@ import Simplex.Messaging.Notifications.Client (defaultNTFClientConfig)
7174import Simplex.Messaging.Notifications.Transport (NTFVersion )
7275import Simplex.Messaging.Notifications.Types
7376import Simplex.Messaging.Parsers (defaultJSON )
74- import Simplex.Messaging.Protocol (NtfServer , ProtoServerWithAuth , ProtocolServer , ProtocolType (.. ), ProtocolTypeI , VersionRangeSMPC , XFTPServer , supportedSMPClientVRange )
77+ import Simplex.Messaging.Protocol (NtfServer , ProtoServerWithAuth ( .. ) , ProtocolServer ( .. ) , ProtocolType (.. ), ProtocolTypeI , VersionRangeSMPC , XFTPServer , supportedSMPClientVRange )
7578import Simplex.Messaging.TMap (TMap )
7679import qualified Simplex.Messaging.TMap as TM
7780import Simplex.Messaging.Transport (SMPVersion )
81+ import Simplex.Messaging.Transport.Client (TransportHost )
7882import Simplex.Messaging.Util (allFinally , catchAllErrors , catchAllErrors' , tryAllErrors , tryAllErrors' )
7983import System.Mem.Weak (Weak )
8084import System.Random (StdGen , newStdGen )
@@ -94,29 +98,42 @@ data InitialAgentServers = InitialAgentServers
9498
9599data ServerCfg p = ServerCfg
96100 { server :: ProtoServerWithAuth p ,
101+ operator :: OperatorId ,
97102 preset :: Bool ,
98103 tested :: Maybe Bool ,
99- enabled :: Bool
104+ enabled :: Bool ,
105+ roles :: ServerRoles
100106 }
101107 deriving (Show )
102108
103- enabledServerCfg :: ProtoServerWithAuth p -> ServerCfg p
104- enabledServerCfg server = ServerCfg {server, preset = False , tested = Nothing , enabled = True }
109+ data ServerRoles = ServerRoles
110+ { storage :: Bool ,
111+ proxy :: Bool
112+ }
113+ deriving (Show )
114+
115+ enabledServerCfg :: ProtoServerWithAuth p -> OperatorId -> ServerCfg p
116+ enabledServerCfg server operator =
117+ ServerCfg {server, operator, preset = False , tested = Nothing , enabled = True , roles = ServerRoles True True }
105118
106- presetServerCfg :: Bool -> ProtoServerWithAuth p -> ServerCfg p
107- presetServerCfg enabled server = ServerCfg {server, preset = True , tested = Nothing , enabled}
119+ presetServerCfg :: Bool -> ServerRoles -> ProtoServerWithAuth p -> OperatorId -> ServerCfg p
120+ presetServerCfg enabled roles server operator =
121+ ServerCfg {server, operator, preset = True , tested = Nothing , enabled, roles}
108122
109123data UserServers p = UserServers
110- { enabledSrvs :: NonEmpty (ProtoServerWithAuth p ),
111- knownSrvs :: NonEmpty (ProtocolServer p )
124+ { storageSrvs :: NonEmpty (OperatorId , ProtoServerWithAuth p ),
125+ proxySrvs :: NonEmpty (OperatorId , ProtoServerWithAuth p ),
126+ knownHosts :: Set TransportHost
112127 }
113128
129+ type OperatorId = Int64
130+
114131-- This function sets all servers as enabled in case all passed servers are disabled.
115132mkUserServers :: NonEmpty (ServerCfg p ) -> UserServers p
116- mkUserServers srvs = UserServers {enabledSrvs, knownSrvs }
133+ mkUserServers srvs = UserServers {storageSrvs = filterSrvs storage, proxySrvs = filterSrvs proxy, knownHosts }
117134 where
118- enabledSrvs = L. map (\ ServerCfg {server} -> server) $ fromMaybe srvs $ L. nonEmpty $ L. filter (\ ServerCfg {enabled} -> enabled) srvs
119- knownSrvs = L. map (\ ServerCfg {server = ProtoServerWithAuth srv _} -> srv ) srvs
135+ filterSrvs role = L. map (\ ServerCfg {operator, server} -> (operator, server)) $ fromMaybe srvs $ L. nonEmpty $ L. filter (\ ServerCfg {enabled, roles } -> enabled && role roles ) srvs
136+ knownHosts = S. unions $ L. map (\ ServerCfg {server = ProtoServerWithAuth ProtocolServer {host} _} -> S. fromList $ L. toList host ) srvs
120137
121138data AgentConfig = AgentConfig
122139 { tcpPort :: Maybe ServiceName ,
@@ -333,6 +350,8 @@ updateRestartCount t (RestartCount minute count) = do
333350
334351$ (pure [] )
335352
353+ $ (JQ. deriveJSON defaultJSON ''ServerRoles)
354+
336355instance ProtocolTypeI p => ToJSON (ServerCfg p ) where
337356 toEncoding = $ (JQ. mkToEncoding defaultJSON ''ServerCfg)
338357 toJSON = $ (JQ. mkToJSON defaultJSON ''ServerCfg)
0 commit comments