Skip to content

npm:puppeteer-core does not work with Node compat #18913

@lucacasonato

Description

@lucacasonato
import { join } from "https://deno.land/std@0.185.0/path/mod.ts";
import { DenoDir } from "https://deno.land/x/deno_cache@0.4.1/deno_dir.ts";
import puppeteer, { BrowserFetcher } from "npm:puppeteer-core@19.11.1";
import { PUPPETEER_REVISIONS } from "npm:puppeteer-core@19.11.1/internal/revisions.js";

// Make sure Chromium is downloaded for use with Puppeteer
const denoDir = new DenoDir(undefined, true);
const fetcher = new BrowserFetcher({ path: join(denoDir.root, "puppeteer") });
const revisions = fetcher.localRevisions();
const revision = PUPPETEER_REVISIONS["chromium"];
let executablePath: string;
if (!revisions.includes(revision)) {
  console.log(`Downloading Chromium ${revision}...`);
  const r = await fetcher.download(revision);
  if (!r) throw new Error("Failed to download Chromium");
  executablePath = r.executablePath;
} else {
  executablePath = fetcher.revisionInfo(revision).executablePath;
}

// Start puppeteer
const browser = await puppeteer.launch({ headless: "new", executablePath });
const page = await browser.newPage();
await page.goto("https://example.com");
await page.screenshot({ path: "example.png" });
await browser.close();

This is the output:

$ deno run -A puppteer.ts 
Downloading Chromium 1108766...
error: Uncaught (in promise) ErrorEvent {
  [Symbol(kTarget)]: WebSocket {
    _events: {
      open: [Function: onOpen] {
        [Symbol(kIsForOnEventAttribute)]: false,
        [Symbol(kListener)]: [Function (anonymous)]
      },
      error: [Function: onError] {
        [Symbol(kIsForOnEventAttribute)]: false,
        [Symbol(kListener)]: [Function (anonymous)]
      }
    },
    _eventsCount: 2,
    _maxListeners: undefined,
    _binaryType: "nodebuffer",
    _closeCode: 1006,
    _closeFrameReceived: false,
    _closeFrameSent: false,
    _closeMessage: Buffer(0) [],
    _closeTimer: null,
    _extensions: {},
    _paused: false,
    _protocol: "",
    _readyState: 3,
    _receiver: null,
    _sender: null,
    _socket: null,
    _bufferedAmount: 0,
    _isServer: false,
    _redirects: 0,
    _url: "ws://127.0.0.1:35795/devtools/browser/05527a42-706d-40c8-8c68-5b45551254de",
    _originalIpc: false,
    _originalSecure: false,
    _originalHostOrSocketPath: "127.0.0.1:35795",
    _req: null,
    [Symbol(kCapture)]: false
  },
  [Symbol(kType)]: "error",
  [Symbol(kError)]: Error: Unexpected server response: 101
    at ClientRequest.<anonymous> (file:///home/lucacasonato/.cache/deno/npm/registry.npmjs.org/ws/8.13.0/lib/websocket.js:888:7)
    at ClientRequest.emit (ext:deno_node/_events.mjs:379:28)
    at ClientRequest._final (ext:deno_node/http.ts:175:14)
    at eventLoopTick (ext:core/01_core.js:166:11),
  [Symbol(kMessage)]: "Unexpected server response: 101"
}

No error should be thrown. It seems likely that this is related to outbound WebSockets in node compat. Do we even support those?

deno 1.33.1 (release, x86_64-unknown-linux-gnu)

Metadata

Metadata

Assignees

Labels

bugSomething isn't working correctlynode compat

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions