jumpy-lion 0.0.23 → 0.0.25
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/dist/browser-controller.d.ts.map +1 -1
- package/dist/browser-controller.js +62 -32
- package/dist/browser-controller.js.map +1 -1
- package/dist/browser-plugin.d.ts +8 -7
- package/dist/browser-plugin.d.ts.map +1 -1
- package/dist/browser-plugin.js +150 -53
- package/dist/browser-plugin.js.map +1 -1
- package/dist/crawler.d.ts +31 -8
- package/dist/crawler.d.ts.map +1 -1
- package/dist/crawler.js +13 -6
- package/dist/crawler.js.map +1 -1
- package/dist/launcher-wrap.d.ts +2 -2
- package/dist/launcher-wrap.d.ts.map +1 -1
- package/dist/launcher-wrap.js.map +1 -1
- package/dist/page.d.ts +12 -1
- package/dist/page.d.ts.map +1 -1
- package/dist/page.js +224 -4
- package/dist/page.js.map +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser-controller.d.ts","sourceRoot":"","sources":["../src/browser-controller.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAEvD,OAAO,EAAE,iBAAiB,EAAc,MAAM,SAAS,CAAC;AAIxD,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACpE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,OAAO,MAAM,WAAW,CAAC;AAEhC,MAAM,MAAM,aAAa,GAAG,OAAO,CAAC;AAEpC,MAAM,CAAC,OAAO,OAAO,oBAAqB,SAAQ,iBAAiB,CAC/D,WAAW,EAAE,6CAA6C;AAC1D,OAAO,EAAE,gBAAgB;AACzB,YAAY,EAAE,4BAA4B;AAC1C,EAAE,EAAE,0DAA0D;AAC9D,aAAa,CAChB;IACG,OAAO,CAAC,MAAM,CAAC,CAAa;IAC5B,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,qBAAqB,CAAS;IAEhC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"browser-controller.d.ts","sourceRoot":"","sources":["../src/browser-controller.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAEvD,OAAO,EAAE,iBAAiB,EAAc,MAAM,SAAS,CAAC;AAIxD,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACpE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,OAAO,MAAM,WAAW,CAAC;AAEhC,MAAM,MAAM,aAAa,GAAG,OAAO,CAAC;AAEpC,MAAM,CAAC,OAAO,OAAO,oBAAqB,SAAQ,iBAAiB,CAC/D,WAAW,EAAE,6CAA6C;AAC1D,OAAO,EAAE,gBAAgB;AACzB,YAAY,EAAE,4BAA4B;AAC1C,EAAE,EAAE,0DAA0D;AAC9D,aAAa,CAChB;IACG,OAAO,CAAC,MAAM,CAAC,CAAa;IAC5B,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,qBAAqB,CAAS;IAEhC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAiCjC;;;OAGG;IACH,OAAO,CAAC,yBAAyB;IAajC;;;OAGG;YACW,iBAAiB;IAuC/B;;;OAGG;cACa,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAqBvC;;;OAGG;cACa,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAYtC;;;OAGG;cACa,QAAQ,CAAC,UAAU,SAAI,GAAG,OAAO,CAAC,aAAa,CAAC;YA+DlD,yBAAyB;IAuBvC;;;OAGG;cACa,WAAW,CAAC,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAQlF;;;OAGG;cACa,WAAW,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAQ1D,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,EAAE,YAAY,EAAE,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAI5G"}
|
|
@@ -26,17 +26,31 @@ export default class CDPBrowserController extends BrowserController {
|
|
|
26
26
|
}); // Flag to track disconnect listener
|
|
27
27
|
}
|
|
28
28
|
async initialize() {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
29
|
+
const maxInitAttempts = 3;
|
|
30
|
+
let attempt = 0;
|
|
31
|
+
while (attempt < maxInitAttempts) {
|
|
32
|
+
try {
|
|
33
|
+
this.client = await CDP({
|
|
34
|
+
port: this.launchContext.debuggingPort,
|
|
35
|
+
local: true,
|
|
36
|
+
});
|
|
37
|
+
const { Network, Page } = this.client;
|
|
38
|
+
await Promise.all([
|
|
39
|
+
Network.enable(),
|
|
40
|
+
Page.enable(),
|
|
41
|
+
]);
|
|
42
|
+
this._attachDisconnectListener();
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
catch (error) {
|
|
46
|
+
attempt++;
|
|
47
|
+
log.error(`Failed to initialize CDP client (attempt ${attempt}/${maxInitAttempts})`, error);
|
|
48
|
+
if (attempt === maxInitAttempts) {
|
|
49
|
+
throw error;
|
|
50
|
+
}
|
|
51
|
+
// Wait before retrying
|
|
52
|
+
await utils.sleep(2000 * attempt);
|
|
53
|
+
}
|
|
40
54
|
}
|
|
41
55
|
}
|
|
42
56
|
/**
|
|
@@ -48,7 +62,9 @@ export default class CDPBrowserController extends BrowserController {
|
|
|
48
62
|
return;
|
|
49
63
|
this.client.on('disconnect', () => {
|
|
50
64
|
log.error('WebSocket disconnected, attempting to reconnect...');
|
|
51
|
-
this._attemptReconnect()
|
|
65
|
+
void this._attemptReconnect().catch((error) => {
|
|
66
|
+
log.error('Failed to reconnect after multiple attempts. Browser has been closed.', error);
|
|
67
|
+
});
|
|
52
68
|
});
|
|
53
69
|
this.hasDisconnectListener = true; // Mark that we have a disconnect listener attached
|
|
54
70
|
}
|
|
@@ -61,30 +77,31 @@ export default class CDPBrowserController extends BrowserController {
|
|
|
61
77
|
while (this.reconnectAttempts < maxAttempts) {
|
|
62
78
|
try {
|
|
63
79
|
log.info(`Reconnect attempt ${this.reconnectAttempts + 1} of ${maxAttempts}`);
|
|
64
|
-
|
|
80
|
+
// Connect to browser target directly
|
|
81
|
+
this.client = await CDP({
|
|
82
|
+
port: this.launchContext.debuggingPort,
|
|
83
|
+
target: 'browser', // This connects to the root target without creating new ones
|
|
84
|
+
local: true,
|
|
85
|
+
});
|
|
65
86
|
const { Network, Page } = this.client;
|
|
66
|
-
await
|
|
67
|
-
|
|
68
|
-
|
|
87
|
+
await Promise.all([
|
|
88
|
+
Network.enable(),
|
|
89
|
+
Page.enable(),
|
|
90
|
+
]);
|
|
69
91
|
this.reconnectAttempts = 0;
|
|
70
92
|
log.info('Reconnected to browser successfully.');
|
|
71
|
-
|
|
72
|
-
this.hasDisconnectListener = false; // Reset flag to allow attaching again
|
|
93
|
+
this.hasDisconnectListener = false;
|
|
73
94
|
this._attachDisconnectListener();
|
|
74
|
-
return;
|
|
95
|
+
return;
|
|
75
96
|
}
|
|
76
97
|
catch (error) {
|
|
77
98
|
this.reconnectAttempts++;
|
|
78
99
|
log.error(`Reconnect attempt ${this.reconnectAttempts} failed.`, error);
|
|
79
100
|
if (this.reconnectAttempts === maxAttempts) {
|
|
80
|
-
log.error('Max reconnect attempts reached.
|
|
81
|
-
await this._close(); // Close the browser if reconnecting fails
|
|
82
|
-
// Gracefully handle the error without throwing to avoid crashing the process
|
|
83
|
-
log.error('Failed to reconnect after multiple attempts. Browser has been closed.');
|
|
101
|
+
log.error('Max reconnect attempts reached.');
|
|
84
102
|
return;
|
|
85
103
|
}
|
|
86
|
-
|
|
87
|
-
await utils.sleep(delayMs);
|
|
104
|
+
await utils.sleep(delayMs / 2);
|
|
88
105
|
}
|
|
89
106
|
}
|
|
90
107
|
}
|
|
@@ -140,20 +157,29 @@ export default class CDPBrowserController extends BrowserController {
|
|
|
140
157
|
if (!this.client) {
|
|
141
158
|
await this.initialize();
|
|
142
159
|
}
|
|
160
|
+
// Check if client is still connected
|
|
161
|
+
// @ts-expect-error Accessing internal WebSocket
|
|
162
|
+
if (this.client._ws?.readyState !== 1) { // WebSocket.OPEN = 1
|
|
163
|
+
log.info('Browser connection lost, reinitializing...');
|
|
164
|
+
await this.initialize();
|
|
165
|
+
}
|
|
143
166
|
const { Target } = this.client;
|
|
144
167
|
// Create a new page target
|
|
145
168
|
const { targetId } = await Target.createTarget({ url: 'about:blank' });
|
|
146
169
|
const session = await CDP({ target: targetId, port: this.launchContext.debuggingPort });
|
|
147
|
-
// Enable
|
|
148
|
-
await
|
|
149
|
-
|
|
170
|
+
// Enable only essential domains
|
|
171
|
+
await Promise.all([
|
|
172
|
+
session.Network.enable(),
|
|
173
|
+
session.Page.enable(),
|
|
174
|
+
session.DOM.enable(),
|
|
175
|
+
]);
|
|
150
176
|
// Activate the target
|
|
151
177
|
// @TODO: This is quite messy and should be improved
|
|
152
178
|
const { targetInfos } = await Target.getTargets();
|
|
153
179
|
const pages = targetInfos.filter((target) => target.type === 'page' && !target.url.includes('chrome://'));
|
|
154
180
|
await Target.activateTarget({ targetId: pages[pages.length - 1].targetId });
|
|
155
|
-
// Create and return the new page
|
|
156
|
-
const page =
|
|
181
|
+
// Create and return the new page using the static create method
|
|
182
|
+
const page = await CdpPage.create(session);
|
|
157
183
|
page.once(PAGE_CLOSED, () => {
|
|
158
184
|
this.activePages -= 1;
|
|
159
185
|
});
|
|
@@ -165,10 +191,14 @@ export default class CDPBrowserController extends BrowserController {
|
|
|
165
191
|
log.error(`Failed to create new page. Attempt ${retries} of ${maxRetries}`, error);
|
|
166
192
|
if (retries === maxRetries) {
|
|
167
193
|
log.error('Max retries reached. Closing the browser.');
|
|
168
|
-
|
|
194
|
+
try {
|
|
195
|
+
await this._close();
|
|
196
|
+
}
|
|
197
|
+
catch (closeError) {
|
|
198
|
+
log.error('Could not close browser client or process', { error: closeError });
|
|
199
|
+
}
|
|
169
200
|
throw new Error('Failed to create a new page after multiple attempts.');
|
|
170
201
|
}
|
|
171
|
-
// Optional delay before retrying
|
|
172
202
|
await utils.sleep(1000 * retries);
|
|
173
203
|
}
|
|
174
204
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser-controller.js","sourceRoot":"","sources":["../src/browser-controller.ts"],"names":[],"mappings":"AACA,OAAO,GAAG,MAAM,yBAAyB,CAAC;AAC1C,OAAO,EAAE,iBAAiB,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAExD,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,sBAAsB,EAAE,MAAM,0CAA0C,CAAC;AAGlF,OAAO,OAAO,MAAM,WAAW,CAAC;AAIhC,MAAM,CAAC,OAAO,OAAO,oBAAqB,SAAQ,iBAMjD;IAND;;QAOY;;;;;WAAoB;QACpB;;;;mBAAoB,CAAC;WAAC;QACtB;;;;mBAAwB,KAAK;WAAC,CAAC,oCAAoC;
|
|
1
|
+
{"version":3,"file":"browser-controller.js","sourceRoot":"","sources":["../src/browser-controller.ts"],"names":[],"mappings":"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"}
|
package/dist/browser-plugin.d.ts
CHANGED
|
@@ -7,7 +7,7 @@ type Library = CdpLauncher;
|
|
|
7
7
|
type LaunchResult = LaunchReturn;
|
|
8
8
|
interface NewPageOptions {
|
|
9
9
|
}
|
|
10
|
-
interface LaunchBrowserOptions {
|
|
10
|
+
export interface LaunchBrowserOptions {
|
|
11
11
|
browserType: "chrome" | "firefox";
|
|
12
12
|
useIncognitoPages: boolean;
|
|
13
13
|
proxyUrl?: string;
|
|
@@ -17,6 +17,13 @@ interface LaunchBrowserOptions {
|
|
|
17
17
|
useExperimentalFingerprints?: boolean;
|
|
18
18
|
}
|
|
19
19
|
export default class CDPBrowserPlugin extends BrowserPlugin<Library, LaunchBrowserOptions, LaunchResult, NewPageOptions, NewPageResult> {
|
|
20
|
+
private static readonly PORT_RANGE;
|
|
21
|
+
private static usedPorts;
|
|
22
|
+
private static lastAssignedPort;
|
|
23
|
+
private static portLock;
|
|
24
|
+
private getNextAvailablePort;
|
|
25
|
+
private _isPortAvailable;
|
|
26
|
+
private releasePort;
|
|
20
27
|
/**
|
|
21
28
|
*/
|
|
22
29
|
protected _addProxyToLaunchOptions(): Promise<void>;
|
|
@@ -50,12 +57,6 @@ export default class CDPBrowserPlugin extends BrowserPlugin<Library, LaunchBrows
|
|
|
50
57
|
* @private
|
|
51
58
|
*/
|
|
52
59
|
private _waitForPort;
|
|
53
|
-
/**
|
|
54
|
-
* Finds a free port to use.
|
|
55
|
-
*
|
|
56
|
-
* @private
|
|
57
|
-
*/
|
|
58
|
-
private _findFreePort;
|
|
59
60
|
/**
|
|
60
61
|
* Tries to connect to the browser using CDP with retries.
|
|
61
62
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser-plugin.d.ts","sourceRoot":"","sources":["../src/browser-plugin.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAO,KAAK,aAAa,EAAE,MAAM,SAAS,CAAC;AAEjE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,oBAAoB,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"browser-plugin.d.ts","sourceRoot":"","sources":["../src/browser-plugin.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAO,KAAK,aAAa,EAAE,MAAM,SAAS,CAAC;AAEjE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,oBAAoB,MAAM,yBAAyB,CAAC;AAG3D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAIjD,KAAK,OAAO,GAAG,WAAW,CAAC;AAC3B,KAAK,YAAY,GAAG,YAAY,CAAC;AACjC,UAAU,cAAc;CAAI;AAC5B,MAAM,WAAW,oBAAoB;IACjC,WAAW,EAAE,QAAQ,GAAG,SAAS,CAAC;IAClC,iBAAiB,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,2BAA2B,CAAC,EAAE,OAAO,CAAC;CACzC;AAED,MAAM,CAAC,OAAO,OAAO,gBAAiB,SAAQ,aAAa,CACvD,OAAO,EACP,oBAAoB,EACpB,YAAY,EACZ,cAAc,EACd,aAAa,CAChB;IACG,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAGhC;IAEF,OAAO,CAAC,MAAM,CAAC,SAAS,CAAqB;IAC7C,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAuC;IACtE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAS;YAElB,oBAAoB;YAsDpB,gBAAgB;IA6B9B,OAAO,CAAC,WAAW;IAUnB;OACG;cACa,wBAAwB,IAAI,OAAO,CAAC,IAAI,CAAC;IAIzD;;;;OAIG;IACH,SAAS,CAAC,uBAAuB,CAC7B,aAAa,EAAE,aAAa,CAAC,OAAO,EAAE,oBAAoB,EAAE,YAAY,EAAE,cAAc,EAAE,aAAa,CAAC,GACzG,OAAO;IAKV;;;;OAIG;cACa,OAAO,CACnB,aAAa,EAAE,aAAa,CAAC,OAAO,EAAE,oBAAoB,EAAE,YAAY,EAAE,cAAc,EAAE,aAAa,CAAC,GACzG,OAAO,CAAC,YAAY,CAAC;IAgDxB;;;;OAIG;IAGH,SAAS,CAAC,iBAAiB,IAAI,oBAAoB;IAMnD;;;;OAIG;YACW,cAAc;IA4B5B;;;;OAIG;YACW,YAAY;IAmB1B;;;;OAIG;YACW,iBAAiB;CAuClC"}
|
package/dist/browser-plugin.js
CHANGED
|
@@ -1,10 +1,83 @@
|
|
|
1
1
|
import net from 'net';
|
|
2
2
|
import { BrowserPlugin, log } from 'crawlee';
|
|
3
3
|
import CDPBrowserController from './browser-controller.js';
|
|
4
|
+
import { launchChromeBrowserWithNewProfile } from './browser-process/browser.js';
|
|
4
5
|
import { CdpLauncher } from './launcher-wrap.js';
|
|
5
6
|
import { anonymizeProxySugar } from './proxy/anonymize-proxy.js';
|
|
6
|
-
|
|
7
|
-
|
|
7
|
+
class CDPBrowserPlugin extends BrowserPlugin {
|
|
8
|
+
async getNextAvailablePort() {
|
|
9
|
+
const maxAttempts = 100; // Prevent infinite loops
|
|
10
|
+
let attempts = 0;
|
|
11
|
+
while (attempts < maxAttempts) {
|
|
12
|
+
// Wait if another instance is currently assigning a port
|
|
13
|
+
while (CDPBrowserPlugin.portLock) {
|
|
14
|
+
await new Promise(resolve => setTimeout(resolve, 100 + Math.random() * 100));
|
|
15
|
+
}
|
|
16
|
+
try {
|
|
17
|
+
// Set lock before port assignment
|
|
18
|
+
CDPBrowserPlugin.portLock = true;
|
|
19
|
+
// Increment the last assigned port, wrapping around if necessary
|
|
20
|
+
CDPBrowserPlugin.lastAssignedPort++;
|
|
21
|
+
if (CDPBrowserPlugin.lastAssignedPort > CDPBrowserPlugin.PORT_RANGE.max) {
|
|
22
|
+
CDPBrowserPlugin.lastAssignedPort = CDPBrowserPlugin.PORT_RANGE.min;
|
|
23
|
+
}
|
|
24
|
+
const candidatePort = CDPBrowserPlugin.lastAssignedPort;
|
|
25
|
+
// Skip if port is already tracked as in use
|
|
26
|
+
if (CDPBrowserPlugin.usedPorts.has(candidatePort)) {
|
|
27
|
+
continue;
|
|
28
|
+
}
|
|
29
|
+
// Add random delay before checking port availability
|
|
30
|
+
await new Promise(resolve => setTimeout(resolve, 200 + Math.random() * 300));
|
|
31
|
+
// Check if port is actually available
|
|
32
|
+
if (await this._isPortAvailable(candidatePort)) {
|
|
33
|
+
CDPBrowserPlugin.usedPorts.add(candidatePort);
|
|
34
|
+
log.debug(`Reserved port ${candidatePort} for browser instance`);
|
|
35
|
+
return candidatePort;
|
|
36
|
+
}
|
|
37
|
+
// Add delay before next attempt if port was unavailable
|
|
38
|
+
await new Promise(resolve => setTimeout(resolve, 150 + Math.random() * 200));
|
|
39
|
+
}
|
|
40
|
+
finally {
|
|
41
|
+
// Always release the lock
|
|
42
|
+
CDPBrowserPlugin.portLock = false;
|
|
43
|
+
}
|
|
44
|
+
attempts++; // Increment attempts only once per full iteration
|
|
45
|
+
}
|
|
46
|
+
throw new Error('No available ports found in the configured range after maximum attempts');
|
|
47
|
+
}
|
|
48
|
+
async _isPortAvailable(port) {
|
|
49
|
+
return new Promise((resolve) => {
|
|
50
|
+
const server = net.createServer();
|
|
51
|
+
server.once('error', (_err) => {
|
|
52
|
+
server.close();
|
|
53
|
+
resolve(false);
|
|
54
|
+
});
|
|
55
|
+
server.once('listening', () => {
|
|
56
|
+
server.close();
|
|
57
|
+
resolve(true);
|
|
58
|
+
});
|
|
59
|
+
// Add timeout to prevent hanging
|
|
60
|
+
server.on('error', () => { });
|
|
61
|
+
setTimeout(() => {
|
|
62
|
+
server.close();
|
|
63
|
+
resolve(false);
|
|
64
|
+
}, 1000);
|
|
65
|
+
try {
|
|
66
|
+
server.listen(port, '127.0.0.1');
|
|
67
|
+
}
|
|
68
|
+
catch (e) {
|
|
69
|
+
resolve(false);
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
releasePort(port) {
|
|
74
|
+
if (CDPBrowserPlugin.usedPorts.has(port)) {
|
|
75
|
+
CDPBrowserPlugin.usedPorts.delete(port);
|
|
76
|
+
log.debug(`Released port ${port} back to pool`);
|
|
77
|
+
// Add delay after release to prevent immediate reuse
|
|
78
|
+
setTimeout(() => { }, 500);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
8
81
|
/**
|
|
9
82
|
*/
|
|
10
83
|
async _addProxyToLaunchOptions() {
|
|
@@ -25,36 +98,45 @@ export default class CDPBrowserPlugin extends BrowserPlugin {
|
|
|
25
98
|
* @private
|
|
26
99
|
*/
|
|
27
100
|
async _launch(launchContext) {
|
|
28
|
-
const
|
|
29
|
-
if (!launchOptions.browserType) {
|
|
30
|
-
launchOptions.browserType = "chrome";
|
|
31
|
-
}
|
|
32
|
-
let browser;
|
|
33
|
-
launchOptions.useIncognitoPages = useIncognitoPages;
|
|
34
|
-
// launchOptions.useExperimentalFingerprints = useExperimentalFingerprints as boolean;
|
|
35
|
-
log.debug("Launch options", launchOptions);
|
|
36
|
-
const [anonymizedProxyUrl, close] = await anonymizeProxySugar(proxyUrl);
|
|
37
|
-
if (anonymizedProxyUrl) {
|
|
38
|
-
launchOptions.proxyUrl = anonymizedProxyUrl;
|
|
39
|
-
}
|
|
40
|
-
const debuggingPort = await this._findFreePort(9233);
|
|
41
|
-
const browserProcess = await this._launchBrowser(debuggingPort, launchOptions);
|
|
42
|
-
log.debug("browserProcess", browserProcess);
|
|
101
|
+
const debuggingPort = await this.getNextAvailablePort();
|
|
43
102
|
try {
|
|
44
|
-
|
|
103
|
+
const { launchOptions, useIncognitoPages, proxyUrl } = launchContext;
|
|
104
|
+
if (!launchOptions.browserType) {
|
|
105
|
+
launchOptions.browserType = "chrome";
|
|
106
|
+
}
|
|
107
|
+
let browser;
|
|
108
|
+
launchOptions.useIncognitoPages = useIncognitoPages;
|
|
109
|
+
log.debug("Launch options", { ...launchOptions, debuggingPort });
|
|
110
|
+
const [anonymizedProxyUrl, close] = await anonymizeProxySugar(proxyUrl);
|
|
45
111
|
if (anonymizedProxyUrl) {
|
|
112
|
+
launchOptions.proxyUrl = anonymizedProxyUrl;
|
|
113
|
+
}
|
|
114
|
+
const browserProcess = await this._launchBrowser(debuggingPort, launchOptions);
|
|
115
|
+
log.debug("Browser process started", { pid: browserProcess.pid, debuggingPort });
|
|
116
|
+
try {
|
|
117
|
+
browser = await this._connectWithRetry(debuggingPort, 10, 4000);
|
|
118
|
+
// Add both cleanup handlers
|
|
46
119
|
browser.on('close', async () => {
|
|
47
|
-
|
|
120
|
+
this.releasePort(debuggingPort);
|
|
121
|
+
if (anonymizedProxyUrl) {
|
|
122
|
+
await close();
|
|
123
|
+
}
|
|
48
124
|
});
|
|
125
|
+
launchContext.debuggingPort = debuggingPort;
|
|
126
|
+
launchContext.process = browserProcess;
|
|
127
|
+
return browser;
|
|
128
|
+
}
|
|
129
|
+
catch (error) {
|
|
130
|
+
if (anonymizedProxyUrl) {
|
|
131
|
+
await close();
|
|
132
|
+
}
|
|
133
|
+
throw error;
|
|
49
134
|
}
|
|
50
135
|
}
|
|
51
136
|
catch (error) {
|
|
52
|
-
|
|
137
|
+
this.releasePort(debuggingPort);
|
|
53
138
|
throw error;
|
|
54
139
|
}
|
|
55
|
-
launchContext.debuggingPort = debuggingPort;
|
|
56
|
-
launchContext.process = browserProcess;
|
|
57
|
-
return browser;
|
|
58
140
|
}
|
|
59
141
|
/**
|
|
60
142
|
* Creates a new browser controller.
|
|
@@ -121,31 +203,6 @@ export default class CDPBrowserPlugin extends BrowserPlugin {
|
|
|
121
203
|
}());
|
|
122
204
|
});
|
|
123
205
|
}
|
|
124
|
-
/**
|
|
125
|
-
* Finds a free port to use.
|
|
126
|
-
*
|
|
127
|
-
* @private
|
|
128
|
-
*/
|
|
129
|
-
async _findFreePort(startingPort) {
|
|
130
|
-
return new Promise((resolve, reject) => {
|
|
131
|
-
const server = net.createServer();
|
|
132
|
-
server.on('error', (err) => {
|
|
133
|
-
if (err.code === 'EADDRINUSE') {
|
|
134
|
-
this._findFreePort(startingPort + 1).then(resolve).catch(reject); // Port is in use, try the next one
|
|
135
|
-
}
|
|
136
|
-
else {
|
|
137
|
-
reject(err);
|
|
138
|
-
}
|
|
139
|
-
});
|
|
140
|
-
server.on('listening', () => {
|
|
141
|
-
const { port } = server.address();
|
|
142
|
-
server.close(() => {
|
|
143
|
-
resolve(port);
|
|
144
|
-
});
|
|
145
|
-
});
|
|
146
|
-
server.listen(startingPort, '127.0.0.1');
|
|
147
|
-
});
|
|
148
|
-
}
|
|
149
206
|
/**
|
|
150
207
|
* Tries to connect to the browser using CDP with retries.
|
|
151
208
|
*
|
|
@@ -154,24 +211,64 @@ export default class CDPBrowserPlugin extends BrowserPlugin {
|
|
|
154
211
|
async _connectWithRetry(port, maxRetries, retryDelay) {
|
|
155
212
|
let attempt = 0;
|
|
156
213
|
let lastError = null;
|
|
214
|
+
// Add delay before first attempt to allow browser to fully start
|
|
215
|
+
await new Promise(resolve => setTimeout(resolve, 1000));
|
|
157
216
|
while (attempt < maxRetries) {
|
|
158
217
|
try {
|
|
159
218
|
const cdpLauncher = new CdpLauncher();
|
|
160
|
-
const browser = await
|
|
219
|
+
const browser = await Promise.race([
|
|
220
|
+
cdpLauncher.launch({ port }),
|
|
221
|
+
new Promise((_, reject) => setTimeout(() => reject(new Error('Launch timeout')), 10000)),
|
|
222
|
+
]);
|
|
161
223
|
log.info(`Connected to browser on port ${port} on attempt ${attempt + 1}`);
|
|
162
224
|
return browser;
|
|
163
225
|
}
|
|
164
226
|
catch (error) {
|
|
165
227
|
attempt++;
|
|
166
|
-
|
|
167
|
-
|
|
228
|
+
if (error instanceof Error) {
|
|
229
|
+
lastError = error;
|
|
230
|
+
}
|
|
231
|
+
else {
|
|
232
|
+
lastError = new Error(String(error));
|
|
233
|
+
}
|
|
234
|
+
log.warning(`Failed to connect to browser on attempt ${attempt}. Error: ${lastError.message}`);
|
|
168
235
|
if (attempt < maxRetries) {
|
|
169
|
-
|
|
236
|
+
// Exponential backoff
|
|
237
|
+
const backoffDelay = retryDelay * 2 ** (attempt - 1);
|
|
238
|
+
await new Promise(resolve => setTimeout(resolve, backoffDelay));
|
|
170
239
|
}
|
|
171
240
|
}
|
|
172
241
|
}
|
|
173
|
-
|
|
242
|
+
// Always throw the wrapped error with our standard message
|
|
174
243
|
throw new Error(`Failed to connect to browser after ${maxRetries} attempts.`);
|
|
175
244
|
}
|
|
176
245
|
}
|
|
246
|
+
Object.defineProperty(CDPBrowserPlugin, "PORT_RANGE", {
|
|
247
|
+
enumerable: true,
|
|
248
|
+
configurable: true,
|
|
249
|
+
writable: true,
|
|
250
|
+
value: {
|
|
251
|
+
min: 9223,
|
|
252
|
+
max: 9423 // Give a range of 100 ports
|
|
253
|
+
}
|
|
254
|
+
});
|
|
255
|
+
Object.defineProperty(CDPBrowserPlugin, "usedPorts", {
|
|
256
|
+
enumerable: true,
|
|
257
|
+
configurable: true,
|
|
258
|
+
writable: true,
|
|
259
|
+
value: new Set()
|
|
260
|
+
});
|
|
261
|
+
Object.defineProperty(CDPBrowserPlugin, "lastAssignedPort", {
|
|
262
|
+
enumerable: true,
|
|
263
|
+
configurable: true,
|
|
264
|
+
writable: true,
|
|
265
|
+
value: CDPBrowserPlugin.PORT_RANGE.min - 1
|
|
266
|
+
});
|
|
267
|
+
Object.defineProperty(CDPBrowserPlugin, "portLock", {
|
|
268
|
+
enumerable: true,
|
|
269
|
+
configurable: true,
|
|
270
|
+
writable: true,
|
|
271
|
+
value: false
|
|
272
|
+
});
|
|
273
|
+
export default CDPBrowserPlugin;
|
|
177
274
|
//# sourceMappingURL=browser-plugin.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser-plugin.js","sourceRoot":"","sources":["../src/browser-plugin.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,KAAK,CAAC;AAGtB,OAAO,EAAE,aAAa,EAAE,GAAG,EAAsB,MAAM,SAAS,CAAC;AAGjE,OAAO,oBAAoB,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"browser-plugin.js","sourceRoot":"","sources":["../src/browser-plugin.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,KAAK,CAAC;AAGtB,OAAO,EAAE,aAAa,EAAE,GAAG,EAAsB,MAAM,SAAS,CAAC;AAGjE,OAAO,oBAAoB,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,iCAAiC,EAAE,MAAM,8BAA8B,CAAC;AAGjF,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAgBjE,MAAqB,gBAAiB,SAAQ,aAM7C;IAUW,KAAK,CAAC,oBAAoB;QAC9B,MAAM,WAAW,GAAG,GAAG,CAAC,CAAC,yBAAyB;QAClD,IAAI,QAAQ,GAAG,CAAC,CAAC;QAEjB,OAAO,QAAQ,GAAG,WAAW,EAAE,CAAC;YAC5B,yDAAyD;YACzD,OAAO,gBAAgB,CAAC,QAAQ,EAAE,CAAC;gBAC/B,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC;YACjF,CAAC;YAED,IAAI,CAAC;gBACD,kCAAkC;gBAClC,gBAAgB,CAAC,QAAQ,GAAG,IAAI,CAAC;gBAEjC,iEAAiE;gBACjE,gBAAgB,CAAC,gBAAgB,EAAE,CAAC;gBACpC,IAAI,gBAAgB,CAAC,gBAAgB,GAAG,gBAAgB,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC;oBACtE,gBAAgB,CAAC,gBAAgB,GAAG,gBAAgB,CAAC,UAAU,CAAC,GAAG,CAAC;gBACxE,CAAC;gBAED,MAAM,aAAa,GAAG,gBAAgB,CAAC,gBAAgB,CAAC;gBAExD,4CAA4C;gBAC5C,IAAI,gBAAgB,CAAC,SAAS,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC;oBAChD,SAAS;gBACb,CAAC;gBAED,qDAAqD;gBACrD,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CACxB,UAAU,CAAC,OAAO,EAAE,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC,CACjD,CAAC;gBAEF,sCAAsC;gBACtC,IAAI,MAAM,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC,EAAE,CAAC;oBAC7C,gBAAgB,CAAC,SAAS,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;oBAC9C,GAAG,CAAC,KAAK,CAAC,iBAAiB,aAAa,uBAAuB,CAAC,CAAC;oBACjE,OAAO,aAAa,CAAC;gBACzB,CAAC;gBAED,wDAAwD;gBACxD,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CACxB,UAAU,CAAC,OAAO,EAAE,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC,CACjD,CAAC;YACN,CAAC;oBAAS,CAAC;gBACP,0BAA0B;gBAC1B,gBAAgB,CAAC,QAAQ,GAAG,KAAK,CAAC;YACtC,CAAC;YAED,QAAQ,EAAE,CAAC,CAAC,kDAAkD;QAClE,CAAC;QAED,MAAM,IAAI,KAAK,CAAC,yEAAyE,CAAC,CAAC;IAC/F,CAAC;IAEO,KAAK,CAAC,gBAAgB,CAAC,IAAY;QACvC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC3B,MAAM,MAAM,GAAG,GAAG,CAAC,YAAY,EAAE,CAAC;YAElC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,IAAS,EAAE,EAAE;gBAC/B,MAAM,CAAC,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,CAAC;YACnB,CAAC,CAAC,CAAC;YAEH,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE;gBAC1B,MAAM,CAAC,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,IAAI,CAAC,CAAC;YAClB,CAAC,CAAC,CAAC;YAEH,iCAAiC;YACjC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YAC7B,UAAU,CAAC,GAAG,EAAE;gBACZ,MAAM,CAAC,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,CAAC;YACnB,CAAC,EAAE,IAAI,CAAC,CAAC;YAET,IAAI,CAAC;gBACD,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;YACrC,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACT,OAAO,CAAC,KAAK,CAAC,CAAC;YACnB,CAAC;QACL,CAAC,CAAC,CAAC;IACP,CAAC;IAEO,WAAW,CAAC,IAAY;QAC5B,IAAI,gBAAgB,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACvC,gBAAgB,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACxC,GAAG,CAAC,KAAK,CAAC,iBAAiB,IAAI,eAAe,CAAC,CAAC;YAEhD,qDAAqD;YACrD,UAAU,CAAC,GAAG,EAAE,GAAE,CAAC,EAAE,GAAG,CAAC,CAAC;QAC9B,CAAC;IACL,CAAC;IAED;OACG;IACO,KAAK,CAAC,wBAAwB;QACpC,sCAAsC;IAC1C,CAAC;IAED;;;;OAIG;IACO,uBAAuB,CAC7B,aAAwG;QAExG,MAAM,EAAE,WAAW,EAAE,GAAG,aAAa,CAAC,aAAa,CAAC;QACpD,OAAO,WAAW,KAAK,SAAS,CAAC,CAAC,uCAAuC;IAC7E,CAAC;IAED;;;;OAIG;IACO,KAAK,CAAC,OAAO,CACnB,aAAwG;QAExG,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAExD,IAAI,CAAC;YACD,MAAM,EAAE,aAAa,EAAE,iBAAiB,EAAE,QAAQ,EAAE,GAAG,aAAa,CAAC;YAErE,IAAI,CAAC,aAAa,CAAC,WAAW,EAAE,CAAC;gBAC7B,aAAa,CAAC,WAAW,GAAG,QAAQ,CAAC;YACzC,CAAC;YAED,IAAI,OAAqB,CAAC;YAC1B,aAAa,CAAC,iBAAiB,GAAG,iBAA4B,CAAC;YAC/D,GAAG,CAAC,KAAK,CAAC,gBAAgB,EAAE,EAAE,GAAG,aAAa,EAAE,aAAa,EAAE,CAAC,CAAC;YAEjE,MAAM,CAAC,kBAAkB,EAAE,KAAK,CAAC,GAAG,MAAM,mBAAmB,CAAC,QAAQ,CAAC,CAAC;YACxE,IAAI,kBAAkB,EAAE,CAAC;gBACrB,aAAa,CAAC,QAAQ,GAAG,kBAAkB,CAAC;YAChD,CAAC;YAED,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;YAC/E,GAAG,CAAC,KAAK,CAAC,yBAAyB,EAAE,EAAE,GAAG,EAAE,cAAc,CAAC,GAAG,EAAE,aAAa,EAAE,CAAC,CAAC;YAEjF,IAAI,CAAC;gBACD,OAAO,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,aAAa,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;gBAEhE,4BAA4B;gBAC5B,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,IAAI,EAAE;oBAC3B,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC;oBAChC,IAAI,kBAAkB,EAAE,CAAC;wBACrB,MAAM,KAAK,EAAE,CAAC;oBAClB,CAAC;gBACL,CAAC,CAAC,CAAC;gBAEH,aAAa,CAAC,aAAa,GAAG,aAAa,CAAC;gBAC5C,aAAa,CAAC,OAAO,GAAG,cAAc,CAAC;gBACvC,OAAO,OAAO,CAAC;YACnB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACb,IAAI,kBAAkB,EAAE,CAAC;oBACrB,MAAM,KAAK,EAAE,CAAC;gBAClB,CAAC;gBACD,MAAM,KAAK,CAAC;YAChB,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC;YAChC,MAAM,KAAK,CAAC;QAChB,CAAC;IACL,CAAC;IAED;;;;OAIG;IACH,SAAS;IACT,6BAA6B;IACnB,iBAAiB;QACvB,UAAU;QACV,6BAA6B;QAC7B,OAAO,IAAI,oBAAoB,CAAC,IAAI,CAAC,CAAC;IAC1C,CAAC;IAED;;;;OAIG;IACK,KAAK,CAAC,cAAc,CAAC,aAAqB,EAAE,aAAmC;QACnF,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,iBAAiB,GAAG,IAAI,EAAE,QAAQ,EAAE,cAAc,EAAE,2BAA2B,EAAE,GAAG,aAAa,CAAC;QACjI,IAAI,cAA8B,CAAC;QAEnC,QAAQ,WAAW,EAAE,CAAC;YAClB,KAAK,QAAQ,CAAC,CAAC,CAAC;gBACZ,cAAc,GAAG,MAAM,iCAAiC,CAAC,EAAE,aAAa,EAAE,kBAAkB,EAAE,QAAQ,EAAE,iBAAiB,EAAE,QAAQ,EAAE,cAAc,EAAE,2BAA2B,EAAE,CAAC,CAAC;gBACpL,MAAM;YACV,CAAC;YACD,OAAO,CAAC,CAAC,CAAC;gBACN,MAAM,IAAI,KAAK,CAAC,oCAAoC,WAAW,GAAG,CAAC,CAAC;YACxE,CAAC;QAEL,CAAC;QAED,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACnC,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC;iBAC3B,IAAI,CAAC,GAAG,EAAE;gBACP,GAAG,CAAC,IAAI,CAAC,4BAA4B,aAAa,EAAE,CAAC,CAAC;gBACtD,OAAO,CAAC,cAAc,CAAC,CAAC;YAC5B,CAAC,CAAC;iBACD,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;gBACX,GAAG,CAAC,KAAK,CAAC,yCAAyC,aAAa,EAAE,EAAE,GAAG,CAAC,CAAC;gBACzE,MAAM,CAAC,IAAI,KAAK,CAAC,yCAAyC,aAAa,EAAE,CAAC,CAAC,CAAC;YAChF,CAAC,CAAC,CAAC;QACX,CAAC,CAAC,CAAC;IACP,CAAC;IAED;;;;OAIG;IACK,KAAK,CAAC,YAAY,CAAC,IAAY,EAAE,OAAO,GAAG,KAAK,EAAE,UAAU,GAAG,GAAG;QACtE,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACnC,CAAC,SAAS,UAAU;gBAChB,MAAM,MAAM,GAAG,GAAG,CAAC,gBAAgB,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;gBACvD,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;oBACtB,MAAM,CAAC,GAAG,EAAE,CAAC;oBACb,OAAO,CAAC,IAAI,CAAC,CAAC;gBAClB,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;oBACpB,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,GAAG,OAAO,EAAE,CAAC;wBACnC,MAAM,CAAC,IAAI,KAAK,CAAC,4BAA4B,IAAI,EAAE,CAAC,CAAC,CAAC;oBAC1D,CAAC;yBAAM,CAAC;wBACJ,UAAU,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,sBAAsB;oBAC9D,CAAC;gBACL,CAAC,CAAC,CAAC;YACP,CAAC,EAAE,CAAC,CAAC;QACT,CAAC,CAAC,CAAC;IACP,CAAC;IAED;;;;OAIG;IACK,KAAK,CAAC,iBAAiB,CAAC,IAAY,EAAE,UAAkB,EAAE,UAAkB;QAChF,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,IAAI,SAAS,GAAiB,IAAI,CAAC;QAEnC,iEAAiE;QACjE,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;QAExD,OAAO,OAAO,GAAG,UAAU,EAAE,CAAC;YAC1B,IAAI,CAAC;gBACD,MAAM,WAAW,GAAG,IAAI,WAAW,EAAE,CAAC;gBACtC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC;oBAC/B,WAAW,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC;oBAC5B,IAAI,OAAO,CAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAC7B,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC,EAAE,KAAK,CAAC,CAC/D;iBACJ,CAAiB,CAAC;gBAEnB,GAAG,CAAC,IAAI,CAAC,gCAAgC,IAAI,eAAe,OAAO,GAAG,CAAC,EAAE,CAAC,CAAC;gBAC3E,OAAO,OAAO,CAAC;YACnB,CAAC;YAAC,OAAO,KAAc,EAAE,CAAC;gBACtB,OAAO,EAAE,CAAC;gBACV,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;oBACzB,SAAS,GAAG,KAAK,CAAC;gBACtB,CAAC;qBAAM,CAAC;oBACJ,SAAS,GAAG,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;gBACzC,CAAC;gBAED,GAAG,CAAC,OAAO,CAAC,2CAA2C,OAAO,YAAY,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC;gBAC/F,IAAI,OAAO,GAAG,UAAU,EAAE,CAAC;oBACvB,sBAAsB;oBACtB,MAAM,YAAY,GAAG,UAAU,GAAG,CAAC,IAAE,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;oBACnD,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC;gBACpE,CAAC;YACL,CAAC;QACL,CAAC;QAED,2DAA2D;QAC3D,MAAM,IAAI,KAAK,CAAC,sCAAsC,UAAU,YAAY,CAAC,CAAC;IAClF,CAAC;;AAhSuB;;;;WAAa;QACjC,GAAG,EAAE,IAAI;QACT,GAAG,EAAE,IAAI,CAAE,4BAA4B;KAC1C;GAAC;AAEa;;;;WAAY,IAAI,GAAG,EAAU;GAAC;AAC9B;;;;WAAmB,gBAAgB,CAAC,UAAU,CAAC,GAAG,GAAG,CAAC;GAAC;AACvD;;;;WAAW,KAAK;GAAC;eAdf,gBAAgB"}
|
package/dist/crawler.d.ts
CHANGED
|
@@ -1,23 +1,46 @@
|
|
|
1
1
|
import type { Dictionary } from '@crawlee/types';
|
|
2
|
-
import type { BrowserCrawlerOptions, BrowserCrawlingContext, BrowserHook,
|
|
2
|
+
import type { BrowserCrawlerOptions, BrowserCrawlingContext, BrowserHook, BrowserRequestHandler, LaunchContext, LoadedContext, RouterRoutes, RouterHandler } from 'crawlee';
|
|
3
3
|
import { BrowserCrawler, Configuration } from 'crawlee';
|
|
4
4
|
import type CDPBrowserController from './browser-controller.js';
|
|
5
|
+
import CDPBrowserPlugin from './browser-plugin.js';
|
|
6
|
+
import { CdpLauncher, LaunchReturn } from './launcher-wrap.js';
|
|
5
7
|
import type CdpPage from './page.js';
|
|
6
8
|
import type { GotoOptions } from './page.js';
|
|
7
|
-
import CDPCrawler from './index.js';
|
|
9
|
+
import type CDPCrawler from './index.js';
|
|
10
|
+
interface LaunchOptions {
|
|
11
|
+
headless?: boolean;
|
|
12
|
+
useExperimentalFingerprints?: boolean;
|
|
13
|
+
windowWidth?: number;
|
|
14
|
+
windowHeight?: number;
|
|
15
|
+
ignoreHttpsErrors?: boolean;
|
|
16
|
+
executablePath?: string;
|
|
17
|
+
browserType?: string;
|
|
18
|
+
useIncognitoPages?: boolean;
|
|
19
|
+
}
|
|
20
|
+
export interface CDPPluginOptions {
|
|
21
|
+
browserPlugins: [CDPBrowserPlugin];
|
|
22
|
+
}
|
|
23
|
+
export type CDPGotoOptions = Parameters<CdpPage['goto']>[1];
|
|
8
24
|
export interface CDPCrawlingContext<UserData extends Dictionary = Dictionary> extends BrowserCrawlingContext<typeof CDPCrawler, CdpPage, Response, CDPBrowserController, UserData> {
|
|
9
25
|
}
|
|
26
|
+
export interface CDPLaunchContext extends Partial<Omit<LaunchContext<CdpLauncher, LaunchOptions, LaunchReturn, {}, CdpPage>, 'launchOptions'>> {
|
|
27
|
+
launchOptions?: LaunchOptions;
|
|
28
|
+
}
|
|
10
29
|
export interface CDPHook extends BrowserHook<CDPCrawlingContext, CDPGotoOptions> {
|
|
11
30
|
}
|
|
12
31
|
export interface CDPRequestHandler extends BrowserRequestHandler<LoadedContext<CDPCrawlingContext>> {
|
|
32
|
+
(ctx: CDPCrawlingContext): Promise<void> | void;
|
|
13
33
|
}
|
|
14
|
-
export
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
34
|
+
export interface CDPCrawlerOptions extends BrowserCrawlerOptions<CDPCrawlingContext, CDPPluginOptions> {
|
|
35
|
+
launchContext?: CDPLaunchContext;
|
|
36
|
+
requestHandler?: CDPRequestHandler;
|
|
37
|
+
}
|
|
38
|
+
export default class Crawler extends BrowserCrawler<CDPPluginOptions, LaunchOptions, CDPCrawlingContext> {
|
|
39
|
+
private readonly crawlerOptions;
|
|
18
40
|
readonly config: Configuration;
|
|
19
|
-
constructor(
|
|
41
|
+
constructor(crawlerOptions?: CDPCrawlerOptions, config?: Configuration);
|
|
20
42
|
protected _navigationHandler(crawlingContext: CDPCrawlingContext, gotoOptions: GotoOptions): Promise<any>;
|
|
21
43
|
}
|
|
22
|
-
export declare function createCDPRouter<Context extends CDPCrawlingContext = CDPCrawlingContext, UserData extends Dictionary = Context extends CDPCrawlingContext<infer U> ? U : never>(routes?: RouterRoutes<Context, UserData>):
|
|
44
|
+
export declare function createCDPRouter<Context extends CDPCrawlingContext = CDPCrawlingContext, UserData extends Dictionary = Context extends CDPCrawlingContext<infer U> ? U : never>(routes?: RouterRoutes<Context, UserData>): RouterHandler<Context>;
|
|
45
|
+
export {};
|
|
23
46
|
//# sourceMappingURL=crawler.d.ts.map
|
package/dist/crawler.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"crawler.d.ts","sourceRoot":"","sources":["../src/crawler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,KAAK,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,WAAW,EAAE,
|
|
1
|
+
{"version":3,"file":"crawler.d.ts","sourceRoot":"","sources":["../src/crawler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,KAAK,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,WAAW,EAAE,qBAAqB,EAAE,aAAa,EAAE,aAAa,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC5K,OAAO,EAAE,cAAc,EAAE,aAAa,EAAU,MAAM,SAAS,CAAC;AAEhE,OAAO,KAAK,oBAAoB,MAAM,yBAAyB,CAAC;AAChE,OAAO,gBAAgB,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,KAAK,OAAO,MAAM,WAAW,CAAC;AACrC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAE7C,OAAO,KAAK,UAAU,MAAM,YAAY,CAAC;AAEzC,UAAU,aAAa;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,2BAA2B,CAAC,EAAE,OAAO,CAAC;IACtC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC/B;AAED,MAAM,WAAW,gBAAgB;IAAG,cAAc,EAAE,CAAC,gBAAgB,CAAC,CAAA;CAAE;AACxE,MAAM,MAAM,cAAc,GAAG,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAG5D,MAAM,WAAW,kBAAkB,CAAC,QAAQ,SAAS,UAAU,GAAG,UAAU,CACxE,SAAQ,sBAAsB,CAC1B,OAAO,UAAU,EACjB,OAAO,EACP,QAAQ,EACR,oBAAoB,EACpB,QAAQ,CACX;CAAG;AACR,MAAM,WAAW,gBAAiB,SAAQ,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,WAAW,EAAE,aAAa,EAAE,YAAY,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,eAAe,CAAC,CAAC;IAC1I,aAAa,CAAC,EAAE,aAAa,CAAC;CACjC;AAED,MAAM,WAAW,OAAQ,SAAQ,WAAW,CAAC,kBAAkB,EAAE,cAAc,CAAC;CAAG;AACnF,MAAM,WAAW,iBAAkB,SAAQ,qBAAqB,CAAC,aAAa,CAAC,kBAAkB,CAAC,CAAC;IAC/F,CAAC,GAAG,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CACnD;AACD,MAAM,WAAW,iBAAkB,SAAQ,qBAAqB,CAAC,kBAAkB,EAAE,gBAAgB,CAAC;IAClG,aAAa,CAAC,EAAE,gBAAgB,CAAC;IACjC,cAAc,CAAC,EAAE,iBAAiB,CAAC;CACtC;AAGD,MAAM,CAAC,OAAO,OAAO,OAAQ,SAAQ,cAAc,CAC/C,gBAAgB,EAChB,aAAa,EACb,kBAAkB,CACrB;IAGO,OAAO,CAAC,QAAQ,CAAC,cAAc;aACb,MAAM;gBADP,cAAc,GAAE,iBAAsB,EACrC,MAAM,gBAAkC;cA+CrC,kBAAkB,CAAC,eAAe,EAAE,kBAAkB,EAAE,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC;CAK3H;AAED,wBAAgB,eAAe,CAC3B,OAAO,SAAS,kBAAkB,GAAG,kBAAkB,EACvD,QAAQ,SAAS,UAAU,GAAG,OAAO,SAAS,kBAAkB,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,EACvF,MAAM,CAAC,EAAE,YAAY,CAAC,OAAO,EAAE,QAAQ,CAAC,GAAG,aAAa,CAAC,OAAO,CAAC,CAElE"}
|