sig
  module type Arg = Typed_tcp_intf.Arg
  module type Binable_t = Typed_tcp_intf.Binable_t
  module type S = Typed_tcp_intf.S
  module Make :
    functor (Arg : Arg->
      sig
        module Client_message :
          sig
            type t = Arg.Client_message.t
            val t_of_sexp : Sexplib.Sexp.t -> t
            val sexp_of_t : t -> Sexplib.Sexp.t
          end
        module Server_message :
          sig
            type t = Arg.Server_message.t
            val t_of_sexp : Sexplib.Sexp.t -> t
            val sexp_of_t : t -> Sexplib.Sexp.t
          end
        module Client_id : Core.Std.Unique_id
        module Server_read_result :
          sig
            type t =
                Connect of Client_id.t
              | Disconnect of Client_id.t * Core.Std.Sexp.t
              | Denied_access of string
              | Data of Client_id.t * Client_message.t
            val t_of_sexp : Sexplib.Sexp.t -> t
            val sexp_of_t : t -> Sexplib.Sexp.t
          end
        type t
        val create :
          ?max_pending_connections:int ->
          ?verbose:bool ->
          ?log_disconnects:bool ->
          ?buffer_age_limit:[ `At_most of Core.Std.Time.Span.t | `Unlimited ] ->
          port:int ->
          auth:(Import.Unix.Inet_addr.t ->
                int -> [ `Allow | `Deny of string option ] Import.Deferred.t) ->
          unit -> t Import.Deferred.t
        val listen : t -> Server_read_result.t Import.Pipe.Reader.t
        val listen_ignore_errors :
          t -> (Client_id.t * Client_message.t) Import.Pipe.Reader.t
        val close : t -> Client_id.t -> unit
        val flushed_time :
          t ->
          Client_id.t ->
          [ `Client_not_found | `Flushed of Core.Std.Time.t Import.Deferred.t ]
        val has_client_id : t -> Client_id.t -> bool
        val send :
          t ->
          Client_id.t ->
          Server_message.t ->
          [ `Drop of exn | `Sent of Core.Std.Time.t ] Import.Deferred.t
        val send_ignore_errors : t -> Client_id.t -> Server_message.t -> unit
        val send_to_all : t -> Server_message.t -> unit
        val client_addr_port :
          t -> Client_id.t -> (Import.Unix.Inet_addr.t * int) option
      end
  module Simple :
    functor (Client_message : Binable_t->
      functor (Server_message : Binable_t->
        sig
          module Client_message : sig type t = Client_message.t end
          module Server_message : sig type t = Server_message.t end
          module Client_id : Core.Std.Unique_id
          module Server_read_result :
            sig
              type t =
                  Connect of Client_id.t
                | Disconnect of Client_id.t * Core.Std.Sexp.t
                | Denied_access of string
                | Data of Client_id.t * Client_message.t
              val t_of_sexp : Sexplib.Sexp.t -> t
              val sexp_of_t : t -> Sexplib.Sexp.t
            end
          type t
          val create :
            ?max_pending_connections:int ->
            ?verbose:bool ->
            ?log_disconnects:bool ->
            ?buffer_age_limit:[ `At_most of Core.Std.Time.Span.t | `Unlimited ] ->
            port:int ->
            auth:(Import.Unix.Inet_addr.t ->
                  int ->
                  [ `Allow | `Deny of string option ] Import.Deferred.t) ->
            unit -> t Import.Deferred.t
          val listen : t -> Server_read_result.t Import.Pipe.Reader.t
          val listen_ignore_errors :
            t -> (Client_id.t * Client_message.t) Import.Pipe.Reader.t
          val close : t -> Client_id.t -> unit
          val flushed_time :
            t ->
            Client_id.t ->
            [ `Client_not_found
            | `Flushed of Core.Std.Time.t Import.Deferred.t ]
          val has_client_id : t -> Client_id.t -> bool
          val send :
            t ->
            Client_id.t ->
            Server_message.t ->
            [ `Drop of exn | `Sent of Core.Std.Time.t ] Import.Deferred.t
          val send_ignore_errors :
            t -> Client_id.t -> Server_message.t -> unit
          val send_to_all : t -> Server_message.t -> unit
          val client_addr_port :
            t -> Client_id.t -> (Import.Unix.Inet_addr.t * int) option
        end
end