Skip to content

Commit c96321b

Browse files
fix: a chromium bug where headless mode was set to false from chromium.headless
1 parent 7ca22da commit c96321b

File tree

2 files changed

+25
-19
lines changed

2 files changed

+25
-19
lines changed

Dockerfile

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,9 @@ RUN yarn build --production
4242
# Final stage
4343
FROM node:${NODE_VERSION}-${DEBIAN_VERSION} AS final
4444

45+
# Set the environment variable HEADLESS to true
46+
ENV HEADLESS=true
47+
4548
WORKDIR /app
4649

4750
COPY package.json yarn.lock ./

api/screenshot.js

Lines changed: 22 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,56 +1,59 @@
1-
import puppeteer from 'puppeteer-core';
2-
import chromium from 'chrome-aws-lambda';
3-
import middleware from './_common/middleware.js';
1+
import puppeteer from "puppeteer-core";
2+
import chromium from "chrome-aws-lambda";
3+
import middleware from "./_common/middleware.js";
44

55
const screenshotHandler = async (targetUrl) => {
6-
76
if (!targetUrl) {
8-
throw new Error('URL is missing from queryStringParameters');
7+
throw new Error("URL is missing from queryStringParameters");
98
}
109

11-
if (!targetUrl.startsWith('http://') && !targetUrl.startsWith('https://')) {
12-
targetUrl = 'http://' + targetUrl;
10+
if (!targetUrl.startsWith("http://") && !targetUrl.startsWith("https://")) {
11+
targetUrl = "http://" + targetUrl;
1312
}
1413

1514
try {
1615
new URL(targetUrl);
1716
} catch (error) {
18-
throw new Error('URL provided is invalid');
17+
throw new Error("URL provided is invalid");
1918
}
2019

2120
let browser = null;
2221
try {
23-
browser = await puppeteer.launch({
24-
args: [...chromium.args, '--no-sandbox'], // Add --no-sandbox flag
22+
browser = await puppeteer.launch({
23+
args: [...chromium.args, "--no-sandbox"], // Add --no-sandbox flag
2524
defaultViewport: { width: 800, height: 600 },
26-
executablePath: process.env.CHROME_PATH || await chromium.executablePath,
27-
headless: chromium.headless,
25+
executablePath:
26+
process.env.CHROME_PATH || (await chromium.executablePath),
27+
headless: process.env.HEADLESS ? true : chromium.headless,
2828
ignoreHTTPSErrors: true,
29-
ignoreDefaultArgs: ['--disable-extensions'],
29+
ignoreDefaultArgs: ["--disable-extensions"],
3030
});
3131

3232
let page = await browser.newPage();
3333

34-
await page.emulateMediaFeatures([{ name: 'prefers-color-scheme', value: 'dark' }]);
34+
await page.emulateMediaFeatures([
35+
{ name: "prefers-color-scheme", value: "dark" },
36+
]);
3537
page.setDefaultNavigationTimeout(8000);
36-
await page.goto(targetUrl, { waitUntil: 'domcontentloaded' });
38+
await page.goto(targetUrl, { waitUntil: "domcontentloaded" });
3739

3840
await page.evaluate(() => {
39-
const selector = 'body';
41+
const selector = "body";
4042
return new Promise((resolve, reject) => {
4143
const element = document.querySelector(selector);
4244
if (!element) {
43-
reject(new Error(`Error: No element found with selector: ${selector}`));
45+
reject(
46+
new Error(`Error: No element found with selector: ${selector}`)
47+
);
4448
}
4549
resolve();
4650
});
4751
});
4852

4953
const screenshotBuffer = await page.screenshot();
50-
const base64Screenshot = screenshotBuffer.toString('base64');
54+
const base64Screenshot = screenshotBuffer.toString("base64");
5155

5256
return { image: base64Screenshot };
53-
5457
} finally {
5558
if (browser !== null) {
5659
await browser.close();

0 commit comments

Comments
 (0)