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,133 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* InjectionPlanner - the pure half of fingerprint injection.
|
|
3
|
+
*
|
|
4
|
+
* `buildInjectionPlan` turns (fingerprint, options, binary version) into an
|
|
5
|
+
* InjectionPlan: a plain value describing everything the injector intends to
|
|
6
|
+
* do to the page. No CDP types, no I/O - the plan is the test surface.
|
|
7
|
+
* `CdpFingerprintInjector.attachToPage` is the thin executor that probes the
|
|
8
|
+
* binary version over CDP, builds the plan, and applies it.
|
|
9
|
+
*/
|
|
10
|
+
import type { BrowserFingerprintWithHeaders } from 'fingerprint-generator';
|
|
11
|
+
import { type OverrideContext, type WebGLConfig, type PlatformConfig, type UAClientHintsData } from './fingerprint-overrides/index.js';
|
|
12
|
+
import type { ResolvedLocale } from './locale-resolver.js';
|
|
13
|
+
import type { FingerprintOptions } from '../browser-process/launch-options.js';
|
|
14
|
+
export interface Viewport {
|
|
15
|
+
width: number;
|
|
16
|
+
height: number;
|
|
17
|
+
deviceScaleFactor: number;
|
|
18
|
+
mobile: boolean;
|
|
19
|
+
}
|
|
20
|
+
export type { HumanizationOptions } from '../browser-process/launch-options.js';
|
|
21
|
+
/**
|
|
22
|
+
* The injector's resolved input DTO. The spoof-toggle fields are inherited from
|
|
23
|
+
* the canonical `FingerprintOptions` (issue #80) - `locale`/`languages`/`seedKey`/
|
|
24
|
+
* `forceEmulateWebgl` are resolved upstream (into `resolvedLocale` / launch args /
|
|
25
|
+
* the C++ config) and never reach the injector, so they are omitted. The extra
|
|
26
|
+
* fields below are injector-boundary concerns not present on the public bag.
|
|
27
|
+
*
|
|
28
|
+
* Note on `useNativeStealth`: when true the ENTIRE JS override pipeline is skipped
|
|
29
|
+
* (see `buildInjectionPlan`'s native fast-path) - the C++ source-tree edits own
|
|
30
|
+
* every fingerprint surface. Humanization is unaffected: it runs through the CDP
|
|
31
|
+
* Input layer (InputEmulator) per-interaction, not through an injected script.
|
|
32
|
+
*/
|
|
33
|
+
export interface AttachOptions extends Omit<FingerprintOptions, 'locale' | 'languages' | 'seedKey' | 'forceEmulateWebgl'> {
|
|
34
|
+
proxyUrl?: string;
|
|
35
|
+
viewport?: Viewport;
|
|
36
|
+
/** @deprecated Use humanization.mouse instead */
|
|
37
|
+
humanizeInteractions?: boolean;
|
|
38
|
+
/**
|
|
39
|
+
* Alias for enableDataDomeBypass - enables all DataDome-specific protections
|
|
40
|
+
* When true, injects enhanced bypass early in the script chain
|
|
41
|
+
*/
|
|
42
|
+
bypassDatadome?: boolean;
|
|
43
|
+
/**
|
|
44
|
+
* Pre-resolved locale triple. When provided, drives CDP Emulation.setLocaleOverride,
|
|
45
|
+
* Emulation.setTimezoneOverride, Accept-Language header, and the locale-spoofing
|
|
46
|
+
* script's baked-in values. Supersedes any legacy `timezone`/`detectTimezone` logic:
|
|
47
|
+
* if resolvedLocale.timezone is set, we skip the ipinfo.io round-trip.
|
|
48
|
+
*/
|
|
49
|
+
resolvedLocale?: ResolvedLocale;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Everything `attachToPage` intends to do, as a plain value.
|
|
53
|
+
*
|
|
54
|
+
* `native` plans carry no script bundle: the C++ anti-detect binary owns every
|
|
55
|
+
* fingerprint surface, and the only page-level action allowed is the
|
|
56
|
+
* Accept-Language header (Chrome's profile default leaks `en-US,en;q=0.9`
|
|
57
|
+
* even under `--lang`; a single HTTP header is not a fingerprintable CDP
|
|
58
|
+
* artifact, unlike Runtime.enable or inspector traces).
|
|
59
|
+
*/
|
|
60
|
+
export type InjectionPlan = {
|
|
61
|
+
kind: 'native';
|
|
62
|
+
/** Accept-Language header value, when a resolved locale demands one. */
|
|
63
|
+
acceptLanguage?: string;
|
|
64
|
+
} | {
|
|
65
|
+
kind: 'full';
|
|
66
|
+
/** Emulation.setTimezoneOverride target, when any timezone source resolved. */
|
|
67
|
+
timezone?: string;
|
|
68
|
+
/** Emulation.setLocaleOverride target. */
|
|
69
|
+
locale?: string;
|
|
70
|
+
/** Injectable subset of fingerprint headers, locale + UA aligned. */
|
|
71
|
+
headers: Record<string, string>;
|
|
72
|
+
/** UA string aligned to the running binary's major version ('' = none). */
|
|
73
|
+
userAgent: string;
|
|
74
|
+
/** UA-CH metadata aligned to the running binary, when fingerprint data is in use. */
|
|
75
|
+
uaClientHints?: UAClientHintsData;
|
|
76
|
+
/**
|
|
77
|
+
* The running binary's real build version from `Browser.getVersion`
|
|
78
|
+
* (e.g. "147.0.7727.56"), or null when the probe failed. UA-CH surfaces
|
|
79
|
+
* must take the full version from HERE, never from the UA string, which
|
|
80
|
+
* UA Reduction has frozen to MAJOR.0.0.0 (issue #131).
|
|
81
|
+
*/
|
|
82
|
+
binaryFullVersion: string | null;
|
|
83
|
+
platform: 'Win32' | 'MacIntel' | 'Linux x86_64';
|
|
84
|
+
viewport?: Viewport;
|
|
85
|
+
/** The single bundled script for Page.addScriptToEvaluateOnNewDocument. */
|
|
86
|
+
bundledScript: string;
|
|
87
|
+
debug: boolean;
|
|
88
|
+
};
|
|
89
|
+
export interface InjectionPlanInput {
|
|
90
|
+
browserFingerprintWithHeaders: BrowserFingerprintWithHeaders;
|
|
91
|
+
options?: AttachOptions;
|
|
92
|
+
/** From the executor's CDP Browser.getVersion probe; null when unavailable. */
|
|
93
|
+
actualChromeVersion: string | null;
|
|
94
|
+
/** From the executor's ipinfo.io lookup, only when `needsIpTimezoneLookup`. */
|
|
95
|
+
ipTimezone?: string;
|
|
96
|
+
}
|
|
97
|
+
/** The native-stealth fast-path gate. The executor must not probe CDP when this holds. */
|
|
98
|
+
export declare function isNativeStealth(options?: AttachOptions): boolean;
|
|
99
|
+
/**
|
|
100
|
+
* Legacy timezone path: no resolved triple, but `timezone`/`detectTimezone` was
|
|
101
|
+
* set → the executor owes the planner an ipinfo.io lookup result.
|
|
102
|
+
* (Historical quirk preserved: an explicit legacy `timezone` value also
|
|
103
|
+
* triggers the IP lookup; the literal value is never used directly.)
|
|
104
|
+
*/
|
|
105
|
+
export declare function needsIpTimezoneLookup(options?: AttachOptions): boolean;
|
|
106
|
+
/**
|
|
107
|
+
* Strip CDP-injection tells from one override script.
|
|
108
|
+
* Anti-bot services hook console.log and detect debug prefixes like
|
|
109
|
+
* [CDP-FP-DEBUG], [DD-BYPASS], [RUNTIME-ENABLE-BYPASS] - so console output is
|
|
110
|
+
* stripped in production. sourceURL comments would name our repo layout.
|
|
111
|
+
*/
|
|
112
|
+
export declare function cleanInjectedScript(script: string, debug: boolean): string;
|
|
113
|
+
/** Test-only: drop the process-level clean/validation memo so runs start fresh. */
|
|
114
|
+
export declare function resetInjectionPlanCachesForTesting(): void;
|
|
115
|
+
/**
|
|
116
|
+
* Normalize options into the narrow OverrideContext - the only shape the
|
|
117
|
+
* override registry sees. All option defaults are resolved here, once.
|
|
118
|
+
*/
|
|
119
|
+
export declare function buildOverrideContext(options: AttachOptions | undefined, data: {
|
|
120
|
+
fingerprint: OverrideContext['fingerprint'];
|
|
121
|
+
webglConfig?: WebGLConfig;
|
|
122
|
+
platformConfig?: PlatformConfig;
|
|
123
|
+
uaClientHints?: UAClientHintsData;
|
|
124
|
+
binaryFullVersion?: string | null;
|
|
125
|
+
}): OverrideContext;
|
|
126
|
+
/**
|
|
127
|
+
* Build the InjectionPlan. Pure: same inputs → same plan.
|
|
128
|
+
*
|
|
129
|
+
* Throws when the assembled script bundle fails syntax validation - a plan
|
|
130
|
+
* that would crash the page is a planning error, not an execution error.
|
|
131
|
+
*/
|
|
132
|
+
export declare function buildInjectionPlan(input: InjectionPlanInput): InjectionPlan;
|
|
133
|
+
//# sourceMappingURL=injection-planner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"injection-planner.d.ts","sourceRoot":"","sources":["../../src/fingerprinting/injection-planner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,497 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* InjectionPlanner - the pure half of fingerprint injection.
|
|
3
|
+
*
|
|
4
|
+
* `buildInjectionPlan` turns (fingerprint, options, binary version) into an
|
|
5
|
+
* InjectionPlan: a plain value describing everything the injector intends to
|
|
6
|
+
* do to the page. No CDP types, no I/O - the plan is the test surface.
|
|
7
|
+
* `CdpFingerprintInjector.attachToPage` is the thin executor that probes the
|
|
8
|
+
* binary version over CDP, builds the plan, and applies it.
|
|
9
|
+
*/
|
|
10
|
+
import { log } from 'crawlee';
|
|
11
|
+
import { assembleOverrideScripts } from './fingerprint-overrides/registry.js';
|
|
12
|
+
import { deriveRealisticDeviceMemory, normalizePlatformVersion, stableSeedFromString, } from './hardware-realism.js';
|
|
13
|
+
import { alignPlatformConfigWithBinary, alignUAClientHintsVersion, alignUserAgentWithBrowserVersion, buildInjectableHeaders, } from './ua-alignment.js';
|
|
14
|
+
import { resolveInjectionSeedKey } from '../session-profile.js';
|
|
15
|
+
/** The native-stealth fast-path gate. The executor must not probe CDP when this holds. */
|
|
16
|
+
export function isNativeStealth(options) {
|
|
17
|
+
return options?.useNativeStealth === true;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Legacy timezone path: no resolved triple, but `timezone`/`detectTimezone` was
|
|
21
|
+
* set → the executor owes the planner an ipinfo.io lookup result.
|
|
22
|
+
* (Historical quirk preserved: an explicit legacy `timezone` value also
|
|
23
|
+
* triggers the IP lookup; the literal value is never used directly.)
|
|
24
|
+
*/
|
|
25
|
+
export function needsIpTimezoneLookup(options) {
|
|
26
|
+
return !options?.resolvedLocale?.timezone
|
|
27
|
+
&& Boolean(options?.timezone || options?.detectTimezone);
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Strip CDP-injection tells from one override script.
|
|
31
|
+
* Anti-bot services hook console.log and detect debug prefixes like
|
|
32
|
+
* [CDP-FP-DEBUG], [DD-BYPASS], [RUNTIME-ENABLE-BYPASS] - so console output is
|
|
33
|
+
* stripped in production. sourceURL comments would name our repo layout.
|
|
34
|
+
*/
|
|
35
|
+
export function cleanInjectedScript(script, debug) {
|
|
36
|
+
let cleaned = script
|
|
37
|
+
// Remove sourceURL patterns that reveal CDP injection
|
|
38
|
+
.replace(/\/\/# sourceURL=[^\n]*/g, '')
|
|
39
|
+
.replace(/\/\/@ sourceURL=[^\n]*/g, '')
|
|
40
|
+
// Remove sourceMappingURL patterns
|
|
41
|
+
.replace(/\/\/# sourceMappingURL=[^\n]*/g, '')
|
|
42
|
+
// Remove puppeteer/playwright markers
|
|
43
|
+
.replace(/__puppeteer_evaluation_script__/g, 'anonymous')
|
|
44
|
+
.replace(/__playwright_evaluation_script__/g, 'anonymous')
|
|
45
|
+
// Remove CDP-specific comments
|
|
46
|
+
.replace(/\/\*\s*__CDP_[A-Z_]+__\s*\*\//g, '');
|
|
47
|
+
if (!debug) {
|
|
48
|
+
cleaned = cleaned
|
|
49
|
+
.replace(/^\s*console\.(log|warn|info|debug)\s*\([^;]*\);?\s*$/gm, '')
|
|
50
|
+
.replace(/^\s*const\s+(DEBUG_PREFIX|ERROR_PREFIX)\s*=\s*[^;]*;\s*$/gm, '');
|
|
51
|
+
}
|
|
52
|
+
return cleaned;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Cleaned form of each static override script, keyed by debug state + raw script
|
|
56
|
+
* bytes. Static scripts are a small fixed set, so this map stays bounded and its
|
|
57
|
+
* 6-8 regex passes run once per process per debug state. Per-session (dynamic)
|
|
58
|
+
* scripts are never keyed in here - they clean fresh on every build so proxy
|
|
59
|
+
* sessions never bleed cleaned bytes into one another.
|
|
60
|
+
*/
|
|
61
|
+
const cleanedStaticScriptCache = new Map();
|
|
62
|
+
/**
|
|
63
|
+
* `new Function` bundle syntax validation runs once per process. The static bulk
|
|
64
|
+
* of the bundle is constant, so once the first assembled bundle parses cleanly
|
|
65
|
+
* we skip the (expensive) re-parse on every subsequent page. The per-script
|
|
66
|
+
* fallback diagnosis below still runs whenever validation actually fails.
|
|
67
|
+
*/
|
|
68
|
+
let bundleSyntaxValidated = false;
|
|
69
|
+
/**
|
|
70
|
+
* Injection seed key per proxyUrl, resolved once per session for process
|
|
71
|
+
* lifetime. `resolveInjectionSeedKey` runs a regex parse (and the caller then
|
|
72
|
+
* pays a JSON.stringify for the preamble) - both are stable per proxy session,
|
|
73
|
+
* so the parse cost is paid once per session, not per page. Keyed per proxyUrl
|
|
74
|
+
* (no-proxy → the empty-string key) so distinct sessions never share a key.
|
|
75
|
+
*/
|
|
76
|
+
const injectionSeedKeyByProxy = new Map();
|
|
77
|
+
function cachedInjectionSeedKey(proxyUrl) {
|
|
78
|
+
const key = proxyUrl ?? '';
|
|
79
|
+
const cached = injectionSeedKeyByProxy.get(key);
|
|
80
|
+
if (cached !== undefined)
|
|
81
|
+
return cached;
|
|
82
|
+
const resolved = resolveInjectionSeedKey(proxyUrl);
|
|
83
|
+
injectionSeedKeyByProxy.set(key, resolved);
|
|
84
|
+
return resolved;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Clean one override script, memoizing the result for static scripts only.
|
|
88
|
+
*/
|
|
89
|
+
function cleanScript(script, debug, isStatic) {
|
|
90
|
+
if (!isStatic) {
|
|
91
|
+
return cleanInjectedScript(script, debug);
|
|
92
|
+
}
|
|
93
|
+
const key = `${debug ? 'd' : 'p'}:${script}`;
|
|
94
|
+
let cleaned = cleanedStaticScriptCache.get(key);
|
|
95
|
+
if (cleaned === undefined) {
|
|
96
|
+
cleaned = cleanInjectedScript(script, debug);
|
|
97
|
+
cleanedStaticScriptCache.set(key, cleaned);
|
|
98
|
+
}
|
|
99
|
+
return cleaned;
|
|
100
|
+
}
|
|
101
|
+
/** Test-only: drop the process-level clean/validation memo so runs start fresh. */
|
|
102
|
+
export function resetInjectionPlanCachesForTesting() {
|
|
103
|
+
cleanedStaticScriptCache.clear();
|
|
104
|
+
bundleSyntaxValidated = false;
|
|
105
|
+
injectionSeedKeyByProxy.clear();
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Normalize options into the narrow OverrideContext - the only shape the
|
|
109
|
+
* override registry sees. All option defaults are resolved here, once.
|
|
110
|
+
*/
|
|
111
|
+
export function buildOverrideContext(options, data) {
|
|
112
|
+
return {
|
|
113
|
+
advancedStealth: options?.enableAdvancedStealth !== false,
|
|
114
|
+
maskAutomation: options?.maskAutomationFlags !== false,
|
|
115
|
+
dataDomeBypass: Boolean(options?.enableDataDomeBypass || options?.bypassDatadome),
|
|
116
|
+
webRtcPolicy: options?.webRtcPolicy === 'disable' ? 'disable' : 'spoof',
|
|
117
|
+
humanization: {
|
|
118
|
+
mouse: Boolean(options?.humanization?.mouse || options?.humanizeInteractions),
|
|
119
|
+
keyboard: Boolean(options?.humanization?.keyboard),
|
|
120
|
+
scroll: Boolean(options?.humanization?.scroll),
|
|
121
|
+
},
|
|
122
|
+
spoof: {
|
|
123
|
+
webgl: options?.spoofWebGL !== false,
|
|
124
|
+
audio: options?.spoofAudioContext !== false,
|
|
125
|
+
clientRects: options?.spoofClientRects !== false,
|
|
126
|
+
fonts: options?.spoofFonts !== false,
|
|
127
|
+
performance: options?.spoofPerformance !== false,
|
|
128
|
+
locale: options?.spoofLocale !== false,
|
|
129
|
+
storage: options?.spoofStorage !== false,
|
|
130
|
+
timing: options?.spoofTiming !== false,
|
|
131
|
+
cdpDetection: options?.bypassCDPDetection !== false,
|
|
132
|
+
},
|
|
133
|
+
platform: options?.platform,
|
|
134
|
+
debug: options?.debug === true,
|
|
135
|
+
fingerprint: data.fingerprint,
|
|
136
|
+
webglConfig: data.webglConfig,
|
|
137
|
+
platformConfig: data.platformConfig,
|
|
138
|
+
uaClientHints: data.uaClientHints,
|
|
139
|
+
binaryFullVersion: data.binaryFullVersion ?? undefined,
|
|
140
|
+
useExperimentalFingerprints: Boolean(options?.useExperimentalFingerprints),
|
|
141
|
+
locale: {
|
|
142
|
+
locale: options?.resolvedLocale?.locale ?? 'en-US',
|
|
143
|
+
languages: options?.resolvedLocale?.languages ?? 'en-US,en;q=0.9',
|
|
144
|
+
},
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Extract relevant data from fingerprint for overrides
|
|
149
|
+
*/
|
|
150
|
+
function extractFingerprintData(fingerprint) {
|
|
151
|
+
const webglConfig = {};
|
|
152
|
+
const platformConfig = {};
|
|
153
|
+
let uaClientHints;
|
|
154
|
+
// Extract WebGL data from videoCard if available
|
|
155
|
+
if (fingerprint.videoCard) {
|
|
156
|
+
webglConfig.vendor = fingerprint.videoCard.vendor;
|
|
157
|
+
webglConfig.renderer = fingerprint.videoCard.renderer;
|
|
158
|
+
webglConfig.vendorUnmasked = fingerprint.videoCard.vendor;
|
|
159
|
+
webglConfig.rendererUnmasked = fingerprint.videoCard.renderer;
|
|
160
|
+
}
|
|
161
|
+
// Extract platform data if available
|
|
162
|
+
if (fingerprint.navigator) {
|
|
163
|
+
platformConfig.platform = fingerprint.navigator.platform;
|
|
164
|
+
platformConfig.vendor = fingerprint.navigator.vendor;
|
|
165
|
+
platformConfig.vendorSub = fingerprint.navigator.vendorSub;
|
|
166
|
+
platformConfig.productSub = fingerprint.navigator.productSub;
|
|
167
|
+
platformConfig.hardwareConcurrency = fingerprint.navigator.hardwareConcurrency;
|
|
168
|
+
platformConfig.maxTouchPoints = fingerprint.navigator.maxTouchPoints;
|
|
169
|
+
platformConfig.language = fingerprint.navigator.language;
|
|
170
|
+
platformConfig.languages = fingerprint.navigator.languages;
|
|
171
|
+
platformConfig.oscpu = fingerprint.navigator.oscpu;
|
|
172
|
+
platformConfig.userAgent = fingerprint.navigator.userAgent;
|
|
173
|
+
platformConfig.appVersion = fingerprint.navigator.appVersion;
|
|
174
|
+
platformConfig.appName = fingerprint.navigator.appName;
|
|
175
|
+
platformConfig.appCodeName = fingerprint.navigator.appCodeName;
|
|
176
|
+
platformConfig.product = fingerprint.navigator.product;
|
|
177
|
+
// Extract UA-CH data from generated fingerprint
|
|
178
|
+
// This ensures navigator.userAgentData brands/versions match the UA string
|
|
179
|
+
if (fingerprint.navigator.userAgentData) {
|
|
180
|
+
const uad = fingerprint.navigator.userAgentData;
|
|
181
|
+
uaClientHints = {
|
|
182
|
+
brands: uad.brands,
|
|
183
|
+
fullVersionList: uad.fullVersionList,
|
|
184
|
+
mobile: uad.mobile,
|
|
185
|
+
platform: uad.platform,
|
|
186
|
+
architecture: uad.architecture,
|
|
187
|
+
bitness: uad.bitness,
|
|
188
|
+
model: uad.model,
|
|
189
|
+
platformVersion: uad.platformVersion,
|
|
190
|
+
uaFullVersion: uad.uaFullVersion,
|
|
191
|
+
// wow64 is not part of the generator's UserAgentData shape but the
|
|
192
|
+
// real navigator.userAgentData carries it; forward when present.
|
|
193
|
+
wow64: uad.wow64,
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
if (fingerprint.screen) {
|
|
198
|
+
platformConfig.devicePixelRatio = fingerprint.screen.devicePixelRatio;
|
|
199
|
+
platformConfig.screenDepth = fingerprint.screen.pixelDepth;
|
|
200
|
+
platformConfig.colorDepth = fingerprint.screen.colorDepth;
|
|
201
|
+
}
|
|
202
|
+
return { webglConfig, platformConfig, uaClientHints };
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Create a debug script that logs fingerprint override status to the console
|
|
206
|
+
*/
|
|
207
|
+
function createDebugScript(options) {
|
|
208
|
+
return `
|
|
209
|
+
(() => {
|
|
210
|
+
// CDP Fingerprint Override Debug Logs
|
|
211
|
+
const DEBUG_PREFIX = '[CDP-FP-DEBUG]';
|
|
212
|
+
|
|
213
|
+
console.log(DEBUG_PREFIX, '=== Fingerprint Override Status ===');
|
|
214
|
+
console.log(DEBUG_PREFIX, 'Timestamp:', new Date().toISOString());
|
|
215
|
+
|
|
216
|
+
// Check navigator properties
|
|
217
|
+
console.log(DEBUG_PREFIX, 'Navigator Checks:');
|
|
218
|
+
console.log(DEBUG_PREFIX, ' - platform:', navigator.platform);
|
|
219
|
+
console.log(DEBUG_PREFIX, ' - userAgent:', navigator.userAgent.substring(0, 80) + '...');
|
|
220
|
+
console.log(DEBUG_PREFIX, ' - webdriver:', navigator.webdriver);
|
|
221
|
+
console.log(DEBUG_PREFIX, ' - hardwareConcurrency:', navigator.hardwareConcurrency);
|
|
222
|
+
console.log(DEBUG_PREFIX, ' - deviceMemory:', navigator.deviceMemory);
|
|
223
|
+
console.log(DEBUG_PREFIX, ' - language:', navigator.language);
|
|
224
|
+
console.log(DEBUG_PREFIX, ' - languages:', navigator.languages);
|
|
225
|
+
console.log(DEBUG_PREFIX, ' - maxTouchPoints:', navigator.maxTouchPoints);
|
|
226
|
+
console.log(DEBUG_PREFIX, ' - pdfViewerEnabled:', navigator.pdfViewerEnabled);
|
|
227
|
+
console.log(DEBUG_PREFIX, ' - plugins.length:', navigator.plugins?.length);
|
|
228
|
+
|
|
229
|
+
// Check screen properties
|
|
230
|
+
console.log(DEBUG_PREFIX, 'Screen Checks:');
|
|
231
|
+
console.log(DEBUG_PREFIX, ' - colorDepth:', screen.colorDepth);
|
|
232
|
+
console.log(DEBUG_PREFIX, ' - pixelDepth:', screen.pixelDepth);
|
|
233
|
+
console.log(DEBUG_PREFIX, ' - availWidth:', screen.availWidth);
|
|
234
|
+
console.log(DEBUG_PREFIX, ' - availHeight:', screen.availHeight);
|
|
235
|
+
console.log(DEBUG_PREFIX, ' - devicePixelRatio:', window.devicePixelRatio);
|
|
236
|
+
|
|
237
|
+
// Check window properties
|
|
238
|
+
console.log(DEBUG_PREFIX, 'Window Checks:');
|
|
239
|
+
console.log(DEBUG_PREFIX, ' - outerWidth:', window.outerWidth);
|
|
240
|
+
console.log(DEBUG_PREFIX, ' - outerHeight:', window.outerHeight);
|
|
241
|
+
console.log(DEBUG_PREFIX, ' - screenX:', window.screenX);
|
|
242
|
+
console.log(DEBUG_PREFIX, ' - screenY:', window.screenY);
|
|
243
|
+
|
|
244
|
+
// Check chrome object
|
|
245
|
+
console.log(DEBUG_PREFIX, 'Chrome Object:');
|
|
246
|
+
console.log(DEBUG_PREFIX, ' - chrome exists:', typeof window.chrome !== 'undefined');
|
|
247
|
+
console.log(DEBUG_PREFIX, ' - chrome.runtime exists:', typeof window.chrome?.runtime !== 'undefined');
|
|
248
|
+
|
|
249
|
+
// Check WebGL
|
|
250
|
+
try {
|
|
251
|
+
const canvas = document.createElement('canvas');
|
|
252
|
+
const gl = canvas.getContext('webgl') || canvas.getContext('experimental-webgl');
|
|
253
|
+
if (gl) {
|
|
254
|
+
const debugInfo = gl.getExtension('WEBGL_debug_renderer_info');
|
|
255
|
+
if (debugInfo) {
|
|
256
|
+
console.log(DEBUG_PREFIX, 'WebGL Checks:');
|
|
257
|
+
console.log(DEBUG_PREFIX, ' - vendor:', gl.getParameter(debugInfo.UNMASKED_VENDOR_WEBGL));
|
|
258
|
+
console.log(DEBUG_PREFIX, ' - renderer:', gl.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL));
|
|
259
|
+
} else {
|
|
260
|
+
console.log(DEBUG_PREFIX, 'WebGL debug extension not available');
|
|
261
|
+
}
|
|
262
|
+
} else {
|
|
263
|
+
console.log(DEBUG_PREFIX, 'WebGL context not available');
|
|
264
|
+
}
|
|
265
|
+
} catch (e) {
|
|
266
|
+
console.log(DEBUG_PREFIX, 'WebGL check failed:', e.message);
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
// Check automation markers
|
|
270
|
+
console.log(DEBUG_PREFIX, 'Automation Marker Checks:');
|
|
271
|
+
console.log(DEBUG_PREFIX, ' - $cdc_ properties:', Object.keys(window).filter(k => k.startsWith('$cdc_') || k.startsWith('cdc_')).length === 0 ? 'CLEAN' : 'DETECTED');
|
|
272
|
+
console.log(DEBUG_PREFIX, ' - webdriver properties:', Object.keys(window).filter(k => k.toLowerCase().includes('webdriver')).length === 0 ? 'CLEAN' : 'DETECTED');
|
|
273
|
+
|
|
274
|
+
// Check permissions API
|
|
275
|
+
if (navigator.permissions) {
|
|
276
|
+
navigator.permissions.query({ name: 'notifications' }).then(result => {
|
|
277
|
+
console.log(DEBUG_PREFIX, 'Permissions:');
|
|
278
|
+
console.log(DEBUG_PREFIX, ' - notifications:', result.state);
|
|
279
|
+
}).catch(e => {
|
|
280
|
+
console.log(DEBUG_PREFIX, 'Permissions check failed:', e.message);
|
|
281
|
+
});
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
// Check storage estimate
|
|
285
|
+
if (navigator.storage && navigator.storage.estimate) {
|
|
286
|
+
navigator.storage.estimate().then(estimate => {
|
|
287
|
+
console.log(DEBUG_PREFIX, 'Storage:');
|
|
288
|
+
console.log(DEBUG_PREFIX, ' - quota:', Math.round(estimate.quota / 1024 / 1024 / 1024) + ' GB');
|
|
289
|
+
console.log(DEBUG_PREFIX, ' - usage:', Math.round(estimate.usage / 1024) + ' KB');
|
|
290
|
+
}).catch(e => {
|
|
291
|
+
console.log(DEBUG_PREFIX, 'Storage check failed:', e.message);
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
// Log applied options
|
|
296
|
+
console.log(DEBUG_PREFIX, 'Applied Options:');
|
|
297
|
+
console.log(DEBUG_PREFIX, ' - platform:', '${options.platform || "auto"}');
|
|
298
|
+
console.log(DEBUG_PREFIX, ' - enableAdvancedStealth:', ${options.enableAdvancedStealth !== false});
|
|
299
|
+
console.log(DEBUG_PREFIX, ' - bypassCDPDetection:', ${options.bypassCDPDetection !== false});
|
|
300
|
+
console.log(DEBUG_PREFIX, ' - spoofStorage:', ${options.spoofStorage !== false});
|
|
301
|
+
console.log(DEBUG_PREFIX, ' - spoofTiming:', ${options.spoofTiming !== false});
|
|
302
|
+
console.log(DEBUG_PREFIX, ' - enableDataDomeBypass:', ${options.enableDataDomeBypass || false});
|
|
303
|
+
console.log(DEBUG_PREFIX, ' - humanization.mouse:', ${options.humanization?.mouse || false});
|
|
304
|
+
console.log(DEBUG_PREFIX, ' - humanization.keyboard:', ${options.humanization?.keyboard || false});
|
|
305
|
+
console.log(DEBUG_PREFIX, ' - humanization.scroll:', ${options.humanization?.scroll || false});
|
|
306
|
+
|
|
307
|
+
console.log(DEBUG_PREFIX, '=== End Fingerprint Override Status ===');
|
|
308
|
+
})();
|
|
309
|
+
`;
|
|
310
|
+
}
|
|
311
|
+
/**
|
|
312
|
+
* Build the InjectionPlan. Pure: same inputs → same plan.
|
|
313
|
+
*
|
|
314
|
+
* Throws when the assembled script bundle fails syntax validation - a plan
|
|
315
|
+
* that would crash the page is a planning error, not an execution error.
|
|
316
|
+
*/
|
|
317
|
+
export function buildInjectionPlan(input) {
|
|
318
|
+
const { options, actualChromeVersion, ipTimezone } = input;
|
|
319
|
+
const { fingerprint, headers } = input.browserFingerprintWithHeaders;
|
|
320
|
+
// ── Native-stealth fast-path ─────────────────────────────────────────
|
|
321
|
+
// Every fingerprint surface is handled by the C++ source-tree edits.
|
|
322
|
+
// CDP-side overrides are strictly incompatible with native stealth: they
|
|
323
|
+
// either duplicate what the C++ patches already do (double-override →
|
|
324
|
+
// inconsistency) or introduce CDP artifacts the C++ patches are designed
|
|
325
|
+
// to hide. The only allowed action is the Accept-Language header.
|
|
326
|
+
if (isNativeStealth(options)) {
|
|
327
|
+
return {
|
|
328
|
+
kind: 'native',
|
|
329
|
+
acceptLanguage: options?.resolvedLocale?.languages,
|
|
330
|
+
};
|
|
331
|
+
}
|
|
332
|
+
// Locale/timezone resolution priority:
|
|
333
|
+
// 1. Resolved triple from browser-plugin (user locale → proxy country → fingerprint)
|
|
334
|
+
// 2. Legacy options.timezone / options.detectTimezone → executor's ipinfo.io lookup
|
|
335
|
+
// Resolved values always win so fingerprintOptions.locale: 'ko-KR' coherently
|
|
336
|
+
// propagates to every locale surface.
|
|
337
|
+
const timezone = options?.resolvedLocale?.timezone ?? ipTimezone;
|
|
338
|
+
// Version-alignment + header filtering are pure - see ua-alignment.ts.
|
|
339
|
+
const originalUserAgent = fingerprint?.navigator?.userAgent
|
|
340
|
+
|| headers['user-agent']
|
|
341
|
+
|| headers['User-Agent']
|
|
342
|
+
|| '';
|
|
343
|
+
const userAgent = alignUserAgentWithBrowserVersion(originalUserAgent, actualChromeVersion);
|
|
344
|
+
// Session seed for the hardware-realism helpers. The proxy session key is the
|
|
345
|
+
// same input the injected bundle seeds itself from, so a session's reported
|
|
346
|
+
// memory/quota/platformVersion stay stable across its pages and match what the
|
|
347
|
+
// native config generator would derive.
|
|
348
|
+
const injectionSeed = stableSeedFromString(cachedInjectionSeedKey(options?.proxyUrl) ?? originalUserAgent);
|
|
349
|
+
const filteredHeaders = buildInjectableHeaders(headers, options?.resolvedLocale?.languages, userAgent, actualChromeVersion);
|
|
350
|
+
// Extract fingerprint data if we should use it
|
|
351
|
+
// When useFingerprintDefaults is true (or undefined), use hardcoded defaults
|
|
352
|
+
// When useFingerprintDefaults is false, use the generated fingerprint data
|
|
353
|
+
const shouldUseFingerprintData = options?.useFingerprintDefaults === false;
|
|
354
|
+
const { webglConfig, platformConfig, uaClientHints: rawUaClientHints } = shouldUseFingerprintData
|
|
355
|
+
? extractFingerprintData(fingerprint)
|
|
356
|
+
: { webglConfig: undefined, platformConfig: undefined, uaClientHints: undefined };
|
|
357
|
+
// Align UA-CH brand/full-version fields with the actual running binary so the
|
|
358
|
+
// fingerprint profile version (132-135) doesn't contradict the real binary (147+).
|
|
359
|
+
const alignedUaClientHints = rawUaClientHints && actualChromeVersion
|
|
360
|
+
? alignUAClientHintsVersion(rawUaClientHints, actualChromeVersion)
|
|
361
|
+
: rawUaClientHints;
|
|
362
|
+
// One platformVersion for the whole path: the UA-CH override script, the
|
|
363
|
+
// getHighEntropyValues answer and the sec-ch-ua-platform-version header all
|
|
364
|
+
// read this. Pool Linux rows either omit it (90%) or carry a pre-reduction
|
|
365
|
+
// kernel version, and the old fallback was a macOS number (issue #137).
|
|
366
|
+
const uaClientHints = alignedUaClientHints
|
|
367
|
+
? {
|
|
368
|
+
...alignedUaClientHints,
|
|
369
|
+
platformVersion: normalizePlatformVersion(options?.platform ?? fingerprint?.navigator?.platform, alignedUaClientHints.platformVersion, injectionSeed),
|
|
370
|
+
}
|
|
371
|
+
: alignedUaClientHints;
|
|
372
|
+
const platformConfigForScript = alignPlatformConfigWithBinary(shouldUseFingerprintData ? platformConfig : undefined, options?.platform, actualChromeVersion);
|
|
373
|
+
const isDebug = options?.debug === true;
|
|
374
|
+
// The navigator-override module bakes `fingerprint.navigator.userAgent`
|
|
375
|
+
// VERBATIM into the injected bundle. Feed the registry an aligned copy so
|
|
376
|
+
// the bundle can never contradict `plan.userAgent` / the sec-ch-ua headers.
|
|
377
|
+
//
|
|
378
|
+
// `CdpFingerprintInjector.attachToPage` also aligns the shared fingerprint
|
|
379
|
+
// in place before calling us - but that mutation exists for a different
|
|
380
|
+
// consumer (Crawlee's own postPageCreate hook, issue #104), and relying on
|
|
381
|
+
// it here made this "pure" function's output silently depend on the caller
|
|
382
|
+
// having run that step first. Any other call site, or a reordering, would
|
|
383
|
+
// reintroduce a stale navigator.userAgent. Copy rather than mutate, so
|
|
384
|
+
// buildInjectionPlan stays free of side effects on its input.
|
|
385
|
+
//
|
|
386
|
+
// `deviceMemory` is sanitized in the same copy. The pool ships mac rows
|
|
387
|
+
// claiming 0/1/2/4 GB - values no Mac has shipped - and the navigator
|
|
388
|
+
// override treated the profile value as authoritative. A 0 was worse than
|
|
389
|
+
// wrong: it is falsy, so the override was skipped and the page reported the
|
|
390
|
+
// HOST's real RAM (issue #137). The native path already resampled; now both
|
|
391
|
+
// paths call the same helper with the same seed.
|
|
392
|
+
const rawDeviceMemory = fingerprint?.navigator?.deviceMemory;
|
|
393
|
+
const coherentDeviceMemory = deriveRealisticDeviceMemory(injectionSeed, rawDeviceMemory);
|
|
394
|
+
const needsUserAgentFix = Boolean(userAgent && fingerprint?.navigator?.userAgent
|
|
395
|
+
&& fingerprint.navigator.userAgent !== userAgent);
|
|
396
|
+
const needsDeviceMemoryFix = Boolean(fingerprint?.navigator) && rawDeviceMemory !== coherentDeviceMemory;
|
|
397
|
+
const fingerprintForOverrides = (needsUserAgentFix || needsDeviceMemoryFix)
|
|
398
|
+
? {
|
|
399
|
+
...fingerprint,
|
|
400
|
+
navigator: {
|
|
401
|
+
...fingerprint.navigator,
|
|
402
|
+
...(needsUserAgentFix
|
|
403
|
+
? {
|
|
404
|
+
userAgent,
|
|
405
|
+
...(fingerprint?.navigator?.appVersion
|
|
406
|
+
? { appVersion: alignUserAgentWithBrowserVersion(fingerprint.navigator.appVersion, actualChromeVersion) }
|
|
407
|
+
: {}),
|
|
408
|
+
}
|
|
409
|
+
: {}),
|
|
410
|
+
...(needsDeviceMemoryFix ? { deviceMemory: coherentDeviceMemory } : {}),
|
|
411
|
+
},
|
|
412
|
+
}
|
|
413
|
+
: fingerprint;
|
|
414
|
+
const overrideContext = buildOverrideContext(options, {
|
|
415
|
+
fingerprint: fingerprintForOverrides,
|
|
416
|
+
webglConfig,
|
|
417
|
+
platformConfig: platformConfigForScript,
|
|
418
|
+
uaClientHints,
|
|
419
|
+
binaryFullVersion: actualChromeVersion,
|
|
420
|
+
});
|
|
421
|
+
// One seam: filter by native coverage, filter by option gates, sort by
|
|
422
|
+
// declared order, build each override. Native runs never reach this point
|
|
423
|
+
// (early return above), but the registry filter IS the documented map of
|
|
424
|
+
// which surfaces the C++ binary owns. Each script carries an `isStatic` tag
|
|
425
|
+
// so the cleaning pass can be memoized for context-independent scripts only.
|
|
426
|
+
const assembled = assembleOverrideScripts(overrideContext, { nativeStealth: false });
|
|
427
|
+
// Add debug scripts into the bundle only when explicitly enabled. The debug
|
|
428
|
+
// script interpolates option values, so it is never treated as static.
|
|
429
|
+
if (isDebug) {
|
|
430
|
+
assembled.push({ script: createDebugScript(options || {}), isStatic: false });
|
|
431
|
+
}
|
|
432
|
+
// BUNDLE ALL SCRIPTS INTO ONE to minimize CDP interactions.
|
|
433
|
+
// debug, not info: this fires once per page, so on a real crawl it would
|
|
434
|
+
// emit thousands of identical lines.
|
|
435
|
+
log.debug(`Bundling ${assembled.length} fingerprint scripts into single injection`);
|
|
436
|
+
// Extract proxy seed key for deterministic fingerprint seeding.
|
|
437
|
+
// Priority: session ID from Apify proxy URL > full proxy URL > null.
|
|
438
|
+
const proxySeedKey = cachedInjectionSeedKey(options?.proxyUrl);
|
|
439
|
+
// Preamble: create shared stealth store accessible by all module IIFEs via closure.
|
|
440
|
+
// seedKey: proxy session ID or proxy URL - used by _stableHash for deterministic fingerprints.
|
|
441
|
+
const preamble = `var __stealth = { debug: ${isDebug}, seedKey: ${proxySeedKey ? JSON.stringify(proxySeedKey) : 'null'} };`;
|
|
442
|
+
// Neutralize the CDP-injection stack-frame tell. V8 renders scripts
|
|
443
|
+
// registered via Page.addScriptToEvaluateOnNewDocument that carry no
|
|
444
|
+
// sourceURL as "<anonymous>" in Error.stack - a well-known detection
|
|
445
|
+
// vector (DataDome, CreepJS, fpscanner all check for it). Appending
|
|
446
|
+
// `//# sourceURL=about:blank` makes V8 render stack frames as if the
|
|
447
|
+
// script loaded from about:blank, which is indistinguishable from
|
|
448
|
+
// a normal bootstrap script on a fresh page.
|
|
449
|
+
//
|
|
450
|
+
// Note: the cleanInjectedScript pass strips *existing* sourceURL comments
|
|
451
|
+
// in the per-module scripts (to avoid the comment naming a file path
|
|
452
|
+
// that reveals our repo layout). We then stamp exactly one sourceURL
|
|
453
|
+
// on the outer bundle so the final script V8 sees has a clean name.
|
|
454
|
+
const bundledScript = `${preamble}\n\n${assembled
|
|
455
|
+
.map(({ script, isStatic }) => cleanScript(script, isDebug, isStatic))
|
|
456
|
+
.join('\n\n')}\n//# sourceURL=about:blank\n`;
|
|
457
|
+
// Validate the bundled script for syntax errors, but only once per process:
|
|
458
|
+
// the static bulk of the bundle is constant, so re-parsing every page is pure
|
|
459
|
+
// overhead. The per-script fallback diagnosis still runs on an actual failure.
|
|
460
|
+
if (!bundleSyntaxValidated) {
|
|
461
|
+
try {
|
|
462
|
+
// eslint-disable-next-line no-new-func, no-new
|
|
463
|
+
new Function(bundledScript);
|
|
464
|
+
bundleSyntaxValidated = true;
|
|
465
|
+
log.debug('✓ Bundled script passed syntax validation');
|
|
466
|
+
}
|
|
467
|
+
catch (error) {
|
|
468
|
+
log.error('✗ Bundled script has syntax error:', { error });
|
|
469
|
+
// Fall back to individual script validation to find the culprit
|
|
470
|
+
assembled.forEach(({ script }, index) => {
|
|
471
|
+
try {
|
|
472
|
+
// eslint-disable-next-line no-new-func, no-new
|
|
473
|
+
new Function(script);
|
|
474
|
+
}
|
|
475
|
+
catch (e) {
|
|
476
|
+
const scriptPreview = script.substring(0, 300);
|
|
477
|
+
log.error(`✗ Error in script ${index + 1}:`, { error: e, scriptPreview });
|
|
478
|
+
}
|
|
479
|
+
});
|
|
480
|
+
throw new Error(`Bundled script has syntax error: ${error}`);
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
return {
|
|
484
|
+
kind: 'full',
|
|
485
|
+
timezone,
|
|
486
|
+
locale: options?.resolvedLocale?.locale,
|
|
487
|
+
headers: filteredHeaders,
|
|
488
|
+
userAgent,
|
|
489
|
+
uaClientHints,
|
|
490
|
+
binaryFullVersion: actualChromeVersion,
|
|
491
|
+
platform: options?.platform || 'Win32',
|
|
492
|
+
viewport: options?.viewport,
|
|
493
|
+
bundledScript,
|
|
494
|
+
debug: isDebug,
|
|
495
|
+
};
|
|
496
|
+
}
|
|
497
|
+
//# sourceMappingURL=injection-planner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"injection-planner.js","sourceRoot":"","sources":["../../src/fingerprinting/injection-planner.ts"],"names":[],"mappings":"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"}
|