{-# LANGUAGE DataKinds #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TypeOperators #-}
module Main where
import Servant.API.WebSocket (WebSocket)
import Control.Concurrent (threadDelay)
import Control.Monad.IO.Class (MonadIO, liftIO)
import Data.Foldable (forM_)
import Data.Text (pack)
import Network.Wai (Application)
import Network.Wai.Handler.Warp (run)
import Network.WebSockets (Connection, forkPingThread, sendTextData)
import Servant ((:>), Proxy (..), Server, serve)
type WebSocketApi = "stream" :> WebSocket
startApp :: IO ()
startApp = do
putStrLn "Starting server on http://localhost:8080"
run 8080 app
app :: Application
app = serve api server
api :: Proxy WebSocketApi
api = Proxy
server :: Server WebSocketApi
server = streamData
where
streamData :: MonadIO m => Connection -> m ()
streamData c = liftIO . forM_ [1..] $ \i -> do
forkPingThread c 10
sendTextData c (pack $ show (i :: Int)) >> threadDelay 1000000
main :: IO ()
main = startApp