declare namespace IAppletsRequestWx {
  interface GeneralCallbackResult {
    errMsg: string;
  }

  type RequestCompleteCallback = (res: GeneralCallbackResult) => void;

  /** 接口调用失败的回调函数 */
  type RequestFailCallback = (res: GeneralCallbackResult) => void;

  /** 接口调用成功的回调函数 */
  type RequestSuccessCallback = (result: any) => void;

  interface RequestOption {
    /** 开发者服务器接口地址 */
    url: string;
    /** 接口调用结束的回调函数（调用成功、失败都会执行） */
    complete?: RequestCompleteCallback;
    /** 请求的参数 */
    data?: string | IAppletsRequest.IAnyObject | ArrayBuffer;
    /** 返回的数据格式
     *
     * 可选值：
     * - 'json': 返回的数据为 JSON，返回后会对返回的数据进行一次 JSON.parse;
     * - '其他': 不对返回的内容进行 JSON.parse; */
    dataType?: "json" | "其他";
    /** 开启 cache
     *
     * 最低基础库： `2.10.4` */
    enableCache?: boolean;
    /** 开启 http2
     *
     * 最低基础库： `2.10.4` */
    enableHttp2?: boolean;
    /** 开启 quic
     *
     * 最低基础库： `2.10.4` */
    enableQuic?: boolean;
    /** 接口调用失败的回调函数 */
    fail?: RequestFailCallback;
    /** 设置请求的 header，header 中不能设置 Referer。
     *
     * `content-type` 默认为 `application/json` */
    header?: IAppletsRequest.IAnyObject;
    /** HTTP 请求方法
     *
     * 可选值：
     * - 'OPTIONS': HTTP 请求 OPTIONS;
     * - 'GET': HTTP 请求 GET;
     * - 'HEAD': HTTP 请求 HEAD;
     * - 'POST': HTTP 请求 POST;
     * - 'PUT': HTTP 请求 PUT;
     * - 'DELETE': HTTP 请求 DELETE;
     * - 'TRACE': HTTP 请求 TRACE;
     * - 'CONNECT': HTTP 请求 CONNECT; */
    method?:
      | "OPTIONS"
      | "GET"
      | "HEAD"
      | "POST"
      | "PUT"
      | "DELETE"
      | "TRACE"
      | "CONNECT";
    /** 响应的数据类型
     *
     * 可选值：
     * - 'text': 响应的数据为文本;
     * - 'arraybuffer': 响应的数据为 ArrayBuffer;
     *
     * 最低基础库： `1.7.0` */
    responseType?: "text" | "arraybuffer";
    /** 接口调用成功的回调函数 */
    success?: RequestSuccessCallback;
    /** 超时时间，单位为毫秒
     *
     * 最低基础库： `2.10.0` */
    timeout?: number;
  }

  interface RequestSuccessCallbackResult {
    /** 开发者服务器返回的 cookies，格式为字符串数组
     *
     * 最低基础库： `2.10.0` */
    cookies: string[];
    /** 开发者服务器返回的数据 */
    data: string | IAppletsRequest.IAnyObject | ArrayBuffer;
    /** 开发者服务器返回的 HTTP Response Header
     *
     * 最低基础库： `1.2.0` */
    header: IAppletsRequest.IAnyObject;
    /** 网络请求过程中一些调试信息
     *
     * 最低基础库： `2.10.4` */
    profile: RequestProfile;
    /** 开发者服务器返回的 HTTP 状态码 */
    statusCode: number;
    errMsg: string;
  }

