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.
Files changed (450) hide show
  1. package/README.md +1 -607
  2. package/browser/fonts/macos-bundle/41-macos-remaining.conf +157 -0
  3. package/browser/fonts/macos-bundle/README.md +24 -0
  4. package/browser/fonts/macos-bundle/build-metric-fonts.py +1010 -0
  5. package/browser/fonts/macos-bundle/generated/AmericanTypewriter-Bold.ttf +0 -0
  6. package/browser/fonts/macos-bundle/generated/AmericanTypewriter-Regular.ttf +0 -0
  7. package/browser/fonts/macos-bundle/generated/AndaleMono-Bold.ttf +0 -0
  8. package/browser/fonts/macos-bundle/generated/AndaleMono-BoldItalic.ttf +0 -0
  9. package/browser/fonts/macos-bundle/generated/AndaleMono-Italic.ttf +0 -0
  10. package/browser/fonts/macos-bundle/generated/AndaleMono-Regular.ttf +0 -0
  11. package/browser/fonts/macos-bundle/generated/AppleChancery-Bold.ttf +0 -0
  12. package/browser/fonts/macos-bundle/generated/AppleChancery-BoldItalic.ttf +0 -0
  13. package/browser/fonts/macos-bundle/generated/AppleChancery-Italic.ttf +0 -0
  14. package/browser/fonts/macos-bundle/generated/AppleChancery-Regular.ttf +0 -0
  15. package/browser/fonts/macos-bundle/generated/Arial-Bold.ttf +0 -0
  16. package/browser/fonts/macos-bundle/generated/Arial-BoldItalic.ttf +0 -0
  17. package/browser/fonts/macos-bundle/generated/Arial-Italic.ttf +0 -0
  18. package/browser/fonts/macos-bundle/generated/Arial-Regular.ttf +0 -0
  19. package/browser/fonts/macos-bundle/generated/ArialBlack-Bold.ttf +0 -0
  20. package/browser/fonts/macos-bundle/generated/ArialBlack-BoldItalic.ttf +0 -0
  21. package/browser/fonts/macos-bundle/generated/ArialBlack-Italic.ttf +0 -0
  22. package/browser/fonts/macos-bundle/generated/ArialBlack-Regular.ttf +0 -0
  23. package/browser/fonts/macos-bundle/generated/ArialNarrow-Bold.ttf +0 -0
  24. package/browser/fonts/macos-bundle/generated/ArialNarrow-BoldItalic.ttf +0 -0
  25. package/browser/fonts/macos-bundle/generated/ArialNarrow-Italic.ttf +0 -0
  26. package/browser/fonts/macos-bundle/generated/ArialNarrow-Regular.ttf +0 -0
  27. package/browser/fonts/macos-bundle/generated/Avenir-Bold.ttf +0 -0
  28. package/browser/fonts/macos-bundle/generated/Avenir-BoldItalic.ttf +0 -0
  29. package/browser/fonts/macos-bundle/generated/Avenir-Italic.ttf +0 -0
  30. package/browser/fonts/macos-bundle/generated/Avenir-Regular.ttf +0 -0
  31. package/browser/fonts/macos-bundle/generated/AvenirNext-Bold.ttf +0 -0
  32. package/browser/fonts/macos-bundle/generated/AvenirNext-BoldItalic.ttf +0 -0
  33. package/browser/fonts/macos-bundle/generated/AvenirNext-Italic.ttf +0 -0
  34. package/browser/fonts/macos-bundle/generated/AvenirNext-Regular.ttf +0 -0
  35. package/browser/fonts/macos-bundle/generated/AvenirNextCondensed-Bold.ttf +0 -0
  36. package/browser/fonts/macos-bundle/generated/AvenirNextCondensed-BoldItalic.ttf +0 -0
  37. package/browser/fonts/macos-bundle/generated/AvenirNextCondensed-Italic.ttf +0 -0
  38. package/browser/fonts/macos-bundle/generated/AvenirNextCondensed-Regular.ttf +0 -0
  39. package/browser/fonts/macos-bundle/generated/Baskerville-Bold.ttf +0 -0
  40. package/browser/fonts/macos-bundle/generated/Baskerville-BoldItalic.ttf +0 -0
  41. package/browser/fonts/macos-bundle/generated/Baskerville-Italic.ttf +0 -0
  42. package/browser/fonts/macos-bundle/generated/Baskerville-Regular.ttf +0 -0
  43. package/browser/fonts/macos-bundle/generated/BigCaslon-Bold.ttf +0 -0
  44. package/browser/fonts/macos-bundle/generated/BigCaslon-BoldItalic.ttf +0 -0
  45. package/browser/fonts/macos-bundle/generated/BigCaslon-Italic.ttf +0 -0
  46. package/browser/fonts/macos-bundle/generated/BigCaslon-Regular.ttf +0 -0
  47. package/browser/fonts/macos-bundle/generated/BlinkMacSystemFont-Bold.ttf +0 -0
  48. package/browser/fonts/macos-bundle/generated/BlinkMacSystemFont-BoldItalic.ttf +0 -0
  49. package/browser/fonts/macos-bundle/generated/BlinkMacSystemFont-Italic.ttf +0 -0
  50. package/browser/fonts/macos-bundle/generated/BlinkMacSystemFont-Regular.ttf +0 -0
  51. package/browser/fonts/macos-bundle/generated/Bodoni72-Bold.ttf +0 -0
  52. package/browser/fonts/macos-bundle/generated/Bodoni72-BoldItalic.ttf +0 -0
  53. package/browser/fonts/macos-bundle/generated/Bodoni72-Italic.ttf +0 -0
  54. package/browser/fonts/macos-bundle/generated/Bodoni72-Regular.ttf +0 -0
  55. package/browser/fonts/macos-bundle/generated/Bodoni72Oldstyle-Bold.ttf +0 -0
  56. package/browser/fonts/macos-bundle/generated/Bodoni72Oldstyle-BoldItalic.ttf +0 -0
  57. package/browser/fonts/macos-bundle/generated/Bodoni72Oldstyle-Italic.ttf +0 -0
  58. package/browser/fonts/macos-bundle/generated/Bodoni72Oldstyle-Regular.ttf +0 -0
  59. package/browser/fonts/macos-bundle/generated/Bodoni72Smallcaps-Bold.ttf +0 -0
  60. package/browser/fonts/macos-bundle/generated/Bodoni72Smallcaps-BoldItalic.ttf +0 -0
  61. package/browser/fonts/macos-bundle/generated/Bodoni72Smallcaps-Italic.ttf +0 -0
  62. package/browser/fonts/macos-bundle/generated/Bodoni72Smallcaps-Regular.ttf +0 -0
  63. package/browser/fonts/macos-bundle/generated/BradleyHand-Regular.ttf +0 -0
  64. package/browser/fonts/macos-bundle/generated/BrushScriptMT-Regular.ttf +0 -0
  65. package/browser/fonts/macos-bundle/generated/Chalkboard-Bold.ttf +0 -0
  66. package/browser/fonts/macos-bundle/generated/Chalkboard-BoldItalic.ttf +0 -0
  67. package/browser/fonts/macos-bundle/generated/Chalkboard-Italic.ttf +0 -0
  68. package/browser/fonts/macos-bundle/generated/Chalkboard-Regular.ttf +0 -0
  69. package/browser/fonts/macos-bundle/generated/ChalkboardSE-Bold.ttf +0 -0
  70. package/browser/fonts/macos-bundle/generated/ChalkboardSE-BoldItalic.ttf +0 -0
  71. package/browser/fonts/macos-bundle/generated/ChalkboardSE-Italic.ttf +0 -0
  72. package/browser/fonts/macos-bundle/generated/ChalkboardSE-Regular.ttf +0 -0
  73. package/browser/fonts/macos-bundle/generated/Chalkduster-Bold.ttf +0 -0
  74. package/browser/fonts/macos-bundle/generated/Chalkduster-BoldItalic.ttf +0 -0
  75. package/browser/fonts/macos-bundle/generated/Chalkduster-Italic.ttf +0 -0
  76. package/browser/fonts/macos-bundle/generated/Chalkduster-Regular.ttf +0 -0
  77. package/browser/fonts/macos-bundle/generated/Charter-Bold.ttf +0 -0
  78. package/browser/fonts/macos-bundle/generated/Charter-BoldItalic.ttf +0 -0
  79. package/browser/fonts/macos-bundle/generated/Charter-Italic.ttf +0 -0
  80. package/browser/fonts/macos-bundle/generated/Charter-Regular.ttf +0 -0
  81. package/browser/fonts/macos-bundle/generated/Cochin-Bold.ttf +0 -0
  82. package/browser/fonts/macos-bundle/generated/Cochin-BoldItalic.ttf +0 -0
  83. package/browser/fonts/macos-bundle/generated/Cochin-Italic.ttf +0 -0
  84. package/browser/fonts/macos-bundle/generated/Cochin-Regular.ttf +0 -0
  85. package/browser/fonts/macos-bundle/generated/ComicSansMS-Bold.ttf +0 -0
  86. package/browser/fonts/macos-bundle/generated/ComicSansMS-BoldItalic.ttf +0 -0
  87. package/browser/fonts/macos-bundle/generated/ComicSansMS-Italic.ttf +0 -0
  88. package/browser/fonts/macos-bundle/generated/ComicSansMS-Regular.ttf +0 -0
  89. package/browser/fonts/macos-bundle/generated/Copperplate-Bold.ttf +0 -0
  90. package/browser/fonts/macos-bundle/generated/Copperplate-Regular.ttf +0 -0
  91. package/browser/fonts/macos-bundle/generated/Courier-Bold.ttf +0 -0
  92. package/browser/fonts/macos-bundle/generated/Courier-BoldItalic.ttf +0 -0
  93. package/browser/fonts/macos-bundle/generated/Courier-Italic.ttf +0 -0
  94. package/browser/fonts/macos-bundle/generated/Courier-Regular.ttf +0 -0
  95. package/browser/fonts/macos-bundle/generated/CourierNew-Regular.ttf +0 -0
  96. package/browser/fonts/macos-bundle/generated/Didot-Bold.ttf +0 -0
  97. package/browser/fonts/macos-bundle/generated/Didot-BoldItalic.ttf +0 -0
  98. package/browser/fonts/macos-bundle/generated/Didot-Italic.ttf +0 -0
  99. package/browser/fonts/macos-bundle/generated/Didot-Regular.ttf +0 -0
  100. package/browser/fonts/macos-bundle/generated/Futura-Bold.ttf +0 -0
  101. package/browser/fonts/macos-bundle/generated/Futura-BoldItalic.ttf +0 -0
  102. package/browser/fonts/macos-bundle/generated/Futura-Italic.ttf +0 -0
  103. package/browser/fonts/macos-bundle/generated/Futura-Regular.ttf +0 -0
  104. package/browser/fonts/macos-bundle/generated/Geneva-Regular.ttf +0 -0
  105. package/browser/fonts/macos-bundle/generated/Georgia-Bold.ttf +0 -0
  106. package/browser/fonts/macos-bundle/generated/Georgia-BoldItalic.ttf +0 -0
  107. package/browser/fonts/macos-bundle/generated/Georgia-Italic.ttf +0 -0
  108. package/browser/fonts/macos-bundle/generated/Georgia-Regular.ttf +0 -0
  109. package/browser/fonts/macos-bundle/generated/GillSans-Bold.ttf +0 -0
  110. package/browser/fonts/macos-bundle/generated/GillSans-BoldItalic.ttf +0 -0
  111. package/browser/fonts/macos-bundle/generated/GillSans-Italic.ttf +0 -0
  112. package/browser/fonts/macos-bundle/generated/GillSans-Regular.ttf +0 -0
  113. package/browser/fonts/macos-bundle/generated/Helvetica-Bold.ttf +0 -0
  114. package/browser/fonts/macos-bundle/generated/Helvetica-BoldItalic.ttf +0 -0
  115. package/browser/fonts/macos-bundle/generated/Helvetica-Italic.ttf +0 -0
  116. package/browser/fonts/macos-bundle/generated/Helvetica-Regular.ttf +0 -0
  117. package/browser/fonts/macos-bundle/generated/HelveticaNeue-Bold.ttf +0 -0
  118. package/browser/fonts/macos-bundle/generated/HelveticaNeue-BoldItalic.ttf +0 -0
  119. package/browser/fonts/macos-bundle/generated/HelveticaNeue-Italic.ttf +0 -0
  120. package/browser/fonts/macos-bundle/generated/HelveticaNeue-Regular.ttf +0 -0
  121. package/browser/fonts/macos-bundle/generated/Herculanum-Bold.ttf +0 -0
  122. package/browser/fonts/macos-bundle/generated/Herculanum-BoldItalic.ttf +0 -0
  123. package/browser/fonts/macos-bundle/generated/Herculanum-Italic.ttf +0 -0
  124. package/browser/fonts/macos-bundle/generated/Herculanum-Regular.ttf +0 -0
  125. package/browser/fonts/macos-bundle/generated/HoeflerText-Bold.ttf +0 -0
  126. package/browser/fonts/macos-bundle/generated/HoeflerText-BoldItalic.ttf +0 -0
  127. package/browser/fonts/macos-bundle/generated/HoeflerText-Italic.ttf +0 -0
  128. package/browser/fonts/macos-bundle/generated/HoeflerText-Regular.ttf +0 -0
  129. package/browser/fonts/macos-bundle/generated/Impact-Bold.ttf +0 -0
  130. package/browser/fonts/macos-bundle/generated/Impact-BoldItalic.ttf +0 -0
  131. package/browser/fonts/macos-bundle/generated/Impact-Italic.ttf +0 -0
  132. package/browser/fonts/macos-bundle/generated/Impact-Regular.ttf +0 -0
  133. package/browser/fonts/macos-bundle/generated/LucidaGrande-Bold.ttf +0 -0
  134. package/browser/fonts/macos-bundle/generated/LucidaGrande-Regular.ttf +0 -0
  135. package/browser/fonts/macos-bundle/generated/MarkerFelt-Bold.ttf +0 -0
  136. package/browser/fonts/macos-bundle/generated/MarkerFelt-BoldItalic.ttf +0 -0
  137. package/browser/fonts/macos-bundle/generated/MarkerFelt-Italic.ttf +0 -0
  138. package/browser/fonts/macos-bundle/generated/MarkerFelt-Regular.ttf +0 -0
  139. package/browser/fonts/macos-bundle/generated/Menlo-Regular.ttf +0 -0
  140. package/browser/fonts/macos-bundle/generated/Monaco-Bold.ttf +0 -0
  141. package/browser/fonts/macos-bundle/generated/Monaco-BoldItalic.ttf +0 -0
  142. package/browser/fonts/macos-bundle/generated/Monaco-Italic.ttf +0 -0
  143. package/browser/fonts/macos-bundle/generated/Monaco-Regular.ttf +0 -0
  144. package/browser/fonts/macos-bundle/generated/Noteworthy-Bold.ttf +0 -0
  145. package/browser/fonts/macos-bundle/generated/Noteworthy-Regular.ttf +0 -0
  146. package/browser/fonts/macos-bundle/generated/Optima-Bold.ttf +0 -0
  147. package/browser/fonts/macos-bundle/generated/Optima-BoldItalic.ttf +0 -0
  148. package/browser/fonts/macos-bundle/generated/Optima-Italic.ttf +0 -0
  149. package/browser/fonts/macos-bundle/generated/Optima-Regular.ttf +0 -0
  150. package/browser/fonts/macos-bundle/generated/Palatino-Bold.ttf +0 -0
  151. package/browser/fonts/macos-bundle/generated/Palatino-BoldItalic.ttf +0 -0
  152. package/browser/fonts/macos-bundle/generated/Palatino-Italic.ttf +0 -0
  153. package/browser/fonts/macos-bundle/generated/Palatino-Regular.ttf +0 -0
  154. package/browser/fonts/macos-bundle/generated/Papyrus-Bold.ttf +0 -0
  155. package/browser/fonts/macos-bundle/generated/Papyrus-BoldItalic.ttf +0 -0
  156. package/browser/fonts/macos-bundle/generated/Papyrus-Italic.ttf +0 -0
  157. package/browser/fonts/macos-bundle/generated/Papyrus-Regular.ttf +0 -0
  158. package/browser/fonts/macos-bundle/generated/PartyLET-Bold.ttf +0 -0
  159. package/browser/fonts/macos-bundle/generated/PartyLET-BoldItalic.ttf +0 -0
  160. package/browser/fonts/macos-bundle/generated/PartyLET-Italic.ttf +0 -0
  161. package/browser/fonts/macos-bundle/generated/PartyLET-Regular.ttf +0 -0
  162. package/browser/fonts/macos-bundle/generated/Phosphate-Regular.ttf +0 -0
  163. package/browser/fonts/macos-bundle/generated/README.md +132 -0
  164. package/browser/fonts/macos-bundle/generated/Rockwell-Bold.ttf +0 -0
  165. package/browser/fonts/macos-bundle/generated/Rockwell-BoldItalic.ttf +0 -0
  166. package/browser/fonts/macos-bundle/generated/Rockwell-Italic.ttf +0 -0
  167. package/browser/fonts/macos-bundle/generated/Rockwell-Regular.ttf +0 -0
  168. package/browser/fonts/macos-bundle/generated/SavoyeLET-Bold.ttf +0 -0
  169. package/browser/fonts/macos-bundle/generated/SavoyeLET-BoldItalic.ttf +0 -0
  170. package/browser/fonts/macos-bundle/generated/SavoyeLET-Italic.ttf +0 -0
  171. package/browser/fonts/macos-bundle/generated/SavoyeLET-Regular.ttf +0 -0
  172. package/browser/fonts/macos-bundle/generated/Seravek-Bold.ttf +0 -0
  173. package/browser/fonts/macos-bundle/generated/Seravek-BoldItalic.ttf +0 -0
  174. package/browser/fonts/macos-bundle/generated/Seravek-Italic.ttf +0 -0
  175. package/browser/fonts/macos-bundle/generated/Seravek-Regular.ttf +0 -0
  176. package/browser/fonts/macos-bundle/generated/SignPainter-Bold.ttf +0 -0
  177. package/browser/fonts/macos-bundle/generated/SignPainter-Regular.ttf +0 -0
  178. package/browser/fonts/macos-bundle/generated/Skia-Bold.ttf +0 -0
  179. package/browser/fonts/macos-bundle/generated/Skia-BoldItalic.ttf +0 -0
  180. package/browser/fonts/macos-bundle/generated/Skia-Italic.ttf +0 -0
  181. package/browser/fonts/macos-bundle/generated/Skia-Regular.ttf +0 -0
  182. package/browser/fonts/macos-bundle/generated/SnellRoundhand-Bold.ttf +0 -0
  183. package/browser/fonts/macos-bundle/generated/SnellRoundhand-Regular.ttf +0 -0
  184. package/browser/fonts/macos-bundle/generated/Tahoma-Bold.ttf +0 -0
  185. package/browser/fonts/macos-bundle/generated/Tahoma-Regular.ttf +0 -0
  186. package/browser/fonts/macos-bundle/generated/Times-Bold.ttf +0 -0
  187. package/browser/fonts/macos-bundle/generated/Times-BoldItalic.ttf +0 -0
  188. package/browser/fonts/macos-bundle/generated/Times-Italic.ttf +0 -0
  189. package/browser/fonts/macos-bundle/generated/Times-Regular.ttf +0 -0
  190. package/browser/fonts/macos-bundle/generated/TimesNewRoman-Bold.ttf +0 -0
  191. package/browser/fonts/macos-bundle/generated/TimesNewRoman-BoldItalic.ttf +0 -0
  192. package/browser/fonts/macos-bundle/generated/TimesNewRoman-Italic.ttf +0 -0
  193. package/browser/fonts/macos-bundle/generated/TimesNewRoman-Regular.ttf +0 -0
  194. package/browser/fonts/macos-bundle/generated/Trattatello-Regular.ttf +0 -0
  195. package/browser/fonts/macos-bundle/generated/TrebuchetMS-Bold.ttf +0 -0
  196. package/browser/fonts/macos-bundle/generated/TrebuchetMS-BoldItalic.ttf +0 -0
  197. package/browser/fonts/macos-bundle/generated/TrebuchetMS-Italic.ttf +0 -0
  198. package/browser/fonts/macos-bundle/generated/TrebuchetMS-Regular.ttf +0 -0
  199. package/browser/fonts/macos-bundle/generated/Verdana-Bold.ttf +0 -0
  200. package/browser/fonts/macos-bundle/generated/Verdana-BoldItalic.ttf +0 -0
  201. package/browser/fonts/macos-bundle/generated/Verdana-Italic.ttf +0 -0
  202. package/browser/fonts/macos-bundle/generated/Verdana-Regular.ttf +0 -0
  203. package/browser/fonts/macos-bundle/generated/Webdings-Bold.ttf +0 -0
  204. package/browser/fonts/macos-bundle/generated/Webdings-BoldItalic.ttf +0 -0
  205. package/browser/fonts/macos-bundle/generated/Webdings-Italic.ttf +0 -0
  206. package/browser/fonts/macos-bundle/generated/Webdings-Regular.ttf +0 -0
  207. package/browser/fonts/macos-bundle/generated/Zapfino-Bold.ttf +0 -0
  208. package/browser/fonts/macos-bundle/generated/Zapfino-BoldItalic.ttf +0 -0
  209. package/browser/fonts/macos-bundle/generated/Zapfino-Italic.ttf +0 -0
  210. package/browser/fonts/macos-bundle/generated/Zapfino-Regular.ttf +0 -0
  211. package/browser/fonts/macos-bundle/generated/manifest.json +2928 -0
  212. package/browser/fonts/macos-bundle/generated/systemui-Bold.ttf +0 -0
  213. package/browser/fonts/macos-bundle/generated/systemui-BoldItalic.ttf +0 -0
  214. package/browser/fonts/macos-bundle/generated/systemui-Italic.ttf +0 -0
  215. package/browser/fonts/macos-bundle/generated/systemui-Regular.ttf +0 -0
  216. package/browser/fonts/macos-bundle/install.sh +136 -0
  217. package/browser/fonts/macos-bundle/vendor/README.md +30 -0
  218. package/browser/fonts/macos-bundle/vendor/anton/Anton-Regular.ttf +0 -0
  219. package/browser/fonts/macos-bundle/vendor/anton/OFL.txt +93 -0
  220. package/browser/fonts/macos-bundle/vendor/gelasio/Gelasio-Italic-VariableFont_wght.ttf +0 -0
  221. package/browser/fonts/macos-bundle/vendor/gelasio/Gelasio-VariableFont_wght.ttf +0 -0
  222. package/browser/fonts/macos-bundle/vendor/gelasio/OFL.txt +93 -0
  223. package/browser/fonts/macos-bundle/verify-metric-fonts.py +171 -0
  224. package/dist/browser-controller.d.ts +47 -4
  225. package/dist/browser-controller.d.ts.map +1 -1
  226. package/dist/browser-controller.js +219 -278
  227. package/dist/browser-controller.js.map +1 -1
  228. package/dist/browser-plugin.d.ts +82 -110
  229. package/dist/browser-plugin.d.ts.map +1 -1
  230. package/dist/browser-plugin.js +405 -379
  231. package/dist/browser-plugin.js.map +1 -1
  232. package/dist/browser-process/align-fingerprint-config.d.ts +36 -0
  233. package/dist/browser-process/align-fingerprint-config.d.ts.map +1 -0
  234. package/dist/browser-process/align-fingerprint-config.js +74 -0
  235. package/dist/browser-process/align-fingerprint-config.js.map +1 -0
  236. package/dist/browser-process/anti-detect-browser.d.ts +2 -2
  237. package/dist/browser-process/anti-detect-browser.js +7 -7
  238. package/dist/browser-process/anti-detect-config.d.ts +146 -2
  239. package/dist/browser-process/anti-detect-config.d.ts.map +1 -1
  240. package/dist/browser-process/anti-detect-config.js +432 -127
  241. package/dist/browser-process/anti-detect-config.js.map +1 -1
  242. package/dist/browser-process/browser.d.ts +25 -92
  243. package/dist/browser-process/browser.d.ts.map +1 -1
  244. package/dist/browser-process/browser.js +467 -79
  245. package/dist/browser-process/browser.js.map +1 -1
  246. package/dist/browser-process/fingerprint-config.d.ts +146 -0
  247. package/dist/browser-process/fingerprint-config.d.ts.map +1 -0
  248. package/dist/browser-process/fingerprint-config.js +351 -0
  249. package/dist/browser-process/fingerprint-config.js.map +1 -0
  250. package/dist/browser-process/get-chrome-executable.d.ts +6 -0
  251. package/dist/browser-process/get-chrome-executable.d.ts.map +1 -1
  252. package/dist/browser-process/get-chrome-executable.js +79 -4
  253. package/dist/browser-process/get-chrome-executable.js.map +1 -1
  254. package/dist/browser-process/gpu-family-profiles.d.ts +58 -0
  255. package/dist/browser-process/gpu-family-profiles.d.ts.map +1 -0
  256. package/dist/browser-process/gpu-family-profiles.js +480 -0
  257. package/dist/browser-process/gpu-family-profiles.js.map +1 -0
  258. package/dist/browser-process/launch-options.d.ts +301 -0
  259. package/dist/browser-process/launch-options.d.ts.map +1 -0
  260. package/dist/browser-process/launch-options.js +2 -0
  261. package/dist/browser-process/launch-options.js.map +1 -0
  262. package/dist/browser-process/port-allocator.d.ts +64 -0
  263. package/dist/browser-process/port-allocator.d.ts.map +1 -0
  264. package/dist/browser-process/port-allocator.js +198 -0
  265. package/dist/browser-process/port-allocator.js.map +1 -0
  266. package/dist/browser-process/process.d.ts +85 -0
  267. package/dist/browser-process/process.d.ts.map +1 -1
  268. package/dist/browser-process/process.js +235 -19
  269. package/dist/browser-process/process.js.map +1 -1
  270. package/dist/browser-process/signal-cleanup.d.ts +40 -0
  271. package/dist/browser-process/signal-cleanup.d.ts.map +1 -0
  272. package/dist/browser-process/signal-cleanup.js +105 -0
  273. package/dist/browser-process/signal-cleanup.js.map +1 -0
  274. package/dist/browser-process/widevine-cdm.d.ts +144 -0
  275. package/dist/browser-process/widevine-cdm.d.ts.map +1 -0
  276. package/dist/browser-process/widevine-cdm.js +298 -0
  277. package/dist/browser-process/widevine-cdm.js.map +1 -0
  278. package/dist/browser-profiles/chrome/populate-profile.d.ts.map +1 -1
  279. package/dist/browser-profiles/chrome/populate-profile.js +21 -22
  280. package/dist/browser-profiles/chrome/populate-profile.js.map +1 -1
  281. package/dist/connection/cdp-reconnection.d.ts +50 -0
  282. package/dist/connection/cdp-reconnection.d.ts.map +1 -0
  283. package/dist/connection/cdp-reconnection.js +75 -0
  284. package/dist/connection/cdp-reconnection.js.map +1 -0
  285. package/dist/connection/page-session.d.ts +114 -0
  286. package/dist/connection/page-session.d.ts.map +1 -0
  287. package/dist/connection/page-session.js +237 -0
  288. package/dist/connection/page-session.js.map +1 -0
  289. package/dist/connection/session-client.d.ts +34 -0
  290. package/dist/connection/session-client.d.ts.map +1 -0
  291. package/dist/connection/session-client.js +129 -0
  292. package/dist/connection/session-client.js.map +1 -0
  293. package/dist/crawler.d.ts +9 -88
  294. package/dist/crawler.d.ts.map +1 -1
  295. package/dist/crawler.js +157 -8
  296. package/dist/crawler.js.map +1 -1
  297. package/dist/fingerprinting/fingerprint-injector.d.ts +24 -114
  298. package/dist/fingerprinting/fingerprint-injector.d.ts.map +1 -1
  299. package/dist/fingerprinting/fingerprint-injector.js +305 -611
  300. package/dist/fingerprinting/fingerprint-injector.js.map +1 -1
  301. package/dist/fingerprinting/fingerprint-overrides/datadome-bypass.d.ts +1 -1
  302. package/dist/fingerprinting/fingerprint-overrides/datadome-bypass.d.ts.map +1 -1
  303. package/dist/fingerprinting/fingerprint-overrides/datadome-bypass.js +16 -14
  304. package/dist/fingerprinting/fingerprint-overrides/datadome-bypass.js.map +1 -1
  305. package/dist/fingerprinting/fingerprint-overrides/index.d.ts +6 -2
  306. package/dist/fingerprinting/fingerprint-overrides/index.d.ts.map +1 -1
  307. package/dist/fingerprinting/fingerprint-overrides/index.js +6 -2
  308. package/dist/fingerprinting/fingerprint-overrides/index.js.map +1 -1
  309. package/dist/fingerprinting/fingerprint-overrides/keyboard-humanization.d.ts +1 -1
  310. package/dist/fingerprinting/fingerprint-overrides/keyboard-humanization.js +4 -4
  311. package/dist/fingerprinting/fingerprint-overrides/keyboard-humanization.js.map +1 -1
  312. package/dist/fingerprinting/fingerprint-overrides/locale-spoofing.js +4 -4
  313. package/dist/fingerprinting/fingerprint-overrides/navigator-override.d.ts +18 -0
  314. package/dist/fingerprinting/fingerprint-overrides/navigator-override.d.ts.map +1 -0
  315. package/dist/fingerprinting/fingerprint-overrides/navigator-override.js +136 -0
  316. package/dist/fingerprinting/fingerprint-overrides/navigator-override.js.map +1 -0
  317. package/dist/fingerprinting/fingerprint-overrides/override.d.ts +151 -0
  318. package/dist/fingerprinting/fingerprint-overrides/override.d.ts.map +1 -0
  319. package/dist/fingerprinting/fingerprint-overrides/override.js +14 -0
  320. package/dist/fingerprinting/fingerprint-overrides/override.js.map +1 -0
  321. package/dist/fingerprinting/fingerprint-overrides/platform-consistency.d.ts.map +1 -1
  322. package/dist/fingerprinting/fingerprint-overrides/platform-consistency.js +46 -15
  323. package/dist/fingerprinting/fingerprint-overrides/platform-consistency.js.map +1 -1
  324. package/dist/fingerprinting/fingerprint-overrides/registry.d.ts +43 -0
  325. package/dist/fingerprinting/fingerprint-overrides/registry.d.ts.map +1 -0
  326. package/dist/fingerprinting/fingerprint-overrides/registry.js +342 -0
  327. package/dist/fingerprinting/fingerprint-overrides/registry.js.map +1 -0
  328. package/dist/fingerprinting/fingerprint-overrides/screen-override.d.ts +16 -0
  329. package/dist/fingerprinting/fingerprint-overrides/screen-override.d.ts.map +1 -0
  330. package/dist/fingerprinting/fingerprint-overrides/screen-override.js +175 -0
  331. package/dist/fingerprinting/fingerprint-overrides/screen-override.js.map +1 -0
  332. package/dist/fingerprinting/fingerprint-overrides/scroll-humanization.d.ts +1 -1
  333. package/dist/fingerprinting/fingerprint-overrides/scroll-humanization.js +4 -4
  334. package/dist/fingerprinting/fingerprint-overrides/scroll-humanization.js.map +1 -1
  335. package/dist/fingerprinting/fingerprint-overrides/stealth-script.d.ts.map +1 -1
  336. package/dist/fingerprinting/fingerprint-overrides/stealth-script.js +75 -9
  337. package/dist/fingerprinting/fingerprint-overrides/stealth-script.js.map +1 -1
  338. package/dist/fingerprinting/fingerprint-overrides/ua-ch.d.ts +1 -1
  339. package/dist/fingerprinting/fingerprint-overrides/ua-ch.d.ts.map +1 -1
  340. package/dist/fingerprinting/fingerprint-overrides/ua-ch.js +34 -20
  341. package/dist/fingerprinting/fingerprint-overrides/ua-ch.js.map +1 -1
  342. package/dist/fingerprinting/fingerprint-overrides/webgl-spoofing.d.ts.map +1 -1
  343. package/dist/fingerprinting/fingerprint-overrides/webgl-spoofing.js +28 -9
  344. package/dist/fingerprinting/fingerprint-overrides/webgl-spoofing.js.map +1 -1
  345. package/dist/fingerprinting/fingerprint-overrides/webrtc-spoofing.js +1 -1
  346. package/dist/fingerprinting/hardware-realism.d.ts +74 -0
  347. package/dist/fingerprinting/hardware-realism.d.ts.map +1 -0
  348. package/dist/fingerprinting/hardware-realism.js +155 -0
  349. package/dist/fingerprinting/hardware-realism.js.map +1 -0
  350. package/dist/fingerprinting/injection-planner.d.ts +133 -0
  351. package/dist/fingerprinting/injection-planner.d.ts.map +1 -0
  352. package/dist/fingerprinting/injection-planner.js +497 -0
  353. package/dist/fingerprinting/injection-planner.js.map +1 -0
  354. package/dist/fingerprinting/locale-resolver.d.ts +8 -1
  355. package/dist/fingerprinting/locale-resolver.d.ts.map +1 -1
  356. package/dist/fingerprinting/locale-resolver.js +26 -3
  357. package/dist/fingerprinting/locale-resolver.js.map +1 -1
  358. package/dist/fingerprinting/non-apify-fingerprint-generator.d.ts +4 -4
  359. package/dist/fingerprinting/non-apify-fingerprint-generator.d.ts.map +1 -1
  360. package/dist/fingerprinting/non-apify-fingerprint-generator.js +35 -69
  361. package/dist/fingerprinting/non-apify-fingerprint-generator.js.map +1 -1
  362. package/dist/fingerprinting/non-apify-profiles.json +10515 -8494
  363. package/dist/fingerprinting/os-consistency.d.ts +28 -0
  364. package/dist/fingerprinting/os-consistency.d.ts.map +1 -0
  365. package/dist/fingerprinting/os-consistency.js +45 -0
  366. package/dist/fingerprinting/os-consistency.js.map +1 -0
  367. package/dist/fingerprinting/profile-quality.d.ts +25 -0
  368. package/dist/fingerprinting/profile-quality.d.ts.map +1 -0
  369. package/dist/fingerprinting/profile-quality.js +310 -0
  370. package/dist/fingerprinting/profile-quality.js.map +1 -0
  371. package/dist/fingerprinting/profile-selector.d.ts +102 -0
  372. package/dist/fingerprinting/profile-selector.d.ts.map +1 -0
  373. package/dist/fingerprinting/profile-selector.js +168 -0
  374. package/dist/fingerprinting/profile-selector.js.map +1 -0
  375. package/dist/fingerprinting/ua-alignment.d.ts +83 -0
  376. package/dist/fingerprinting/ua-alignment.d.ts.map +1 -0
  377. package/dist/fingerprinting/ua-alignment.js +197 -0
  378. package/dist/fingerprinting/ua-alignment.js.map +1 -0
  379. package/dist/fingerprinting/ua-ch-brands.d.ts +88 -0
  380. package/dist/fingerprinting/ua-ch-brands.d.ts.map +1 -0
  381. package/dist/fingerprinting/ua-ch-brands.js +174 -0
  382. package/dist/fingerprinting/ua-ch-brands.js.map +1 -0
  383. package/dist/index.d.ts +5 -0
  384. package/dist/index.d.ts.map +1 -1
  385. package/dist/index.js +6 -0
  386. package/dist/index.js.map +1 -1
  387. package/dist/input/dropdown-selector.d.ts +90 -0
  388. package/dist/input/dropdown-selector.d.ts.map +1 -0
  389. package/dist/input/dropdown-selector.js +394 -0
  390. package/dist/input/dropdown-selector.js.map +1 -0
  391. package/dist/input/element-target.d.ts +152 -0
  392. package/dist/input/element-target.d.ts.map +1 -0
  393. package/dist/input/element-target.js +461 -0
  394. package/dist/input/element-target.js.map +1 -0
  395. package/dist/input/input-emulator.d.ts +85 -0
  396. package/dist/input/input-emulator.d.ts.map +1 -0
  397. package/dist/input/input-emulator.js +325 -0
  398. package/dist/input/input-emulator.js.map +1 -0
  399. package/dist/input/input-transport.d.ts +60 -0
  400. package/dist/input/input-transport.d.ts.map +1 -0
  401. package/dist/input/input-transport.js +28 -0
  402. package/dist/input/input-transport.js.map +1 -0
  403. package/dist/input/recording-transport.d.ts +32 -0
  404. package/dist/input/recording-transport.d.ts.map +1 -0
  405. package/dist/input/recording-transport.js +43 -0
  406. package/dist/input/recording-transport.js.map +1 -0
  407. package/dist/keyboard-layout.d.ts +2 -2
  408. package/dist/keyboard-layout.js +2 -2
  409. package/dist/navigation/page-navigation.d.ts +67 -0
  410. package/dist/navigation/page-navigation.d.ts.map +1 -0
  411. package/dist/navigation/page-navigation.js +122 -0
  412. package/dist/navigation/page-navigation.js.map +1 -0
  413. package/dist/network/network-watch.d.ts +110 -0
  414. package/dist/network/network-watch.d.ts.map +1 -0
  415. package/dist/network/network-watch.js +223 -0
  416. package/dist/network/network-watch.js.map +1 -0
  417. package/dist/page.d.ts +123 -104
  418. package/dist/page.d.ts.map +1 -1
  419. package/dist/page.js +348 -1129
  420. package/dist/page.js.map +1 -1
  421. package/dist/session/inject-hook.d.ts +24 -0
  422. package/dist/session/inject-hook.d.ts.map +1 -0
  423. package/dist/session/inject-hook.js +80 -0
  424. package/dist/session/inject-hook.js.map +1 -0
  425. package/dist/session/save.d.ts +21 -0
  426. package/dist/session/save.d.ts.map +1 -0
  427. package/dist/session/save.js +163 -0
  428. package/dist/session/save.js.map +1 -0
  429. package/dist/session/tar-data-dir.d.ts +18 -0
  430. package/dist/session/tar-data-dir.d.ts.map +1 -0
  431. package/dist/session/tar-data-dir.js +105 -0
  432. package/dist/session/tar-data-dir.js.map +1 -0
  433. package/dist/session/types.d.ts +80 -0
  434. package/dist/session/types.d.ts.map +1 -0
  435. package/dist/session/types.js +29 -0
  436. package/dist/session/types.js.map +1 -0
  437. package/dist/session-profile.d.ts +102 -0
  438. package/dist/session-profile.d.ts.map +1 -0
  439. package/dist/session-profile.js +163 -0
  440. package/dist/session-profile.js.map +1 -0
  441. package/dist/tsconfig.build.tsbuildinfo +1 -1
  442. package/package.json +15 -6
  443. package/dist/fingerprinting/custom-fingerprint-injector.d.ts +0 -87
  444. package/dist/fingerprinting/custom-fingerprint-injector.d.ts.map +0 -1
  445. package/dist/fingerprinting/custom-fingerprint-injector.js +0 -342
  446. package/dist/fingerprinting/custom-fingerprint-injector.js.map +0 -1
  447. package/dist/launcher-wrap.d.ts +0 -10
  448. package/dist/launcher-wrap.d.ts.map +0 -1
  449. package/dist/launcher-wrap.js +0 -11
  450. 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":"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"}
@@ -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"}