jumpy-lion 0.1.6-beta.3 → 0.1.6-beta.31
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 +1 -607
- package/browser/fonts/macos-bundle/40-macos-aliases.conf +497 -0
- package/browser/fonts/macos-bundle/README.md +24 -0
- package/browser/fonts/macos-bundle/install.sh +83 -0
- package/dist/browser-controller.d.ts +21 -3
- package/dist/browser-controller.d.ts.map +1 -1
- package/dist/browser-controller.js +75 -231
- package/dist/browser-controller.js.map +1 -1
- package/dist/browser-plugin.d.ts +75 -104
- package/dist/browser-plugin.d.ts.map +1 -1
- package/dist/browser-plugin.js +241 -280
- package/dist/browser-plugin.js.map +1 -1
- package/dist/browser-process/align-fingerprint-config.d.ts +40 -0
- package/dist/browser-process/align-fingerprint-config.d.ts.map +1 -0
- package/dist/browser-process/align-fingerprint-config.js +79 -0
- package/dist/browser-process/align-fingerprint-config.js.map +1 -0
- package/dist/browser-process/anti-detect-config.d.ts +130 -1
- package/dist/browser-process/anti-detect-config.d.ts.map +1 -1
- package/dist/browser-process/anti-detect-config.js +353 -110
- package/dist/browser-process/anti-detect-config.js.map +1 -1
- package/dist/browser-process/browser.d.ts +37 -89
- package/dist/browser-process/browser.d.ts.map +1 -1
- package/dist/browser-process/browser.js +389 -85
- package/dist/browser-process/browser.js.map +1 -1
- package/dist/browser-process/fingerprint-config.d.ts +103 -0
- package/dist/browser-process/fingerprint-config.d.ts.map +1 -0
- package/dist/browser-process/fingerprint-config.js +245 -0
- package/dist/browser-process/fingerprint-config.js.map +1 -0
- package/dist/browser-process/get-chrome-executable.d.ts +6 -0
- package/dist/browser-process/get-chrome-executable.d.ts.map +1 -1
- package/dist/browser-process/get-chrome-executable.js +23 -0
- package/dist/browser-process/get-chrome-executable.js.map +1 -1
- package/dist/browser-process/gpu-family-profiles.d.ts +53 -0
- package/dist/browser-process/gpu-family-profiles.d.ts.map +1 -0
- package/dist/browser-process/gpu-family-profiles.js +395 -0
- package/dist/browser-process/gpu-family-profiles.js.map +1 -0
- package/dist/browser-process/index.d.ts +1 -1
- package/dist/browser-process/index.d.ts.map +1 -1
- package/dist/browser-process/index.js +1 -1
- package/dist/browser-process/index.js.map +1 -1
- package/dist/browser-process/launch-options.d.ts +195 -0
- package/dist/browser-process/launch-options.d.ts.map +1 -0
- package/dist/browser-process/launch-options.js +2 -0
- package/dist/browser-process/launch-options.js.map +1 -0
- package/dist/browser-process/port-allocator.d.ts +46 -0
- package/dist/browser-process/port-allocator.d.ts.map +1 -0
- package/dist/browser-process/port-allocator.js +171 -0
- package/dist/browser-process/port-allocator.js.map +1 -0
- package/dist/browser-process/process.d.ts +35 -0
- package/dist/browser-process/process.d.ts.map +1 -1
- package/dist/browser-process/process.js +110 -0
- package/dist/browser-process/process.js.map +1 -1
- package/dist/browser-process/signal-cleanup.d.ts +37 -0
- package/dist/browser-process/signal-cleanup.d.ts.map +1 -0
- package/dist/browser-process/signal-cleanup.js +93 -0
- package/dist/browser-process/signal-cleanup.js.map +1 -0
- package/dist/connection/cdp-reconnection.d.ts +61 -0
- package/dist/connection/cdp-reconnection.d.ts.map +1 -0
- package/dist/connection/cdp-reconnection.js +98 -0
- package/dist/connection/cdp-reconnection.js.map +1 -0
- package/dist/connection/page-session.d.ts +109 -0
- package/dist/connection/page-session.d.ts.map +1 -0
- package/dist/connection/page-session.js +257 -0
- package/dist/connection/page-session.js.map +1 -0
- package/dist/crawler.d.ts +30 -1
- package/dist/crawler.d.ts.map +1 -1
- package/dist/crawler.js +97 -7
- package/dist/crawler.js.map +1 -1
- package/dist/fingerprinting/fingerprint-injector.d.ts +6 -116
- package/dist/fingerprinting/fingerprint-injector.d.ts.map +1 -1
- package/dist/fingerprinting/fingerprint-injector.js +82 -531
- package/dist/fingerprinting/fingerprint-injector.js.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/index.d.ts +6 -2
- package/dist/fingerprinting/fingerprint-overrides/index.d.ts.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/index.js +6 -2
- package/dist/fingerprinting/fingerprint-overrides/index.js.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/navigator-override.d.ts +18 -0
- package/dist/fingerprinting/fingerprint-overrides/navigator-override.d.ts.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/navigator-override.js +136 -0
- package/dist/fingerprinting/fingerprint-overrides/navigator-override.js.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/override.d.ts +137 -0
- package/dist/fingerprinting/fingerprint-overrides/override.d.ts.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/override.js +14 -0
- package/dist/fingerprinting/fingerprint-overrides/override.js.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/platform-consistency.d.ts.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/platform-consistency.js +42 -11
- package/dist/fingerprinting/fingerprint-overrides/platform-consistency.js.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/registry.d.ts +27 -0
- package/dist/fingerprinting/fingerprint-overrides/registry.d.ts.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/registry.js +285 -0
- package/dist/fingerprinting/fingerprint-overrides/registry.js.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/screen-override.d.ts +16 -0
- package/dist/fingerprinting/fingerprint-overrides/screen-override.d.ts.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/screen-override.js +175 -0
- package/dist/fingerprinting/fingerprint-overrides/screen-override.js.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/stealth-script.d.ts.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/stealth-script.js +72 -6
- package/dist/fingerprinting/fingerprint-overrides/stealth-script.js.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/webgl-spoofing.d.ts.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/webgl-spoofing.js +23 -4
- package/dist/fingerprinting/fingerprint-overrides/webgl-spoofing.js.map +1 -1
- package/dist/fingerprinting/injection-planner.d.ts +178 -0
- package/dist/fingerprinting/injection-planner.d.ts.map +1 -0
- package/dist/fingerprinting/injection-planner.js +376 -0
- package/dist/fingerprinting/injection-planner.js.map +1 -0
- package/dist/fingerprinting/locale-resolver.d.ts +7 -0
- package/dist/fingerprinting/locale-resolver.d.ts.map +1 -1
- package/dist/fingerprinting/locale-resolver.js +24 -1
- package/dist/fingerprinting/locale-resolver.js.map +1 -1
- package/dist/fingerprinting/non-apify-fingerprint-generator.d.ts +23 -11
- package/dist/fingerprinting/non-apify-fingerprint-generator.d.ts.map +1 -1
- package/dist/fingerprinting/non-apify-fingerprint-generator.js +53 -15
- package/dist/fingerprinting/non-apify-fingerprint-generator.js.map +1 -1
- package/dist/fingerprinting/non-apify-profiles.json +52186 -0
- package/dist/fingerprinting/os-consistency.d.ts +31 -0
- package/dist/fingerprinting/os-consistency.d.ts.map +1 -0
- package/dist/fingerprinting/os-consistency.js +50 -0
- package/dist/fingerprinting/os-consistency.js.map +1 -0
- package/dist/fingerprinting/profile-quality.d.ts +24 -0
- package/dist/fingerprinting/profile-quality.d.ts.map +1 -0
- package/dist/fingerprinting/profile-quality.js +165 -0
- package/dist/fingerprinting/profile-quality.js.map +1 -0
- package/dist/fingerprinting/profile-selector.d.ts +101 -0
- package/dist/fingerprinting/profile-selector.d.ts.map +1 -0
- package/dist/fingerprinting/profile-selector.js +156 -0
- package/dist/fingerprinting/profile-selector.js.map +1 -0
- package/dist/fingerprinting/ua-alignment.d.ts +51 -0
- package/dist/fingerprinting/ua-alignment.d.ts.map +1 -0
- package/dist/fingerprinting/ua-alignment.js +146 -0
- package/dist/fingerprinting/ua-alignment.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/input/dropdown-selector.d.ts +74 -0
- package/dist/input/dropdown-selector.d.ts.map +1 -0
- package/dist/input/dropdown-selector.js +306 -0
- package/dist/input/dropdown-selector.js.map +1 -0
- package/dist/input/element-target.d.ts +117 -0
- package/dist/input/element-target.d.ts.map +1 -0
- package/dist/input/element-target.js +383 -0
- package/dist/input/element-target.js.map +1 -0
- package/dist/input/input-emulator.d.ts +85 -0
- package/dist/input/input-emulator.d.ts.map +1 -0
- package/dist/input/input-emulator.js +319 -0
- package/dist/input/input-emulator.js.map +1 -0
- package/dist/input/input-transport.d.ts +60 -0
- package/dist/input/input-transport.d.ts.map +1 -0
- package/dist/input/input-transport.js +28 -0
- package/dist/input/input-transport.js.map +1 -0
- package/dist/input/recording-transport.d.ts +32 -0
- package/dist/input/recording-transport.d.ts.map +1 -0
- package/dist/input/recording-transport.js +43 -0
- package/dist/input/recording-transport.js.map +1 -0
- package/dist/navigation/page-navigation.d.ts +67 -0
- package/dist/navigation/page-navigation.d.ts.map +1 -0
- package/dist/navigation/page-navigation.js +107 -0
- package/dist/navigation/page-navigation.js.map +1 -0
- package/dist/network/network-watch.d.ts +72 -0
- package/dist/network/network-watch.d.ts.map +1 -0
- package/dist/network/network-watch.js +143 -0
- package/dist/network/network-watch.js.map +1 -0
- package/dist/page.d.ts +90 -103
- package/dist/page.d.ts.map +1 -1
- package/dist/page.js +184 -1117
- package/dist/page.js.map +1 -1
- package/dist/session/inject-hook.d.ts +24 -0
- package/dist/session/inject-hook.d.ts.map +1 -0
- package/dist/session/inject-hook.js +80 -0
- package/dist/session/inject-hook.js.map +1 -0
- package/dist/session/save.d.ts +21 -0
- package/dist/session/save.d.ts.map +1 -0
- package/dist/session/save.js +163 -0
- package/dist/session/save.js.map +1 -0
- package/dist/session/tar-data-dir.d.ts +13 -0
- package/dist/session/tar-data-dir.d.ts.map +1 -0
- package/dist/session/tar-data-dir.js +107 -0
- package/dist/session/tar-data-dir.js.map +1 -0
- package/dist/session/types.d.ts +80 -0
- package/dist/session/types.d.ts.map +1 -0
- package/dist/session/types.js +29 -0
- package/dist/session/types.js.map +1 -0
- package/dist/session-profile.d.ts +79 -0
- package/dist/session-profile.d.ts.map +1 -0
- package/dist/session-profile.js +124 -0
- package/dist/session-profile.js.map +1 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +16 -9
- package/scripts/postinstall.cjs +58 -0
- package/dist/fingerprinting/custom-fingerprint-injector.d.ts +0 -87
- package/dist/fingerprinting/custom-fingerprint-injector.d.ts.map +0 -1
- package/dist/fingerprinting/custom-fingerprint-injector.js +0 -342
- package/dist/fingerprinting/custom-fingerprint-injector.js.map +0 -1
- package/dist/launcher-wrap.d.ts +0 -10
- package/dist/launcher-wrap.d.ts.map +0 -1
- package/dist/launcher-wrap.js +0 -11
- package/dist/launcher-wrap.js.map +0 -1
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import CDP from 'chrome-remote-interface';
|
|
2
2
|
import { BrowserController, log, utils } from 'crawlee';
|
|
3
|
-
import {
|
|
3
|
+
import { applyToPage } from './browser-process/fingerprint-config.js';
|
|
4
|
+
import { runWithRetries, linearBackoff, fixedBackoff } from './connection/cdp-reconnection.js';
|
|
4
5
|
import { PAGE_CLOSED } from './events.js';
|
|
5
|
-
import { CdpFingerprintInjector } from './fingerprinting/fingerprint-injector.js';
|
|
6
|
-
import { generateNonApifyFingerprint } from './fingerprinting/non-apify-fingerprint-generator.js';
|
|
7
6
|
import CdpPage from './page.js';
|
|
7
|
+
import { installSessionInjectionHook } from './session/inject-hook.js';
|
|
8
8
|
export default class CDPBrowserController extends BrowserController {
|
|
9
9
|
constructor() {
|
|
10
10
|
super(...arguments);
|
|
@@ -14,12 +14,6 @@ export default class CDPBrowserController extends BrowserController {
|
|
|
14
14
|
writable: true,
|
|
15
15
|
value: void 0
|
|
16
16
|
});
|
|
17
|
-
Object.defineProperty(this, "reconnectAttempts", {
|
|
18
|
-
enumerable: true,
|
|
19
|
-
configurable: true,
|
|
20
|
-
writable: true,
|
|
21
|
-
value: 0
|
|
22
|
-
});
|
|
23
17
|
Object.defineProperty(this, "hasDisconnectListener", {
|
|
24
18
|
enumerable: true,
|
|
25
19
|
configurable: true,
|
|
@@ -34,27 +28,22 @@ export default class CDPBrowserController extends BrowserController {
|
|
|
34
28
|
}); // Flag to track intentional browser closure
|
|
35
29
|
}
|
|
36
30
|
async initialize() {
|
|
31
|
+
// Retry machinery lives in CdpReconnection; this binding connects to
|
|
32
|
+
// the default (root) target without enabling any domain — eager
|
|
33
|
+
// Network.enable/Page.enable are CDP detection vectors.
|
|
37
34
|
const maxInitAttempts = 3;
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
return;
|
|
47
|
-
}
|
|
48
|
-
catch (error) {
|
|
49
|
-
attempt++;
|
|
35
|
+
this.client = await runWithRetries({
|
|
36
|
+
label: 'CDP client initialization',
|
|
37
|
+
policy: linearBackoff(maxInitAttempts, 2000),
|
|
38
|
+
attempt: async () => await CDP({
|
|
39
|
+
port: this.launchContext.debuggingPort,
|
|
40
|
+
local: true,
|
|
41
|
+
}),
|
|
42
|
+
onAttemptError: (error, attempt) => {
|
|
50
43
|
log.error(`Failed to initialize CDP client (attempt ${attempt}/${maxInitAttempts})`, error);
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
// Wait before retrying
|
|
55
|
-
await utils.sleep(2000 * attempt);
|
|
56
|
-
}
|
|
57
|
-
}
|
|
44
|
+
},
|
|
45
|
+
}); // linearBackoff throws on exhaustion, so this is always defined
|
|
46
|
+
this._attachDisconnectListener();
|
|
58
47
|
}
|
|
59
48
|
/**
|
|
60
49
|
* Attach a listener to handle WebSocket disconnections.
|
|
@@ -80,35 +69,30 @@ export default class CDPBrowserController extends BrowserController {
|
|
|
80
69
|
* @private
|
|
81
70
|
*/
|
|
82
71
|
async _attemptReconnect(maxAttempts = 5, delayMs = 2000) {
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
72
|
+
await runWithRetries({
|
|
73
|
+
label: 'browser root reconnect',
|
|
74
|
+
policy: fixedBackoff(maxAttempts, delayMs / 2),
|
|
75
|
+
attempt: async (attempt) => {
|
|
76
|
+
log.info(`Reconnect attempt ${attempt} of ${maxAttempts}`);
|
|
77
|
+
// Connect to browser target directly — the root target connect
|
|
78
|
+
// does not create new targets.
|
|
88
79
|
this.client = await CDP({
|
|
89
80
|
port: this.launchContext.debuggingPort,
|
|
90
|
-
target: 'browser',
|
|
81
|
+
target: 'browser',
|
|
91
82
|
local: true,
|
|
92
83
|
});
|
|
93
84
|
// NOTE: Network.enable() and Page.enable() REMOVED - they are CDP detection vectors!
|
|
94
85
|
// These domains will be enabled lazily only when actually needed
|
|
95
86
|
// Enabling them on connect triggers detectable side effects
|
|
96
|
-
this.reconnectAttempts = 0;
|
|
97
87
|
log.info('Reconnected to browser successfully.');
|
|
98
88
|
this.hasDisconnectListener = false;
|
|
99
89
|
this._attachDisconnectListener();
|
|
100
|
-
return;
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
log.error('Max reconnect attempts reached.');
|
|
107
|
-
return;
|
|
108
|
-
}
|
|
109
|
-
await utils.sleep(delayMs / 2);
|
|
110
|
-
}
|
|
111
|
-
}
|
|
90
|
+
return true;
|
|
91
|
+
},
|
|
92
|
+
onAttemptError: (error, attempt) => {
|
|
93
|
+
log.error(`Reconnect attempt ${attempt} failed.`, error);
|
|
94
|
+
},
|
|
95
|
+
});
|
|
112
96
|
}
|
|
113
97
|
/**
|
|
114
98
|
* Gracefully closes the browser and associated process.
|
|
@@ -191,6 +175,8 @@ export default class CDPBrowserController extends BrowserController {
|
|
|
191
175
|
this.activePages -= 1;
|
|
192
176
|
});
|
|
193
177
|
await this._maybeOverrideFingerprint(page);
|
|
178
|
+
await this._recordLaunchSnapshot(page);
|
|
179
|
+
await this._maybeRestoreSession(page);
|
|
194
180
|
return page;
|
|
195
181
|
}
|
|
196
182
|
catch (error) {
|
|
@@ -211,195 +197,53 @@ export default class CDPBrowserController extends BrowserController {
|
|
|
211
197
|
}
|
|
212
198
|
throw new Error('Failed to create a new page after maximum retry attempts.');
|
|
213
199
|
}
|
|
200
|
+
/**
|
|
201
|
+
* Thin delegate to the FingerprintConfig module's post-launch path. It
|
|
202
|
+
* reuses the once-per-launch profile selection (stamped by the plugin's
|
|
203
|
+
* pre-launch native path) or selects here for the system-Chrome fallback,
|
|
204
|
+
* then drives the JS fingerprint injection on the new page. The pre-vs-post
|
|
205
|
+
* decision and the PROFILE_SELECTION_KEY handshake live inside that module.
|
|
206
|
+
*/
|
|
214
207
|
async _maybeOverrideFingerprint(page) {
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
208
|
+
await applyToPage(this.launchContext, page);
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Records the launch-time inputs the saveSession() helper later needs to read
|
|
212
|
+
* off the page — fingerprintConfig, fingerprintOptions, resolvedLocale, fingerprint,
|
|
213
|
+
* userDataDir, proxyUrl, and the sessionBundle (if any).
|
|
214
|
+
* @private
|
|
215
|
+
*/
|
|
216
|
+
async _recordLaunchSnapshot(page) {
|
|
219
217
|
try {
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
// When useNonApifyFingerprints is set, replace the Crawlee-provided
|
|
228
|
-
// synthetic fingerprint with a real Chrome device profile. All fields
|
|
229
|
-
// (navigator, screen, GPU, UA-CH) come from the same physical device,
|
|
230
|
-
// guaranteeing cross-property consistency that synthetic generators miss.
|
|
231
|
-
const _fpOpts = this.launchContext.launchOptions?.fingerprintOptions;
|
|
232
|
-
if (_fpOpts?.useNonApifyFingerprints) {
|
|
233
|
-
const osHint = (() => {
|
|
234
|
-
const p = (fp?.navigator?.platform || '').toLowerCase();
|
|
235
|
-
if (p.includes('mac'))
|
|
236
|
-
return 'macos';
|
|
237
|
-
if (p.includes('linux'))
|
|
238
|
-
return 'linux';
|
|
239
|
-
return 'windows';
|
|
240
|
-
})();
|
|
241
|
-
const proxySeedKey = this.launchContext.proxyUrl
|
|
242
|
-
? (this.launchContext.proxyUrl.match(/session-([^,&]+)/i)?.[1] ?? null)
|
|
243
|
-
: null;
|
|
244
|
-
fingerprint = await generateNonApifyFingerprint({
|
|
245
|
-
os: osHint,
|
|
246
|
-
proxySeedKey,
|
|
247
|
-
});
|
|
248
|
-
fp = fingerprint.fingerprint;
|
|
249
|
-
this.launchContext.fingerprint = fingerprint;
|
|
250
|
-
log.info('Using non-Apify real Chrome device fingerprint', {
|
|
251
|
-
os: osHint,
|
|
252
|
-
platform: fp?.navigator?.platform,
|
|
253
|
-
userAgent: `${(fp?.navigator?.userAgent || '').substring(0, 70)}...`,
|
|
254
|
-
webglRenderer: (fp?.videoCard?.renderer || '').substring(0, 70),
|
|
255
|
-
});
|
|
256
|
-
}
|
|
257
|
-
if (fingerprintGeneratorOptions?.operatingSystems?.length > 0) {
|
|
258
|
-
const requestedOS = fingerprintGeneratorOptions.operatingSystems[0]?.toLowerCase();
|
|
259
|
-
const currentPlatform = fp?.navigator?.platform?.toLowerCase() || '';
|
|
260
|
-
// Map platform names to OS names
|
|
261
|
-
const platformToOS = {
|
|
262
|
-
'win32': 'windows',
|
|
263
|
-
'macintel': 'macos',
|
|
264
|
-
'linux x86_64': 'linux',
|
|
265
|
-
'linux': 'linux',
|
|
266
|
-
};
|
|
267
|
-
const currentOS = platformToOS[currentPlatform] || currentPlatform;
|
|
268
|
-
// Check if the fingerprint matches the requested OS
|
|
269
|
-
const osMatches = requestedOS === currentOS ||
|
|
270
|
-
(requestedOS === 'windows' && currentPlatform.includes('win')) ||
|
|
271
|
-
(requestedOS === 'macos' && currentPlatform.includes('mac')) ||
|
|
272
|
-
(requestedOS === 'linux' && currentPlatform.includes('linux'));
|
|
273
|
-
if (!osMatches) {
|
|
274
|
-
log.info('Fingerprint OS mismatch detected, regenerating fingerprint', {
|
|
275
|
-
requestedOS,
|
|
276
|
-
currentPlatform,
|
|
277
|
-
currentOS,
|
|
278
|
-
fingerprintGeneratorOptions,
|
|
279
|
-
});
|
|
280
|
-
// Regenerate fingerprint with correct options using fingerprint-generator directly
|
|
281
|
-
try {
|
|
282
|
-
const generator = new FingerprintGenerator(fingerprintGeneratorOptions);
|
|
283
|
-
fingerprint = generator.getFingerprint();
|
|
284
|
-
fp = fingerprint.fingerprint;
|
|
285
|
-
// Update the launch context with the regenerated fingerprint
|
|
286
|
-
this.launchContext.fingerprint = fingerprint;
|
|
287
|
-
log.info('Fingerprint regenerated successfully', {
|
|
288
|
-
newPlatform: fp?.navigator?.platform,
|
|
289
|
-
newUserAgent: `${(fp?.navigator?.userAgent || '').substring(0, 50)}...`,
|
|
290
|
-
});
|
|
291
|
-
}
|
|
292
|
-
catch (regenerateError) {
|
|
293
|
-
log.error('Failed to regenerate fingerprint, using original', { error: regenerateError });
|
|
294
|
-
}
|
|
295
|
-
}
|
|
296
|
-
else {
|
|
297
|
-
log.debug('Fingerprint OS matches requested OS', { requestedOS, currentPlatform });
|
|
298
|
-
}
|
|
299
|
-
}
|
|
300
|
-
const webgl = fp?.webgl;
|
|
301
|
-
log.debug('Fingerprint data from generator:', {
|
|
302
|
-
hasFingerprint: !!fp,
|
|
303
|
-
hasHeaders: !!fingerprint.headers,
|
|
304
|
-
navigatorPlatform: fp?.navigator?.platform,
|
|
305
|
-
navigatorUserAgent: `${(fp?.navigator?.userAgent || '').substring(0, 50)}...`,
|
|
306
|
-
screenWidth: fp?.screen?.width,
|
|
307
|
-
screenHeight: fp?.screen?.height,
|
|
308
|
-
webglVendor: webgl?.vendorUnmasked?.substring(0, 30),
|
|
309
|
-
webglRenderer: webgl?.rendererUnmasked?.substring(0, 50),
|
|
310
|
-
});
|
|
311
|
-
// Detect platform from fingerprint or default to Windows for better evasion
|
|
312
|
-
const fingerprintPlatform = fp?.navigator?.platform;
|
|
313
|
-
const platform = fingerprintPlatform || 'Win32'; // Default to Windows instead of Linux
|
|
314
|
-
// Determine if we're running on Apify
|
|
315
|
-
const isApify = process.env.APIFY_IS_AT_HOME === 'true';
|
|
316
|
-
// Get fingerprint options from launch context
|
|
317
|
-
const fingerprintOptions = this.launchContext.launchOptions?.fingerprintOptions || {};
|
|
318
|
-
// Get recommended settings based on environment
|
|
319
|
-
const defaultOptions = isApify
|
|
320
|
-
? CdpFingerprintInjector.getApifyRecommendedSettings()
|
|
321
|
-
: {
|
|
322
|
-
debug: false, // Disable debug logging - anti-bot services detect debug prefixes
|
|
323
|
-
enableAdvancedStealth: true,
|
|
324
|
-
bypassRuntimeEnable: true,
|
|
325
|
-
spoofWebGL: true,
|
|
326
|
-
spoofAudioContext: true,
|
|
327
|
-
spoofClientRects: true,
|
|
328
|
-
spoofFonts: true,
|
|
329
|
-
spoofPerformance: true,
|
|
330
|
-
spoofLocale: true,
|
|
331
|
-
detectTimezone: !!this.launchContext.proxyUrl,
|
|
332
|
-
useFingerprintDefaults: true, // Use hardcoded defaults (set to false to use generated fingerprint data)
|
|
333
|
-
// 2024-2025 new defaults
|
|
334
|
-
bypassCDPDetection: true,
|
|
335
|
-
spoofStorage: true,
|
|
336
|
-
spoofTiming: true,
|
|
337
|
-
enableDataDomeBypass: false,
|
|
338
|
-
webRtcPolicy: 'spoof',
|
|
339
|
-
// Safe defaults for humanized interaction patterns
|
|
340
|
-
humanization: {
|
|
341
|
-
mouse: true,
|
|
342
|
-
keyboard: true,
|
|
343
|
-
scroll: true,
|
|
344
|
-
},
|
|
345
|
-
};
|
|
346
|
-
// Determine effective useFingerprintDefaults value.
|
|
347
|
-
// Real device profiles (useNonApifyFingerprints=true) contain consistent cross-property
|
|
348
|
-
// data measured from a real device — default to using it (useFingerprintDefaults=false).
|
|
349
|
-
// Synthetic Apify-generated fingerprints need the hardcoded defaults to avoid
|
|
350
|
-
// injecting inconsistent generated values, so they keep useFingerprintDefaults=true.
|
|
351
|
-
const usingRealDeviceProfile = !!_fpOpts?.useNonApifyFingerprints;
|
|
352
|
-
const effectiveUseFingerprintDefaults = fingerprintOptions.useFingerprintDefaults
|
|
353
|
-
?? (usingRealDeviceProfile ? false : (defaultOptions.useFingerprintDefaults ?? true));
|
|
354
|
-
// Platform selection logic:
|
|
355
|
-
// - When useFingerprintDefaults is false: prefer generated fingerprint platform
|
|
356
|
-
// - When useFingerprintDefaults is true (default): prefer hardcoded fingerprintOptions.platform
|
|
357
|
-
const effectivePlatform = effectiveUseFingerprintDefaults === false
|
|
358
|
-
? (platform || fingerprintOptions.platform || 'Win32') // Generated fingerprint first
|
|
359
|
-
: (fingerprintOptions.platform || platform || 'Win32'); // Hardcoded option first
|
|
360
|
-
// Check useNativeStealth from all possible locations (in priority order):
|
|
361
|
-
// 1. Top-level launchOptions (e.g. CDPBrowserPlugin constructor arg)
|
|
362
|
-
// 2. Inside fingerprintOptions (e.g. datadome test / crawler launchOptions)
|
|
363
|
-
// 3. At launchContext root (some CDPCrawler launchContext configurations)
|
|
364
|
-
const useNativeStealth = !!this.launchContext.launchOptions?.useNativeStealth ||
|
|
365
|
-
!!this.launchContext.launchOptions?.fingerprintOptions?.useNativeStealth ||
|
|
366
|
-
!!this.launchContext?.useNativeStealth;
|
|
367
|
-
// Resolved locale triple is populated in browser-plugin before launch. Pass the
|
|
368
|
-
// whole thing through so the injector sets navigator.language, Accept-Language,
|
|
369
|
-
// Intl defaults, and timezone from one coherent source of truth.
|
|
370
|
-
const resolvedLocale = this.launchContext.launchOptions?.resolvedLocale;
|
|
371
|
-
// Merge humanization options properly
|
|
372
|
-
const mergedOptions = {
|
|
373
|
-
...defaultOptions,
|
|
374
|
-
...fingerprintOptions,
|
|
375
|
-
useNativeStealth,
|
|
376
|
-
// Explicitly set the computed effective value — the spread above would resolve to
|
|
377
|
-
// defaultOptions.useFingerprintDefaults (always true) when fingerprintOptions
|
|
378
|
-
// does not include the key, so we must override it here.
|
|
379
|
-
useFingerprintDefaults: effectiveUseFingerprintDefaults,
|
|
218
|
+
const launchOptions = this.launchContext.launchOptions ?? {};
|
|
219
|
+
page.setLaunchSnapshot({
|
|
220
|
+
fingerprintConfig: launchOptions.fingerprintConfig,
|
|
221
|
+
fingerprintOptions: (launchOptions.fingerprintOptions ?? {}),
|
|
222
|
+
resolvedLocale: launchOptions.resolvedLocale,
|
|
223
|
+
fingerprint: this.launchContext.fingerprint,
|
|
224
|
+
userDataDir: launchOptions.userDataDir,
|
|
380
225
|
proxyUrl: this.launchContext.proxyUrl,
|
|
381
|
-
|
|
382
|
-
viewport: this.launchContext.launchOptions?.viewport,
|
|
383
|
-
resolvedLocale,
|
|
384
|
-
// Ensure humanization options are properly merged
|
|
385
|
-
humanization: {
|
|
386
|
-
...defaultOptions.humanization,
|
|
387
|
-
...fingerprintOptions.humanization,
|
|
388
|
-
},
|
|
389
|
-
};
|
|
390
|
-
await CdpFingerprintInjector.injectFingerprint(page, fingerprint, mergedOptions);
|
|
391
|
-
page.setHumanizationOptions(mergedOptions.humanization);
|
|
392
|
-
log.info('Fingerprint injected successfully', {
|
|
393
|
-
platform: mergedOptions.platform,
|
|
394
|
-
isApify,
|
|
395
|
-
hasProxy: !!this.launchContext.proxyUrl,
|
|
396
|
-
useFingerprintDefaults: mergedOptions.useFingerprintDefaults,
|
|
397
|
-
enableDataDomeBypass: mergedOptions.enableDataDomeBypass,
|
|
398
|
-
humanization: mergedOptions.humanization,
|
|
226
|
+
sessionBundle: launchOptions.sessionBundle,
|
|
399
227
|
});
|
|
400
228
|
}
|
|
401
|
-
catch (
|
|
402
|
-
log.
|
|
229
|
+
catch (err) {
|
|
230
|
+
log.warning('Failed to record launch snapshot on page', { err: err.message });
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Replays cookies + per-origin localStorage/sessionStorage from the sessionBundle
|
|
235
|
+
* onto a fresh page before any navigation happens.
|
|
236
|
+
* @private
|
|
237
|
+
*/
|
|
238
|
+
async _maybeRestoreSession(page) {
|
|
239
|
+
const bundle = this.launchContext.launchOptions?.sessionBundle;
|
|
240
|
+
if (!bundle)
|
|
241
|
+
return;
|
|
242
|
+
try {
|
|
243
|
+
await installSessionInjectionHook(page, bundle);
|
|
244
|
+
}
|
|
245
|
+
catch (err) {
|
|
246
|
+
log.error('Failed to inject session bundle on new page', { err: err.message });
|
|
403
247
|
}
|
|
404
248
|
}
|
|
405
249
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser-controller.js","sourceRoot":"","sources":["../src/browser-controller.ts"],"names":[],"mappings":"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"}
|
|
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
|
@@ -1,119 +1,55 @@
|
|
|
1
|
+
import type { Client, Options as CdpConnectOptions } from 'chrome-remote-interface';
|
|
1
2
|
import { BrowserPlugin, type LaunchContext } from 'crawlee';
|
|
2
3
|
import type { NewPageResult } from './browser-controller.js';
|
|
3
4
|
import CDPBrowserController from './browser-controller.js';
|
|
4
|
-
import {
|
|
5
|
-
import
|
|
6
|
-
import type
|
|
7
|
-
|
|
5
|
+
import type { BaseLaunchBrowserOptions, FingerprintOptions, HumanizationOptions } from './browser-process/launch-options.js';
|
|
6
|
+
import type CdpPage from './page.js';
|
|
7
|
+
import { type SessionBundle } from './session/types.js';
|
|
8
|
+
/** A live CDP connection; new pages go through CDPBrowserController, never here. */
|
|
9
|
+
export interface LaunchReturn extends Client {
|
|
10
|
+
newPage: () => Promise<CdpPage>;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Type-only marker satisfying Crawlee's BrowserPlugin generic. CDP has no
|
|
14
|
+
* Puppeteer-style library object — the connection happens directly in
|
|
15
|
+
* CDPBrowserPlugin._openCdpConnection, so `launch` is never invoked at runtime;
|
|
16
|
+
* the declaration exists purely so Crawlee can infer LibraryOptions /
|
|
17
|
+
* LaunchResult from the generic. Constructable (`new CdpLauncher()`) because the
|
|
18
|
+
* Crawler and the e2e harness pass an instance to the plugin constructor; the
|
|
19
|
+
* body is intentionally empty rather than the former throw-only stub.
|
|
20
|
+
*/
|
|
21
|
+
export declare class CdpLauncher {
|
|
22
|
+
launch: (opts?: unknown) => Promise<LaunchReturn>;
|
|
23
|
+
}
|
|
8
24
|
type Library = CdpLauncher;
|
|
9
25
|
type LaunchResult = LaunchReturn;
|
|
10
26
|
interface NewPageOptions {
|
|
11
27
|
}
|
|
28
|
+
export type { FingerprintOptions, HumanizationOptions };
|
|
12
29
|
/**
|
|
13
|
-
*
|
|
14
|
-
*
|
|
30
|
+
* Plugin-layer launch options: everything in BaseLaunchBrowserOptions
|
|
31
|
+
* (the single shared declaration in browser-process/launch-options.ts) plus
|
|
32
|
+
* the Crawlee-facing fields only this layer knows about.
|
|
15
33
|
*/
|
|
16
|
-
export interface
|
|
17
|
-
/** Enable mouse movement humanization. Default: false */
|
|
18
|
-
mouse?: boolean;
|
|
19
|
-
/** Enable keyboard humanization. Default: false */
|
|
20
|
-
keyboard?: boolean;
|
|
21
|
-
/** Enable scroll humanization. Default: false */
|
|
22
|
-
scroll?: boolean;
|
|
23
|
-
}
|
|
24
|
-
export interface LaunchBrowserOptions {
|
|
34
|
+
export interface LaunchBrowserOptions extends BaseLaunchBrowserOptions {
|
|
25
35
|
browserType: "chrome" | "firefox";
|
|
26
36
|
useIncognitoPages: boolean;
|
|
27
37
|
proxyUrl?: string;
|
|
28
38
|
ignoreHttpsErrors: boolean;
|
|
29
|
-
headless?: boolean;
|
|
30
|
-
executablePath?: string;
|
|
31
|
-
useExperimentalFingerprints?: boolean;
|
|
32
|
-
/**
|
|
33
|
-
* Use the C++ anti-detect browser patches instead of the JS fingerprint
|
|
34
|
-
* override pipeline. Requires the custom Cromite-based binary (set via
|
|
35
|
-
* executablePath or ANTI_DETECT_CHROME_PATH). When true, the entire JS
|
|
36
|
-
* injection bundle is skipped — C++ patches handle all fingerprinting.
|
|
37
|
-
*/
|
|
38
|
-
useNativeStealth?: boolean;
|
|
39
|
-
/** Whether to start the browser maximized and fullscreen. Default: true */
|
|
40
|
-
maximizeWindow?: boolean;
|
|
41
|
-
/** Window width in pixels. Default: 1920 */
|
|
42
|
-
windowWidth?: number;
|
|
43
|
-
/** Window height in pixels. Default: 1080 */
|
|
44
|
-
windowHeight?: number;
|
|
45
|
-
/** Optional persistent Chrome profile directory. */
|
|
46
|
-
userDataDir?: string;
|
|
47
|
-
/** Keep profile directory after browser closes. */
|
|
48
|
-
keepUserDataDir?: boolean;
|
|
49
|
-
/** DNS-over-HTTPS endpoint template. */
|
|
50
|
-
dnsOverHttpsServer?: string;
|
|
51
|
-
/** Secure DNS mode. */
|
|
52
|
-
secureDnsMode?: 'off' | 'automatic' | 'secure';
|
|
53
|
-
/** WebRTC IP handling policy passed to Chrome flag. */
|
|
54
|
-
webrtcIpHandlingPolicy?: 'default' | 'default_public_interface_only' | 'default_public_and_private_interfaces' | 'disable_non_proxied_udp';
|
|
55
39
|
viewport?: {
|
|
56
40
|
width: number;
|
|
57
41
|
height: number;
|
|
58
42
|
deviceScaleFactor: number;
|
|
59
43
|
mobile: boolean;
|
|
60
44
|
};
|
|
61
|
-
fingerprintOptions?: {
|
|
62
|
-
enableAdvancedStealth?: boolean;
|
|
63
|
-
bypassRuntimeEnable?: boolean;
|
|
64
|
-
spoofWebGL?: boolean;
|
|
65
|
-
spoofAudioContext?: boolean;
|
|
66
|
-
spoofClientRects?: boolean;
|
|
67
|
-
maskAutomationFlags?: boolean;
|
|
68
|
-
useFingerprintDefaults?: boolean;
|
|
69
|
-
platform?: 'Win32' | 'MacIntel' | 'Linux x86_64';
|
|
70
|
-
spoofFonts?: boolean;
|
|
71
|
-
spoofPerformance?: boolean;
|
|
72
|
-
spoofLocale?: boolean;
|
|
73
|
-
detectTimezone?: boolean;
|
|
74
|
-
/**
|
|
75
|
-
* BCP-47 locale tag (e.g. 'ko-KR', 'de-DE'). One flag that coherently drives
|
|
76
|
-
* navigator.language(s), Accept-Language header, Intl defaults, currency
|
|
77
|
-
* symbol, date/number formatting, and timezone (derived from region).
|
|
78
|
-
* When unset, falls back to proxy-country lookup → fingerprint language → 'en-US'.
|
|
79
|
-
*/
|
|
80
|
-
locale?: string;
|
|
81
|
-
/** Explicit IANA timezone (e.g. 'Asia/Seoul'). Overrides locale-derived timezone. */
|
|
82
|
-
timezone?: string;
|
|
83
|
-
/** Explicit Accept-Language header (e.g. 'ko-KR,ko;q=0.9'). Overrides locale-derived list. */
|
|
84
|
-
languages?: string;
|
|
85
|
-
bypassCDPDetection?: boolean;
|
|
86
|
-
spoofStorage?: boolean;
|
|
87
|
-
spoofTiming?: boolean;
|
|
88
|
-
enableDataDomeBypass?: boolean;
|
|
89
|
-
webRtcPolicy?: 'spoof' | 'disable';
|
|
90
|
-
/** Humanization options (all disabled by default) */
|
|
91
|
-
humanization?: HumanizationOptions;
|
|
92
|
-
/** Enable debug logging in browser console. Default: true for debugging */
|
|
93
|
-
debug?: boolean;
|
|
94
|
-
/**
|
|
95
|
-
* Use real Chrome device profiles (Camoufox-inspired) instead of the
|
|
96
|
-
* Apify fingerprint-generator statistical model. Profiles are sampled from
|
|
97
|
-
* a bundled database of real devices where every property — navigator,
|
|
98
|
-
* screen, GPU, UA-CH — was measured on the same physical hardware,
|
|
99
|
-
* guaranteeing cross-property consistency. If the `camoufox` Python package
|
|
100
|
-
* is installed and `preferCamoufox` is true, Firefox device-level data is
|
|
101
|
-
* extracted and mapped to Chrome values.
|
|
102
|
-
* Default: false
|
|
103
|
-
*/
|
|
104
|
-
useNonApifyFingerprints?: boolean;
|
|
105
|
-
};
|
|
106
45
|
/**
|
|
107
|
-
*
|
|
108
|
-
*
|
|
46
|
+
* Optional saved-state bundle from a previous crawl (produced by `saveSession`).
|
|
47
|
+
* When set, the bundle's user-data-dir is extracted into a temp directory and used
|
|
48
|
+
* as `userDataDir`, the captured `fingerprintConfig` is fed verbatim to the native
|
|
49
|
+
* stealth path (regeneration is skipped), and cookies + per-origin web storage are
|
|
50
|
+
* replayed on every new page before navigation.
|
|
109
51
|
*/
|
|
110
|
-
|
|
111
|
-
/**
|
|
112
|
-
* Pre-resolved locale triple. Populated in browser-plugin before launch so both the
|
|
113
|
-
* native-stealth launch args and the CDP-path injector read the same values and stay
|
|
114
|
-
* coherent. Consumers should prefer this over re-deriving from fingerprintOptions.
|
|
115
|
-
*/
|
|
116
|
-
resolvedLocale?: ResolvedLocale;
|
|
52
|
+
sessionBundle?: SessionBundle;
|
|
117
53
|
}
|
|
118
54
|
export default class CDPBrowserPlugin extends BrowserPlugin<Library, LaunchBrowserOptions, LaunchResult, NewPageOptions, NewPageResult> {
|
|
119
55
|
/**
|
|
@@ -123,14 +59,15 @@ export default class CDPBrowserPlugin extends BrowserPlugin<Library, LaunchBrows
|
|
|
123
59
|
* `this.launchOptions` and properly merged into every LaunchContext.
|
|
124
60
|
*/
|
|
125
61
|
constructor(library: Library, launchOptions?: Partial<LaunchBrowserOptions>);
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
private
|
|
62
|
+
/**
|
|
63
|
+
* Debug-port pool: acquisition serialization, wraparound scan, probe-busy
|
|
64
|
+
* quarantine, and stale-port sweep all live in PortAllocator. The plugin
|
|
65
|
+
* only acquires on launch and releases from the browser event handlers.
|
|
66
|
+
* One pool per process (matching the former static state): two crawlers in
|
|
67
|
+
* one process — e.g. a session-bundle restore — must not race the same range.
|
|
68
|
+
*/
|
|
69
|
+
private portAllocator;
|
|
70
|
+
private static readonly sharedPortAllocator;
|
|
134
71
|
/**
|
|
135
72
|
*/
|
|
136
73
|
protected _addProxyToLaunchOptions(): Promise<void>;
|
|
@@ -146,6 +83,35 @@ export default class CDPBrowserPlugin extends BrowserPlugin<Library, LaunchBrows
|
|
|
146
83
|
* @private
|
|
147
84
|
*/
|
|
148
85
|
protected _launch(launchContext: LaunchContext<Library, LaunchBrowserOptions, LaunchResult, NewPageOptions, NewPageResult>): Promise<LaunchResult>;
|
|
86
|
+
/**
|
|
87
|
+
* Phase 1 of _launch — normalize the launch identity in place:
|
|
88
|
+
* default browserType, normalize useNativeStealth from its three legacy
|
|
89
|
+
* locations, auto-resolve the anti-detect binary, and adopt the
|
|
90
|
+
* fingerprint's screen dimensions when the caller didn't pin any.
|
|
91
|
+
*/
|
|
92
|
+
private _normalizeLaunchIdentity;
|
|
93
|
+
/**
|
|
94
|
+
* Phase 2 of _launch — hydrate launch state from a previously-captured
|
|
95
|
+
* session bundle: untar the user-data-dir, pin the resolved locale +
|
|
96
|
+
* fingerprintConfig verbatim, and replace the fingerprint so no generator
|
|
97
|
+
* runs (byte-for-byte replay).
|
|
98
|
+
*/
|
|
99
|
+
private _hydrateFromSessionBundle;
|
|
100
|
+
/**
|
|
101
|
+
* Phase 3 of _launch — resolve the locale triple once per launch so
|
|
102
|
+
* native-stealth args, CDP overrides, and the FingerprintConfigJson all
|
|
103
|
+
* read the same { locale, languages, timezone }. No-op when a session
|
|
104
|
+
* bundle (or an earlier caller) already pinned the triple.
|
|
105
|
+
*/
|
|
106
|
+
private _ensureResolvedLocale;
|
|
107
|
+
/**
|
|
108
|
+
* Phase 4 of _launch — thin delegate to the FingerprintConfig module's
|
|
109
|
+
* pre-launch path. It selects a clean (uncontaminated, OS-matching) profile,
|
|
110
|
+
* generates + aligns the FingerprintConfigJson, stamps the config onto
|
|
111
|
+
* launchOptions for browser-process to write, and records the selection on
|
|
112
|
+
* the launch context for the post-launch path to reuse.
|
|
113
|
+
*/
|
|
114
|
+
private _prepareNativeFingerprintConfig;
|
|
149
115
|
/**
|
|
150
116
|
* Creates a new browser controller.
|
|
151
117
|
*
|
|
@@ -164,6 +130,12 @@ export default class CDPBrowserPlugin extends BrowserPlugin<Library, LaunchBrows
|
|
|
164
130
|
* @private
|
|
165
131
|
*/
|
|
166
132
|
private _waitForPort;
|
|
133
|
+
/**
|
|
134
|
+
* Open the raw CDP connection. The newPage guard is part of the public
|
|
135
|
+
* contract: pages are created through CDPBrowserController, never here.
|
|
136
|
+
* @protected for test seams.
|
|
137
|
+
*/
|
|
138
|
+
protected _openCdpConnection(options: CdpConnectOptions): Promise<LaunchReturn>;
|
|
167
139
|
/**
|
|
168
140
|
* Tries to connect to the browser using CDP with retries.
|
|
169
141
|
*
|
|
@@ -171,5 +143,4 @@ export default class CDPBrowserPlugin extends BrowserPlugin<Library, LaunchBrows
|
|
|
171
143
|
*/
|
|
172
144
|
private _connectWithRetry;
|
|
173
145
|
}
|
|
174
|
-
export {};
|
|
175
146
|
//# sourceMappingURL=browser-plugin.d.ts.map
|