{"version":3,"file":"browser/browser.mjs","sources":["webpack://@agent-infra/browser/./src/browser/browser.ts"],"sourcesContent":["/*\n * Copyright (c) 2025 Bytedance, Inc. and its affiliates.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { launch, connect } from 'puppeteer-core';\nimport { BrowserFinder } from '@agent-infra/browser-finder';\nimport { Tabs } from '../tabs/tabs';\nimport { getEnvInfo } from '../env';\nimport { BaseBrowser } from './base';\n\nimport type {\n  Cookie,\n  CookieData,\n  DeleteCookiesRequest,\n  LaunchOptions,\n} from 'puppeteer-core';\n\nexport class Browser extends BaseBrowser<Tabs> {\n  /**\n   * Create a browser instance (launch or connect based on options)\n   */\n  static async create(\n    options: { launchOrConnect: LaunchOptions } = { launchOrConnect: {} },\n  ): Promise<Browser> {\n    const browser = new Browser();\n    await browser.#init(options.launchOrConnect);\n    return browser;\n  }\n\n  constructor() {\n    super();\n  }\n\n  // #region cookies\n\n  /**\n   * cookies API\n   *\n   * @doc: https://pptr.dev/guides/cookies#setting-cookies\n   */\n\n  cookies() {\n    return this.pptrBrowser!.cookies();\n  }\n\n  setCookie(...cookies: CookieData[]) {\n    return this.pptrBrowser!.setCookie(...cookies);\n  }\n\n  deleteCookie(...cookies: Cookie[]) {\n    return this.pptrBrowser!.deleteCookie(...cookies);\n  }\n\n  deleteMatchingCookies(...filters: DeleteCookiesRequest[]) {\n    return this.pptrBrowser!.deleteMatchingCookies(...filters);\n  }\n\n  // #endregion\n\n  // #region lifecycle\n\n  async close() {\n    this.isIntentionalDisconnect = true;\n\n    await this.destroyAllTabs();\n    await this.pptrBrowser?.close();\n  }\n\n  // #endregion\n\n  // #region launch & connect\n\n  async #init(options: LaunchOptions): Promise<void> {\n    const processedOptions = this.#processOptions(options);\n\n    if (this.#isConnectMode(processedOptions)) {\n      await this.#connect(processedOptions);\n    } else {\n      await this.#launch(processedOptions);\n    }\n  }\n\n  #processOptions(options: LaunchOptions): LaunchOptions {\n    const processedOptions = { ...options };\n\n    const findBrowserPath = () => {\n      const finder = new BrowserFinder();\n      const browsers = ['chrome', 'edge'] as const;\n\n      const foundBrowser = browsers.find((browser) => {\n        try {\n          finder.findBrowser(browser);\n          return true;\n        } catch {\n          return false;\n        }\n      });\n\n      if (!foundBrowser) {\n        throw new Error(\n          'No Chrome or Edge browser found. Please install Chrome or Edge browser first.',\n        );\n      }\n\n      return finder.findBrowser(foundBrowser).path;\n    };\n\n    const setArgs = () => {\n      const args = processedOptions.args || [];\n      // https://github.com/GoogleChrome/chrome-launcher/blob/main/docs/chrome-flags-for-tools.md\n      const defaultArgs = [\n        '--mute-audio', // Mute any audio\n        '--no-default-browser-check', // Disable the default browser check, do not prompt to set it as such\n        '--ash-no-nudges', // Avoids blue bubble \"user education\" nudges\n      ];\n      // window-size includes some Chrome UI components (such as tabs, URL input box, etc.),\n      // so an additional 90 pixels should be added to the viewport height.\n      const windowSizeArg = `--window-size=${this.defaultViewport.width},${this.defaultViewport.height + 90}`;\n\n      // args\n      for (const arg of defaultArgs) {\n        if (!args.includes(arg)) {\n          args.push(arg);\n        }\n      }\n      if (!args.find((arg) => arg.startsWith('--window-size'))) {\n        args.push(windowSizeArg);\n      }\n\n      processedOptions.args = args;\n\n      // ignoreArgs\n      const enableAutomationArg = '--enable-automation';\n      if (processedOptions.ignoreDefaultArgs) {\n        if (Array.isArray(processedOptions.ignoreDefaultArgs)) {\n          const ignoreArgs = processedOptions.ignoreDefaultArgs;\n          if (!ignoreArgs.includes(enableAutomationArg)) {\n            ignoreArgs.push(enableAutomationArg);\n          }\n        }\n      } else {\n        processedOptions.ignoreDefaultArgs = [enableAutomationArg];\n      }\n    };\n\n    // 1.Set default viewport\n    processedOptions.defaultViewport = this.setDefaultViewport(\n      options.defaultViewport,\n    );\n\n    // 2.Validate browser type\n    if (\n      processedOptions.browser === 'firefox' ||\n      processedOptions.executablePath?.toLowerCase().includes('firefox') ||\n      processedOptions.protocol === 'webDriverBiDi'\n    ) {\n      throw new Error(\n        'Firefox is not supported. This package is based on CDP (Chrome DevTools Protocol).',\n      );\n    }\n\n    if (\n      !this.#isConnectMode(processedOptions) &&\n      !processedOptions.executablePath\n    ) {\n      // 3.Set executable path if needed\n      processedOptions.executablePath = findBrowserPath();\n\n      // 4.Optimize args and ignoreDefaultArgs for launch mode\n      setArgs();\n    }\n\n    return processedOptions;\n  }\n\n  #isConnectMode(options: LaunchOptions): boolean {\n    return !!(options.browserWSEndpoint || options.browserURL);\n  }\n\n  async #launch(options: LaunchOptions): Promise<void> {\n    this.pptrBrowser = await launch(options);\n\n    if (!this.pptrBrowser) {\n      throw new Error('Puppeteer browser not launch');\n    }\n\n    this.wsEndpoint = this.pptrBrowser.wsEndpoint();\n\n    this._envInfo = await getEnvInfo(this.pptrBrowser);\n    this._tabs = await Tabs.create(this.pptrBrowser, {\n      viewport: this.defaultViewport,\n      envInfo: this._envInfo,\n      userAgentInfo: this.userAgentInfo,\n    });\n    this.setupAutoReconnect();\n  }\n\n  async #connect(options: LaunchOptions): Promise<void> {\n    this.pptrBrowser = await connect(options);\n\n    if (!this.pptrBrowser) {\n      throw new Error('Puppeteer browser not connect');\n    }\n\n    this.wsEndpoint = this.pptrBrowser.wsEndpoint();\n\n    this._envInfo = await getEnvInfo(this.pptrBrowser);\n    this._tabs = await Tabs.create(this.pptrBrowser, {\n      viewport: this.defaultViewport,\n      envInfo: this._envInfo,\n      userAgentInfo: this.userAgentInfo,\n    });\n    this.setupAutoReconnect();\n  }\n\n  override async performReconnect(): Promise<void> {\n    const connectOptions = {\n      browserWSEndpoint: this.wsEndpoint,\n      defaultViewport: this.defaultViewport,\n    };\n    this.pptrBrowser = await connect(connectOptions);\n\n    this.wsEndpoint = this.pptrBrowser.wsEndpoint();\n    this._tabs = await Tabs.create(this.pptrBrowser, {\n      viewport: this.defaultViewport,\n      envInfo: this._envInfo!,\n    });\n\n    const activeTab = this.getActiveTab();\n    if (activeTab) {\n      await activeTab._active();\n    }\n  }\n\n  // #endregion\n}\n"],"names":["_init","processOptions","isConnectMode","_launch","_connect","Browser","BaseBrowser","options","browser","init","cookies","filters","_this_pptrBrowser","connectOptions","connect","Tabs","activeTab","launch1","connect1","processedOptions","_processedOptions_executablePath","findBrowserPath","finder","BrowserFinder","browsers","foundBrowser","Error","setArgs","args","defaultArgs","windowSizeArg","arg","enableAutomationArg","Array","ignoreArgs","launch","getEnvInfo"],"mappings":"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"}