@cityssm/puppeteer-launch
Version:
Launch Puppeteer, falling back to system browsers when the cached ones aren't working or aren't available.
74 lines (73 loc) • 3.81 kB
JavaScript
import fs from 'node:fs';
import os from 'node:os';
import path from 'node:path';
import { Browser, getInstalledBrowsers } from '@puppeteer/browsers';
import Debug from 'debug';
import { DEBUG_NAMESPACE } from './debug.config.js';
import { installChromeBrowser, installFirefoxBrowser } from './installers.js';
const debug = Debug(`${DEBUG_NAMESPACE}:cache`);
export const PUPPETEER_CACHE_DIR = path.join(os.homedir(), '.cache', 'puppeteer');
let installedBrowsers = [];
/**
* Refreshes the cache of installed browsers by re-querying the Puppeteer cache directory.
* @returns A promise that resolves to the updated list of installed browsers.
*/
export async function refreshInstalledBrowserCache() {
let tempInstalledBrowsers = await getInstalledBrowsers({
cacheDir: PUPPETEER_CACHE_DIR
});
// Filter out browsers with missing executable paths
tempInstalledBrowsers = tempInstalledBrowsers.filter((browser) => fs.existsSync(browser.executablePath) &&
fs.statSync(browser.executablePath).isFile());
installedBrowsers = tempInstalledBrowsers;
debug('Refreshed installed browser cache: %O', installedBrowsers);
return installedBrowsers;
}
/**
* Retrieves the cached Chrome browser from the Puppeteer cache.
* If the browser is not found and `installIfMissing` is true, it will attempt to install the browser and refresh the cache before trying again.
* @param installIfMissing - Whether to install the browser if not found in the cache. Defaults to false.
* @returns A promise that resolves to the cached Chrome browser, or undefined if not found and not installed.
*/
export async function getCachedChromeBrowser(installIfMissing = false) {
if (installedBrowsers.length === 0) {
await refreshInstalledBrowserCache();
}
const chromeBrowser = installedBrowsers.findLast((browser) => browser.browser === Browser.CHROME);
if (chromeBrowser === undefined && installIfMissing) {
await installChromeBrowser();
await refreshInstalledBrowserCache();
return await getCachedChromeBrowser(false);
}
return chromeBrowser;
}
/**
* Retrieves the cached Firefox browser from the Puppeteer cache.
* If the browser is not found and `installIfMissing` is true, it will attempt to install the browser and refresh the cache before trying again.
* @param installIfMissing - Whether to install the browser if not found in the cache. Defaults to false.
* @returns A promise that resolves to the cached Firefox browser, or undefined if not found and not installed.
*/
export async function getCachedFirefoxBrowser(installIfMissing = false) {
if (installedBrowsers.length === 0) {
await refreshInstalledBrowserCache();
}
const firefoxBrowser = installedBrowsers.findLast((browser) => browser.browser === Browser.FIREFOX);
if (firefoxBrowser === undefined && installIfMissing) {
await installFirefoxBrowser();
await refreshInstalledBrowserCache();
return await getCachedFirefoxBrowser(false);
}
return firefoxBrowser;
}
/**
* Retrieves the cached browser for the specified browser type from the Puppeteer cache.
* If the browser is not found and `installIfMissing` is true, it will attempt to install the browser and refresh the cache before trying again.
* @param browser - The browser type to retrieve ('chrome' or 'firefox').
* @param installIfMissing - Whether to install the browser if not found in the cache. Defaults to false.
* @returns A promise that resolves to the cached browser, or undefined if not found and not installed.
*/
export async function getCachedBrowser(browser, installIfMissing = false) {
return browser === 'chrome'
? await getCachedChromeBrowser(installIfMissing)
: await getCachedFirefoxBrowser(installIfMissing);
}