jumpy-lion 0.1.6-beta.7 → 1.0.0-beta.0
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.
- package/README.md +1 -607
- package/browser/fonts/macos-bundle/40-macos-aliases.conf +515 -0
- package/browser/fonts/macos-bundle/README.md +24 -0
- package/browser/fonts/macos-bundle/install.sh +83 -0
- package/dist/browser-controller.d.ts +47 -4
- package/dist/browser-controller.d.ts.map +1 -1
- package/dist/browser-controller.js +219 -278
- package/dist/browser-controller.js.map +1 -1
- package/dist/browser-plugin.d.ts +82 -110
- package/dist/browser-plugin.d.ts.map +1 -1
- package/dist/browser-plugin.js +376 -379
- package/dist/browser-plugin.js.map +1 -1
- package/dist/browser-process/align-fingerprint-config.d.ts +36 -0
- package/dist/browser-process/align-fingerprint-config.d.ts.map +1 -0
- package/dist/browser-process/align-fingerprint-config.js +74 -0
- package/dist/browser-process/align-fingerprint-config.js.map +1 -0
- package/dist/browser-process/anti-detect-browser.d.ts +2 -2
- package/dist/browser-process/anti-detect-browser.js +7 -7
- package/dist/browser-process/anti-detect-config.d.ts +131 -2
- package/dist/browser-process/anti-detect-config.d.ts.map +1 -1
- package/dist/browser-process/anti-detect-config.js +337 -127
- package/dist/browser-process/anti-detect-config.js.map +1 -1
- package/dist/browser-process/browser.d.ts +25 -92
- package/dist/browser-process/browser.d.ts.map +1 -1
- package/dist/browser-process/browser.js +429 -73
- package/dist/browser-process/browser.js.map +1 -1
- package/dist/browser-process/fingerprint-config.d.ts +146 -0
- package/dist/browser-process/fingerprint-config.d.ts.map +1 -0
- package/dist/browser-process/fingerprint-config.js +308 -0
- package/dist/browser-process/fingerprint-config.js.map +1 -0
- package/dist/browser-process/get-chrome-executable.d.ts +6 -0
- package/dist/browser-process/get-chrome-executable.d.ts.map +1 -1
- package/dist/browser-process/get-chrome-executable.js +79 -4
- package/dist/browser-process/get-chrome-executable.js.map +1 -1
- package/dist/browser-process/gpu-family-profiles.d.ts +58 -0
- package/dist/browser-process/gpu-family-profiles.d.ts.map +1 -0
- package/dist/browser-process/gpu-family-profiles.js +480 -0
- package/dist/browser-process/gpu-family-profiles.js.map +1 -0
- package/dist/browser-process/launch-options.d.ts +301 -0
- package/dist/browser-process/launch-options.d.ts.map +1 -0
- package/dist/browser-process/launch-options.js +2 -0
- package/dist/browser-process/launch-options.js.map +1 -0
- package/dist/browser-process/port-allocator.d.ts +64 -0
- package/dist/browser-process/port-allocator.d.ts.map +1 -0
- package/dist/browser-process/port-allocator.js +198 -0
- package/dist/browser-process/port-allocator.js.map +1 -0
- package/dist/browser-process/process.d.ts +85 -0
- package/dist/browser-process/process.d.ts.map +1 -1
- package/dist/browser-process/process.js +235 -19
- package/dist/browser-process/process.js.map +1 -1
- package/dist/browser-process/signal-cleanup.d.ts +40 -0
- package/dist/browser-process/signal-cleanup.d.ts.map +1 -0
- package/dist/browser-process/signal-cleanup.js +105 -0
- package/dist/browser-process/signal-cleanup.js.map +1 -0
- package/dist/browser-process/widevine-cdm.d.ts +144 -0
- package/dist/browser-process/widevine-cdm.d.ts.map +1 -0
- package/dist/browser-process/widevine-cdm.js +298 -0
- package/dist/browser-process/widevine-cdm.js.map +1 -0
- package/dist/browser-profiles/chrome/populate-profile.d.ts.map +1 -1
- package/dist/browser-profiles/chrome/populate-profile.js +21 -22
- package/dist/browser-profiles/chrome/populate-profile.js.map +1 -1
- package/dist/connection/cdp-reconnection.d.ts +50 -0
- package/dist/connection/cdp-reconnection.d.ts.map +1 -0
- package/dist/connection/cdp-reconnection.js +75 -0
- package/dist/connection/cdp-reconnection.js.map +1 -0
- package/dist/connection/page-session.d.ts +114 -0
- package/dist/connection/page-session.d.ts.map +1 -0
- package/dist/connection/page-session.js +237 -0
- package/dist/connection/page-session.js.map +1 -0
- package/dist/connection/session-client.d.ts +34 -0
- package/dist/connection/session-client.d.ts.map +1 -0
- package/dist/connection/session-client.js +129 -0
- package/dist/connection/session-client.js.map +1 -0
- package/dist/crawler.d.ts +9 -88
- package/dist/crawler.d.ts.map +1 -1
- package/dist/crawler.js +157 -8
- package/dist/crawler.js.map +1 -1
- package/dist/fingerprinting/fingerprint-injector.d.ts +24 -114
- package/dist/fingerprinting/fingerprint-injector.d.ts.map +1 -1
- package/dist/fingerprinting/fingerprint-injector.js +305 -611
- package/dist/fingerprinting/fingerprint-injector.js.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/datadome-bypass.d.ts +1 -1
- package/dist/fingerprinting/fingerprint-overrides/datadome-bypass.d.ts.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/datadome-bypass.js +16 -14
- package/dist/fingerprinting/fingerprint-overrides/datadome-bypass.js.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/index.d.ts +6 -2
- package/dist/fingerprinting/fingerprint-overrides/index.d.ts.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/index.js +6 -2
- package/dist/fingerprinting/fingerprint-overrides/index.js.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/keyboard-humanization.d.ts +1 -1
- package/dist/fingerprinting/fingerprint-overrides/keyboard-humanization.js +4 -4
- package/dist/fingerprinting/fingerprint-overrides/keyboard-humanization.js.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/locale-spoofing.js +4 -4
- package/dist/fingerprinting/fingerprint-overrides/navigator-override.d.ts +18 -0
- package/dist/fingerprinting/fingerprint-overrides/navigator-override.d.ts.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/navigator-override.js +136 -0
- package/dist/fingerprinting/fingerprint-overrides/navigator-override.js.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/override.d.ts +151 -0
- package/dist/fingerprinting/fingerprint-overrides/override.d.ts.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/override.js +14 -0
- package/dist/fingerprinting/fingerprint-overrides/override.js.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/platform-consistency.d.ts.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/platform-consistency.js +46 -15
- package/dist/fingerprinting/fingerprint-overrides/platform-consistency.js.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/registry.d.ts +43 -0
- package/dist/fingerprinting/fingerprint-overrides/registry.d.ts.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/registry.js +342 -0
- package/dist/fingerprinting/fingerprint-overrides/registry.js.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/screen-override.d.ts +16 -0
- package/dist/fingerprinting/fingerprint-overrides/screen-override.d.ts.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/screen-override.js +175 -0
- package/dist/fingerprinting/fingerprint-overrides/screen-override.js.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/scroll-humanization.d.ts +1 -1
- package/dist/fingerprinting/fingerprint-overrides/scroll-humanization.js +4 -4
- package/dist/fingerprinting/fingerprint-overrides/scroll-humanization.js.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/stealth-script.d.ts.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/stealth-script.js +75 -9
- package/dist/fingerprinting/fingerprint-overrides/stealth-script.js.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/ua-ch.d.ts +1 -1
- package/dist/fingerprinting/fingerprint-overrides/ua-ch.d.ts.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/ua-ch.js +34 -20
- package/dist/fingerprinting/fingerprint-overrides/ua-ch.js.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/webgl-spoofing.d.ts.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/webgl-spoofing.js +25 -6
- package/dist/fingerprinting/fingerprint-overrides/webgl-spoofing.js.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/webrtc-spoofing.js +1 -1
- package/dist/fingerprinting/hardware-realism.d.ts +83 -0
- package/dist/fingerprinting/hardware-realism.d.ts.map +1 -0
- package/dist/fingerprinting/hardware-realism.js +156 -0
- package/dist/fingerprinting/hardware-realism.js.map +1 -0
- package/dist/fingerprinting/injection-planner.d.ts +133 -0
- package/dist/fingerprinting/injection-planner.d.ts.map +1 -0
- package/dist/fingerprinting/injection-planner.js +497 -0
- package/dist/fingerprinting/injection-planner.js.map +1 -0
- package/dist/fingerprinting/locale-resolver.d.ts +8 -1
- package/dist/fingerprinting/locale-resolver.d.ts.map +1 -1
- package/dist/fingerprinting/locale-resolver.js +26 -3
- package/dist/fingerprinting/locale-resolver.js.map +1 -1
- package/dist/fingerprinting/non-apify-fingerprint-generator.d.ts +4 -4
- package/dist/fingerprinting/non-apify-fingerprint-generator.d.ts.map +1 -1
- package/dist/fingerprinting/non-apify-fingerprint-generator.js +24 -58
- package/dist/fingerprinting/non-apify-fingerprint-generator.js.map +1 -1
- package/dist/fingerprinting/non-apify-profiles.json +10515 -8494
- package/dist/fingerprinting/os-consistency.d.ts +28 -0
- package/dist/fingerprinting/os-consistency.d.ts.map +1 -0
- package/dist/fingerprinting/os-consistency.js +45 -0
- package/dist/fingerprinting/os-consistency.js.map +1 -0
- package/dist/fingerprinting/profile-quality.d.ts +25 -0
- package/dist/fingerprinting/profile-quality.d.ts.map +1 -0
- package/dist/fingerprinting/profile-quality.js +310 -0
- package/dist/fingerprinting/profile-quality.js.map +1 -0
- package/dist/fingerprinting/profile-selector.d.ts +102 -0
- package/dist/fingerprinting/profile-selector.d.ts.map +1 -0
- package/dist/fingerprinting/profile-selector.js +168 -0
- package/dist/fingerprinting/profile-selector.js.map +1 -0
- package/dist/fingerprinting/ua-alignment.d.ts +83 -0
- package/dist/fingerprinting/ua-alignment.d.ts.map +1 -0
- package/dist/fingerprinting/ua-alignment.js +197 -0
- package/dist/fingerprinting/ua-alignment.js.map +1 -0
- package/dist/fingerprinting/ua-ch-brands.d.ts +88 -0
- package/dist/fingerprinting/ua-ch-brands.d.ts.map +1 -0
- package/dist/fingerprinting/ua-ch-brands.js +174 -0
- package/dist/fingerprinting/ua-ch-brands.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/input/dropdown-selector.d.ts +90 -0
- package/dist/input/dropdown-selector.d.ts.map +1 -0
- package/dist/input/dropdown-selector.js +394 -0
- package/dist/input/dropdown-selector.js.map +1 -0
- package/dist/input/element-target.d.ts +152 -0
- package/dist/input/element-target.d.ts.map +1 -0
- package/dist/input/element-target.js +461 -0
- package/dist/input/element-target.js.map +1 -0
- package/dist/input/input-emulator.d.ts +85 -0
- package/dist/input/input-emulator.d.ts.map +1 -0
- package/dist/input/input-emulator.js +325 -0
- package/dist/input/input-emulator.js.map +1 -0
- package/dist/input/input-transport.d.ts +60 -0
- package/dist/input/input-transport.d.ts.map +1 -0
- package/dist/input/input-transport.js +28 -0
- package/dist/input/input-transport.js.map +1 -0
- package/dist/input/recording-transport.d.ts +32 -0
- package/dist/input/recording-transport.d.ts.map +1 -0
- package/dist/input/recording-transport.js +43 -0
- package/dist/input/recording-transport.js.map +1 -0
- package/dist/keyboard-layout.d.ts +2 -2
- package/dist/keyboard-layout.js +2 -2
- package/dist/navigation/page-navigation.d.ts +67 -0
- package/dist/navigation/page-navigation.d.ts.map +1 -0
- package/dist/navigation/page-navigation.js +122 -0
- package/dist/navigation/page-navigation.js.map +1 -0
- package/dist/network/network-watch.d.ts +110 -0
- package/dist/network/network-watch.d.ts.map +1 -0
- package/dist/network/network-watch.js +223 -0
- package/dist/network/network-watch.js.map +1 -0
- package/dist/page.d.ts +118 -104
- package/dist/page.d.ts.map +1 -1
- package/dist/page.js +311 -1130
- package/dist/page.js.map +1 -1
- package/dist/session/inject-hook.d.ts +24 -0
- package/dist/session/inject-hook.d.ts.map +1 -0
- package/dist/session/inject-hook.js +80 -0
- package/dist/session/inject-hook.js.map +1 -0
- package/dist/session/save.d.ts +21 -0
- package/dist/session/save.d.ts.map +1 -0
- package/dist/session/save.js +163 -0
- package/dist/session/save.js.map +1 -0
- package/dist/session/tar-data-dir.d.ts +18 -0
- package/dist/session/tar-data-dir.d.ts.map +1 -0
- package/dist/session/tar-data-dir.js +105 -0
- package/dist/session/tar-data-dir.js.map +1 -0
- package/dist/session/types.d.ts +80 -0
- package/dist/session/types.d.ts.map +1 -0
- package/dist/session/types.js +29 -0
- package/dist/session/types.js.map +1 -0
- package/dist/session-profile.d.ts +102 -0
- package/dist/session-profile.d.ts.map +1 -0
- package/dist/session-profile.js +163 -0
- package/dist/session-profile.js.map +1 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +17 -6
- package/scripts/postinstall.cjs +58 -0
- package/dist/fingerprinting/custom-fingerprint-injector.d.ts +0 -87
- package/dist/fingerprinting/custom-fingerprint-injector.d.ts.map +0 -1
- package/dist/fingerprinting/custom-fingerprint-injector.js +0 -342
- package/dist/fingerprinting/custom-fingerprint-injector.js.map +0 -1
- package/dist/launcher-wrap.d.ts +0 -10
- package/dist/launcher-wrap.d.ts.map +0 -1
- package/dist/launcher-wrap.js +0 -11
- package/dist/launcher-wrap.js.map +0 -1
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* UA-CH brand-list derivation - the GREASE token, its version, and the order
|
|
3
|
+
* of the three-entry brand list are all deterministic functions of the Chrome
|
|
4
|
+
* major version. This module is the single source of truth for that
|
|
5
|
+
* derivation; every surface that emits `sec-ch-ua` /
|
|
6
|
+
* `navigator.userAgentData.brands` (JS injection, CDP
|
|
7
|
+
* `Network.setUserAgentOverride` metadata, the native FingerprintConfig JSON,
|
|
8
|
+
* the bundled profile tables) must go through it.
|
|
9
|
+
*
|
|
10
|
+
* Why this matters: the GREASE entry is NOT arbitrary padding. Chromium
|
|
11
|
+
* (`components/embedder_support/user_agent_utils.cc`,
|
|
12
|
+
* `GetGreasedUserAgentBrandVersion` / `GenerateBrandVersionList`) derives the
|
|
13
|
+
* separators, the fake version and the list order from the major version:
|
|
14
|
+
*
|
|
15
|
+
* brand = 'Not' + chars[major % 11] + 'A' + chars[(major + 1) % 11] + 'Brand'
|
|
16
|
+
* version = versions[major % 3]
|
|
17
|
+
* order = ORDERS[major % 6] // permutation of [greasey, chromium, brand]
|
|
18
|
+
*
|
|
19
|
+
* So a profile's GREASE token is a fingerprint of the major it was harvested
|
|
20
|
+
* from. Carrying a Chrome 134 GREASE (`"Not:A-Brand";v="24"`) on a Chrome 147
|
|
21
|
+
* User-Agent yields a `sec-ch-ua` no Chromium has ever emitted - four lines of
|
|
22
|
+
* server-side code catch it. `search.shopping.naver.com` does exactly that and
|
|
23
|
+
* answers HTTP 418 with no challenge (issue #131).
|
|
24
|
+
*
|
|
25
|
+
* Corroboration for the derivation (real Chrome, on the wire): majors 116
|
|
26
|
+
* (`Not)A;Brand`/24), 128 (`Not;A=Brand`/24), 131 (`Not_A Brand`/24), 142
|
|
27
|
+
* (`Not_A Brand`/99, accepted by Naver). The order rule was verified against
|
|
28
|
+
* the 187 harvested `sec-ch-ua` strings bundled in `non-apify-profiles.json`
|
|
29
|
+
* (majors 140, 142, 143, 144, 145, 146 - every one matches `major % 6`).
|
|
30
|
+
*/
|
|
31
|
+
/** Separator pool - `greasey_chars` in `user_agent_utils.cc`. */
|
|
32
|
+
const GREASEY_CHARS = [' ', '(', ':', '-', '.', '/', ')', ';', '=', '?', '_'];
|
|
33
|
+
/** Fake-version pool - `greased_versions` in `user_agent_utils.cc`. */
|
|
34
|
+
const GREASEY_VERSIONS = ['8', '99', '24'];
|
|
35
|
+
/**
|
|
36
|
+
* The six permutations Chromium shuffles `[greasey, chromium, brand]` through,
|
|
37
|
+
* in the order they appear in `GenerateBrandVersionList`. `ORDERS[major % 6]`
|
|
38
|
+
* gives the target index of each of the three entries.
|
|
39
|
+
*/
|
|
40
|
+
const BRAND_ORDERS = [
|
|
41
|
+
[0, 1, 2],
|
|
42
|
+
[0, 2, 1],
|
|
43
|
+
[1, 0, 2],
|
|
44
|
+
[1, 2, 0],
|
|
45
|
+
[2, 0, 1],
|
|
46
|
+
[2, 1, 0],
|
|
47
|
+
];
|
|
48
|
+
/**
|
|
49
|
+
* Match the UA-CH GREASE brand token. Chrome rotates the label across releases
|
|
50
|
+
* ("Not_A Brand", "Not)A;Brand", "Not.A/Brand", …); the separators vary but the
|
|
51
|
+
* Not?A?Brand shape is stable. Anchored, so it only ever matches the GREASE
|
|
52
|
+
* entry and never a real brand.
|
|
53
|
+
*/
|
|
54
|
+
export function isGreaseBrand(brand) {
|
|
55
|
+
return /^Not.A.Brand$/i.test(brand);
|
|
56
|
+
}
|
|
57
|
+
/** The GREASE brand + version a real Chromium of this major emits. */
|
|
58
|
+
export function greasedBrandForMajor(major) {
|
|
59
|
+
const brand = `Not${GREASEY_CHARS[major % GREASEY_CHARS.length]}A`
|
|
60
|
+
+ `${GREASEY_CHARS[(major + 1) % GREASEY_CHARS.length]}Brand`;
|
|
61
|
+
return { brand, version: GREASEY_VERSIONS[major % GREASEY_VERSIONS.length] };
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Rebuild a UA-CH brand list so it is byte-identical to what Chromium
|
|
65
|
+
* `version` emits: derived GREASE token, real brands re-stamped to `version`,
|
|
66
|
+
* and the triple permuted by `major % 6`.
|
|
67
|
+
*
|
|
68
|
+
* `version` selects the surface, from its own shape:
|
|
69
|
+
* - `"147"` → the `brands` surface; GREASE version is `"8"`
|
|
70
|
+
* - `"147.0.7727.56"` → the `fullVersionList` surface; GREASE version is `"8.0.0.0"`
|
|
71
|
+
*
|
|
72
|
+
* The profile's real brand *names* are preserved (a Chromium-only profile stays
|
|
73
|
+
* Chromium-only); only versions, the GREASE entry and the order are rewritten.
|
|
74
|
+
* A GREASE entry is added when the profile has none - a two-brand `sec-ch-ua`
|
|
75
|
+
* is refused by the same checks that reject a mismatched GREASE.
|
|
76
|
+
*/
|
|
77
|
+
export function alignBrandList(brands, version) {
|
|
78
|
+
const major = Number.parseInt(version.split('.')[0] ?? '', 10);
|
|
79
|
+
if (!Number.isFinite(major)) {
|
|
80
|
+
return brands;
|
|
81
|
+
}
|
|
82
|
+
const isFullVersionSurface = version.includes('.');
|
|
83
|
+
const grease = greasedBrandForMajor(major);
|
|
84
|
+
const greaseEntry = {
|
|
85
|
+
brand: grease.brand,
|
|
86
|
+
version: isFullVersionSurface ? `${grease.version}.0.0.0` : grease.version,
|
|
87
|
+
};
|
|
88
|
+
const realBrands = brands
|
|
89
|
+
.filter(b => b?.brand && !isGreaseBrand(b.brand))
|
|
90
|
+
.map(b => ({ ...b, version }));
|
|
91
|
+
// Chromium's permutation is defined for exactly [greasey, chromium, brand].
|
|
92
|
+
// Anything else (Chromium-only profile, extra brands) keeps the profile's
|
|
93
|
+
// own order with the GREASE entry first rather than inventing a shuffle.
|
|
94
|
+
const chromium = realBrands.find(b => b.brand === 'Chromium');
|
|
95
|
+
const brand = realBrands.find(b => b.brand !== 'Chromium');
|
|
96
|
+
if (realBrands.length !== 2 || !chromium || !brand) {
|
|
97
|
+
return [greaseEntry, ...realBrands];
|
|
98
|
+
}
|
|
99
|
+
const order = BRAND_ORDERS[major % BRAND_ORDERS.length];
|
|
100
|
+
const ordered = [];
|
|
101
|
+
ordered[order[0]] = greaseEntry;
|
|
102
|
+
ordered[order[1]] = chromium;
|
|
103
|
+
ordered[order[2]] = brand;
|
|
104
|
+
return ordered;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* The canonical brand list of a real Google Chrome build of `version` - what
|
|
108
|
+
* `sec-ch-ua` looks like when we have no profile brands to preserve.
|
|
109
|
+
*/
|
|
110
|
+
export function canonicalBrandList(version) {
|
|
111
|
+
return alignBrandList([{ brand: 'Chromium', version }, { brand: 'Google Chrome', version }], version);
|
|
112
|
+
}
|
|
113
|
+
/** Serialize a brand list into a `sec-ch-ua` / `sec-ch-ua-full-version-list` header value. */
|
|
114
|
+
export function buildSecChUaHeader(brands) {
|
|
115
|
+
return brands.map(b => `"${b.brand}";v="${b.version}"`).join(', ');
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Does this brand list carry the GREASE token its own major implies?
|
|
119
|
+
*
|
|
120
|
+
* Used as a pool-contamination gate: a real Chrome profile always agrees with
|
|
121
|
+
* the derivation, so a disagreement means the brand list was synthesized or
|
|
122
|
+
* re-stamped by something that did not know the rule (including older versions
|
|
123
|
+
* of this crawler). Returns a human-readable reason, or null when coherent.
|
|
124
|
+
*/
|
|
125
|
+
export function describeGreaseIncoherence(brands) {
|
|
126
|
+
if (brands.length === 0) {
|
|
127
|
+
return null;
|
|
128
|
+
}
|
|
129
|
+
const real = brands.filter(b => b?.brand && !isGreaseBrand(b.brand));
|
|
130
|
+
const anchor = real.find(b => b.brand === 'Chromium') ?? real[0];
|
|
131
|
+
const major = Number.parseInt(anchor?.version?.split('.')[0] ?? '', 10);
|
|
132
|
+
if (!Number.isFinite(major)) {
|
|
133
|
+
return null;
|
|
134
|
+
}
|
|
135
|
+
const expected = greasedBrandForMajor(major);
|
|
136
|
+
const actual = brands.find(b => b?.brand && isGreaseBrand(b.brand));
|
|
137
|
+
if (!actual) {
|
|
138
|
+
return `userAgentData.brands has no GREASE entry (real Chrome ${major} sends "${expected.brand}";v="${expected.version}")`;
|
|
139
|
+
}
|
|
140
|
+
if (actual.brand !== expected.brand || (actual.version ?? '').split('.')[0] !== expected.version) {
|
|
141
|
+
return `GREASE "${actual.brand}";v="${actual.version}" contradicts major ${major}`
|
|
142
|
+
+ ` (Chromium derives "${expected.brand}";v="${expected.version}")`;
|
|
143
|
+
}
|
|
144
|
+
return null;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* JS source for an expression that derives the brand list *inside the page*.
|
|
148
|
+
*
|
|
149
|
+
* The injected-script fallbacks (ua-ch, datadome-bypass) learn the Chrome
|
|
150
|
+
* version only at runtime, by parsing `navigator.userAgent`, so they cannot use
|
|
151
|
+
* the helpers above at build time. This keeps their derivation identical to
|
|
152
|
+
* ours instead of hardcoding a literal GREASE token that rots.
|
|
153
|
+
*
|
|
154
|
+
* @param majorExpr in-scope JS expression holding the major version
|
|
155
|
+
* @param versionExpr in-scope JS expression holding the version to stamp on the real brands
|
|
156
|
+
* @param style 'major' for the `brands` surface, 'full' for `fullVersionList`
|
|
157
|
+
*/
|
|
158
|
+
export function brandListScriptExpression(majorExpr, versionExpr, style) {
|
|
159
|
+
const chars = JSON.stringify(GREASEY_CHARS);
|
|
160
|
+
const versions = JSON.stringify(GREASEY_VERSIONS);
|
|
161
|
+
const orders = JSON.stringify(BRAND_ORDERS);
|
|
162
|
+
const greaseVersion = style === 'full' ? '_gv + ".0.0.0"' : '_gv';
|
|
163
|
+
return `(function () {
|
|
164
|
+
var _m = parseInt(${majorExpr}, 10);
|
|
165
|
+
var _c = ${chars}, _vs = ${versions}, _o = ${orders}[_m % 6];
|
|
166
|
+
var _gv = _vs[_m % 3];
|
|
167
|
+
var _out = [];
|
|
168
|
+
_out[_o[0]] = { brand: "Not" + _c[_m % 11] + "A" + _c[(_m + 1) % 11] + "Brand", version: ${greaseVersion} };
|
|
169
|
+
_out[_o[1]] = { brand: "Chromium", version: ${versionExpr} };
|
|
170
|
+
_out[_o[2]] = { brand: "Google Chrome", version: ${versionExpr} };
|
|
171
|
+
return _out;
|
|
172
|
+
})()`;
|
|
173
|
+
}
|
|
174
|
+
//# sourceMappingURL=ua-ch-brands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ua-ch-brands.js","sourceRoot":"","sources":["../../src/fingerprinting/ua-ch-brands.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -5,4 +5,9 @@ export { createCDPRouter } from "./crawler.js";
|
|
|
5
5
|
export type { CDPRouter, CDPCrawlingContext, CDPCrawlerOptions, CDPLaunchContext, CDPRequestHandler } from "./crawler.js";
|
|
6
6
|
export type { GotoOptions, SelectOptionOptions } from "./page.js";
|
|
7
7
|
export { CdpPage };
|
|
8
|
+
export { saveSession } from "./session/save.js";
|
|
9
|
+
export { restoreSession, installSessionInjectionHook, buildStorageInjectionScript } from "./session/inject-hook.js";
|
|
10
|
+
export { assertValidBundle, SCHEMA_VERSION } from "./session/types.js";
|
|
11
|
+
export type { SessionBundle, SessionBundleBrowserProfile, SessionBundleFingerprintInput, SessionBundleProxyMeta, SessionBundleUserDataDir, SerializedCookie, StorageMap, LaunchSnapshot, } from "./session/types.js";
|
|
12
|
+
export type { SaveSessionOptions } from "./session/save.js";
|
|
8
13
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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,MAAM,cAAc,CAAC;AAC/C,YAAY,EAAE,SAAS,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAC1H,YAAY,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAClE,OAAO,EAAE,OAAO,EAAE,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,cAAc,CAAC;AACtC,OAAO,OAAO,MAAM,WAAW,CAAC;AAEhC,eAAe,UAAU,CAAC;AAC1B,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,YAAY,EAAE,SAAS,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAC1H,YAAY,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAClE,OAAO,EAAE,OAAO,EAAE,CAAC;AAKnB,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,2BAA2B,EAAE,2BAA2B,EAAE,MAAM,0BAA0B,CAAC;AACpH,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACvE,YAAY,EACR,aAAa,EACb,2BAA2B,EAC3B,6BAA6B,EAC7B,sBAAsB,EACtB,wBAAwB,EACxB,gBAAgB,EAChB,UAAU,EACV,cAAc,GACjB,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -3,4 +3,10 @@ import CdpPage from "./page.js";
|
|
|
3
3
|
export default CDPCrawler;
|
|
4
4
|
export { createCDPRouter } from "./crawler.js";
|
|
5
5
|
export { CdpPage };
|
|
6
|
+
// Session bundle helpers - capture browser state into a single JSON blob and
|
|
7
|
+
// rehydrate it into a second crawler for full profile / cookie / fingerprint
|
|
8
|
+
// continuity. See .omc/plans/session-bundle-feature.md for design notes.
|
|
9
|
+
export { saveSession } from "./session/save.js";
|
|
10
|
+
export { restoreSession, installSessionInjectionHook, buildStorageInjectionScript } from "./session/inject-hook.js";
|
|
11
|
+
export { assertValidBundle, SCHEMA_VERSION } from "./session/types.js";
|
|
6
12
|
//# sourceMappingURL=index.js.map
|
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,EAAE,MAAM,cAAc,CAAC;AAG/C,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;AAEnB,6EAA6E;AAC7E,6EAA6E;AAC7E,yEAAyE;AACzE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,2BAA2B,EAAE,2BAA2B,EAAE,MAAM,0BAA0B,CAAC;AACpH,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DropdownSelector - the deep module beside ElementTarget that owns the whole
|
|
3
|
+
* select/dropdown protocol: native `<select>` handling, custom-dropdown
|
|
4
|
+
* trigger detection, idempotent open (triggers TOGGLE, so blind clicks are
|
|
5
|
+
* racy), and option selection with bounded scrolling for virtualized lists
|
|
6
|
+
* and bounded polling for late-rendering options.
|
|
7
|
+
*
|
|
8
|
+
* Talks to the page only through the narrow {@link DropdownSelectorPort}
|
|
9
|
+
* (ElementTargetPort + waitForSelector + the loose visibility check), so the
|
|
10
|
+
* protocol is unit-testable with a scripted port. ElementTarget decides WHERE
|
|
11
|
+
* and WHEN for coordinate clicks; DropdownSelector orchestrates the
|
|
12
|
+
* select-specific sequence on top of the same port.
|
|
13
|
+
*/
|
|
14
|
+
import { type ElementTarget, type ElementTargetPort } from './element-target.js';
|
|
15
|
+
export declare const SCROLL_ANIMATION_DELAY_MS = 200;
|
|
16
|
+
export declare const OPTION_LOAD_DELAY_MS = 300;
|
|
17
|
+
export declare const DROPDOWN_OPEN_DELAY_MS = 300;
|
|
18
|
+
export declare const DEFAULT_SELECT_TIMEOUT_MS = 30000;
|
|
19
|
+
export interface SelectOptionOptions {
|
|
20
|
+
/** Maximum wait time in milliseconds. Default: 30000 */
|
|
21
|
+
timeout?: number;
|
|
22
|
+
/** Bypass visibility and disabled checks. Default: false */
|
|
23
|
+
force?: boolean;
|
|
24
|
+
/** Wait for dropdown options to load after opening. Default: true */
|
|
25
|
+
waitForOptions?: boolean;
|
|
26
|
+
/** Maximum scroll attempts for virtualized dropdowns. Default: 10 */
|
|
27
|
+
maxScrollAttempts?: number;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* The narrow set of page capabilities DropdownSelector consumes - everything
|
|
31
|
+
* ElementTarget needs, plus selector waiting, the LOOSE visibility check
|
|
32
|
+
* (display/visibility only), and a real coordinate click. The loose check is
|
|
33
|
+
* deliberate: a menu opened with a CSS opacity/transform fade-in reads
|
|
34
|
+
* opacity:0 for the first frames, which ElementTarget's strict check counts as
|
|
35
|
+
* "not visible".
|
|
36
|
+
*/
|
|
37
|
+
export interface DropdownSelectorPort extends ElementTargetPort {
|
|
38
|
+
waitForSelector(selector: string, options?: {
|
|
39
|
+
timeout?: number;
|
|
40
|
+
}): Promise<void>;
|
|
41
|
+
/** display !== 'none' && visibility !== 'hidden' - nothing else. */
|
|
42
|
+
isLooselyVisible(selector: string): Promise<boolean>;
|
|
43
|
+
/**
|
|
44
|
+
* Dispatch a REAL trusted mouse click at viewport coordinates, through the
|
|
45
|
+
* CDP Input domain (the same path CdpPage.click uses).
|
|
46
|
+
*/
|
|
47
|
+
clickAt(x: number, y: number): Promise<void>;
|
|
48
|
+
}
|
|
49
|
+
export declare class DropdownSelector {
|
|
50
|
+
private readonly port;
|
|
51
|
+
private readonly elements;
|
|
52
|
+
constructor(port: DropdownSelectorPort, elements: ElementTarget);
|
|
53
|
+
/**
|
|
54
|
+
* Selects one or more options from a select element or dropdown.
|
|
55
|
+
*
|
|
56
|
+
* Automatically handles both regular HTML select elements and custom dropdowns:
|
|
57
|
+
* - For <select> elements: Directly selects options within the select
|
|
58
|
+
* - For custom dropdowns: Automatically detects and clicks triggers to open dropdowns,
|
|
59
|
+
* then selects the specified options with intelligent scrolling for virtualized lists
|
|
60
|
+
*/
|
|
61
|
+
selectOption(dropdownSelector: string, optionSelector: string | string[], options?: SelectOptionOptions): Promise<void>;
|
|
62
|
+
/**
|
|
63
|
+
* Turn an in-page {@link ClickHandoff} into an actual click, and report
|
|
64
|
+
* whether the element ended up clicked.
|
|
65
|
+
*
|
|
66
|
+
* Preferred path: a measured rect -> a trusted CDP Input click at a point
|
|
67
|
+
* inside it (randomized under mouse humanization, exact centre otherwise, so
|
|
68
|
+
* deterministic tests are unaffected). The in-page synthetic fallback is
|
|
69
|
+
* already-done work and simply reports success.
|
|
70
|
+
*/
|
|
71
|
+
private _completeHandoff;
|
|
72
|
+
/**
|
|
73
|
+
* Handles selection for regular HTML select elements
|
|
74
|
+
*/
|
|
75
|
+
private _handleRegularSelect;
|
|
76
|
+
/**
|
|
77
|
+
* Handles selection for custom dropdown elements.
|
|
78
|
+
* Automatically detects and clicks triggers using multiple strategies:
|
|
79
|
+
* - Common trigger patterns ([aria-haspopup], .dropdown-trigger, etc.)
|
|
80
|
+
* - Previous sibling elements
|
|
81
|
+
* - ID pattern matching (menu → trigger)
|
|
82
|
+
*/
|
|
83
|
+
private _handleCustomDropdown;
|
|
84
|
+
/**
|
|
85
|
+
* Selects a single option from a dropdown container.
|
|
86
|
+
* Handles virtualized lists with intelligent scrolling to find options that may not be initially visible.
|
|
87
|
+
*/
|
|
88
|
+
private _selectOptionFromDropdown;
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=dropdown-selector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dropdown-selector.d.ts","sourceRoot":"","sources":["../../src/input/dropdown-selector.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAyC,KAAK,aAAa,EAAE,KAAK,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAExH,eAAO,MAAM,yBAAyB,MAAM,CAAC;AAC7C,eAAO,MAAM,oBAAoB,MAAM,CAAC;AACxC,eAAO,MAAM,sBAAsB,MAAM,CAAC;AAC1C,eAAO,MAAM,yBAAyB,QAAQ,CAAC;AAE/C,MAAM,WAAW,mBAAmB;IAChC,wDAAwD;IACxD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,4DAA4D;IAC5D,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,qEAAqE;IACrE,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,qEAAqE;IACrE,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAeD;;;;;;;GAOG;AACH,MAAM,WAAW,oBAAqB,SAAQ,iBAAiB;IAC3D,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjF,oEAAoE;IACpE,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACrD;;;OAGG;IACH,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAChD;AAmCD,qBAAa,gBAAgB;IAErB,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBADR,IAAI,EAAE,oBAAoB,EAC1B,QAAQ,EAAE,aAAa;IAG5C;;;;;;;OAOG;IACG,YAAY,CACd,gBAAgB,EAAE,MAAM,EACxB,cAAc,EAAE,MAAM,GAAG,MAAM,EAAE,EACjC,OAAO,CAAC,EAAE,mBAAmB,GAC9B,OAAO,CAAC,IAAI,CAAC;IAyDhB;;;;;;;;OAQG;YACW,gBAAgB;IAmB9B;;OAEG;YACW,oBAAoB;IA4ElC;;;;;;OAMG;YACW,qBAAqB;IA4HnC;;;OAGG;YACW,yBAAyB;CA8G1C"}
|