text: /**
   * @desc chrome-remote-interface-extra request capturer
   * @see https://github.com/N0taN3rd/chrome-remote-interface-extra
   */
  class CRIExtraRequestCapturer {
    /**
     * @param {?Page} [page] - The chrome-remote-interface-extra page object
     * @param {string} [requestEvent = 'request']
     */
    constructor (page, requestEvent = 'request') {
      /**
       * @desc To Capture Requests Or Not To Capture Requests
       * @type {boolean}
       * @private
       */
      this._capture = true
  
      /**
       * @desc A list of requests made
       * @type {Map<int,Request>}
       * @private
       */
      this._requests = new Map()
      this._requestC = 0
      /** @ignore */
      this.requestWillBeSent = this.requestWillBeSent.bind(this)
      if (page) {
        this.attach(page, requestEvent)
      }
    }
  
    /**
     * @desc Attach (start listening for request events) the request capturerer to the page object
     * @param {Page} page - The chrome-remote-interface-extra page object
     * @param {string} [requestEvent = 'request']
     */
    attach (page, requestEvent = 'request') {
      page.removeListener(requestEvent, this.requestWillBeSent)
      page.on(requestEvent, this.requestWillBeSent)
    }
  
    /**
     * @desc Detach (stop listening for request events) the request capturerer from the page object
     * @param {Page} page - The puppeteer page object
     * @param {string} [requestEvent = 'request']
     */
    detach (page, requestEvent = 'request') {
      page.removeListener(requestEvent, this.requestWillBeSent)
    }
  
    /**
     * @desc Sets an internal flag to begin capturing network requests. Clears Any Previously Captured Request Information
     */
    startCapturing () {
      this._requestC = 0
      this._requests.clear()
      this._capture = true
    }
  
    /**
     * @desc Sets an internal flag to stop the capturing network requests
     */
    stopCapturing () {
      this._capture = false
    }
  
    /**
     * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map/@@iterator
     * @desc Get An Iterator Over The Requests Captured
     * @returns {Iterator<Request>}
     */
    [Symbol.iterator]() {
      return this._requests.values()
    }
  
    /**
     * @desc Remove All Requests
     */
    clear () {
      this._requestC = 0
      this._requests.clear()
    }
  
    /**
     * @returns {Array<Request>}
     */
    requests () {
      return Array.from(this._requests.values())
    }
  
    /**
     * @return {Iterator<Request>}
     */
    iterateRequests () {
      return this._requests.values()
    }
  
    /**
     * @param {Request} r
     */
    requestWillBeSent (r) {
      if (this._capture) {
        this._requests.set(this._requestC++, r)
      }
    }
  }
  
  /**
   * @type {CRIExtraRequestCapturer}
   */
  module.exports = CRIExtraRequestCapturer
  