Does browslerless support headful mode?

ashHOBBY

8 months 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

ashHOBBY

8 months ago

d2a990ba-9a9a-40aa-9414-f3d1ae9e016f


ashHOBBY

8 months ago

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


8 months ago

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


ashHOBBY

8 months ago

Oh I see, thanks


ashHOBBY

8 months ago

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


8 months ago

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


ashHOBBY

8 months ago

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


ashHOBBY

8 months ago

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


ashHOBBY

8 months 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;

8 months ago

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


ashHOBBY

8 months ago

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


8 months ago

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


ashHOBBY

8 months ago

Okie, thanks anyways :)


ashHOBBY

8 months ago

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


8 months ago

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


ashHOBBY

8 months ago

It works fine in headful, only issue is with headless


ashHOBBY

8 months ago

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


8 months ago

right but can you not run it in headfull mode?


ashHOBBY

8 months ago

Correct


8 months ago

then there you have it


8 months ago

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


ashHOBBY

8 months ago

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


8 months ago

ah okay cool


ashHOBBY

8 months ago

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


8 months ago

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


ashHOBBY

8 months ago

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


8 months ago

yeah, you'd need to emulate something like that


8 months ago

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


ashHOBBY

8 months ago

Oh!!


ashHOBBY

8 months ago

I would super super appreciate that


8 months 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?


ashHOBBY

8 months ago

Sure let me work on that


8 months ago

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


8 months ago

but that gives you time to work on the example!


ashHOBBY

8 months ago

Works perfectly, thanks a bunch :)


8 months ago

no problem!


ashHOBBY

8 months 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));
  }
};

8 months ago

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


ashHOBBY

8 months ago

Sure!


8 months ago

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


ashHOBBY

8 months ago

What's your github?


8 months ago

brody192


ashHOBBY

8 months ago

Done, just sent over the repo to you


8 months ago

it doesn't look very minimal


ashHOBBY

8 months ago

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


ashHOBBY

8 months ago

Will update


ashHOBBY

8 months ago

Done, just pushed the simplified version


8 months ago

haha I think you are missing the point of minimal


ashHOBBY

8 months ago

Ok I might be 😭


ashHOBBY

8 months ago

What do you mean by it?


8 months ago

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


ashHOBBY

8 months ago

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


ashHOBBY

8 months ago

so I resorted to the existing


8 months ago

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


ashHOBBY

8 months ago

Sorry about that, want me to rewrite it?


8 months ago

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


ashHOBBY

8 months ago

Done, just pushed it


8 months ago

okay perfect, now that's minimal


8 months ago

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


ashHOBBY

8 months ago

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


ashHOBBY

8 months ago

Will test it out again with the minimal version


8 months ago

okay perfect


ashHOBBY

8 months ago

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


ashHOBBY

8 months ago

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


ashHOBBY

8 months 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)


ashHOBBY

8 months ago

(Headless always returns a blank screen)


8 months ago

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


ashHOBBY

8 months ago

The browserless version


8 months ago

perf


8 months ago

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

1282505180394426400


8 months ago

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


ashHOBBY

8 months ago

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


8 months ago

Uint8Array(4190) would increase?


ashHOBBY

8 months ago

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


ashHOBBY

8 months ago

Yes it would


8 months ago

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


ashHOBBY

8 months ago

Okay let me see


8 months ago

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


ashHOBBY

8 months ago

Ofcourse - working on a webserver to serve the image


8 months ago

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


ashHOBBY

8 months ago

Pushed


8 months ago

sweet


ashHOBBY

8 months ago

http://{domain}/thumbnail/the_winzy


8 months ago

this was such a good feature

1282508306556125200


ashHOBBY

8 months ago

Oh I didn't even know that was a feature


ashHOBBY

8 months ago

W feature


8 months ago

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


ashHOBBY

8 months ago

Yeah 100%


8 months ago

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


ashHOBBY

8 months ago

Correct


ashHOBBY

8 months ago

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


8 months ago

gotcha


ashHOBBY

8 months ago

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


ashHOBBY

8 months ago

But that's just a terrible way to check lol


8 months ago

thats funny since i didnt implement the virtual display server yet


ashHOBBY

8 months ago

Oh??


8 months ago

are you using browserless v1 or v2


ashHOBBY

8 months ago

v2


8 months ago

same


ashHOBBY

8 months ago

Ok we should probs see the result from the endpoint


8 months ago

waiting for dns to update so i can see the image


ashHOBBY

8 months ago

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


8 months ago

dns still isnt updated yet lol


ashHOBBY

8 months ago

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


ashHOBBY

8 months ago

Oh xD


8 months ago

it is indeed black


8 months ago


ashHOBBY

8 months ago

I rlly hope X11 fixes this


8 months ago

me too


ashHOBBY

8 months ago

<:prayge:1231933593924927560>


ashHOBBY

8 months ago

Thanks again for all the effort, super appreciate it


8 months ago

of course!


8 months ago

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


8 months ago


ashHOBBY

8 months ago

Ooops I forgot to change that back


ashHOBBY

8 months ago

Pushed


8 months ago

awsome


8 months ago

is the stream running?


ashHOBBY

8 months ago

Yep


8 months ago

still black even with xvfb running


ashHOBBY

8 months ago

:(


ashHOBBY

8 months ago

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


8 months ago

correct


ashHOBBY

8 months ago

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


8 months ago

great sleep schedule lol


8 months ago

can you leave the stream running?


ashHOBBY

8 months ago

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


ashHOBBY

8 months ago

For sure


8 months ago

this is what ive done so far


8 months ago


8 months ago

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

stock template, no xvfb.


ashHOBBY

8 months ago

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


ashHOBBY

8 months ago

<:patrikdab:901282271087185951>


ashHOBBY

8 months ago

Literally saved me from another few days of debugging :)


8 months ago

no problem!