can1357/oh-my-pi · error · Error

Unsupported browser download: ${browser}

Error message

Unsupported browser download: ${browser}

What it means

getDownloadUrl only supports the Chrome product; any other Browser enum value (firefox, chromium, chrome-headless-shell, chromedriver) throws this Error because the Chrome-for-Testing archive URL layout is only valid for Chrome. It is an explicit capability guard in this Puppeteer-compatible shim.

Source

Thrown at packages/utils/src/browsers.ts:158

	if (/^\d+$/.test(tag)) {
		const metadata = await fetchMetadata<MilestoneVersions>("latest-versions-per-milestone.json");
		return metadata.milestones[tag]?.version ?? tag;
	}
	if (/^\d+\.\d+\.\d+$/.test(tag)) {
		const metadata = await fetchMetadata<PatchVersions>("latest-patch-versions-per-build.json");
		return metadata.builds[tag]?.version ?? tag;
	}
	return tag;
}

/** Return the Chrome-for-Testing archive URL for a browser build. */
export function getDownloadUrl(
	browser: Browser,
	platform: BrowserPlatform,
	buildId: string,
	baseUrl = CHROME_FOR_TESTING_BASE_URL,
): URL {
	if (browser !== Browser.CHROME) throw new Error(`Unsupported browser download: ${browser}`);
	const archivePlatform = chromeArchivePlatform(platform);
	const root = baseUrl.replace(/\/$/, "");
	return new URL(`${root}/${buildId}/${archivePlatform}/chrome-${archivePlatform}.zip`);
}

/** Compute the executable path in Puppeteer's cache layout. */
export function computeExecutablePath(options: ComputeExecutablePathOptions): string {
	const platform = options.platform ?? detectBrowserPlatform();
	if (!platform) throw new Error("Cannot determine a browser platform for this host");
	if (options.browser !== Browser.CHROME) throw new Error(`Unsupported browser executable: ${options.browser}`);
	const installDir = installationDir(options.cacheDir, options.browser, platform, options.buildId);
	switch (platform) {
		case BrowserPlatform.LINUX:
		case BrowserPlatform.LINUX_ARM:
			return path.join(installDir, "chrome-linux64", "chrome");
		case BrowserPlatform.MAC:
			return path.join(
				installDir,

View on GitHub (pinned to 9690622007)

Solutions

  1. Use Browser.CHROME for downloads through this module.
  2. For other products (chromium, firefox, chromedriver), use @puppeteer/browsers directly or a dedicated installer.
  3. Gate user/config-supplied browser values: validate the enum equals Browser.CHROME before calling install().

Example fix

// before
await install({ browser: Browser.FIREFOX, buildId, cacheDir }); // throws
// after
if (browser !== Browser.CHROME) {
  throw new Error(`This installer only manages ${Browser.CHROME}; got ${browser}`);
}
await install({ browser: Browser.CHROME, buildId, cacheDir });
Defensive patterns

Strategy: validation

Validate before calling

import { Browser } from './browsers';
if (browser !== Browser.CHROME) {
  throw new Error(`Only ${Browser.CHROME} is supported by this installer (got ${browser})`);
}

Type guard

function isSupportedForDownload(browser: Browser): browser is Browser.CHROME {
  return browser === Browser.CHROME;
}

Try / catch

try {
  const url = getDownloadUrl(browser, platform, buildId);
} catch (err) {
  if (/^Unsupported browser download: /.test(String(err))) {
    // route to @puppeteer/browsers or a product-specific installer
  } else throw err;
}

Prevention

When it happens

Trigger: Calling getDownloadUrl(Browser.FIREFOX | Browser.CHROMIUM | Browser.CHROMEHEADLESSSHELL | Browser.CHROMEDRIVER, platform, buildId) — directly or indirectly via install() with a non-Chrome browser.

Common situations: Configuring install({ browser: Browser.FIREFOX, ... }) assuming all Puppeteer products are supported; switching an app from chrome to chromium without checking support.

Related errors


AI-assisted analysis of can1357/oh-my-pi@9690622007 (2026-08-31). Data as JSON: /api/errors/67003ff3e045b74c. Report an issue: GitHub.