diff --git a/src/mailworker.js b/src/mailworker.js index ee4044c..b50534e 100644 --- a/src/mailworker.js +++ b/src/mailworker.js @@ -7,6 +7,7 @@ import puppeteer from 'puppeteer'; import nodemailer from 'nodemailer'; import log4js from 'log4js'; import config from './config.js'; +import { getPuppeteerLaunchOptions } from './puppeteerLaunchOptions.js'; const baseUrl = (urlClient) => (urlClient || 'http://localhost:3000').replace(/\/$/, ''); @@ -77,14 +78,9 @@ async function sendEmail(payload) { let html = ''; let browser; try { - browser = await puppeteer.launch({ - headless: 'new', - args: [ - '--no-sandbox', - '--disable-setuid-sandbox', - '--disable-features=SameSiteByDefaultCookies', - ], - }); + browser = await puppeteer.launch( + getPuppeteerLaunchOptions(['--disable-features=SameSiteByDefaultCookies']) + ); const page = await browser.newPage(); page.on('console', (msg) => { const text = msg.text(); diff --git a/src/puppeteerLaunchOptions.js b/src/puppeteerLaunchOptions.js new file mode 100644 index 0000000..292c6e7 --- /dev/null +++ b/src/puppeteerLaunchOptions.js @@ -0,0 +1,16 @@ +import puppeteer from 'puppeteer'; + +const BASE_ARGS = ['--no-sandbox', '--disable-setuid-sandbox']; + +/** + * Puppeteer launch options using the Chrome downloaded to the Puppeteer cache + * (e.g. /home/farmcontrol/.cache/puppeteer on Linux), not a system-installed browser. + */ +export function getPuppeteerLaunchOptions(extraArgs = []) { + return { + executablePath: + process.env.PUPPETEER_EXECUTABLE_PATH || puppeteer.executablePath(), + headless: true, + args: [...BASE_ARGS, ...extraArgs], + }; +} diff --git a/src/templates/__tests__/pdffactory.test.js b/src/templates/__tests__/pdffactory.test.js index 9580876..412415b 100644 --- a/src/templates/__tests__/pdffactory.test.js +++ b/src/templates/__tests__/pdffactory.test.js @@ -16,6 +16,7 @@ const browserInstance = { const puppeteer = { launch: jest.fn().mockResolvedValue(browserInstance), + executablePath: jest.fn().mockReturnValue('/fake/puppeteer/chrome'), }; jest.unstable_mockModule('puppeteer', () => ({ diff --git a/src/templates/pdffactory.js b/src/templates/pdffactory.js index 32478a3..e30cd22 100644 --- a/src/templates/pdffactory.js +++ b/src/templates/pdffactory.js @@ -1,15 +1,11 @@ import log4js from 'log4js'; import puppeteer from 'puppeteer'; import config from '../config.js'; +import { getPuppeteerLaunchOptions } from '../puppeteerLaunchOptions.js'; const logger = log4js.getLogger('PDF Factory'); logger.level = config.server.logLevel; -const LAUNCH_OPTIONS = { - headless: true, - args: ['--no-sandbox', '--disable-setuid-sandbox'], -}; - let browser = null; let launchPromise = null; let shutdownRegistered = false; @@ -20,7 +16,7 @@ function isBrowserConnected() { async function launchBrowser() { logger.info('Launching persistent Puppeteer browser...'); - const instance = await puppeteer.launch(LAUNCH_OPTIONS); + const instance = await puppeteer.launch(getPuppeteerLaunchOptions()); instance.on('disconnected', () => { if (browser === instance) { logger.warn('Puppeteer browser disconnected');