async _eval (page, task) {
    return await Promise.race([
      page.evaluate(async (source, unsafe) => {
        const resolveImage = async function (svg) {
          for (const img of await svg.querySelectorAll('image')) {
            if (img.attributes['xlink:href'].value.startsWith('data:')) {
              continue
            }
            const imgBase64 = await fetch(img.attributes['xlink:href'].value).then(async (value) => {
              const mimeType = value.headers.get('content-type')
              const b64img = btoa(String.fromCharCode(...new Uint8Array(await value.arrayBuffer())))
              return `data:${mimeType};base64,${b64img}`
            })
            img.setAttribute('xlink:href', imgBase64)
            img.removeAttribute('pointer-events')
          }
          return svg
        }
        const s = new XMLSerializer()
        let svgRoot = render({ // eslint-disable-line no-undef
          xml: source,
          format: 'svg'
        }).getSvg()
        svgRoot = unsafe ? await resolveImage(svgRoot) : svgRoot
        return s.serializeToString(svgRoot)
      }, task.source, task.isUnsafe).catch((err) => {
        throw new SyntaxError(err)
      }),
      new Promise((resolve, reject) => setTimeout(() => reject(new TimeoutError(this.convertTimeout)), this.convertTimeout))
    ])
  }
@param {Page} page
@param {Task} task
@returns {Promise<string>}
@private