async createTunnel(browser) {
    ow(browser, ow.object.hasKeys('wsEndpoint'))

    const wsEndpoint = browser.wsEndpoint()
    if (!this._browserSessions[wsEndpoint]) {
      this._browserSessions[wsEndpoint] = await new Tunnel(
        wsEndpoint,
        this.opts
      ).create()
    }

    this._printGeneratedPasswordWhenNotOverridden(
      this._browserSessions[wsEndpoint].url
    )
    this.debug('createTunnel', {
      wsEndpoint,
      sessions: Object.keys(this._browserSessions)
    })
    return this._browserSessions[wsEndpoint]
  }
Create a new public tunnel.

Supports multiple browser instances (will create a new tunnel for each).

@param  {Puppeteer.Browser} browser - The browser to create the tunnel for (there can be multiple)
@return {Tunnel} The {@link Tunnel} instance

@example
const puppeteer = require('puppeteer-extra')
const devtools = require('puppeteer-extra-plugin-devtools')()
devtools.setAuthCredentials('bob', 'swordfish')
puppeteer.use(devtools)

;(async () => {
  const browserFleet = await Promise.all(
    [...Array(3)].map(slot => puppeteer.launch())
  )
  for (const [index, browser] of browserFleet.entries()) {
    const {url} = await devtools.createTunnel(browser)
    console.info(`Browser ${index}'s devtools frontend can be found at: ${url}`)
  }
})()
// =>
// Browser 0's devtools frontend can be found at: https://devtools-tunnel-fzenb4zuav.localtunnel.me
// Browser 1's devtools frontend can be found at: https://devtools-tunnel-qe2t5rghme.localtunnel.me
// Browser 2's devtools frontend can be found at: https://devtools-tunnel-pp83sdi4jo.localtunnel.me