Does browslerless support headful mode?

ash
FREE

a year ago

I followed the docs, implemented this and still struggling:

```import puppeteer from "puppeteer-core";

const launchArgs = JSON.stringify({
args: [--window-size=1920,1080, --user-data-dir=/tmp/chrome/data-dir],
headless: false,
stealth: true,
timeout: 5000,
});

const browser = await puppeteer.connect({
browserWSEndpoint: wss://production-sfo.browserless.io/?token=GOES-HERE&launch=${launchArgs},
});```

I'm getting: Error: Unexpected server response: 500

0 Replies

ash
FREE

a year ago

d2a990ba-9a9a-40aa-9414-f3d1ae9e016f


ash
FREE

a year ago

Note: the above is an example from the docs and not my code (links not configured etc)


a year ago

railway is a headless environment, so I'd say no its not going to be supported


ash
FREE

a year ago

Oh I see, thanks


ash
FREE

a year ago

Any idea if I can load a stream from a wss in headless mode?


a year ago

I don't see why not, I also don't see how headless or not would come into play here


ash
FREE

a year ago

The stream I'm trying to load is from my own app - and can change the page I'm visiting with puppeteer


ash
FREE

a year ago

Hm I see, I can't get the wss to load for some reason


ash
FREE

a year ago

How I know the stream isn't loading

