jumpy-lion 0.1.2 → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/dist/browser-controller.js +1 -1
  2. package/dist/browser-controller.js.map +1 -1
  3. package/dist/browser-process/browser.d.ts.map +1 -1
  4. package/dist/browser-process/browser.js +3 -1
  5. package/dist/browser-process/browser.js.map +1 -1
  6. package/dist/fingerprinting/fingerprint-injector.d.ts +7 -1
  7. package/dist/fingerprinting/fingerprint-injector.d.ts.map +1 -1
  8. package/dist/fingerprinting/fingerprint-injector.js +92 -12
  9. package/dist/fingerprinting/fingerprint-injector.js.map +1 -1
  10. package/dist/fingerprinting/fingerprint-overrides/audio-spoofing.d.ts.map +1 -1
  11. package/dist/fingerprinting/fingerprint-overrides/audio-spoofing.js +16 -1
  12. package/dist/fingerprinting/fingerprint-overrides/audio-spoofing.js.map +1 -1
  13. package/dist/fingerprinting/fingerprint-overrides/canvas-protection.d.ts.map +1 -1
  14. package/dist/fingerprinting/fingerprint-overrides/canvas-protection.js +18 -1
  15. package/dist/fingerprinting/fingerprint-overrides/canvas-protection.js.map +1 -1
  16. package/dist/fingerprinting/fingerprint-overrides/client-rect-spoofing.d.ts.map +1 -1
  17. package/dist/fingerprinting/fingerprint-overrides/client-rect-spoofing.js +16 -1
  18. package/dist/fingerprinting/fingerprint-overrides/client-rect-spoofing.js.map +1 -1
  19. package/dist/fingerprinting/fingerprint-overrides/coalesced-events-spoofing.d.ts.map +1 -1
  20. package/dist/fingerprinting/fingerprint-overrides/coalesced-events-spoofing.js +16 -1
  21. package/dist/fingerprinting/fingerprint-overrides/coalesced-events-spoofing.js.map +1 -1
  22. package/dist/fingerprinting/fingerprint-overrides/datadome-bypass.d.ts.map +1 -1
  23. package/dist/fingerprinting/fingerprint-overrides/datadome-bypass.js +16 -1
  24. package/dist/fingerprinting/fingerprint-overrides/datadome-bypass.js.map +1 -1
  25. package/dist/fingerprinting/fingerprint-overrides/font-spoofing.d.ts.map +1 -1
  26. package/dist/fingerprinting/fingerprint-overrides/font-spoofing.js +13 -3
  27. package/dist/fingerprinting/fingerprint-overrides/font-spoofing.js.map +1 -1
  28. package/dist/fingerprinting/fingerprint-overrides/index.d.ts +1 -0
  29. package/dist/fingerprinting/fingerprint-overrides/index.d.ts.map +1 -1
  30. package/dist/fingerprinting/fingerprint-overrides/index.js +1 -0
  31. package/dist/fingerprinting/fingerprint-overrides/index.js.map +1 -1
  32. package/dist/fingerprinting/fingerprint-overrides/media-codecs-spoofing.d.ts +14 -0
  33. package/dist/fingerprinting/fingerprint-overrides/media-codecs-spoofing.d.ts.map +1 -0
  34. package/dist/fingerprinting/fingerprint-overrides/media-codecs-spoofing.js +160 -0
  35. package/dist/fingerprinting/fingerprint-overrides/media-codecs-spoofing.js.map +1 -0
  36. package/dist/fingerprinting/fingerprint-overrides/mouse-humanization.d.ts.map +1 -1
  37. package/dist/fingerprinting/fingerprint-overrides/mouse-humanization.js +16 -1
  38. package/dist/fingerprinting/fingerprint-overrides/mouse-humanization.js.map +1 -1
  39. package/dist/fingerprinting/fingerprint-overrides/performance-spoofing.d.ts.map +1 -1
  40. package/dist/fingerprinting/fingerprint-overrides/performance-spoofing.js +16 -1
  41. package/dist/fingerprinting/fingerprint-overrides/performance-spoofing.js.map +1 -1
  42. package/dist/fingerprinting/fingerprint-overrides/platform-consistency.d.ts.map +1 -1
  43. package/dist/fingerprinting/fingerprint-overrides/platform-consistency.js +19 -17
  44. package/dist/fingerprinting/fingerprint-overrides/platform-consistency.js.map +1 -1
  45. package/dist/fingerprinting/fingerprint-overrides/stealth-script.d.ts.map +1 -1
  46. package/dist/fingerprinting/fingerprint-overrides/stealth-script.js +77 -19
  47. package/dist/fingerprinting/fingerprint-overrides/stealth-script.js.map +1 -1
  48. package/dist/fingerprinting/fingerprint-overrides/ua-ch.d.ts.map +1 -1
  49. package/dist/fingerprinting/fingerprint-overrides/ua-ch.js +27 -18
  50. package/dist/fingerprinting/fingerprint-overrides/ua-ch.js.map +1 -1
  51. package/dist/fingerprinting/fingerprint-overrides/webgl-spoofing.d.ts.map +1 -1
  52. package/dist/fingerprinting/fingerprint-overrides/webgl-spoofing.js +16 -4
  53. package/dist/fingerprinting/fingerprint-overrides/webgl-spoofing.js.map +1 -1
  54. package/dist/fingerprinting/fingerprint-overrides/webgpu-spoofing.d.ts.map +1 -1
  55. package/dist/fingerprinting/fingerprint-overrides/webgpu-spoofing.js +16 -2
  56. package/dist/fingerprinting/fingerprint-overrides/webgpu-spoofing.js.map +1 -1
  57. package/dist/fingerprinting/fingerprint-overrides/webrtc-spoofing.d.ts.map +1 -1
  58. package/dist/fingerprinting/fingerprint-overrides/webrtc-spoofing.js +20 -9
  59. package/dist/fingerprinting/fingerprint-overrides/webrtc-spoofing.js.map +1 -1
  60. package/dist/tsconfig.build.tsbuildinfo +1 -1
  61. package/package.json +1 -1
