fix: a chromium bug where headless mode was set to false from chromium.headless

This commit is contained in:
zoidsec 2024-11-26 14:47:26 +11:00
parent 7ca22daa9a
commit c96321b99a
2 changed files with 25 additions and 19 deletions

View File

@ -42,6 +42,9 @@ RUN yarn build --production
# Final stage # Final stage
FROM node:${NODE_VERSION}-${DEBIAN_VERSION} AS final FROM node:${NODE_VERSION}-${DEBIAN_VERSION} AS final
# Set the environment variable HEADLESS to true
ENV HEADLESS=true
WORKDIR /app WORKDIR /app
COPY package.json yarn.lock ./ COPY package.json yarn.lock ./

View File

@ -1,56 +1,59 @@
import puppeteer from 'puppeteer-core'; import puppeteer from "puppeteer-core";
import chromium from 'chrome-aws-lambda'; import chromium from "chrome-aws-lambda";
import middleware from './_common/middleware.js'; import middleware from "./_common/middleware.js";
const screenshotHandler = async (targetUrl) => { const screenshotHandler = async (targetUrl) => {
if (!targetUrl) { if (!targetUrl) {
throw new Error('URL is missing from queryStringParameters'); throw new Error("URL is missing from queryStringParameters");
} }
if (!targetUrl.startsWith('http://') && !targetUrl.startsWith('https://')) { if (!targetUrl.startsWith("http://") && !targetUrl.startsWith("https://")) {
targetUrl = 'http://' + targetUrl; targetUrl = "http://" + targetUrl;
} }
try { try {
new URL(targetUrl); new URL(targetUrl);
} catch (error) { } catch (error) {
throw new Error('URL provided is invalid'); throw new Error("URL provided is invalid");
} }
let browser = null; let browser = null;
try { try {
browser = await puppeteer.launch({ browser = await puppeteer.launch({
args: [...chromium.args, '--no-sandbox'], // Add --no-sandbox flag args: [...chromium.args, "--no-sandbox"], // Add --no-sandbox flag
defaultViewport: { width: 800, height: 600 }, defaultViewport: { width: 800, height: 600 },
executablePath: process.env.CHROME_PATH || await chromium.executablePath, executablePath:
headless: chromium.headless, process.env.CHROME_PATH || (await chromium.executablePath),
headless: process.env.HEADLESS ? true : chromium.headless,
ignoreHTTPSErrors: true, ignoreHTTPSErrors: true,
ignoreDefaultArgs: ['--disable-extensions'], ignoreDefaultArgs: ["--disable-extensions"],
}); });
let page = await browser.newPage(); let page = await browser.newPage();
await page.emulateMediaFeatures([{ name: 'prefers-color-scheme', value: 'dark' }]); await page.emulateMediaFeatures([
{ name: "prefers-color-scheme", value: "dark" },
]);
page.setDefaultNavigationTimeout(8000); page.setDefaultNavigationTimeout(8000);
await page.goto(targetUrl, { waitUntil: 'domcontentloaded' }); await page.goto(targetUrl, { waitUntil: "domcontentloaded" });
await page.evaluate(() => { await page.evaluate(() => {
const selector = 'body'; const selector = "body";
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
const element = document.querySelector(selector); const element = document.querySelector(selector);
if (!element) { if (!element) {
reject(new Error(`Error: No element found with selector: ${selector}`)); reject(
new Error(`Error: No element found with selector: ${selector}`)
);
} }
resolve(); resolve();
}); });
}); });
const screenshotBuffer = await page.screenshot(); const screenshotBuffer = await page.screenshot();
const base64Screenshot = screenshotBuffer.toString('base64'); const base64Screenshot = screenshotBuffer.toString("base64");
return { image: base64Screenshot }; return { image: base64Screenshot };
} finally { } finally {
if (browser !== null) { if (browser !== null) {
await browser.close(); await browser.close();