jumpy-lion 0.0.33 → 0.0.34

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 (120) hide show
  1. package/dist/browser-controller.d.ts +2 -2
  2. package/dist/browser-controller.d.ts.map +1 -1
  3. package/dist/browser-controller.js +34 -5
  4. package/dist/browser-controller.js.map +1 -1
  5. package/dist/browser-plugin.d.ts +21 -0
  6. package/dist/browser-plugin.d.ts.map +1 -1
  7. package/dist/browser-plugin.js +10 -4
  8. package/dist/browser-plugin.js.map +1 -1
  9. package/dist/browser-process/browser.d.ts +15 -0
  10. package/dist/browser-process/browser.d.ts.map +1 -1
  11. package/dist/browser-process/browser.js +6 -3
  12. package/dist/browser-process/browser.js.map +1 -1
  13. package/dist/crawler.d.ts +15 -0
  14. package/dist/crawler.d.ts.map +1 -1
  15. package/dist/crawler.js.map +1 -1
  16. package/dist/fingerprinting/anti-webgpu/background.d.ts +2 -0
  17. package/dist/fingerprinting/anti-webgpu/background.d.ts.map +1 -0
  18. package/dist/fingerprinting/anti-webgpu/background.js +6 -0
  19. package/dist/fingerprinting/anti-webgpu/background.js.map +1 -0
  20. package/dist/fingerprinting/anti-webgpu/data/content_script/inject.d.ts +2 -0
  21. package/dist/fingerprinting/anti-webgpu/data/content_script/inject.d.ts.map +1 -0
  22. package/dist/fingerprinting/anti-webgpu/data/content_script/inject.js +50 -0
  23. package/dist/fingerprinting/anti-webgpu/data/content_script/inject.js.map +1 -0
  24. package/dist/fingerprinting/anti-webgpu/data/content_script/page_context/inject.d.ts +2 -0
  25. package/dist/fingerprinting/anti-webgpu/data/content_script/page_context/inject.d.ts.map +1 -0
  26. package/dist/fingerprinting/anti-webgpu/data/content_script/page_context/inject.js +179 -0
  27. package/dist/fingerprinting/anti-webgpu/data/content_script/page_context/inject.js.map +1 -0
  28. package/dist/fingerprinting/anti-webgpu/data/popup/popup.d.ts +2 -0
  29. package/dist/fingerprinting/anti-webgpu/data/popup/popup.d.ts.map +1 -0
  30. package/dist/fingerprinting/anti-webgpu/data/popup/popup.js +95 -0
  31. package/dist/fingerprinting/anti-webgpu/data/popup/popup.js.map +1 -0
  32. package/dist/fingerprinting/anti-webgpu/lib/chrome.d.ts +2 -0
  33. package/dist/fingerprinting/anti-webgpu/lib/chrome.d.ts.map +1 -0
  34. package/dist/fingerprinting/anti-webgpu/lib/chrome.js +255 -0
  35. package/dist/fingerprinting/anti-webgpu/lib/chrome.js.map +1 -0
  36. package/dist/fingerprinting/anti-webgpu/lib/common.d.ts +2 -0
  37. package/dist/fingerprinting/anti-webgpu/lib/common.d.ts.map +1 -0
  38. package/dist/fingerprinting/anti-webgpu/lib/common.js +87 -0
  39. package/dist/fingerprinting/anti-webgpu/lib/common.js.map +1 -0
  40. package/dist/fingerprinting/anti-webgpu/lib/config.d.ts +2 -0
  41. package/dist/fingerprinting/anti-webgpu/lib/config.d.ts.map +1 -0
  42. package/dist/fingerprinting/anti-webgpu/lib/config.js +13 -0
  43. package/dist/fingerprinting/anti-webgpu/lib/config.js.map +1 -0
  44. package/dist/fingerprinting/anti-webgpu/lib/runtime.d.ts +2 -0
  45. package/dist/fingerprinting/anti-webgpu/lib/runtime.d.ts.map +1 -0
  46. package/dist/fingerprinting/anti-webgpu/lib/runtime.js +109 -0
  47. package/dist/fingerprinting/anti-webgpu/lib/runtime.js.map +1 -0
  48. package/dist/fingerprinting/fingerprint-injector.d.ts +85 -1
  49. package/dist/fingerprinting/fingerprint-injector.d.ts.map +1 -1
  50. package/dist/fingerprinting/fingerprint-injector.js +188 -90
  51. package/dist/fingerprinting/fingerprint-injector.js.map +1 -1
  52. package/dist/fingerprinting/fingerprint-overrides/audio-spoofing.d.ts +6 -0
  53. package/dist/fingerprinting/fingerprint-overrides/audio-spoofing.d.ts.map +1 -0
  54. package/dist/fingerprinting/fingerprint-overrides/audio-spoofing.js +87 -0
  55. package/dist/fingerprinting/fingerprint-overrides/audio-spoofing.js.map +1 -0
  56. package/dist/fingerprinting/fingerprint-overrides/canvas-protection.d.ts +6 -0
  57. package/dist/fingerprinting/fingerprint-overrides/canvas-protection.d.ts.map +1 -0
  58. package/dist/fingerprinting/fingerprint-overrides/canvas-protection.js +95 -0
  59. package/dist/fingerprinting/fingerprint-overrides/canvas-protection.js.map +1 -0
  60. package/dist/fingerprinting/fingerprint-overrides/client-rect-spoofing.d.ts +6 -0
  61. package/dist/fingerprinting/fingerprint-overrides/client-rect-spoofing.d.ts.map +1 -0
  62. package/dist/fingerprinting/fingerprint-overrides/client-rect-spoofing.js +96 -0
  63. package/dist/fingerprinting/fingerprint-overrides/client-rect-spoofing.js.map +1 -0
  64. package/dist/fingerprinting/fingerprint-overrides/font-spoofing.d.ts +7 -0
  65. package/dist/fingerprinting/fingerprint-overrides/font-spoofing.d.ts.map +1 -0
  66. package/dist/fingerprinting/fingerprint-overrides/font-spoofing.js +219 -0
  67. package/dist/fingerprinting/fingerprint-overrides/font-spoofing.js.map +1 -0
  68. package/dist/fingerprinting/fingerprint-overrides/index.d.ts +19 -0
  69. package/dist/fingerprinting/fingerprint-overrides/index.d.ts.map +1 -0
  70. package/dist/fingerprinting/fingerprint-overrides/index.js +19 -0
  71. package/dist/fingerprinting/fingerprint-overrides/index.js.map +1 -0
  72. package/dist/fingerprinting/fingerprint-overrides/locale-spoofing.d.ts +6 -0
  73. package/dist/fingerprinting/fingerprint-overrides/locale-spoofing.d.ts.map +1 -0
  74. package/dist/fingerprinting/fingerprint-overrides/locale-spoofing.js +262 -0
  75. package/dist/fingerprinting/fingerprint-overrides/locale-spoofing.js.map +1 -0
  76. package/dist/fingerprinting/fingerprint-overrides/mouse-humanization.d.ts +7 -0
  77. package/dist/fingerprinting/fingerprint-overrides/mouse-humanization.d.ts.map +1 -0
  78. package/dist/fingerprinting/fingerprint-overrides/mouse-humanization.js +103 -0
  79. package/dist/fingerprinting/fingerprint-overrides/mouse-humanization.js.map +1 -0
  80. package/dist/fingerprinting/fingerprint-overrides/performance-spoofing.d.ts +6 -0
  81. package/dist/fingerprinting/fingerprint-overrides/performance-spoofing.d.ts.map +1 -0
  82. package/dist/fingerprinting/fingerprint-overrides/performance-spoofing.js +228 -0
  83. package/dist/fingerprinting/fingerprint-overrides/performance-spoofing.js.map +1 -0
  84. package/dist/fingerprinting/fingerprint-overrides/platform-consistency.d.ts +20 -0
  85. package/dist/fingerprinting/fingerprint-overrides/platform-consistency.d.ts.map +1 -0
  86. package/dist/fingerprinting/fingerprint-overrides/platform-consistency.js +227 -0
  87. package/dist/fingerprinting/fingerprint-overrides/platform-consistency.js.map +1 -0
  88. package/dist/fingerprinting/fingerprint-overrides/runtime-enable-bypass.d.ts +6 -0
  89. package/dist/fingerprinting/fingerprint-overrides/runtime-enable-bypass.d.ts.map +1 -0
  90. package/dist/fingerprinting/fingerprint-overrides/runtime-enable-bypass.js +84 -0
  91. package/dist/fingerprinting/fingerprint-overrides/runtime-enable-bypass.js.map +1 -0
  92. package/dist/fingerprinting/fingerprint-overrides/stealth-script.d.ts +6 -0
  93. package/dist/fingerprinting/fingerprint-overrides/stealth-script.d.ts.map +1 -0
  94. package/dist/fingerprinting/fingerprint-overrides/stealth-script.js +440 -0
  95. package/dist/fingerprinting/fingerprint-overrides/stealth-script.js.map +1 -0
  96. package/dist/fingerprinting/fingerprint-overrides/ua-ch.d.ts +6 -0
  97. package/dist/fingerprinting/fingerprint-overrides/ua-ch.d.ts.map +1 -0
  98. package/dist/fingerprinting/fingerprint-overrides/ua-ch.js +95 -0
  99. package/dist/fingerprinting/fingerprint-overrides/ua-ch.js.map +1 -0
  100. package/dist/fingerprinting/fingerprint-overrides/webgl-spoofing.d.ts +12 -0
  101. package/dist/fingerprinting/fingerprint-overrides/webgl-spoofing.d.ts.map +1 -0
  102. package/dist/fingerprinting/fingerprint-overrides/webgl-spoofing.js +167 -0
  103. package/dist/fingerprinting/fingerprint-overrides/webgl-spoofing.js.map +1 -0
  104. package/dist/fingerprinting/fingerprint-overrides/webgpu-spoofing.d.ts +6 -0
  105. package/dist/fingerprinting/fingerprint-overrides/webgpu-spoofing.d.ts.map +1 -0
  106. package/dist/fingerprinting/fingerprint-overrides/webgpu-spoofing.js +205 -0
  107. package/dist/fingerprinting/fingerprint-overrides/webgpu-spoofing.js.map +1 -0
  108. package/dist/fingerprinting/fingerprint-overrides/webrtc-spoofing.d.ts +6 -0
  109. package/dist/fingerprinting/fingerprint-overrides/webrtc-spoofing.d.ts.map +1 -0
  110. package/dist/fingerprinting/fingerprint-overrides/webrtc-spoofing.js +96 -0
  111. package/dist/fingerprinting/fingerprint-overrides/webrtc-spoofing.js.map +1 -0
  112. package/dist/index.d.ts +3 -2
  113. package/dist/index.d.ts.map +1 -1
  114. package/dist/index.js.map +1 -1
  115. package/dist/page.d.ts +1 -0
  116. package/dist/page.d.ts.map +1 -1
  117. package/dist/page.js +42 -1
  118. package/dist/page.js.map +1 -1
  119. package/dist/tsconfig.build.tsbuildinfo +1 -1
  120. package/package.json +5 -3
