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