constructor(browser, options) {
    super();
    this._browser = browser;
    this._options = extend({
      maxDepth: 1,
      maxConcurrency: 10,
      maxRequest: 0,
      priority: 0,
      delay: 0,
      retryCount: 3,
      retryDelay: 10000,
      timeout: 30000,
      jQuery: true,
      browserCache: true,
      persistCache: false,
      skipDuplicates: true,
      depthPriority: true,
      obeyRobotsTxt: true,
      followSitemapXml: false,
      skipRequestedRedirect: false,
      cookies: null,
      screenshot: null,
      viewport: null,
    }, options);
    this._cache = options.cache || new SessionCache();
    this._queue = new PriorityQueue({
      maxConcurrency: this._options.maxConcurrency,
      cache: this._cache,
    });
    this._exporter = options.exporter || null;
    this._requestedCount = 0;
    this._preRequest = options.preRequest || null;
    this._onSuccess = options.onSuccess || null;
    this._onError = options.onError || null;
    this._customCrawl = options.customCrawl || null;
    this._exportHeader();
    this._queue.on('pull', (_options, depth, previousUrl) => this._startRequest(_options, depth, previousUrl));
    this._browser.on('disconnected', () => void this.emit(HCCrawler.Events.Disconnected));
  }
@param {!Puppeteer.Browser} browser
@param {!Object} options