@agent-infra/browser 0.1.6 → 0.2.0-alpha.4
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.
- package/README.md +35 -52
- package/README.zh-CN.md +57 -0
- package/dist/actions/index.d.ts +3 -0
- package/dist/actions/index.d.ts.map +1 -0
- package/dist/actions/index.js +46 -0
- package/dist/actions/index.js.map +1 -0
- package/dist/actions/index.mjs +7 -0
- package/dist/actions/key-map.d.ts +28 -0
- package/dist/actions/key-map.d.ts.map +1 -0
- package/dist/actions/key-map.js +409 -0
- package/dist/actions/key-map.js.map +1 -0
- package/dist/actions/key-map.mjs +369 -0
- package/dist/actions/key-map.mjs.map +1 -0
- package/dist/actions/keyboard.d.ts +21 -0
- package/dist/actions/keyboard.d.ts.map +1 -0
- package/dist/actions/keyboard.js +196 -0
- package/dist/actions/keyboard.js.map +1 -0
- package/dist/actions/keyboard.mjs +152 -0
- package/dist/actions/keyboard.mjs.map +1 -0
- package/dist/actions/keyboard.test.d.ts +2 -0
- package/dist/actions/keyboard.test.d.ts.map +1 -0
- package/dist/actions/mouse.d.ts +19 -0
- package/dist/actions/mouse.d.ts.map +1 -0
- package/dist/actions/mouse.js +173 -0
- package/dist/actions/mouse.js.map +1 -0
- package/dist/actions/mouse.mjs +136 -0
- package/dist/actions/mouse.mjs.map +1 -0
- package/dist/browser/base.d.ts +47 -0
- package/dist/browser/base.d.ts.map +1 -0
- package/dist/browser/base.js +156 -0
- package/dist/browser/base.js.map +1 -0
- package/dist/browser/base.mjs +122 -0
- package/dist/browser/base.mjs.map +1 -0
- package/dist/browser/browser.d.ts +23 -0
- package/dist/browser/browser.d.ts.map +1 -0
- package/dist/browser/browser.js +183 -0
- package/dist/browser/browser.js.map +1 -0
- package/dist/browser/browser.mjs +149 -0
- package/dist/browser/browser.mjs.map +1 -0
- package/dist/env.d.ts +4 -0
- package/dist/env.d.ts.map +1 -0
- package/dist/env.js +96 -0
- package/dist/env.js.map +1 -0
- package/dist/env.mjs +62 -0
- package/dist/env.mjs.map +1 -0
- package/dist/index.node.d.ts +7 -0
- package/dist/index.node.d.ts.map +1 -0
- package/dist/index.node.js +106 -0
- package/dist/index.node.js.map +1 -0
- package/dist/index.node.mjs +10 -0
- package/dist/index.web.d.ts +7 -0
- package/dist/index.web.d.ts.map +1 -0
- package/dist/{index.js → index.web.js} +33 -20
- package/dist/index.web.js.map +1 -0
- package/dist/index.web.mjs +10 -0
- package/dist/injected-script/index.d.ts +3 -0
- package/dist/injected-script/index.d.ts.map +1 -0
- package/dist/injected-script/index.js +46 -0
- package/dist/injected-script/index.js.map +1 -0
- package/dist/injected-script/index.mjs +7 -0
- package/dist/injected-script/visibility.d.ts +2 -0
- package/dist/injected-script/visibility.d.ts.map +1 -0
- package/dist/injected-script/visibility.js +66 -0
- package/dist/injected-script/visibility.js.map +1 -0
- package/dist/injected-script/visibility.mjs +32 -0
- package/dist/injected-script/visibility.mjs.map +1 -0
- package/dist/injected-script/webdriver.d.ts +2 -0
- package/dist/injected-script/webdriver.d.ts.map +1 -0
- package/dist/injected-script/webdriver.js +71 -0
- package/dist/injected-script/webdriver.js.map +1 -0
- package/dist/injected-script/webdriver.mjs +37 -0
- package/dist/injected-script/webdriver.mjs.map +1 -0
- package/dist/polyfills/index.d.ts +2 -0
- package/dist/polyfills/index.d.ts.map +1 -0
- package/dist/polyfills/index.js +66 -0
- package/dist/polyfills/index.js.map +1 -0
- package/dist/polyfills/index.mjs +5 -0
- package/dist/polyfills/withResolvers.d.ts +2 -0
- package/dist/polyfills/withResolvers.d.ts.map +1 -0
- package/dist/polyfills/withResolvers.js +37 -0
- package/dist/polyfills/withResolvers.js.map +1 -0
- package/dist/polyfills/withResolvers.mjs +19 -0
- package/dist/polyfills/withResolvers.mjs.map +1 -0
- package/dist/tabs/dialog.d.ts +14 -0
- package/dist/tabs/dialog.d.ts.map +1 -0
- package/dist/tabs/dialog.js +175 -0
- package/dist/tabs/dialog.js.map +1 -0
- package/dist/tabs/dialog.mjs +141 -0
- package/dist/tabs/dialog.mjs.map +1 -0
- package/dist/tabs/index.d.ts +3 -0
- package/dist/tabs/index.d.ts.map +1 -0
- package/dist/tabs/index.js +46 -0
- package/dist/tabs/index.js.map +1 -0
- package/dist/tabs/index.mjs +7 -0
- package/dist/tabs/tab.d.ts +50 -0
- package/dist/tabs/tab.d.ts.map +1 -0
- package/dist/tabs/tab.js +579 -0
- package/dist/tabs/tab.js.map +1 -0
- package/dist/tabs/tab.mjs +545 -0
- package/dist/tabs/tab.mjs.map +1 -0
- package/dist/tabs/tabs.d.ts +21 -0
- package/dist/tabs/tabs.d.ts.map +1 -0
- package/dist/tabs/tabs.js +458 -0
- package/dist/tabs/tabs.js.map +1 -0
- package/dist/tabs/tabs.mjs +424 -0
- package/dist/tabs/tabs.mjs.map +1 -0
- package/dist/types/actions.d.ts +26 -0
- package/dist/types/actions.d.ts.map +1 -0
- package/dist/types/actions.js +24 -0
- package/dist/types/actions.js.map +1 -0
- package/dist/types/browser.d.ts +7 -0
- package/dist/types/browser.d.ts.map +1 -0
- package/dist/types/browser.js +24 -0
- package/dist/types/browser.js.map +1 -0
- package/dist/types/browser.mjs +4 -0
- package/dist/types/dialog.d.ts +7 -0
- package/dist/types/dialog.d.ts.map +1 -0
- package/dist/types/dialog.js +24 -0
- package/dist/types/dialog.js.map +1 -0
- package/dist/types/dialog.mjs +4 -0
- package/dist/types/env.d.ts +8 -0
- package/dist/types/env.d.ts.map +1 -0
- package/dist/{types.js → types/env.js} +1 -1
- package/dist/types/env.js.map +1 -0
- package/dist/types/env.mjs +4 -0
- package/dist/types/index.d.ts +6 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +102 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/index.mjs +9 -0
- package/dist/types/tabs.d.ts +98 -0
- package/dist/types/tabs.d.ts.map +1 -0
- package/dist/types/tabs.js +48 -0
- package/dist/types/tabs.js.map +1 -0
- package/dist/types/tabs.mjs +14 -0
- package/dist/types/tabs.mjs.map +1 -0
- package/dist/utils/iife.d.ts +2 -0
- package/dist/utils/iife.d.ts.map +1 -0
- package/dist/utils/iife.js +48 -0
- package/dist/utils/iife.js.map +1 -0
- package/dist/utils/iife.mjs +14 -0
- package/dist/utils/iife.mjs.map +1 -0
- package/dist/utils/index.d.ts +4 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +50 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/index.mjs +8 -0
- package/dist/utils/mutex.d.ts +21 -0
- package/dist/utils/mutex.d.ts.map +1 -0
- package/dist/utils/mutex.js +133 -0
- package/dist/utils/mutex.js.map +1 -0
- package/dist/utils/mutex.mjs +99 -0
- package/dist/utils/mutex.mjs.map +1 -0
- package/dist/utils/url.d.ts +7 -0
- package/dist/utils/url.d.ts.map +1 -0
- package/dist/utils/url.js +76 -0
- package/dist/utils/url.js.map +1 -0
- package/dist/utils/url.mjs +42 -0
- package/dist/utils/url.mjs.map +1 -0
- package/package.json +21 -13
- package/dist/base-browser.d.ts +0 -94
- package/dist/base-browser.d.ts.map +0 -1
- package/dist/base-browser.js +0 -189
- package/dist/base-browser.js.map +0 -1
- package/dist/base-browser.mjs +0 -155
- package/dist/base-browser.mjs.map +0 -1
- package/dist/index.d.ts +0 -15
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/index.mjs +0 -8
- package/dist/local-browser.d.ts +0 -19
- package/dist/local-browser.d.ts.map +0 -1
- package/dist/local-browser.js +0 -134
- package/dist/local-browser.js.map +0 -1
- package/dist/local-browser.mjs +0 -100
- package/dist/local-browser.mjs.map +0 -1
- package/dist/remote-browser.d.ts +0 -49
- package/dist/remote-browser.d.ts.map +0 -1
- package/dist/remote-browser.js +0 -89
- package/dist/remote-browser.js.map +0 -1
- package/dist/remote-browser.mjs +0 -55
- package/dist/remote-browser.mjs.map +0 -1
- package/dist/types.d.ts +0 -158
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js.map +0 -1
- /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":"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"}
|
|
@@ -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":"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"}
|