|
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"; |
4 | 4 |
|
5 | 5 | const screenshotHandler = async (targetUrl) => { |
6 | | - |
7 | 6 | if (!targetUrl) { |
8 | | - throw new Error('URL is missing from queryStringParameters'); |
| 7 | + throw new Error("URL is missing from queryStringParameters"); |
9 | 8 | } |
10 | 9 |
|
11 | | - if (!targetUrl.startsWith('http://') && !targetUrl.startsWith('https://')) { |
12 | | - targetUrl = 'http://' + targetUrl; |
| 10 | + if (!targetUrl.startsWith("http://") && !targetUrl.startsWith("https://")) { |
| 11 | + targetUrl = "http://" + targetUrl; |
13 | 12 | } |
14 | 13 |
|
15 | 14 | try { |
16 | 15 | new URL(targetUrl); |
17 | 16 | } catch (error) { |
18 | | - throw new Error('URL provided is invalid'); |
| 17 | + throw new Error("URL provided is invalid"); |
19 | 18 | } |
20 | 19 |
|
21 | 20 | let browser = null; |
22 | 21 | 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 |
25 | 24 | 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, |
28 | 28 | ignoreHTTPSErrors: true, |
29 | | - ignoreDefaultArgs: ['--disable-extensions'], |
| 29 | + ignoreDefaultArgs: ["--disable-extensions"], |
30 | 30 | }); |
31 | 31 |
|
32 | 32 | let page = await browser.newPage(); |
33 | 33 |
|
34 | | - await page.emulateMediaFeatures([{ name: 'prefers-color-scheme', value: 'dark' }]); |
| 34 | + await page.emulateMediaFeatures([ |
| 35 | + { name: "prefers-color-scheme", value: "dark" }, |
| 36 | + ]); |
35 | 37 | page.setDefaultNavigationTimeout(8000); |
36 | | - await page.goto(targetUrl, { waitUntil: 'domcontentloaded' }); |
| 38 | + await page.goto(targetUrl, { waitUntil: "domcontentloaded" }); |
37 | 39 |
|
38 | 40 | await page.evaluate(() => { |
39 | | - const selector = 'body'; |
| 41 | + const selector = "body"; |
40 | 42 | return new Promise((resolve, reject) => { |
41 | 43 | const element = document.querySelector(selector); |
42 | 44 | 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 | + ); |
44 | 48 | } |
45 | 49 | resolve(); |
46 | 50 | }); |
47 | 51 | }); |
48 | 52 |
|
49 | 53 | const screenshotBuffer = await page.screenshot(); |
50 | | - const base64Screenshot = screenshotBuffer.toString('base64'); |
| 54 | + const base64Screenshot = screenshotBuffer.toString("base64"); |
51 | 55 |
|
52 | 56 | return { image: base64Screenshot }; |
53 | | - |
54 | 57 | } finally { |
55 | 58 | if (browser !== null) { |
56 | 59 | await browser.close(); |
|
0 commit comments