jumpy-lion 0.1.1 → 0.1.2

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 (230) hide show
  1. package/dist/browser-controller.d.ts +22 -3
  2. package/dist/browser-controller.d.ts.map +1 -1
  3. package/dist/browser-controller.js +316 -71
  4. package/dist/browser-controller.js.map +1 -1
  5. package/dist/browser-plugin.d.ts +56 -7
  6. package/dist/browser-plugin.d.ts.map +1 -1
  7. package/dist/browser-plugin.js +268 -56
  8. package/dist/browser-plugin.js.map +1 -1
  9. package/dist/browser-process/browser.d.ts +39 -0
  10. package/dist/browser-process/browser.d.ts.map +1 -1
  11. package/dist/browser-process/browser.js +125 -16
  12. package/dist/browser-process/browser.js.map +1 -1
  13. package/dist/browser-process/process.d.ts +9 -0
  14. package/dist/browser-process/process.d.ts.map +1 -1
  15. package/dist/browser-process/process.js +100 -6
  16. package/dist/browser-process/process.js.map +1 -1
  17. package/dist/browser-profiles/chrome/default.d.ts +116 -0
  18. package/dist/browser-profiles/chrome/default.d.ts.map +1 -1
  19. package/dist/browser-profiles/chrome/default.js +118 -1
  20. package/dist/browser-profiles/chrome/default.js.map +1 -1
  21. package/dist/browser-profiles/chrome/populate-profile.d.ts +76 -0
  22. package/dist/browser-profiles/chrome/populate-profile.d.ts.map +1 -0
  23. package/dist/browser-profiles/chrome/populate-profile.js +300 -0
  24. package/dist/browser-profiles/chrome/populate-profile.js.map +1 -0
  25. package/dist/browser-profiles/index.d.ts +1 -0
  26. package/dist/browser-profiles/index.d.ts.map +1 -1
  27. package/dist/browser-profiles/index.js +2 -0
  28. package/dist/browser-profiles/index.js.map +1 -1
  29. package/dist/crawler.d.ts +81 -9
  30. package/dist/crawler.d.ts.map +1 -1
  31. package/dist/crawler.js +26 -10
  32. package/dist/crawler.js.map +1 -1
  33. package/dist/fingerprinting/all-fingerprint-defender/_locales/en/messages.json +95 -0
  34. package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-16ff15da.d.ts +2 -0
  35. package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-16ff15da.d.ts.map +1 -0
  36. package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-16ff15da.js +1 -0
  37. package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-16ff15da.js.map +1 -0
  38. package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-1a1456ec.d.ts +2 -0
  39. package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-1a1456ec.d.ts.map +1 -0
  40. package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-1a1456ec.js +1 -0
  41. package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-1a1456ec.js.map +1 -0
  42. package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-3a7b59dd.d.ts +83 -0
  43. package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-3a7b59dd.d.ts.map +1 -0
  44. package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-3a7b59dd.js +1 -0
  45. package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-3a7b59dd.js.map +1 -0
  46. package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-7ce85519.d.ts +2 -0
  47. package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-7ce85519.d.ts.map +1 -0
  48. package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-7ce85519.js +1 -0
  49. package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-7ce85519.js.map +1 -0
  50. package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-aaea1190.d.ts +2 -0
  51. package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-aaea1190.d.ts.map +1 -0
  52. package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-aaea1190.js +1 -0
  53. package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-aaea1190.js.map +1 -0
  54. package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-b4410958.d.ts +2 -0
  55. package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-b4410958.d.ts.map +1 -0
  56. package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-b4410958.js +1 -0
  57. package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-b4410958.js.map +1 -0
  58. package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-dfed3562.d.ts +2 -0
  59. package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-dfed3562.d.ts.map +1 -0
  60. package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-dfed3562.js +1 -0
  61. package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-dfed3562.js.map +1 -0
  62. package/dist/fingerprinting/all-fingerprint-defender/assets/debounce-09920c81.css +1 -0
  63. package/dist/fingerprinting/all-fingerprint-defender/assets/options-fe2fb5aa.css +1 -0
  64. package/dist/fingerprinting/all-fingerprint-defender/assets/popup-1886d2ef.css +1 -0
  65. package/dist/fingerprinting/all-fingerprint-defender/img/icon-128.png +0 -0
  66. package/dist/fingerprinting/all-fingerprint-defender/img/icon-16.png +0 -0
  67. package/dist/fingerprinting/all-fingerprint-defender/img/icon-24.png +0 -0
  68. package/dist/fingerprinting/all-fingerprint-defender/img/icon-32-disabled.png +0 -0
  69. package/dist/fingerprinting/all-fingerprint-defender/img/icon-32.png +0 -0
  70. package/dist/fingerprinting/all-fingerprint-defender/img/icon-48.png +0 -0
  71. package/dist/fingerprinting/all-fingerprint-defender/manifest.json +83 -0
  72. package/dist/fingerprinting/all-fingerprint-defender/options.html +17 -0
  73. package/dist/fingerprinting/all-fingerprint-defender/popup.html +23 -0
  74. package/dist/fingerprinting/anti-webgpu/background.d.ts +2 -0
  75. package/dist/fingerprinting/anti-webgpu/background.d.ts.map +1 -0
  76. package/dist/fingerprinting/anti-webgpu/background.js +4 -0
  77. package/dist/fingerprinting/anti-webgpu/background.js.map +1 -0
  78. package/dist/fingerprinting/anti-webgpu/data/content_script/inject.d.ts +2 -0
  79. package/dist/fingerprinting/anti-webgpu/data/content_script/inject.d.ts.map +1 -0
  80. package/dist/fingerprinting/anti-webgpu/data/content_script/inject.js +50 -0
  81. package/dist/fingerprinting/anti-webgpu/data/content_script/inject.js.map +1 -0
  82. package/dist/fingerprinting/anti-webgpu/data/content_script/page_context/inject.d.ts +2 -0
  83. package/dist/fingerprinting/anti-webgpu/data/content_script/page_context/inject.d.ts.map +1 -0
  84. package/dist/fingerprinting/anti-webgpu/data/content_script/page_context/inject.js +172 -0
  85. package/dist/fingerprinting/anti-webgpu/data/content_script/page_context/inject.js.map +1 -0
  86. package/dist/fingerprinting/anti-webgpu/data/icons/128.png +0 -0
  87. package/dist/fingerprinting/anti-webgpu/data/icons/16.png +0 -0
  88. package/dist/fingerprinting/anti-webgpu/data/icons/32.png +0 -0
  89. package/dist/fingerprinting/anti-webgpu/data/icons/48.png +0 -0
  90. package/dist/fingerprinting/anti-webgpu/data/icons/64.png +0 -0
  91. package/dist/fingerprinting/anti-webgpu/data/popup/popup.css +88 -0
  92. package/dist/fingerprinting/anti-webgpu/data/popup/popup.d.ts +2 -0
  93. package/dist/fingerprinting/anti-webgpu/data/popup/popup.d.ts.map +1 -0
  94. package/dist/fingerprinting/anti-webgpu/data/popup/popup.html +58 -0
  95. package/dist/fingerprinting/anti-webgpu/data/popup/popup.js +96 -0
  96. package/dist/fingerprinting/anti-webgpu/data/popup/popup.js.map +1 -0
  97. package/dist/fingerprinting/anti-webgpu/lib/chrome.d.ts +2 -0
  98. package/dist/fingerprinting/anti-webgpu/lib/chrome.d.ts.map +1 -0
  99. package/dist/fingerprinting/anti-webgpu/lib/chrome.js +249 -0
  100. package/dist/fingerprinting/anti-webgpu/lib/chrome.js.map +1 -0
  101. package/dist/fingerprinting/anti-webgpu/lib/common.d.ts +2 -0
  102. package/dist/fingerprinting/anti-webgpu/lib/common.d.ts.map +1 -0
  103. package/dist/fingerprinting/anti-webgpu/lib/common.js +86 -0
  104. package/dist/fingerprinting/anti-webgpu/lib/common.js.map +1 -0
  105. package/dist/fingerprinting/anti-webgpu/lib/config.d.ts +2 -0
  106. package/dist/fingerprinting/anti-webgpu/lib/config.d.ts.map +1 -0
  107. package/dist/fingerprinting/anti-webgpu/lib/config.js +14 -0
  108. package/dist/fingerprinting/anti-webgpu/lib/config.js.map +1 -0
  109. package/dist/fingerprinting/anti-webgpu/lib/runtime.d.ts +2 -0
  110. package/dist/fingerprinting/anti-webgpu/lib/runtime.d.ts.map +1 -0
  111. package/dist/fingerprinting/anti-webgpu/lib/runtime.js +107 -0
  112. package/dist/fingerprinting/anti-webgpu/lib/runtime.js.map +1 -0
  113. package/dist/fingerprinting/anti-webgpu/manifest.json +58 -0
  114. package/dist/fingerprinting/custom-fingerprint-injector.d.ts +87 -0
  115. package/dist/fingerprinting/custom-fingerprint-injector.d.ts.map +1 -0
  116. package/dist/fingerprinting/custom-fingerprint-injector.js +342 -0
  117. package/dist/fingerprinting/custom-fingerprint-injector.js.map +1 -0
  118. package/dist/fingerprinting/fingerprint-injector.d.ts +157 -0
  119. package/dist/fingerprinting/fingerprint-injector.d.ts.map +1 -0
  120. package/dist/fingerprinting/fingerprint-injector.js +632 -0
  121. package/dist/fingerprinting/fingerprint-injector.js.map +1 -0
  122. package/dist/fingerprinting/fingerprint-overrides/audio-spoofing.d.ts +6 -0
  123. package/dist/fingerprinting/fingerprint-overrides/audio-spoofing.d.ts.map +1 -0
  124. package/dist/fingerprinting/fingerprint-overrides/audio-spoofing.js +119 -0
  125. package/dist/fingerprinting/fingerprint-overrides/audio-spoofing.js.map +1 -0
  126. package/dist/fingerprinting/fingerprint-overrides/canvas-protection.d.ts +6 -0
  127. package/dist/fingerprinting/fingerprint-overrides/canvas-protection.d.ts.map +1 -0
  128. package/dist/fingerprinting/fingerprint-overrides/canvas-protection.js +149 -0
  129. package/dist/fingerprinting/fingerprint-overrides/canvas-protection.js.map +1 -0
  130. package/dist/fingerprinting/fingerprint-overrides/cdp-detection-bypass.d.ts +14 -0
  131. package/dist/fingerprinting/fingerprint-overrides/cdp-detection-bypass.d.ts.map +1 -0
  132. package/dist/fingerprinting/fingerprint-overrides/cdp-detection-bypass.js +763 -0
  133. package/dist/fingerprinting/fingerprint-overrides/cdp-detection-bypass.js.map +1 -0
  134. package/dist/fingerprinting/fingerprint-overrides/client-rect-spoofing.d.ts +6 -0
  135. package/dist/fingerprinting/fingerprint-overrides/client-rect-spoofing.d.ts.map +1 -0
  136. package/dist/fingerprinting/fingerprint-overrides/client-rect-spoofing.js +195 -0
  137. package/dist/fingerprinting/fingerprint-overrides/client-rect-spoofing.js.map +1 -0
  138. package/dist/fingerprinting/fingerprint-overrides/coalesced-events-spoofing.d.ts +10 -0
  139. package/dist/fingerprinting/fingerprint-overrides/coalesced-events-spoofing.d.ts.map +1 -0
  140. package/dist/fingerprinting/fingerprint-overrides/coalesced-events-spoofing.js +195 -0
  141. package/dist/fingerprinting/fingerprint-overrides/coalesced-events-spoofing.js.map +1 -0
  142. package/dist/fingerprinting/fingerprint-overrides/datadome-bypass.d.ts +28 -0
  143. package/dist/fingerprinting/fingerprint-overrides/datadome-bypass.d.ts.map +1 -0
  144. package/dist/fingerprinting/fingerprint-overrides/datadome-bypass.js +1181 -0
  145. package/dist/fingerprinting/fingerprint-overrides/datadome-bypass.js.map +1 -0
  146. package/dist/fingerprinting/fingerprint-overrides/font-spoofing.d.ts +7 -0
  147. package/dist/fingerprinting/fingerprint-overrides/font-spoofing.d.ts.map +1 -0
  148. package/dist/fingerprinting/fingerprint-overrides/font-spoofing.js +171 -0
  149. package/dist/fingerprinting/fingerprint-overrides/font-spoofing.js.map +1 -0
  150. package/dist/fingerprinting/fingerprint-overrides/index.d.ts +36 -0
  151. package/dist/fingerprinting/fingerprint-overrides/index.d.ts.map +1 -0
  152. package/dist/fingerprinting/fingerprint-overrides/index.js +40 -0
  153. package/dist/fingerprinting/fingerprint-overrides/index.js.map +1 -0
  154. package/dist/fingerprinting/fingerprint-overrides/keyboard-humanization.d.ts +45 -0
  155. package/dist/fingerprinting/fingerprint-overrides/keyboard-humanization.d.ts.map +1 -0
  156. package/dist/fingerprinting/fingerprint-overrides/keyboard-humanization.js +268 -0
  157. package/dist/fingerprinting/fingerprint-overrides/keyboard-humanization.js.map +1 -0
  158. package/dist/fingerprinting/fingerprint-overrides/locale-spoofing.d.ts +6 -0
  159. package/dist/fingerprinting/fingerprint-overrides/locale-spoofing.d.ts.map +1 -0
  160. package/dist/fingerprinting/fingerprint-overrides/locale-spoofing.js +301 -0
  161. package/dist/fingerprinting/fingerprint-overrides/locale-spoofing.js.map +1 -0
  162. package/dist/fingerprinting/fingerprint-overrides/mouse-humanization.d.ts +7 -0
  163. package/dist/fingerprinting/fingerprint-overrides/mouse-humanization.d.ts.map +1 -0
  164. package/dist/fingerprinting/fingerprint-overrides/mouse-humanization.js +58 -0
  165. package/dist/fingerprinting/fingerprint-overrides/mouse-humanization.js.map +1 -0
  166. package/dist/fingerprinting/fingerprint-overrides/performance-spoofing.d.ts +6 -0
  167. package/dist/fingerprinting/fingerprint-overrides/performance-spoofing.d.ts.map +1 -0
  168. package/dist/fingerprinting/fingerprint-overrides/performance-spoofing.js +249 -0
  169. package/dist/fingerprinting/fingerprint-overrides/performance-spoofing.js.map +1 -0
  170. package/dist/fingerprinting/fingerprint-overrides/platform-consistency.d.ts +33 -0
  171. package/dist/fingerprinting/fingerprint-overrides/platform-consistency.d.ts.map +1 -0
  172. package/dist/fingerprinting/fingerprint-overrides/platform-consistency.js +618 -0
  173. package/dist/fingerprinting/fingerprint-overrides/platform-consistency.js.map +1 -0
  174. package/dist/fingerprinting/fingerprint-overrides/prototype-integrity.d.ts +13 -0
  175. package/dist/fingerprinting/fingerprint-overrides/prototype-integrity.d.ts.map +1 -0
  176. package/dist/fingerprinting/fingerprint-overrides/prototype-integrity.js +356 -0
  177. package/dist/fingerprinting/fingerprint-overrides/prototype-integrity.js.map +1 -0
  178. package/dist/fingerprinting/fingerprint-overrides/runtime-enable-bypass.d.ts +18 -0
  179. package/dist/fingerprinting/fingerprint-overrides/runtime-enable-bypass.d.ts.map +1 -0
  180. package/dist/fingerprinting/fingerprint-overrides/runtime-enable-bypass.js +171 -0
  181. package/dist/fingerprinting/fingerprint-overrides/runtime-enable-bypass.js.map +1 -0
  182. package/dist/fingerprinting/fingerprint-overrides/scroll-humanization.d.ts +55 -0
  183. package/dist/fingerprinting/fingerprint-overrides/scroll-humanization.d.ts.map +1 -0
  184. package/dist/fingerprinting/fingerprint-overrides/scroll-humanization.js +244 -0
  185. package/dist/fingerprinting/fingerprint-overrides/scroll-humanization.js.map +1 -0
  186. package/dist/fingerprinting/fingerprint-overrides/stealth-script.d.ts +14 -0
  187. package/dist/fingerprinting/fingerprint-overrides/stealth-script.d.ts.map +1 -0
  188. package/dist/fingerprinting/fingerprint-overrides/stealth-script.js +925 -0
  189. package/dist/fingerprinting/fingerprint-overrides/stealth-script.js.map +1 -0
  190. package/dist/fingerprinting/fingerprint-overrides/storage-consistency.d.ts +13 -0
  191. package/dist/fingerprinting/fingerprint-overrides/storage-consistency.d.ts.map +1 -0
  192. package/dist/fingerprinting/fingerprint-overrides/storage-consistency.js +346 -0
  193. package/dist/fingerprinting/fingerprint-overrides/storage-consistency.js.map +1 -0
  194. package/dist/fingerprinting/fingerprint-overrides/timing-consistency.d.ts +13 -0
  195. package/dist/fingerprinting/fingerprint-overrides/timing-consistency.d.ts.map +1 -0
  196. package/dist/fingerprinting/fingerprint-overrides/timing-consistency.js +264 -0
  197. package/dist/fingerprinting/fingerprint-overrides/timing-consistency.js.map +1 -0
  198. package/dist/fingerprinting/fingerprint-overrides/ua-ch.d.ts +27 -0
  199. package/dist/fingerprinting/fingerprint-overrides/ua-ch.d.ts.map +1 -0
  200. package/dist/fingerprinting/fingerprint-overrides/ua-ch.js +213 -0
  201. package/dist/fingerprinting/fingerprint-overrides/ua-ch.js.map +1 -0
  202. package/dist/fingerprinting/fingerprint-overrides/utils.d.ts +12 -0
  203. package/dist/fingerprinting/fingerprint-overrides/utils.d.ts.map +1 -0
  204. package/dist/fingerprinting/fingerprint-overrides/utils.js +517 -0
  205. package/dist/fingerprinting/fingerprint-overrides/utils.js.map +1 -0
  206. package/dist/fingerprinting/fingerprint-overrides/webgl-spoofing.d.ts +12 -0
  207. package/dist/fingerprinting/fingerprint-overrides/webgl-spoofing.d.ts.map +1 -0
  208. package/dist/fingerprinting/fingerprint-overrides/webgl-spoofing.js +215 -0
  209. package/dist/fingerprinting/fingerprint-overrides/webgl-spoofing.js.map +1 -0
  210. package/dist/fingerprinting/fingerprint-overrides/webgpu-spoofing.d.ts +6 -0
  211. package/dist/fingerprinting/fingerprint-overrides/webgpu-spoofing.d.ts.map +1 -0
  212. package/dist/fingerprinting/fingerprint-overrides/webgpu-spoofing.js +202 -0
  213. package/dist/fingerprinting/fingerprint-overrides/webgpu-spoofing.js.map +1 -0
  214. package/dist/fingerprinting/fingerprint-overrides/webrtc-spoofing.d.ts +6 -0
  215. package/dist/fingerprinting/fingerprint-overrides/webrtc-spoofing.d.ts.map +1 -0
  216. package/dist/fingerprinting/fingerprint-overrides/webrtc-spoofing.js +188 -0
  217. package/dist/fingerprinting/fingerprint-overrides/webrtc-spoofing.js.map +1 -0
  218. package/dist/index.d.ts +4 -0
  219. package/dist/index.d.ts.map +1 -1
  220. package/dist/index.js +2 -0
  221. package/dist/index.js.map +1 -1
  222. package/dist/launcher-wrap.d.ts +2 -2
  223. package/dist/launcher-wrap.d.ts.map +1 -1
  224. package/dist/launcher-wrap.js.map +1 -1
  225. package/dist/page.d.ts +160 -13
  226. package/dist/page.d.ts.map +1 -1
  227. package/dist/page.js +1027 -42
  228. package/dist/page.js.map +1 -1
  229. package/dist/tsconfig.build.tsbuildinfo +1 -1
  230. package/package.json +8 -4
