----------------------------------------------------------------------------- -- | -- Module : Control.Distributed.RPC -- Copyright : (c) 2020-2021 EMQ Technologies Co., Ltd. -- License : BSD-style (see the LICENSE file) -- -- Maintainer : Feng Lee, feng@emqx.io -- Yang M, yangm@emqx.io -- Stability : experimental -- Portability : portable -- -- The Distributed RPC module. -- ----------------------------------------------------------------------------- module Control.Distributed.RPC ( RequestId , call , callTimeout , cast , multiCall , multiCallTimeout , multiCast , receiveResponse , receiveResponseTimeout , sendRequest , waitResponse , waitResponseTimeout ) where import Control.Distributed.Node (Node) import Control.Monad (IO) import Data.Maybe (Maybe) import Data.Ref (Reference) import Data.Timeout (Timeout) import Data.Unit (Unit) import Foreign (ffiIO1, ffiIO2, ffiIO3) type RequestId = Reference call :: forall res. Node -> IO () -> IO res call = ffiIO2 :erpc :call callTimeout :: forall res. Node -> IO () -> Integer -> IO res callTimeout = ffiIO3 :erpc :call multiCall :: forall res. [Node] -> IO () -> IO res multiCall = ffiIO2 :erpc :multicall multiCallTimeout :: forall res. [Node] -> IO () -> Integer -> IO res multiCallTimeout = ffiIO3 :erpc :multicall cast :: Node -> IO () -> IO () cast = ffiIO2 :erpc :cast multiCast :: [Node] -> IO () -> IO () multiCast = ffiIO2 :erpc :multicast receiveResponse :: forall res. RequestId -> IO res receiveResponse = ffiIO1 :erpc :receive_response receiveResponseTimeout :: forall res. RequestId -> Integer -> IO res receiveResponseTimeout = ffiIO2 :erpc :receive_response sendRequest :: Node -> IO () -> IO RequestId sendRequest = ffiIO2 :erpc :send_request foreign import waitResponse :: forall res. RequestId -> IO (Maybe res) foreign import waitResponseTimeout :: forall res. RequestId -> Timeout -> IO (Maybe res)