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.
Files changed (197) hide show
  1. package/README.md +1 -607
  2. package/browser/fonts/macos-bundle/40-macos-aliases.conf +497 -0
  3. package/browser/fonts/macos-bundle/README.md +24 -0
  4. package/browser/fonts/macos-bundle/install.sh +83 -0
  5. package/dist/browser-controller.d.ts +21 -3
  6. package/dist/browser-controller.d.ts.map +1 -1
  7. package/dist/browser-controller.js +75 -231
  8. package/dist/browser-controller.js.map +1 -1
  9. package/dist/browser-plugin.d.ts +75 -104
  10. package/dist/browser-plugin.d.ts.map +1 -1
  11. package/dist/browser-plugin.js +241 -280
  12. package/dist/browser-plugin.js.map +1 -1
  13. package/dist/browser-process/align-fingerprint-config.d.ts +40 -0
  14. package/dist/browser-process/align-fingerprint-config.d.ts.map +1 -0
  15. package/dist/browser-process/align-fingerprint-config.js +79 -0
  16. package/dist/browser-process/align-fingerprint-config.js.map +1 -0
  17. package/dist/browser-process/anti-detect-config.d.ts +130 -1
  18. package/dist/browser-process/anti-detect-config.d.ts.map +1 -1
  19. package/dist/browser-process/anti-detect-config.js +353 -110
  20. package/dist/browser-process/anti-detect-config.js.map +1 -1
  21. package/dist/browser-process/browser.d.ts +37 -89
  22. package/dist/browser-process/browser.d.ts.map +1 -1
  23. package/dist/browser-process/browser.js +389 -85
  24. package/dist/browser-process/browser.js.map +1 -1
  25. package/dist/browser-process/fingerprint-config.d.ts +103 -0
  26. package/dist/browser-process/fingerprint-config.d.ts.map +1 -0
  27. package/dist/browser-process/fingerprint-config.js +245 -0
  28. package/dist/browser-process/fingerprint-config.js.map +1 -0
  29. package/dist/browser-process/get-chrome-executable.d.ts +6 -0
  30. package/dist/browser-process/get-chrome-executable.d.ts.map +1 -1
  31. package/dist/browser-process/get-chrome-executable.js +23 -0
  32. package/dist/browser-process/get-chrome-executable.js.map +1 -1
  33. package/dist/browser-process/gpu-family-profiles.d.ts +53 -0
  34. package/dist/browser-process/gpu-family-profiles.d.ts.map +1 -0
  35. package/dist/browser-process/gpu-family-profiles.js +395 -0
  36. package/dist/browser-process/gpu-family-profiles.js.map +1 -0
  37. package/dist/browser-process/index.d.ts +1 -1
  38. package/dist/browser-process/index.d.ts.map +1 -1
  39. package/dist/browser-process/index.js +1 -1
  40. package/dist/browser-process/index.js.map +1 -1
  41. package/dist/browser-process/launch-options.d.ts +195 -0
  42. package/dist/browser-process/launch-options.d.ts.map +1 -0
  43. package/dist/browser-process/launch-options.js +2 -0
  44. package/dist/browser-process/launch-options.js.map +1 -0
  45. package/dist/browser-process/port-allocator.d.ts +46 -0
  46. package/dist/browser-process/port-allocator.d.ts.map +1 -0
  47. package/dist/browser-process/port-allocator.js +171 -0
  48. package/dist/browser-process/port-allocator.js.map +1 -0
  49. package/dist/browser-process/process.d.ts +35 -0
  50. package/dist/browser-process/process.d.ts.map +1 -1
  51. package/dist/browser-process/process.js +110 -0
  52. package/dist/browser-process/process.js.map +1 -1
  53. package/dist/browser-process/signal-cleanup.d.ts +37 -0
  54. package/dist/browser-process/signal-cleanup.d.ts.map +1 -0
  55. package/dist/browser-process/signal-cleanup.js +93 -0
  56. package/dist/browser-process/signal-cleanup.js.map +1 -0
  57. package/dist/connection/cdp-reconnection.d.ts +61 -0
  58. package/dist/connection/cdp-reconnection.d.ts.map +1 -0
  59. package/dist/connection/cdp-reconnection.js +98 -0
  60. package/dist/connection/cdp-reconnection.js.map +1 -0
  61. package/dist/connection/page-session.d.ts +109 -0
  62. package/dist/connection/page-session.d.ts.map +1 -0
  63. package/dist/connection/page-session.js +257 -0
  64. package/dist/connection/page-session.js.map +1 -0
  65. package/dist/crawler.d.ts +30 -1
  66. package/dist/crawler.d.ts.map +1 -1
  67. package/dist/crawler.js +97 -7
  68. package/dist/crawler.js.map +1 -1
  69. package/dist/fingerprinting/fingerprint-injector.d.ts +6 -116
  70. package/dist/fingerprinting/fingerprint-injector.d.ts.map +1 -1
  71. package/dist/fingerprinting/fingerprint-injector.js +82 -531
  72. package/dist/fingerprinting/fingerprint-injector.js.map +1 -1
  73. package/dist/fingerprinting/fingerprint-overrides/index.d.ts +6 -2
  74. package/dist/fingerprinting/fingerprint-overrides/index.d.ts.map +1 -1
  75. package/dist/fingerprinting/fingerprint-overrides/index.js +6 -2
  76. package/dist/fingerprinting/fingerprint-overrides/index.js.map +1 -1
  77. package/dist/fingerprinting/fingerprint-overrides/navigator-override.d.ts +18 -0
  78. package/dist/fingerprinting/fingerprint-overrides/navigator-override.d.ts.map +1 -0
  79. package/dist/fingerprinting/fingerprint-overrides/navigator-override.js +136 -0
  80. package/dist/fingerprinting/fingerprint-overrides/navigator-override.js.map +1 -0
  81. package/dist/fingerprinting/fingerprint-overrides/override.d.ts +137 -0
  82. package/dist/fingerprinting/fingerprint-overrides/override.d.ts.map +1 -0
  83. package/dist/fingerprinting/fingerprint-overrides/override.js +14 -0
  84. package/dist/fingerprinting/fingerprint-overrides/override.js.map +1 -0
  85. package/dist/fingerprinting/fingerprint-overrides/platform-consistency.d.ts.map +1 -1
  86. package/dist/fingerprinting/fingerprint-overrides/platform-consistency.js +42 -11
  87. package/dist/fingerprinting/fingerprint-overrides/platform-consistency.js.map +1 -1
  88. package/dist/fingerprinting/fingerprint-overrides/registry.d.ts +27 -0
  89. package/dist/fingerprinting/fingerprint-overrides/registry.d.ts.map +1 -0
  90. package/dist/fingerprinting/fingerprint-overrides/registry.js +285 -0
  91. package/dist/fingerprinting/fingerprint-overrides/registry.js.map +1 -0
  92. package/dist/fingerprinting/fingerprint-overrides/screen-override.d.ts +16 -0
  93. package/dist/fingerprinting/fingerprint-overrides/screen-override.d.ts.map +1 -0
  94. package/dist/fingerprinting/fingerprint-overrides/screen-override.js +175 -0
  95. package/dist/fingerprinting/fingerprint-overrides/screen-override.js.map +1 -0
  96. package/dist/fingerprinting/fingerprint-overrides/stealth-script.d.ts.map +1 -1
  97. package/dist/fingerprinting/fingerprint-overrides/stealth-script.js +72 -6
  98. package/dist/fingerprinting/fingerprint-overrides/stealth-script.js.map +1 -1
  99. package/dist/fingerprinting/fingerprint-overrides/webgl-spoofing.d.ts.map +1 -1
  100. package/dist/fingerprinting/fingerprint-overrides/webgl-spoofing.js +23 -4
  101. package/dist/fingerprinting/fingerprint-overrides/webgl-spoofing.js.map +1 -1
  102. package/dist/fingerprinting/injection-planner.d.ts +178 -0
  103. package/dist/fingerprinting/injection-planner.d.ts.map +1 -0
  104. package/dist/fingerprinting/injection-planner.js +376 -0
  105. package/dist/fingerprinting/injection-planner.js.map +1 -0
  106. package/dist/fingerprinting/locale-resolver.d.ts +7 -0
  107. package/dist/fingerprinting/locale-resolver.d.ts.map +1 -1
  108. package/dist/fingerprinting/locale-resolver.js +24 -1
  109. package/dist/fingerprinting/locale-resolver.js.map +1 -1
  110. package/dist/fingerprinting/non-apify-fingerprint-generator.d.ts +23 -11
  111. package/dist/fingerprinting/non-apify-fingerprint-generator.d.ts.map +1 -1
  112. package/dist/fingerprinting/non-apify-fingerprint-generator.js +53 -15
  113. package/dist/fingerprinting/non-apify-fingerprint-generator.js.map +1 -1
  114. package/dist/fingerprinting/non-apify-profiles.json +52186 -0
  115. package/dist/fingerprinting/os-consistency.d.ts +31 -0
  116. package/dist/fingerprinting/os-consistency.d.ts.map +1 -0
  117. package/dist/fingerprinting/os-consistency.js +50 -0
  118. package/dist/fingerprinting/os-consistency.js.map +1 -0
  119. package/dist/fingerprinting/profile-quality.d.ts +24 -0
  120. package/dist/fingerprinting/profile-quality.d.ts.map +1 -0
  121. package/dist/fingerprinting/profile-quality.js +165 -0
  122. package/dist/fingerprinting/profile-quality.js.map +1 -0
  123. package/dist/fingerprinting/profile-selector.d.ts +101 -0
  124. package/dist/fingerprinting/profile-selector.d.ts.map +1 -0
  125. package/dist/fingerprinting/profile-selector.js +156 -0
  126. package/dist/fingerprinting/profile-selector.js.map +1 -0
  127. package/dist/fingerprinting/ua-alignment.d.ts +51 -0
  128. package/dist/fingerprinting/ua-alignment.d.ts.map +1 -0
  129. package/dist/fingerprinting/ua-alignment.js +146 -0
  130. package/dist/fingerprinting/ua-alignment.js.map +1 -0
  131. package/dist/index.d.ts +5 -0
  132. package/dist/index.d.ts.map +1 -1
  133. package/dist/index.js +6 -0
  134. package/dist/index.js.map +1 -1
  135. package/dist/input/dropdown-selector.d.ts +74 -0
  136. package/dist/input/dropdown-selector.d.ts.map +1 -0
  137. package/dist/input/dropdown-selector.js +306 -0
  138. package/dist/input/dropdown-selector.js.map +1 -0
  139. package/dist/input/element-target.d.ts +117 -0
  140. package/dist/input/element-target.d.ts.map +1 -0
  141. package/dist/input/element-target.js +383 -0
  142. package/dist/input/element-target.js.map +1 -0
  143. package/dist/input/input-emulator.d.ts +85 -0
  144. package/dist/input/input-emulator.d.ts.map +1 -0
  145. package/dist/input/input-emulator.js +319 -0
  146. package/dist/input/input-emulator.js.map +1 -0
  147. package/dist/input/input-transport.d.ts +60 -0
  148. package/dist/input/input-transport.d.ts.map +1 -0
  149. package/dist/input/input-transport.js +28 -0
  150. package/dist/input/input-transport.js.map +1 -0
  151. package/dist/input/recording-transport.d.ts +32 -0
  152. package/dist/input/recording-transport.d.ts.map +1 -0
  153. package/dist/input/recording-transport.js +43 -0
  154. package/dist/input/recording-transport.js.map +1 -0
  155. package/dist/navigation/page-navigation.d.ts +67 -0
  156. package/dist/navigation/page-navigation.d.ts.map +1 -0
  157. package/dist/navigation/page-navigation.js +107 -0
  158. package/dist/navigation/page-navigation.js.map +1 -0
  159. package/dist/network/network-watch.d.ts +72 -0
  160. package/dist/network/network-watch.d.ts.map +1 -0
  161. package/dist/network/network-watch.js +143 -0
  162. package/dist/network/network-watch.js.map +1 -0
  163. package/dist/page.d.ts +90 -103
  164. package/dist/page.d.ts.map +1 -1
  165. package/dist/page.js +184 -1117
  166. package/dist/page.js.map +1 -1
  167. package/dist/session/inject-hook.d.ts +24 -0
  168. package/dist/session/inject-hook.d.ts.map +1 -0
  169. package/dist/session/inject-hook.js +80 -0
  170. package/dist/session/inject-hook.js.map +1 -0
  171. package/dist/session/save.d.ts +21 -0
  172. package/dist/session/save.d.ts.map +1 -0
  173. package/dist/session/save.js +163 -0
  174. package/dist/session/save.js.map +1 -0
  175. package/dist/session/tar-data-dir.d.ts +13 -0
  176. package/dist/session/tar-data-dir.d.ts.map +1 -0
  177. package/dist/session/tar-data-dir.js +107 -0
  178. package/dist/session/tar-data-dir.js.map +1 -0
  179. package/dist/session/types.d.ts +80 -0
  180. package/dist/session/types.d.ts.map +1 -0
  181. package/dist/session/types.js +29 -0
  182. package/dist/session/types.js.map +1 -0
  183. package/dist/session-profile.d.ts +79 -0
  184. package/dist/session-profile.d.ts.map +1 -0
  185. package/dist/session-profile.js +124 -0
  186. package/dist/session-profile.js.map +1 -0
  187. package/dist/tsconfig.build.tsbuildinfo +1 -1
  188. package/package.json +16 -9
  189. package/scripts/postinstall.cjs +58 -0
  190. package/dist/fingerprinting/custom-fingerprint-injector.d.ts +0 -87
  191. package/dist/fingerprinting/custom-fingerprint-injector.d.ts.map +0 -1
  192. package/dist/fingerprinting/custom-fingerprint-injector.js +0 -342
  193. package/dist/fingerprinting/custom-fingerprint-injector.js.map +0 -1
  194. package/dist/launcher-wrap.d.ts +0 -10
  195. package/dist/launcher-wrap.d.ts.map +0 -1
  196. package/dist/launcher-wrap.js +0 -11
  197. 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 { FingerprintGenerator } from 'fingerprint-generator';
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
- let attempt = 0;
39
- while (attempt < maxInitAttempts) {
40
- try {
41
- this.client = await CDP({
42
- port: this.launchContext.debuggingPort,
43
- local: true,
44
- });
45
- this._attachDisconnectListener();
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
- if (attempt === maxInitAttempts) {
52
- throw error;
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
- this.reconnectAttempts = 0;
84
- while (this.reconnectAttempts < maxAttempts) {
85
- try {
86
- log.info(`Reconnect attempt ${this.reconnectAttempts + 1} of ${maxAttempts}`);
87
- // Connect to browser target directly
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', // This connects to the root target without creating new ones
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
- catch (error) {
103
- this.reconnectAttempts++;
104
- log.error(`Reconnect attempt ${this.reconnectAttempts} failed.`, error);
105
- if (this.reconnectAttempts === maxAttempts) {
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
- if (!this.launchContext.fingerprint) {
216
- log.debug('No fingerprint provided in launchContext, skipping fingerprint injection');
217
- return;
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
- // Get fingerprint generator options from launch context (passed from browserPoolOptions)
221
- const fingerprintGeneratorOptions = this.launchContext.launchOptions?.fingerprintGeneratorOptions;
222
- // Check if we need to regenerate the fingerprint based on OS mismatch
223
- const { fingerprint: launchFingerprint } = this.launchContext;
224
- let fingerprint = launchFingerprint;
225
- let fp = fingerprint.fingerprint;
226
- // ── Non-Apify real-device fingerprint override ───────────────────────
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
- platform: effectivePlatform,
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 (error) {
402
- log.error('Error attaching fingerprint', { error });
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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"}
@@ -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 { type FingerprintConfigJson } from './browser-process/anti-detect-config.js';
5
- import { type ResolvedLocale } from './fingerprinting/locale-resolver.js';
6
- import type { LaunchReturn } from './launcher-wrap.js';
7
- import { CdpLauncher } from './launcher-wrap.js';
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
- * Humanization options for simulating realistic user behavior
14
- * All options are disabled by default for performance
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 HumanizationOptions {
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
- * Pre-generated FingerprintConfig JSON for native stealth. Written to --fingerprint-config
108
- * before the browser launches so C++ patches get per-session hardware fingerprints.
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
- fingerprintConfig?: FingerprintConfigJson;
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
- private static readonly PORT_RANGE;
127
- private static usedPorts;
128
- private static lastAssignedPort;
129
- private static portLock;
130
- private getNextAvailablePort;
131
- private _cleanupStalePorts;
132
- private _isPortAvailable;
133
- private releasePort;
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