@agent-infra/browser 0.1.6 → 0.2.0-alpha.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (186) hide show
  1. package/README.md +35 -52
  2. package/README.zh-CN.md +57 -0
  3. package/dist/actions/index.d.ts +3 -0
  4. package/dist/actions/index.d.ts.map +1 -0
  5. package/dist/actions/index.js +46 -0
  6. package/dist/actions/index.js.map +1 -0
  7. package/dist/actions/index.mjs +7 -0
  8. package/dist/actions/key-map.d.ts +28 -0
  9. package/dist/actions/key-map.d.ts.map +1 -0
  10. package/dist/actions/key-map.js +409 -0
  11. package/dist/actions/key-map.js.map +1 -0
  12. package/dist/actions/key-map.mjs +369 -0
  13. package/dist/actions/key-map.mjs.map +1 -0
  14. package/dist/actions/keyboard.d.ts +21 -0
  15. package/dist/actions/keyboard.d.ts.map +1 -0
  16. package/dist/actions/keyboard.js +196 -0
  17. package/dist/actions/keyboard.js.map +1 -0
  18. package/dist/actions/keyboard.mjs +152 -0
  19. package/dist/actions/keyboard.mjs.map +1 -0
  20. package/dist/actions/keyboard.test.d.ts +2 -0
  21. package/dist/actions/keyboard.test.d.ts.map +1 -0
  22. package/dist/actions/mouse.d.ts +19 -0
  23. package/dist/actions/mouse.d.ts.map +1 -0
  24. package/dist/actions/mouse.js +173 -0
  25. package/dist/actions/mouse.js.map +1 -0
  26. package/dist/actions/mouse.mjs +136 -0
  27. package/dist/actions/mouse.mjs.map +1 -0
  28. package/dist/browser/base.d.ts +47 -0
  29. package/dist/browser/base.d.ts.map +1 -0
  30. package/dist/browser/base.js +156 -0
  31. package/dist/browser/base.js.map +1 -0
  32. package/dist/browser/base.mjs +122 -0
  33. package/dist/browser/base.mjs.map +1 -0
  34. package/dist/browser/browser.d.ts +23 -0
  35. package/dist/browser/browser.d.ts.map +1 -0
  36. package/dist/browser/browser.js +183 -0
  37. package/dist/browser/browser.js.map +1 -0
  38. package/dist/browser/browser.mjs +149 -0
  39. package/dist/browser/browser.mjs.map +1 -0
  40. package/dist/env.d.ts +4 -0
  41. package/dist/env.d.ts.map +1 -0
  42. package/dist/env.js +96 -0
  43. package/dist/env.js.map +1 -0
  44. package/dist/env.mjs +62 -0
  45. package/dist/env.mjs.map +1 -0
  46. package/dist/index.node.d.ts +7 -0
  47. package/dist/index.node.d.ts.map +1 -0
  48. package/dist/index.node.js +106 -0
  49. package/dist/index.node.js.map +1 -0
  50. package/dist/index.node.mjs +10 -0
  51. package/dist/index.web.d.ts +7 -0
  52. package/dist/index.web.d.ts.map +1 -0
  53. package/dist/{index.js → index.web.js} +33 -20
  54. package/dist/index.web.js.map +1 -0
  55. package/dist/index.web.mjs +10 -0
  56. package/dist/injected-script/index.d.ts +3 -0
  57. package/dist/injected-script/index.d.ts.map +1 -0
  58. package/dist/injected-script/index.js +46 -0
  59. package/dist/injected-script/index.js.map +1 -0
  60. package/dist/injected-script/index.mjs +7 -0
  61. package/dist/injected-script/visibility.d.ts +2 -0
  62. package/dist/injected-script/visibility.d.ts.map +1 -0
  63. package/dist/injected-script/visibility.js +66 -0
  64. package/dist/injected-script/visibility.js.map +1 -0
  65. package/dist/injected-script/visibility.mjs +32 -0
  66. package/dist/injected-script/visibility.mjs.map +1 -0
  67. package/dist/injected-script/webdriver.d.ts +2 -0
  68. package/dist/injected-script/webdriver.d.ts.map +1 -0
  69. package/dist/injected-script/webdriver.js +71 -0
  70. package/dist/injected-script/webdriver.js.map +1 -0
  71. package/dist/injected-script/webdriver.mjs +37 -0
  72. package/dist/injected-script/webdriver.mjs.map +1 -0
  73. package/dist/polyfills/index.d.ts +2 -0
  74. package/dist/polyfills/index.d.ts.map +1 -0
  75. package/dist/polyfills/index.js +66 -0
  76. package/dist/polyfills/index.js.map +1 -0
  77. package/dist/polyfills/index.mjs +5 -0
  78. package/dist/polyfills/withResolvers.d.ts +2 -0
  79. package/dist/polyfills/withResolvers.d.ts.map +1 -0
  80. package/dist/polyfills/withResolvers.js +37 -0
  81. package/dist/polyfills/withResolvers.js.map +1 -0
  82. package/dist/polyfills/withResolvers.mjs +19 -0
  83. package/dist/polyfills/withResolvers.mjs.map +1 -0
  84. package/dist/tabs/dialog.d.ts +14 -0
  85. package/dist/tabs/dialog.d.ts.map +1 -0
  86. package/dist/tabs/dialog.js +175 -0
  87. package/dist/tabs/dialog.js.map +1 -0
  88. package/dist/tabs/dialog.mjs +141 -0
  89. package/dist/tabs/dialog.mjs.map +1 -0
  90. package/dist/tabs/index.d.ts +3 -0
  91. package/dist/tabs/index.d.ts.map +1 -0
  92. package/dist/tabs/index.js +46 -0
  93. package/dist/tabs/index.js.map +1 -0
  94. package/dist/tabs/index.mjs +7 -0
  95. package/dist/tabs/tab.d.ts +50 -0
  96. package/dist/tabs/tab.d.ts.map +1 -0
  97. package/dist/tabs/tab.js +579 -0
  98. package/dist/tabs/tab.js.map +1 -0
  99. package/dist/tabs/tab.mjs +545 -0
  100. package/dist/tabs/tab.mjs.map +1 -0
  101. package/dist/tabs/tabs.d.ts +21 -0
  102. package/dist/tabs/tabs.d.ts.map +1 -0
  103. package/dist/tabs/tabs.js +458 -0
  104. package/dist/tabs/tabs.js.map +1 -0
  105. package/dist/tabs/tabs.mjs +424 -0
  106. package/dist/tabs/tabs.mjs.map +1 -0
  107. package/dist/types/actions.d.ts +26 -0
  108. package/dist/types/actions.d.ts.map +1 -0
  109. package/dist/types/actions.js +24 -0
  110. package/dist/types/actions.js.map +1 -0
  111. package/dist/types/browser.d.ts +7 -0
  112. package/dist/types/browser.d.ts.map +1 -0
  113. package/dist/types/browser.js +24 -0
  114. package/dist/types/browser.js.map +1 -0
  115. package/dist/types/browser.mjs +4 -0
  116. package/dist/types/dialog.d.ts +7 -0
  117. package/dist/types/dialog.d.ts.map +1 -0
  118. package/dist/types/dialog.js +24 -0
  119. package/dist/types/dialog.js.map +1 -0
  120. package/dist/types/dialog.mjs +4 -0
  121. package/dist/types/env.d.ts +8 -0
  122. package/dist/types/env.d.ts.map +1 -0
  123. package/dist/{types.js → types/env.js} +1 -1
  124. package/dist/types/env.js.map +1 -0
  125. package/dist/types/env.mjs +4 -0
  126. package/dist/types/index.d.ts +6 -0
  127. package/dist/types/index.d.ts.map +1 -0
  128. package/dist/types/index.js +102 -0
  129. package/dist/types/index.js.map +1 -0
  130. package/dist/types/index.mjs +9 -0
  131. package/dist/types/tabs.d.ts +98 -0
  132. package/dist/types/tabs.d.ts.map +1 -0
  133. package/dist/types/tabs.js +48 -0
  134. package/dist/types/tabs.js.map +1 -0
  135. package/dist/types/tabs.mjs +14 -0
  136. package/dist/types/tabs.mjs.map +1 -0
  137. package/dist/utils/iife.d.ts +2 -0
  138. package/dist/utils/iife.d.ts.map +1 -0
  139. package/dist/utils/iife.js +48 -0
  140. package/dist/utils/iife.js.map +1 -0
  141. package/dist/utils/iife.mjs +14 -0
  142. package/dist/utils/iife.mjs.map +1 -0
  143. package/dist/utils/index.d.ts +4 -0
  144. package/dist/utils/index.d.ts.map +1 -0
  145. package/dist/utils/index.js +50 -0
  146. package/dist/utils/index.js.map +1 -0
  147. package/dist/utils/index.mjs +8 -0
  148. package/dist/utils/mutex.d.ts +21 -0
  149. package/dist/utils/mutex.d.ts.map +1 -0
  150. package/dist/utils/mutex.js +133 -0
  151. package/dist/utils/mutex.js.map +1 -0
  152. package/dist/utils/mutex.mjs +99 -0
  153. package/dist/utils/mutex.mjs.map +1 -0
  154. package/dist/utils/url.d.ts +7 -0
  155. package/dist/utils/url.d.ts.map +1 -0
  156. package/dist/utils/url.js +76 -0
  157. package/dist/utils/url.js.map +1 -0
  158. package/dist/utils/url.mjs +42 -0
  159. package/dist/utils/url.mjs.map +1 -0
  160. package/package.json +21 -13
  161. package/dist/base-browser.d.ts +0 -94
  162. package/dist/base-browser.d.ts.map +0 -1
  163. package/dist/base-browser.js +0 -189
  164. package/dist/base-browser.js.map +0 -1
  165. package/dist/base-browser.mjs +0 -155
  166. package/dist/base-browser.mjs.map +0 -1
  167. package/dist/index.d.ts +0 -15
  168. package/dist/index.d.ts.map +0 -1
  169. package/dist/index.js.map +0 -1
  170. package/dist/index.mjs +0 -8
  171. package/dist/local-browser.d.ts +0 -19
  172. package/dist/local-browser.d.ts.map +0 -1
  173. package/dist/local-browser.js +0 -134
  174. package/dist/local-browser.js.map +0 -1
  175. package/dist/local-browser.mjs +0 -100
  176. package/dist/local-browser.mjs.map +0 -1
  177. package/dist/remote-browser.d.ts +0 -49
  178. package/dist/remote-browser.d.ts.map +0 -1
  179. package/dist/remote-browser.js +0 -89
  180. package/dist/remote-browser.js.map +0 -1
  181. package/dist/remote-browser.mjs +0 -55
  182. package/dist/remote-browser.mjs.map +0 -1
  183. package/dist/types.d.ts +0 -158
  184. package/dist/types.d.ts.map +0 -1
  185. package/dist/types.js.map +0 -1
  186. /package/dist/{types.mjs → types/actions.mjs} +0 -0
