server/src/Main.hs

42 lines
1.4 KiB
Haskell
Raw Normal View History

2018-04-11 13:25:24 +02:00
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE NamedFieldPuns #-}
module Main where
import Network.Wai.Handler.Warp (run)
import Network.HTTP.Types.Status (badRequest400)
import Network.WebSockets (ServerApp, acceptRequest, defaultConnectionOptions)
2018-04-11 13:25:24 +02:00
import Network.Wai.Handler.WebSockets (websocketsOr)
import Network.Wai (responseLBS)
import Control.Monad.Reader (ReaderT(..), asks)
import Control.Concurrent (newMVar, modifyMVar)
import Control.Exception (finally)
2018-04-11 13:25:24 +02:00
import qualified Config (listenPort)
import qualified Session (open)
import qualified Server (disconnect, new, register)
import qualified App (Context(..), T, update_)
import qualified Message (FromClient(..), broadcast, relay)
import qualified Automaton (start)
2018-04-11 13:25:24 +02:00
exit :: App.T ()
2018-04-11 13:25:24 +02:00
exit = do
asks App.key >>= App.update_ . Server.disconnect
Message.relay Message.LogOut Message.broadcast
2018-04-11 13:25:24 +02:00
serverApp :: App.T () -> App.T () -> IO ServerApp
serverApp onEnter onExit = do
mServer <- newMVar Server.new
return $ \pending -> do
session <- Session.open <$> acceptRequest pending
key <- modifyMVar mServer (return . Server.register session)
let app = App.Context {App.mServer, App.key}
finally
(runReaderT onEnter app)
(runReaderT onExit app)
2018-04-11 13:25:24 +02:00
main :: IO ()
main = do
app <- serverApp Automaton.start exit
2018-04-11 13:25:24 +02:00
run Config.listenPort $ websocketsOr defaultConnectionOptions app blockNonWS
where
blockNonWS _ = ( $ responseLBS badRequest400 [] "Use a websocket")