@@ -0,0 +1,215 @@
1
+ /**
2
+ * WebGL Fingerprinting Protection
3
+ * Platform-aware GPU spoofing for WebGL contexts
4
+ */
5
+ export const createWebGLSpoofingScript = (fingerprintWebGL) => {
6
+ // If fingerprint data is provided, use it; otherwise use platform-based defaults
7
+ const useFingerprint = fingerprintWebGL && (fingerprintWebGL.vendorUnmasked || fingerprintWebGL.rendererUnmasked);
8
+ return `
9
+ (() => {
10
+ 'use strict';
11
+
12
+ // WebGL Spoofing for 2025 - Platform-aware
13
+ const spoofWebGL = () => {
14
+ const getParameterProto = WebGLRenderingContext.prototype.getParameter;
15
+ const getExtensionProto = WebGLRenderingContext.prototype.getExtension;
16
+ const getSupportedExtensionsProto = WebGLRenderingContext.prototype.getSupportedExtensions;
17
+
18
+ ${useFingerprint ? `
19
+ // Use fingerprint-provided WebGL values
20
+ const fingerprintConfig = ${JSON.stringify(fingerprintWebGL)};
21
+ const selectedVendor = fingerprintConfig.vendorUnmasked || fingerprintConfig.vendor || 'Intel Inc.';
22
+ const selectedRenderer = fingerprintConfig.rendererUnmasked || fingerprintConfig.renderer || 'Intel Iris OpenGL Engine';
23
+ console.log('[CDP-FP-DEBUG] WebGL using fingerprint data - Vendor:', selectedVendor, 'Renderer:', selectedRenderer.substring(0, 50));
24
+ ` : `
25
+ // Detect platform from navigator
26
+ const platform = navigator.platform || 'Win32';
27
+
28
+ // Platform-specific GPU configurations - 2024-2025 updated
29
+ // IMPORTANT: Windows GPU strings must follow the exact Chrome ANGLE format
30
+ const gpuConfigs = {
31
+ 'Win32': {
32
+ // Windows uses "Google Inc. (VENDOR)" format for vendor
33
+ vendors: [
34
+ 'Google Inc. (NVIDIA)',
35
+ 'Google Inc. (AMD)',
36
+ 'Google Inc. (Intel)'
37
+ ],
38
+ // Windows renderers use Direct3D11 format - authentic Chrome strings
39
+ renderers: [
40
+ 'ANGLE (NVIDIA, NVIDIA GeForce GTX 1660 Ti Direct3D11 vs_5_0 ps_5_0, D3D11)',
41
+ 'ANGLE (NVIDIA, NVIDIA GeForce RTX 3060 Direct3D11 vs_5_0 ps_5_0, D3D11)',
42
+ 'ANGLE (NVIDIA, NVIDIA GeForce RTX 4070 Direct3D11 vs_5_0 ps_5_0, D3D11)',
43
+ 'ANGLE (AMD, AMD Radeon RX 6700 XT Direct3D11 vs_5_0 ps_5_0, D3D11)',
44
+ 'ANGLE (AMD, AMD Radeon RX 6600 Direct3D11 vs_5_0 ps_5_0, D3D11)',
45
+ 'ANGLE (Intel, Intel(R) UHD Graphics 630 Direct3D11 vs_5_0 ps_5_0, D3D11)',
46
+ 'ANGLE (Intel, Intel(R) Iris(R) Xe Graphics Direct3D11 vs_5_0 ps_5_0, D3D11)',
47
+ 'ANGLE (NVIDIA, NVIDIA GeForce RTX 4060 Direct3D11 vs_5_0 ps_5_0, D3D11)',
48
+ 'ANGLE (NVIDIA, NVIDIA GeForce RTX 4070 Ti Direct3D11 vs_5_0 ps_5_0, D3D11)',
49
+ ],
50
+ vendorPairs: [
51
+ { vendor: 'Google Inc. (NVIDIA)', renderer: 'ANGLE (NVIDIA, NVIDIA GeForce GTX 1660 Ti Direct3D11 vs_5_0 ps_5_0, D3D11)' },
52
+ { vendor: 'Google Inc. (NVIDIA)', renderer: 'ANGLE (NVIDIA, NVIDIA GeForce RTX 3060 Direct3D11 vs_5_0 ps_5_0, D3D11)' },
53
+ { vendor: 'Google Inc. (AMD)', renderer: 'ANGLE (AMD, AMD Radeon RX 6700 XT Direct3D11 vs_5_0 ps_5_0, D3D11)' },
54
+ { vendor: 'Google Inc. (Intel)', renderer: 'ANGLE (Intel, Intel(R) UHD Graphics 630 Direct3D11 vs_5_0 ps_5_0, D3D11)' },
55
+ { vendor: 'Google Inc. (NVIDIA)', renderer: 'ANGLE (NVIDIA, NVIDIA GeForce RTX 4060 Direct3D11 vs_5_0 ps_5_0, D3D11)' },
56
+ ],
57
+ },
58
+ 'MacIntel': {
59
+ vendors: ['Google Inc. (Apple)', 'Google Inc. (Intel)', 'Google Inc. (AMD)'],
60
+ renderers: [
61
+ 'ANGLE (Apple, Apple M1 Pro, OpenGL 4.1)',
62
+ 'ANGLE (Apple, Apple M2, OpenGL 4.1)',
63
+ 'ANGLE (Intel Inc., Intel(R) Iris(TM) Plus Graphics OpenGL Engine, OpenGL 4.1)',
64
+ 'ANGLE (AMD, AMD Radeon Pro 5500M OpenGL Engine, OpenGL 4.1)',
65
+ ],
66
+ vendorPairs: [
67
+ { vendor: 'Google Inc. (Apple)', renderer: 'ANGLE (Apple, Apple M1 Pro, OpenGL 4.1)' },
68
+ { vendor: 'Google Inc. (Intel)', renderer: 'ANGLE (Intel Inc., Intel(R) Iris(TM) Plus Graphics OpenGL Engine, OpenGL 4.1)' },
69
+ ],
70
+ },
71
+ 'Linux x86_64': {
72
+ vendors: ['Google Inc. (Intel)', 'Google Inc. (NVIDIA)', 'Google Inc. (AMD)'],
73
+ renderers: [
74
+ 'ANGLE (Intel, Mesa Intel(R) UHD Graphics 630 (CFL GT2), OpenGL 4.6)',
75
+ 'ANGLE (NVIDIA, NVIDIA GeForce GTX 1660 Ti/PCIe/SSE2, OpenGL 4.6)',
76
+ 'ANGLE (AMD, AMD Radeon RX 6600 (NAVY_FLOUNDER, DRM 3.42.0, 5.15.0-56-generic, LLVM 12.0.0), OpenGL 4.6)',
77
+ ],
78
+ vendorPairs: [
79
+ { vendor: 'Google Inc. (Intel)', renderer: 'ANGLE (Intel, Mesa Intel(R) UHD Graphics 630 (CFL GT2), OpenGL 4.6)' },
80
+ { vendor: 'Google Inc. (NVIDIA)', renderer: 'ANGLE (NVIDIA, NVIDIA GeForce GTX 1660 Ti/PCIe/SSE2, OpenGL 4.6)' },
81
+ ],
82
+ },
83
+ };
84
+
85
+ // Default to Windows for better anti-bot evasion (most common platform)
86
+ const config = gpuConfigs[platform] || gpuConfigs['Win32'];
87
+
88
+ // Select a consistent vendor/renderer pair per session.
89
+ // Use Date.now() XOR'd with UA hash so different sessions get different GPUs
90
+ // even with the same user agent (avoids mass correlation).
91
+ const uaHash = (navigator.userAgent || '').split('').reduce((a, b) => ((a << 5) - a + b.charCodeAt(0)) | 0, 0);
92
+ const sessionSeed = (Date.now() ^ uaHash) >>> 0;
93
+ const seededIdx = sessionSeed % config.vendorPairs.length;
94
+ const selectedPair = config.vendorPairs[seededIdx];
95
+ const selectedVendor = selectedPair.vendor;
96
+ const selectedRenderer = selectedPair.renderer;
97
+
98
+ console.log('[CDP-FP-DEBUG] WebGL using platform:', platform, '- Vendor:', selectedVendor, 'Renderer:', selectedRenderer.substring(0, 60) + '...');
99
+ `}
100
+
101
+ // Override getParameter
102
+ WebGLRenderingContext.prototype.getParameter = function(param) {
103
+ // UNMASKED_VENDOR_WEBGL
104
+ if (param === 0x9245) {
105
+ return selectedVendor;
106
+ }
107
+ // UNMASKED_RENDERER_WEBGL
108
+ if (param === 0x9246) {
109
+ return selectedRenderer;
110
+ }
111
+ // Standard WebGL parameters - use fingerprint values if available
112
+ if (param === 0x1F00) { // VENDOR
113
+ return ${useFingerprint && fingerprintWebGL?.vendor ? `'${fingerprintWebGL.vendor}'` : "'WebKit'"};
114
+ }
115
+ if (param === 0x1F01) { // RENDERER
116
+ return ${useFingerprint && fingerprintWebGL?.renderer ? `'${fingerprintWebGL.renderer}'` : "'WebKit WebGL'"};
117
+ }
118
+ if (param === 0x1F02) { // VERSION
119
+ return 'WebGL 1.0 (OpenGL ES 2.0 Chromium)';
120
+ }
121
+ // MAX_TEXTURE_SIZE
122
+ if (param === 0x0D33) {
123
+ return 16384;
124
+ }
125
+ // MAX_VIEWPORT_DIMS
126
+ if (param === 0x0D3A) {
127
+ return new Int32Array([32767, 32767]);
128
+ }
129
+
130
+ return getParameterProto.apply(this, arguments);
131
+ };
132
+
133
+ // Also apply to WebGL2
134
+ if (typeof WebGL2RenderingContext !== 'undefined') {
135
+ WebGL2RenderingContext.prototype.getParameter = function(param) {
136
+ // For WebGL2, return appropriate version
137
+ if (param === 0x1F02) { // VERSION
138
+ return 'WebGL 2.0 (OpenGL ES 3.0 Chromium)';
139
+ }
140
+ // Use same logic as WebGL1 for other params
141
+ return WebGLRenderingContext.prototype.getParameter.call(this, param);
142
+ };
143
+ }
144
+
145
+ // Override getSupportedExtensions with platform-appropriate extensions
146
+ const baseExtensions = [
147
+ 'ANGLE_instanced_arrays', 'EXT_blend_minmax', 'EXT_color_buffer_half_float',
148
+ 'EXT_disjoint_timer_query', 'EXT_float_blend', 'EXT_frag_depth',
149
+ 'EXT_shader_texture_lod', 'EXT_texture_compression_rgtc',
150
+ 'EXT_texture_filter_anisotropic', 'EXT_sRGB', 'KHR_parallel_shader_compile',
151
+ 'OES_element_index_uint', 'OES_fbo_render_mipmap', 'OES_standard_derivatives',
152
+ 'OES_texture_float', 'OES_texture_float_linear', 'OES_texture_half_float',
153
+ 'OES_texture_half_float_linear', 'OES_vertex_array_object', 'WEBGL_color_buffer_float',
154
+ 'WEBGL_compressed_texture_s3tc', 'WEBGL_compressed_texture_s3tc_srgb',
155
+ 'WEBGL_debug_renderer_info', 'WEBGL_debug_shaders', 'WEBGL_depth_texture',
156
+ 'WEBGL_draw_buffers', 'WEBGL_lose_context', 'WEBGL_multi_draw'
157
+ ];
158
+
159
+ ${!useFingerprint ? `
160
+ // Add platform-specific extensions
161
+ const platformExtensions = {
162
+ 'Win32': ['EXT_texture_compression_bptc', 'WEBGL_compressed_texture_astc'],
163
+ 'MacIntel': ['WEBGL_compressed_texture_pvrtc', 'WEBKIT_WEBGL_compressed_texture_pvrtc'],
164
+ 'Linux x86_64': ['EXT_texture_compression_bptc'],
165
+ };
166
+
167
+ const allExtensions = [...baseExtensions, ...(platformExtensions[platform] || [])];
168
+ ` : `
169
+ const allExtensions = baseExtensions;
170
+ `}
171
+
172
+ WebGLRenderingContext.prototype.getSupportedExtensions = function() {
173
+ return allExtensions;
174
+ };
175
+
176
+ if (typeof WebGL2RenderingContext !== 'undefined') {
177
+ WebGL2RenderingContext.prototype.getSupportedExtensions = function() {
178
+ return [...allExtensions, 'EXT_color_buffer_float', 'EXT_disjoint_timer_query_webgl2', 'WEBGL_compressed_texture_etc'];
179
+ };
180
+ }
181
+
182
+ // Override getExtension to handle WEBGL_debug_renderer_info properly
183
+ WebGLRenderingContext.prototype.getExtension = function(name) {
184
+ const result = getExtensionProto.apply(this, arguments);
185
+
186
+ if (name === 'WEBGL_debug_renderer_info' && result) {
187
+ // Return the extension but ensure our spoofed values are used
188
+ return {
189
+ UNMASKED_VENDOR_WEBGL: 0x9245,
190
+ UNMASKED_RENDERER_WEBGL: 0x9246,
191
+ };
192
+ }
193
+
194
+ return result;
195
+ };
196
+
197
+ if (typeof WebGL2RenderingContext !== 'undefined') {
198
+ WebGL2RenderingContext.prototype.getExtension = WebGLRenderingContext.prototype.getExtension;
199
+ }
200
+ };
201
+
202
+ const DEBUG_PREFIX = '[CDP-FP-DEBUG]';
203
+ const ERROR_PREFIX = '[CDP-FP-ERROR]';
204
+
205
+ try {
206
+ console.log(DEBUG_PREFIX, 'Starting WebGL spoofing...');
207
+ spoofWebGL();
208
+ console.log(DEBUG_PREFIX, '✓ WebGL spoofing applied');
209
+ } catch (e) {
210
+ console.error(ERROR_PREFIX, '✗ Failed to apply WebGL spoofing:', e);
211
+ throw e; // Rethrow to make errors visible
212
+ }
213
+ })();`;
214
+ };
215
+ //# sourceMappingURL=webgl-spoofing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webgl-spoofing.js","sourceRoot":"","sources":["../../../src/fingerprinting/fingerprint-overrides/webgl-spoofing.ts"],"names":[],"mappings":"AAAA;;;GAGG;AASH,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,gBAA8B,EAAU,EAAE;IAChF,iFAAiF;IACjF,MAAM,cAAc,GAAG,gBAAgB,IAAI,CAAC,gBAAgB,CAAC,cAAc,IAAI,gBAAgB,CAAC,gBAAgB,CAAC,CAAC;IAElH,OAAO;;;;;;;;;;UAUD,cAAc,CAAC,CAAC,CAAC;;oCAES,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC;;;;SAI3D,CAAC,CAAC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;SA2EH;;;;;;;;;;;;;;yBAcgB,cAAc,IAAI,gBAAgB,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,UAAU;;;yBAGxF,cAAc,IAAI,gBAAgB,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,gBAAgB,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UA2CjH,CAAC,cAAc,CAAC,CAAC,CAAC;;;;;;;;;SASnB,CAAC,CAAC,CAAC;;SAEH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MA2CH,CAAC;AACP,CAAC,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * WebGPU Fingerprinting Protection
3
+ * Spoofs GPU adapter information
4
+ */
5
+ export declare const createWebGPUSpoofingScript: (experimentalMode?: boolean) => string;
6
+ //# sourceMappingURL=webgpu-spoofing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webgpu-spoofing.d.ts","sourceRoot":"","sources":["../../../src/fingerprinting/fingerprint-overrides/webgpu-spoofing.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,eAAO,MAAM,0BAA0B,kCAA+B,MAoMrE,CAAC"}
@@ -0,0 +1,202 @@
1
+ /**
2
+ * WebGPU Fingerprinting Protection
3
+ * Spoofs GPU adapter information
4
+ */
5
+ export const createWebGPUSpoofingScript = (experimentalMode = false) => {
6
+ return `
7
+ (() => {
8
+ 'use strict';
9
+
10
+ // WebGPU Fingerprinting Protection
11
+ const spoofWebGPU = () => {
12
+ // Experimental mode: completely disable WebGPU
13
+ ${experimentalMode ? `
14
+ if ('GPU' in window) {
15
+ delete window.GPU;
16
+ }
17
+ if ('navigator' in window && 'gpu' in navigator) {
18
+ delete navigator.gpu;
19
+ }
20
+ // Return early as WebGPU is completely disabled
21
+ return;
22
+ ` : ''}
23
+
24
+ // Standard mode: spoof WebGPU
25
+ // Session-stable seeded PRNG to ensure consistent GPU selection across navigations
26
+ const sessionSeed = Date.now() ^ 0xD4E5F617;
27
+ const createSeededRNG = (seed) => {
28
+ let s = seed | 0;
29
+ return () => {
30
+ s = s + 0x6D2B79F5 | 0;
31
+ let t = Math.imul(s ^ s >>> 15, 1 | s);
32
+ t = t + Math.imul(t ^ t >>> 7, 61 | t) ^ t;
33
+ return ((t ^ t >>> 14) >>> 0) / 4294967296;
34
+ };
35
+ };
36
+ const seededRandom = createSeededRNG(sessionSeed);
37
+
38
+ if ('GPU' in window && window.GPU) {
39
+ const OriginalGPU = window.GPU;
40
+
41
+ // Override requestAdapter to provide consistent fake adapter info
42
+ window.GPU = new Proxy(OriginalGPU, {
43
+ get(target, prop) {
44
+ if (prop === 'requestAdapter') {
45
+ return async function(options) {
46
+ const adapter = await target.requestAdapter.call(target, options);
47
+ if (!adapter) return null;
48
+
49
+ // Wrap the adapter to provide fake but consistent info
50
+ return new Proxy(adapter, {
51
+ get(adapterTarget, adapterProp) {
52
+ if (adapterProp === 'name') {
53
+ // Return a common GPU name based on platform
54
+ const gpuNames = [
55
+ 'NVIDIA GeForce RTX 4060',
56
+ 'NVIDIA GeForce RTX 3060',
57
+ 'NVIDIA GeForce GTX 1660 Ti',
58
+ 'AMD Radeon RX 7600',
59
+ 'AMD Radeon RX 6600',
60
+ 'Intel(R) Arc(TM) A770',
61
+ 'Intel(R) UHD Graphics 770',
62
+ ];
63
+ const idx = Math.floor(seededRandom() * gpuNames.length);
64
+ return gpuNames[idx];
65
+ }
66
+
67
+ if (adapterProp === 'features') {
68
+ // Return a consistent set of features
69
+ const fakeFeatures = new Set([
70
+ 'depth-clip-control',
71
+ 'depth32float-stencil8',
72
+ 'texture-compression-bc',
73
+ 'texture-compression-etc2',
74
+ 'texture-compression-astc',
75
+ 'timestamp-query',
76
+ 'indirect-first-instance',
77
+ 'shader-f16',
78
+ 'rg11b10ufloat-renderable',
79
+ 'bgra8unorm-storage',
80
+ 'float32-filterable',
81
+ ]);
82
+
83
+ return new Proxy(adapterTarget.features || fakeFeatures, {
84
+ get(featuresTarget, featuresProp) {
85
+ if (featuresProp === 'has') {
86
+ return (feature) => fakeFeatures.has(feature);
87
+ }
88
+ if (featuresProp === 'size') {
89
+ return fakeFeatures.size;
90
+ }
91
+ if (featuresProp === Symbol.iterator) {
92
+ return fakeFeatures[Symbol.iterator].bind(fakeFeatures);
93
+ }
94
+ return Reflect.get(featuresTarget, featuresProp);
95
+ }
96
+ });
97
+ }
98
+
99
+ if (adapterProp === 'limits') {
100
+ // Return realistic GPU limits
101
+ return {
102
+ maxTextureDimension1D: 16384,
103
+ maxTextureDimension2D: 16384,
104
+ maxTextureDimension3D: 2048,
105
+ maxTextureArrayLayers: 2048,
106
+ maxBindGroups: 4,
107
+ maxBindGroupsPlusVertexBuffers: 24,
108
+ maxBindingsPerBindGroup: 1000,
109
+ maxDynamicUniformBuffersPerPipelineLayout: 8,
110
+ maxDynamicStorageBuffersPerPipelineLayout: 4,
111
+ maxSampledTexturesPerShaderStage: 16,
112
+ maxSamplersPerShaderStage: 16,
113
+ maxStorageBuffersPerShaderStage: 8,
114
+ maxStorageTexturesPerShaderStage: 4,
115
+ maxUniformBuffersPerShaderStage: 12,
116
+ maxUniformBufferBindingSize: 65536,
117
+ maxStorageBufferBindingSize: 134217728,
118
+ minUniformBufferOffsetAlignment: 256,
119
+ minStorageBufferOffsetAlignment: 256,
120
+ maxVertexBuffers: 8,
121
+ maxBufferSize: 268435456,
122
+ maxVertexAttributes: 16,
123
+ maxVertexBufferArrayStride: 2048,
124
+ maxInterStageShaderComponents: 60,
125
+ maxInterStageShaderVariables: 16,
126
+ maxColorAttachments: 8,
127
+ maxColorAttachmentBytesPerSample: 32,
128
+ maxComputeWorkgroupStorageSize: 16384,
129
+ maxComputeInvocationsPerWorkgroup: 256,
130
+ maxComputeWorkgroupSizeX: 256,
131
+ maxComputeWorkgroupSizeY: 256,
132
+ maxComputeWorkgroupSizeZ: 64,
133
+ maxComputeWorkgroupsPerDimension: 65535,
134
+ };
135
+ }
136
+
137
+ if (adapterProp === 'requestDevice') {
138
+ return async function(descriptor) {
139
+ const device = await adapterTarget.requestDevice.call(adapterTarget, descriptor);
140
+ if (!device) return null;
141
+
142
+ // Wrap the device to intercept timing queries
143
+ return new Proxy(device, {
144
+ get(deviceTarget, deviceProp) {
145
+ if (deviceProp === 'createQuerySet') {
146
+ return function(descriptor) {
147
+ const querySet = deviceTarget.createQuerySet.call(deviceTarget, descriptor);
148
+
149
+ // If it's a timestamp query, we need to fake the results
150
+ if (descriptor.type === 'timestamp') {
151
+ return new Proxy(querySet, {
152
+ get(queryTarget, queryProp) {
153
+ // Intercept resolve operations to fake timestamps
154
+ return Reflect.get(queryTarget, queryProp);
155
+ }
156
+ });
157
+ }
158
+
159
+ return querySet;
160
+ };
161
+ }
162
+
163
+ return Reflect.get(deviceTarget, deviceProp);
164
+ }
165
+ });
166
+ };
167
+ }
168
+
169
+ return Reflect.get(adapterTarget, adapterProp);
170
+ }
171
+ });
172
+ };
173
+ }
174
+
175
+ if (prop === 'getPreferredCanvasFormat') {
176
+ return function() {
177
+ // Return the most common format
178
+ return 'bgra8unorm';
179
+ };
180
+ }
181
+
182
+ return Reflect.get(target, prop);
183
+ }
184
+ });
185
+ }
186
+
187
+ };
188
+
189
+ const DEBUG_PREFIX = '[CDP-FP-DEBUG]';
190
+ const ERROR_PREFIX = '[CDP-FP-ERROR]';
191
+
192
+ try {
193
+ console.log(DEBUG_PREFIX, 'Starting WebGPU spoofing...');
194
+ spoofWebGPU();
195
+ console.log(DEBUG_PREFIX, '✓ WebGPU spoofing applied');
196
+ } catch (e) {
197
+ console.error(ERROR_PREFIX, '✗ Failed to apply WebGPU spoofing:', e);
198
+ throw e;
199
+ }
200
+ })();`;
201
+ };
202
+ //# sourceMappingURL=webgpu-spoofing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webgpu-spoofing.js","sourceRoot":"","sources":["../../../src/fingerprinting/fingerprint-overrides/webgpu-spoofing.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,gBAAgB,GAAG,KAAK,EAAU,EAAE;IAC3E,OAAO;;;;;;;UAOD,gBAAgB,CAAC,CAAC,CAAC;;;;;;;;;SASpB,CAAC,CAAC,CAAC,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAkLR,CAAC;AACP,CAAC,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * WebRTC Spoofing
3
+ * Prevents IP leaks and provides fake device information
4
+ */
5
+ export declare const createWebRTCSpoofingScript: () => string;
6
+ //# sourceMappingURL=webrtc-spoofing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webrtc-spoofing.d.ts","sourceRoot":"","sources":["../../../src/fingerprinting/fingerprint-overrides/webrtc-spoofing.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,eAAO,MAAM,0BAA0B,QAAO,MAsL7C,CAAC"}
@@ -0,0 +1,188 @@
1
+ /**
2
+ * WebRTC Spoofing
3
+ * Prevents IP leaks and provides fake device information
4
+ */
5
+ export const createWebRTCSpoofingScript = () => {
6
+ return `
7
+ (() => {
8
+ 'use strict';
9
+
10
+ // Use crypto.getRandomValues for device IDs - these must be truly random
11
+ // per session to avoid correlation/blocking across sessions.
12
+ // Seeded PRNG is only used for non-identifying jitter (stats).
13
+ const createSeededRNG = (seed) => {
14
+ let s = seed | 0;
15
+ return () => {
16
+ s = s + 0x6D2B79F5 | 0;
17
+ let t = Math.imul(s ^ s >>> 15, 1 | s);
18
+ t = t + Math.imul(t ^ t >>> 7, 61 | t) ^ t;
19
+ return ((t ^ t >>> 14) >>> 0) / 4294967296;
20
+ };
21
+ };
22
+ const sessionSeed = Date.now() ^ 0xC3A5F917;
23
+ const seededRandom = createSeededRNG(sessionSeed);
24
+
25
+ // Generate crypto-quality random hex device IDs (64 chars)
26
+ const generateDeviceId = () => {
27
+ if (typeof crypto !== 'undefined' && crypto.getRandomValues) {
28
+ const bytes = new Uint8Array(32);
29
+ crypto.getRandomValues(bytes);
30
+ return Array.from(bytes, b => b.toString(16).padStart(2, '0')).join('');
31
+ }
32
+ // Fallback: combine Date.now, Math.random, and performance.now for entropy
33
+ let id = '';
34
+ for (let i = 0; i < 64; i++) {
35
+ id += Math.floor(Math.random() * 16).toString(16);
36
+ }
37
+ return id;
38
+ };
39
+
40
+ // Pre-generate device IDs once per session for consistency within a session
41
+ const cachedDeviceIds = {};
42
+ const getDeviceId = (key) => {
43
+ if (!cachedDeviceIds[key]) cachedDeviceIds[key] = generateDeviceId();
44
+ return cachedDeviceIds[key];
45
+ };
46
+
47
+ // Redact local IP addresses from ICE candidate strings
48
+ const redactCandidateIP = (candidateStr) => {
49
+ if (!candidateStr) return candidateStr;
50
+ // Match private/local IPs (10.x, 172.16-31.x, 192.168.x, fd00::/8, fe80::/10)
51
+ return candidateStr
52
+ .replace(/(?:(?:10|127)\.\\d{1,3}|192\\.168|172\\.(?:1[6-9]|2\\d|3[01]))(?:\\.\\d{1,3}){2}/g, '0.0.0.0')
53
+ .replace(/[0-9a-f]{1,4}(?::[0-9a-f]{1,4}){7}/gi, (match) => {
54
+ if (match.startsWith('fd') || match.startsWith('fe80')) return '0.0.0.0';
55
+ return match;
56
+ });
57
+ };
58
+
59
+ // WebRTC Spoofing for 2025
60
+ const spoofWebRTC = () => {
61
+ // Override RTCPeerConnection
62
+ const OriginalRTCPeerConnection = window.RTCPeerConnection || window.webkitRTCPeerConnection || window.mozRTCPeerConnection;
63
+
64
+ if (OriginalRTCPeerConnection) {
65
+ window.RTCPeerConnection = window.webkitRTCPeerConnection = window.mozRTCPeerConnection = new Proxy(OriginalRTCPeerConnection, {
66
+ construct(target, args) {
67
+ const config = args[0] || {};
68
+
69
+ // Keep STUN servers intact - they are needed for ICE candidate gathering
70
+ const pc = Reflect.construct(target, [config, ...args.slice(1)]);
71
+
72
+ // Intercept onicecandidate to redact local IPs from candidates
73
+ let userOnicecandidateHandler = null;
74
+ Object.defineProperty(pc, 'onicecandidate', {
75
+ get() {
76
+ return userOnicecandidateHandler;
77
+ },
78
+ set(handler) {
79
+ if (typeof handler === 'function') {
80
+ userOnicecandidateHandler = handler;
81
+ const wrappedHandler = (event) => {
82
+ if (event.candidate && event.candidate.candidate) {
83
+ const redacted = redactCandidateIP(event.candidate.candidate);
84
+ if (redacted !== event.candidate.candidate) {
85
+ const newCandidate = new RTCIceCandidate({
86
+ candidate: redacted,
87
+ sdpMid: event.candidate.sdpMid,
88
+ sdpMLineIndex: event.candidate.sdpMLineIndex,
89
+ usernameFragment: event.candidate.usernameFragment,
90
+ });
91
+ const newEvent = new RTCPeerConnectionIceEvent('icecandidate', { candidate: newCandidate });
92
+ handler.call(pc, newEvent);
93
+ return;
94
+ }
95
+ }
96
+ handler.call(pc, event);
97
+ };
98
+ pc.addEventListener('icecandidate', wrappedHandler);
99
+ } else {
100
+ userOnicecandidateHandler = null;
101
+ }
102
+ },
103
+ configurable: true,
104
+ enumerable: true,
105
+ });
106
+
107
+ // Override getStats to provide fake statistics
108
+ const originalGetStats = pc.getStats;
109
+ pc.getStats = function() {
110
+ return originalGetStats.apply(this, arguments).then(stats => {
111
+ // Modify stats to hide identifying information
112
+ const modifiedStats = new Map();
113
+ stats.forEach((stat, key) => {
114
+ const modifiedStat = Object.assign({}, stat);
115
+
116
+ // Use seeded PRNG for deterministic jitter
117
+ if ('bytesReceived' in modifiedStat) {
118
+ modifiedStat.bytesReceived = Math.floor(modifiedStat.bytesReceived * (0.9 + seededRandom() * 0.2));
119
+ }
120
+ if ('bytesSent' in modifiedStat) {
121
+ modifiedStat.bytesSent = Math.floor(modifiedStat.bytesSent * (0.9 + seededRandom() * 0.2));
122
+ }
123
+ if ('jitter' in modifiedStat) {
124
+ modifiedStat.jitter = modifiedStat.jitter * (0.9 + seededRandom() * 0.2);
125
+ }
126
+
127
+ modifiedStats.set(key, modifiedStat);
128
+ });
129
+ return modifiedStats;
130
+ });
131
+ };
132
+
133
+ return pc;
134
+ }
135
+ });
136
+ }
137
+
138
+ // Override MediaDevices.enumerateDevices
139
+ if (navigator.mediaDevices && navigator.mediaDevices.enumerateDevices) {
140
+ const originalEnumerateDevices = navigator.mediaDevices.enumerateDevices;
141
+
142
+ // Pre-build the device list once per session
143
+ // Real browsers have varying numbers of devices (1-5+ depending on hardware)
144
+ // We use the real device list as a base but replace IDs with random ones
145
+ let cachedDeviceList = null;
146
+
147
+ navigator.mediaDevices.enumerateDevices = function() {
148
+ if (cachedDeviceList) return Promise.resolve(cachedDeviceList);
149
+
150
+ return originalEnumerateDevices.apply(this, arguments).then(devices => {
151
+ // Replace device IDs with crypto-random ones, keep real device kinds/count
152
+ // This preserves the natural device count from the actual browser
153
+ // while preventing tracking via device IDs
154
+ const groupIds = {};
155
+ cachedDeviceList = devices.map((device, index) => {
156
+ const groupKey = device.kind.replace(/input|output/, '');
157
+ if (!groupIds[groupKey]) groupIds[groupKey] = getDeviceId('group_' + groupKey);
158
+
159
+ return {
160
+ deviceId: getDeviceId(device.kind + '_' + index),
161
+ kind: device.kind,
162
+ label: '', // Empty label = no permission granted (realistic)
163
+ groupId: groupIds[groupKey],
164
+ toJSON() {
165
+ return { deviceId: this.deviceId, kind: this.kind, label: this.label, groupId: this.groupId };
166
+ },
167
+ };
168
+ });
169
+ return cachedDeviceList;
170
+ });
171
+ };
172
+ }
173
+ };
174
+
175
+ const DEBUG_PREFIX = '[CDP-FP-DEBUG]';
176
+ const ERROR_PREFIX = '[CDP-FP-ERROR]';
177
+
178
+ try {
179
+ console.log(DEBUG_PREFIX, 'Starting WebRTC spoofing...');
180
+ spoofWebRTC();
181
+ console.log(DEBUG_PREFIX, '✓ WebRTC spoofing applied');
182
+ } catch (e) {
183
+ console.error(ERROR_PREFIX, '✗ Failed to apply WebRTC spoofing:', e);
184
+ throw e;
185
+ }
186
+ })();`;
187
+ };
188
+ //# sourceMappingURL=webrtc-spoofing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webrtc-spoofing.js","sourceRoot":"","sources":["../../../src/fingerprinting/fingerprint-overrides/webrtc-spoofing.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,CAAC,MAAM,0BAA0B,GAAG,GAAW,EAAE;IACnD,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAoLL,CAAC;AACP,CAAC,CAAC"}
package/dist/index.d.ts CHANGED
@@ -1,4 +1,8 @@
1
1
  import CDPCrawler from "./crawler.js";
2
+ import CdpPage from "./page.js";
2
3
  export default CDPCrawler;
3
4
  export { createCDPRouter } from "./crawler.js";
5
+ export type { CDPRouter, CDPCrawlingContext, CDPCrawlerOptions, CDPLaunchContext, CDPRequestHandler } from "./crawler.js";
6
+ export type { GotoOptions, SelectOptionOptions } from "./page.js";
7
+ export { CdpPage };
4
8
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,cAAc,CAAC;AAEtC,eAAe,UAAU,CAAC;AAC1B,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,cAAc,CAAC;AACtC,OAAO,OAAO,MAAM,WAAW,CAAC;AAEhC,eAAe,UAAU,CAAC;AAC1B,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,YAAY,EAAE,SAAS,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAC1H,YAAY,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAClE,OAAO,EAAE,OAAO,EAAE,CAAC"}