module Network.WebSockets
(
I.WebSocketsOptions (..)
, I.defaultWebSocketsOptions
, I.WebSockets
, I.runWebSockets
, I.runWebSocketsWith
, I.runServer
, I.runWithSocket
, I.Headers
, I.Request (..)
, I.Response (..)
, I.FrameType (..)
, I.Frame (..)
, I.Message (..)
, I.ControlMessage (..)
, I.DataMessage (..)
, I.WebSocketsData (..)
, H.HandshakeError (..)
, receiveRequest
, sendResponse
, H.handshake
, receiveFrame
, sendFrame
, receiveMessage
, sendMessage
, receiveDataMessage
, sendDataMessage
, receiveData
, sendTextData
, sendBinaryData
, E.Encoder
, I.Sender
, I.send
, I.getSender
, E.response
, E.frame
, E.message
, E.controlMessage
, E.dataMessage
, E.textData
, E.binaryData
) where
import Control.Monad.State (put, get)
import Control.Monad.Trans (liftIO)
import qualified Network.WebSockets.Decode as D
import qualified Network.WebSockets.Demultiplex as I
import qualified Network.WebSockets.Encode as E
import qualified Network.WebSockets.Handshake as H
import qualified Network.WebSockets.Monad as I
import qualified Network.WebSockets.Socket as I
import qualified Network.WebSockets.Types as I
receiveRequest :: I.WebSockets (Maybe I.Request)
receiveRequest = I.receive D.request
sendResponse :: I.Response -> I.WebSockets ()
sendResponse = I.send E.response
receiveFrame :: I.WebSockets (Maybe I.Frame)
receiveFrame = I.receive D.frame
sendFrame :: I.Frame -> I.WebSockets ()
sendFrame = I.send E.frame
receiveMessage :: I.WebSockets (Maybe I.Message)
receiveMessage = I.WebSockets $ do
mf <- I.unWebSockets receiveFrame
case mf of
Nothing -> return Nothing
Just f -> do
s <- get
let (msg, s') = I.demultiplex s f
put s'
case msg of
Nothing -> I.unWebSockets receiveMessage
Just m -> return (Just m)
sendMessage :: I.Message -> I.WebSockets ()
sendMessage = I.send E.message
receiveDataMessage :: I.WebSockets (Maybe I.DataMessage)
receiveDataMessage = do
mm <- receiveMessage
case mm of
Nothing -> return Nothing
Just (I.DataMessage am) -> return (Just am)
Just (I.ControlMessage cm) -> case cm of
I.Close _ -> return Nothing
I.Pong _ -> do
options <- I.getOptions
liftIO $ I.onPong options
receiveDataMessage
I.Ping pl -> do
I.send E.controlMessage (I.Pong pl)
receiveDataMessage
sendDataMessage :: I.DataMessage -> I.WebSockets ()
sendDataMessage = I.send E.dataMessage
receiveData :: I.WebSocketsData a => I.WebSockets (Maybe a)
receiveData = do
dm <- receiveDataMessage
case dm of
Nothing -> return Nothing
Just (I.Text x) -> return (Just $ I.fromLazyByteString x)
Just (I.Binary x) -> return (Just $ I.fromLazyByteString x)
sendTextData :: I.WebSocketsData a => a -> I.WebSockets ()
sendTextData = I.send E.textData
sendBinaryData :: I.WebSocketsData a => a -> I.WebSockets ()
sendBinaryData = I.send E.binaryData