@@ -0,0 +1,167 @@
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
+ ` : `
24
+ // Detect platform from navigator
25
+ const platform = navigator.platform || 'Linux x86_64';
26
+
27
+ // Platform-specific GPU configurations
28
+ const gpuConfigs = {
29
+ 'Win32': {
30
+ vendors: ['NVIDIA Corporation', 'AMD', 'Intel Inc.'],
31
+ renderers: [
32
+ 'ANGLE (NVIDIA, NVIDIA GeForce GTX 1660 Ti Direct3D11 vs_5_0 ps_5_0, D3D11)',
33
+ 'ANGLE (NVIDIA, NVIDIA GeForce RTX 3060 Direct3D11 vs_5_0 ps_5_0, D3D11)',
34
+ 'ANGLE (AMD, AMD Radeon RX 6600 Direct3D11 vs_5_0 ps_5_0, D3D11)',
35
+ 'ANGLE (Intel, Intel(R) UHD Graphics 630 Direct3D11 vs_5_0 ps_5_0, D3D11)',
36
+ ],
37
+ },
38
+ 'MacIntel': {
39
+ vendors: ['Apple Inc.', 'Intel Inc.', 'AMD'],
40
+ renderers: [
41
+ 'ANGLE (Apple, Apple M1 Pro, OpenGL 4.1)',
42
+ 'ANGLE (Apple, Apple M2, OpenGL 4.1)',
43
+ 'ANGLE (Intel Inc., Intel(R) Iris(TM) Plus Graphics OpenGL Engine, OpenGL 4.1)',
44
+ 'ANGLE (AMD, AMD Radeon Pro 5500M OpenGL Engine, OpenGL 4.1)',
45
+ ],
46
+ },
47
+ 'Linux x86_64': {
48
+ vendors: ['Intel', 'NVIDIA Corporation', 'AMD'],
49
+ renderers: [
50
+ 'ANGLE (Intel, Mesa Intel(R) UHD Graphics 630 (CFL GT2), OpenGL 4.6)',
51
+ 'ANGLE (NVIDIA, NVIDIA GeForce GTX 1660 Ti/PCIe/SSE2, OpenGL 4.6)',
52
+ 'ANGLE (AMD, AMD Radeon RX 6600 (NAVY_FLOUNDER, DRM 3.42.0, 5.15.0-56-generic, LLVM 12.0.0), OpenGL 4.6)',
53
+ 'ANGLE (Intel, Mesa Intel(R) Xe Graphics (TGL GT2), OpenGL 4.6)',
54
+ ],
55
+ },
56
+ };
57
+
58
+ const config = gpuConfigs[platform] || gpuConfigs['Linux x86_64'];
59
+ const selectedVendor = config.vendors[Math.floor(Math.random() * config.vendors.length)];
60
+ const selectedRenderer = config.renderers.find(r => r.includes(selectedVendor.split(' ')[0])) || config.renderers[0];
61
+ `}
62
+
63
+ // Override getParameter
64
+ WebGLRenderingContext.prototype.getParameter = function(param) {
65
+ // UNMASKED_VENDOR_WEBGL
66
+ if (param === 0x9245) {
67
+ return selectedVendor;
68
+ }
69
+ // UNMASKED_RENDERER_WEBGL
70
+ if (param === 0x9246) {
71
+ return selectedRenderer;
72
+ }
73
+ // Standard WebGL parameters - use fingerprint values if available
74
+ if (param === 0x1F00) { // VENDOR
75
+ return ${useFingerprint && fingerprintWebGL?.vendor ? `'${fingerprintWebGL.vendor}'` : "'WebKit'"};
76
+ }
77
+ if (param === 0x1F01) { // RENDERER
78
+ return ${useFingerprint && fingerprintWebGL?.renderer ? `'${fingerprintWebGL.renderer}'` : "'WebKit WebGL'"};
79
+ }
80
+ if (param === 0x1F02) { // VERSION
81
+ return 'WebGL 1.0 (OpenGL ES 2.0 Chromium)';
82
+ }
83
+ // MAX_TEXTURE_SIZE
84
+ if (param === 0x0D33) {
85
+ return 16384;
86
+ }
87
+ // MAX_VIEWPORT_DIMS
88
+ if (param === 0x0D3A) {
89
+ return new Int32Array([32767, 32767]);
90
+ }
91
+
92
+ return getParameterProto.apply(this, arguments);
93
+ };
94
+
95
+ // Also apply to WebGL2
96
+ if (typeof WebGL2RenderingContext !== 'undefined') {
97
+ WebGL2RenderingContext.prototype.getParameter = function(param) {
98
+ // For WebGL2, return appropriate version
99
+ if (param === 0x1F02) { // VERSION
100
+ return 'WebGL 2.0 (OpenGL ES 3.0 Chromium)';
101
+ }
102
+ // Use same logic as WebGL1 for other params
103
+ return WebGLRenderingContext.prototype.getParameter.call(this, param);
104
+ };
105
+ }
106
+
107
+ // Override getSupportedExtensions with platform-appropriate extensions
108
+ const baseExtensions = [
109
+ 'ANGLE_instanced_arrays', 'EXT_blend_minmax', 'EXT_color_buffer_half_float',
110
+ 'EXT_disjoint_timer_query', 'EXT_float_blend', 'EXT_frag_depth',
111
+ 'EXT_shader_texture_lod', 'EXT_texture_compression_rgtc',
112
+ 'EXT_texture_filter_anisotropic', 'EXT_sRGB', 'KHR_parallel_shader_compile',
113
+ 'OES_element_index_uint', 'OES_fbo_render_mipmap', 'OES_standard_derivatives',
114
+ 'OES_texture_float', 'OES_texture_float_linear', 'OES_texture_half_float',
115
+ 'OES_texture_half_float_linear', 'OES_vertex_array_object', 'WEBGL_color_buffer_float',
116
+ 'WEBGL_compressed_texture_s3tc', 'WEBGL_compressed_texture_s3tc_srgb',
117
+ 'WEBGL_debug_renderer_info', 'WEBGL_debug_shaders', 'WEBGL_depth_texture',
118
+ 'WEBGL_draw_buffers', 'WEBGL_lose_context', 'WEBGL_multi_draw'
119
+ ];
120
+
121
+ ${!useFingerprint ? `
122
+ // Add platform-specific extensions
123
+ const platformExtensions = {
124
+ 'Win32': ['EXT_texture_compression_bptc', 'WEBGL_compressed_texture_astc'],
125
+ 'MacIntel': ['WEBGL_compressed_texture_pvrtc', 'WEBKIT_WEBGL_compressed_texture_pvrtc'],
126
+ 'Linux x86_64': ['EXT_texture_compression_bptc'],
127
+ };
128
+
129
+ const allExtensions = [...baseExtensions, ...(platformExtensions[platform] || [])];
130
+ ` : `
131
+ const allExtensions = baseExtensions;
132
+ `}
133
+
134
+ WebGLRenderingContext.prototype.getSupportedExtensions = function() {
135
+ return allExtensions;
136
+ };
137
+
138
+ if (typeof WebGL2RenderingContext !== 'undefined') {
139
+ WebGL2RenderingContext.prototype.getSupportedExtensions = function() {
140
+ return [...allExtensions, 'EXT_color_buffer_float', 'EXT_disjoint_timer_query_webgl2', 'WEBGL_compressed_texture_etc'];
141
+ };
142
+ }
143
+
144
+ // Override getExtension to handle WEBGL_debug_renderer_info properly
145
+ WebGLRenderingContext.prototype.getExtension = function(name) {
146
+ const result = getExtensionProto.apply(this, arguments);
147
+
148
+ if (name === 'WEBGL_debug_renderer_info' && result) {
149
+ // Return the extension but ensure our spoofed values are used
150
+ return {
151
+ UNMASKED_VENDOR_WEBGL: 0x9245,
152
+ UNMASKED_RENDERER_WEBGL: 0x9246,
153
+ };
154
+ }
155
+
156
+ return result;
157
+ };
158
+
159
+ if (typeof WebGL2RenderingContext !== 'undefined') {
160
+ WebGL2RenderingContext.prototype.getExtension = WebGLRenderingContext.prototype.getExtension;
161
+ }
162
+ };
163
+
164
+ spoofWebGL();
165
+ })();`;
166
+ };
167
+ //# 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;;;SAG3D,CAAC,CAAC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;SAsCH;;;;;;;;;;;;;;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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAiCH,CAAC;AACP,CAAC,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * WebGPU Fingerprinting Protection
3
+ * Spoofs GPU adapter information and fakes GPU uptime
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,MAuMrE,CAAC"}
@@ -0,0 +1,205 @@
1
+ /**
2
+ * WebGPU Fingerprinting Protection
3
+ * Spoofs GPU adapter information and fakes GPU uptime
4
+ */
5
+ export const createWebGPUSpoofingScript = (experimentalMode = false) => {
6
+ return `
7
+ (() => {
8
+ 'use strict';
9
+
10
+ // WebGPU Fingerprinting Protection for 2025
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
+ // Fake GPU uptime - make it look like the GPU has been running for hours/days
26
+ const fakeGPUStartTime = Date.now() - (Math.random() * 48 + 24) * 60 * 60 * 1000; // 24-72 hours ago
27
+
28
+ if ('GPU' in window && window.GPU) {
29
+ const OriginalGPU = window.GPU;
30
+
31
+ // Override requestAdapter to provide consistent fake adapter info
32
+ window.GPU = new Proxy(OriginalGPU, {
33
+ get(target, prop) {
34
+ if (prop === 'requestAdapter') {
35
+ return async function(options) {
36
+ const adapter = await target.requestAdapter.call(target, options);
37
+ if (!adapter) return null;
38
+
39
+ // Wrap the adapter to provide fake but consistent info
40
+ return new Proxy(adapter, {
41
+ get(adapterTarget, adapterProp) {
42
+ if (adapterProp === 'name') {
43
+ // Return a common GPU name based on platform
44
+ const gpuNames = [
45
+ 'NVIDIA GeForce RTX 3060',
46
+ 'NVIDIA GeForce GTX 1660 Ti',
47
+ 'AMD Radeon RX 6600',
48
+ 'Intel(R) UHD Graphics 630',
49
+ 'Apple M1',
50
+ ];
51
+ return gpuNames[Math.floor(Math.random() * gpuNames.length)];
52
+ }
53
+
54
+ if (adapterProp === 'features') {
55
+ // Return a consistent set of features
56
+ const fakeFeatures = new Set([
57
+ 'depth-clip-control',
58
+ 'depth32float-stencil8',
59
+ 'texture-compression-bc',
60
+ 'texture-compression-etc2',
61
+ 'texture-compression-astc',
62
+ 'timestamp-query',
63
+ 'indirect-first-instance',
64
+ 'shader-f16',
65
+ 'rg11b10ufloat-renderable',
66
+ 'bgra8unorm-storage',
67
+ 'float32-filterable',
68
+ ]);
69
+
70
+ return new Proxy(adapterTarget.features || fakeFeatures, {
71
+ get(featuresTarget, featuresProp) {
72
+ if (featuresProp === 'has') {
73
+ return (feature) => fakeFeatures.has(feature);
74
+ }
75
+ if (featuresProp === 'size') {
76
+ return fakeFeatures.size;
77
+ }
78
+ if (featuresProp === Symbol.iterator) {
79
+ return fakeFeatures[Symbol.iterator].bind(fakeFeatures);
80
+ }
81
+ return Reflect.get(featuresTarget, featuresProp);
82
+ }
83
+ });
84
+ }
85
+
86
+ if (adapterProp === 'limits') {
87
+ // Return realistic GPU limits
88
+ return {
89
+ maxTextureDimension1D: 16384,
90
+ maxTextureDimension2D: 16384,
91
+ maxTextureDimension3D: 2048,
92
+ maxTextureArrayLayers: 2048,
93
+ maxBindGroups: 4,
94
+ maxBindGroupsPlusVertexBuffers: 24,
95
+ maxBindingsPerBindGroup: 1000,
96
+ maxDynamicUniformBuffersPerPipelineLayout: 8,
97
+ maxDynamicStorageBuffersPerPipelineLayout: 4,
98
+ maxSampledTexturesPerShaderStage: 16,
99
+ maxSamplersPerShaderStage: 16,
100
+ maxStorageBuffersPerShaderStage: 8,
101
+ maxStorageTexturesPerShaderStage: 4,
102
+ maxUniformBuffersPerShaderStage: 12,
103
+ maxUniformBufferBindingSize: 65536,
104
+ maxStorageBufferBindingSize: 134217728,
105
+ minUniformBufferOffsetAlignment: 256,
106
+ minStorageBufferOffsetAlignment: 256,
107
+ maxVertexBuffers: 8,
108
+ maxBufferSize: 268435456,
109
+ maxVertexAttributes: 16,
110
+ maxVertexBufferArrayStride: 2048,
111
+ maxInterStageShaderComponents: 60,
112
+ maxInterStageShaderVariables: 16,
113
+ maxColorAttachments: 8,
114
+ maxColorAttachmentBytesPerSample: 32,
115
+ maxComputeWorkgroupStorageSize: 16384,
116
+ maxComputeInvocationsPerWorkgroup: 256,
117
+ maxComputeWorkgroupSizeX: 256,
118
+ maxComputeWorkgroupSizeY: 256,
119
+ maxComputeWorkgroupSizeZ: 64,
120
+ maxComputeWorkgroupsPerDimension: 65535,
121
+ };
122
+ }
123
+
124
+ if (adapterProp === 'requestDevice') {
125
+ return async function(descriptor) {
126
+ const device = await adapterTarget.requestDevice.call(adapterTarget, descriptor);
127
+ if (!device) return null;
128
+
129
+ // Wrap the device to intercept timing queries
130
+ return new Proxy(device, {
131
+ get(deviceTarget, deviceProp) {
132
+ if (deviceProp === 'createQuerySet') {
133
+ return function(descriptor) {
134
+ const querySet = deviceTarget.createQuerySet.call(deviceTarget, descriptor);
135
+
136
+ // If it's a timestamp query, we need to fake the results
137
+ if (descriptor.type === 'timestamp') {
138
+ return new Proxy(querySet, {
139
+ get(queryTarget, queryProp) {
140
+ // Intercept resolve operations to fake timestamps
141
+ return Reflect.get(queryTarget, queryProp);
142
+ }
143
+ });
144
+ }
145
+
146
+ return querySet;
147
+ };
148
+ }
149
+
150
+ return Reflect.get(deviceTarget, deviceProp);
151
+ }
152
+ });
153
+ };
154
+ }
155
+
156
+ return Reflect.get(adapterTarget, adapterProp);
157
+ }
158
+ });
159
+ };
160
+ }
161
+
162
+ if (prop === 'getPreferredCanvasFormat') {
163
+ return function() {
164
+ // Return the most common format
165
+ return 'bgra8unorm';
166
+ };
167
+ }
168
+
169
+ return Reflect.get(target, prop);
170
+ }
171
+ });
172
+ }
173
+
174
+ // Override performance.now() to fake GPU uptime when called from WebGPU context
175
+ const originalPerformanceNow = performance.now;
176
+ performance.now = function() {
177
+ const stack = new Error().stack;
178
+
179
+ // Check if called from WebGPU context
180
+ if (stack && (stack.includes('GPU') || stack.includes('WebGPU') || stack.includes('gpu'))) {
181
+ // Return a time that makes it look like GPU has been running for a while
182
+ const currentTime = originalPerformanceNow.call(this);
183
+ const fakeUptime = Date.now() - fakeGPUStartTime;
184
+ return Math.min(currentTime, fakeUptime);
185
+ }
186
+
187
+ return originalPerformanceNow.call(this);
188
+ };
189
+
190
+ // Override GPU timing-related APIs
191
+ if (window.GPUCommandEncoder) {
192
+ const originalWriteTimestamp = GPUCommandEncoder.prototype.writeTimestamp;
193
+ if (originalWriteTimestamp) {
194
+ GPUCommandEncoder.prototype.writeTimestamp = function(querySet, queryIndex) {
195
+ // Call original but the query results will be intercepted elsewhere
196
+ return originalWriteTimestamp.call(this, querySet, queryIndex);
197
+ };
198
+ }
199
+ }
200
+ };
201
+
202
+ spoofWebGPU();
203
+ })();`;
204
+ };
205
+ //# 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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAqLR,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,MA0F7C,CAAC"}
@@ -0,0 +1,96 @@
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
+ // WebRTC Spoofing for 2025
11
+ const spoofWebRTC = () => {
12
+ // Override RTCPeerConnection
13
+ const OriginalRTCPeerConnection = window.RTCPeerConnection || window.webkitRTCPeerConnection || window.mozRTCPeerConnection;
14
+
15
+ if (OriginalRTCPeerConnection) {
16
+ window.RTCPeerConnection = window.webkitRTCPeerConnection = window.mozRTCPeerConnection = new Proxy(OriginalRTCPeerConnection, {
17
+ construct(target, args) {
18
+ const config = args[0] || {};
19
+
20
+ // Modify ICE servers to prevent IP leaks
21
+ if (config.iceServers) {
22
+ config.iceServers = config.iceServers.filter(server => {
23
+ // Remove STUN servers that might leak IP
24
+ if (server.urls) {
25
+ if (Array.isArray(server.urls)) {
26
+ server.urls = server.urls.filter(url => !url.includes('stun:'));
27
+ } else if (typeof server.urls === 'string' && server.urls.includes('stun:')) {
28
+ return false;
29
+ }
30
+ }
31
+ return true;
32
+ });
33
+ }
34
+
35
+ const pc = Reflect.construct(target, [config, ...args.slice(1)]);
36
+
37
+ // Override createDataChannel to prevent fingerprinting
38
+ const originalCreateDataChannel = pc.createDataChannel;
39
+ pc.createDataChannel = function(label, options) {
40
+ // Add random ID to make fingerprinting harder
41
+ const modifiedLabel = label + '_' + Math.random().toString(36).substr(2, 9);
42
+ return originalCreateDataChannel.call(this, modifiedLabel, options);
43
+ };
44
+
45
+ // Override getStats to provide fake statistics
46
+ const originalGetStats = pc.getStats;
47
+ pc.getStats = function() {
48
+ return originalGetStats.apply(this, arguments).then(stats => {
49
+ // Modify stats to hide identifying information
50
+ const modifiedStats = new Map();
51
+ stats.forEach((stat, key) => {
52
+ const modifiedStat = Object.assign({}, stat);
53
+
54
+ // Randomize some values
55
+ if ('bytesReceived' in modifiedStat) {
56
+ modifiedStat.bytesReceived = Math.floor(modifiedStat.bytesReceived * (0.9 + Math.random() * 0.2));
57
+ }
58
+ if ('bytesSent' in modifiedStat) {
59
+ modifiedStat.bytesSent = Math.floor(modifiedStat.bytesSent * (0.9 + Math.random() * 0.2));
60
+ }
61
+ if ('jitter' in modifiedStat) {
62
+ modifiedStat.jitter = modifiedStat.jitter * (0.9 + Math.random() * 0.2);
63
+ }
64
+
65
+ modifiedStats.set(key, modifiedStat);
66
+ });
67
+ return modifiedStats;
68
+ });
69
+ };
70
+
71
+ return pc;
72
+ }
73
+ });
74
+ }
75
+
76
+ // Override MediaDevices.enumerateDevices
77
+ if (navigator.mediaDevices && navigator.mediaDevices.enumerateDevices) {
78
+ const originalEnumerateDevices = navigator.mediaDevices.enumerateDevices;
79
+ navigator.mediaDevices.enumerateDevices = function() {
80
+ return originalEnumerateDevices.apply(this, arguments).then(devices => {
81
+ // Provide fake but consistent device IDs
82
+ return devices.map((device, index) => ({
83
+ deviceId: 'device_' + device.kind + '_' + index,
84
+ kind: device.kind,
85
+ label: device.label || '',
86
+ groupId: 'group_' + Math.floor(index / 2),
87
+ }));
88
+ });
89
+ };
90
+ }
91
+ };
92
+
93
+ spoofWebRTC();
94
+ })();`;
95
+ };
96
+ //# 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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAwFL,CAAC;AACP,CAAC,CAAC"}
package/dist/index.d.ts CHANGED
@@ -1,7 +1,8 @@
1
1
  import CDPCrawler from "./crawler.js";
2
2
  import CdpPage from "./page.js";
3
3
  export default CDPCrawler;
4
- export { createCDPRouter, CDPRouter } from "./crawler.js";
5
- export { GotoOptions } from "./page.js";
4
+ export { createCDPRouter } from "./crawler.js";
5
+ export type { CDPRouter } from "./crawler.js";
6
+ export type { GotoOptions } from "./page.js";
6
7
  export { CdpPage };
7
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;AACtC,OAAO,OAAO,MAAM,WAAW,CAAC;AAEhC,eAAe,UAAU,CAAC;AAC1B,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,OAAO,EAAE,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,MAAM,cAAc,CAAC;AAC9C,YAAY,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,CAAC"}
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","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,EAAa,MAAM,cAAc,CAAC;AAE1D,OAAO,EAAE,OAAO,EAAE,CAAC"}
1
+ {"version":3,"file":"index.js","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;AAG/C,OAAO,EAAE,OAAO,EAAE,CAAC"}
package/dist/page.d.ts CHANGED
@@ -79,6 +79,7 @@ export default class CdpPage extends EventEmitter {
79
79
  getTextContent(selector: string): Promise<string>;
80
80
  getHref(selector: string): Promise<string>;
81
81
  scrollIntoView(selector: string): Promise<void>;
82
+ setupFetchMetadataHeaders(): Promise<void>;
82
83
  blockRequests(urlPatterns: string[]): Promise<void>;
83
84
  private getNodeId;
84
85
  setCookies(cookies: Cookie[]): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"page.d.ts","sourceRoot":"","sources":["../src/page.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"page.d.ts","sourceRoot":"","sources":["../src/page.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAGtC,OAAO,GAAG,MAAM,yBAAyB,CAAC;AAK1C,MAAM,WAAW,sBAAsB;IACnC,UAAU,EAAE,MAAM,GAAG,MAAM,CAAC;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,QAAQ;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,MAAM;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,QAAQ,GAAG,KAAK,GAAG,MAAM,CAAC;CACxC;AACD,MAAM,WAAW,WAAW;IACxB,SAAS,CAAC,EAAE,kBAAkB,GAAG,MAAM,CAAC;IACxC,OAAO,CAAC,EAAE,MAAM,CAAC;CAEpB;AACD,MAAM,WAAW,cAAc;IAC3B,MAAM,EAAE,GAAG,CAAC;IACZ,gBAAgB,CAAC,EAAE;QACf,IAAI,EAAE,MAAM,CAAC;KAChB,CAAC;CACL;AAoGD,MAAM,CAAC,OAAO,OAAO,OAAQ,SAAQ,YAAY;IAC7C,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC;IAChB,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC;IAC1B,OAAO,CAAC,SAAS,CAAuB;IACxC,cAAc,UAAS;IACvB,OAAO,CAAC,cAAc,CAAqB;IAC3C,OAAO,CAAC,iBAAiB,CAAC,CAAiB;IAC3C,OAAO,CAAC,QAAQ,CAAS;gBAEb,MAAM,EAAE,GAAG,CAAC,MAAM;IAQ9B,OAAO,CAAC,wBAAwB;WA+BnB,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;YAQ3C,UAAU;IAclB,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC;IAQtB,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAkC7D;;;OAGG;IACG,MAAM,CAAC,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IA8B5C,QAAQ,CAAC,CAAC,EAAE,YAAY,EAAE,QAAQ,GAAG,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC;IA+BxE,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA0BtC,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAevF;;;OAGG;IACG,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ5C,WAAW,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAY9C,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAM9C,mBAAmB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAMnE,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAkBhF,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,GAAE,MAAY,EAAE,OAAO,GAAE,MAAgB,GAAG,OAAO,CAAC,GAAG,CAAC;IA4CnG,UAAU,CAAC,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,KAAK,GAAG,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAqBrG,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC;IAO1B,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC;IAQxC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAQtB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKjD,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IASjD,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAS1C,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAU/C,yBAAyB,IAAI,OAAO,CAAC,IAAI,CAAC;IA2C1C,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;YAuB3C,SAAS;IAWjB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAUlD;;;;;;;;;;QAUI;IACE,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IASpD;;;;;;;OAOG;IACG,MAAM,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC;IAc3H;;;OAGG;YACW,aAAa;IAWpB,gBAAgB,CAAC,OAAO,SAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAiFnD;;;;;OAKG;IACG,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAWtD"}
package/dist/page.js CHANGED
@@ -273,7 +273,7 @@ export default class CdpPage extends EventEmitter {
273
273
  async click(selector) {
274
274
  await Promise.all([
275
275
  this._enableDomain('DOM'),
276
- this._enableDomain('Input')
276
+ this._enableDomain('Input'),
277
277
  ]);
278
278
  const { DOM, Input } = this.client;
279
279
  await this.waitForSelector(selector);
@@ -456,6 +456,47 @@ export default class CdpPage extends EventEmitter {
456
456
  }
457
457
  }, selector);
458
458
  }
459
+ // Add proper Fetch Metadata headers to avoid CDP detection
460
+ async setupFetchMetadataHeaders() {
461
+ const { Network } = this.client;
462
+ await this._enableDomain('Network');
463
+ await Network.setRequestInterception({ patterns: [{ urlPattern: '*' }] });
464
+ Network.on('requestIntercepted', async (params) => {
465
+ const { request, interceptionId } = params;
466
+ const url = new URL(request.url);
467
+ // Add proper fetch metadata headers
468
+ const headers = { ...request.headers };
469
+ // Set sec-fetch-* headers based on request type and destination
470
+ if (request.method === 'GET' && !headers['sec-fetch-dest']) {
471
+ if (url.pathname.endsWith('.js')) {
472
+ headers['sec-fetch-dest'] = 'script';
473
+ headers['sec-fetch-mode'] = 'no-cors';
474
+ headers['sec-fetch-site'] = url.origin === headers.origin ? 'same-origin' : 'cross-site';
475
+ }
476
+ else if (url.pathname.endsWith('.css')) {
477
+ headers['sec-fetch-dest'] = 'style';
478
+ headers['sec-fetch-mode'] = 'no-cors';
479
+ headers['sec-fetch-site'] = url.origin === headers.origin ? 'same-origin' : 'cross-site';
480
+ }
481
+ else if (url.pathname.match(/\.(png|jpg|jpeg|gif|webp|svg)$/i)) {
482
+ headers['sec-fetch-dest'] = 'image';
483
+ headers['sec-fetch-mode'] = 'no-cors';
484
+ headers['sec-fetch-site'] = url.origin === headers.origin ? 'same-origin' : 'cross-site';
485
+ }
486
+ else if (url.pathname === '/' || !url.pathname.includes('.')) {
487
+ headers['sec-fetch-dest'] = 'document';
488
+ headers['sec-fetch-mode'] = 'navigate';
489
+ headers['sec-fetch-site'] = 'none';
490
+ headers['sec-fetch-user'] = '?1';
491
+ }
492
+ }
493
+ // Continue the request with modified headers
494
+ await Network.continueInterceptedRequest({
495
+ interceptionId,
496
+ headers,
497
+ });
498
+ });
499
+ }
459
500
  // Block requests matching URL patterns
460
501
  async blockRequests(urlPatterns) {
461
502
  const { Network } = this.client;