sig
  type address = NetTcp.Address.t
  type 'a result = NoReply | Reply of '| Error of string
  module Result :
    sig
      type 'a t = 'RPCClient.result
      val return : '-> 'RPCClient.Result.t
      val fail : string -> 'RPCClient.Result.t
      val none : 'RPCClient.Result.t
      val ( >>= ) :
        'RPCClient.Result.t ->
        ('-> 'RPCClient.Result.t) -> 'RPCClient.Result.t
    end
  type t
  val connection : RPCClient.t -> NetTcp.Connection.t
  val address : RPCClient.t -> RPCClient.address
  val is_alive : RPCClient.t -> bool
  val close : RPCClient.t -> unit
  val call :
    ?timeout:float ->
    RPCClient.t -> string -> Bencode.t -> Bencode.t RPCClient.result Lwt.t
  val call_ignore : RPCClient.t -> string -> Bencode.t -> unit
  module Typed :
    sig
      type ('a, 'b) method_
      val create :
        name:string ->
        encode:('-> Bencode.t) ->
        decode:(Bencode.t -> 'b) -> ('a, 'b) RPCClient.Typed.method_
      val call :
        ?timeout:float ->
        RPCClient.t ->
        ('a, 'b) RPCClient.Typed.method_ -> '-> 'RPCClient.result Lwt.t
      val call_ignore :
        RPCClient.t -> ('a, 'b) RPCClient.Typed.method_ -> '-> unit
    end
  val of_conn : ?period:float -> NetTcp.Connection.t -> RPCClient.t
  val connect :
    ?period:float -> RPCClient.address -> RPCClient.t option Lwt.t
  val by_host : ?period:float -> string -> int -> RPCClient.t option Lwt.t
  val local : ?period:float -> int -> RPCClient.t option Lwt.t
  val by_name : ?period:float -> string -> int -> RPCClient.t option Lwt.t
  val fmt : Format.formatter -> RPCClient.t -> unit
end