{-| Module : PostgresWebsockets.Context Description : Produce a context capable of running postgres-websockets sessions -} module PostgresWebsockets.Context ( Context (..) , mkContext ) where import Protolude import Data.Time.Clock (UTCTime, getCurrentTime) import Control.AutoUpdate ( defaultUpdateSettings , mkAutoUpdate , updateAction ) import qualified Hasql.Pool as P import PostgresWebsockets.Config ( AppConfig(..) ) import PostgresWebsockets.HasqlBroadcast (newHasqlBroadcaster) import PostgresWebsockets.Broadcast (Multiplexer) data Context = Context { ctxConfig :: AppConfig , ctxPool :: P.Pool , ctxMulti :: Multiplexer , ctxGetTime :: IO UTCTime } -- | Given a configuration and a shutdown action (performed when the Multiplexer's listen connection dies) produces the context necessary to run sessions mkContext :: AppConfig -> IO () -> IO Context mkContext conf@AppConfig{..} shutdown = do Context conf <$> P.acquire (configPool, 10, pgSettings) <*> newHasqlBroadcaster shutdown (toS configListenChannel) configRetries pgSettings <*> mkGetTime where mkGetTime :: IO (IO UTCTime) mkGetTime = mkAutoUpdate defaultUpdateSettings {updateAction = getCurrentTime} pgSettings = toS configDatabase