UNPKG

@cityssm/puppeteer-launch

Version:

Launch Puppeteer, falling back to system browsers when the cached ones aren't working or aren't available.

94 lines (93 loc) 3.21 kB
import Debug from 'debug'; import { launch as puppeteerLaunch } from 'puppeteer'; import { DEBUG_NAMESPACE } from './debug.config.js'; import { getUserChromePath, getUserFirefoxPath } from './user.js'; const debug = Debug(`${DEBUG_NAMESPACE}:index`); export const browserOrderDefault = [ 'chrome', 'firefox', 'chrome-user', 'firefox-user' ]; /** * Launches a Puppeteer browser instance. * Automatically falls back to a system browser if no browser is available in the Puppeteer cache. * @param options - Optional launch parameters * @returns - A Puppeteer browser instance. */ export default async function launch(options = {}) { /* * Set default Puppeteer options */ const puppeteerOptions = { headless: true, timeout: 60_000, ...options }; /* * Set browser order */ let browserOrder = options.browserOrder === undefined ? undefined : [...options.browserOrder]; if (browserOrder === undefined) { if (puppeteerOptions.browser === 'firefox') { browserOrder = ['firefox', 'firefox-user']; } else if (puppeteerOptions.browser === 'chrome') { browserOrder = ['chrome', 'chrome-user']; } else { browserOrder = browserOrderDefault; } } /* * If no browser is specified, try to load one from the browser order */ if (puppeteerOptions.browser === undefined && browserOrder.length > 0) { const browserToLoad = browserOrder.shift(); debug(`Loading browser: ${browserToLoad}`); if (browserToLoad === 'firefox-user') { const firefoxPath = await getUserFirefoxPath(); if (firefoxPath !== undefined) { puppeteerOptions.executablePath = firefoxPath; } puppeteerOptions.browser = 'firefox'; } else if (browserToLoad === 'chrome-user') { const chromePath = await getUserChromePath(); if (chromePath !== undefined) { puppeteerOptions.executablePath = chromePath; } puppeteerOptions.browser = 'chrome'; } else { puppeteerOptions.browser = browserToLoad; } } /* * Attempt to launch the browser */ try { debug(`Attempting to launch browser: ${JSON.stringify(puppeteerOptions)}`); const browser = await puppeteerLaunch(puppeteerOptions); // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition if (browser === undefined) { throw new Error('Puppeteer browser is undefined'); } debug('Launched puppeteer browser'); return browser; } catch (error) { // debug(`Error launching browser: ${error}`) if (browserOrder.length > 0) { puppeteerOptions.browser = undefined; puppeteerOptions.executablePath = undefined; return await launch({ ...puppeteerOptions, browserOrder }); } throw error; } } export * as puppeteer from 'puppeteer'; export { installChromeBrowser, installFirefoxBrowser } from './installers.js';