packages feed

elm-websocket-1.0: example/server/src/Main.hs

{-# LANGUAGE OverloadedStrings #-}

module Main where

import           Api
import           Control.Concurrent.MVar       as MVar
import           Elm.WebSocket                 as WS
import qualified Network.Wai.Handler.Warp      as Warp
import           Network.Wai.Middleware.Static
import           Web.Scotty

main :: IO ()
main = do
  tasks <- MVar.newMVar []
  broadcaster <- WS.newBroadcaster
  httpApplication <- scottyApp httpEndpoints
  Warp.run 8080 $ WS.withWebSocketBroadcaster broadcaster (webSocketService tasks broadcaster) httpApplication

webSocketService :: MVar [Task] -> Broadcaster -> WebSocketServer Request Response
webSocketService tasks broadcaster request =
  case request of
    CreateTaskRequest name description -> do
      MVar.modifyMVar_ tasks (\allTasks -> return $ allTasks ++ [Task 1 name description Ready])
      newTasks <- MVar.readMVar tasks
      WS.broadcast broadcaster $ Response newTasks
      return Nothing
    LoadAllTasksRequest -> do
      newTasks <- MVar.readMVar tasks
      return $ Just $ Response newTasks

httpEndpoints :: ScottyM ()
httpEndpoints = do
  middleware $ staticPolicy (noDots >-> addBase "assets")
  matchAny "/" $ redirect "/index.html"