Does browslerless support headful mode?

ash
FREE

10 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

ash
FREE

10 months ago

d2a990ba-9a9a-40aa-9414-f3d1ae9e016f


ash
FREE

10 months ago

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


10 months ago

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


ash
FREE

10 months ago

Oh I see, thanks


ash
FREE

10 months ago

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


10 months ago

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


ash
FREE

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

10 months ago

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


ash
FREE

10 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;

10 months ago

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


ash
FREE

10 months ago

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


10 months ago

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


ash
FREE

10 months ago

Okie, thanks anyways :)


ash
FREE

10 months ago

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


10 months ago

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


ash
FREE

10 months ago

It works fine in headful, only issue is with headless


ash
FREE

10 months ago

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


10 months ago

right but can you not run it in headfull mode?


ash
FREE

10 months ago

Correct


10 months ago

then there you have it


10 months ago

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


ash
FREE

10 months ago

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


10 months ago

ah okay cool


ash
FREE

10 months ago

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


10 months ago

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


ash
FREE

10 months ago

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


10 months ago

yeah, you'd need to emulate something like that


10 months ago

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


ash
FREE

10 months ago

Oh!!


ash
FREE

10 months ago

I would super super appreciate that


10 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?


ash
FREE

10 months ago

Sure let me work on that


10 months ago

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


10 months ago

but that gives you time to work on the example!


ash
FREE

10 months ago

Works perfectly, thanks a bunch :)


10 months ago

no problem!


ash
FREE

10 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));
  }
};

10 months ago

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


ash
FREE

10 months ago

Sure!


10 months ago

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


ash
FREE

10 months ago

What's your github?


10 months ago

brody192


ash
FREE

10 months ago

Done, just sent over the repo to you


10 months ago

it doesn't look very minimal


ash
FREE

10 months ago

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


ash
FREE

10 months ago

Will update


ash
FREE

10 months ago

Done, just pushed the simplified version


10 months ago

haha I think you are missing the point of minimal


ash
FREE

10 months ago

Ok I might be 😭


ash
FREE

10 months ago

What do you mean by it?


10 months ago

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


ash
FREE

10 months ago

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


ash
FREE

10 months ago

so I resorted to the existing


10 months ago

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


ash
FREE

10 months ago

Sorry about that, want me to rewrite it?


10 months ago

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


ash
FREE

10 months ago

Done, just pushed it


10 months ago

okay perfect, now that's minimal


10 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?


ash
FREE

10 months ago

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


ash
FREE

10 months ago

Will test it out again with the minimal version


10 months ago

okay perfect


ash
FREE

10 months ago

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


ash
FREE

10 months ago

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


ash
FREE

10 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)


ash
FREE

10 months ago

(Headless always returns a blank screen)


10 months ago

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


ash
FREE

10 months ago

The browserless version


10 months ago

perf


10 months ago

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

1282505180394426400


10 months ago

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


ash
FREE

10 months ago

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


10 months ago

Uint8Array(4190) would increase?


ash
FREE

10 months ago

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


ash
FREE

10 months ago

Yes it would


10 months ago

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


ash
FREE

10 months ago

Okay let me see


10 months ago

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


ash
FREE

10 months ago

Ofcourse - working on a webserver to serve the image


10 months ago

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


ash
FREE

10 months ago

Pushed


10 months ago

sweet


ash
FREE

10 months ago

http://{domain}/thumbnail/the_winzy


10 months ago

this was such a good feature

1282508306556125200


ash
FREE

10 months ago

Oh I didn't even know that was a feature


ash
FREE

10 months ago

W feature


10 months ago

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


ash
FREE

10 months ago

Yeah 100%


10 months ago

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


ash
FREE

10 months ago

Correct


ash
FREE

10 months ago

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


10 months ago

gotcha


ash
FREE

10 months ago

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


ash
FREE

10 months ago

But that's just a terrible way to check lol


10 months ago

thats funny since i didnt implement the virtual display server yet


ash
FREE

10 months ago

Oh??


10 months ago

are you using browserless v1 or v2


ash
FREE

10 months ago

v2


10 months ago

same


ash
FREE

10 months ago

Ok we should probs see the result from the endpoint


10 months ago

waiting for dns to update so i can see the image


ash
FREE

10 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


10 months ago

dns still isnt updated yet lol


ash
FREE

10 months ago

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


ash
FREE

10 months ago

Oh xD


10 months ago

it is indeed black


10 months ago


ash
FREE

10 months ago

I rlly hope X11 fixes this


10 months ago

me too


ash
FREE

10 months ago

<:prayge:1231933593924927560>


ash
FREE

10 months ago

Thanks again for all the effort, super appreciate it


10 months ago

of course!


10 months ago

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


10 months ago


ash
FREE

10 months ago

Ooops I forgot to change that back


ash
FREE

10 months ago

Pushed


10 months ago

awsome


10 months ago

is the stream running?


ash
FREE

10 months ago

Yep


10 months ago

still black even with xvfb running


ash
FREE

10 months ago

:(


ash
FREE

10 months ago

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


10 months ago

correct


ash
FREE

10 months ago

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


10 months ago

great sleep schedule lol


10 months ago

can you leave the stream running?


ash
FREE

10 months ago

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


ash
FREE

10 months ago

For sure


10 months ago

this is what ive done so far


10 months ago


10 months ago

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

stock template, no xvfb.


ash
FREE

10 months ago

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


ash
FREE

10 months ago

<:patrikdab:901282271087185951>


ash
FREE

10 months ago

Literally saved me from another few days of debugging :)


10 months ago

no problem!


Does browslerless support headful mode? - Railway Help Station