module Rpc: Rpc
The approach here is to have a separate representation of the server-side
implementation of an RPC (An Implementation.t
) and the interface that it exports
(either an Rpc.t
, a State_rpc.t
or a Pipe_rpc.t
, but we'll refer to them
generically as RPC interfaces). A server builds the Implementation.t
out of an RPC
interface and a function for implementing the RPC, while the client dispatches a
request using the same RPC interface.
The Implementation.t
hides the type of the query and the response, whereas the
Rpc.t
is polymorphic in the query and response type. This allows you to build a
Server.t
out of a list of Implementation.t
s.
Each RPC also comes with a version number. This is meant to allow support of multiple
different versions of what is essentially the same RPC. You can think of it as an
extension to the name of the RPC, and in fact, each RPC is uniquely identified by its
(name, version) pair. RPCs with the same name but different versions should implement
similar functionality.
module Implementation:sig
..end
module Server:sig
..end
module type Connection =Connection
with module Server := Server
module Connection:Connection
module Rpc:sig
..end
module Pipe_rpc:sig
..end
module State_rpc:sig
..end