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,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Describe a contradiction between the two OS-related config knobs, if any.
|
|
3
|
+
*
|
|
4
|
+
* The crawler historically exposed two ways to express "I want fingerprints
|
|
5
|
+
* from OS X":
|
|
6
|
+
*
|
|
7
|
+
* 1. `browserPoolOptions.fingerprintOptions.fingerprintGeneratorOptions.operatingSystems`
|
|
8
|
+
* - Crawlee's standard knob, an array of `'macos' | 'linux' | 'windows'`.
|
|
9
|
+
* This is the **single source of truth** for OS selection (issue #80).
|
|
10
|
+
*
|
|
11
|
+
* 2. `launchContext.launchOptions.fingerprintOptions.platform` - the legacy
|
|
12
|
+
* anti-detect knob, a single `'MacIntel' | 'Win32' | 'Linux x86_64'`. It is
|
|
13
|
+
* deprecated and, when it disagrees with `operatingSystems`, loses: the
|
|
14
|
+
* resolved OS is derived from the fingerprint the generator produced.
|
|
15
|
+
*
|
|
16
|
+
* This used to `throw` on disagreement, aborting the launch (and, at the
|
|
17
|
+
* per-page selection site, a whole crawl). Under the #80 single-source model
|
|
18
|
+
* the contradiction is no longer fatal - `operatingSystems` simply wins and the
|
|
19
|
+
* caller gets a warning. This function returns that human-readable warning (or
|
|
20
|
+
* `null` when the pair is consistent / not both caller-supplied), leaving the
|
|
21
|
+
* decision to `log.warning` to the caller.
|
|
22
|
+
*
|
|
23
|
+
* Only reports when BOTH values are present - host-OS auto-fill for
|
|
24
|
+
* `operatingSystems` is internal policy, not a user statement of intent, so it
|
|
25
|
+
* never conflicts with an explicit `platform` pin.
|
|
26
|
+
*/
|
|
27
|
+
export declare function describeOsConflict(callerOpSys: string | undefined, platform: string | undefined): string | null;
|
|
28
|
+
//# sourceMappingURL=os-consistency.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"os-consistency.d.ts","sourceRoot":"","sources":["../../src/fingerprinting/os-consistency.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,kBAAkB,CAC9B,WAAW,EAAE,MAAM,GAAG,SAAS,EAC/B,QAAQ,EAAE,MAAM,GAAG,SAAS,GAC7B,MAAM,GAAG,IAAI,CAgBf"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Describe a contradiction between the two OS-related config knobs, if any.
|
|
3
|
+
*
|
|
4
|
+
* The crawler historically exposed two ways to express "I want fingerprints
|
|
5
|
+
* from OS X":
|
|
6
|
+
*
|
|
7
|
+
* 1. `browserPoolOptions.fingerprintOptions.fingerprintGeneratorOptions.operatingSystems`
|
|
8
|
+
* - Crawlee's standard knob, an array of `'macos' | 'linux' | 'windows'`.
|
|
9
|
+
* This is the **single source of truth** for OS selection (issue #80).
|
|
10
|
+
*
|
|
11
|
+
* 2. `launchContext.launchOptions.fingerprintOptions.platform` - the legacy
|
|
12
|
+
* anti-detect knob, a single `'MacIntel' | 'Win32' | 'Linux x86_64'`. It is
|
|
13
|
+
* deprecated and, when it disagrees with `operatingSystems`, loses: the
|
|
14
|
+
* resolved OS is derived from the fingerprint the generator produced.
|
|
15
|
+
*
|
|
16
|
+
* This used to `throw` on disagreement, aborting the launch (and, at the
|
|
17
|
+
* per-page selection site, a whole crawl). Under the #80 single-source model
|
|
18
|
+
* the contradiction is no longer fatal - `operatingSystems` simply wins and the
|
|
19
|
+
* caller gets a warning. This function returns that human-readable warning (or
|
|
20
|
+
* `null` when the pair is consistent / not both caller-supplied), leaving the
|
|
21
|
+
* decision to `log.warning` to the caller.
|
|
22
|
+
*
|
|
23
|
+
* Only reports when BOTH values are present - host-OS auto-fill for
|
|
24
|
+
* `operatingSystems` is internal policy, not a user statement of intent, so it
|
|
25
|
+
* never conflicts with an explicit `platform` pin.
|
|
26
|
+
*/
|
|
27
|
+
export function describeOsConflict(callerOpSys, platform) {
|
|
28
|
+
if (!callerOpSys || !platform)
|
|
29
|
+
return null;
|
|
30
|
+
const PLATFORM_TO_OS = {
|
|
31
|
+
'MacIntel': 'macos',
|
|
32
|
+
'Win32': 'windows',
|
|
33
|
+
'Linux x86_64': 'linux',
|
|
34
|
+
};
|
|
35
|
+
const platformOs = PLATFORM_TO_OS[platform];
|
|
36
|
+
if (!platformOs)
|
|
37
|
+
return null; // unknown platform string - nothing to compare
|
|
38
|
+
if (platformOs === callerOpSys.toLowerCase())
|
|
39
|
+
return null;
|
|
40
|
+
return (`[AntiDetect] OS configuration conflict (issue #80): `
|
|
41
|
+
+ `browserPoolOptions.fingerprintOptions.fingerprintGeneratorOptions.operatingSystems=['${callerOpSys}'] `
|
|
42
|
+
+ `contradicts the deprecated launchOptions.fingerprintOptions.platform='${platform}'. `
|
|
43
|
+
+ `operatingSystems is the single source of truth and wins; drop fingerprintOptions.platform to silence this.`);
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=os-consistency.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"os-consistency.js","sourceRoot":"","sources":["../../src/fingerprinting/os-consistency.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,MAAM,UAAU,kBAAkB,CAC9B,WAA+B,EAC/B,QAA4B;IAE5B,IAAI,CAAC,WAAW,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC3C,MAAM,cAAc,GAA2B;QAC3C,UAAU,EAAE,OAAO;QACnB,OAAO,EAAE,SAAS;QAClB,cAAc,EAAE,OAAO;KAC1B,CAAC;IACF,MAAM,UAAU,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;IAC5C,IAAI,CAAC,UAAU;QAAE,OAAO,IAAI,CAAC,CAAC,+CAA+C;IAC7E,IAAI,UAAU,KAAK,WAAW,CAAC,WAAW,EAAE;QAAE,OAAO,IAAI,CAAC;IAC1D,OAAO,CACH,sDAAsD;UACpD,wFAAwF,WAAW,KAAK;UACxG,yEAAyE,QAAQ,KAAK;UACtF,4GAA4G,CACjH,CAAC;AACN,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { NavigatorPlatform } from '../session-profile.js';
|
|
2
|
+
/**
|
|
3
|
+
* Pool-contamination gate for fingerprint profiles.
|
|
4
|
+
*
|
|
5
|
+
* The upstream fingerprint-generator dataset contains a small but recurring
|
|
6
|
+
* fraction (~30-40%) of profiles that come from Lark/Feishu (ByteDance)
|
|
7
|
+
* modified Chrome installs and similar third-party browser modifications.
|
|
8
|
+
* Telltales:
|
|
9
|
+
* - a non-Chrome UA (Firefox / Safari) returned despite browsers:['chrome']
|
|
10
|
+
* - userAgent suffix " LarkUrl" or mid-UA " newsai/X.Y.Z" injection
|
|
11
|
+
* - navigator.platform = "Linux x86_64" while UA claims Macintosh
|
|
12
|
+
* - hardwareConcurrency > 32 (server CPU; consumer Macs are 4-16)
|
|
13
|
+
* - "10_15_6" frozen UA stamp instead of canonical Chrome 147 "10_15_7"
|
|
14
|
+
* A contaminated profile flows verbatim into FingerprintConfig and the
|
|
15
|
+
* C++ patches dutifully spoof to it - every CreepJS/DataDome/Naver run
|
|
16
|
+
* sees a bot.
|
|
17
|
+
*
|
|
18
|
+
* @param fp a BrowserFingerprintWithHeaders-shaped profile
|
|
19
|
+
* @param expectedPlatform when set, profiles of any other OS are rejected
|
|
20
|
+
* outright - even a "clean" profile of the wrong OS is a non-starter
|
|
21
|
+
* when targeting a specific host.
|
|
22
|
+
* @returns a human-readable rejection reason, or null when the profile is clean
|
|
23
|
+
*/
|
|
24
|
+
export declare function rejectContaminatedProfile(fp: any, expectedPlatform: NavigatorPlatform | null): string | null;
|
|
25
|
+
//# sourceMappingURL=profile-quality.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profile-quality.d.ts","sourceRoot":"","sources":["../../src/fingerprinting/profile-quality.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAG/D;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,yBAAyB,CACrC,EAAE,EAAE,GAAG,EACP,gBAAgB,EAAE,iBAAiB,GAAG,IAAI,GAC3C,MAAM,GAAG,IAAI,CA6Sf"}
|
|
@@ -0,0 +1,310 @@
|
|
|
1
|
+
import { describeGreaseIncoherence, isGreaseBrand } from './ua-ch-brands.js';
|
|
2
|
+
/**
|
|
3
|
+
* Pool-contamination gate for fingerprint profiles.
|
|
4
|
+
*
|
|
5
|
+
* The upstream fingerprint-generator dataset contains a small but recurring
|
|
6
|
+
* fraction (~30-40%) of profiles that come from Lark/Feishu (ByteDance)
|
|
7
|
+
* modified Chrome installs and similar third-party browser modifications.
|
|
8
|
+
* Telltales:
|
|
9
|
+
* - a non-Chrome UA (Firefox / Safari) returned despite browsers:['chrome']
|
|
10
|
+
* - userAgent suffix " LarkUrl" or mid-UA " newsai/X.Y.Z" injection
|
|
11
|
+
* - navigator.platform = "Linux x86_64" while UA claims Macintosh
|
|
12
|
+
* - hardwareConcurrency > 32 (server CPU; consumer Macs are 4-16)
|
|
13
|
+
* - "10_15_6" frozen UA stamp instead of canonical Chrome 147 "10_15_7"
|
|
14
|
+
* A contaminated profile flows verbatim into FingerprintConfig and the
|
|
15
|
+
* C++ patches dutifully spoof to it - every CreepJS/DataDome/Naver run
|
|
16
|
+
* sees a bot.
|
|
17
|
+
*
|
|
18
|
+
* @param fp a BrowserFingerprintWithHeaders-shaped profile
|
|
19
|
+
* @param expectedPlatform when set, profiles of any other OS are rejected
|
|
20
|
+
* outright - even a "clean" profile of the wrong OS is a non-starter
|
|
21
|
+
* when targeting a specific host.
|
|
22
|
+
* @returns a human-readable rejection reason, or null when the profile is clean
|
|
23
|
+
*/
|
|
24
|
+
export function rejectContaminatedProfile(fp, expectedPlatform) {
|
|
25
|
+
const nav = fp?.fingerprint?.navigator ?? {};
|
|
26
|
+
const ua = nav.userAgent ?? '';
|
|
27
|
+
const platform = nav.platform ?? '';
|
|
28
|
+
const hwc = nav.hardwareConcurrency ?? 0;
|
|
29
|
+
const uaData = nav.userAgentData ?? {};
|
|
30
|
+
const arch = uaData.architecture ?? '';
|
|
31
|
+
const platformVersion = uaData.platformVersion ?? '';
|
|
32
|
+
const brands = uaData.brands ?? [];
|
|
33
|
+
const fullVersionList = uaData.fullVersionList ?? [];
|
|
34
|
+
const videoCard = fp?.fingerprint?.videoCard ?? {};
|
|
35
|
+
const gpuRenderer = videoCard.renderer ?? '';
|
|
36
|
+
// Reject host-OS mismatches first - even a "clean" profile of the
|
|
37
|
+
// wrong OS is a non-starter when we're targeting a specific host.
|
|
38
|
+
if (expectedPlatform && platform && platform !== expectedPlatform) {
|
|
39
|
+
return `platform=${platform} != expected ${expectedPlatform} (host-OS pin)`;
|
|
40
|
+
}
|
|
41
|
+
// Reject non-Chrome browsers outright. The upstream pool occasionally
|
|
42
|
+
// returns a Firefox / Safari profile even when `browsers: ['chrome']` was
|
|
43
|
+
// requested (observed: "…Windows NT 10.0…Gecko/20100101 Firefox/147.0").
|
|
44
|
+
// Shipping one is fatal: setUserAgentWithMetadata cannot derive a Chrome
|
|
45
|
+
// version from it and THROWS, which aborts the ENTIRE fingerprint injection
|
|
46
|
+
// and leaks the browser's real identity. This crawler only launches Chrome,
|
|
47
|
+
// so a Firefox (real "Gecko/<8-digit build>" + "Firefox/N") or a Safari UA
|
|
48
|
+
// ("Safari/" without any "Chrome/") is contamination - reject it here so the
|
|
49
|
+
// selector re-rolls to a Chrome profile. (Chrome's own UA carries the
|
|
50
|
+
// "like Gecko" token with no slash and always includes "Chrome/N", so this
|
|
51
|
+
// never false-positives on real Chrome.)
|
|
52
|
+
const looksFirefox = /\bGecko\/\d{6,}|\bFirefox\/\d/i.test(ua);
|
|
53
|
+
const looksSafariNotChrome = /\bSafari\//i.test(ua) && !/\bChrome\/\d/.test(ua);
|
|
54
|
+
if (ua && (looksFirefox || looksSafariNotChrome)) {
|
|
55
|
+
return `UA is not Chrome (only Chrome profiles are supported): …${ua.slice(0, 60)}`;
|
|
56
|
+
}
|
|
57
|
+
if (/\b(LarkUrl|Lark\/|Feishu|newsai\/|toutiao|bytedance)\b/i.test(ua)) {
|
|
58
|
+
return `UA contains modified-Chrome marker: …${ua.slice(-60)}`;
|
|
59
|
+
}
|
|
60
|
+
if (hwc > 32) {
|
|
61
|
+
return `hardwareConcurrency=${hwc} exceeds consumer cap (server-class CPU)`;
|
|
62
|
+
}
|
|
63
|
+
// Pool occasionally returns ancient Chrome majors (108 from 2022,
|
|
64
|
+
// 128, 136…). For 2026 traffic this is implausibly old: real Chrome
|
|
65
|
+
// auto-updates and the share of >2-year-old majors is <1% in the
|
|
66
|
+
// wild. The launcher already re-stamps UA + UA-CH to the running
|
|
67
|
+
// binary version, but several profile-derived fields (Chromium
|
|
68
|
+
// version-gated feature exposure in fingerprint metadata) still
|
|
69
|
+
// reflect the source profile's vintage. Reject anything pre-140
|
|
70
|
+
// (Chrome 140 shipped 2025-08, conservative floor for "current"
|
|
71
|
+
// traffic in May 2026).
|
|
72
|
+
const chromeMajorMatch = ua.match(/Chrome\/(\d+)/);
|
|
73
|
+
const chromeMajor = chromeMajorMatch ? Number(chromeMajorMatch[1]) : 0;
|
|
74
|
+
if (chromeMajor > 0 && chromeMajor < 140) {
|
|
75
|
+
return `Chrome major ${chromeMajor} is stale (pre-140); current cutoff is 140+ for 2026 traffic`;
|
|
76
|
+
}
|
|
77
|
+
const claimsMac = /Macintosh|Mac OS X/i.test(ua);
|
|
78
|
+
// ─── UA OS token ↔ navigator.platform coherence (all platforms) ──
|
|
79
|
+
// Chrome freezes navigator.platform per-OS: Windows→"Win32",
|
|
80
|
+
// macOS→"MacIntel", Linux→"Linux <arch>". This is UA-CH-independent, so a
|
|
81
|
+
// UA OS token that disagrees with navigator.platform is a 100%-certain
|
|
82
|
+
// contradiction on EVERY OS - it catches the Windows/Linux mismatches the
|
|
83
|
+
// old Mac-only check missed (and subsumes it: a Mac UA with a non-MacIntel
|
|
84
|
+
// platform still fails here).
|
|
85
|
+
let uaOs = null;
|
|
86
|
+
if (claimsMac)
|
|
87
|
+
uaOs = 'macos';
|
|
88
|
+
else if (/Windows NT/i.test(ua))
|
|
89
|
+
uaOs = 'windows';
|
|
90
|
+
else if (/X11; Linux|Linux x86_64/i.test(ua) && !/Android|CrOS/i.test(ua))
|
|
91
|
+
uaOs = 'linux';
|
|
92
|
+
if (uaOs && platform) {
|
|
93
|
+
let platformOk;
|
|
94
|
+
if (uaOs === 'macos')
|
|
95
|
+
platformOk = platform === 'MacIntel';
|
|
96
|
+
else if (uaOs === 'windows')
|
|
97
|
+
platformOk = platform === 'Win32';
|
|
98
|
+
else
|
|
99
|
+
platformOk = /^Linux/i.test(platform);
|
|
100
|
+
if (!platformOk) {
|
|
101
|
+
return `UA claims ${uaOs} but navigator.platform=${platform} (Chrome freezes platform per-OS)`;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
if (claimsMac && hwc > 0 && hwc < 8) {
|
|
105
|
+
// Real Apple Silicon Mac cores: M1=8, M1 Pro=8/10, M1 Max=10,
|
|
106
|
+
// M2=8, M2 Pro=10/12, M3+=8/10/12/14/16. Anything <8 is either
|
|
107
|
+
// a pre-2020 MacBook Air dual-core (Chrome dropped support long
|
|
108
|
+
// ago) or a VM/sandbox-capped profile - neither is plausible
|
|
109
|
+
// for 2026 Mac traffic claiming an Apple Silicon GPU.
|
|
110
|
+
return `hardwareConcurrency=${hwc} too low for Apple Silicon Mac (real range 8-16)`;
|
|
111
|
+
}
|
|
112
|
+
if (claimsMac && /Mac OS X 10_15_[0-6](?:[^0-9]|$)/i.test(ua)) {
|
|
113
|
+
// Canonical frozen Chrome 147+ macOS UA carries "10_15_7"; any other
|
|
114
|
+
// _N value is the Lark cluster's stale stamp.
|
|
115
|
+
return `Mac UA carries non-canonical 10_15_<6 stamp (Lark cluster signature)`;
|
|
116
|
+
}
|
|
117
|
+
// UA tail: after "Safari/537.36" real Chrome is bare. Any trailing
|
|
118
|
+
// token is a third-party UA-modifier brand (LarkUrl / Edg / OPR / etc).
|
|
119
|
+
const tailMatch = ua.match(/Safari\/537\.36(.*)$/);
|
|
120
|
+
if (tailMatch && tailMatch[1].trim().length > 0) {
|
|
121
|
+
return `UA has unexpected tail after Safari/537.36: "${tailMatch[1].trim()}"`;
|
|
122
|
+
}
|
|
123
|
+
// ─── Hardware / architecture / OS-version consistency ──────────
|
|
124
|
+
// CreepJS and modern anti-bot vendors cross-check
|
|
125
|
+
// navigator.userAgentData.architecture (x86 | arm)
|
|
126
|
+
// navigator.userAgentData.platformVersion (e.g. "15.7.1")
|
|
127
|
+
// WEBGL_RENDERER ("ANGLE (Apple, Apple Mn…)" vs "ANGLE (Intel,…)")
|
|
128
|
+
// against each other. Apify pool routinely ships profiles that
|
|
129
|
+
// violate every one of these - Intel iGPU + ARM arch, Apple M4 +
|
|
130
|
+
// x86 arch, Intel Mac claiming Sequoia (15.x, Apple-Silicon-only),
|
|
131
|
+
// etc. Each is an instant detection signal.
|
|
132
|
+
const rendererIsApple = /\bAngle \(Apple|Apple M\d|Apple GPU/i.test(gpuRenderer);
|
|
133
|
+
// Match any non-Apple desktop-Mac GPU vendor string. Includes:
|
|
134
|
+
// - Modern ANGLE form: "ANGLE (Intel, …)" / "ANGLE (AMD, …)"
|
|
135
|
+
// - Parenthesised form: "Intel(R) Iris" / "Intel(R) UHD"
|
|
136
|
+
// - Bare AMD form: "AMD Radeon Pro 560"
|
|
137
|
+
// - Bare NVIDIA form: "NVIDIA GeForce GT 750M" (old Mac Pro)
|
|
138
|
+
// - Old OpenGL form: "Intel Iris OpenGL Engine" /
|
|
139
|
+
// "Intel HD Graphics OpenGL Engine"
|
|
140
|
+
// (pre-ANGLE Mac drivers; common in older
|
|
141
|
+
// pool profiles, was the regex hole that
|
|
142
|
+
// let arm-arch + Intel-GPU through)
|
|
143
|
+
const rendererIsNonAppleDesktopGpu = (/\bAngle \((Intel|AMD|NVIDIA)\b/i.test(gpuRenderer)
|
|
144
|
+
|| /\bIntel\(R\)/i.test(gpuRenderer)
|
|
145
|
+
|| /\bAMD Radeon\b/i.test(gpuRenderer)
|
|
146
|
+
|| /\bNVIDIA\b/i.test(gpuRenderer)
|
|
147
|
+
|| /\bIntel (Iris|HD|UHD|OpenGL)\b/i.test(gpuRenderer));
|
|
148
|
+
// ─── Architecture ↔ GPU renderer (physics, OS-independent) ──────
|
|
149
|
+
// Apple GPUs ship ONLY on Apple Silicon (arm); no arm consumer device ships
|
|
150
|
+
// an Intel/AMD/NVIDIA desktop GPU (arm Macs use Apple GPUs, arm Windows uses
|
|
151
|
+
// Qualcomm Adreno). These contradictions hold on any OS, so they run
|
|
152
|
+
// unconditionally - previously they were Mac-only, which let a Windows/Linux
|
|
153
|
+
// profile carrying the same arch↔GPU contradiction through.
|
|
154
|
+
if (arch === 'arm' && rendererIsNonAppleDesktopGpu) {
|
|
155
|
+
return `arch=arm contradicts non-Apple desktop GPU renderer "${gpuRenderer.slice(0, 60)}"`;
|
|
156
|
+
}
|
|
157
|
+
if (arch === 'x86' && rendererIsApple) {
|
|
158
|
+
return `arch=x86 contradicts Apple Silicon GPU renderer "${gpuRenderer.slice(0, 60)}"`;
|
|
159
|
+
}
|
|
160
|
+
// ─── macOS version ↔ architecture (Mac-specific) ───────────────
|
|
161
|
+
if (claimsMac) {
|
|
162
|
+
// platformVersion major sanity vs architecture:
|
|
163
|
+
// 26.x (Tahoe) is Apple-Silicon-only - Apple dropped Intel AFTER
|
|
164
|
+
// Sequoia, so 15.x is the LAST Intel-capable macOS (2018-2020 Intel
|
|
165
|
+
// Macs run it). The old `>= 15` cutoff false-rejected every real
|
|
166
|
+
// Intel Sequoia Mac; the true Intel cutoff is 26 (Tahoe).
|
|
167
|
+
// <11.x (pre-Big-Sur) is Intel-only - Apple Silicon launched on 11.0.
|
|
168
|
+
const pvMajor = parseInt(platformVersion.split('.')[0] ?? '0', 10);
|
|
169
|
+
if (pvMajor >= 26 && arch === 'x86') {
|
|
170
|
+
return `platformVersion=${platformVersion} (Tahoe+) requires Apple Silicon but arch=x86`;
|
|
171
|
+
}
|
|
172
|
+
if (pvMajor >= 1 && pvMajor < 11 && arch === 'arm') {
|
|
173
|
+
return `platformVersion=${platformVersion} (pre-Big-Sur) is Intel-only but arch=arm`;
|
|
174
|
+
}
|
|
175
|
+
// Same check via GPU class (defense-in-depth when arch is missing):
|
|
176
|
+
if (pvMajor >= 26 && rendererIsNonAppleDesktopGpu) {
|
|
177
|
+
return `platformVersion=${platformVersion} (Tahoe+) requires Apple Silicon but GPU is non-Apple desktop`;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
// ─── Linux platform / GPU-renderer coherence ───────────────────
|
|
181
|
+
// The sampled `linux` pool in non-apify-profiles.json is contaminated:
|
|
182
|
+
// ~6% of "Linux x86_64" profiles carry a macOS WebGL renderer
|
|
183
|
+
// ("Intel Iris OpenGL Engine", "ANGLE (Apple, …)") and others a Windows
|
|
184
|
+
// D3D11 string. navigator.platform=Linux paired with a Mac/Windows GPU is
|
|
185
|
+
// an instant cross-platform contradiction (CreepJS/Akamai/DataDome read
|
|
186
|
+
// UNMASKED_RENDERER_WEBGL against the platform). The Mac block above only
|
|
187
|
+
// fires when the UA claims Macintosh, so a Linux-UA profile with a Mac GPU
|
|
188
|
+
// slips through - reject it here so the selector re-rolls to a clean Linux
|
|
189
|
+
// profile. Valid Linux renderers: "ANGLE (Intel, Mesa …)",
|
|
190
|
+
// "ANGLE (NVIDIA Corporation, … /PCIe/SSE2 …)", "ANGLE (AMD, … radeonsi …)",
|
|
191
|
+
// The GPU-less "ANGLE (Google, Vulkan … SwiftShader …)" software fallback
|
|
192
|
+
// is NOT valid for our purposes - it is a datacenter tell and is rejected
|
|
193
|
+
// unconditionally by the SwiftShader gate further below.
|
|
194
|
+
const claimsLinux = /X11; Linux|Linux x86_64/i.test(ua) || platform === 'Linux x86_64';
|
|
195
|
+
if (claimsLinux && gpuRenderer) {
|
|
196
|
+
if (/ANGLE \(Apple|Apple M\d|Apple GPU|Metal Renderer|Iris OpenGL Engine|HD Graphics OpenGL Engine/i.test(gpuRenderer)) {
|
|
197
|
+
return `platform=Linux but GPU renderer is macOS "${gpuRenderer.slice(0, 60)}"`;
|
|
198
|
+
}
|
|
199
|
+
if (/Direct3D|D3D11|vs_5_0|ps_5_0/i.test(gpuRenderer)) {
|
|
200
|
+
return `platform=Linux but GPU renderer is Windows D3D "${gpuRenderer.slice(0, 60)}"`;
|
|
201
|
+
}
|
|
202
|
+
// ARM SoC / single-board-computer GPUs (Raspberry Pi Broadcom V3D,
|
|
203
|
+
// ARM Mali, Qualcomm Adreno, Imagination PowerVR, Vivante) physically
|
|
204
|
+
// cannot appear on an x86_64 desktop. The pool is platform-strict
|
|
205
|
+
// Linux x86_64, so any of these is a cross-arch contradiction
|
|
206
|
+
// (vendor "ARM"/"Broadcom" + Linux x86_64) - an instant tell.
|
|
207
|
+
if (/\b(Mali|Adreno|PowerVR|Vivante|VideoCore)\b|Broadcom|\bV3D\b/i.test(gpuRenderer)) {
|
|
208
|
+
return `platform=Linux x86_64 but GPU renderer is ARM/embedded "${gpuRenderer.slice(0, 60)}"`;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
// ─── Windows platform / GPU-renderer coherence ─────────────────
|
|
212
|
+
// Symmetric to the Linux block above. Real Windows Chrome reports a D3D11
|
|
213
|
+
// ANGLE renderer ("ANGLE (NVIDIA, … Direct3D11 …)"). A Windows platform
|
|
214
|
+
// paired with a macOS Metal/Apple GPU or a Linux Mesa renderer is a
|
|
215
|
+
// cross-platform contradiction read straight off UNMASKED_RENDERER_WEBGL.
|
|
216
|
+
// The Mac/Linux blocks only fire on their own UA, so a Windows profile
|
|
217
|
+
// carrying a foreign GPU slipped through before. (Linux markers are
|
|
218
|
+
// Mesa/llvmpipe/radeonsi + the Linux ANGLE tails "NVIDIA Corporation" /
|
|
219
|
+
// "/PCIe/" / "/SSE2"; Windows ANGLE strings carry none of these.)
|
|
220
|
+
const claimsWindows = /Windows NT/i.test(ua) || platform === 'Win32';
|
|
221
|
+
if (claimsWindows && gpuRenderer) {
|
|
222
|
+
if (/ANGLE \(Apple|Apple M\d|Apple GPU|Metal Renderer|Iris OpenGL Engine|HD Graphics OpenGL Engine/i.test(gpuRenderer)) {
|
|
223
|
+
return `platform=Windows but GPU renderer is macOS "${gpuRenderer.slice(0, 60)}"`;
|
|
224
|
+
}
|
|
225
|
+
if (/\bMesa\b|llvmpipe|radeonsi|NVIDIA Corporation|\/PCIe\/|\/SSE2\b/i.test(gpuRenderer)) {
|
|
226
|
+
return `platform=Windows but GPU renderer is Linux "${gpuRenderer.slice(0, 60)}"`;
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
// ─── Brand cohort consistency ──────────────────────────────────
|
|
230
|
+
// userAgentData.brands should carry only Chrome / Chromium / GREASE
|
|
231
|
+
// when we are launching a Chrome binary. Apify pool mixes in Brave/
|
|
232
|
+
// Edge/Opera/Yandex profiles whose brand entries advertise those
|
|
233
|
+
// browsers directly - CreepJS reads them via getHighEntropyValues
|
|
234
|
+
// and a Chrome UA paired with a Brave brand entry is an instant
|
|
235
|
+
// contradiction.
|
|
236
|
+
const ALLOWED_BRANDS = /^(Google Chrome|Chromium)$/;
|
|
237
|
+
const offending = brands.find(b => b?.brand && !isGreaseBrand(b.brand) && !ALLOWED_BRANDS.test(b.brand));
|
|
238
|
+
if (offending) {
|
|
239
|
+
return `userAgentData.brands includes non-Chrome derivative "${offending.brand}"`;
|
|
240
|
+
}
|
|
241
|
+
// …and the same check on the profile's `sec-ch-ua` HEADER, which is a
|
|
242
|
+
// SEPARATE field the JS-side check above never saw. 44 of the 200 bundled
|
|
243
|
+
// non-Apify rows advertise "Brave" in the header while their
|
|
244
|
+
// userAgentData.brands says Google Chrome - a page announcing Brave on the
|
|
245
|
+
// wire and Chrome in JS is a harder contradiction than the GREASE mismatch
|
|
246
|
+
// that started issue #131.
|
|
247
|
+
const secChUaHeader = Object.entries(fp?.headers ?? {})
|
|
248
|
+
.find(([k]) => k.toLowerCase() === 'sec-ch-ua')?.[1];
|
|
249
|
+
if (secChUaHeader) {
|
|
250
|
+
const headerBrands = [...secChUaHeader.matchAll(/"([^"]+)";\s*v="([^"]+)"/g)]
|
|
251
|
+
.map(m => ({ brand: m[1], version: m[2] }));
|
|
252
|
+
const offendingHeader = headerBrands.find(b => !isGreaseBrand(b.brand) && !ALLOWED_BRANDS.test(b.brand));
|
|
253
|
+
if (offendingHeader) {
|
|
254
|
+
return `sec-ch-ua header advertises non-Chrome derivative "${offendingHeader.brand}"`;
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
// GREASE ↔ major coherence. Chromium derives the GREASE token from the
|
|
258
|
+
// major (`ua-ch-brands.ts`), so a real Chrome profile always agrees with the
|
|
259
|
+
// derivation - a disagreement means the brand list was synthesized, or
|
|
260
|
+
// re-stamped by something that did not know the rule (older versions of
|
|
261
|
+
// this crawler did exactly that, which is issue #131: a 134-era GREASE on a
|
|
262
|
+
// 147 UA, refused by Naver with a challenge-free 418). Measured cost: 0 of
|
|
263
|
+
// 224 upstream-pool profiles with brands fail this, and 5 of 197 bundled
|
|
264
|
+
// non-Apify rows do - i.e. it rejects only fabricated lists, so the
|
|
265
|
+
// re-roll budget is unaffected.
|
|
266
|
+
const greaseIncoherence = describeGreaseIncoherence(brands);
|
|
267
|
+
if (greaseIncoherence) {
|
|
268
|
+
return greaseIncoherence;
|
|
269
|
+
}
|
|
270
|
+
// UA-CH full-version list must carry a REAL build number for the real
|
|
271
|
+
// brands. UA Reduction (Chrome 107+) freezes MAJOR.0.0.0 in the User-Agent
|
|
272
|
+
// STRING only; `sec-ch-ua-full-version-list` keeps the build
|
|
273
|
+
// ("147.0.7727.15"), so a profile whose list says "147.0.0.0" is unusable on
|
|
274
|
+
// any origin that requests high-entropy hints - measured on Naver: reduced
|
|
275
|
+
// shape 418, real build 200 (issue #131). Real pool profiles never do this
|
|
276
|
+
// (0 of 208 Chrome-cohort draws), so this only catches fabricated lists.
|
|
277
|
+
const reducedFullVersion = fullVersionList.find(b => b?.brand && !isGreaseBrand(b.brand) && /^\d+\.0\.0\.0$/.test(b.version ?? ''));
|
|
278
|
+
if (reducedFullVersion) {
|
|
279
|
+
return `userAgentData.fullVersionList carries the UA-reduced shape "${reducedFullVersion.brand}";v="${reducedFullVersion.version}"`
|
|
280
|
+
+ ` (UA-CH must report the real build, e.g. 147.0.7727.15)`;
|
|
281
|
+
}
|
|
282
|
+
// Prefer profiles whose brands include "Google Chrome" - pool also
|
|
283
|
+
// returns Chromium-only profiles (no Google Chrome entry) which a
|
|
284
|
+
// CreepJS / FingerprintJS check via getHighEntropyValues against the
|
|
285
|
+
// canonical Chrome brand list would flag as "Chromium-based but not
|
|
286
|
+
// Chrome". Real Chrome's brand list always contains "Google Chrome".
|
|
287
|
+
const hasGoogleChrome = brands.some(b => b?.brand === 'Google Chrome');
|
|
288
|
+
if (brands.length > 0 && !hasGoogleChrome) {
|
|
289
|
+
return `userAgentData.brands lacks "Google Chrome" entry (Chromium-branded profile)`;
|
|
290
|
+
}
|
|
291
|
+
// ─── GPU renderer must be the detailed-ANGLE form, not SwiftShader ──
|
|
292
|
+
// ~29% of upstream Mac and ~51% of upstream Linux profiles carry the
|
|
293
|
+
// SwiftShader software-renderer signature:
|
|
294
|
+
// "ANGLE (Google, Vulkan 1.3.0 (SwiftShader Device (Subzero) …))"
|
|
295
|
+
// No real consumer machine running real Chrome reports this - SwiftShader
|
|
296
|
+
// is Chrome's last-resort software fallback used only when no GPU is
|
|
297
|
+
// available, e.g. inside Docker containers with no /dev/dri or on headless
|
|
298
|
+
// test runners. Shipping a SwiftShader renderer with ANY desktop UA is an
|
|
299
|
+
// instant "this is a sandboxed/datacenter browser" signal that Akamai /
|
|
300
|
+
// CreepJS / DataDome read straight off UNMASKED_RENDERER_WEBGL - and the
|
|
301
|
+
// C++ WebGL emulation faithfully spoofs *to* it, so forceEmulateWebgl does
|
|
302
|
+
// not save us. Reject on EVERY platform: the previous Mac-only gate let
|
|
303
|
+
// half of the Linux pool ship a software renderer (see the Akamai/Lowes
|
|
304
|
+
// intermittent-block investigation).
|
|
305
|
+
if (/SwiftShader|llvmpipe|Mesa Offscreen/i.test(gpuRenderer)) {
|
|
306
|
+
return `videoCard.renderer is SwiftShader/software (datacenter tell on any OS)`;
|
|
307
|
+
}
|
|
308
|
+
return null;
|
|
309
|
+
}
|
|
310
|
+
//# sourceMappingURL=profile-quality.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profile-quality.js","sourceRoot":"","sources":["../../src/fingerprinting/profile-quality.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,yBAAyB,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAE7E;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,UAAU,yBAAyB,CACrC,EAAO,EACP,gBAA0C;IAE1C,MAAM,GAAG,GAAG,EAAE,EAAE,WAAW,EAAE,SAAS,IAAI,EAAE,CAAC;IAC7C,MAAM,EAAE,GAAW,GAAG,CAAC,SAAS,IAAI,EAAE,CAAC;IACvC,MAAM,QAAQ,GAAW,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC;IAC5C,MAAM,GAAG,GAAW,GAAG,CAAC,mBAAmB,IAAI,CAAC,CAAC;IACjD,MAAM,MAAM,GAAG,GAAG,CAAC,aAAa,IAAI,EAAE,CAAC;IACvC,MAAM,IAAI,GAAW,MAAM,CAAC,YAAY,IAAI,EAAE,CAAC;IAC/C,MAAM,eAAe,GAAW,MAAM,CAAC,eAAe,IAAI,EAAE,CAAC;IAC7D,MAAM,MAAM,GAA0C,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC;IAC1E,MAAM,eAAe,GAA0C,MAAM,CAAC,eAAe,IAAI,EAAE,CAAC;IAC5F,MAAM,SAAS,GAAG,EAAE,EAAE,WAAW,EAAE,SAAS,IAAI,EAAE,CAAC;IACnD,MAAM,WAAW,GAAW,SAAS,CAAC,QAAQ,IAAI,EAAE,CAAC;IAErD,kEAAkE;IAClE,kEAAkE;IAClE,IAAI,gBAAgB,IAAI,QAAQ,IAAI,QAAQ,KAAK,gBAAgB,EAAE,CAAC;QAChE,OAAO,YAAY,QAAQ,gBAAgB,gBAAgB,gBAAgB,CAAC;IAChF,CAAC;IAED,sEAAsE;IACtE,0EAA0E;IAC1E,yEAAyE;IACzE,yEAAyE;IACzE,4EAA4E;IAC5E,4EAA4E;IAC5E,2EAA2E;IAC3E,6EAA6E;IAC7E,sEAAsE;IACtE,2EAA2E;IAC3E,yCAAyC;IACzC,MAAM,YAAY,GAAG,gCAAgC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC/D,MAAM,oBAAoB,GAAG,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAChF,IAAI,EAAE,IAAI,CAAC,YAAY,IAAI,oBAAoB,CAAC,EAAE,CAAC;QAC/C,OAAO,2DAA2D,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;IACxF,CAAC;IAED,IAAI,yDAAyD,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;QACrE,OAAO,wCAAwC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IACnE,CAAC;IACD,IAAI,GAAG,GAAG,EAAE,EAAE,CAAC;QACX,OAAO,uBAAuB,GAAG,0CAA0C,CAAC;IAChF,CAAC;IACD,kEAAkE;IAClE,oEAAoE;IACpE,iEAAiE;IACjE,iEAAiE;IACjE,+DAA+D;IAC/D,gEAAgE;IAChE,gEAAgE;IAChE,gEAAgE;IAChE,wBAAwB;IACxB,MAAM,gBAAgB,GAAG,EAAE,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;IACnD,MAAM,WAAW,GAAG,gBAAgB,CAAC,CAAC,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACvE,IAAI,WAAW,GAAG,CAAC,IAAI,WAAW,GAAG,GAAG,EAAE,CAAC;QACvC,OAAO,gBAAgB,WAAW,8DAA8D,CAAC;IACrG,CAAC;IACD,MAAM,SAAS,GAAG,qBAAqB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEjD,oEAAoE;IACpE,6DAA6D;IAC7D,0EAA0E;IAC1E,uEAAuE;IACvE,0EAA0E;IAC1E,2EAA2E;IAC3E,8BAA8B;IAC9B,IAAI,IAAI,GAAyC,IAAI,CAAC;IACtD,IAAI,SAAS;QAAE,IAAI,GAAG,OAAO,CAAC;SACzB,IAAI,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;QAAE,IAAI,GAAG,SAAS,CAAC;SAC7C,IAAI,0BAA0B,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC;QAAE,IAAI,GAAG,OAAO,CAAC;IAC1F,IAAI,IAAI,IAAI,QAAQ,EAAE,CAAC;QACnB,IAAI,UAAmB,CAAC;QACxB,IAAI,IAAI,KAAK,OAAO;YAAE,UAAU,GAAG,QAAQ,KAAK,UAAU,CAAC;aACtD,IAAI,IAAI,KAAK,SAAS;YAAE,UAAU,GAAG,QAAQ,KAAK,OAAO,CAAC;;YAC1D,UAAU,GAAG,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC3C,IAAI,CAAC,UAAU,EAAE,CAAC;YACd,OAAO,aAAa,IAAI,2BAA2B,QAAQ,mCAAmC,CAAC;QACnG,CAAC;IACL,CAAC;IACD,IAAI,SAAS,IAAI,GAAG,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC;QAClC,8DAA8D;QAC9D,+DAA+D;QAC/D,gEAAgE;QAChE,6DAA6D;QAC7D,sDAAsD;QACtD,OAAO,uBAAuB,GAAG,kDAAkD,CAAC;IACxF,CAAC;IACD,IAAI,SAAS,IAAI,mCAAmC,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;QAC5D,qEAAqE;QACrE,8CAA8C;QAC9C,OAAO,sEAAsE,CAAC;IAClF,CAAC;IACD,mEAAmE;IACnE,wEAAwE;IACxE,MAAM,SAAS,GAAG,EAAE,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;IACnD,IAAI,SAAS,IAAI,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9C,OAAO,gDAAgD,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC;IAClF,CAAC;IAED,kEAAkE;IAClE,kDAAkD;IAClD,sDAAsD;IACtD,6DAA6D;IAC7D,sEAAsE;IACtE,+DAA+D;IAC/D,iEAAiE;IACjE,mEAAmE;IACnE,4CAA4C;IAC5C,MAAM,eAAe,GAAG,sCAAsC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACjF,+DAA+D;IAC/D,kEAAkE;IAClE,6DAA6D;IAC7D,+CAA+C;IAC/C,kEAAkE;IAClE,wDAAwD;IACxD,6DAA6D;IAC7D,mEAAmE;IACnE,kEAAkE;IAClE,6DAA6D;IAC7D,MAAM,4BAA4B,GAAG,CACjC,iCAAiC,CAAC,IAAI,CAAC,WAAW,CAAC;WAChD,eAAe,CAAC,IAAI,CAAC,WAAW,CAAC;WACjC,iBAAiB,CAAC,IAAI,CAAC,WAAW,CAAC;WACnC,aAAa,CAAC,IAAI,CAAC,WAAW,CAAC;WAC/B,iCAAiC,CAAC,IAAI,CAAC,WAAW,CAAC,CACzD,CAAC;IAEF,mEAAmE;IACnE,4EAA4E;IAC5E,6EAA6E;IAC7E,qEAAqE;IACrE,6EAA6E;IAC7E,4DAA4D;IAC5D,IAAI,IAAI,KAAK,KAAK,IAAI,4BAA4B,EAAE,CAAC;QACjD,OAAO,wDAAwD,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC;IAC/F,CAAC;IACD,IAAI,IAAI,KAAK,KAAK,IAAI,eAAe,EAAE,CAAC;QACpC,OAAO,oDAAoD,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC;IAC3F,CAAC;IAED,kEAAkE;IAClE,IAAI,SAAS,EAAE,CAAC;QACZ,gDAAgD;QAChD,mEAAmE;QACnE,wEAAwE;QACxE,qEAAqE;QACrE,8DAA8D;QAC9D,wEAAwE;QACxE,MAAM,OAAO,GAAG,QAAQ,CAAC,eAAe,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,EAAE,CAAC,CAAC;QACnE,IAAI,OAAO,IAAI,EAAE,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;YAClC,OAAO,mBAAmB,eAAe,+CAA+C,CAAC;QAC7F,CAAC;QACD,IAAI,OAAO,IAAI,CAAC,IAAI,OAAO,GAAG,EAAE,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;YACjD,OAAO,mBAAmB,eAAe,2CAA2C,CAAC;QACzF,CAAC;QACD,oEAAoE;QACpE,IAAI,OAAO,IAAI,EAAE,IAAI,4BAA4B,EAAE,CAAC;YAChD,OAAO,mBAAmB,eAAe,+DAA+D,CAAC;QAC7G,CAAC;IACL,CAAC;IAED,kEAAkE;IAClE,uEAAuE;IACvE,8DAA8D;IAC9D,wEAAwE;IACxE,0EAA0E;IAC1E,wEAAwE;IACxE,0EAA0E;IAC1E,2EAA2E;IAC3E,2EAA2E;IAC3E,2DAA2D;IAC3D,6EAA6E;IAC7E,0EAA0E;IAC1E,0EAA0E;IAC1E,yDAAyD;IACzD,MAAM,WAAW,GAAG,0BAA0B,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,QAAQ,KAAK,cAAc,CAAC;IACvF,IAAI,WAAW,IAAI,WAAW,EAAE,CAAC;QAC7B,IAAI,gGAAgG,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;YACrH,OAAO,6CAA6C,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC;QACpF,CAAC;QACD,IAAI,+BAA+B,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;YACpD,OAAO,mDAAmD,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC;QAC1F,CAAC;QACD,mEAAmE;QACnE,sEAAsE;QACtE,kEAAkE;QAClE,8DAA8D;QAC9D,8DAA8D;QAC9D,IAAI,+DAA+D,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;YACpF,OAAO,2DAA2D,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC;QAClG,CAAC;IACL,CAAC;IAED,kEAAkE;IAClE,0EAA0E;IAC1E,wEAAwE;IACxE,oEAAoE;IACpE,0EAA0E;IAC1E,uEAAuE;IACvE,oEAAoE;IACpE,wEAAwE;IACxE,kEAAkE;IAClE,MAAM,aAAa,GAAG,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,QAAQ,KAAK,OAAO,CAAC;IACrE,IAAI,aAAa,IAAI,WAAW,EAAE,CAAC;QAC/B,IAAI,gGAAgG,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;YACrH,OAAO,+CAA+C,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC;QACtF,CAAC;QACD,IAAI,kEAAkE,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;YACvF,OAAO,+CAA+C,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC;QACtF,CAAC;IACL,CAAC;IAED,kEAAkE;IAClE,oEAAoE;IACpE,oEAAoE;IACpE,iEAAiE;IACjE,kEAAkE;IAClE,gEAAgE;IAChE,iBAAiB;IACjB,MAAM,cAAc,GAAG,4BAA4B,CAAC;IACpD,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAC9B,CAAC,EAAE,KAAK,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CACvE,CAAC;IACF,IAAI,SAAS,EAAE,CAAC;QACZ,OAAO,wDAAwD,SAAS,CAAC,KAAK,GAAG,CAAC;IACtF,CAAC;IACD,sEAAsE;IACtE,0EAA0E;IAC1E,6DAA6D;IAC7D,2EAA2E;IAC3E,2EAA2E;IAC3E,2BAA2B;IAC3B,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,IAAI,EAAE,CAAC;SAClD,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,KAAK,WAAW,CAAC,EAAE,CAAC,CAAC,CAAuB,CAAC;IAC/E,IAAI,aAAa,EAAE,CAAC;QAChB,MAAM,YAAY,GAAG,CAAC,GAAG,aAAa,CAAC,QAAQ,CAAC,2BAA2B,CAAC,CAAC;aACxE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAChD,MAAM,eAAe,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAC1C,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAC3D,CAAC;QACF,IAAI,eAAe,EAAE,CAAC;YAClB,OAAO,sDAAsD,eAAe,CAAC,KAAK,GAAG,CAAC;QAC1F,CAAC;IACL,CAAC;IACD,uEAAuE;IACvE,6EAA6E;IAC7E,uEAAuE;IACvE,wEAAwE;IACxE,4EAA4E;IAC5E,2EAA2E;IAC3E,yEAAyE;IACzE,oEAAoE;IACpE,gCAAgC;IAChC,MAAM,iBAAiB,GAAG,yBAAyB,CAC/C,MAA8C,CACjD,CAAC;IACF,IAAI,iBAAiB,EAAE,CAAC;QACpB,OAAO,iBAAiB,CAAC;IAC7B,CAAC;IACD,sEAAsE;IACtE,2EAA2E;IAC3E,6DAA6D;IAC7D,6EAA6E;IAC7E,2EAA2E;IAC3E,2EAA2E;IAC3E,yEAAyE;IACzE,MAAM,kBAAkB,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAChD,CAAC,EAAE,KAAK,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC,CAChF,CAAC;IACF,IAAI,kBAAkB,EAAE,CAAC;QACrB,OAAO,+DAA+D,kBAAkB,CAAC,KAAK,QAAQ,kBAAkB,CAAC,OAAO,GAAG;cAC7H,yDAAyD,CAAC;IACpE,CAAC;IACD,mEAAmE;IACnE,kEAAkE;IAClE,qEAAqE;IACrE,oEAAoE;IACpE,qEAAqE;IACrE,MAAM,eAAe,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,KAAK,eAAe,CAAC,CAAC;IACvE,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;QACxC,OAAO,6EAA6E,CAAC;IACzF,CAAC;IAED,uEAAuE;IACvE,qEAAqE;IACrE,2CAA2C;IAC3C,oEAAoE;IACpE,0EAA0E;IAC1E,qEAAqE;IACrE,2EAA2E;IAC3E,0EAA0E;IAC1E,wEAAwE;IACxE,yEAAyE;IACzE,2EAA2E;IAC3E,wEAAwE;IACxE,wEAAwE;IACxE,qCAAqC;IACrC,IAAI,sCAAsC,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;QAC3D,OAAO,wEAAwE,CAAC;IACpF,CAAC;IAED,OAAO,IAAI,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { type NavigatorPlatform, type OsHint } from '../session-profile.js';
|
|
2
|
+
/**
|
|
3
|
+
* FingerprintProfileSelector - the single home for "pick a clean fingerprint
|
|
4
|
+
* profile for the expected OS".
|
|
5
|
+
*
|
|
6
|
+
* Both launch paths consume it:
|
|
7
|
+
* - browser-plugin._prepareNativeFingerprintConfig (native pre-launch, before
|
|
8
|
+
* the C++ fingerprint config is written)
|
|
9
|
+
* - browser-controller._maybeOverrideFingerprint (post-launch, system-Chrome
|
|
10
|
+
* fallback where the pre-launch C++ config write was skipped)
|
|
11
|
+
*
|
|
12
|
+
* Selection happens exactly once per launch: the caller stamps the returned
|
|
13
|
+
* {@link SelectedProfile} onto the launch context under
|
|
14
|
+
* {@link PROFILE_SELECTION_KEY}, and the post-launch path reuses it instead of
|
|
15
|
+
* re-drawing. Without the marker, the controller's deterministic seeded
|
|
16
|
+
* re-draw used to resurrect the exact contaminated profile the plugin's
|
|
17
|
+
* re-roll loop had just escaped.
|
|
18
|
+
*/
|
|
19
|
+
/** Structural shape of `BrowserFingerprintWithHeaders` - kept loose on purpose. */
|
|
20
|
+
export interface FingerprintLike {
|
|
21
|
+
headers?: Record<string, string>;
|
|
22
|
+
fingerprint?: Record<string, unknown>;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* The narrow seam the selector draws profiles through. Production adapter:
|
|
26
|
+
* {@link defaultProfilePoolPort} (wraps `generateNonApifyFingerprint` and
|
|
27
|
+
* `FingerprintGenerator`). Tests script contaminated→clean sequences.
|
|
28
|
+
*/
|
|
29
|
+
export interface ProfilePoolPort {
|
|
30
|
+
/** One draw from the non-Apify real-device pool. Deterministic per seed. */
|
|
31
|
+
drawNonApify(opts: {
|
|
32
|
+
platform: NavigatorPlatform | undefined;
|
|
33
|
+
os: OsHint;
|
|
34
|
+
proxySeedKey: string | null;
|
|
35
|
+
}): Promise<FingerprintLike>;
|
|
36
|
+
/** A re-roll generator over the Apify synthetic pool, honouring genOpts constraints. */
|
|
37
|
+
createApifyReroller(genOpts: Record<string, unknown>): {
|
|
38
|
+
getFingerprint: () => unknown | Promise<unknown>;
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
export declare const defaultProfilePoolPort: ProfilePoolPort;
|
|
42
|
+
export interface ProfileSelectionInput {
|
|
43
|
+
/** The fingerprint Crawlee already generated (`launchContext.fingerprint`), if any. */
|
|
44
|
+
currentFingerprint?: FingerprintLike;
|
|
45
|
+
/** `launchOptions.fingerprintOptions` - consulted for `useNonApifyFingerprints`, `platform`, `seedKey`. */
|
|
46
|
+
fingerprintOptions?: Record<string, unknown>;
|
|
47
|
+
/** `launchOptions.fingerprintGeneratorOptions` - consulted for `operatingSystems` + re-roll constraints. */
|
|
48
|
+
fingerprintGeneratorOptions?: {
|
|
49
|
+
operatingSystems?: string[];
|
|
50
|
+
} & Record<string, unknown>;
|
|
51
|
+
proxyUrl?: string | null;
|
|
52
|
+
/**
|
|
53
|
+
* A caller-threaded fingerprint generator (preserves caller-side generator
|
|
54
|
+
* options); preferred over `port.createApifyReroller` when present.
|
|
55
|
+
*/
|
|
56
|
+
externalGenerator?: {
|
|
57
|
+
getFingerprint: () => unknown | Promise<unknown>;
|
|
58
|
+
} | null;
|
|
59
|
+
/**
|
|
60
|
+
* Host platform for the final OS-hint fallback. Threaded through to
|
|
61
|
+
* `resolveOsHint` so selection is deterministic in tests instead of
|
|
62
|
+
* depending on the runner's `process.platform`. Defaults to
|
|
63
|
+
* `process.platform` inside `resolveOsHint` when omitted.
|
|
64
|
+
*/
|
|
65
|
+
hostPlatform?: NodeJS.Platform;
|
|
66
|
+
}
|
|
67
|
+
export interface SelectedProfile {
|
|
68
|
+
fingerprint: FingerprintLike | undefined;
|
|
69
|
+
seedKey: string | null;
|
|
70
|
+
expectedOs: OsHint | null;
|
|
71
|
+
expectedPlatform: NavigatorPlatform | null;
|
|
72
|
+
/** Number of pool re-draws performed to escape contamination. */
|
|
73
|
+
rerolls: number;
|
|
74
|
+
/** Non-null = still contaminated after the attempt cap; the last draw is shipped anyway. */
|
|
75
|
+
rejection: string | null;
|
|
76
|
+
/** True when `fingerprint` differs from `currentFingerprint` - caller must write it back. */
|
|
77
|
+
replaced: boolean;
|
|
78
|
+
/** True when the non-Apify real-device pool was used. */
|
|
79
|
+
usedNonApifyPool: boolean;
|
|
80
|
+
}
|
|
81
|
+
/** Key under which callers stamp the selection result onto the launch context. */
|
|
82
|
+
export declare const PROFILE_SELECTION_KEY = "profileSelection";
|
|
83
|
+
/**
|
|
84
|
+
* Pick a clean fingerprint profile for the expected OS.
|
|
85
|
+
*
|
|
86
|
+
* Owns the whole selection protocol: seed-key resolution, OS-pin validation,
|
|
87
|
+
* os-hint expectation, pool choice (Apify synthetic vs non-Apify real-device),
|
|
88
|
+
* and the contamination re-roll loop gated by `rejectContaminatedProfile`.
|
|
89
|
+
*
|
|
90
|
+
* The pool-contamination background: the upstream fingerprint-generator
|
|
91
|
+
* dataset contains a recurring fraction of profiles from Lark/Feishu
|
|
92
|
+
* (ByteDance) modified Chrome installs - see `profile-quality.ts` for the
|
|
93
|
+
* telltales. A contaminated profile flows verbatim into FingerprintConfig and
|
|
94
|
+
* the C++ source-tree overrides dutifully spoof to it, so every
|
|
95
|
+
* CreepJS/DataDome/Naver run sees a bot. We re-roll until clean, capped.
|
|
96
|
+
*
|
|
97
|
+
* When `operatingSystems[0]` and the deprecated `fingerprintOptions.platform`
|
|
98
|
+
* contradict each other, `operatingSystems` wins and a warning is logged (see
|
|
99
|
+
* `describeOsConflict`) - the conflict is no longer fatal (issue #80).
|
|
100
|
+
*/
|
|
101
|
+
export declare function selectFingerprintProfile(input: ProfileSelectionInput, port?: ProfilePoolPort): Promise<SelectedProfile>;
|
|
102
|
+
//# sourceMappingURL=profile-selector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profile-selector.d.ts","sourceRoot":"","sources":["../../src/fingerprinting/profile-selector.ts"],"names":[],"mappings":"AAMA,OAAO,EAIH,KAAK,iBAAiB,EACtB,KAAK,MAAM,EACd,MAAM,uBAAuB,CAAC;AAE/B;;;;;;;;;;;;;;;;GAgBG;AAEH,mFAAmF;AACnF,MAAM,WAAW,eAAe;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACzC;AAED;;;;GAIG;AACH,MAAM,WAAW,eAAe;IAC5B,4EAA4E;IAC5E,YAAY,CAAC,IAAI,EAAE;QACf,QAAQ,EAAE,iBAAiB,GAAG,SAAS,CAAC;QACxC,EAAE,EAAE,MAAM,CAAC;QACX,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;KAC/B,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IAC7B,wFAAwF;IACxF,mBAAmB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;QACnD,cAAc,EAAE,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;KACpD,CAAC;CACL;AAED,eAAO,MAAM,sBAAsB,EAAE,eAGpC,CAAC;AAEF,MAAM,WAAW,qBAAqB;IAClC,uFAAuF;IACvF,kBAAkB,CAAC,EAAE,eAAe,CAAC;IACrC,2GAA2G;IAC3G,kBAAkB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC7C,4GAA4G;IAC5G,2BAA2B,CAAC,EAAE;QAAE,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxF,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB;;;OAGG;IACH,iBAAiB,CAAC,EAAE;QAAE,cAAc,EAAE,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;KAAE,GAAG,IAAI,CAAC;IAChF;;;;;OAKG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC;CAClC;AAED,MAAM,WAAW,eAAe;IAC5B,WAAW,EAAE,eAAe,GAAG,SAAS,CAAC;IACzC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,gBAAgB,EAAE,iBAAiB,GAAG,IAAI,CAAC;IAC3C,iEAAiE;IACjE,OAAO,EAAE,MAAM,CAAC;IAChB,4FAA4F;IAC5F,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,6FAA6F;IAC7F,QAAQ,EAAE,OAAO,CAAC;IAClB,yDAAyD;IACzD,gBAAgB,EAAE,OAAO,CAAC;CAC7B;AAED,kFAAkF;AAClF,eAAO,MAAM,qBAAqB,qBAAqB,CAAC;AAQxD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,wBAAwB,CAC1C,KAAK,EAAE,qBAAqB,EAC5B,IAAI,GAAE,eAAwC,GAC/C,OAAO,CAAC,eAAe,CAAC,CAuI1B"}
|