{"version":3,"file":"tabs/tabs.mjs","sources":["webpack://@agent-infra/browser/./src/tabs/tabs.ts"],"sourcesContent":["/*\n * Copyright (c) 2025 Bytedance, Inc. and its affiliates.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport { proxy, subscribe } from 'valtio';\nimport { proxyMap } from 'valtio/utils';\nimport { Tab } from './tab';\nimport { validateNavigationUrl, Mutex } from '../utils';\n\nimport type { Browser, Page, Target } from 'puppeteer-core';\nimport {\n  TabEvents,\n  type TabEventsMap,\n  type TabMeta,\n  type TabOptions,\n  type TabsState,\n  type TabsOperationTracker,\n  type TabsOptions,\n  type DialogMeta,\n} from '../types/tabs';\n\nexport class Tabs<T extends Tab = Tab> {\n  #pptrBrowser: Browser;\n  #tabs: Map<string, T>;\n  #options: TabsOptions;\n\n  #operations: TabsOperationTracker;\n\n  public state: TabsState;\n  #isIntentionalDestroy = false;\n\n  static async create(browser: Browser, options: TabsOptions) {\n    const tabs = new Tabs(browser, options);\n    await tabs.initializeExistingTabs();\n    return tabs;\n  }\n\n  constructor(browser: Browser, options: TabsOptions) {\n    this.#pptrBrowser = browser;\n    this.#options = options;\n\n    this.#tabs = new Map<string, T>();\n    this.state = proxy({\n      tabs: proxyMap<string, TabMeta>(),\n      activeTabId: null,\n    });\n    this.#operations = {\n      creatingTargetIds: new Set<string>(),\n      switchingTargetIds: new Set<string>(),\n      closingTargetIds: new Set<string>(),\n    };\n\n    // tabs events\n    this.#pptrBrowser.on('targetcreated', (target) =>\n      this.#handleTargetCreated(target),\n    );\n    this.#pptrBrowser.on('targetdestroyed', (target) =>\n      this.#handleTargetDestroyed(target),\n    );\n  }\n\n  subscribe(callback: () => void): () => void {\n    return subscribe(this.state, callback);\n  }\n\n  getSnapshot(): TabsState {\n    return {\n      tabs: new Map(this.state.tabs),\n      activeTabId: this.state.activeTabId,\n    };\n  }\n\n  protected async createTabInstance(\n    page: Page,\n    options: TabOptions,\n  ): Promise<T> {\n    const tab = new Tab(page, options) as T;\n    await tab.init();\n\n    return tab;\n  }\n\n  // #region init ExistingTabs\n\n  protected async initializeExistingTabs() {\n    const existingPages = await this.#pptrBrowser.pages();\n\n    // console.log('initializeExistingTabs', existingPages);\n\n    if (existingPages.length === 0) {\n      return;\n    }\n\n    // init all existing tabs\n    const initTabTasks = existingPages\n      .filter((pptrPage) => !validateNavigationUrl(pptrPage.url()).ignored) // not allowed chrome devtools frontend\n      .map(async (pptrPage) => {\n        // @ts-ignore\n        const tabId = pptrPage.target()._targetId;\n        const tab = await this.createTabInstance(pptrPage, {\n          tabId: tabId,\n          ...this.#options,\n        });\n\n        this.#tabs.set(tabId, tab);\n        this.#setupTabEvents(tab, tabId);\n        await this.#syncTabMeta(tabId);\n\n        const isActive = await tab._checkActiveStatusWithRuntime();\n        return { tabId, pptrPage, isActive };\n      });\n    const initedTabs = await Promise.all(initTabTasks);\n\n    // active tab\n    let activeTabId = initedTabs.find((result) => result.isActive)?.tabId;\n    if (!activeTabId) {\n      activeTabId = initedTabs[0].tabId;\n    }\n\n    await this.#activeTab(activeTabId);\n  }\n\n  // #endregion\n\n  // #region createTab\n\n  #cteateMutex = new Mutex();\n  async #createTab(targetId: string, pptrPage: Page) {\n    using _ = await this.#cteateMutex.acquire();\n\n    if (this.#operations.creatingTargetIds.has(targetId)) {\n      return targetId;\n    }\n    this.#operations.creatingTargetIds.add(targetId);\n\n    const tab = await this.createTabInstance(pptrPage, {\n      tabId: targetId,\n      ...this.#options,\n    });\n\n    this.#tabs.set(targetId, tab);\n    this.#setupTabEvents(tab, targetId);\n    await this.#syncTabMeta(targetId);\n\n    return targetId;\n  }\n\n  async #handleTargetCreated(target: Target) {\n    if (target.type() !== 'page') {\n      return;\n    }\n    const pptrPage = await target.page();\n    if (!pptrPage) {\n      return;\n    }\n    // @ts-ignore\n    const targetId = target._targetId;\n\n    console.log('handleTargetCreated', targetId);\n\n    await this.#createTab(targetId, pptrPage);\n    await this.#activeTab(targetId);\n\n    return targetId;\n  }\n\n  async createTab(): Promise<string> {\n    const pptrPage = await this.#pptrBrowser.newPage();\n    // @ts-ignore\n    const targetId = pptrPage.target()._targetId;\n\n    await this.#createTab(targetId, pptrPage);\n    await this.#activeTab(targetId);\n\n    return targetId;\n  }\n\n  // #endregion\n\n  // #region activeTab\n\n  #activeMutex = new Mutex();\n  async #activeTab(tabId: string) {\n    using _ = await this.#activeMutex.acquire();\n\n    // console.trace('#activeTab', tabId);\n\n    // check lock\n    if (this.#operations.switchingTargetIds.has(tabId)) {\n      return false;\n    }\n    this.#operations.switchingTargetIds.add(tabId);\n\n    // check tab existence\n    const tab = this.#tabs.get(tabId);\n    if (!tab) {\n      this.#operations.switchingTargetIds.delete(tabId);\n      return false;\n    }\n    if (this.state.activeTabId === tabId) {\n      this.#operations.switchingTargetIds.delete(tabId);\n      return true;\n    }\n\n    // active select tab\n    this.state.activeTabId = tabId;\n    await tab._active();\n    await this.#syncTabMeta(this.state.activeTabId);\n\n    // inactivate other tabs\n    const inactivePromises = [];\n    for (const [id, tabInstance] of this.#tabs) {\n      if (id !== tabId) {\n        inactivePromises.push(tabInstance._inactive());\n      }\n    }\n    await Promise.all(inactivePromises);\n\n    // release lock\n    this.#operations.switchingTargetIds.delete(tabId);\n\n    return true;\n  }\n\n  async activeTab(tabId: string): Promise<boolean> {\n    console.log('public activeTab', tabId);\n\n    return await this.#activeTab(tabId);\n  }\n\n  getActiveTab(): T | null {\n    if (!this.state.activeTabId) return null;\n    return this.#tabs.get(this.state.activeTabId) || null;\n  }\n\n  // #endregion\n\n  // #region closeTab\n\n  #closeMutex = new Mutex();\n  async #closeTab(tabId: string): Promise<boolean> {\n    using _ = await this.#closeMutex.acquire();\n\n    // check\n    if (this.#operations.closingTargetIds.has(tabId)) {\n      return false;\n    }\n    this.#operations.closingTargetIds.add(tabId);\n\n    // close tab\n    const tab = this.#tabs.get(tabId);\n    if (!tab) {\n      return false;\n    }\n    await tab._close();\n    this.#tabs.delete(tabId);\n    this.state.tabs.delete(tabId);\n\n    // fallback logic to prevent the browser from being closed directly\n    if (this.state.activeTabId === tabId) {\n      this.state.activeTabId = null;\n\n      if (this.#tabs.size === 0 && !this.#isIntentionalDestroy) {\n        await this.createTab();\n      }\n    }\n\n    return true;\n  }\n\n  async #handleTargetDestroyed(target: Target) {\n    if (target.type() !== 'page') {\n      return;\n    }\n\n    // @ts-ignore\n    const targetId = target._targetId;\n    await this.#closeTab(targetId);\n  }\n\n  async closeTab(tabId: string): Promise<boolean> {\n    return await this.#closeTab(tabId);\n  }\n\n  // #endregion\n\n  // #region public methods\n\n  getCurrentUrl(): string {\n    const activeTab = this.getActiveTab();\n    return activeTab ? activeTab.url : 'about:blank';\n  }\n\n  hasTab(tabId: string): boolean {\n    return this.state.tabs.has(tabId);\n  }\n\n  async destroy(): Promise<void> {\n    this.#isIntentionalDestroy = true;\n\n    const closeTasks = Array.from(this.#tabs.keys()).map((tabId) =>\n      this.closeTab(tabId),\n    );\n    await Promise.all(closeTasks);\n  }\n\n  // #endregion\n\n  // #region private methods\n\n  async #syncTabMeta(tabId: string, isLoading = false): Promise<void> {\n    const tab = this.#tabs.get(tabId);\n    if (!tab) return;\n\n    const [title, favicon, historyData] = await Promise.all([\n      tab.getTitle().catch(() => 'Loading...'),\n      tab.getFavicon().catch(() => ''),\n      tab.getHistory().catch(() => ({\n        index: 0,\n        history: [],\n        canGoBack: false,\n        canGoForward: false,\n      })),\n    ]);\n\n    const tabMeta: TabMeta = {\n      id: tabId,\n      url: tab.url || 'about:blank',\n      title: title,\n      favicon: favicon,\n      isLoading: isLoading,\n      isActive: tabId === this.state.activeTabId,\n      canGoBack: historyData.canGoBack,\n      canGoForward: historyData.canGoForward,\n    };\n\n    // console.log('syncTabMeta', tabId, tabMeta);\n\n    this.state.tabs.set(tabId, tabMeta);\n  }\n\n  #updateTabDialog(tabId: string, dialogMeta: DialogMeta | null): void {\n    const currentTabMeta = this.state.tabs.get(tabId);\n    if (!currentTabMeta) return;\n\n    const updatedTabMeta: TabMeta = {\n      ...currentTabMeta,\n      dialog: dialogMeta || undefined,\n    };\n\n    this.state.tabs.set(tabId, updatedTabMeta);\n  }\n\n  #setupTabEvents(tab: Tab, tabId: string): void {\n    tab.on(\n      TabEvents.TabLoadingStateChanged,\n      (event: TabEventsMap[TabEvents.TabLoadingStateChanged]) => {\n        const currentTabMeta = this.state.tabs.get(tabId);\n        if (!currentTabMeta) return;\n\n        const updatedTabMeta: TabMeta = {\n          ...currentTabMeta,\n          isLoading: event.isLoading,\n        };\n\n        this.state.tabs.set(tabId, updatedTabMeta);\n      },\n    );\n    tab.on(\n      TabEvents.TabUrlChanged,\n      (event: TabEventsMap[TabEvents.TabUrlChanged]) =>\n        this.#syncTabMeta(event.tabId),\n    );\n    tab.on(\n      TabEvents.TabVisibilityChanged,\n      (event: TabEventsMap[TabEvents.TabVisibilityChanged]) => {\n        if (event.isVisible) {\n          this.#activeTab(event.tabId);\n        }\n      },\n    );\n    tab.on(\n      TabEvents.TabDialogChanged,\n      (event: TabEventsMap[TabEvents.TabDialogChanged]) => {\n        if (event.isOpen) {\n          this.#updateTabDialog(tabId, {\n            type: event.type!,\n            message: event.message!,\n            defaultValue: event.defaultValue!,\n          });\n        } else {\n          this.#updateTabDialog(tabId, null);\n        }\n      },\n    );\n  }\n\n  // #endregion\n}\n"],"names":["_pptrBrowser","_tabs","_options","_operations","_isIntentionalDestroy","_cteateMutex","_createTab","_handleTargetCreated","_activeMutex","_activeTab","_closeMutex","_closeTab","_handleTargetDestroyed","_syncTabMeta","updateTabDialog","setupTabEvents","Tabs","browser","options","tabs","callback","subscribe","Map","page","tab","Tab","_initedTabs_find","existingPages","initTabTasks","pptrPage","validateNavigationUrl","tabId","syncTabMeta","isActive","initedTabs","Promise","activeTabId","result","activeTab","targetId","createTab","console","closeTab","closeTasks","Array","handleTargetCreated","handleTargetDestroyed","Mutex","proxy","proxyMap","Set","target","_","inactivePromises","id","tabInstance","isLoading","title","favicon","historyData","tabMeta","dialogMeta","currentTabMeta","updatedTabMeta","undefined","TabEvents","event"],"mappings":"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"}