sig
  type data = string
  exception Auth_failure of string
  type capability = [ `Unix_fd ]
  val capabilities : OBus_auth.capability list
  type stream
  val make_stream :
    recv:(unit -> string Lwt.t) ->
    send:(string -> unit Lwt.t) -> OBus_auth.stream
  val stream_of_channels :
    Lwt_io.input_channel * Lwt_io.output_channel -> OBus_auth.stream
  val stream_of_fd : Lwt_unix.file_descr -> OBus_auth.stream
  val max_line_length : int
  module Client :
    sig
      type mechanism_return =
          Mech_continue of OBus_auth.data
        | Mech_ok of OBus_auth.data
        | Mech_error of string
      class virtual mechanism_handler :
        object
          method abort : unit
          method data :
            OBus_auth.data -> OBus_auth.Client.mechanism_return Lwt.t
          method virtual init : OBus_auth.Client.mechanism_return Lwt.t
        end
      type mechanism = {
        mech_name : string;
        mech_exec : unit -> OBus_auth.Client.mechanism_handler;
      }
      val mech_name : OBus_auth.Client.mechanism -> string
      val mech_exec :
        OBus_auth.Client.mechanism ->
        unit -> OBus_auth.Client.mechanism_handler
      val mech_external : OBus_auth.Client.mechanism
      val mech_anonymous : OBus_auth.Client.mechanism
      val mech_dbus_cookie_sha1 : OBus_auth.Client.mechanism
      val default_mechanisms : OBus_auth.Client.mechanism list
      val authenticate :
        ?capabilities:OBus_auth.capability list ->
        ?mechanisms:OBus_auth.Client.mechanism list ->
        stream:OBus_auth.stream ->
        unit -> (OBus_address.guid * OBus_auth.capability list) Lwt.t
    end
  module Server :
    sig
      type mechanism_return =
          Mech_continue of OBus_auth.data
        | Mech_ok of int option
        | Mech_reject
      class virtual mechanism_handler :
        object
          method abort : unit
          method virtual data :
            OBus_auth.data -> OBus_auth.Server.mechanism_return Lwt.t
          method init : OBus_auth.data option Lwt.t
        end
      type mechanism = {
        mech_name : string;
        mech_exec : int option -> OBus_auth.Server.mechanism_handler;
      }
      val mech_name : OBus_auth.Server.mechanism -> string
      val mech_exec :
        OBus_auth.Server.mechanism ->
        int option -> OBus_auth.Server.mechanism_handler
      val mech_anonymous : OBus_auth.Server.mechanism
      val mech_external : OBus_auth.Server.mechanism
      val mech_dbus_cookie_sha1 : OBus_auth.Server.mechanism
      val default_mechanisms : OBus_auth.Server.mechanism list
      val authenticate :
        ?capabilities:OBus_auth.capability list ->
        ?mechanisms:OBus_auth.Server.mechanism list ->
        ?user_id:int ->
        guid:OBus_address.guid ->
        stream:OBus_auth.stream ->
        unit -> (int option * OBus_auth.capability list) Lwt.t
    end
end