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,103 @@
1
+ /**
2
+ * Mouse Movement Humanization
3
+ * Generates bezier curve movements instead of straight lines
4
+ * Includes automatic human-like interactions after page load
5
+ */
6
+ export const setupMouseMovementHumanization = async (client) => {
7
+ // Override CDP Input domain to add human-like variations
8
+ await client.send('Runtime.evaluate', {
9
+ expression: `
10
+ (() => {
11
+ 'use strict';
12
+
13
+ // Store original mouse position
14
+ let lastX = 0;
15
+ let lastY = 0;
16
+
17
+ // Add bezier curve movement simulation
18
+ window.__humanizeMouseMovement = (fromX, fromY, toX, toY) => {
19
+ const steps = 20 + Math.floor(Math.random() * 10);
20
+ const points = [];
21
+
22
+ // Generate control points for bezier curve
23
+ const cp1x = fromX + (toX - fromX) * 0.25 + (Math.random() - 0.5) * 50;
24
+ const cp1y = fromY + (toY - fromY) * 0.25 + (Math.random() - 0.5) * 50;
25
+ const cp2x = fromX + (toX - fromX) * 0.75 + (Math.random() - 0.5) * 50;
26
+ const cp2y = fromY + (toY - fromY) * 0.75 + (Math.random() - 0.5) * 50;
27
+
28
+ // Calculate bezier curve points
29
+ for (let i = 0; i <= steps; i++) {
30
+ const t = i / steps;
31
+ const t2 = t * t;
32
+ const t3 = t2 * t;
33
+ const mt = 1 - t;
34
+ const mt2 = mt * mt;
35
+ const mt3 = mt2 * mt;
36
+
37
+ const x = mt3 * fromX + 3 * mt2 * t * cp1x + 3 * mt * t2 * cp2x + t3 * toX;
38
+ const y = mt3 * fromY + 3 * mt2 * t * cp1y + 3 * mt * t2 * cp2y + t3 * toY;
39
+
40
+ points.push({ x: Math.round(x), y: Math.round(y) });
41
+ }
42
+
43
+ return points;
44
+ };
45
+
46
+ // Add automatic human-like behavior after page load
47
+ const simulateHumanBehavior = () => {
48
+ setTimeout(() => {
49
+ // Random mouse movement
50
+ const startX = 100 + Math.random() * 200;
51
+ const startY = 100 + Math.random() * 200;
52
+ const endX = 300 + Math.random() * 400;
53
+ const endY = 200 + Math.random() * 300;
54
+
55
+ // Simulate mouse movement event
56
+ const moveEvent = new MouseEvent('mousemove', {
57
+ clientX: startX,
58
+ clientY: startY,
59
+ bubbles: true,
60
+ cancelable: true
61
+ });
62
+ document.dispatchEvent(moveEvent);
63
+
64
+ // Small scroll to simulate user reading
65
+ setTimeout(() => {
66
+ const scrollAmount = 100 + Math.random() * 200;
67
+ window.scrollBy(0, scrollAmount);
68
+
69
+ // Set storage continuity marker
70
+ try {
71
+ const visitHash = btoa(window.location.hostname + Date.now()).substring(0, 16);
72
+ localStorage.setItem('g2_visit', visitHash);
73
+ sessionStorage.setItem('cdp_human_interaction', Date.now().toString());
74
+ } catch (e) {
75
+ // Storage might be disabled
76
+ }
77
+ }, 500 + Math.random() * 1000);
78
+
79
+ }, 1000 + Math.random() * 2000); // 1-3 seconds after load
80
+ };
81
+
82
+ // Trigger human behavior on DOMContentLoaded
83
+ if (document.readyState === 'loading') {
84
+ document.addEventListener('DOMContentLoaded', simulateHumanBehavior);
85
+ } else {
86
+ simulateHumanBehavior();
87
+ }
88
+
89
+ // Also add storage continuity for returning visitors
90
+ window.addEventListener('beforeunload', () => {
91
+ try {
92
+ const currentVisit = localStorage.getItem('g2_visit');
93
+ if (currentVisit) {
94
+ localStorage.setItem('g2_last_visit', currentVisit);
95
+ }
96
+ } catch (e) {
97
+ // Storage might be disabled
98
+ }
99
+ });
100
+ })();`,
101
+ });
102
+ };
103
+ //# sourceMappingURL=mouse-humanization.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mouse-humanization.js","sourceRoot":"","sources":["../../../src/fingerprinting/fingerprint-overrides/mouse-humanization.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,CAAC,MAAM,8BAA8B,GAAG,KAAK,EAAE,MAAW,EAAiB,EAAE;IAC/E,yDAAyD;IACzD,MAAM,MAAM,CAAC,IAAI,CAAC,kBAAkB,EAAE;QAClC,UAAU,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MA2Fd;KACD,CAAC,CAAC;AACP,CAAC,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Performance Spoofing
3
+ * Adjusts timing and memory characteristics to match Windows systems
4
+ */
5
+ export declare const createPerformanceSpoofingScript: () => string;
6
+ //# sourceMappingURL=performance-spoofing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"performance-spoofing.d.ts","sourceRoot":"","sources":["../../../src/fingerprinting/fingerprint-overrides/performance-spoofing.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,eAAO,MAAM,+BAA+B,QAAO,MA8NlD,CAAC"}
@@ -0,0 +1,228 @@
1
+ /**
2
+ * Performance Spoofing
3
+ * Adjusts timing and memory characteristics to match Windows systems
4
+ */
5
+ export const createPerformanceSpoofingScript = () => {
6
+ return `
7
+ (() => {
8
+ 'use strict';
9
+
10
+ // Performance Spoofing for 2025 - Windows-like characteristics
11
+ const spoofPerformance = () => {
12
+ // Store original methods
13
+ const originalNow = performance.now;
14
+ const originalGetEntries = performance.getEntries;
15
+ const originalGetEntriesByType = performance.getEntriesByType;
16
+ const originalGetEntriesByName = performance.getEntriesByName;
17
+
18
+ // Platform-specific timing characteristics
19
+ const platform = navigator.platform || 'Win32';
20
+ let timingOffset = 0;
21
+ let baseTime = originalNow.call(performance);
22
+
23
+ // Windows tends to have slightly different timing precision
24
+ const timingConfig = {
25
+ 'Win32': {
26
+ precision: 0.1, // Windows has 0.1ms precision in many cases
27
+ jitter: 0.05, // Small random variation
28
+ baseOffset: 0 // No offset needed
29
+ },
30
+ 'MacIntel': {
31
+ precision: 0.1,
32
+ jitter: 0.03,
33
+ baseOffset: 1.2
34
+ },
35
+ 'Linux x86_64': {
36
+ precision: 0.001,
37
+ jitter: 0.02,
38
+ baseOffset: 0.8
39
+ }
40
+ };
41
+
42
+ const config = timingConfig[platform] || timingConfig['Win32'];
43
+
44
+ // Spoof performance.now() with Windows-like characteristics
45
+ performance.now = function() {
46
+ const realTime = originalNow.call(performance) - baseTime;
47
+ const adjustedTime = realTime * (1 + config.baseOffset / 100);
48
+
49
+ // Add Windows-like timing jitter and precision
50
+ const jitter = (Math.random() - 0.5) * config.jitter;
51
+ const timeWithJitter = adjustedTime + jitter;
52
+
53
+ // Round to Windows-like precision
54
+ const rounded = Math.round(timeWithJitter / config.precision) * config.precision;
55
+
56
+ return baseTime + rounded;
57
+ };
58
+
59
+ // Spoof memory information to look like Windows
60
+ if (performance.memory) {
61
+ // Windows Chrome typically reports different memory values
62
+ const memoryConfig = {
63
+ 'Win32': {
64
+ usedJSHeapSize: { min: 25000000, variance: 15000000 },
65
+ totalJSHeapSize: { min: 45000000, variance: 25000000 },
66
+ jsHeapSizeLimit: 2172649472 // Typical Windows limit
67
+ },
68
+ 'MacIntel': {
69
+ usedJSHeapSize: { min: 20000000, variance: 12000000 },
70
+ totalJSHeapSize: { min: 40000000, variance: 20000000 },
71
+ jsHeapSizeLimit: 4294705152 // Mac typically has higher limits
72
+ },
73
+ 'Linux x86_64': {
74
+ usedJSHeapSize: { min: 18000000, variance: 10000000 },
75
+ totalJSHeapSize: { min: 35000000, variance: 18000000 },
76
+ jsHeapSizeLimit: 2147483648 // Linux varies more
77
+ }
78
+ };
79
+
80
+ const memConfig = memoryConfig[platform] || memoryConfig['Win32'];
81
+
82
+ // Generate consistent but realistic memory values
83
+ const seed = navigator.userAgent.length + (navigator.platform || '').length;
84
+ const pseudoRandom = (seed * 9301 + 49297) % 233280 / 233280;
85
+
86
+ const fakeMemory = {
87
+ usedJSHeapSize: Math.floor(memConfig.usedJSHeapSize.min +
88
+ pseudoRandom * memConfig.usedJSHeapSize.variance),
89
+ totalJSHeapSize: Math.floor(memConfig.totalJSHeapSize.min +
90
+ pseudoRandom * memConfig.totalJSHeapSize.variance),
91
+ jsHeapSizeLimit: memConfig.jsHeapSizeLimit
92
+ };
93
+
94
+ // Ensure logical consistency
95
+ if (fakeMemory.usedJSHeapSize > fakeMemory.totalJSHeapSize) {
96
+ fakeMemory.totalJSHeapSize = fakeMemory.usedJSHeapSize + 5000000;
97
+ }
98
+
99
+ Object.defineProperty(performance, 'memory', {
100
+ value: fakeMemory,
101
+ writable: false,
102
+ configurable: true
103
+ });
104
+ }
105
+
106
+ // Spoof navigation timing to appear more like Windows
107
+ if (performance.navigation) {
108
+ Object.defineProperty(performance.navigation, 'type', {
109
+ value: 0, // TYPE_NAVIGATE - most common on Windows
110
+ writable: false
111
+ });
112
+
113
+ Object.defineProperty(performance.navigation, 'redirectCount', {
114
+ value: 0,
115
+ writable: false
116
+ });
117
+ }
118
+
119
+ // Spoof timing entries to have Windows-like characteristics
120
+ performance.getEntries = function() {
121
+ const entries = originalGetEntries.call(this);
122
+ return entries.map(entry => spoofTimingEntry(entry));
123
+ };
124
+
125
+ performance.getEntriesByType = function(type) {
126
+ const entries = originalGetEntriesByType.call(this, type);
127
+ return entries.map(entry => spoofTimingEntry(entry));
128
+ };
129
+
130
+ performance.getEntriesByName = function(name, type) {
131
+ const entries = originalGetEntriesByName.call(this, name, type);
132
+ return entries.map(entry => spoofTimingEntry(entry));
133
+ };
134
+
135
+ function spoofTimingEntry(entry) {
136
+ if (!entry) return entry;
137
+
138
+ // Create a copy of the entry with adjusted timings
139
+ const spoofedEntry = Object.assign({}, entry);
140
+
141
+ // Adjust timing values to be more Windows-like
142
+ const timingProps = [
143
+ 'startTime', 'duration', 'fetchStart', 'domainLookupStart',
144
+ 'domainLookupEnd', 'connectStart', 'connectEnd', 'requestStart',
145
+ 'responseStart', 'responseEnd', 'domLoading', 'domInteractive',
146
+ 'domContentLoadedEventStart', 'domContentLoadedEventEnd',
147
+ 'domComplete', 'loadEventStart', 'loadEventEnd'
148
+ ];
149
+
150
+ timingProps.forEach(prop => {
151
+ if (typeof spoofedEntry[prop] === 'number' && spoofedEntry[prop] > 0) {
152
+ // Apply Windows-like timing adjustments
153
+ const adjustment = 1 + (config.baseOffset / 100) +
154
+ (Math.random() - 0.5) * config.jitter / 10;
155
+ spoofedEntry[prop] = Math.round(spoofedEntry[prop] * adjustment / config.precision) * config.precision;
156
+ }
157
+ });
158
+
159
+ return spoofedEntry;
160
+ }
161
+
162
+ // Spoof requestIdleCallback timing (if available)
163
+ if ('requestIdleCallback' in window) {
164
+ const originalRequestIdleCallback = window.requestIdleCallback;
165
+ window.requestIdleCallback = function(callback, options) {
166
+ // Windows systems typically have different idle characteristics
167
+ const windowsOptions = Object.assign({}, options, {
168
+ timeout: options?.timeout ? Math.min(options.timeout, 5000) : 5000
169
+ });
170
+
171
+ return originalRequestIdleCallback.call(this, function(deadline) {
172
+ // Modify deadline to appear more Windows-like
173
+ const modifiedDeadline = {
174
+ didTimeout: deadline.didTimeout,
175
+ timeRemaining: function() {
176
+ const remaining = deadline.timeRemaining();
177
+ // Windows tends to report slightly less remaining time
178
+ return Math.max(0, remaining * 0.95 - Math.random() * 2);
179
+ }
180
+ };
181
+
182
+ return callback.call(this, modifiedDeadline);
183
+ }, windowsOptions);
184
+ };
185
+ }
186
+
187
+ // Spoof scheduler API (if available)
188
+ if ('scheduler' in window && window.scheduler) {
189
+ const originalPostTask = window.scheduler.postTask;
190
+ if (originalPostTask) {
191
+ window.scheduler.postTask = function(callback, options) {
192
+ // Windows scheduling tends to be slightly different
193
+ const windowsOptions = Object.assign({}, options);
194
+ if (windowsOptions.delay) {
195
+ windowsOptions.delay = Math.max(0, windowsOptions.delay - Math.random() * 2);
196
+ }
197
+
198
+ return originalPostTask.call(this, callback, windowsOptions);
199
+ };
200
+ }
201
+ }
202
+
203
+ // Spoof performance observer timing
204
+ if ('PerformanceObserver' in window) {
205
+ const OriginalPerformanceObserver = PerformanceObserver;
206
+ window.PerformanceObserver = class extends OriginalPerformanceObserver {
207
+ constructor(callback) {
208
+ super(function(list, observer) {
209
+ const entries = list.getEntries().map(entry => spoofTimingEntry(entry));
210
+ const modifiedList = {
211
+ getEntries: () => entries,
212
+ getEntriesByType: (type) => entries.filter(e => e.entryType === type),
213
+ getEntriesByName: (name, type) => entries.filter(e =>
214
+ e.name === name && (!type || e.entryType === type)
215
+ )
216
+ };
217
+ return callback.call(this, modifiedList, observer);
218
+ });
219
+ }
220
+ };
221
+ }
222
+ };
223
+
224
+ spoofPerformance();
225
+ })();
226
+ `;
227
+ };
228
+ //# sourceMappingURL=performance-spoofing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"performance-spoofing.js","sourceRoot":"","sources":["../../../src/fingerprinting/fingerprint-overrides/performance-spoofing.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,CAAC,MAAM,+BAA+B,GAAG,GAAW,EAAE;IACxD,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4NV,CAAC;AACF,CAAC,CAAC"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Platform Consistency Script
3
+ * Ensures all browser properties match the specified platform (1:1 fingerprinting)
4
+ */
5
+ export interface PlatformConfig {
6
+ platform?: string;
7
+ devicePixelRatio?: number;
8
+ screenDepth?: number;
9
+ colorDepth?: number;
10
+ hardwareConcurrency?: number;
11
+ maxTouchPoints?: number;
12
+ vendor?: string;
13
+ vendorSub?: string;
14
+ productSub?: string;
15
+ language?: string;
16
+ languages?: string[];
17
+ oscpu?: string;
18
+ }
19
+ export declare const createPlatformConsistencyScript: (platform: string, fingerprintData?: PlatformConfig) => string;
20
+ //# sourceMappingURL=platform-consistency.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platform-consistency.d.ts","sourceRoot":"","sources":["../../../src/fingerprinting/fingerprint-overrides/platform-consistency.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,cAAc;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,eAAO,MAAM,+BAA+B,aAAc,MAAM,oBAAoB,cAAc,KAAG,MAgOpG,CAAC"}
@@ -0,0 +1,227 @@
1
+ /**
2
+ * Platform Consistency Script
3
+ * Ensures all browser properties match the specified platform (1:1 fingerprinting)
4
+ */
5
+ export const createPlatformConsistencyScript = (platform, fingerprintData) => {
6
+ // Platform-specific configurations for 1:1 consistency
7
+ const platformConfigs = {
8
+ 'Win32': {
9
+ devicePixelRatio: 1.0,
10
+ screenDepth: 24,
11
+ colorDepth: 24,
12
+ hardwareConcurrency: 8,
13
+ maxTouchPoints: 0,
14
+ platform: 'Win32',
15
+ oscpu: 'Windows NT 10.0; Win64; x64',
16
+ vendor: '',
17
+ vendorSub: '',
18
+ productSub: '20030107',
19
+ cookieEnabled: true,
20
+ onLine: true,
21
+ language: 'en-US',
22
+ languages: ['en-US', 'en'],
23
+ userAgent: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
24
+ appVersion: '5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
25
+ appName: 'Netscape',
26
+ appCodeName: 'Mozilla',
27
+ product: 'Gecko',
28
+ plugins: [
29
+ { name: 'Chrome PDF Plugin', filename: 'internal-pdf-viewer', description: 'Portable Document Format' },
30
+ { name: 'Chrome PDF Viewer', filename: 'mhjfbmdgcfjbbpaeojofohoefgiehjai', description: 'Portable Document Format' },
31
+ { name: 'Native Client', filename: 'internal-nacl-plugin', description: 'Native Client Executable' },
32
+ { name: 'Microsoft Edge PDF Plugin', filename: 'edge-pdf-viewer', description: 'Microsoft Edge PDF Viewer' },
33
+ { name: 'Widevine Content Decryption Module', filename: 'widevinecdmadapter', description: 'Enables Widevine licenses for playback of HTML audio/video content' },
34
+ ],
35
+ mimeTypes: [
36
+ { type: 'application/pdf', suffixes: 'pdf', description: 'Portable Document Format' },
37
+ { type: 'application/x-nacl', suffixes: '', description: 'Native Client Executable' },
38
+ { type: 'application/x-pnacl', suffixes: '', description: 'Portable Native Client Executable' },
39
+ { type: 'application/x-ppapi-widevine-cdm', suffixes: '', description: 'Widevine Content Decryption Module' },
40
+ ],
41
+ // Windows-specific connection properties
42
+ connection: {
43
+ downlink: 10,
44
+ effectiveType: '4g',
45
+ onchange: null,
46
+ rtt: 50,
47
+ saveData: false,
48
+ type: 'ethernet',
49
+ },
50
+ },
51
+ 'MacIntel': {
52
+ devicePixelRatio: 2.0,
53
+ screenDepth: 30,
54
+ colorDepth: 30,
55
+ hardwareConcurrency: 8,
56
+ maxTouchPoints: 0,
57
+ platform: 'MacIntel',
58
+ oscpu: undefined,
59
+ vendor: 'Google Inc.',
60
+ vendorSub: '',
61
+ productSub: '20030107',
62
+ cookieEnabled: true,
63
+ onLine: true,
64
+ language: 'en-US',
65
+ languages: ['en-US', 'en'],
66
+ plugins: [
67
+ { name: 'Chrome PDF Plugin', filename: 'internal-pdf-viewer' },
68
+ { name: 'Chrome PDF Viewer', filename: 'mhjfbmdgcfjbbpaeojofohoefgiehjai' },
69
+ ],
70
+ },
71
+ 'Linux x86_64': {
72
+ devicePixelRatio: 1.0,
73
+ screenDepth: 24,
74
+ colorDepth: 24,
75
+ hardwareConcurrency: 8,
76
+ maxTouchPoints: 0,
77
+ platform: 'Linux x86_64',
78
+ oscpu: 'Linux x86_64',
79
+ vendor: 'Google Inc.',
80
+ vendorSub: '',
81
+ productSub: '20030107',
82
+ cookieEnabled: true,
83
+ onLine: true,
84
+ language: 'en-US',
85
+ languages: ['en-US', 'en'],
86
+ plugins: [
87
+ { name: 'Chrome PDF Plugin', filename: 'internal-pdf-viewer' },
88
+ ],
89
+ },
90
+ };
91
+ const defaultConfig = platformConfigs[platform] || platformConfigs['Linux x86_64'];
92
+ // Merge fingerprint data with defaults if provided
93
+ const config = fingerprintData ? {
94
+ ...defaultConfig,
95
+ ...fingerprintData,
96
+ // Ensure platform consistency
97
+ platform: fingerprintData.platform || platform,
98
+ } : defaultConfig;
99
+ return `
100
+ (() => {
101
+ 'use strict';
102
+
103
+ // Platform Consistency for ${platform}
104
+ const config = ${JSON.stringify(config)};
105
+
106
+ // Override navigator properties for platform consistency
107
+ Object.defineProperty(navigator, 'platform', { get: () => config.platform, configurable: false });
108
+ Object.defineProperty(navigator, 'vendor', { get: () => config.vendor, configurable: false });
109
+ Object.defineProperty(navigator, 'vendorSub', { get: () => config.vendorSub, configurable: false });
110
+ Object.defineProperty(navigator, 'productSub', { get: () => config.productSub, configurable: false });
111
+ Object.defineProperty(navigator, 'hardwareConcurrency', { get: () => config.hardwareConcurrency, configurable: false });
112
+ Object.defineProperty(navigator, 'maxTouchPoints', { get: () => config.maxTouchPoints, configurable: false });
113
+ Object.defineProperty(navigator, 'cookieEnabled', { get: () => config.cookieEnabled, configurable: false });
114
+ Object.defineProperty(navigator, 'onLine', { get: () => config.onLine, configurable: false });
115
+ Object.defineProperty(navigator, 'language', { get: () => config.language, configurable: false });
116
+ Object.defineProperty(navigator, 'languages', { get: () => config.languages, configurable: false });
117
+
118
+ // Additional navigator properties for Windows consistency
119
+ if (config.userAgent) {
120
+ Object.defineProperty(navigator, 'userAgent', { get: () => config.userAgent, configurable: false });
121
+ }
122
+ if (config.appVersion) {
123
+ Object.defineProperty(navigator, 'appVersion', { get: () => config.appVersion, configurable: false });
124
+ }
125
+ if (config.appName) {
126
+ Object.defineProperty(navigator, 'appName', { get: () => config.appName, configurable: false });
127
+ }
128
+ if (config.appCodeName) {
129
+ Object.defineProperty(navigator, 'appCodeName', { get: () => config.appCodeName, configurable: false });
130
+ }
131
+ if (config.product) {
132
+ Object.defineProperty(navigator, 'product', { get: () => config.product, configurable: false });
133
+ }
134
+ if (config.oscpu !== undefined) {
135
+ Object.defineProperty(navigator, 'oscpu', { get: () => config.oscpu, configurable: false });
136
+ }
137
+
138
+ // Override navigator.plugins for Windows consistency
139
+ if (config.plugins) {
140
+ Object.defineProperty(navigator, 'plugins', {
141
+ get: () => {
142
+ const arr = Object.create(PluginArray.prototype);
143
+ config.plugins.forEach((p, i) => {
144
+ const plugin = Object.create(Plugin.prototype);
145
+ plugin.name = p.name;
146
+ plugin.filename = p.filename;
147
+ plugin.description = p.description;
148
+ plugin.length = 1;
149
+ plugin[0] = config.mimeTypes?.[i] || { type: 'application/pdf', suffixes: 'pdf', description: 'Portable Document Format' };
150
+ arr[i] = plugin;
151
+ arr[p.name] = plugin;
152
+ });
153
+ arr.length = config.plugins.length;
154
+ arr.item = (index) => arr[index] || null;
155
+ arr.namedItem = (name) => arr[name] || null;
156
+ arr.refresh = () => {};
157
+ return arr;
158
+ },
159
+ configurable: false,
160
+ enumerable: true
161
+ });
162
+ }
163
+
164
+ // Override navigator.mimeTypes for Windows consistency
165
+ if (config.mimeTypes) {
166
+ Object.defineProperty(navigator, 'mimeTypes', {
167
+ get: () => {
168
+ const arr = Object.create(MimeTypeArray.prototype);
169
+ config.mimeTypes.forEach((m, i) => {
170
+ const mimeType = Object.create(MimeType.prototype);
171
+ mimeType.type = m.type;
172
+ mimeType.suffixes = m.suffixes;
173
+ mimeType.description = m.description;
174
+ mimeType.enabledPlugin = config.plugins?.[0] || null;
175
+ arr[i] = mimeType;
176
+ arr[m.type] = mimeType;
177
+ });
178
+ arr.length = config.mimeTypes.length;
179
+ arr.item = (index) => arr[index] || null;
180
+ arr.namedItem = (name) => arr[name] || null;
181
+ return arr;
182
+ },
183
+ configurable: false,
184
+ enumerable: true
185
+ });
186
+ }
187
+
188
+ // Override navigator.connection for Windows consistency
189
+ if (config.connection && navigator.connection) {
190
+ Object.keys(config.connection).forEach(key => {
191
+ Object.defineProperty(navigator.connection, key, {
192
+ value: config.connection[key],
193
+ writable: false,
194
+ configurable: true
195
+ });
196
+ });
197
+ }
198
+
199
+ // Override screen properties
200
+ Object.defineProperty(window, 'devicePixelRatio', { get: () => config.devicePixelRatio, configurable: false });
201
+ Object.defineProperty(screen, 'colorDepth', { get: () => config.colorDepth, configurable: false });
202
+ Object.defineProperty(screen, 'pixelDepth', { get: () => config.screenDepth || config.colorDepth, configurable: false });
203
+
204
+ // Ensure WebGL returns platform-appropriate values
205
+ const getParameterProto = WebGLRenderingContext.prototype.getParameter;
206
+ WebGLRenderingContext.prototype.getParameter = function(param) {
207
+ if (param === 0x9245 || param === 0x9246) { // UNMASKED_VENDOR_WEBGL / UNMASKED_RENDERER_WEBGL
208
+ // Return platform-appropriate GPU with corrected ANGLE token count
209
+ if (config.platform === 'Win32') {
210
+ return param === 0x9245
211
+ ? 'NVIDIA Corporation'
212
+ : 'ANGLE (NVIDIA, NVIDIA GeForce GTX 1660 Ti Direct3D 11.0)'; // Fixed: fewer tokens
213
+ } else if (config.platform === 'MacIntel') {
214
+ return param === 0x9245 ? 'Apple Inc.' : 'ANGLE (Apple, Apple M1 Pro, OpenGL 4.1)';
215
+ } else {
216
+ return param === 0x9245 ? 'Intel' : 'ANGLE (Intel, Mesa Intel(R) UHD Graphics 630, OpenGL 4.6)';
217
+ }
218
+ }
219
+ return getParameterProto.apply(this, arguments);
220
+ };
221
+
222
+ if (typeof WebGL2RenderingContext !== 'undefined') {
223
+ WebGL2RenderingContext.prototype.getParameter = WebGLRenderingContext.prototype.getParameter;
224
+ }
225
+ })();`;
226
+ };
227
+ //# sourceMappingURL=platform-consistency.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platform-consistency.js","sourceRoot":"","sources":["../../../src/fingerprinting/fingerprint-overrides/platform-consistency.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Runtime.enable Bypass
3
+ * Prevents CDP detection through console.log(Error) technique
4
+ */
5
+ export declare const setupRuntimeEnableBypass: (client: any) => Promise<void>;
6
+ //# sourceMappingURL=runtime-enable-bypass.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-enable-bypass.d.ts","sourceRoot":"","sources":["../../../src/fingerprinting/fingerprint-overrides/runtime-enable-bypass.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,eAAO,MAAM,wBAAwB,WAAkB,GAAG,KAAG,OAAO,CAAC,IAAI,CA8ExE,CAAC"}