const targetWsUrl = "wss://url/rtc";
  let wsConnected = false;

  page.on("request", (request) => {
    console.log("Request:", request.url());
    const url = request.url();
    if (url.startsWith(targetWsUrl)) {
      wsConnected = true;

a year ago

hmmm, I don't really know what to tell you here


ash
FREE

a year ago

Any args for me to run that you think might help maybe?


a year ago

sorry, I don't have any real experience with puppeteer


ash
FREE

a year ago

Okie, thanks anyways :)


ash
FREE

a year ago

@Brody is there any other way you know of to run Browserless in headful mode?


a year ago

well does something error out when you tell it to run with a head?


ash
FREE

a year ago

It works fine in headful, only issue is with headless


ash
FREE

a year ago

Which it turns out WebRTC streams aren't supported in headless mode


a year ago

right but can you not run it in headfull mode?


ash
FREE

a year ago

Correct


a year ago

then there you have it


a year ago

I also noticed you are using browserless.io, instead of self hosting browserless on railway? not that it would fix anything


ash
FREE

a year ago

Oh I'm using the Railway instance - I just copied that off their docs


a year ago

ah okay cool


ash
FREE

a year ago

Out of curiosity, why doesn't Railway support headful mode?


a year ago

it's a docker environment, there are no heads, nothing specific to railway


ash
FREE

a year ago

Oh I see, so if I added something like x11 into the container it would work?


a year ago

yeah, you'd need to emulate something like that


a year ago

if you give me several hours, i may be able to implement that for you


ash
FREE

a year ago

Oh!!


ash
FREE

a year ago

I would super super appreciate that


a year ago

id just need you to provide me with a minimal reducible example that i can run so that tells me / shows me that ive started chrome in headfull mode, of course this example should also provide some indictor or error if i try to start chrome in headfull mode and browserless isnt supporting that, know what i mean?


ash
FREE

a year ago

Sure let me work on that


a year ago

i say several hours because im just about to head out, so ill work on it when im back


a year ago

but that gives you time to work on the example!


ash
FREE

a year ago

Works perfectly, thanks a bunch :)


a year ago

no problem!


ash
FREE

a year ago

"use server";

import puppeteer from "puppeteer-core";

export const captureThumbnail = async (username: string) => {
  const launchArgs = JSON.stringify({
    stealth: true,
    args: [
      `--use-fake-device-for-media-stream`,
      `--use-fake-ui-for-media-stream`,
      `--no-sandbox`,
    ],
  });

  console.log("Capturing thumbnail for:", username);
  const browser = await puppeteer.connect({
    browserWSEndpoint: `${process.env.BROWSER_WS_ENDPOINT}&launch=${launchArgs}`,
  });

  const page = (await browser.pages())[0];

  await page.setViewport({ width: 640, height: 360 });

  const targetWsUrl = "wss://";
  let wsConnected = false;

  page.on("request", (request) => {
    console.log("Request:", request.url());
    const url = request.url();
    if (url.startsWith(targetWsUrl)) {
      wsConnected = true;
      console.log("WebSocket connection established:", url);

      const screenshot = async () => {

        const screenshot =   await page.screenshot({
          type: "png",
          fullPage: true,
        });

       console.log("Screenshot succesful")


      };
      procedure();
    }
  });

  await page.goto(`${page_url}`);

  while (!wsConnected) {
    console.log("Waiting for WebSocket connection...");
    await new Promise((resolve) => setTimeout(resolve, 1000));
  }
};

a year ago

mind throwing that in a repo so I can simply run it in a service?


ash
FREE

a year ago

Sure!


a year ago

full repo that has everything I'd need to trigger that code to run and do it's thing


ash
FREE

a year ago

What's your github?


a year ago

brody192


ash
FREE

a year ago

Done, just sent over the repo to you


a year ago

it doesn't look very minimal


ash
FREE

a year ago

I guess it does crash when headful is unsupported while requesting it in the .connect


ash
FREE

a year ago

Will update


ash
FREE

a year ago

Done, just pushed the simplified version


a year ago

haha I think you are missing the point of minimal


ash
FREE

a year ago

Ok I might be 😭


ash
FREE

a year ago

What do you mean by it?


a year ago

not a full project, just like a single script that proves the issue / proves it's fixed


ash
FREE

a year ago

Oh, I thought of doing that but wasn't sure how it would be trigerred on Railway easily


ash
FREE

a year ago

so I resorted to the existing


a year ago

you'd have your package.json setup properly, right now you have a full app


ash
FREE

a year ago

Sorry about that, want me to rewrite it?


a year ago

I'd just like a minimal reproducible example, emphasis on minimal


ash
FREE

a year ago

Done, just pushed it


a year ago

okay perfect, now that's minimal


a year ago

one question, how have you been able to verify that this code works? run it with your local chrome install instead of browserless?


ash
FREE

a year ago

Yes, I wrote it with normal puppeteer initially and then modified it for browserless


ash
FREE

a year ago

Will test it out again with the minimal version


a year ago

okay perfect


ash
FREE

a year ago

Seems like there's an issue with some newer updates I made to it, let me fix and push


ash
FREE

a year ago

Okay fixed - when you run local.ts it uses normal puppeteer, when you run index.ts it uses browserless


ash
FREE

a year ago

You'll be able to see the difference it output between the two (and sorry for the hassle - I should have tested the newest version with all the new stuff I added on while debugging)


ash
FREE

a year ago

(Headless always returns a blank screen)


a year ago

okay cool, what version is going to run by default when deployed to railway?


ash
FREE

a year ago

The browserless version


a year ago

perf


a year ago

i dont have bun locally (windows without WSL) so how can i verify that this is not working?

1282505180394426400


a year ago

how fast could you add in a web server to serve that image?


ash
FREE

a year ago

I can start the stream, and if the file size increases we'll know it's working


a year ago

Uint8Array(4190) would increase?


ash
FREE

a year ago

Just a rough guess - let me get back to you on this


ash
FREE

a year ago

Yes it would


a year ago

might help to have a web server to serve that image?


ash
FREE

a year ago

Okay let me see


a year ago

i know i said minimal but id still need a way to verify my findings since i cant run this locally


ash
FREE

a year ago

Ofcourse - working on a webserver to serve the image


a year ago

web server or convert to plain old node, whatever is easier


ash
FREE

a year ago

Pushed


a year ago

sweet


ash
FREE

a year ago

http://{domain}/thumbnail/the_winzy


a year ago

this was such a good feature

1282508306556125200


ash
FREE

a year ago

Oh I didn't even know that was a feature


ash
FREE

a year ago

W feature


a year ago

yeah i mean in this scenario i trust what you are pushing but its a good security feature to have


ash
FREE

a year ago

Yeah 100%


a year ago

and you said if the image is black its not working?


ash
FREE

a year ago

Correct


ash
FREE

a year ago

If it's just all black and no text/icons


a year ago

gotcha


ash
FREE

a year ago

Uint8Array(4190) should mean it's working as far as I can tell


ash
FREE

a year ago

But that's just a terrible way to check lol


a year ago

thats funny since i didnt implement the virtual display server yet


ash
FREE

a year ago

Oh??


a year ago

are you using browserless v1 or v2


ash
FREE

a year ago

v2


a year ago

same


ash
FREE

a year ago

Ok we should probs see the result from the endpoint


a year ago

waiting for dns to update so i can see the image


ash
FREE

a year ago

Nvm, I got mixed up - I have the stream running now so it should be easier to see if it works or not


a year ago

dns still isnt updated yet lol


ash
FREE

a year ago

You'll see my screen if it's working or a black screen


ash
FREE

a year ago

Oh xD


a year ago

it is indeed black


a year ago


ash
FREE

a year ago

I rlly hope X11 fixes this


a year ago

me too


ash
FREE

a year ago

<:prayge:1231933593924927560>


ash
FREE

a year ago

Thanks again for all the effort, super appreciate it


a year ago

of course!


a year ago

you are running it in headless mode? i thought you wanted headless false?


a year ago


ash
FREE

a year ago

Ooops I forgot to change that back


ash
FREE

a year ago

Pushed


a year ago

awsome


a year ago

is the stream running?


ash
FREE

a year ago

Yep


a year ago

still black even with xvfb running


ash
FREE

a year ago

:(


ash
FREE

a year ago

The browserless instance doesn't crash though while connecting with headless: false?


a year ago

correct


ash
FREE

a year ago

sighs will have to dig in further tomorrow when I get up, almost 9 am for me


a year ago

great sleep schedule lol


a year ago

can you leave the stream running?


ash
FREE

a year ago

Could you share an easy way for me to replicate the instance with headful mode on?


ash
FREE

a year ago

For sure


a year ago

this is what ive done so far


a year ago


a year ago

it works now, and all i did was switch to browserless v1.

stock template, no xvfb.


ash
FREE

a year ago

Interesting - no idea why that works but, thank you so so much


ash
FREE

a year ago

<:patrikdab:901282271087185951>


ash
FREE

a year ago

Literally saved me from another few days of debugging :)


a year ago

no problem!