{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE PackageImports #-}
-- | MessagePack RPC Client based on WebSocket.
module Network.MessagePack.RPC.Client.WebSocket
(
-- * Config
Config(..)
, NotificationHandler
, RequestHandler
, Logger
, Formatter
, defaultConfig
-- * Backend
, Backend(..)
-- * Client
, URL
, Client
, withClient
, shutdown
-- * Call and reply
, Result
, call
, reply
)
where
import qualified Data.Text as T
import qualified "wss-client" Network.WebSockets.Client as Ws
import Network.MessagePack.RPC.Client hiding (withClient)
import qualified Network.MessagePack.RPC.Client as RPC (withClient)
-- | URL for websocket end points.
type URL = String
-- | Executing the action in the 3rd argument with a 'Client'.
withClient
:: URL -- ^ URL
-> Config -- ^ Configuration
-> (Client -> IO a) -- ^ Action
-> IO a
withClient url config action = Ws.withConnection url $ \conn ->
Ws.withPingThread conn 30 (return ()) $ do
let backend = Backend (Ws.sendBinaryData conn)
(Ws.receiveData conn)
(Ws.sendClose conn ("Bye!" :: T.Text))
RPC.withClient config backend action