packages feed

postgres-websockets-0.11.2.4: src/PostgresWebsockets/Server.hs

-- |
-- Module      : PostgresWebsockets.Server
-- Description : Functions to start a full stand-alone PostgresWebsockets server.
module PostgresWebsockets.Server
  ( serve,
  )
where

import APrelude
import Network.HTTP.Types (status200)
import Network.Wai (Application, responseLBS)
import Network.Wai.Application.Static (defaultFileServerSettings, staticApp)
import Network.Wai.Handler.Warp (runSettings)
import Network.Wai.Handler.WarpTLS (runTLS, tlsSettings)
import Network.Wai.Middleware.RequestLogger (logStdout)
import PostgresWebsockets.Config (AppConfig (..), warpSettings)
import PostgresWebsockets.Context (mkContext)
import PostgresWebsockets.Middleware (postgresWsMiddleware)

-- | Start a stand-alone warp server using the parameters from AppConfig and a opening a database connection pool.
serve :: AppConfig -> IO ()
serve conf@AppConfig {..} = do
  shutdownSignal <- newEmptyMVar
  putStrLn $ "Listening on port " <> show configPort

  let shutdown = putErrLn ("Broadcaster connection is dead" :: Text) >> putMVar shutdownSignal ()
  ctx <- mkContext conf shutdown

  let waitForShutdown cl = void $ forkIO (takeMVar shutdownSignal >> cl)
      appSettings = warpSettings waitForShutdown conf
      app = postgresWsMiddleware ctx $ logStdout $ maybe dummyApp staticApp' configPath

  case (configCertificateFile, configKeyFile) of
    (Just certificate, Just key) -> runTLS (tlsSettings (unpack certificate) (unpack key)) appSettings app
    _ -> runSettings appSettings app

  die "Shutting down server..."
  where
    staticApp' :: Text -> Application
    staticApp' = staticApp . defaultFileServerSettings . unpack
    dummyApp :: Application
    dummyApp _ respond =
      respond $ responseLBS status200 [("Content-Type", "text/plain")] "Hello, Web!"