packages feed

json-rpc 0.6.0.0 → 0.6.1.0

raw patch · 3 files changed

+68/−17 lines, 3 filesPVP ok

version bump matches the API change (PVP)

API changes (from Hackage documentation)

+ Network.JsonRpc: sendMessage :: MonadLoggerIO m => Message -> JsonRpcT m ()

Files

Network/JsonRpc/Interface.hs view
@@ -27,6 +27,7 @@ , Session(..) , initSession , processIncoming+, sendMessage ) where  import Control.Applicative@@ -254,6 +255,9 @@     o <- reader outCh     liftIO . atomically . writeTBMChan o $ MsgResponse r +sendMessage :: MonadLoggerIO m => Message -> JsonRpcT m ()+sendMessage msg = reader outCh >>= liftIO . atomically . (`writeTBMChan` msg)+ -- | Create JSON-RPC session around conduits from transport -- layer. When context exits session disappears. runJsonRpcT :: (MonadLoggerIO m, MonadBaseControl IO m)@@ -269,9 +273,12 @@     let inSnk  = sinkTBMChan (inCh qs) True         outSrc = sourceTBMChan (outCh qs)     withAsync (src $$ inSnk) $ const $-        withAsync (outSrc $$ snk) $ const $-            withAsync (runReaderT processIncoming qs) $ const $-                runReaderT f qs+        withAsync (outSrc $$ snk) $ \o ->+            withAsync (runReaderT processIncoming qs) $ const $ do+                a <- runReaderT f qs+                liftIO . atomically . closeTBMChan $ outCh qs+                _ <- liftIO $ wait o+                return a   cr :: Monad m => Conduit ByteString m ByteString
json-rpc.cabal view
@@ -1,5 +1,5 @@ name:                   json-rpc-version:                0.6.0.0+version:                0.6.1.0 synopsis:               Fully-featured JSON-RPC 2.0 library description:   This JSON-RPC library is fully-compatible with JSON-RPC 2.0 and 1.0. It@@ -24,7 +24,7 @@ source-repository this   type:                 git   location:             https://github.com/xenog/json-rpc.git-  tag:                  0.6.0.0+  tag:                  0.6.1.0  library   exposed-modules:      Network.JsonRpc,
test/Network/JsonRpc/Tests.hs view
@@ -40,6 +40,7 @@     , testGroup "Network"         [ testProperty "Test server" serverTest         , testProperty "Test client" clientTest+        , testProperty "Test notifications" notifTest         ]     ] @@ -89,15 +90,19 @@ resFields :: Response -> Bool resFields rs = testFields (checkFieldsRes rs) rs +createChans :: MonadIO m+            => m ((TBMChan a, TBMChan b), (Sink a m (), Source m b))+createChans = do+    (bso, bsi) <- liftIO . atomically $ (,) <$> newTBMChan 16 <*> newTBMChan 16+    let (snk, src) = (sinkTBMChan bso False, sourceTBMChan bsi)+    return ((bso, bsi), (snk, src))+ serverTest :: ([Request], Ver) -> Property serverTest (reqs, ver) = monadicIO $ do     rt <- run $ runNoLoggingT $ do-        (bso, bsi) <- liftIO . atomically $-            (,) <$> newTBMChan 16 <*> newTBMChan 16-        let snk = sinkTBMChan bso False-            src = sourceTBMChan bsi-        withAsync (server snk src) $ const $ withAsync (sender bsi) $ const $-            receiver bso []+        ((bso, bsi), (snk, src)) <- createChans+        withAsync (server snk src) $ const $+            withAsync (sender bsi) $ const $ receiver bso []     assert $ length rt == length nonotif     assert $ null rt || all isJust rt     assert $ params == reverse (results rt)@@ -118,16 +123,13 @@     params = map getReqParams nonotif     results = map $ getResult . fromJust     nonotif = flip filter reqs $ \q -> case q of Request{} -> True-                                                 Notif{} -> False+                                                 Notif{}   -> False  clientTest :: ([Value], Ver) -> Property clientTest (qs, ver) = monadicIO $ do     rt <- run $ runNoLoggingT $ do-        (bso, bsi) <- liftIO . atomically $-            (,) <$> newTBMChan 16 <*> newTBMChan 16-        let snk = sinkTBMChan bso False-            src = sourceTBMChan bsi-            csnk = sinkTBMChan bsi False+        ((bso, bsi), (snk, src)) <- createChans+        let csnk = sinkTBMChan bsi False             csrc = sourceTBMChan bso         withAsync (server snk src) $ const $ cli             (CL.map Right =$ csnk)@@ -143,6 +145,47 @@     correct (Just (Right _)) = True     correct _ = False +notifTest :: ([Request], Ver) -> Property+notifTest (qs, ver) = monadicIO $ do+    nt <- run $ runNoLoggingT $ do+        ((bso, bsi), (snk, src)) <- createChans+        let csnk = sinkTBMChan bsi False+            csrc = sourceTBMChan bso+        (sig, notifs) <- liftIO . atomically $+            (,) <$> newEmptyTMVar <*> newTVar []+        withAsync (server snk src sig notifs) $ const $ cli sig+            (CL.map Right =$ csnk)+            (csrc $= CL.map Right)+        liftIO . atomically $ readTVar notifs+    assert $ length nt == length ntfs+    assert $ reverse nt == ntfs+  where+    respond q = return $ Right (q :: Value)+    server snk src sig notifs =+        runJsonRpcT ver False snk src $ process sig notifs+    process sig notifs = do+        qM <- receiveRequest+        case qM of+            Nothing -> return ()+            Just q -> do+                case q of+                    Notif{} -> liftIO . atomically $+                        readTVar notifs >>= writeTVar notifs . (q:)+                    Request{ getReqParams = String "disconnect" } ->+                        liftIO . atomically $ putTMVar sig ()+                    Request{} -> return ()+                rM <- buildResponse respond q+                case rM of+                    Nothing -> process sig notifs+                    Just  r -> sendResponse r >> process sig notifs+    reqs = map MsgRequest qs+    cli sig snk src = runJsonRpcT ver True snk src $ do+        forM_ reqs sendMessage+        _ <- sendRequest $ String "disconnect"+            :: JsonRpcT (NoLoggingT IO) (Maybe (Either ErrorObj Value))+        liftIO . atomically $ takeTMVar sig+    ntfs = flip filter qs $ \q -> case q of Notif{} -> True; _ -> False+ srv :: (MonadLoggerIO m, FromRequest q, ToJSON r)     => Respond q (JsonRpcT m) r -> JsonRpcT m () srv respond = do@@ -154,6 +197,7 @@             case rM of                 Nothing -> srv respond                 Just r -> sendResponse r >> srv respond+  fromRight :: Either a b -> b fromRight (Right x) = x