jitsi-roomsv2/backend/src/WebServer.hs

106 lines
2 KiB
Haskell
Raw Normal View History

2023-01-27 18:34:28 +01:00
{-# LANGUAGE AllowAmbiguousTypes #-}
2023-01-27 19:53:34 +01:00
{-# LANGUAGE DerivingVia #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE LambdaCase #-}
2023-01-27 18:34:28 +01:00
2023-01-15 18:26:41 +01:00
module WebServer (runWebServer) where
2023-01-27 19:53:34 +01:00
import ClassyPrelude hiding (decodeUtf8)
import Data.Text.Encoding
import Network.HTTP.Types
import Network.Wai
import Network.Wai.Handler.Warp (run)
import RoomDataHandler (roomDataHandler)
2023-01-27 19:53:34 +01:00
import Types.AppTypes
( Env (..),
HasConnectedClientState (..),
)
import Types.RoomsState
( HasRoomsState (getRoomsState),
roomStateDiffers,
updateRoomState,
)
import Types.WebEnv
2023-01-27 19:53:34 +01:00
import WebSocket (broadCastToClients)
2023-01-27 18:34:28 +01:00
newtype WebApp env a = WebApp {unWebApp :: env -> IO a}
deriving
( Functor,
Applicative,
Monad,
MonadReader env,
MonadIO
)
via ReaderT env IO
getRequestPath ::
2023-01-27 18:34:28 +01:00
( MonadIO m,
HasWebEnv env,
MonadReader env m
) =>
m [Text]
getRequestPath = do
2023-01-27 18:34:28 +01:00
request <- getRequest <$> ask
return $ pathInfo request
2023-01-27 18:34:28 +01:00
app ::
( MonadIO m,
HasWebEnv env,
HasConnectedClientState env,
2023-01-27 19:53:34 +01:00
MonadReader env m,
HasRoomsState env
2023-01-27 18:34:28 +01:00
) =>
m ResponseReceived
app = requestPathHandler
requestPathHandler ::
( MonadIO m,
HasWebEnv env,
HasConnectedClientState env,
MonadReader env m,
HasRoomsState env
) =>
m ResponseReceived
requestPathHandler = do
getRequestPath >>= \case
["roomdata"] -> roomDataHandler
_ -> notFound
notFound ::
( MonadIO m,
HasWebEnv env,
MonadReader env m
) =>
m ResponseReceived
notFound = do
respond' <- getRespond <$> ask
liftIO $
respond' $
responseLBS
status404
[("Content-Type", "text/plain")]
"404 - Not Found"
2023-01-27 18:34:28 +01:00
runWebApp ::
( MonadIO m,
MonadReader Env m
) =>
m Application
runWebApp = do
env <- ask
return
( \req res -> do
let webEnv = WebEnv {appEnv = env, request = req, respond = res}
unWebApp app webEnv
)
runWebServer ::
( MonadIO m,
MonadReader Env m
) =>
m ()
runWebServer = do
putStrLn "http://localhost:8081/"
runWebApp >>= liftIO . run 8081
return ()