module Network.WebSockets.Types
( Decoder
, Encoder
, FrameType (..)
, Frame (..)
, Message (..)
, ControlMessage (..)
, DataMessage (..)
, WebSocketsData (..)
, ConnectionError (..)
) where
import Control.Exception (Exception(..))
import Data.Typeable (Typeable)
import Data.Attoparsec (Parser)
import qualified Blaze.ByteString.Builder as B
import qualified Data.Attoparsec.Enumerator as AE
import qualified Data.ByteString as B
import qualified Data.ByteString.Lazy as BL
import qualified Data.Text as T
import qualified Data.Text.Lazy as TL
import qualified Data.Text.Lazy.Encoding as TL
import Network.WebSockets.Mask
type Decoder p a = Parser a
type Encoder p a = Mask -> a -> B.Builder
data ConnectionError
= ParseError AE.ParseError
| ConnectionClosed
deriving (Show, Typeable)
instance Exception ConnectionError
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 p
= ControlMessage (ControlMessage p)
| DataMessage (DataMessage p)
deriving (Eq, Show)
data ControlMessage p
= Close BL.ByteString
| Ping BL.ByteString
| Pong BL.ByteString
deriving (Eq, Show)
data DataMessage p
= Text BL.ByteString
| Binary BL.ByteString
deriving (Eq, 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