jumpy-lion 0.1.6-beta.9 → 1.0.0-beta.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -607
- package/browser/fonts/macos-bundle/41-macos-remaining.conf +157 -0
- package/browser/fonts/macos-bundle/README.md +24 -0
- package/browser/fonts/macos-bundle/build-metric-fonts.py +1010 -0
- package/browser/fonts/macos-bundle/generated/AmericanTypewriter-Bold.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/AmericanTypewriter-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/AndaleMono-Bold.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/AndaleMono-BoldItalic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/AndaleMono-Italic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/AndaleMono-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/AppleChancery-Bold.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/AppleChancery-BoldItalic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/AppleChancery-Italic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/AppleChancery-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Arial-Bold.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Arial-BoldItalic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Arial-Italic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Arial-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/ArialBlack-Bold.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/ArialBlack-BoldItalic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/ArialBlack-Italic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/ArialBlack-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/ArialNarrow-Bold.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/ArialNarrow-BoldItalic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/ArialNarrow-Italic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/ArialNarrow-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Avenir-Bold.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Avenir-BoldItalic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Avenir-Italic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Avenir-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/AvenirNext-Bold.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/AvenirNext-BoldItalic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/AvenirNext-Italic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/AvenirNext-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/AvenirNextCondensed-Bold.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/AvenirNextCondensed-BoldItalic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/AvenirNextCondensed-Italic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/AvenirNextCondensed-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Baskerville-Bold.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Baskerville-BoldItalic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Baskerville-Italic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Baskerville-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/BigCaslon-Bold.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/BigCaslon-BoldItalic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/BigCaslon-Italic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/BigCaslon-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/BlinkMacSystemFont-Bold.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/BlinkMacSystemFont-BoldItalic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/BlinkMacSystemFont-Italic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/BlinkMacSystemFont-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Bodoni72-Bold.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Bodoni72-BoldItalic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Bodoni72-Italic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Bodoni72-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Bodoni72Oldstyle-Bold.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Bodoni72Oldstyle-BoldItalic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Bodoni72Oldstyle-Italic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Bodoni72Oldstyle-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Bodoni72Smallcaps-Bold.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Bodoni72Smallcaps-BoldItalic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Bodoni72Smallcaps-Italic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Bodoni72Smallcaps-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/BradleyHand-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/BrushScriptMT-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Chalkboard-Bold.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Chalkboard-BoldItalic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Chalkboard-Italic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Chalkboard-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/ChalkboardSE-Bold.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/ChalkboardSE-BoldItalic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/ChalkboardSE-Italic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/ChalkboardSE-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Chalkduster-Bold.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Chalkduster-BoldItalic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Chalkduster-Italic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Chalkduster-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Charter-Bold.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Charter-BoldItalic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Charter-Italic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Charter-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Cochin-Bold.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Cochin-BoldItalic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Cochin-Italic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Cochin-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/ComicSansMS-Bold.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/ComicSansMS-BoldItalic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/ComicSansMS-Italic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/ComicSansMS-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Copperplate-Bold.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Copperplate-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Courier-Bold.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Courier-BoldItalic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Courier-Italic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Courier-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/CourierNew-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Didot-Bold.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Didot-BoldItalic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Didot-Italic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Didot-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Futura-Bold.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Futura-BoldItalic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Futura-Italic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Futura-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Geneva-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Georgia-Bold.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Georgia-BoldItalic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Georgia-Italic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Georgia-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/GillSans-Bold.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/GillSans-BoldItalic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/GillSans-Italic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/GillSans-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Helvetica-Bold.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Helvetica-BoldItalic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Helvetica-Italic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Helvetica-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/HelveticaNeue-Bold.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/HelveticaNeue-BoldItalic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/HelveticaNeue-Italic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/HelveticaNeue-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Herculanum-Bold.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Herculanum-BoldItalic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Herculanum-Italic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Herculanum-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/HoeflerText-Bold.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/HoeflerText-BoldItalic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/HoeflerText-Italic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/HoeflerText-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Impact-Bold.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Impact-BoldItalic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Impact-Italic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Impact-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/LucidaGrande-Bold.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/LucidaGrande-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/MarkerFelt-Bold.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/MarkerFelt-BoldItalic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/MarkerFelt-Italic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/MarkerFelt-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Menlo-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Monaco-Bold.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Monaco-BoldItalic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Monaco-Italic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Monaco-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Noteworthy-Bold.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Noteworthy-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Optima-Bold.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Optima-BoldItalic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Optima-Italic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Optima-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Palatino-Bold.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Palatino-BoldItalic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Palatino-Italic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Palatino-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Papyrus-Bold.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Papyrus-BoldItalic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Papyrus-Italic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Papyrus-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/PartyLET-Bold.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/PartyLET-BoldItalic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/PartyLET-Italic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/PartyLET-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Phosphate-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/README.md +132 -0
- package/browser/fonts/macos-bundle/generated/Rockwell-Bold.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Rockwell-BoldItalic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Rockwell-Italic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Rockwell-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/SavoyeLET-Bold.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/SavoyeLET-BoldItalic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/SavoyeLET-Italic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/SavoyeLET-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Seravek-Bold.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Seravek-BoldItalic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Seravek-Italic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Seravek-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/SignPainter-Bold.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/SignPainter-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Skia-Bold.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Skia-BoldItalic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Skia-Italic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Skia-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/SnellRoundhand-Bold.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/SnellRoundhand-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Tahoma-Bold.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Tahoma-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Times-Bold.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Times-BoldItalic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Times-Italic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Times-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/TimesNewRoman-Bold.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/TimesNewRoman-BoldItalic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/TimesNewRoman-Italic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/TimesNewRoman-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Trattatello-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/TrebuchetMS-Bold.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/TrebuchetMS-BoldItalic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/TrebuchetMS-Italic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/TrebuchetMS-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Verdana-Bold.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Verdana-BoldItalic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Verdana-Italic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Verdana-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Webdings-Bold.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Webdings-BoldItalic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Webdings-Italic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Webdings-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Zapfino-Bold.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Zapfino-BoldItalic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Zapfino-Italic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Zapfino-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/manifest.json +2928 -0
- package/browser/fonts/macos-bundle/generated/systemui-Bold.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/systemui-BoldItalic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/systemui-Italic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/systemui-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/install.sh +136 -0
- package/browser/fonts/macos-bundle/vendor/README.md +30 -0
- package/browser/fonts/macos-bundle/vendor/anton/Anton-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/vendor/anton/OFL.txt +93 -0
- package/browser/fonts/macos-bundle/vendor/gelasio/Gelasio-Italic-VariableFont_wght.ttf +0 -0
- package/browser/fonts/macos-bundle/vendor/gelasio/Gelasio-VariableFont_wght.ttf +0 -0
- package/browser/fonts/macos-bundle/vendor/gelasio/OFL.txt +93 -0
- package/browser/fonts/macos-bundle/verify-metric-fonts.py +171 -0
- package/dist/browser-controller.d.ts +47 -4
- package/dist/browser-controller.d.ts.map +1 -1
- package/dist/browser-controller.js +219 -278
- package/dist/browser-controller.js.map +1 -1
- package/dist/browser-plugin.d.ts +82 -110
- package/dist/browser-plugin.d.ts.map +1 -1
- package/dist/browser-plugin.js +405 -379
- package/dist/browser-plugin.js.map +1 -1
- package/dist/browser-process/align-fingerprint-config.d.ts +36 -0
- package/dist/browser-process/align-fingerprint-config.d.ts.map +1 -0
- package/dist/browser-process/align-fingerprint-config.js +74 -0
- package/dist/browser-process/align-fingerprint-config.js.map +1 -0
- package/dist/browser-process/anti-detect-browser.d.ts +2 -2
- package/dist/browser-process/anti-detect-browser.js +7 -7
- package/dist/browser-process/anti-detect-config.d.ts +146 -2
- package/dist/browser-process/anti-detect-config.d.ts.map +1 -1
- package/dist/browser-process/anti-detect-config.js +432 -127
- package/dist/browser-process/anti-detect-config.js.map +1 -1
- package/dist/browser-process/browser.d.ts +25 -92
- package/dist/browser-process/browser.d.ts.map +1 -1
- package/dist/browser-process/browser.js +467 -79
- package/dist/browser-process/browser.js.map +1 -1
- package/dist/browser-process/fingerprint-config.d.ts +146 -0
- package/dist/browser-process/fingerprint-config.d.ts.map +1 -0
- package/dist/browser-process/fingerprint-config.js +351 -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 +79 -4
- package/dist/browser-process/get-chrome-executable.js.map +1 -1
- package/dist/browser-process/gpu-family-profiles.d.ts +58 -0
- package/dist/browser-process/gpu-family-profiles.d.ts.map +1 -0
- package/dist/browser-process/gpu-family-profiles.js +480 -0
- package/dist/browser-process/gpu-family-profiles.js.map +1 -0
- package/dist/browser-process/launch-options.d.ts +301 -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 +64 -0
- package/dist/browser-process/port-allocator.d.ts.map +1 -0
- package/dist/browser-process/port-allocator.js +198 -0
- package/dist/browser-process/port-allocator.js.map +1 -0
- package/dist/browser-process/process.d.ts +85 -0
- package/dist/browser-process/process.d.ts.map +1 -1
- package/dist/browser-process/process.js +235 -19
- package/dist/browser-process/process.js.map +1 -1
- package/dist/browser-process/signal-cleanup.d.ts +40 -0
- package/dist/browser-process/signal-cleanup.d.ts.map +1 -0
- package/dist/browser-process/signal-cleanup.js +105 -0
- package/dist/browser-process/signal-cleanup.js.map +1 -0
- package/dist/browser-process/widevine-cdm.d.ts +144 -0
- package/dist/browser-process/widevine-cdm.d.ts.map +1 -0
- package/dist/browser-process/widevine-cdm.js +298 -0
- package/dist/browser-process/widevine-cdm.js.map +1 -0
- package/dist/browser-profiles/chrome/populate-profile.d.ts.map +1 -1
- package/dist/browser-profiles/chrome/populate-profile.js +21 -22
- package/dist/browser-profiles/chrome/populate-profile.js.map +1 -1
- package/dist/connection/cdp-reconnection.d.ts +50 -0
- package/dist/connection/cdp-reconnection.d.ts.map +1 -0
- package/dist/connection/cdp-reconnection.js +75 -0
- package/dist/connection/cdp-reconnection.js.map +1 -0
- package/dist/connection/page-session.d.ts +114 -0
- package/dist/connection/page-session.d.ts.map +1 -0
- package/dist/connection/page-session.js +237 -0
- package/dist/connection/page-session.js.map +1 -0
- package/dist/connection/session-client.d.ts +34 -0
- package/dist/connection/session-client.d.ts.map +1 -0
- package/dist/connection/session-client.js +129 -0
- package/dist/connection/session-client.js.map +1 -0
- package/dist/crawler.d.ts +9 -88
- package/dist/crawler.d.ts.map +1 -1
- package/dist/crawler.js +157 -8
- package/dist/crawler.js.map +1 -1
- package/dist/fingerprinting/fingerprint-injector.d.ts +24 -114
- package/dist/fingerprinting/fingerprint-injector.d.ts.map +1 -1
- package/dist/fingerprinting/fingerprint-injector.js +305 -611
- package/dist/fingerprinting/fingerprint-injector.js.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/datadome-bypass.d.ts +1 -1
- package/dist/fingerprinting/fingerprint-overrides/datadome-bypass.d.ts.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/datadome-bypass.js +16 -14
- package/dist/fingerprinting/fingerprint-overrides/datadome-bypass.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/keyboard-humanization.d.ts +1 -1
- package/dist/fingerprinting/fingerprint-overrides/keyboard-humanization.js +4 -4
- package/dist/fingerprinting/fingerprint-overrides/keyboard-humanization.js.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/locale-spoofing.js +4 -4
- 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 +151 -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 +46 -15
- package/dist/fingerprinting/fingerprint-overrides/platform-consistency.js.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/registry.d.ts +43 -0
- package/dist/fingerprinting/fingerprint-overrides/registry.d.ts.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/registry.js +342 -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/scroll-humanization.d.ts +1 -1
- package/dist/fingerprinting/fingerprint-overrides/scroll-humanization.js +4 -4
- package/dist/fingerprinting/fingerprint-overrides/scroll-humanization.js.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/stealth-script.d.ts.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/stealth-script.js +75 -9
- package/dist/fingerprinting/fingerprint-overrides/stealth-script.js.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/ua-ch.d.ts +1 -1
- package/dist/fingerprinting/fingerprint-overrides/ua-ch.d.ts.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/ua-ch.js +34 -20
- package/dist/fingerprinting/fingerprint-overrides/ua-ch.js.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/webgl-spoofing.d.ts.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/webgl-spoofing.js +28 -9
- package/dist/fingerprinting/fingerprint-overrides/webgl-spoofing.js.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/webrtc-spoofing.js +1 -1
- package/dist/fingerprinting/hardware-realism.d.ts +74 -0
- package/dist/fingerprinting/hardware-realism.d.ts.map +1 -0
- package/dist/fingerprinting/hardware-realism.js +155 -0
- package/dist/fingerprinting/hardware-realism.js.map +1 -0
- package/dist/fingerprinting/injection-planner.d.ts +133 -0
- package/dist/fingerprinting/injection-planner.d.ts.map +1 -0
- package/dist/fingerprinting/injection-planner.js +497 -0
- package/dist/fingerprinting/injection-planner.js.map +1 -0
- package/dist/fingerprinting/locale-resolver.d.ts +8 -1
- package/dist/fingerprinting/locale-resolver.d.ts.map +1 -1
- package/dist/fingerprinting/locale-resolver.js +26 -3
- package/dist/fingerprinting/locale-resolver.js.map +1 -1
- package/dist/fingerprinting/non-apify-fingerprint-generator.d.ts +4 -4
- package/dist/fingerprinting/non-apify-fingerprint-generator.d.ts.map +1 -1
- package/dist/fingerprinting/non-apify-fingerprint-generator.js +35 -69
- package/dist/fingerprinting/non-apify-fingerprint-generator.js.map +1 -1
- package/dist/fingerprinting/non-apify-profiles.json +10515 -8494
- package/dist/fingerprinting/os-consistency.d.ts +28 -0
- package/dist/fingerprinting/os-consistency.d.ts.map +1 -0
- package/dist/fingerprinting/os-consistency.js +45 -0
- package/dist/fingerprinting/os-consistency.js.map +1 -0
- package/dist/fingerprinting/profile-quality.d.ts +25 -0
- package/dist/fingerprinting/profile-quality.d.ts.map +1 -0
- package/dist/fingerprinting/profile-quality.js +310 -0
- package/dist/fingerprinting/profile-quality.js.map +1 -0
- package/dist/fingerprinting/profile-selector.d.ts +102 -0
- package/dist/fingerprinting/profile-selector.d.ts.map +1 -0
- package/dist/fingerprinting/profile-selector.js +168 -0
- package/dist/fingerprinting/profile-selector.js.map +1 -0
- package/dist/fingerprinting/ua-alignment.d.ts +83 -0
- package/dist/fingerprinting/ua-alignment.d.ts.map +1 -0
- package/dist/fingerprinting/ua-alignment.js +197 -0
- package/dist/fingerprinting/ua-alignment.js.map +1 -0
- package/dist/fingerprinting/ua-ch-brands.d.ts +88 -0
- package/dist/fingerprinting/ua-ch-brands.d.ts.map +1 -0
- package/dist/fingerprinting/ua-ch-brands.js +174 -0
- package/dist/fingerprinting/ua-ch-brands.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 +90 -0
- package/dist/input/dropdown-selector.d.ts.map +1 -0
- package/dist/input/dropdown-selector.js +394 -0
- package/dist/input/dropdown-selector.js.map +1 -0
- package/dist/input/element-target.d.ts +152 -0
- package/dist/input/element-target.d.ts.map +1 -0
- package/dist/input/element-target.js +461 -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 +325 -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/keyboard-layout.d.ts +2 -2
- package/dist/keyboard-layout.js +2 -2
- 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 +122 -0
- package/dist/navigation/page-navigation.js.map +1 -0
- package/dist/network/network-watch.d.ts +110 -0
- package/dist/network/network-watch.d.ts.map +1 -0
- package/dist/network/network-watch.js +223 -0
- package/dist/network/network-watch.js.map +1 -0
- package/dist/page.d.ts +123 -104
- package/dist/page.d.ts.map +1 -1
- package/dist/page.js +348 -1129
- 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 +18 -0
- package/dist/session/tar-data-dir.d.ts.map +1 -0
- package/dist/session/tar-data-dir.js +105 -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 +102 -0
- package/dist/session-profile.d.ts.map +1 -0
- package/dist/session-profile.js +163 -0
- package/dist/session-profile.js.map +1 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +15 -6
- 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
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SessionClient - a session-scoped view of the single browser CDP client.
|
|
3
|
+
*
|
|
4
|
+
* In flatten-mode transport (ADR 0003) there is ONE websocket to the browser
|
|
5
|
+
* target; every page is a CDP *session* multiplexed over it, addressed by a
|
|
6
|
+
* `sessionId`. This proxy presents the familiar `CDP.Client` shape to `CdpPage`
|
|
7
|
+
* and its sub-modules while injecting the page's `sessionId` into every command
|
|
8
|
+
* and event subscription. That keeps the ~10 `this.client.Domain.method()` call
|
|
9
|
+
* sites in `page.ts` (and the input transport / injector / inject-hook) exactly
|
|
10
|
+
* as written - the proxy is the single seam where sessionId enters.
|
|
11
|
+
*
|
|
12
|
+
* How `chrome-remote-interface` (0.33.2) exposes things, which this mirrors:
|
|
13
|
+
* - a command is `Domain.method(params, sessionId, callback)` (decorated
|
|
14
|
+
* `.category === 'command'`); we bind arg 2 to the current sessionId.
|
|
15
|
+
* - an event is `Domain.event(sessionId, handler)` (`.category === 'event'`);
|
|
16
|
+
* we bind arg 1 to the current sessionId. It returns an unsubscribe fn.
|
|
17
|
+
* - the connection also emits every session event under `${Domain.event}.${sessionId}`
|
|
18
|
+
* (chrome.js), so raw `client.on('Domain.event', h)` must be rewritten to the
|
|
19
|
+
* session-scoped name or it would fire for *every* page's events.
|
|
20
|
+
*
|
|
21
|
+
* `browser()` and `sessionId()` are read at call time, so a browser-socket
|
|
22
|
+
* reconnect (new underlying client) or a session re-attach (new sessionId) is
|
|
23
|
+
* picked up transparently - the proxy object itself is stable and never needs
|
|
24
|
+
* to be recreated.
|
|
25
|
+
*/
|
|
26
|
+
/** Matches a CDP event name `Domain.event` so we only session-scope real events. */
|
|
27
|
+
const CDP_EVENT_NAME = /^[A-Z]\w*\.\w+$/;
|
|
28
|
+
/**
|
|
29
|
+
* A CDP domain object is an upper-cased property (Page, Network, Runtime, DOM,
|
|
30
|
+
* Input, Target, …). Everything else on the client (send, _ws, on, protocol,
|
|
31
|
+
* webSocketUrl, EventEmitter internals) is transport plumbing, not a domain.
|
|
32
|
+
*/
|
|
33
|
+
const isDomainName = (prop) => /^[A-Z]/.test(prop);
|
|
34
|
+
/**
|
|
35
|
+
* Browser-GLOBAL domains are answered by the browser process itself, not by a
|
|
36
|
+
* page target, so their commands must be sent WITHOUT a sessionId - tagging e.g.
|
|
37
|
+
* `Browser.getVersion` with a page's sessionId makes Chrome reject it
|
|
38
|
+
* (`'Browser.getVersion' wasn't found`). These are returned raw (no injection);
|
|
39
|
+
* only page-scoped domains (Page, Network, Runtime, DOM, Input, …) get scoped.
|
|
40
|
+
* `Target` is here because the only page-side use is `close()` detaching by
|
|
41
|
+
* sessionId, which the proxy handles explicitly against the raw client.
|
|
42
|
+
*/
|
|
43
|
+
const BROWSER_GLOBAL_DOMAINS = new Set(['Browser', 'Target', 'SystemInfo', 'Tracing', 'Tethering']);
|
|
44
|
+
export function createSessionClient(deps) {
|
|
45
|
+
const { browser, sessionId } = deps;
|
|
46
|
+
const sessionEventName = (name) => (CDP_EVENT_NAME.test(name) ? `${name}.${sessionId()}` : name);
|
|
47
|
+
const domainProxies = new Map();
|
|
48
|
+
/** Read a raw property off the current browser client, binding functions to it. */
|
|
49
|
+
const rawPassthrough = (prop) => {
|
|
50
|
+
const rawBrowser = browser();
|
|
51
|
+
const value = rawBrowser[prop];
|
|
52
|
+
return typeof value === 'function' ? value.bind(rawBrowser) : value;
|
|
53
|
+
};
|
|
54
|
+
const makeDomainProxy = (domainName) => new Proxy(Object.create(null), {
|
|
55
|
+
get(_target, member) {
|
|
56
|
+
const domain = browser()[domainName];
|
|
57
|
+
// Symbol keys (e.g. util.inspect.custom) never carry CDP semantics -
|
|
58
|
+
// pass them straight through to the raw domain object.
|
|
59
|
+
if (typeof member === 'symbol')
|
|
60
|
+
return domain?.[member];
|
|
61
|
+
// Domain-level shorthand `Domain.on(event, handler)` → session-scoped subscribe.
|
|
62
|
+
if (member === 'on') {
|
|
63
|
+
return (eventName, listener) => domain[eventName](sessionId(), listener);
|
|
64
|
+
}
|
|
65
|
+
const apiFn = domain?.[member];
|
|
66
|
+
if (typeof apiFn !== 'function')
|
|
67
|
+
return apiFn;
|
|
68
|
+
if (apiFn.category === 'event') {
|
|
69
|
+
// Event subscription: sessionId is the FIRST positional arg.
|
|
70
|
+
return (listener) => apiFn(sessionId(), listener);
|
|
71
|
+
}
|
|
72
|
+
// Command (or any other fn): sessionId is the SECOND positional arg.
|
|
73
|
+
return (params, callback) => apiFn(params, sessionId(), callback);
|
|
74
|
+
},
|
|
75
|
+
});
|
|
76
|
+
const handler = {
|
|
77
|
+
get(_target, prop) {
|
|
78
|
+
// Symbol keys (util.inspect.custom, Symbol.iterator, …) carry no CDP
|
|
79
|
+
// semantics; RegExp/Set lookups would throw on them. Pass through raw.
|
|
80
|
+
if (typeof prop === 'symbol')
|
|
81
|
+
return rawPassthrough(prop);
|
|
82
|
+
switch (prop) {
|
|
83
|
+
case 'send':
|
|
84
|
+
// Raw send: default the sessionId if the caller didn't pass one.
|
|
85
|
+
return (method, params, sessionIdArg, callback) => browser().send(method, params, sessionIdArg ?? sessionId(), callback);
|
|
86
|
+
case 'on':
|
|
87
|
+
case 'once':
|
|
88
|
+
case 'addListener':
|
|
89
|
+
return (name, listener) => browser()[prop](sessionEventName(name), listener);
|
|
90
|
+
case 'off':
|
|
91
|
+
case 'removeListener':
|
|
92
|
+
return (name, listener) => browser()[prop](sessionEventName(name), listener);
|
|
93
|
+
case '_ws':
|
|
94
|
+
// The websocket is SHARED across all sessions; expose it read-only
|
|
95
|
+
// for the keep-alive heartbeat. A page must never close it.
|
|
96
|
+
return browser()._ws;
|
|
97
|
+
case 'close':
|
|
98
|
+
// Closing a *page's* client detaches its session only - never the
|
|
99
|
+
// shared socket (that would kill every other page). The tab/target
|
|
100
|
+
// itself is closed via `Page.close()` on the page-close path.
|
|
101
|
+
return async () => {
|
|
102
|
+
try {
|
|
103
|
+
await browser().Target.detachFromTarget({ sessionId: sessionId() });
|
|
104
|
+
}
|
|
105
|
+
catch {
|
|
106
|
+
// tolerate already-detached session or an already-closed browser
|
|
107
|
+
}
|
|
108
|
+
};
|
|
109
|
+
case 'sessionId':
|
|
110
|
+
return sessionId();
|
|
111
|
+
default:
|
|
112
|
+
break;
|
|
113
|
+
}
|
|
114
|
+
if (isDomainName(prop) && !BROWSER_GLOBAL_DOMAINS.has(prop)) {
|
|
115
|
+
let domainProxy = domainProxies.get(prop);
|
|
116
|
+
if (!domainProxy) {
|
|
117
|
+
domainProxy = makeDomainProxy(prop);
|
|
118
|
+
domainProxies.set(prop, domainProxy);
|
|
119
|
+
}
|
|
120
|
+
return domainProxy;
|
|
121
|
+
}
|
|
122
|
+
// Browser-global domains and everything else pass through to the raw
|
|
123
|
+
// browser client with NO sessionId injection.
|
|
124
|
+
return rawPassthrough(prop);
|
|
125
|
+
},
|
|
126
|
+
};
|
|
127
|
+
return new Proxy(Object.create(null), handler);
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=session-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-client.js","sourceRoot":"","sources":["../../src/connection/session-client.ts"],"names":[],"mappings":"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"}
|
package/dist/crawler.d.ts
CHANGED
|
@@ -2,102 +2,24 @@ import type { Dictionary } from '@crawlee/types';
|
|
|
2
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 {
|
|
5
|
+
import CDPBrowserPlugin, { CdpLauncher, type LaunchReturn } from './browser-plugin.js';
|
|
6
|
+
import type { BaseLaunchBrowserOptions, FingerprintGeneratorOptions } from './browser-process/launch-options.js';
|
|
7
7
|
import type CdpPage from './page.js';
|
|
8
8
|
import type { GotoOptions } from './page.js';
|
|
9
9
|
import type CDPCrawler from './index.js';
|
|
10
10
|
/**
|
|
11
|
-
*
|
|
12
|
-
*
|
|
11
|
+
* Option types are declared once in `browser-process/launch-options.ts` and
|
|
12
|
+
* imported here - see issue #80. `LaunchOptions` is `BaseLaunchBrowserOptions`
|
|
13
|
+
* (the shared launch surface, incl. the `fingerprintOptions` spoof bag) plus
|
|
14
|
+
* the crawler-facing fields. The internal `fingerprintConfig` / `resolvedLocale`
|
|
15
|
+
* fields are populated by the plugin/process layers at launch, not by callers,
|
|
16
|
+
* so they are omitted from the public crawler surface.
|
|
13
17
|
*/
|
|
14
|
-
interface
|
|
15
|
-
/** Enable mouse movement humanization. Default: false */
|
|
16
|
-
mouse?: boolean;
|
|
17
|
-
/** Enable keyboard humanization. Default: false */
|
|
18
|
-
keyboard?: boolean;
|
|
19
|
-
/** Enable scroll humanization. Default: false */
|
|
20
|
-
scroll?: boolean;
|
|
21
|
-
}
|
|
22
|
-
interface FingerprintGeneratorOptions {
|
|
23
|
-
/** Operating systems to generate fingerprints for (e.g., ["windows"], ["macos"], ["linux"]) */
|
|
24
|
-
operatingSystems?: string[];
|
|
25
|
-
/** Devices to generate fingerprints for (e.g., ["desktop"], ["mobile"]) */
|
|
26
|
-
devices?: string[];
|
|
27
|
-
/** Browsers to generate fingerprints for (e.g., ["chrome"], ["firefox"]) */
|
|
28
|
-
browsers?: string[];
|
|
29
|
-
/** Locales to generate fingerprints for (e.g., ["en-US"], ["it-IT"]) */
|
|
30
|
-
locales?: string[];
|
|
31
|
-
}
|
|
32
|
-
interface LaunchOptions {
|
|
33
|
-
headless?: boolean;
|
|
34
|
-
useExperimentalFingerprints?: boolean;
|
|
35
|
-
windowWidth?: number;
|
|
36
|
-
windowHeight?: number;
|
|
37
|
-
ignoreHttpsErrors?: boolean;
|
|
38
|
-
executablePath?: string;
|
|
39
|
-
/**
|
|
40
|
-
* Launch the anti-detect Cromite binary (postinstall-downloaded into
|
|
41
|
-
* `.browser/<platform>/` by default, or set via ANTI_DETECT_CHROME_PATH).
|
|
42
|
-
* When true and the binary is resolvable, JS-based fingerprint injection
|
|
43
|
-
* is skipped because the C++ patches already cover those overrides. If
|
|
44
|
-
* the binary cannot be found, this flag is transparently downgraded and
|
|
45
|
-
* the standard Chrome + JS injection path is used instead.
|
|
46
|
-
*/
|
|
47
|
-
useNativeStealth?: boolean;
|
|
18
|
+
export interface LaunchOptions extends Omit<BaseLaunchBrowserOptions, 'fingerprintConfig' | 'resolvedLocale'> {
|
|
48
19
|
browserType?: string;
|
|
49
20
|
useIncognitoPages?: boolean;
|
|
50
|
-
userDataDir?: string;
|
|
51
|
-
keepUserDataDir?: boolean;
|
|
52
|
-
dnsOverHttpsServer?: string;
|
|
53
|
-
secureDnsMode?: 'off' | 'automatic' | 'secure';
|
|
54
|
-
webrtcIpHandlingPolicy?: 'default' | 'default_public_interface_only' | 'default_public_and_private_interfaces' | 'disable_non_proxied_udp';
|
|
55
|
-
/** Whether to start the browser maximized and fullscreen. Default: true */
|
|
56
|
-
maximizeWindow?: boolean;
|
|
57
21
|
/** Options for fingerprint generation - passed from browserPoolOptions */
|
|
58
22
|
fingerprintGeneratorOptions?: FingerprintGeneratorOptions;
|
|
59
|
-
fingerprintOptions?: {
|
|
60
|
-
enableAdvancedStealth?: boolean;
|
|
61
|
-
bypassRuntimeEnable?: boolean;
|
|
62
|
-
spoofWebGL?: boolean;
|
|
63
|
-
spoofAudioContext?: boolean;
|
|
64
|
-
spoofClientRects?: boolean;
|
|
65
|
-
maskAutomationFlags?: boolean;
|
|
66
|
-
useFingerprintDefaults?: boolean;
|
|
67
|
-
platform?: 'Win32' | 'MacIntel' | 'Linux x86_64';
|
|
68
|
-
spoofFonts?: boolean;
|
|
69
|
-
spoofPerformance?: boolean;
|
|
70
|
-
spoofLocale?: boolean;
|
|
71
|
-
detectTimezone?: boolean;
|
|
72
|
-
/**
|
|
73
|
-
* BCP-47 locale tag (e.g. 'ko-KR', 'de-DE'). One flag that coherently drives
|
|
74
|
-
* navigator.language(s), Accept-Language header, Intl defaults, currency
|
|
75
|
-
* symbol, date/number formatting, and timezone (derived from region).
|
|
76
|
-
* When unset, falls back to proxy-country lookup → fingerprint language → 'en-US'.
|
|
77
|
-
*/
|
|
78
|
-
locale?: string;
|
|
79
|
-
/** Explicit IANA timezone (e.g. 'Asia/Seoul'). Overrides locale-derived timezone. */
|
|
80
|
-
timezone?: string;
|
|
81
|
-
/** Explicit Accept-Language header (e.g. 'ko-KR,ko;q=0.9'). Overrides locale-derived list. */
|
|
82
|
-
languages?: string;
|
|
83
|
-
bypassCDPDetection?: boolean;
|
|
84
|
-
spoofStorage?: boolean;
|
|
85
|
-
spoofTiming?: boolean;
|
|
86
|
-
enableDataDomeBypass?: boolean;
|
|
87
|
-
webRtcPolicy?: 'spoof' | 'disable';
|
|
88
|
-
/** Humanization options (all disabled by default) */
|
|
89
|
-
humanization?: HumanizationOptions;
|
|
90
|
-
/** Enable debug logging in browser console. Default: true for debugging */
|
|
91
|
-
debug?: boolean;
|
|
92
|
-
/** Use real Chrome device profiles instead of Apify fingerprint-generator. Default: false */
|
|
93
|
-
useNonApifyFingerprints?: boolean;
|
|
94
|
-
/**
|
|
95
|
-
* Mirror of `launchOptions.useNativeStealth`. Historical call sites
|
|
96
|
-
* place it under `fingerprintOptions`; the runtime checks both
|
|
97
|
-
* (`opts.useNativeStealth || opts.fingerprintOptions?.useNativeStealth`).
|
|
98
|
-
*/
|
|
99
|
-
useNativeStealth?: boolean;
|
|
100
|
-
};
|
|
101
23
|
}
|
|
102
24
|
export interface CDPPluginOptions {
|
|
103
25
|
browserPlugins: [CDPBrowserPlugin];
|
|
@@ -125,5 +47,4 @@ export default class Crawler extends BrowserCrawler<CDPPluginOptions, LaunchOpti
|
|
|
125
47
|
}
|
|
126
48
|
export type CDPRouter<Context extends CDPCrawlingContext = CDPCrawlingContext> = RouterHandler<Context>;
|
|
127
49
|
export declare function createCDPRouter<Context extends CDPCrawlingContext = CDPCrawlingContext>(routes?: RouterRoutes<Context, Dictionary>): CDPRouter<Context>;
|
|
128
|
-
export {};
|
|
129
50
|
//# 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,qBAAqB,EAAE,aAAa,EAAE,aAAa,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC5K,OAAO,EAAE,cAAc,EAAE,aAAa,
|
|
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,EAAe,MAAM,SAAS,CAAC;AAErE,OAAO,KAAK,oBAAoB,MAAM,yBAAyB,CAAC;AAChE,OAAO,gBAAgB,EAAE,EAAE,WAAW,EAAE,KAAK,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACvF,OAAO,KAAK,EAAE,wBAAwB,EAAE,2BAA2B,EAAsB,MAAM,qCAAqC,CAAC;AAErI,OAAO,KAAK,OAAO,MAAM,WAAW,CAAC;AACrC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAE7C,OAAO,KAAK,UAAU,MAAM,YAAY,CAAC;AAEzC;;;;;;;GAOG;AACH,MAAM,WAAW,aAAc,SAAQ,IAAI,CAAC,wBAAwB,EAAE,mBAAmB,GAAG,gBAAgB,CAAC;IACzG,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,0EAA0E;IAC1E,2BAA2B,CAAC,EAAE,2BAA2B,CAAC;CAC7D;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;cA8NrC,kBAAkB,CAAC,eAAe,EAAE,kBAAkB,EAAE,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC;CAK3H;AAED,MAAM,MAAM,SAAS,CACjB,OAAO,SAAS,kBAAkB,GAAG,kBAAkB,IACvD,aAAa,CAAC,OAAO,CAAC,CAAC;AAE3B,wBAAgB,eAAe,CAC3B,OAAO,SAAS,kBAAkB,GAAG,kBAAkB,EACzD,MAAM,CAAC,EAAE,YAAY,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,SAAS,CAAC,OAAO,CAAC,CAEhE"}
|
package/dist/crawler.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { BrowserCrawler, Configuration, Router } from 'crawlee';
|
|
2
|
-
import CDPBrowserPlugin from './browser-plugin.js';
|
|
3
|
-
import {
|
|
1
|
+
import { BrowserCrawler, Configuration, log, Router } from 'crawlee';
|
|
2
|
+
import CDPBrowserPlugin, { CdpLauncher } from './browser-plugin.js';
|
|
3
|
+
import { describeOsConflict } from './fingerprinting/os-consistency.js';
|
|
4
4
|
// Implement the Crawler class with proper typing
|
|
5
5
|
export default class Crawler extends BrowserCrawler {
|
|
6
6
|
constructor(
|
|
@@ -24,12 +24,161 @@ export default class Crawler extends BrowserCrawler {
|
|
|
24
24
|
launchContext.launchOptions ?? (launchContext.launchOptions = {});
|
|
25
25
|
launchContext.launchOptions.headless = headless;
|
|
26
26
|
}
|
|
27
|
+
// ── Option-surface guidance (issue #80) ──────────────────────────────
|
|
28
|
+
// The `launchOptions.fingerprintOptions` (spoof-enforcement) bag and
|
|
29
|
+
// Crawlee's `browserPoolOptions.fingerprintOptions` (identity-generation)
|
|
30
|
+
// bag are separate concepts that share a name. Two silent foot-guns are
|
|
31
|
+
// surfaced here as one-time warnings; the canonical unification (single
|
|
32
|
+
// OS home + a renamed, non-colliding enforcement bag) lands in 1.0.0.
|
|
33
|
+
const fpOpts = launchContext.launchOptions?.fingerprintOptions;
|
|
34
|
+
const stealthEngine = launchContext.launchOptions?.stealth?.engine;
|
|
35
|
+
// The canonical `stealth` union is configured. Per issue #80, `stealth`
|
|
36
|
+
// wins when both it and a deprecated alias are set, so we suppress the
|
|
37
|
+
// deprecation notices below to avoid nagging callers already on canonical.
|
|
38
|
+
const stealthConfigured = stealthEngine === 'js' || stealthEngine === 'native';
|
|
39
|
+
const nativeStealthIntent = stealthEngine === 'native'
|
|
40
|
+
|| (stealthEngine !== 'js' && Boolean(launchContext.launchOptions?.useNativeStealth
|
|
41
|
+
|| fpOpts?.useNativeStealth
|
|
42
|
+
|| launchContext?.useNativeStealth));
|
|
43
|
+
if (fpOpts) {
|
|
44
|
+
// 1. The JS spoof toggles are deprecated in favor of the canonical
|
|
45
|
+
// `stealth = { engine: 'js', overrides }` union (issue #80).
|
|
46
|
+
const JS_ONLY_KNOBS = [
|
|
47
|
+
'spoofWebGL', 'spoofAudioContext', 'spoofClientRects',
|
|
48
|
+
'spoofFonts', 'spoofPerformance', 'bypassCDPDetection',
|
|
49
|
+
'maskAutomationFlags',
|
|
50
|
+
];
|
|
51
|
+
const setJsKnobs = JS_ONLY_KNOBS.filter(k => fpOpts[k] !== undefined);
|
|
52
|
+
if (setJsKnobs.length) {
|
|
53
|
+
if (nativeStealthIntent) {
|
|
54
|
+
// Under native stealth the JS override pipeline is skipped
|
|
55
|
+
// entirely (the C++ anti-detect binary owns these surfaces),
|
|
56
|
+
// so these toggles have no effect - a common source of confusion.
|
|
57
|
+
log.warning(`[CDPCrawler] native stealth is enabled, so these launchOptions.fingerprintOptions `
|
|
58
|
+
+ `toggles are ignored - the anti-detect binary owns those surfaces via its C++ `
|
|
59
|
+
+ `source-tree edits: ${setJsKnobs.join(', ')}. See issue #80.`);
|
|
60
|
+
}
|
|
61
|
+
else if (!stealthConfigured) {
|
|
62
|
+
log.deprecated(`[CDPCrawler] launchOptions.fingerprintOptions.{${setJsKnobs.join(', ')}} `
|
|
63
|
+
+ 'is deprecated and will be removed in 1.0.0 in favor of '
|
|
64
|
+
+ "launchOptions.stealth = { engine: 'js', overrides: { ... } } (issue #80).");
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
// 2. `fingerprintOptions.platform` is a second OS home that duplicates
|
|
68
|
+
// (and can contradict) fingerprintGeneratorOptions.operatingSystems.
|
|
69
|
+
// It still works today; the single OS source lands in 1.0.0.
|
|
70
|
+
if (fpOpts.platform !== undefined) {
|
|
71
|
+
log.deprecated('[CDPCrawler] launchOptions.fingerprintOptions.platform is deprecated and will be removed in '
|
|
72
|
+
+ '1.0.0 in favor of a single OS source, browserPoolOptions.fingerprintOptions.'
|
|
73
|
+
+ 'fingerprintGeneratorOptions.operatingSystems (issue #80).');
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
// 3. The `useNativeStealth` boolean (at either launchOptions,
|
|
77
|
+
// fingerprintOptions, or launchContext level) is deprecated in favor
|
|
78
|
+
// of the canonical `stealth` union (issue #80). Suppressed when the
|
|
79
|
+
// caller is already on canonical `stealth` (which wins when both set).
|
|
80
|
+
const useNativeStealthSet = launchContext.launchOptions?.useNativeStealth !== undefined
|
|
81
|
+
|| fpOpts?.useNativeStealth !== undefined
|
|
82
|
+
|| launchContext?.useNativeStealth !== undefined;
|
|
83
|
+
if (useNativeStealthSet && !stealthConfigured) {
|
|
84
|
+
log.deprecated('[CDPCrawler] useNativeStealth is deprecated and will be removed in 1.0.0 in favor of '
|
|
85
|
+
+ "launchOptions.stealth = { engine: 'native' } (issue #80).");
|
|
86
|
+
}
|
|
27
87
|
// Pass fingerprintGeneratorOptions from browserPoolOptions to launchContext
|
|
28
|
-
// This ensures the browser controller can regenerate fingerprints with correct OS/locale settings
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
88
|
+
// This ensures the browser controller can regenerate fingerprints with correct OS/locale settings.
|
|
89
|
+
//
|
|
90
|
+
// Default-OS policy: when the caller hasn't pinned operatingSystems, lock the
|
|
91
|
+
// fingerprint sampler to the host OS we're actually running on. Without this,
|
|
92
|
+
// Crawlee's internal FingerprintGenerator draws from the union of macos/linux/
|
|
93
|
+
// windows samples and (e.g.) a Mac dev box ends up shipping Windows profiles
|
|
94
|
+
// ~33% of the time - every Worker probe then reports D3D11/AMD GPU against a
|
|
95
|
+
// host that actually has Metal/Apple Silicon, which is an instant
|
|
96
|
+
// cross-process consistency tell. Pinning to the host OS keeps the entire
|
|
97
|
+
// observable stack coherent (UA, UA-CH platform, WEBGL renderer, Worker GPU,
|
|
98
|
+
// CPU class) without forcing the caller to remember to pass it. Callers can
|
|
99
|
+
// still override by passing browserPoolOptions.fingerprintOptions.
|
|
100
|
+
// fingerprintGeneratorOptions.operatingSystems explicitly.
|
|
101
|
+
//
|
|
102
|
+
// Kill-switch: when the caller sets `useFingerprints: false` on
|
|
103
|
+
// browserPoolOptions, Crawlee's internal fingerprint pipeline is
|
|
104
|
+
// disabled - and so is cdp-crawler's consumption of
|
|
105
|
+
// `browserPoolOptions.fingerprintOptions.fingerprintGeneratorOptions`.
|
|
106
|
+
// In that mode `operatingSystems` (the single source of truth, issue
|
|
107
|
+
// #80) has nothing to drive, so a warning below tells the caller to keep
|
|
108
|
+
// fingerprints enabled if they need OS pinning. The deprecated
|
|
109
|
+
// `fingerprintOptions.platform` knob is still honoured downstream as a
|
|
110
|
+
// fallback until it is removed in 1.0.0.
|
|
111
|
+
const fingerprintsEnabled = browserPoolOptions.useFingerprints !== false;
|
|
112
|
+
if (fingerprintsEnabled) {
|
|
113
|
+
const HOST_OS_MAP = {
|
|
114
|
+
darwin: 'macos',
|
|
115
|
+
linux: 'linux',
|
|
116
|
+
win32: 'windows',
|
|
117
|
+
};
|
|
118
|
+
const hostOs = HOST_OS_MAP[process.platform];
|
|
119
|
+
const callerFingerprintGenOpts = poolOptions?.fingerprintOptions?.fingerprintGeneratorOptions;
|
|
120
|
+
// Single source of truth (issue #80): `operatingSystems` wins. If the
|
|
121
|
+
// caller ALSO set the deprecated `fingerprintOptions.platform` and the
|
|
122
|
+
// two disagree, warn (do not throw) - the resolved OS is derived from
|
|
123
|
+
// the fingerprint the generator produces for `operatingSystems`.
|
|
124
|
+
// Only the caller-supplied value triggers this; the host-OS auto-fill
|
|
125
|
+
// a few lines below is internal policy, not user intent.
|
|
126
|
+
const osConflict = describeOsConflict(callerFingerprintGenOpts?.operatingSystems?.[0], launchContext.launchOptions?.fingerprintOptions?.platform);
|
|
127
|
+
if (osConflict)
|
|
128
|
+
log.warning(osConflict);
|
|
129
|
+
const resolvedFingerprintGenOpts = {
|
|
130
|
+
...(callerFingerprintGenOpts ?? {}),
|
|
131
|
+
};
|
|
132
|
+
if (!resolvedFingerprintGenOpts.operatingSystems?.length) {
|
|
133
|
+
// Derive auto-fill OS from the explicit `platform` pin first; fall
|
|
134
|
+
// back to the host OS only when no platform was set. This keeps the
|
|
135
|
+
// auto-fill from contradicting an explicit user platform pin (e.g.
|
|
136
|
+
// a Mac dev with `platform: 'Linux x86_64'` for testing should not
|
|
137
|
+
// get operatingSystems auto-filled to ['macos']).
|
|
138
|
+
const PLATFORM_TO_OS = {
|
|
139
|
+
'MacIntel': 'macos',
|
|
140
|
+
'Win32': 'windows',
|
|
141
|
+
'Linux x86_64': 'linux',
|
|
142
|
+
};
|
|
143
|
+
const platformPin = launchContext.launchOptions?.fingerprintOptions?.platform;
|
|
144
|
+
const derivedOs = PLATFORM_TO_OS[platformPin] ?? hostOs;
|
|
145
|
+
if (derivedOs) {
|
|
146
|
+
resolvedFingerprintGenOpts.operatingSystems = [derivedOs];
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
if (resolvedFingerprintGenOpts.operatingSystems?.length) {
|
|
150
|
+
launchContext.launchOptions ?? (launchContext.launchOptions = {});
|
|
151
|
+
launchContext.launchOptions.fingerprintGeneratorOptions = resolvedFingerprintGenOpts;
|
|
152
|
+
// Assign the resolved OS onto our OWN `browserPoolOptions` copy only -
|
|
153
|
+
// this is the single bag Crawlee's internal FingerprintGenerator reads
|
|
154
|
+
// (browserPoolOptions.fingerprintOptions.fingerprintGeneratorOptions).
|
|
155
|
+
// We deliberately do NOT mutate the caller's `poolOptions` object:
|
|
156
|
+
// options resolve into config we own, never in-place edits of caller
|
|
157
|
+
// input (issue #80). `browserPoolOptions` was shallow-spread from
|
|
158
|
+
// `poolOptions`, so replacing its `fingerprintOptions` reference here
|
|
159
|
+
// leaves the caller's object untouched.
|
|
160
|
+
browserPoolOptions.fingerprintOptions = {
|
|
161
|
+
...(poolOptions.fingerprintOptions ?? {}),
|
|
162
|
+
fingerprintGeneratorOptions: {
|
|
163
|
+
...(poolOptions.fingerprintOptions?.fingerprintGeneratorOptions ?? {}),
|
|
164
|
+
operatingSystems: resolvedFingerprintGenOpts.operatingSystems,
|
|
165
|
+
},
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
else {
|
|
170
|
+
// useFingerprints: false → cdp-crawler ignores
|
|
171
|
+
// browserPoolOptions.fingerprintOptions entirely. Surface a loud
|
|
172
|
+
// warning if the caller still has non-trivial settings there, so
|
|
173
|
+
// they don't spend hours wondering why their `operatingSystems`
|
|
174
|
+
// hint isn't taking effect.
|
|
175
|
+
const stale = poolOptions?.fingerprintOptions?.fingerprintGeneratorOptions;
|
|
176
|
+
if (stale && (stale.operatingSystems?.length || stale.locales?.length || stale.devices?.length || stale.browsers?.length)) {
|
|
177
|
+
log.warning('[CDPCrawler] `browserPoolOptions.fingerprintOptions.fingerprintGeneratorOptions` is set but `useFingerprints: false` - '
|
|
178
|
+
+ "Crawlee's fingerprint pipeline is disabled, so this setting is ignored. "
|
|
179
|
+
+ 'To pin the session OS, keep `useFingerprints` enabled and set '
|
|
180
|
+
+ '`fingerprintGeneratorOptions.operatingSystems`, the single source of truth for OS (issue #80).');
|
|
181
|
+
}
|
|
33
182
|
}
|
|
34
183
|
// Pass only launchOptions (not the whole launchContext) so CDPBrowserPlugin stores
|
|
35
184
|
// executablePath, useNativeStealth, etc. at the right level.
|
package/dist/crawler.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"crawler.js","sourceRoot":"","sources":["../src/crawler.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"crawler.js","sourceRoot":"","sources":["../src/crawler.ts"],"names":[],"mappings":"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"}
|
|
@@ -62,107 +62,10 @@
|
|
|
62
62
|
*/
|
|
63
63
|
import type { BrowserFingerprintWithHeaders } from 'fingerprint-generator';
|
|
64
64
|
import type CdpPage from "../page.js";
|
|
65
|
-
import type
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
deviceScaleFactor: number;
|
|
70
|
-
mobile: boolean;
|
|
71
|
-
}
|
|
72
|
-
/**
|
|
73
|
-
* Humanization options for simulating realistic user behavior
|
|
74
|
-
* All options are disabled by default for performance
|
|
75
|
-
*/
|
|
76
|
-
interface HumanizationOptions {
|
|
77
|
-
/** Enable mouse movement humanization (Bezier curves, natural movement). Default: false */
|
|
78
|
-
mouse?: boolean;
|
|
79
|
-
/** Enable keyboard humanization (realistic typing delays). Default: false */
|
|
80
|
-
keyboard?: boolean;
|
|
81
|
-
/** Enable scroll humanization (natural physics, momentum). Default: false */
|
|
82
|
-
scroll?: boolean;
|
|
83
|
-
}
|
|
84
|
-
interface AttachOptions {
|
|
85
|
-
debug?: boolean;
|
|
86
|
-
timezone?: string;
|
|
87
|
-
proxyUrl?: string;
|
|
88
|
-
detectTimezone?: boolean;
|
|
89
|
-
viewport?: Viewport;
|
|
90
|
-
enableAdvancedStealth?: boolean;
|
|
91
|
-
bypassRuntimeEnable?: boolean;
|
|
92
|
-
/** @deprecated Use humanization.mouse instead */
|
|
93
|
-
humanizeInteractions?: boolean;
|
|
94
|
-
spoofWebGL?: boolean;
|
|
95
|
-
spoofAudioContext?: boolean;
|
|
96
|
-
spoofClientRects?: boolean;
|
|
97
|
-
maskAutomationFlags?: boolean;
|
|
98
|
-
platform?: 'Win32' | 'MacIntel' | 'Linux x86_64';
|
|
99
|
-
spoofFonts?: boolean;
|
|
100
|
-
spoofPerformance?: boolean;
|
|
101
|
-
spoofLocale?: boolean;
|
|
102
|
-
useExperimentalFingerprints?: boolean;
|
|
103
|
-
useFingerprintDefaults?: boolean;
|
|
104
|
-
/** Enable CDP detection bypass (iframe, eval, sourceURL hiding) */
|
|
105
|
-
bypassCDPDetection?: boolean;
|
|
106
|
-
/** Enable storage API consistency (quota, IndexedDB, CacheStorage) */
|
|
107
|
-
spoofStorage?: boolean;
|
|
108
|
-
/** Enable timing consistency (Date.now, performance.now alignment) */
|
|
109
|
-
spoofTiming?: boolean;
|
|
110
|
-
/** Enable DataDome-specific bypass (JS challenges, proof-of-work) */
|
|
111
|
-
enableDataDomeBypass?: boolean;
|
|
112
|
-
/** WebRTC handling strategy. Default: 'spoof'. */
|
|
113
|
-
webRtcPolicy?: 'spoof' | 'disable';
|
|
114
|
-
/**
|
|
115
|
-
* Alias for enableDataDomeBypass - enables all DataDome-specific protections
|
|
116
|
-
* When true, injects enhanced bypass early in the script chain
|
|
117
|
-
*/
|
|
118
|
-
bypassDatadome?: boolean;
|
|
119
|
-
/**
|
|
120
|
-
* Humanization options for simulating realistic user behavior.
|
|
121
|
-
* All options are disabled by default for performance.
|
|
122
|
-
* Enable specific options to simulate human-like interactions.
|
|
123
|
-
*/
|
|
124
|
-
humanization?: HumanizationOptions;
|
|
125
|
-
/**
|
|
126
|
-
* When true, fingerprint was generated by the non-Apify real-device generator.
|
|
127
|
-
* Currently informational only — the injector behaves identically since the output
|
|
128
|
-
* matches the BrowserFingerprintWithHeaders shape.
|
|
129
|
-
*/
|
|
130
|
-
useNonApifyFingerprints?: boolean;
|
|
131
|
-
/**
|
|
132
|
-
* Pre-resolved locale triple. When provided, drives CDP Emulation.setLocaleOverride,
|
|
133
|
-
* Emulation.setTimezoneOverride, Accept-Language header, and the locale-spoofing
|
|
134
|
-
* script's baked-in values. Supersedes any legacy `timezone`/`detectTimezone` logic:
|
|
135
|
-
* if resolvedLocale.timezone is set, we skip the ipinfo.io round-trip.
|
|
136
|
-
*/
|
|
137
|
-
resolvedLocale?: ResolvedLocale;
|
|
138
|
-
/**
|
|
139
|
-
* Completely disable all JS fingerprint overrides when the C++ anti-detect browser
|
|
140
|
-
* is in use. Set this to true when launching with the custom Cromite-based anti-detect
|
|
141
|
-
* browser (useNativeStealth in LaunchBrowserOptions).
|
|
142
|
-
*
|
|
143
|
-
* When true, the ENTIRE JS override pipeline is skipped — no fingerprint scripts are
|
|
144
|
-
* injected via addScriptToEvaluateOnNewDocument. The C++ patches handle everything:
|
|
145
|
-
* - canvas noise (patch 0009 + cromite-override 0002)
|
|
146
|
-
* - audio fingerprinting (patch 0010)
|
|
147
|
-
* - getBoundingClientRect noise (patch 0011)
|
|
148
|
-
* - WebGL vendor/renderer (patch 0004)
|
|
149
|
-
* - WebGPU adapter info (patch 0012)
|
|
150
|
-
* - screen dimensions (patch 0006)
|
|
151
|
-
* - navigator.platform (patch 0002)
|
|
152
|
-
* - UA-CH structured data + HTTP headers (patch 0003)
|
|
153
|
-
* - navigator.webdriver = false (patch 0001)
|
|
154
|
-
* - CDP automation artifacts (patch 0005)
|
|
155
|
-
* - Runtime.enable console side effects (patch 0015)
|
|
156
|
-
* - automation sourceURL in Error stacks (patch 0015)
|
|
157
|
-
*
|
|
158
|
-
* Exception: humanization scripts (mouse/keyboard/scroll movement) are behavioral
|
|
159
|
-
* rather than fingerprinting — they are still injected if explicitly enabled via
|
|
160
|
-
* the `humanization` option.
|
|
161
|
-
*
|
|
162
|
-
* Default: false
|
|
163
|
-
*/
|
|
164
|
-
useNativeStealth?: boolean;
|
|
165
|
-
}
|
|
65
|
+
import { type AttachOptions } from './injection-planner.js';
|
|
66
|
+
export type { AttachOptions, HumanizationOptions, Viewport } from './injection-planner.js';
|
|
67
|
+
/** Test-only: drop the process-level runtime caches so runs start fresh. */
|
|
68
|
+
export declare function resetInjectorRuntimeCachesForTesting(): void;
|
|
166
69
|
export declare class CdpFingerprintInjector {
|
|
167
70
|
private page;
|
|
168
71
|
constructor(page: CdpPage);
|
|
@@ -191,31 +94,38 @@ export declare class CdpFingerprintInjector {
|
|
|
191
94
|
*/
|
|
192
95
|
private setUserAgentWithMetadata;
|
|
193
96
|
private getTimezoneFromIp;
|
|
97
|
+
private fetchTimezoneFromIp;
|
|
194
98
|
private setTimezoneOverride;
|
|
195
99
|
/**
|
|
196
100
|
* Override ICU's default locale for the page via CDP. This makes Intl.DateTimeFormat,
|
|
197
101
|
* Intl.NumberFormat, and Date.toLocaleString default to the supplied locale regardless
|
|
198
|
-
* of the browser binary's --lang setting
|
|
102
|
+
* of the browser binary's --lang setting - our reliable knob for the stock-Chrome path
|
|
199
103
|
* where we don't control the startup args.
|
|
200
104
|
*/
|
|
201
105
|
private setLocaleOverride;
|
|
202
106
|
/**
|
|
203
|
-
*
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
/**
|
|
207
|
-
* Extract relevant data from fingerprint for overrides
|
|
107
|
+
* Identify the browser process behind this page's CDP connection. The
|
|
108
|
+
* remote-debugging host:port is unique per Chrome process, so it keys the
|
|
109
|
+
* per-browser-process version cache without bleeding across processes.
|
|
208
110
|
*/
|
|
209
|
-
private
|
|
111
|
+
private browserEndpointKey;
|
|
210
112
|
private getActualChromeVersion;
|
|
211
|
-
private
|
|
113
|
+
private probeActualChromeVersion;
|
|
212
114
|
/**
|
|
213
|
-
*
|
|
214
|
-
*
|
|
215
|
-
*
|
|
115
|
+
* Mutate the shared fingerprint's navigator UA surfaces (userAgent, appVersion,
|
|
116
|
+
* userAgentData brands, and the headers UA) to the real binary version, in
|
|
117
|
+
* place. This is the SAME object Crawlee/BrowserPool's built-in
|
|
118
|
+
* FingerprintInjector reads in its postPageCreate hook, so aligning it here
|
|
119
|
+
* keeps navigator.userAgent, the Sec-CH-UA brands, and the wire User-Agent
|
|
120
|
+
* header all on the real binary version instead of the generator's (#104).
|
|
121
|
+
* No-op when the version couldn't be probed or the profile has no UA.
|
|
216
122
|
*/
|
|
217
|
-
private
|
|
123
|
+
private alignFingerprintUserAgent;
|
|
218
124
|
attachToPage(browserFingerprintWithHeaders: BrowserFingerprintWithHeaders, options?: AttachOptions): Promise<void>;
|
|
125
|
+
/**
|
|
126
|
+
* Apply an InjectionPlan to the page. All CDP traffic for fingerprint
|
|
127
|
+
* injection happens here; every decision was made in the planner.
|
|
128
|
+
*/
|
|
129
|
+
private applyPlan;
|
|
219
130
|
}
|
|
220
|
-
export {};
|
|
221
131
|
//# sourceMappingURL=fingerprint-injector.d.ts.map
|