Safe Haskell | None |
---|
- data PendingConnection
- pendingRequest :: PendingConnection -> RequestHead
- acceptRequest :: PendingConnection -> IO Connection
- rejectRequest :: PendingConnection -> ByteString -> IO ()
- data Connection
- data ConnectionOptions = ConnectionOptions {
- connectionOnPong :: IO ()
- defaultConnectionOptions :: ConnectionOptions
- receive :: Connection -> IO Message
- receiveDataMessage :: Connection -> IO DataMessage
- receiveData :: WebSocketsData a => Connection -> IO a
- send :: Connection -> Message -> IO ()
- sendDataMessage :: Connection -> DataMessage -> IO ()
- sendTextData :: WebSocketsData a => Connection -> a -> IO ()
- sendBinaryData :: WebSocketsData a => Connection -> a -> IO ()
- sendClose :: WebSocketsData a => Connection -> a -> IO ()
- sendPing :: WebSocketsData a => Connection -> a -> IO ()
- type Headers = [(CI ByteString, ByteString)]
- data Request = Request RequestHead ByteString
- data RequestHead = RequestHead {}
- data Response = Response ResponseHead ByteString
- data ResponseHead = ResponseHead {}
- data Message
- data ControlMessage
- = Close ByteString
- | Ping ByteString
- | Pong ByteString
- data DataMessage
- class WebSocketsData a where
- fromLazyByteString :: ByteString -> a
- toLazyByteString :: a -> ByteString
- data HandshakeException
- data ConnectionException = ConnectionClosed
- type ServerApp = PendingConnection -> IO ()
- runServer :: String -> Int -> ServerApp -> IO ()
- runServerWith :: String -> Int -> ConnectionOptions -> ServerApp -> IO ()
- type ClientApp a = Connection -> IO a
- runClient :: String -> Int -> String -> ClientApp a -> IO a
- runClientWith :: String -> Int -> String -> ConnectionOptions -> Headers -> ClientApp a -> IO a
- runClientWithSocket :: Socket -> String -> String -> ConnectionOptions -> Headers -> ClientApp a -> IO a
- runClientWithStream :: (InputStream ByteString, OutputStream ByteString) -> String -> String -> ConnectionOptions -> Headers -> ClientApp a -> IO a
Incoming connections and handshaking
data PendingConnection Source
A new client connected to the server. We haven't accepted the connection yet, though.
pendingRequest :: PendingConnection -> RequestHeadSource
Useful for e.g. inspecting the request path.
rejectRequest :: PendingConnection -> ByteString -> IO ()Source
Main connection type
data Connection Source
Options for connections
Sending and receiving messages
receive :: Connection -> IO MessageSource
receiveDataMessage :: Connection -> IO DataMessageSource
Receive an application message. Automatically respond to control messages.
receiveData :: WebSocketsData a => Connection -> IO aSource
Receive a message, converting it to whatever format is needed.
send :: Connection -> Message -> IO ()Source
sendDataMessage :: Connection -> DataMessage -> IO ()Source
Send a DataMessage
sendTextData :: WebSocketsData a => Connection -> a -> IO ()Source
Send a message as text
sendBinaryData :: WebSocketsData a => Connection -> a -> IO ()Source
Send a message as binary data
sendClose :: WebSocketsData a => Connection -> a -> IO ()Source
Send a friendly close message
sendPing :: WebSocketsData a => Connection -> a -> IO ()Source
Send a ping
HTTP Types
type Headers = [(CI ByteString, ByteString)]Source
Request headers
data RequestHead Source
An HTTP request. The request body is not yet read.
data ResponseHead Source
HTTP response, without body.
WebSocket message types
The kind of message a server application typically deals with
data ControlMessage Source
Different control messages
data DataMessage Source
For an end-user of this library, dealing with Frame
s would be a bit
low-level. This is why define another type on top of it, which represents
data for the application layer.
class WebSocketsData a whereSource
In order to have an even more high-level API, we define a typeclass for values the user can receive from and send to the socket. A few warnings apply:
- Natively, everything is represented as a
ByteString
, so this is the fastest instance - You should only use the
Text
or theText
instance when you are sure that the data is UTF-8 encoded (which is the case forText
messages). - Messages can be very large. If this is the case, it might be inefficient to
use the strict
ByteString
andText
instances.
fromLazyByteString :: ByteString -> aSource
toLazyByteString :: a -> ByteStringSource
Exceptions
data HandshakeException Source
Error in case of failed handshake. Will be thrown as an Exception
.
TODO: This should probably be in the Handshake module, and is solely here to prevent a cyclic dependency.
NotSupported | We don't have a match for the protocol requested by the client. todo: version parameter |
MalformedRequest RequestHead String | The request was somehow invalid (missing headers or wrong security token) |
MalformedResponse ResponseHead String | The servers response was somehow invalid (missing headers or wrong security token) |
RequestRejected Request String | The request was well-formed, but the library user rejected it. (e.g. unknown path) |
OtherHandshakeException String | for example EOF came too early (which is actually a parse error) or for your own errors. (like unknown path?) |
data ConnectionException Source
The connection couldn't be established or broke down unexpectedly. thrown as an iteratee exception.
ConnectionClosed | the client unexpectedly closed the connection while we were trying to receive some data. todo: Also want this for sending. |
Running a standalone server
type ServerApp = PendingConnection -> IO ()Source
WebSockets application that can be ran by a server. Once this IO
action
finishes, the underlying socket is closed automatically.
Provides a simple server. This function blocks forever. Note that this is merely provided for quick-and-dirty standalone applications, for real applications, you should use a real server.
runServerWith :: String -> Int -> ConnectionOptions -> ServerApp -> IO ()Source
A version of runServer
which allows you to customize some options.
Running a client
type ClientApp a = Connection -> IO aSource
A client application interacting with a single server. Once this IO
action finished, the underlying socket is closed automatically.
:: (InputStream ByteString, OutputStream ByteString) | Stream |
-> String | Host |
-> String | Path |
-> ConnectionOptions | Connection options |
-> Headers | Custom headers to send |
-> ClientApp a | Client application |
-> IO a |