Spaces:
Running
Running
| /** | |
| * @license | |
| * Copyright 2026 Google Inc. | |
| * SPDX-License-Identifier: Apache-2.0 | |
| */ | |
| import type {Browser, BrowserPlatform} from './browser-data/browser-data.js'; | |
| /** | |
| * Options passed to a provider. | |
| * @public | |
| */ | |
| export interface DownloadOptions { | |
| browser: Browser; | |
| platform: BrowserPlatform; | |
| buildId: string; | |
| } | |
| /** | |
| * Interface for custom browser provider implementations. | |
| * Allows users to implement alternative download sources for browsers. | |
| * | |
| * ⚠️ **IMPORTANT**: Custom providers are NOT officially supported by | |
| * Puppeteer. | |
| * | |
| * By implementing this interface, you accept full responsibility for: | |
| * | |
| * - Ensuring downloaded binaries are compatible with Puppeteer's expectations | |
| * - Testing that browser launch and other features work with your binaries | |
| * - Maintaining compatibility when Puppeteer or your download source changes | |
| * - Version consistency across platforms if mixing sources | |
| * | |
| * Puppeteer only tests and guarantees Chrome for Testing binaries. | |
| * | |
| * @example | |
| * | |
| * ```typescript | |
| * class ElectronDownloader implements BrowserProvider { | |
| * supports(options: DownloadOptions): boolean { | |
| * return options.browser === Browser.CHROMEDRIVER; | |
| * } | |
| * | |
| * getDownloadUrl(options: DownloadOptions): URL { | |
| * const platform = mapToPlatform(options.platform); | |
| * return new URL( | |
| * `v${options.buildId}/chromedriver-v${options.buildId}-${platform}.zip`, | |
| * 'https://github.com/electron/electron/releases/download/', | |
| * ); | |
| * } | |
| * | |
| * getExecutablePath(options): string { | |
| * const ext = options.platform.includes('win') ? '.exe' : ''; | |
| * return `chromedriver/chromedriver${ext}`; | |
| * } | |
| * } | |
| * ``` | |
| * | |
| * @public | |
| */ | |
| export interface BrowserProvider { | |
| /** | |
| * Check if this provider supports the given browser/platform. | |
| * Used for filtering before attempting downloads. | |
| * | |
| * Can be synchronous for quick checks or asynchronous if version | |
| * resolution/network requests are needed. | |
| * | |
| * @param options - Download options to check | |
| * @returns True if this provider supports the browser/platform combination | |
| */ | |
| supports(options: DownloadOptions): Promise<boolean> | boolean; | |
| /** | |
| * Get the download URL for the requested browser. | |
| * | |
| * The buildId can be either an exact version (e.g., "131.0.6778.109") | |
| * or an alias (e.g., "latest", "stable"). Custom providers should handle | |
| * version resolution internally if they support aliases. | |
| * | |
| * Returns null if the buildId cannot be resolved to a valid version. | |
| * The URL is not validated - download will fail later if URL doesn't exist. | |
| * | |
| * Can be synchronous for simple URL construction or asynchronous if version | |
| * resolution/network requests are needed. | |
| * | |
| * @param options - Download options (buildId may be alias or exact version) | |
| * @returns Download URL, or null if version cannot be resolved | |
| * @example | |
| * | |
| * ```ts | |
| * // Synchronous example | |
| * getDownloadUrl(options) { | |
| * const platform = mapPlatform(options.platform); | |
| * return new URL(`https://releases.example.com/v${options.buildId}/${platform}.zip`); | |
| * } | |
| * | |
| * // Asynchronous example with version mapping | |
| * async getDownloadUrl(options) { | |
| * const electronVersion = await resolveElectronVersion(options.buildId); | |
| * if (!electronVersion) return null; | |
| * | |
| * const platform = mapPlatform(options.platform); | |
| * return new URL(`https://github.com/electron/electron/releases/download/v${electronVersion}/${platform}.zip`); | |
| * } | |
| * ``` | |
| */ | |
| getDownloadUrl(options: DownloadOptions): Promise<URL | null> | URL | null; | |
| /** | |
| * Get the relative path to the executable within the extracted archive. | |
| * | |
| * @param options - Browser, buildId, and platform | |
| * @returns Relative path to the executable | |
| * @example | |
| * | |
| * ```ts | |
| * // Electron uses simple structure | |
| * getExecutablePath() { | |
| * return 'chromedriver/chromedriver'; | |
| * } | |
| * | |
| * // Custom provider with platform-specific paths | |
| * getExecutablePath(options) { | |
| * return `binaries/${options.browser}-${options.platform}`; | |
| * } | |
| * ``` | |
| */ | |
| getExecutablePath(options: { | |
| browser: Browser; | |
| buildId: string; | |
| platform: BrowserPlatform; | |
| }): Promise<string> | string; | |
| /** | |
| * Get the name of this provider. | |
| * Used for error messages and logging purposes. | |
| * | |
| * @returns The provider name (e.g., "DefaultProvider", "CustomProvider") | |
| * | |
| * @remarks | |
| * This method is used instead of `constructor.name` to avoid issues with | |
| * minification in production builds. | |
| * | |
| * @example | |
| * | |
| * ```ts | |
| * getName() { | |
| * return 'MyCustomProvider'; | |
| * } | |
| * ``` | |
| */ | |
| getName(): string; | |
| } | |
| /** | |
| * Utility function to build a standard archive filename. | |
| * @public | |
| */ | |
| export function buildArchiveFilename( | |
| browser: Browser, | |
| platform: BrowserPlatform, | |
| buildId: string, | |
| extension = 'zip', | |
| ): string { | |
| return `${browser}-${platform}-${buildId}.${extension}`; | |
| } | |