network-messagepack-rpc 0.1.1.4 → 0.1.2.0
raw patch · 3 files changed
+71/−57 lines, 3 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
+ Network.MessagePack.RPC.Client.Internal: Backend :: (ByteString -> IO ()) -> IO ByteString -> IO () -> Backend
+ Network.MessagePack.RPC.Client.Internal: Client :: !SessionState -> !Backend -> Logger -> Formatter -> IORef (Maybe ThreadId) -> Client
+ Network.MessagePack.RPC.Client.Internal: SessionState :: IORef MessageId -> IORef (HashMap MessageId (MVar Result)) -> SessionState
+ Network.MessagePack.RPC.Client.Internal: [backendClose] :: Backend -> IO ()
+ Network.MessagePack.RPC.Client.Internal: [backendRecv] :: Backend -> IO ByteString
+ Network.MessagePack.RPC.Client.Internal: [backendSend] :: Backend -> ByteString -> IO ()
+ Network.MessagePack.RPC.Client.Internal: [clientBackend] :: Client -> !Backend
+ Network.MessagePack.RPC.Client.Internal: [clientFormat] :: Client -> Formatter
+ Network.MessagePack.RPC.Client.Internal: [clientHandlerTid] :: Client -> IORef (Maybe ThreadId)
+ Network.MessagePack.RPC.Client.Internal: [clientLog] :: Client -> Logger
+ Network.MessagePack.RPC.Client.Internal: [clientSessionState] :: Client -> !SessionState
+ Network.MessagePack.RPC.Client.Internal: [dispatchTable] :: SessionState -> IORef (HashMap MessageId (MVar Result))
+ Network.MessagePack.RPC.Client.Internal: [lastMessageId] :: SessionState -> IORef MessageId
+ Network.MessagePack.RPC.Client.Internal: data Backend
+ Network.MessagePack.RPC.Client.Internal: data Client
+ Network.MessagePack.RPC.Client.Internal: data SessionState
+ Network.MessagePack.RPC.Client.Internal: initSessionState :: IO SessionState
+ Network.MessagePack.RPC.Client.Internal: type Formatter = Message -> String
+ Network.MessagePack.RPC.Client.Internal: type Logger = String -> IO ()
+ Network.MessagePack.RPC.Client.Internal: type Result = Either Object Object
Files
- network-messagepack-rpc.cabal +2/−1
- src/Network/MessagePack/RPC/Client.hs +20/−56
- src/Network/MessagePack/RPC/Client/Internal.hs +49/−0
network-messagepack-rpc.cabal view
@@ -1,5 +1,5 @@ name: network-messagepack-rpc-version: 0.1.1.4+version: 0.1.2.0 synopsis: MessagePack RPC description: [MessagePack RPC](https://github.com/msgpack-rpc/msgpack-rpc/blob/master/spec.md) library based on the "data-msgpack" package. homepage: https://github.com/iij-ii/direct-hs/tree/master/network-messagepack-rpc@@ -16,6 +16,7 @@ ghc-options: -Wall exposed-modules: Data.MessagePack.RPC , Network.MessagePack.RPC.Client+ , Network.MessagePack.RPC.Client.Internal build-depends: base >= 4.7 && < 5 , bytestring
src/Network/MessagePack/RPC/Client.hs view
@@ -1,3 +1,4 @@+{-# LANGUAGE CPP #-} {-# LANGUAGE OverloadedStrings #-} -- | Backend-free MessagePack RPC Client.@@ -23,55 +24,31 @@ ) where -import Control.Concurrent (ThreadId, forkFinally, forkIO,- killThread)-import Control.Concurrent.MVar (MVar)-import qualified Control.Concurrent.MVar as MVar-import qualified Control.Exception.Safe as E-import Control.Monad (forever, void, when)-import qualified Data.ByteString as B-import qualified Data.ByteString.Lazy as BL-import qualified Data.HashMap.Strict as HM-import Data.IORef (IORef)-import qualified Data.IORef as IORef-import qualified Data.MessagePack as MsgPack-import Data.Monoid ((<>))-import System.IO (hPrint, stderr)-import System.Timeout (timeout)+import Control.Concurrent (forkFinally, forkIO,+ killThread)+import qualified Control.Concurrent.MVar as MVar+import qualified Control.Exception.Safe as E+import Control.Monad (forever, void, when)+import qualified Data.ByteString.Lazy as BL+import qualified Data.HashMap.Strict as HM+import qualified Data.IORef as IORef+import qualified Data.MessagePack as MsgPack+#if !MIN_VERSION_base(4,13,0)+import Data.Monoid ((<>))+#endif+import System.IO (hPrint, stderr)+import System.Timeout (timeout) import Data.MessagePack.RPC---- | A client data type for MessagePack RPC.-data Client = Client {- clientSessionState :: !SessionState- , clientBackend :: !Backend- , clientLog :: Logger- , clientFormat :: Formatter- , clientHandlerTid :: IORef (Maybe ThreadId)- }--data SessionState = SessionState {- lastMessageId :: IORef MessageId- , dispatchTable :: IORef (HM.HashMap MessageId (MVar Result))- }---- | Result type of a RPC call.--- Described as "error" and "result" of "Response Message"--- in [the spec of MessagePack RPC](https://github.com/msgpack-rpc/msgpack-rpc/blob/master/spec.md#response-message).-type Result = Either MsgPack.Object MsgPack.Object+import Network.MessagePack.RPC.Client.Internal -- | Notification handler. The 3rd argument is response objects. type NotificationHandler = Client -> MethodName -> [MsgPack.Object] -> IO () -- | Notification handler. The 2nd argument is message id to be used -- for replying. The 3rd argument is response objects.-type RequestHandler = Client -> MessageId -> MethodName -> [MsgPack.Object] -> IO ()---- | Logger type. Should print out the message passed as a first argument somewhere.-type Logger = String -> IO ()---- | Convert 'Message' into a @String@ to print out by 'Logger'-type Formatter = Message -> String+type RequestHandler+ = Client -> MessageId -> MethodName -> [MsgPack.Object] -> IO () -- | Configuration for MessagePack RPC. data Config = Config {@@ -95,19 +72,11 @@ { notificationHandler = \_ _ _ -> return () , requestHandler = \_ _ _ _ -> return () , logger = \_ -> return ()- , exceptionHandlers = [E.Handler $ \(E.SomeException e) -> hPrint stderr e]+ , exceptionHandlers = [E.Handler $ \(E.SomeException e) -> hPrint stderr e] , formatter = show , waitRequestHandler = False } --- | Backend IO functions.--- Any receiving / sending actions are performed by calling these functions.-data Backend = Backend {- backendSend :: B.ByteString -> IO () -- ^ Sending- , backendRecv :: IO B.ByteString -- ^ Receiving- , backendClose :: IO () -- ^ Closing- }- -- TODO: Returns any exception -- | Calling RPC. call :: Client -> MethodName -> [MsgPack.Object] -> IO Result@@ -173,10 +142,6 @@ params where ss = clientSessionState client -initSessionState :: IO SessionState-initSessionState =- SessionState <$> IORef.newIORef 0 <*> IORef.newIORef HM.empty- -- | Executing the action in the 3rd argument with a 'Client'. withClient :: Config -> Backend -> (Client -> IO a) -> IO a withClient config backend action = do@@ -187,8 +152,7 @@ tid <- forkFinally (receiverThread client config) $ \_ -> MVar.putMVar wait () IORef.writeIORef tidref $ Just tid- takeAction client wait- `E.finally` (backendClose backend >> killThread tid)+ takeAction client wait `E.finally` (backendClose backend >> killThread tid) where takeAction client wait = do returned <- action client
+ src/Network/MessagePack/RPC/Client/Internal.hs view
@@ -0,0 +1,49 @@+module Network.MessagePack.RPC.Client.Internal where++import Control.Concurrent (ThreadId)+import Control.Concurrent.MVar (MVar)+import qualified Data.ByteString as B+import Data.HashMap.Strict (HashMap)+import qualified Data.HashMap.Strict as HM+import Data.IORef (IORef)+import qualified Data.IORef as IORef+import qualified Data.MessagePack as MsgPack++import Data.MessagePack.RPC++-- | A client data type for MessagePack RPC.+data Client = Client {+ clientSessionState :: !SessionState+ , clientBackend :: !Backend+ , clientLog :: Logger+ , clientFormat :: Formatter+ , clientHandlerTid :: IORef (Maybe ThreadId)+ }++data SessionState = SessionState {+ lastMessageId :: IORef MessageId+ , dispatchTable :: IORef (HashMap MessageId (MVar Result))+ }++-- | Backend IO functions.+-- Any receiving / sending actions are performed by calling these functions.+data Backend = Backend {+ backendSend :: B.ByteString -> IO () -- ^ Sending+ , backendRecv :: IO B.ByteString -- ^ Receiving+ , backendClose :: IO () -- ^ Closing+ }++-- | Logger type. Should print out the message passed as a first argument somewhere.+type Logger = String -> IO ()++-- | Convert 'Message' into a @String@ to print out by 'Logger'+type Formatter = Message -> String++-- | Result type of a RPC call.+-- Described as "error" and "result" of "Response Message"+-- in [the spec of MessagePack RPC](https://github.com/msgpack-rpc/msgpack-rpc/blob/master/spec.md#response-message).+type Result = Either MsgPack.Object MsgPack.Object++initSessionState :: IO SessionState+initSessionState =+ SessionState <$> IORef.newIORef 0 <*> IORef.newIORef HM.empty