  /** 网络请求过程中一些调试信息
   *
   * 最低基础库： `2.10.4` */
  interface RequestProfile {
    /** SSL建立完成的时间,如果不是安全连接,则值为 0 */
    SSLconnectionEnd: number;
    /** SSL建立连接的时间,如果不是安全连接,则值为 0 */
    SSLconnectionStart: number;
    /** HTTP（TCP） 完成建立连接的时间（完成握手），如果是持久连接，则与 fetchStart 值相等。注意如果在传输层发生了错误且重新建立连接，则这里显示的是新建立的连接完成的时间。注意这里握手结束，包括安全连接建立完成、SOCKS 授权通过 */
    connectEnd: number;
    /** HTTP（TCP） 开始建立连接的时间，如果是持久连接，则与 fetchStart 值相等。注意如果在传输层发生了错误且重新建立连接，则这里显示的是新建立的连接开始的时间 */
    connectStart: number;
    /** DNS 域名查询完成的时间，如果使用了本地缓存（即无 DNS 查询）或持久连接，则与 fetchStart 值相等 */
    domainLookupEnd: number;
    /** DNS 域名查询开始的时间，如果使用了本地缓存（即无 DNS 查询）或持久连接，则与 fetchStart 值相等 */
    domainLookupStart: number;
    /** 评估当前网络下载的kbps */
    downstreamThroughputKbpsEstimate: number;
    /** 评估的网络状态 slow 2g/2g/3g/4g */
    estimate_nettype: string;
    /** 组件准备好使用 HTTP 请求抓取资源的时间，这发生在检查本地缓存之前 */
    fetchStart: number;
    /** 协议层根据多个请求评估当前网络的 rtt（仅供参考） */
    httpRttEstimate: number;
    /** 当前请求的IP */
    peerIP: string;
    /** 当前请求的端口 */
    port: number;
    /** 收到字节数 */
    receivedBytedCount: number;
    /** 最后一个 HTTP 重定向完成时的时间。有跳转且是同域名内部的重定向才算，否则值为 0 */
    redirectEnd: number;
    /** 第一个 HTTP 重定向发生时的时间。有跳转且是同域名内的重定向才算，否则值为 0 */
    redirectStart: number;
    /** HTTP请求读取真实文档结束的时间 */
    requestEnd: number;
    /** HTTP请求读取真实文档开始的时间（完成建立连接），包括从本地读取缓存。连接错误重连时，这里显示的也是新建立连接的时间 */
    requestStart: number;
    /** HTTP 响应全部接收完成的时间（获取到最后一个字节），包括从本地读取缓存 */
    responseEnd: number;
    /** HTTP 开始接收响应的时间（获取到第一个字节），包括从本地读取缓存 */
    responseStart: number;
    /** 当次请求连接过程中实时 rtt */
    rtt: number;
    /** 发送的字节数 */
    sendBytesCount: number;
    /** 是否复用连接 */
    socketReused: boolean;
    /** 当前网络的实际下载kbps */
    throughputKbps: number;
    /** 传输层根据多个请求评估的当前网络的 rtt（仅供参考） */
    transportRttEstimate: number;
  }

  interface OnHeadersReceivedCallbackResult {
    /** 开发者服务器返回的 HTTP Response Header */
    header: IAppletsRequest.IAnyObject;
  }

  type OffHeadersReceivedCallback = (
    result: OnHeadersReceivedCallbackResult,
  ) => void;

  type OnHeadersReceivedCallback = (
    result: OnHeadersReceivedCallbackResult,
  ) => void;

  interface RequestTask {
    /** [RequestTask.abort()](https://developers.weixin.qq.com/miniprogram/dev/api/network/request/RequestTask.abort.html)
     *
     * 中断请求任务
     *
     * 最低基础库： `1.4.0` */
    abort(): void;
    /** [RequestTask.offHeadersReceived(function callback)](https://developers.weixin.qq.com/miniprogram/dev/api/network/request/RequestTask.offHeadersReceived.html)
     *
     * 取消监听 HTTP Response Header 事件
     *
     * 最低基础库： `2.1.0` */
    offHeadersReceived(
      /** HTTP Response Header 事件的回调函数 */
      callback?: OffHeadersReceivedCallback,
    ): void;
    /** [RequestTask.onHeadersReceived(function callback)](https://developers.weixin.qq.com/miniprogram/dev/api/network/request/RequestTask.onHeadersReceived.html)
     *
     * 监听 HTTP Response Header 事件。会比请求完成事件更早
     *
     * 最低基础库： `2.1.0` */
    onHeadersReceived(
      /** HTTP Response Header 事件的回调函数 */
      callback: OnHeadersReceivedCallback,
    ): void;
  }
}
