| Copyright | (c) Serokell, 2016 |
|---|---|
| License | GPL-3 (see the file LICENSE) |
| Maintainer | Serokell <hi@serokell.io> |
| Stability | experimental |
| Portability | POSIX, GHC |
| Safe Haskell | None |
| Language | Haskell2010 |
Control.TimeWarp.Rpc
Description
This module provides RPC capabilities. It allows to write scenarios over distributed systems, which can then be launched as either real program or emulation with network nastiness manually controlled.
Usage example:
sumMethod :: Monad m => Int -> Int -> ServerT m Int
sumMethod a b = return $ a + b
callSum :: Int -> Int -> Client Int
callSum = call "sum"
exampleLaunch :: (MonadRpc m, MonadTimed m, MonadIO m) => m ()
exampleLaunch = do
-- launch server
work (for 1 minute) $ do
idr <- serverTypeRestriction2
serve 1234 [method "sum" $ idr sumMethod]
-- make 3 requests with delay
fork_ $
forM_ [1..3] $
\i -> do
wait (for 3 sec)
res <- execClient ("127.0.0.1", 1234) $ callSum (-1) i
liftIO $ timestamp $ "Answer is " ++ show res
This scenario then can be launched as real program:
>>>runTimedIO . runMsgPackRpc $ exampleLaunch[3000012µs] Answer is 0 [6000013µs] Answer is 1 [9000015µs] Answer is 2
Or as emulation, which works immediately:
>>>runTimedT . runPureRpc (mkStdGen 23423) (10 :: Microsecond, 50 :: Microsecond) $ exampleLaunch[3000023µs] Answer is 0 [6000072µs] Answer is 1 [90000102µs] Answer is 2
Documentation
module Control.TimeWarp.Rpc.PureRpc