@@ -0,0 +1,156 @@
1
+ /**
2
+ * Copyright (c) 2025 Bytedance, Inc. and its affiliates.
3
+ * SPDX-License-Identifier: Apache-2.0
4
+ */
5
+ "use strict";
6
+ var __webpack_require__ = {};
7
+ (()=>{
8
+ __webpack_require__.d = (exports1, definition)=>{
9
+ for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
10
+ enumerable: true,
11
+ get: definition[key]
12
+ });
13
+ };
14
+ })();
15
+ (()=>{
16
+ __webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
17
+ })();
18
+ (()=>{
19
+ __webpack_require__.r = (exports1)=>{
20
+ if ('undefined' != typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
21
+ value: 'Module'
22
+ });
23
+ Object.defineProperty(exports1, '__esModule', {
24
+ value: true
25
+ });
26
+ };
27
+ })();
28
+ var __webpack_exports__ = {};
29
+ __webpack_require__.r(__webpack_exports__);
30
+ __webpack_require__.d(__webpack_exports__, {
31
+ BaseBrowser: ()=>BaseBrowser
32
+ });
33
+ function _define_property(obj, key, value) {
34
+ if (key in obj) Object.defineProperty(obj, key, {
35
+ value: value,
36
+ enumerable: true,
37
+ configurable: true,
38
+ writable: true
39
+ });
40
+ else obj[key] = value;
41
+ return obj;
42
+ }
43
+ const MAX_RETRIES = 5;
44
+ const INITIAL_BACKOFF = 2000;
45
+ class BaseBrowser {
46
+ get tabs() {
47
+ if (!this._tabs) throw new Error('Tabs not initialized');
48
+ return this._tabs;
49
+ }
50
+ getTabsSnapshot() {
51
+ return this.tabs.getSnapshot();
52
+ }
53
+ subscribeTabChange(callback) {
54
+ return this.tabs.subscribe(callback);
55
+ }
56
+ getActiveTab() {
57
+ return this.tabs.getActiveTab();
58
+ }
59
+ async createTab() {
60
+ return this.tabs.createTab();
61
+ }
62
+ async activeTab(tabId) {
63
+ return this.tabs.activeTab(tabId);
64
+ }
65
+ async closeTab(tabId) {
66
+ return this.tabs.closeTab(tabId);
67
+ }
68
+ async destroyAllTabs() {
69
+ return this.tabs.destroy();
70
+ }
71
+ setUserAgent(options) {
72
+ this.userAgentInfo = options;
73
+ }
74
+ async getUserAgent() {
75
+ var _this_pptrBrowser;
76
+ if (this.userAgentInfo) return this.userAgentInfo;
77
+ const uaString = await (null == (_this_pptrBrowser = this.pptrBrowser) ? void 0 : _this_pptrBrowser.userAgent());
78
+ return {
79
+ userAgent: uaString
80
+ };
81
+ }
82
+ get envInfo() {
83
+ return this._envInfo;
84
+ }
85
+ async getBrowserMetaInfo() {
86
+ if (!this.pptrBrowser) throw new Error('Browser not initialized');
87
+ const userAgent = await this.pptrBrowser.userAgent();
88
+ return {
89
+ envInfo: this._envInfo,
90
+ userAgent,
91
+ viewport: this.defaultViewport,
92
+ wsEndpoint: this.wsEndpoint
93
+ };
94
+ }
95
+ async disconnect() {
96
+ var _this_pptrBrowser;
97
+ this.isIntentionalDisconnect = true;
98
+ if (this._tabs && 'function' == typeof this._tabs.destroy) await this._tabs.destroy();
99
+ await (null == (_this_pptrBrowser = this.pptrBrowser) ? void 0 : _this_pptrBrowser.disconnect());
100
+ }
101
+ setDefaultViewport(viewport) {
102
+ if (!viewport) return this.defaultViewport;
103
+ if ('object' == typeof viewport) this.defaultViewport = {
104
+ ...this.defaultViewport,
105
+ ...viewport
106
+ };
107
+ return this.defaultViewport;
108
+ }
109
+ setupAutoReconnect() {
110
+ if (!this.pptrBrowser) return;
111
+ this.pptrBrowser.on('disconnected', ()=>{
112
+ if (this.isIntentionalDisconnect) return;
113
+ this.attemptReconnect();
114
+ });
115
+ }
116
+ async attemptReconnect() {
117
+ if (this.reconnectAttempts >= MAX_RETRIES) return void console.error('Max reconnect attempts reached. Giving up reconnecting');
118
+ if (!this.wsEndpoint) return void console.error('No wsEndpoint found. Cannot reconnect');
119
+ const delay = INITIAL_BACKOFF * this.reconnectAttempts;
120
+ await new Promise((resolve)=>setTimeout(resolve, delay));
121
+ this.reconnectAttempts++;
122
+ try {
123
+ await this.performReconnect();
124
+ this.reconnectAttempts = 0;
125
+ } catch (error) {
126
+ if (this.reconnectAttempts < MAX_RETRIES) this.attemptReconnect();
127
+ else console.error('Failed to reconnect after max retries:', error);
128
+ }
129
+ }
130
+ constructor(){
131
+ _define_property(this, "pptrBrowser", void 0);
132
+ _define_property(this, "_tabs", void 0);
133
+ _define_property(this, "_envInfo", void 0);
134
+ _define_property(this, "wsEndpoint", '');
135
+ _define_property(this, "defaultViewport", {
136
+ width: 1280,
137
+ height: 1024,
138
+ deviceScaleFactor: 0,
139
+ isMobile: false,
140
+ isLandscape: false,
141
+ hasTouch: false
142
+ });
143
+ _define_property(this, "isIntentionalDisconnect", false);
144
+ _define_property(this, "reconnectAttempts", 0);
145
+ _define_property(this, "userAgentInfo", void 0);
146
+ }
147
+ }
148
+ exports.BaseBrowser = __webpack_exports__.BaseBrowser;
149
+ for(var __webpack_i__ in __webpack_exports__)if (-1 === [
150
+ "BaseBrowser"
151
+ ].indexOf(__webpack_i__)) exports[__webpack_i__] = __webpack_exports__[__webpack_i__];
152
+ Object.defineProperty(exports, '__esModule', {
153
+ value: true
154
+ });
155
+
156
+ //# sourceMappingURL=base.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser/base.js","sources":["webpack://@agent-infra/browser/webpack/runtime/define_property_getters","webpack://@agent-infra/browser/webpack/runtime/has_own_property","webpack://@agent-infra/browser/webpack/runtime/make_namespace_object","webpack://@agent-infra/browser/./src/browser/base.ts"],"sourcesContent":["__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n }\n }\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","/*\n * Copyright (c) 2025 Bytedance, Inc. and its affiliates.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type { Browser as pptrBrowser, Viewport } from 'puppeteer-core';\n\nimport type { Tabs } from '../tabs/tabs';\nimport type { EnvInfo, UserAgentInfo } from '../types';\n\nconst MAX_RETRIES = 5;\nconst INITIAL_BACKOFF = 2000;\n\n/**\n * Abstract base class for browser implementations\n * Contains common functionality shared between Browser and UIBrowser\n */\nexport abstract class BaseBrowser<TTabs extends Tabs> {\n public pptrBrowser?: pptrBrowser;\n public _tabs?: TTabs;\n public _envInfo?: EnvInfo;\n public wsEndpoint = '';\n public defaultViewport: Viewport = {\n width: 1280,\n height: 1024,\n deviceScaleFactor: 0,\n isMobile: false,\n isLandscape: false,\n hasTouch: false,\n };\n public isIntentionalDisconnect: boolean = false;\n public reconnectAttempts: number = 0;\n public userAgentInfo?: UserAgentInfo;\n\n constructor() {}\n\n // #region tabs\n\n private get tabs(): TTabs {\n if (!this._tabs) {\n throw new Error('Tabs not initialized');\n }\n return this._tabs;\n }\n\n getTabsSnapshot() {\n return this.tabs.getSnapshot();\n }\n\n subscribeTabChange(callback: () => void) {\n return this.tabs.subscribe(callback);\n }\n\n getActiveTab() {\n return this.tabs.getActiveTab();\n }\n\n async createTab() {\n return this.tabs.createTab();\n }\n\n async activeTab(tabId: string) {\n return this.tabs.activeTab(tabId);\n }\n\n async closeTab(tabId: string) {\n return this.tabs.closeTab(tabId);\n }\n\n async destroyAllTabs() {\n return this.tabs.destroy();\n }\n\n // #endregion\n\n // #region userAgent\n\n /**\n * Set the user agent for the browser and future tabs\n */\n setUserAgent(options: UserAgentInfo): void {\n this.userAgentInfo = options;\n }\n\n /**\n * Get the current user agent\n */\n async getUserAgent() {\n if (this.userAgentInfo) {\n return this.userAgentInfo;\n }\n\n const uaString = await this.pptrBrowser?.userAgent();\n return { userAgent: uaString };\n }\n\n // #endregion\n\n // #region other methods\n\n get envInfo(): any {\n return this._envInfo!;\n }\n\n async getBrowserMetaInfo() {\n if (!this.pptrBrowser) {\n throw new Error('Browser not initialized');\n }\n\n const userAgent = await this.pptrBrowser.userAgent();\n\n return {\n envInfo: this._envInfo!,\n userAgent,\n viewport: this.defaultViewport,\n wsEndpoint: this.wsEndpoint,\n };\n }\n\n async disconnect(): Promise<void> {\n this.isIntentionalDisconnect = true;\n if (this._tabs && typeof (this._tabs as any).destroy === 'function') {\n await (this._tabs as any).destroy();\n }\n await this.pptrBrowser?.disconnect();\n }\n\n public setDefaultViewport(viewport?: Viewport | null): Viewport {\n if (!viewport) {\n return this.defaultViewport;\n }\n\n if (typeof viewport === 'object') {\n this.defaultViewport = {\n ...this.defaultViewport,\n ...viewport,\n };\n }\n\n return this.defaultViewport;\n }\n\n // #endregion\n\n // #region reconnect logic\n\n public setupAutoReconnect(): void {\n if (!this.pptrBrowser) return;\n\n this.pptrBrowser.on('disconnected', () => {\n if (this.isIntentionalDisconnect) {\n return;\n }\n this.attemptReconnect();\n });\n }\n\n protected abstract performReconnect(): Promise<void>;\n\n protected async attemptReconnect(): Promise<void> {\n if (this.reconnectAttempts >= MAX_RETRIES) {\n console.error('Max reconnect attempts reached. Giving up reconnecting');\n return;\n }\n if (!this.wsEndpoint) {\n console.error('No wsEndpoint found. Cannot reconnect');\n return;\n }\n\n const delay = INITIAL_BACKOFF * this.reconnectAttempts;\n await new Promise((resolve) => setTimeout(resolve, delay));\n this.reconnectAttempts++;\n\n try {\n await this.performReconnect();\n this.reconnectAttempts = 0;\n } catch (error) {\n if (this.reconnectAttempts < MAX_RETRIES) {\n this.attemptReconnect();\n } else {\n console.error('Failed to reconnect after max retries:', error);\n }\n }\n }\n\n // #endregion\n}\n"],"names":["__webpack_require__","definition","key","Object","obj","prop","Symbol","MAX_RETRIES","INITIAL_BACKOFF","BaseBrowser","Error","callback","tabId","options","_this_pptrBrowser","uaString","userAgent","viewport","console","delay","Promise","resolve","setTimeout","error"],"mappings":"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"}
@@ -0,0 +1,122 @@
1
+ /**
2
+ * Copyright (c) 2025 Bytedance, Inc. and its affiliates.
3
+ * SPDX-License-Identifier: Apache-2.0
4
+ */
5
+ function _define_property(obj, key, value) {
6
+ if (key in obj) Object.defineProperty(obj, key, {
7
+ value: value,
8
+ enumerable: true,
9
+ configurable: true,
10
+ writable: true
11
+ });
12
+ else obj[key] = value;
13
+ return obj;
14
+ }
15
+ const MAX_RETRIES = 5;
16
+ const INITIAL_BACKOFF = 2000;
17
+ class BaseBrowser {
18
+ get tabs() {
19
+ if (!this._tabs) throw new Error('Tabs not initialized');
20
+ return this._tabs;
21
+ }
22
+ getTabsSnapshot() {
23
+ return this.tabs.getSnapshot();
24
+ }
25
+ subscribeTabChange(callback) {
26
+ return this.tabs.subscribe(callback);
27
+ }
28
+ getActiveTab() {
29
+ return this.tabs.getActiveTab();
30
+ }
31
+ async createTab() {
32
+ return this.tabs.createTab();
33
+ }
34
+ async activeTab(tabId) {
35
+ return this.tabs.activeTab(tabId);
36
+ }
37
+ async closeTab(tabId) {
38
+ return this.tabs.closeTab(tabId);
39
+ }
40
+ async destroyAllTabs() {
41
+ return this.tabs.destroy();
42
+ }
43
+ setUserAgent(options) {
44
+ this.userAgentInfo = options;
45
+ }
46
+ async getUserAgent() {
47
+ var _this_pptrBrowser;
48
+ if (this.userAgentInfo) return this.userAgentInfo;
49
+ const uaString = await (null == (_this_pptrBrowser = this.pptrBrowser) ? void 0 : _this_pptrBrowser.userAgent());
50
+ return {
51
+ userAgent: uaString
52
+ };
53
+ }
54
+ get envInfo() {
55
+ return this._envInfo;
56
+ }
57
+ async getBrowserMetaInfo() {
58
+ if (!this.pptrBrowser) throw new Error('Browser not initialized');
59
+ const userAgent = await this.pptrBrowser.userAgent();
60
+ return {
61
+ envInfo: this._envInfo,
62
+ userAgent,
63
+ viewport: this.defaultViewport,
64
+ wsEndpoint: this.wsEndpoint
65
+ };
66
+ }
67
+ async disconnect() {
68
+ var _this_pptrBrowser;
69
+ this.isIntentionalDisconnect = true;
70
+ if (this._tabs && 'function' == typeof this._tabs.destroy) await this._tabs.destroy();
71
+ await (null == (_this_pptrBrowser = this.pptrBrowser) ? void 0 : _this_pptrBrowser.disconnect());
72
+ }
73
+ setDefaultViewport(viewport) {
74
+ if (!viewport) return this.defaultViewport;
75
+ if ('object' == typeof viewport) this.defaultViewport = {
76
+ ...this.defaultViewport,
77
+ ...viewport
78
+ };
79
+ return this.defaultViewport;
80
+ }
81
+ setupAutoReconnect() {
82
+ if (!this.pptrBrowser) return;
83
+ this.pptrBrowser.on('disconnected', ()=>{
84
+ if (this.isIntentionalDisconnect) return;
85
+ this.attemptReconnect();
86
+ });
87
+ }
88
+ async attemptReconnect() {
89
+ if (this.reconnectAttempts >= MAX_RETRIES) return void console.error('Max reconnect attempts reached. Giving up reconnecting');
90
+ if (!this.wsEndpoint) return void console.error('No wsEndpoint found. Cannot reconnect');
91
+ const delay = INITIAL_BACKOFF * this.reconnectAttempts;
92
+ await new Promise((resolve)=>setTimeout(resolve, delay));
93
+ this.reconnectAttempts++;
94
+ try {
95
+ await this.performReconnect();
96
+ this.reconnectAttempts = 0;
97
+ } catch (error) {
98
+ if (this.reconnectAttempts < MAX_RETRIES) this.attemptReconnect();
99
+ else console.error('Failed to reconnect after max retries:', error);
100
+ }
101
+ }
102
+ constructor(){
103
+ _define_property(this, "pptrBrowser", void 0);
104
+ _define_property(this, "_tabs", void 0);
105
+ _define_property(this, "_envInfo", void 0);
106
+ _define_property(this, "wsEndpoint", '');
107
+ _define_property(this, "defaultViewport", {
108
+ width: 1280,
109
+ height: 1024,
110
+ deviceScaleFactor: 0,
111
+ isMobile: false,
112
+ isLandscape: false,
113
+ hasTouch: false
114
+ });
115
+ _define_property(this, "isIntentionalDisconnect", false);
116
+ _define_property(this, "reconnectAttempts", 0);
117
+ _define_property(this, "userAgentInfo", void 0);
118
+ }
119
+ }
120
+ export { BaseBrowser };
121
+
122
+ //# sourceMappingURL=base.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser/base.mjs","sources":["webpack://@agent-infra/browser/./src/browser/base.ts"],"sourcesContent":["/*\n * Copyright (c) 2025 Bytedance, Inc. and its affiliates.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type { Browser as pptrBrowser, Viewport } from 'puppeteer-core';\n\nimport type { Tabs } from '../tabs/tabs';\nimport type { EnvInfo, UserAgentInfo } from '../types';\n\nconst MAX_RETRIES = 5;\nconst INITIAL_BACKOFF = 2000;\n\n/**\n * Abstract base class for browser implementations\n * Contains common functionality shared between Browser and UIBrowser\n */\nexport abstract class BaseBrowser<TTabs extends Tabs> {\n public pptrBrowser?: pptrBrowser;\n public _tabs?: TTabs;\n public _envInfo?: EnvInfo;\n public wsEndpoint = '';\n public defaultViewport: Viewport = {\n width: 1280,\n height: 1024,\n deviceScaleFactor: 0,\n isMobile: false,\n isLandscape: false,\n hasTouch: false,\n };\n public isIntentionalDisconnect: boolean = false;\n public reconnectAttempts: number = 0;\n public userAgentInfo?: UserAgentInfo;\n\n constructor() {}\n\n // #region tabs\n\n private get tabs(): TTabs {\n if (!this._tabs) {\n throw new Error('Tabs not initialized');\n }\n return this._tabs;\n }\n\n getTabsSnapshot() {\n return this.tabs.getSnapshot();\n }\n\n subscribeTabChange(callback: () => void) {\n return this.tabs.subscribe(callback);\n }\n\n getActiveTab() {\n return this.tabs.getActiveTab();\n }\n\n async createTab() {\n return this.tabs.createTab();\n }\n\n async activeTab(tabId: string) {\n return this.tabs.activeTab(tabId);\n }\n\n async closeTab(tabId: string) {\n return this.tabs.closeTab(tabId);\n }\n\n async destroyAllTabs() {\n return this.tabs.destroy();\n }\n\n // #endregion\n\n // #region userAgent\n\n /**\n * Set the user agent for the browser and future tabs\n */\n setUserAgent(options: UserAgentInfo): void {\n this.userAgentInfo = options;\n }\n\n /**\n * Get the current user agent\n */\n async getUserAgent() {\n if (this.userAgentInfo) {\n return this.userAgentInfo;\n }\n\n const uaString = await this.pptrBrowser?.userAgent();\n return { userAgent: uaString };\n }\n\n // #endregion\n\n // #region other methods\n\n get envInfo(): any {\n return this._envInfo!;\n }\n\n async getBrowserMetaInfo() {\n if (!this.pptrBrowser) {\n throw new Error('Browser not initialized');\n }\n\n const userAgent = await this.pptrBrowser.userAgent();\n\n return {\n envInfo: this._envInfo!,\n userAgent,\n viewport: this.defaultViewport,\n wsEndpoint: this.wsEndpoint,\n };\n }\n\n async disconnect(): Promise<void> {\n this.isIntentionalDisconnect = true;\n if (this._tabs && typeof (this._tabs as any).destroy === 'function') {\n await (this._tabs as any).destroy();\n }\n await this.pptrBrowser?.disconnect();\n }\n\n public setDefaultViewport(viewport?: Viewport | null): Viewport {\n if (!viewport) {\n return this.defaultViewport;\n }\n\n if (typeof viewport === 'object') {\n this.defaultViewport = {\n ...this.defaultViewport,\n ...viewport,\n };\n }\n\n return this.defaultViewport;\n }\n\n // #endregion\n\n // #region reconnect logic\n\n public setupAutoReconnect(): void {\n if (!this.pptrBrowser) return;\n\n this.pptrBrowser.on('disconnected', () => {\n if (this.isIntentionalDisconnect) {\n return;\n }\n this.attemptReconnect();\n });\n }\n\n protected abstract performReconnect(): Promise<void>;\n\n protected async attemptReconnect(): Promise<void> {\n if (this.reconnectAttempts >= MAX_RETRIES) {\n console.error('Max reconnect attempts reached. Giving up reconnecting');\n return;\n }\n if (!this.wsEndpoint) {\n console.error('No wsEndpoint found. Cannot reconnect');\n return;\n }\n\n const delay = INITIAL_BACKOFF * this.reconnectAttempts;\n await new Promise((resolve) => setTimeout(resolve, delay));\n this.reconnectAttempts++;\n\n try {\n await this.performReconnect();\n this.reconnectAttempts = 0;\n } catch (error) {\n if (this.reconnectAttempts < MAX_RETRIES) {\n this.attemptReconnect();\n } else {\n console.error('Failed to reconnect after max retries:', error);\n }\n }\n }\n\n // #endregion\n}\n"],"names":["MAX_RETRIES","INITIAL_BACKOFF","BaseBrowser","Error","callback","tabId","options","_this_pptrBrowser","uaString","userAgent","viewport","console","delay","Promise","resolve","setTimeout","error"],"mappings":";;;;AAGC;;;;;;;;;;AAOD,MAAMA,cAAc;AACpB,MAAMC,kBAAkB;AAMjB,MAAeC;IAqBpB,IAAY,OAAc;QACxB,IAAI,CAAC,IAAI,CAAC,KAAK,EACb,MAAM,IAAIC,MAAM;QAElB,OAAO,IAAI,CAAC,KAAK;IACnB;IAEA,kBAAkB;QAChB,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW;IAC9B;IAEA,mBAAmBC,QAAoB,EAAE;QACvC,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,CAACA;IAC7B;IAEA,eAAe;QACb,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY;IAC/B;IAEA,MAAM,YAAY;QAChB,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS;IAC5B;IAEA,MAAM,UAAUC,KAAa,EAAE;QAC7B,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,CAACA;IAC7B;IAEA,MAAM,SAASA,KAAa,EAAE;QAC5B,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,CAACA;IAC5B;IAEA,MAAM,iBAAiB;QACrB,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO;IAC1B;IASA,aAAaC,OAAsB,EAAQ;QACzC,IAAI,CAAC,aAAa,GAAGA;IACvB;IAKA,MAAM,eAAe;YAKIC;QAJvB,IAAI,IAAI,CAAC,aAAa,EACpB,OAAO,IAAI,CAAC,aAAa;QAG3B,MAAMC,WAAW,eAAMD,CAAAA,oBAAAA,IAAI,CAAC,WAAW,AAAD,IAAfA,KAAAA,IAAAA,kBAAkB,SAAS,EAAC;QACnD,OAAO;YAAE,WAAWC;QAAS;IAC/B;IAMA,IAAI,UAAe;QACjB,OAAO,IAAI,CAAC,QAAQ;IACtB;IAEA,MAAM,qBAAqB;QACzB,IAAI,CAAC,IAAI,CAAC,WAAW,EACnB,MAAM,IAAIL,MAAM;QAGlB,MAAMM,YAAY,MAAM,IAAI,CAAC,WAAW,CAAC,SAAS;QAElD,OAAO;YACL,SAAS,IAAI,CAAC,QAAQ;YACtBA;YACA,UAAU,IAAI,CAAC,eAAe;YAC9B,YAAY,IAAI,CAAC,UAAU;QAC7B;IACF;IAEA,MAAM,aAA4B;YAK1BF;QAJN,IAAI,CAAC,uBAAuB,GAAG;QAC/B,IAAI,IAAI,CAAC,KAAK,IAAI,AAAuC,cAAvC,OAAQ,IAAI,CAAC,KAAK,CAAS,OAAO,EAClD,MAAO,IAAI,CAAC,KAAK,CAAS,OAAO;QAEnC,eAAMA,CAAAA,oBAAAA,IAAI,CAAC,WAAW,AAAD,IAAfA,KAAAA,IAAAA,kBAAkB,UAAU,EAAC;IACrC;IAEO,mBAAmBG,QAA0B,EAAY;QAC9D,IAAI,CAACA,UACH,OAAO,IAAI,CAAC,eAAe;QAG7B,IAAI,AAAoB,YAApB,OAAOA,UACT,IAAI,CAAC,eAAe,GAAG;YACrB,GAAG,IAAI,CAAC,eAAe;YACvB,GAAGA,QAAQ;QACb;QAGF,OAAO,IAAI,CAAC,eAAe;IAC7B;IAMO,qBAA2B;QAChC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;QAEvB,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,gBAAgB;YAClC,IAAI,IAAI,CAAC,uBAAuB,EAC9B;YAEF,IAAI,CAAC,gBAAgB;QACvB;IACF;IAIA,MAAgB,mBAAkC;QAChD,IAAI,IAAI,CAAC,iBAAiB,IAAIV,aAAa,YACzCW,QAAQ,KAAK,CAAC;QAGhB,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,YACpBA,QAAQ,KAAK,CAAC;QAIhB,MAAMC,QAAQX,kBAAkB,IAAI,CAAC,iBAAiB;QACtD,MAAM,IAAIY,QAAQ,CAACC,UAAYC,WAAWD,SAASF;QACnD,IAAI,CAAC,iBAAiB;QAEtB,IAAI;YACF,MAAM,IAAI,CAAC,gBAAgB;YAC3B,IAAI,CAAC,iBAAiB,GAAG;QAC3B,EAAE,OAAOI,OAAO;YACd,IAAI,IAAI,CAAC,iBAAiB,GAAGhB,aAC3B,IAAI,CAAC,gBAAgB;iBAErBW,QAAQ,KAAK,CAAC,0CAA0CK;QAE5D;IACF;IArJA,aAAc;QAhBd,uBAAO,eAAP;QACA,uBAAO,SAAP;QACA,uBAAO,YAAP;QACA,uBAAO,cAAa;QACpB,uBAAO,mBAA4B;YACjC,OAAO;YACP,QAAQ;YACR,mBAAmB;YACnB,UAAU;YACV,aAAa;YACb,UAAU;QACZ;QACA,uBAAO,2BAAmC;QAC1C,uBAAO,qBAA4B;QACnC,uBAAO,iBAAP;IAEe;AAwJjB"}
@@ -0,0 +1,23 @@
1
+ import { Tabs } from '../tabs/tabs';
2
+ import { BaseBrowser } from './base';
3
+ import type { Cookie, CookieData, DeleteCookiesRequest, LaunchOptions } from 'puppeteer-core';
4
+ export declare class Browser extends BaseBrowser<Tabs> {
5
+ #private;
6
+ /**
7
+ * Create a browser instance (launch or connect based on options)
8
+ */
9
+ static create(options?: LaunchOptions): Promise<Browser>;
10
+ constructor();
11
+ /**
12
+ * cookies API
13
+ *
14
+ * @doc: https://pptr.dev/guides/cookies#setting-cookies
15
+ */
16
+ cookies(): Promise<Cookie[]>;
17
+ setCookie(...cookies: CookieData[]): Promise<void>;
18
+ deleteCookie(...cookies: Cookie[]): Promise<void>;
19
+ deleteMatchingCookies(...filters: DeleteCookiesRequest[]): Promise<void>;
20
+ close(): Promise<void>;
21
+ performReconnect(): Promise<void>;
22
+ }
23
+ //# sourceMappingURL=browser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../src/browser/browser.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEpC,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAErC,OAAO,KAAK,EACV,MAAM,EACN,UAAU,EACV,oBAAoB,EACpB,aAAa,EACd,MAAM,gBAAgB,CAAC;AAExB,qBAAa,OAAQ,SAAQ,WAAW,CAAC,IAAI,CAAC;;IAC5C;;OAEG;WACU,MAAM,CAAC,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,OAAO,CAAC;;IAYlE;;;;OAIG;IAEH,OAAO;IAIP,SAAS,CAAC,GAAG,OAAO,EAAE,UAAU,EAAE;IAIlC,YAAY,CAAC,GAAG,OAAO,EAAE,MAAM,EAAE;IAIjC,qBAAqB,CAAC,GAAG,OAAO,EAAE,oBAAoB,EAAE;IAQlD,KAAK;IA0JI,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC;CAoBjD"}
@@ -0,0 +1,183 @@
1
+ /**
2
+ * Copyright (c) 2025 Bytedance, Inc. and its affiliates.
3
+ * SPDX-License-Identifier: Apache-2.0
4
+ */
5
+ "use strict";
6
+ var __webpack_require__ = {};
7
+ (()=>{
8
+ __webpack_require__.d = (exports1, definition)=>{
9
+ for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
10
+ enumerable: true,
11
+ get: definition[key]
12
+ });
13
+ };
14
+ })();
15
+ (()=>{
16
+ __webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
17
+ })();
18
+ (()=>{
19
+ __webpack_require__.r = (exports1)=>{
20
+ if ('undefined' != typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
21
+ value: 'Module'
22
+ });
23
+ Object.defineProperty(exports1, '__esModule', {
24
+ value: true
25
+ });
26
+ };
27
+ })();
28
+ var __webpack_exports__ = {};
29
+ __webpack_require__.r(__webpack_exports__);
30
+ __webpack_require__.d(__webpack_exports__, {
31
+ Browser: ()=>Browser
32
+ });
33
+ const external_puppeteer_core_namespaceObject = require("puppeteer-core");
34
+ const browser_finder_namespaceObject = require("@agent-infra/browser-finder");
35
+ const tabs_js_namespaceObject = require("../tabs/tabs.js");
36
+ const external_env_js_namespaceObject = require("../env.js");
37
+ const external_base_js_namespaceObject = require("./base.js");
38
+ function _check_private_redeclaration(obj, privateCollection) {
39
+ if (privateCollection.has(obj)) throw new TypeError("Cannot initialize the same private elements twice on an object");
40
+ }
41
+ function _class_private_method_get(receiver, privateSet, fn) {
42
+ if (!privateSet.has(receiver)) throw new TypeError("attempted to get private field on non-instance");
43
+ return fn;
44
+ }
45
+ function _class_private_method_init(obj, privateSet) {
46
+ _check_private_redeclaration(obj, privateSet);
47
+ privateSet.add(obj);
48
+ }
49
+ var _init = /*#__PURE__*/ new WeakSet(), _processOptions = /*#__PURE__*/ new WeakSet(), _isConnectMode = /*#__PURE__*/ new WeakSet(), _launch = /*#__PURE__*/ new WeakSet(), _connect = /*#__PURE__*/ new WeakSet();
50
+ class Browser extends external_base_js_namespaceObject.BaseBrowser {
51
+ static async create(options = {}) {
52
+ const browser = new Browser();
53
+ await _class_private_method_get(browser, _init, init).call(browser, options);
54
+ return browser;
55
+ }
56
+ cookies() {
57
+ return this.pptrBrowser.cookies();
58
+ }
59
+ setCookie(...cookies) {
60
+ return this.pptrBrowser.setCookie(...cookies);
61
+ }
62
+ deleteCookie(...cookies) {
63
+ return this.pptrBrowser.deleteCookie(...cookies);
64
+ }
65
+ deleteMatchingCookies(...filters) {
66
+ return this.pptrBrowser.deleteMatchingCookies(...filters);
67
+ }
68
+ async close() {
69
+ var _this_pptrBrowser;
70
+ this.isIntentionalDisconnect = true;
71
+ await this.destroyAllTabs();
72
+ await (null == (_this_pptrBrowser = this.pptrBrowser) ? void 0 : _this_pptrBrowser.close());
73
+ }
74
+ async performReconnect() {
75
+ const connectOptions = {
76
+ browserWSEndpoint: this.wsEndpoint,
77
+ defaultViewport: this.defaultViewport
78
+ };
79
+ this.pptrBrowser = await (0, external_puppeteer_core_namespaceObject.connect)(connectOptions);
80
+ this.wsEndpoint = this.pptrBrowser.wsEndpoint();
81
+ this._tabs = await tabs_js_namespaceObject.Tabs.create(this.pptrBrowser, {
82
+ viewport: this.defaultViewport,
83
+ envInfo: this._envInfo
84
+ });
85
+ const activeTab = this.getActiveTab();
86
+ if (activeTab) await activeTab._active();
87
+ }
88
+ constructor(){
89
+ super(), _class_private_method_init(this, _init), _class_private_method_init(this, _processOptions), _class_private_method_init(this, _isConnectMode), _class_private_method_init(this, _launch), _class_private_method_init(this, _connect);
90
+ }
91
+ }
92
+ async function init(options) {
93
+ const processedOptions = _class_private_method_get(this, _processOptions, processOptions).call(this, options);
94
+ if (_class_private_method_get(this, _isConnectMode, isConnectMode).call(this, processedOptions)) await _class_private_method_get(this, _connect, connect1).call(this, processedOptions);
95
+ else await _class_private_method_get(this, _launch, launch1).call(this, processedOptions);
96
+ }
97
+ function processOptions(options) {
98
+ var _processedOptions_executablePath;
99
+ const processedOptions = {
100
+ ...options
101
+ };
102
+ const findBrowserPath = ()=>{
103
+ const finder = new browser_finder_namespaceObject.BrowserFinder();
104
+ const browsers = [
105
+ 'chrome',
106
+ 'edge'
107
+ ];
108
+ const foundBrowser = browsers.find((browser)=>{
109
+ try {
110
+ finder.findBrowser(browser);
111
+ return true;
112
+ } catch {
113
+ return false;
114
+ }
115
+ });
116
+ if (!foundBrowser) throw new Error('No Chrome or Edge browser found. Please install Chrome or Edge browser first.');
117
+ return finder.findBrowser(foundBrowser).path;
118
+ };
119
+ const setArgs = ()=>{
120
+ const args = processedOptions.args || [];
121
+ const defaultArgs = [
122
+ '--mute-audio',
123
+ '--no-default-browser-check',
124
+ '--ash-no-nudges'
125
+ ];
126
+ const windowSizeArg = `--window-size=${this.defaultViewport.width},${this.defaultViewport.height + 90}`;
127
+ for (const arg of defaultArgs)if (!args.includes(arg)) args.push(arg);
128
+ if (!args.find((arg)=>arg.startsWith('--window-size'))) args.push(windowSizeArg);
129
+ processedOptions.args = args;
130
+ const enableAutomationArg = '--enable-automation';
131
+ if (processedOptions.ignoreDefaultArgs) {
132
+ if (Array.isArray(processedOptions.ignoreDefaultArgs)) {
133
+ const ignoreArgs = processedOptions.ignoreDefaultArgs;
134
+ if (!ignoreArgs.includes(enableAutomationArg)) ignoreArgs.push(enableAutomationArg);
135
+ }
136
+ } else processedOptions.ignoreDefaultArgs = [
137
+ enableAutomationArg
138
+ ];
139
+ };
140
+ processedOptions.defaultViewport = this.setDefaultViewport(options.defaultViewport);
141
+ if ('firefox' === processedOptions.browser || (null == (_processedOptions_executablePath = processedOptions.executablePath) ? void 0 : _processedOptions_executablePath.toLowerCase().includes('firefox')) || 'webDriverBiDi' === processedOptions.protocol) throw new Error('Firefox is not supported. This package is based on CDP (Chrome DevTools Protocol).');
142
+ if (!_class_private_method_get(this, _isConnectMode, isConnectMode).call(this, processedOptions) && !processedOptions.executablePath) {
143
+ processedOptions.executablePath = findBrowserPath();
144
+ setArgs();
145
+ }
146
+ return processedOptions;
147
+ }
148
+ function isConnectMode(options) {
149
+ return !!(options.browserWSEndpoint || options.browserURL);
150
+ }
151
+ async function launch1(options) {
152
+ this.pptrBrowser = await (0, external_puppeteer_core_namespaceObject.launch)(options);
153
+ if (!this.pptrBrowser) throw new Error('Puppeteer browser not launch');
154
+ this.wsEndpoint = this.pptrBrowser.wsEndpoint();
155
+ this._envInfo = await (0, external_env_js_namespaceObject.getEnvInfo)(this.pptrBrowser);
156
+ this._tabs = await tabs_js_namespaceObject.Tabs.create(this.pptrBrowser, {
157
+ viewport: this.defaultViewport,
158
+ envInfo: this._envInfo,
159
+ userAgentInfo: this.userAgentInfo
160
+ });
161
+ this.setupAutoReconnect();
162
+ }
163
+ async function connect1(options) {
164
+ this.pptrBrowser = await (0, external_puppeteer_core_namespaceObject.connect)(options);
165
+ if (!this.pptrBrowser) throw new Error('Puppeteer browser not connect');
166
+ this.wsEndpoint = this.pptrBrowser.wsEndpoint();
167
+ this._envInfo = await (0, external_env_js_namespaceObject.getEnvInfo)(this.pptrBrowser);
168
+ this._tabs = await tabs_js_namespaceObject.Tabs.create(this.pptrBrowser, {
169
+ viewport: this.defaultViewport,
170
+ envInfo: this._envInfo,
171
+ userAgentInfo: this.userAgentInfo
172
+ });
173
+ this.setupAutoReconnect();
174
+ }
175
+ exports.Browser = __webpack_exports__.Browser;
176
+ for(var __webpack_i__ in __webpack_exports__)if (-1 === [
177
+ "Browser"
178
+ ].indexOf(__webpack_i__)) exports[__webpack_i__] = __webpack_exports__[__webpack_i__];
179
+ Object.defineProperty(exports, '__esModule', {
180
+ value: true
181
+ });
182
+
183
+ //# sourceMappingURL=browser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser/browser.js","sources":["webpack://@agent-infra/browser/webpack/runtime/define_property_getters","webpack://@agent-infra/browser/webpack/runtime/has_own_property","webpack://@agent-infra/browser/webpack/runtime/make_namespace_object","webpack://@agent-infra/browser/./src/browser/browser.ts"],"sourcesContent":["__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n }\n }\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","/*\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(options: LaunchOptions = {}): Promise<Browser> {\n const browser = new Browser();\n await browser.#init(options);\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":["__webpack_require__","definition","key","Object","obj","prop","Symbol","_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":";;;;;;;IAAAA,oBAAoB,CAAC,GAAG,CAAC,UAASC;QACjC,IAAI,IAAIC,OAAOD,WACR,IAAGD,oBAAoB,CAAC,CAACC,YAAYC,QAAQ,CAACF,oBAAoB,CAAC,CAAC,UAASE,MACzEC,OAAO,cAAc,CAAC,UAASD,KAAK;YAAE,YAAY;YAAM,KAAKD,UAAU,CAACC,IAAI;QAAC;IAGzF;;;ICNAF,oBAAoB,CAAC,GAAG,CAACI,KAAKC,OAAUF,OAAO,SAAS,CAAC,cAAc,CAAC,IAAI,CAACC,KAAKC;;;ICClFL,oBAAoB,CAAC,GAAG,CAAC;QACxB,IAAG,AAAkB,eAAlB,OAAOM,UAA0BA,OAAO,WAAW,EACrDH,OAAO,cAAc,CAAC,UAASG,OAAO,WAAW,EAAE;YAAE,OAAO;QAAS;QAEtEH,OAAO,cAAc,CAAC,UAAS,cAAc;YAAE,OAAO;QAAK;IAC5D;;;;;;;;;;;;ACHC;;;;;;;;;;;IAoEOI,QAAAA,WAAAA,GAAAA,IAAAA,WAUNC,kBAAAA,WAAAA,GAAAA,IAAAA,WA6FAC,iBAAAA,WAAAA,GAAAA,IAAAA,WAIMC,UAAAA,WAAAA,GAAAA,IAAAA,WAkBAC,WAAAA,WAAAA,GAAAA,IAAAA;AAlLD,MAAMC,gBAAgBC,iCAAAA,WAAWA;IAItC,aAAa,OAAOC,UAAyB,CAAC,CAAC,EAAoB;QACjE,MAAMC,UAAU,IAAIH;QACpB,MAAMG,0BAAAA,SAAQC,OAAAA,MAAAA,IAAAA,CAARD,SAAcD;QACpB,OAAOC;IACT;IAcA,UAAU;QACR,OAAO,IAAI,CAAC,WAAW,CAAE,OAAO;IAClC;IAEA,UAAU,GAAGE,OAAqB,EAAE;QAClC,OAAO,IAAI,CAAC,WAAW,CAAE,SAAS,IAAIA;IACxC;IAEA,aAAa,GAAGA,OAAiB,EAAE;QACjC,OAAO,IAAI,CAAC,WAAW,CAAE,YAAY,IAAIA;IAC3C;IAEA,sBAAsB,GAAGC,OAA+B,EAAE;QACxD,OAAO,IAAI,CAAC,WAAW,CAAE,qBAAqB,IAAIA;IACpD;IAMA,MAAM,QAAQ;YAINC;QAHN,IAAI,CAAC,uBAAuB,GAAG;QAE/B,MAAM,IAAI,CAAC,cAAc;QACzB,eAAMA,CAAAA,oBAAAA,IAAI,CAAC,WAAW,AAAD,IAAfA,KAAAA,IAAAA,kBAAkB,KAAK,EAAC;IAChC;IAqJA,MAAe,mBAAkC;QAC/C,MAAMC,iBAAiB;YACrB,mBAAmB,IAAI,CAAC,UAAU;YAClC,iBAAiB,IAAI,CAAC,eAAe;QACvC;QACA,IAAI,CAAC,WAAW,GAAG,MAAMC,AAAAA,IAAAA,wCAAAA,OAAAA,AAAAA,EAAQD;QAEjC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,UAAU;QAC7C,IAAI,CAAC,KAAK,GAAG,MAAME,wBAAAA,IAAAA,CAAAA,MAAW,CAAC,IAAI,CAAC,WAAW,EAAE;YAC/C,UAAU,IAAI,CAAC,eAAe;YAC9B,SAAS,IAAI,CAAC,QAAQ;QACxB;QAEA,MAAMC,YAAY,IAAI,CAAC,YAAY;QACnC,IAAIA,WACF,MAAMA,UAAU,OAAO;IAE3B;IA3MA,aAAc;QACZ,KAAK,IA0CPP,2BAAAA,IAAAA,EAAMT,QAUNC,2BAAAA,IAAAA,EAAAA,kBA6FAC,2BAAAA,IAAAA,EAAAA,iBAIAe,2BAAAA,IAAAA,EAAMd,UAkBNe,2BAAAA,IAAAA,EAAMd;IAtKN;AA4MF;AAnKEK,eAAAA,KAAYF,OAAsB;IAChC,MAAMY,mBAAmB,8BAAI,EAAClB,iBAAAA,gBAAAA,IAAAA,CAAL,IAAI,EAAiBM;IAE9C,IAAI,8BAAI,EAACL,gBAAAA,eAAAA,IAAAA,CAAL,IAAI,EAAgBiB,mBACtB,MAAM,8BAAI,EAACD,UAAAA,UAAAA,IAAAA,CAAL,IAAI,EAAUC;SAEpB,MAAM,8BAAI,EAACF,SAAAA,SAAAA,IAAAA,CAAL,IAAI,EAASE;AAEvB;AAEAlB,SAAAA,eAAgBM,OAAsB;QAuElCa;IAtEF,MAAMD,mBAAmB;QAAE,GAAGZ,OAAO;IAAC;IAEtC,MAAMc,kBAAkB;QACtB,MAAMC,SAAS,IAAIC,+BAAAA,aAAaA;QAChC,MAAMC,WAAW;YAAC;YAAU;SAAO;QAEnC,MAAMC,eAAeD,SAAS,IAAI,CAAC,CAAChB;YAClC,IAAI;gBACFc,OAAO,WAAW,CAACd;gBACnB,OAAO;YACT,EAAE,OAAM;gBACN,OAAO;YACT;QACF;QAEA,IAAI,CAACiB,cACH,MAAM,IAAIC,MACR;QAIJ,OAAOJ,OAAO,WAAW,CAACG,cAAc,IAAI;IAC9C;IAEA,MAAME,UAAU;QACd,MAAMC,OAAOT,iBAAiB,IAAI,IAAI,EAAE;QAExC,MAAMU,cAAc;YAClB;YACA;YACA;SACD;QAGD,MAAMC,gBAAgB,CAAC,cAAc,EAAE,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,eAAe,CAAC,MAAM,GAAG,IAAI;QAGvG,KAAK,MAAMC,OAAOF,YAChB,IAAI,CAACD,KAAK,QAAQ,CAACG,MACjBH,KAAK,IAAI,CAACG;QAGd,IAAI,CAACH,KAAK,IAAI,CAAC,CAACG,MAAQA,IAAI,UAAU,CAAC,mBACrCH,KAAK,IAAI,CAACE;QAGZX,iBAAiB,IAAI,GAAGS;QAGxB,MAAMI,sBAAsB;QAC5B,IAAIb,iBAAiB,iBAAiB,EACpC;YAAA,IAAIc,MAAM,OAAO,CAACd,iBAAiB,iBAAiB,GAAG;gBACrD,MAAMe,aAAaf,iBAAiB,iBAAiB;gBACrD,IAAI,CAACe,WAAW,QAAQ,CAACF,sBACvBE,WAAW,IAAI,CAACF;YAEpB;QAAA,OAEAb,iBAAiB,iBAAiB,GAAG;YAACa;SAAoB;IAE9D;IAGAb,iBAAiB,eAAe,GAAG,IAAI,CAAC,kBAAkB,CACxDZ,QAAQ,eAAe;IAIzB,IACEY,AAA6B,cAA7BA,iBAAiB,OAAO,IAAK,SAC7BC,CAAAA,mCAAAA,iBAAiB,cAAc,AAAD,IAA9BA,KAAAA,IAAAA,iCAAiC,WAAW,GAAG,QAAQ,CAAC,UAAS,KACjED,AAA8B,oBAA9BA,iBAAiB,QAAQ,EAEzB,MAAM,IAAIO,MACR;IAIJ,IACE,CAAC,8BAAI,EAACxB,gBAAAA,eAAAA,IAAAA,CAAL,IAAI,EAAgBiB,qBACrB,CAACA,iBAAiB,cAAc,EAChC;QAEAA,iBAAiB,cAAc,GAAGE;QAGlCM;IACF;IAEA,OAAOR;AACT;AAEAjB,SAAAA,cAAeK,OAAsB;IACnC,OAAO,CAAC,CAAEA,CAAAA,QAAQ,iBAAiB,IAAIA,QAAQ,UAAS;AAC1D;AAEAU,eAAAA,QAAcV,OAAsB;IAClC,IAAI,CAAC,WAAW,GAAG,MAAM4B,AAAAA,IAAAA,wCAAAA,MAAAA,AAAAA,EAAO5B;IAEhC,IAAI,CAAC,IAAI,CAAC,WAAW,EACnB,MAAM,IAAImB,MAAM;IAGlB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,UAAU;IAE7C,IAAI,CAAC,QAAQ,GAAG,MAAMU,AAAAA,IAAAA,gCAAAA,UAAAA,AAAAA,EAAW,IAAI,CAAC,WAAW;IACjD,IAAI,CAAC,KAAK,GAAG,MAAMrB,wBAAAA,IAAAA,CAAAA,MAAW,CAAC,IAAI,CAAC,WAAW,EAAE;QAC/C,UAAU,IAAI,CAAC,eAAe;QAC9B,SAAS,IAAI,CAAC,QAAQ;QACtB,eAAe,IAAI,CAAC,aAAa;IACnC;IACA,IAAI,CAAC,kBAAkB;AACzB;AAEAG,eAAAA,SAAeX,OAAsB;IACnC,IAAI,CAAC,WAAW,GAAG,MAAMO,AAAAA,IAAAA,wCAAAA,OAAAA,AAAAA,EAAQP;IAEjC,IAAI,CAAC,IAAI,CAAC,WAAW,EACnB,MAAM,IAAImB,MAAM;IAGlB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,UAAU;IAE7C,IAAI,CAAC,QAAQ,GAAG,MAAMU,AAAAA,IAAAA,gCAAAA,UAAAA,AAAAA,EAAW,IAAI,CAAC,WAAW;IACjD,IAAI,CAAC,KAAK,GAAG,MAAMrB,wBAAAA,IAAAA,CAAAA,MAAW,CAAC,IAAI,CAAC,WAAW,EAAE;QAC/C,UAAU,IAAI,CAAC,eAAe;QAC9B,SAAS,IAAI,CAAC,QAAQ;QACtB,eAAe,IAAI,CAAC,aAAa;IACnC;IACA,IAAI,CAAC,kBAAkB;AACzB"}