module Network.WebSockets.Types
( Headers
, Request (..)
, Response (..)
, FrameType (..)
, Frame (..)
, Message (..)
, ControlMessage (..)
, DataMessage (..)
, WebSocketsData (..)
) where
import qualified Data.ByteString as B
import qualified Data.ByteString.Lazy as BL
import qualified Data.CaseInsensitive as CI
import qualified Data.Text as T
import qualified Data.Text.Lazy as TL
import qualified Data.Text.Lazy.Encoding as TL
type Headers = [(CI.CI B.ByteString, B.ByteString)]
data Request = Request
{ requestPath :: !B.ByteString
, requestHeaders :: Headers
} deriving (Show)
data Response = Response
{ responseCode :: !Int
, responseMessage :: !B.ByteString
, responseHeaders :: Headers
} deriving (Show)
data Frame = Frame
{ frameFin :: !Bool
, frameType :: !FrameType
, framePayload :: !BL.ByteString
} deriving (Eq, Show)
data FrameType
= ContinuationFrame
| TextFrame
| BinaryFrame
| CloseFrame
| PingFrame
| PongFrame
deriving (Eq, Show)
data Message
= ControlMessage ControlMessage
| DataMessage DataMessage
deriving (Show)
data ControlMessage
= Close BL.ByteString
| Ping BL.ByteString
| Pong BL.ByteString
deriving (Show)
data DataMessage
= Text BL.ByteString
| Binary BL.ByteString
deriving (Show)
class WebSocketsData a where
fromLazyByteString :: BL.ByteString -> a
toLazyByteString :: a -> BL.ByteString
instance WebSocketsData BL.ByteString where
fromLazyByteString = id
toLazyByteString = id
instance WebSocketsData B.ByteString where
fromLazyByteString = B.concat . BL.toChunks
toLazyByteString = BL.fromChunks . return
instance WebSocketsData TL.Text where
fromLazyByteString = TL.decodeUtf8
toLazyByteString = TL.encodeUtf8
instance WebSocketsData T.Text where
fromLazyByteString = T.concat . TL.toChunks . fromLazyByteString
toLazyByteString = toLazyByteString . TL.fromChunks . return