@@ -10,11 +10,21 @@ export const createFontSpoofingScript = () => {
10
10
 
11
11
  // Font Spoofing for 2025 - Platform-aware font availability with randomization
12
12
  const spoofFonts = () => {
13
- // Generate a session-stable seed from current time and user agent
13
+ // Stable seed: must NOT use Date.now() because this script re-executes on
14
+ // every reload via addScriptToEvaluateOnNewDocument. A real browser doesn't
15
+ // change its installed fonts between reloads.
14
16
  const generateSeed = () => {
17
+ const _s = typeof __stealth !== 'undefined' ? __stealth : {};
18
+ const key = _s.seedKey || '';
15
19
  const ua = navigator.userAgent || '';
16
- const timeStamp = Math.floor(Date.now() / (1000 * 60 * 60 * 24)); // Changes daily
17
- return ua.split('').reduce((a, b) => a + b.charCodeAt(0), 0) + timeStamp;
20
+ const s = screen;
21
+ let h = 0xCAFE100A | 0;
22
+ for (let i = 0; i < key.length; i++) h = (h << 5) - h + key.charCodeAt(i) | 0;
23
+ for (let i = 0; i < ua.length; i++) h = (h << 5) - h + ua.charCodeAt(i) | 0;
24
+ h = (h << 5) - h + (s.width || 0) | 0;
25
+ h = (h << 5) - h + (s.height || 0) | 0;
26
+ h = (h << 5) - h + (s.colorDepth || 0) | 0;
27
+ return h >>> 0;
18
28
  };
19
29
 
20
30
  // Seeded PRNG (mulberry32) for consistent values
@@ -1 +1 @@
1
- {"version":3,"file":"font-spoofing.js","sourceRoot":"","sources":["../../../src/fingerprinting/fingerprint-overrides/font-spoofing.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,CAAC,MAAM,wBAAwB,GAAG,GAAW,EAAE;IACjD,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkKV,CAAC;AACF,CAAC,CAAC"}
1
+ {"version":3,"file":"font-spoofing.js","sourceRoot":"","sources":["../../../src/fingerprinting/fingerprint-overrides/font-spoofing.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,CAAC,MAAM,wBAAwB,GAAG,GAAW,EAAE;IACjD,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4KV,CAAC;AACF,CAAC,CAAC"}
@@ -33,4 +33,5 @@ export { createKeyboardHumanizationScript, setupKeyboardHumanization, generateTy
33
33
  export { createScrollHumanizationScript, setupScrollHumanization, humanScroll, humanScrollToElement, generateScrollPath } from './scroll-humanization.js';
34
34
  export { createDataDomeBypassScript } from './datadome-bypass.js';
35
35
  export { createCoalescedEventsSpoofingScript } from './coalesced-events-spoofing.js';
36
+ export { createMediaCodecsSpoofingScript } from './media-codecs-spoofing.js';
36
37
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/fingerprinting/fingerprint-overrides/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,yBAAyB,EAAE,KAAK,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClF,OAAO,EAAE,oCAAoC,EAAE,MAAM,qBAAqB,CAAC;AAC3E,OAAO,EAAE,oCAAoC,EAAE,MAAM,wBAAwB,CAAC;AAC9E,OAAO,EAAE,8BAA8B,EAAE,MAAM,2BAA2B,CAAC;AAC3E,OAAO,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EAAE,+BAA+B,EAAE,KAAK,cAAc,EAAE,MAAM,2BAA2B,CAAC;AACjG,OAAO,EAAE,8BAA8B,EAAE,MAAM,yBAAyB,CAAC;AACzE,OAAO,EAAE,+BAA+B,EAAE,MAAM,4BAA4B,CAAC;AAC7E,OAAO,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,+BAA+B,EAAE,MAAM,2BAA2B,CAAC;AAC5E,OAAO,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EAAE,iCAAiC,EAAE,KAAK,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAGvF,OAAO,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAGtD,OAAO,EAAE,8BAA8B,EAAE,MAAM,0BAA0B,CAAC;AAG1E,OAAO,EAAE,8BAA8B,EAAE,MAAM,2BAA2B,CAAC;AAC3E,OAAO,EAAE,8BAA8B,EAAE,MAAM,0BAA0B,CAAC;AAC1E,OAAO,EAAE,6BAA6B,EAAE,MAAM,yBAAyB,CAAC;AACxE,OAAO,EACH,gCAAgC,EAChC,yBAAyB,EACzB,oBAAoB,EACpB,yBAAyB,EAC5B,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACH,8BAA8B,EAC9B,uBAAuB,EACvB,WAAW,EACX,oBAAoB,EACpB,kBAAkB,EACrB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EAAE,mCAAmC,EAAE,MAAM,gCAAgC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/fingerprinting/fingerprint-overrides/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,yBAAyB,EAAE,KAAK,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClF,OAAO,EAAE,oCAAoC,EAAE,MAAM,qBAAqB,CAAC;AAC3E,OAAO,EAAE,oCAAoC,EAAE,MAAM,wBAAwB,CAAC;AAC9E,OAAO,EAAE,8BAA8B,EAAE,MAAM,2BAA2B,CAAC;AAC3E,OAAO,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EAAE,+BAA+B,EAAE,KAAK,cAAc,EAAE,MAAM,2BAA2B,CAAC;AACjG,OAAO,EAAE,8BAA8B,EAAE,MAAM,yBAAyB,CAAC;AACzE,OAAO,EAAE,+BAA+B,EAAE,MAAM,4BAA4B,CAAC;AAC7E,OAAO,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,+BAA+B,EAAE,MAAM,2BAA2B,CAAC;AAC5E,OAAO,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EAAE,iCAAiC,EAAE,KAAK,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAGvF,OAAO,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAGtD,OAAO,EAAE,8BAA8B,EAAE,MAAM,0BAA0B,CAAC;AAG1E,OAAO,EAAE,8BAA8B,EAAE,MAAM,2BAA2B,CAAC;AAC3E,OAAO,EAAE,8BAA8B,EAAE,MAAM,0BAA0B,CAAC;AAC1E,OAAO,EAAE,6BAA6B,EAAE,MAAM,yBAAyB,CAAC;AACxE,OAAO,EACH,gCAAgC,EAChC,yBAAyB,EACzB,oBAAoB,EACpB,yBAAyB,EAC5B,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACH,8BAA8B,EAC9B,uBAAuB,EACvB,WAAW,EACX,oBAAoB,EACpB,kBAAkB,EACrB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EAAE,mCAAmC,EAAE,MAAM,gCAAgC,CAAC;AACrF,OAAO,EAAE,+BAA+B,EAAE,MAAM,4BAA4B,CAAC"}
@@ -37,4 +37,5 @@ export { createKeyboardHumanizationScript, setupKeyboardHumanization, generateTy
37
37
  export { createScrollHumanizationScript, setupScrollHumanization, humanScroll, humanScrollToElement, generateScrollPath } from './scroll-humanization.js';
38
38
  export { createDataDomeBypassScript } from './datadome-bypass.js';
39
39
  export { createCoalescedEventsSpoofingScript } from './coalesced-events-spoofing.js';
40
+ export { createMediaCodecsSpoofingScript } from './media-codecs-spoofing.js';
40
41
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/fingerprinting/fingerprint-overrides/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,sCAAsC;AACtC,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,yBAAyB,EAAoB,MAAM,qBAAqB,CAAC;AAClF,OAAO,EAAE,oCAAoC,EAAE,MAAM,qBAAqB,CAAC;AAC3E,OAAO,EAAE,oCAAoC,EAAE,MAAM,wBAAwB,CAAC;AAC9E,OAAO,EAAE,8BAA8B,EAAE,MAAM,2BAA2B,CAAC;AAC3E,OAAO,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EAAE,+BAA+B,EAAuB,MAAM,2BAA2B,CAAC;AACjG,OAAO,EAAE,8BAA8B,EAAE,MAAM,yBAAyB,CAAC;AACzE,OAAO,EAAE,+BAA+B,EAAE,MAAM,4BAA4B,CAAC;AAC7E,OAAO,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,+BAA+B,EAAE,MAAM,2BAA2B,CAAC;AAC5E,OAAO,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EAAE,iCAAiC,EAA0B,MAAM,YAAY,CAAC;AAEvF,6CAA6C;AAC7C,OAAO,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAEtD,iDAAiD;AACjD,OAAO,EAAE,8BAA8B,EAAE,MAAM,0BAA0B,CAAC;AAE1E,wBAAwB;AACxB,OAAO,EAAE,8BAA8B,EAAE,MAAM,2BAA2B,CAAC;AAC3E,OAAO,EAAE,8BAA8B,EAAE,MAAM,0BAA0B,CAAC;AAC1E,OAAO,EAAE,6BAA6B,EAAE,MAAM,yBAAyB,CAAC;AACxE,OAAO,EACH,gCAAgC,EAChC,yBAAyB,EACzB,oBAAoB,EACpB,yBAAyB,EAC5B,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACH,8BAA8B,EAC9B,uBAAuB,EACvB,WAAW,EACX,oBAAoB,EACpB,kBAAkB,EACrB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EAAE,mCAAmC,EAAE,MAAM,gCAAgC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/fingerprinting/fingerprint-overrides/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,sCAAsC;AACtC,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,yBAAyB,EAAoB,MAAM,qBAAqB,CAAC;AAClF,OAAO,EAAE,oCAAoC,EAAE,MAAM,qBAAqB,CAAC;AAC3E,OAAO,EAAE,oCAAoC,EAAE,MAAM,wBAAwB,CAAC;AAC9E,OAAO,EAAE,8BAA8B,EAAE,MAAM,2BAA2B,CAAC;AAC3E,OAAO,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EAAE,+BAA+B,EAAuB,MAAM,2BAA2B,CAAC;AACjG,OAAO,EAAE,8BAA8B,EAAE,MAAM,yBAAyB,CAAC;AACzE,OAAO,EAAE,+BAA+B,EAAE,MAAM,4BAA4B,CAAC;AAC7E,OAAO,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,+BAA+B,EAAE,MAAM,2BAA2B,CAAC;AAC5E,OAAO,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EAAE,iCAAiC,EAA0B,MAAM,YAAY,CAAC;AAEvF,6CAA6C;AAC7C,OAAO,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAEtD,iDAAiD;AACjD,OAAO,EAAE,8BAA8B,EAAE,MAAM,0BAA0B,CAAC;AAE1E,wBAAwB;AACxB,OAAO,EAAE,8BAA8B,EAAE,MAAM,2BAA2B,CAAC;AAC3E,OAAO,EAAE,8BAA8B,EAAE,MAAM,0BAA0B,CAAC;AAC1E,OAAO,EAAE,6BAA6B,EAAE,MAAM,yBAAyB,CAAC;AACxE,OAAO,EACH,gCAAgC,EAChC,yBAAyB,EACzB,oBAAoB,EACpB,yBAAyB,EAC5B,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACH,8BAA8B,EAC9B,uBAAuB,EACvB,WAAW,EACX,oBAAoB,EACpB,kBAAkB,EACrB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EAAE,mCAAmC,EAAE,MAAM,gCAAgC,CAAC;AACrF,OAAO,EAAE,+BAA+B,EAAE,MAAM,4BAA4B,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Media Codecs Spoofing
3
+ *
4
+ * Ensures HTMLMediaElement.canPlayType() and MediaSource.isTypeSupported()
5
+ * return consistent results matching a real Chrome browser with hardware
6
+ * media decoding support.
7
+ *
8
+ * Detection vector: Headless Chrome and some automated Chrome instances
9
+ * lack hardware media decoders, causing canPlayType() to return '' for
10
+ * codecs that real Chrome supports (e.g., H.264, AAC). Anti-bot services
11
+ * like FingerprintJS and CreepJS check this.
12
+ */
13
+ export declare const createMediaCodecsSpoofingScript: () => string;
14
+ //# sourceMappingURL=media-codecs-spoofing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media-codecs-spoofing.d.ts","sourceRoot":"","sources":["../../../src/fingerprinting/fingerprint-overrides/media-codecs-spoofing.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,eAAO,MAAM,+BAA+B,QAAO,MAkJlD,CAAC"}
@@ -0,0 +1,160 @@
1
+ /**
2
+ * Media Codecs Spoofing
3
+ *
4
+ * Ensures HTMLMediaElement.canPlayType() and MediaSource.isTypeSupported()
5
+ * return consistent results matching a real Chrome browser with hardware
6
+ * media decoding support.
7
+ *
8
+ * Detection vector: Headless Chrome and some automated Chrome instances
9
+ * lack hardware media decoders, causing canPlayType() to return '' for
10
+ * codecs that real Chrome supports (e.g., H.264, AAC). Anti-bot services
11
+ * like FingerprintJS and CreepJS check this.
12
+ */
13
+ export const createMediaCodecsSpoofingScript = () => {
14
+ return `
15
+ (() => {
16
+ 'use strict';
17
+
18
+ // Map of media types and their expected support level in real Chrome desktop
19
+ // 'probably' = full support, 'maybe' = partial, '' = unsupported
20
+ const codecSupport = {
21
+ // Video codecs
22
+ 'video/mp4': 'probably',
23
+ 'video/mp4; codecs="avc1.42E01E"': 'probably',
24
+ 'video/mp4; codecs="avc1.42E01E, mp4a.40.2"': 'probably',
25
+ 'video/mp4; codecs="avc1.4D401E"': 'probably',
26
+ 'video/mp4; codecs="avc1.64001E"': 'probably',
27
+ 'video/mp4; codecs="avc1.640028"': 'probably',
28
+ 'video/mp4; codecs="avc1.4d002a"': 'probably',
29
+ 'video/mp4; codecs="mp4a.40.2"': 'probably',
30
+ 'video/mp4; codecs="mp4a.40.5"': 'probably',
31
+ 'video/mp4; codecs="flac"': 'probably',
32
+ 'video/mp4; codecs="hev1.1.6.L93.B0"': 'probably',
33
+ 'video/mp4; codecs="hvc1.1.6.L93.B0"': 'probably',
34
+ 'video/mp4; codecs="av01.0.04M.08"': 'probably',
35
+ 'video/mp4; codecs="vp09.00.10.08"': 'probably',
36
+ 'video/webm': 'probably',
37
+ 'video/webm; codecs="vp8"': 'probably',
38
+ 'video/webm; codecs="vp8, vorbis"': 'probably',
39
+ 'video/webm; codecs="vp8, opus"': 'probably',
40
+ 'video/webm; codecs="vp9"': 'probably',
41
+ 'video/webm; codecs="vp9, opus"': 'probably',
42
+ 'video/webm; codecs="vp09.00.10.08"': 'probably',
43
+ 'video/webm; codecs="av01.0.04M.08"': 'probably',
44
+ 'video/ogg': 'probably',
45
+ 'video/ogg; codecs="theora"': 'probably',
46
+ 'video/ogg; codecs="theora, vorbis"': 'probably',
47
+ // Audio codecs
48
+ 'audio/mp4': 'maybe',
49
+ 'audio/mp4; codecs="mp4a.40.2"': 'probably',
50
+ 'audio/mp4; codecs="mp4a.40.5"': 'probably',
51
+ 'audio/mp4; codecs="flac"': 'probably',
52
+ 'audio/mp4; codecs="opus"': 'probably',
53
+ 'audio/mpeg': 'probably',
54
+ 'audio/ogg': 'probably',
55
+ 'audio/ogg; codecs="vorbis"': 'probably',
56
+ 'audio/ogg; codecs="opus"': 'probably',
57
+ 'audio/ogg; codecs="flac"': 'probably',
58
+ 'audio/webm': 'probably',
59
+ 'audio/webm; codecs="vorbis"': 'probably',
60
+ 'audio/webm; codecs="opus"': 'probably',
61
+ 'audio/wav': 'probably',
62
+ 'audio/wav; codecs="1"': 'probably',
63
+ 'audio/wave': 'probably',
64
+ 'audio/x-wav': 'probably',
65
+ 'audio/flac': 'probably',
66
+ 'audio/aac': 'probably',
67
+ };
68
+
69
+ // MediaSource type support (for MSE-based playback)
70
+ const mseTypeSupport = {
71
+ 'video/mp4; codecs="avc1.42E01E"': true,
72
+ 'video/mp4; codecs="avc1.42E01E, mp4a.40.2"': true,
73
+ 'video/mp4; codecs="avc1.4D401E"': true,
74
+ 'video/mp4; codecs="avc1.64001E"': true,
75
+ 'video/mp4; codecs="avc1.640028"': true,
76
+ 'video/mp4; codecs="mp4a.40.2"': true,
77
+ 'video/mp4; codecs="mp4a.40.5"': true,
78
+ 'video/mp4; codecs="flac"': true,
79
+ 'video/mp4; codecs="av01.0.04M.08"': true,
80
+ 'video/mp4; codecs="vp09.00.10.08"': true,
81
+ 'video/webm; codecs="vp8"': true,
82
+ 'video/webm; codecs="vp8, vorbis"': true,
83
+ 'video/webm; codecs="vp9"': true,
84
+ 'video/webm; codecs="vp9, opus"': true,
85
+ 'video/webm; codecs="vp09.00.10.08"': true,
86
+ 'audio/mp4; codecs="mp4a.40.2"': true,
87
+ 'audio/mp4; codecs="mp4a.40.5"': true,
88
+ 'audio/mp4; codecs="flac"': true,
89
+ 'audio/mp4; codecs="opus"': true,
90
+ 'audio/webm; codecs="vorbis"': true,
91
+ 'audio/webm; codecs="opus"': true,
92
+ };
93
+
94
+ // Patch canPlayType on HTMLMediaElement prototype
95
+ const origCanPlayType = HTMLMediaElement.prototype.canPlayType;
96
+ HTMLMediaElement.prototype.canPlayType = function(type) {
97
+ // Normalize the type string for lookup
98
+ const normalized = type.replace(/\\s+/g, ' ').trim();
99
+
100
+ // Check our known-good codec support map
101
+ if (normalized in codecSupport) {
102
+ return codecSupport[normalized];
103
+ }
104
+
105
+ // For unknown types, fall through to native implementation
106
+ return origCanPlayType.call(this, type);
107
+ };
108
+
109
+ // Register for native toString masking
110
+ const _s = typeof __stealth !== 'undefined' ? __stealth : {};
111
+ if (_s.utils) {
112
+ _s.utils.registerNativeFunction(HTMLMediaElement.prototype.canPlayType, 'canPlayType');
113
+ }
114
+
115
+ // Patch MediaSource.isTypeSupported if available
116
+ if (typeof MediaSource !== 'undefined' && MediaSource.isTypeSupported) {
117
+ const origIsTypeSupported = MediaSource.isTypeSupported;
118
+ MediaSource.isTypeSupported = function(type) {
119
+ const normalized = type.replace(/\\s+/g, ' ').trim();
120
+ if (normalized in mseTypeSupport) {
121
+ return mseTypeSupport[normalized];
122
+ }
123
+ return origIsTypeSupported.call(this, type);
124
+ };
125
+ if (_s.utils) {
126
+ _s.utils.registerNativeFunction(MediaSource.isTypeSupported, 'isTypeSupported');
127
+ }
128
+ }
129
+
130
+ // Also patch RTCRtpSender/Receiver.getCapabilities if available
131
+ // These report supported codecs for WebRTC
132
+ if (typeof RTCRtpSender !== 'undefined' && RTCRtpSender.getCapabilities) {
133
+ const origGetCaps = RTCRtpSender.getCapabilities;
134
+ RTCRtpSender.getCapabilities = function(kind) {
135
+ const result = origGetCaps.call(this, kind);
136
+ if (!result) return result;
137
+
138
+ // Ensure H264 is in the video codec list (missing in some headless configs)
139
+ if (kind === 'video' && result.codecs) {
140
+ const hasH264 = result.codecs.some(c =>
141
+ c.mimeType && c.mimeType.toLowerCase().includes('h264')
142
+ );
143
+ if (!hasH264) {
144
+ result.codecs.push({
145
+ clockRate: 90000,
146
+ mimeType: 'video/H264',
147
+ sdpFmtpLine: 'level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42001f',
148
+ });
149
+ }
150
+ }
151
+ return result;
152
+ };
153
+ if (_s.utils) {
154
+ _s.utils.registerNativeFunction(RTCRtpSender.getCapabilities, 'getCapabilities');
155
+ }
156
+ }
157
+ })();
158
+ `;
159
+ };
160
+ //# sourceMappingURL=media-codecs-spoofing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media-codecs-spoofing.js","sourceRoot":"","sources":["../../../src/fingerprinting/fingerprint-overrides/media-codecs-spoofing.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,MAAM,CAAC,MAAM,+BAA+B,GAAG,GAAW,EAAE;IACxD,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgJV,CAAC;AACF,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"mouse-humanization.d.ts","sourceRoot":"","sources":["../../../src/fingerprinting/fingerprint-overrides/mouse-humanization.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,eAAO,MAAM,8BAA8B,WAAkB,GAAG,KAAG,OAAO,CAAC,IAAI,CAmD9E,CAAC"}
1
+ {"version":3,"file":"mouse-humanization.d.ts","sourceRoot":"","sources":["../../../src/fingerprinting/fingerprint-overrides/mouse-humanization.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,eAAO,MAAM,8BAA8B,WAAkB,GAAG,KAAG,OAAO,CAAC,IAAI,CAkE9E,CAAC"}
@@ -22,7 +22,22 @@ export const setupMouseMovementHumanization = async (client) => {
22
22
  return ((t ^ t >>> 14) >>> 0) / 4294967296;
23
23
  };
24
24
  };
25
- const sessionSeed = Date.now() ^ (Math.random() * 0xFFFFFFFF >>> 0);
25
+ // Stable seed: must NOT use Date.now() or Math.random() because this script
26
+ // re-executes on every reload via addScriptToEvaluateOnNewDocument.
27
+ const _stableHash = (salt) => {
28
+ const _s = typeof __stealth !== 'undefined' ? __stealth : {};
29
+ const key = _s.seedKey || '';
30
+ const ua = navigator.userAgent || '';
31
+ const s = screen;
32
+ let h = salt | 0;
33
+ for (let i = 0; i < key.length; i++) h = (h << 5) - h + key.charCodeAt(i) | 0;
34
+ for (let i = 0; i < ua.length; i++) h = (h << 5) - h + ua.charCodeAt(i) | 0;
35
+ h = (h << 5) - h + (s.width || 0) | 0;
36
+ h = (h << 5) - h + (s.height || 0) | 0;
37
+ h = (h << 5) - h + (s.colorDepth || 0) | 0;
38
+ return h >>> 0;
39
+ };
40
+ const sessionSeed = _stableHash(0xCAFE1009);
26
41
  const seededRandom = createSeededRNG(sessionSeed);
27
42
 
28
43
  // Bezier curve movement generator
@@ -1 +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,2EAA2E;IAC3E,6FAA6F;IAC7F,MAAM,MAAM,CAAC,IAAI,CAAC,gCAAgC,CAAC,EAAE,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MA+C3D,EAAE,CAAC,CAAC;AACV,CAAC,CAAC"}
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,2EAA2E;IAC3E,6FAA6F;IAC7F,MAAM,MAAM,CAAC,IAAI,CAAC,gCAAgC,CAAC,EAAE,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MA8D3D,EAAE,CAAC,CAAC;AACV,CAAC,CAAC"}
@@ -1 +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,MAmPlD,CAAC"}
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,MAkQlD,CAAC"}
@@ -18,7 +18,22 @@ export const createPerformanceSpoofingScript = () => {
18
18
  return ((t ^ t >>> 14) >>> 0) / 4294967296;
19
19
  };
20
20
  };
21
- const sessionSeed = Date.now() ^ 0xE7A31B49;
21
+ // Stable seed: must NOT use Date.now() because this script re-executes on
22
+ // every reload via addScriptToEvaluateOnNewDocument.
23
+ const _stableHash = (salt) => {
24
+ const _s = typeof __stealth !== 'undefined' ? __stealth : {};
25
+ const key = _s.seedKey || '';
26
+ const ua = navigator.userAgent || '';
27
+ const s = screen;
28
+ let h = salt | 0;
29
+ for (let i = 0; i < key.length; i++) h = (h << 5) - h + key.charCodeAt(i) | 0;
30
+ for (let i = 0; i < ua.length; i++) h = (h << 5) - h + ua.charCodeAt(i) | 0;
31
+ h = (h << 5) - h + (s.width || 0) | 0;
32
+ h = (h << 5) - h + (s.height || 0) | 0;
33
+ h = (h << 5) - h + (s.colorDepth || 0) | 0;
34
+ return h >>> 0;
35
+ };
36
+ const sessionSeed = _stableHash(0xCAFE1005);
22
37
  const seededRandom = createSeededRNG(sessionSeed);
23
38
 
24
39
  // Store original methods
@@ -1 +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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiPV,CAAC;AACF,CAAC,CAAC"}
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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgQV,CAAC;AACF,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"platform-consistency.d.ts","sourceRoot":"","sources":["../../../src/fingerprinting/fingerprint-overrides/platform-consistency.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;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;IAEf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,eAAO,MAAM,+BAA+B,aAAc,MAAM,oBAAoB,cAAc,KAAG,MA+lBpG,CAAC"}
1
+ {"version":3,"file":"platform-consistency.d.ts","sourceRoot":"","sources":["../../../src/fingerprinting/fingerprint-overrides/platform-consistency.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;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;IAEf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,eAAO,MAAM,+BAA+B,aAAc,MAAM,oBAAoB,cAAc,KAAG,MAimBpG,CAAC"}
@@ -21,7 +21,7 @@ export const createPlatformConsistencyScript = (platform, fingerprintData) => {
21
21
  maxTouchPoints: 0,
22
22
  platform: 'Win32',
23
23
  oscpu: 'Windows NT 10.0; Win64; x64',
24
- vendor: '',
24
+ vendor: 'Google Inc.',
25
25
  vendorSub: '',
26
26
  productSub: '20030107',
27
27
  cookieEnabled: true,
@@ -46,13 +46,14 @@ export const createPlatformConsistencyScript = (platform, fingerprintData) => {
46
46
  { type: 'text/pdf', suffixes: 'pdf', description: 'Portable Document Format' },
47
47
  ],
48
48
  // Windows-specific connection properties
49
+ // NOTE: 'type' is NOT available on desktop Chrome (only Android),
50
+ // so we intentionally omit it to match real browser behavior
49
51
  connection: {
50
52
  downlink: 10,
51
53
  effectiveType: '4g',
52
54
  onchange: null,
53
55
  rtt: 50,
54
56
  saveData: false,
55
- type: 'ethernet',
56
57
  },
57
58
  },
58
59
  'MacIntel': {
@@ -212,25 +213,26 @@ export const createPlatformConsistencyScript = (platform, fingerprintData) => {
212
213
  safeDefineProperty(navigator, 'mimeTypes', mimeTypesGetter);
213
214
  }
214
215
 
215
- // Override navigator.connection for Windows consistency
216
- // Note: Some connection properties (like downlink, rtt) are non-configurable in Chrome
216
+ // Override navigator.connection using a Proxy
217
+ // Connection properties (rtt, downlink, etc.) are non-configurable getters in Chrome,
218
+ // so Object.defineProperty fails. A Proxy on the navigator property intercepts all reads.
219
+ // CRITICAL: rtt === 0 in headless mode is a well-known detection vector.
217
220
  if (config.connection && navigator.connection) {
218
- Object.keys(config.connection).forEach(key => {
219
- try {
220
- const descriptor = Object.getOwnPropertyDescriptor(navigator.connection, key);
221
- if (descriptor && descriptor.configurable === false) {
222
- // Property is non-configurable, skip it
223
- return;
221
+ const realConnection = navigator.connection;
222
+ const connectionOverrides = config.connection;
223
+ const connectionProxy = new Proxy(realConnection, {
224
+ get(target, prop, receiver) {
225
+ if (prop in connectionOverrides) {
226
+ return connectionOverrides[prop];
224
227
  }
225
- Object.defineProperty(navigator.connection, key, {
226
- value: config.connection[key],
227
- writable: false,
228
- configurable: true
229
- });
230
- } catch (e) {
231
- // Silently ignore non-configurable properties
228
+ const value = Reflect.get(target, prop, receiver);
229
+ if (typeof value === 'function') {
230
+ return value.bind(target);
231
+ }
232
+ return value;
232
233
  }
233
234
  });
235
+ safeDefineProperty(navigator, 'connection', () => connectionProxy);
234
236
  }
235
237
 
236
238
  // Override screen properties (with guards)
@@ -1 +1 @@
1
- {"version":3,"file":"platform-consistency.js","sourceRoot":"","sources":["../../../src/fingerprinting/fingerprint-overrides/platform-consistency.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"platform-consistency.js","sourceRoot":"","sources":["../../../src/fingerprinting/fingerprint-overrides/platform-consistency.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"stealth-script.d.ts","sourceRoot":"","sources":["../../../src/fingerprinting/fingerprint-overrides/stealth-script.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,eAAO,MAAM,mBAAmB,QAAO,MA+4BtC,CAAC"}
1
+ {"version":3,"file":"stealth-script.d.ts","sourceRoot":"","sources":["../../../src/fingerprinting/fingerprint-overrides/stealth-script.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,eAAO,MAAM,mBAAmB,QAAO,MAy8BtC,CAAC"}
@@ -84,10 +84,11 @@ export const createStealthScript = () => {
84
84
 
85
85
  // 3. WebDriver and Automation Flags Removal (2025)
86
86
  const removeAutomationFlags = () => {
87
- // Remove webdriver (with guard)
88
- if (navigator.webdriver) {
89
- safeDefineGetter(navigator, 'webdriver', () => undefined, false);
90
- }
87
+ // Override webdriver to false (NOT undefined).
88
+ // In real Chrome 89+, navigator.webdriver exists and is false.
89
+ // Setting to undefined would make 'webdriver' in navigator return false,
90
+ // which is itself a detection vector.
91
+ safeDefineGetter(navigator, 'webdriver', () => false, true);
91
92
 
92
93
  // Remove automation indicators
93
94
  const automationProperties = [
@@ -283,16 +284,22 @@ export const createStealthScript = () => {
283
284
  };
284
285
 
285
286
  // 8. Connection API Spoofing (2025)
287
+ // Uses Proxy because connection properties are non-configurable getters.
288
+ // rtt === 0 is a well-known headless detection vector.
286
289
  const spoofConnectionAPI = () => {
287
290
  if ('connection' in navigator || 'mozConnection' in navigator || 'webkitConnection' in navigator) {
288
- const connection = navigator.connection || navigator.mozConnection || navigator.webkitConnection;
289
- if (connection) {
290
- try {
291
- Object.defineProperty(connection, 'rtt', { value: 50, writable: false });
292
- Object.defineProperty(connection, 'downlink', { value: 10.0, writable: false });
293
- Object.defineProperty(connection, 'effectiveType', { value: '4g', writable: false });
294
- Object.defineProperty(connection, 'saveData', { value: false, writable: false });
295
- } catch (e) {}
291
+ const realConnection = navigator.connection || navigator.mozConnection || navigator.webkitConnection;
292
+ if (realConnection) {
293
+ const overrides = { rtt: 50, downlink: 10.0, effectiveType: '4g', saveData: false };
294
+ const proxy = new Proxy(realConnection, {
295
+ get(target, prop, receiver) {
296
+ if (prop in overrides) return overrides[prop];
297
+ const val = Reflect.get(target, prop, receiver);
298
+ if (typeof val === 'function') return val.bind(target);
299
+ return val;
300
+ }
301
+ });
302
+ safeDefineGetter(navigator, 'connection', () => proxy);
296
303
  }
297
304
  }
298
305
  };
@@ -334,22 +341,73 @@ export const createStealthScript = () => {
334
341
  requestUpdateCheck: () => Promise.resolve(['no_update', {}]),
335
342
  restart: () => {},
336
343
  restartAfterDelay: () => {},
337
- getPlatformInfo: () => Promise.resolve({
338
- os: 'win',
339
- arch: 'x86-64',
340
- nacl_arch: 'x86-64'
341
- }),
344
+ getPlatformInfo: () => {
345
+ // Derive OS from navigator.platform for consistency
346
+ const p = (navigator.platform || '').toLowerCase();
347
+ let os = 'win';
348
+ let arch = 'x86-64';
349
+ if (p.includes('mac')) { os = 'mac'; arch = 'arm64'; }
350
+ else if (p.includes('linux')) { os = 'linux'; }
351
+ return Promise.resolve({ os, arch, nacl_arch: arch });
352
+ },
342
353
  getPackageDirectoryEntry: () => Promise.resolve({}),
343
354
  lastError: null
344
355
  };
345
356
 
346
357
  if (!window.chrome) window.chrome = {};
347
- safeDefineProperty(window.chrome, 'runtime', {
348
- value: runtime,
358
+ safeDefineProperty(window.chrome, 'runtime', {
359
+ value: runtime,
349
360
  enumerable: true,
350
361
  writable: false
351
362
  });
352
363
  }
364
+
365
+ // Ensure chrome.app exists (present in all real Chrome browsers)
366
+ if (window.chrome && !window.chrome.app) {
367
+ window.chrome.app = {
368
+ isInstalled: false,
369
+ InstallState: { DISABLED: 'disabled', INSTALLED: 'installed', NOT_INSTALLED: 'not_installed' },
370
+ RunningState: { CANNOT_RUN: 'cannot_run', READY_TO_RUN: 'ready_to_run', RUNNING: 'running' },
371
+ getDetails: () => null,
372
+ getIsInstalled: () => false,
373
+ installState: () => 'not_installed',
374
+ runningState: () => 'cannot_run',
375
+ };
376
+ }
377
+
378
+ // chrome.csi() - Chrome-specific, returns page load timing info
379
+ if (window.chrome && !window.chrome.csi) {
380
+ window.chrome.csi = function() {
381
+ return {
382
+ onloadT: Date.now() - (Math.random() * 2000 + 500),
383
+ startE: Date.now() - (Math.random() * 3000 + 1000),
384
+ pageT: performance.now(),
385
+ tran: 15, // Normal navigation
386
+ };
387
+ };
388
+ }
389
+
390
+ // chrome.loadTimes() - Chrome-specific, returns load timing info
391
+ if (window.chrome && !window.chrome.loadTimes) {
392
+ window.chrome.loadTimes = function() {
393
+ const now = Date.now() / 1000;
394
+ return {
395
+ commitLoadTime: now - Math.random() * 2,
396
+ connectionInfo: 'h2',
397
+ finishDocumentLoadTime: now - Math.random(),
398
+ finishLoadTime: now - Math.random() * 0.5,
399
+ firstPaintAfterLoadTime: 0,
400
+ firstPaintTime: now - Math.random() * 1.5,
401
+ navigationType: 'Other',
402
+ npnNegotiatedProtocol: 'h2',
403
+ requestTime: now - Math.random() * 3,
404
+ startLoadTime: now - Math.random() * 2.5,
405
+ wasAlternateProtocolAvailable: false,
406
+ wasFetchedViaSpdy: true,
407
+ wasNpnNegotiated: true,
408
+ };
409
+ };
410
+ }
353
411
  };
354
412
 
355
413
  // 10. Device Memory Spoofing (2024-2025)
@@ -1 +1 @@
1
- {"version":3,"file":"stealth-script.js","sourceRoot":"","sources":["../../../src/fingerprinting/fingerprint-overrides/stealth-script.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,MAAM,CAAC,MAAM,mBAAmB,GAAG,GAAW,EAAE;IAC5C,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MA64BL,CAAC;AACP,CAAC,CAAC"}
1
+ {"version":3,"file":"stealth-script.js","sourceRoot":"","sources":["../../../src/fingerprinting/fingerprint-overrides/stealth-script.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,MAAM,CAAC,MAAM,mBAAmB,GAAG,GAAW,EAAE;IAC5C,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAu8BL,CAAC;AACP,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"ua-ch.d.ts","sourceRoot":"","sources":["../../../src/fingerprinting/fingerprint-overrides/ua-ch.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,WAAW,iBAAiB;IAC9B,MAAM,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC9C,eAAe,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACvD,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,eAAO,MAAM,iCAAiC,wCAExB,iBAAiB,KACpC,MA8MF,CAAC"}
1
+ {"version":3,"file":"ua-ch.d.ts","sourceRoot":"","sources":["../../../src/fingerprinting/fingerprint-overrides/ua-ch.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,WAAW,iBAAiB;IAC9B,MAAM,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC9C,eAAe,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACvD,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,eAAO,MAAM,iCAAiC,wCAExB,iBAAiB,KACpC,MAuNF,CAAC"}