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.
Files changed (232) hide show
  1. package/README.md +1 -607
  2. package/browser/fonts/macos-bundle/40-macos-aliases.conf +515 -0
  3. package/browser/fonts/macos-bundle/README.md +24 -0
  4. package/browser/fonts/macos-bundle/install.sh +83 -0
  5. package/dist/browser-controller.d.ts +47 -4
  6. package/dist/browser-controller.d.ts.map +1 -1
  7. package/dist/browser-controller.js +219 -278
  8. package/dist/browser-controller.js.map +1 -1
  9. package/dist/browser-plugin.d.ts +82 -110
  10. package/dist/browser-plugin.d.ts.map +1 -1
  11. package/dist/browser-plugin.js +376 -379
  12. package/dist/browser-plugin.js.map +1 -1
  13. package/dist/browser-process/align-fingerprint-config.d.ts +36 -0
  14. package/dist/browser-process/align-fingerprint-config.d.ts.map +1 -0
  15. package/dist/browser-process/align-fingerprint-config.js +74 -0
  16. package/dist/browser-process/align-fingerprint-config.js.map +1 -0
  17. package/dist/browser-process/anti-detect-browser.d.ts +2 -2
  18. package/dist/browser-process/anti-detect-browser.js +7 -7
  19. package/dist/browser-process/anti-detect-config.d.ts +131 -2
  20. package/dist/browser-process/anti-detect-config.d.ts.map +1 -1
  21. package/dist/browser-process/anti-detect-config.js +337 -127
  22. package/dist/browser-process/anti-detect-config.js.map +1 -1
  23. package/dist/browser-process/browser.d.ts +25 -92
  24. package/dist/browser-process/browser.d.ts.map +1 -1
  25. package/dist/browser-process/browser.js +429 -73
  26. package/dist/browser-process/browser.js.map +1 -1
  27. package/dist/browser-process/fingerprint-config.d.ts +146 -0
  28. package/dist/browser-process/fingerprint-config.d.ts.map +1 -0
  29. package/dist/browser-process/fingerprint-config.js +308 -0
  30. package/dist/browser-process/fingerprint-config.js.map +1 -0
  31. package/dist/browser-process/get-chrome-executable.d.ts +6 -0
  32. package/dist/browser-process/get-chrome-executable.d.ts.map +1 -1
  33. package/dist/browser-process/get-chrome-executable.js +79 -4
  34. package/dist/browser-process/get-chrome-executable.js.map +1 -1
  35. package/dist/browser-process/gpu-family-profiles.d.ts +58 -0
  36. package/dist/browser-process/gpu-family-profiles.d.ts.map +1 -0
  37. package/dist/browser-process/gpu-family-profiles.js +480 -0
  38. package/dist/browser-process/gpu-family-profiles.js.map +1 -0
  39. package/dist/browser-process/launch-options.d.ts +301 -0
  40. package/dist/browser-process/launch-options.d.ts.map +1 -0
  41. package/dist/browser-process/launch-options.js +2 -0
  42. package/dist/browser-process/launch-options.js.map +1 -0
  43. package/dist/browser-process/port-allocator.d.ts +64 -0
  44. package/dist/browser-process/port-allocator.d.ts.map +1 -0
  45. package/dist/browser-process/port-allocator.js +198 -0
  46. package/dist/browser-process/port-allocator.js.map +1 -0
  47. package/dist/browser-process/process.d.ts +85 -0
  48. package/dist/browser-process/process.d.ts.map +1 -1
  49. package/dist/browser-process/process.js +235 -19
  50. package/dist/browser-process/process.js.map +1 -1
  51. package/dist/browser-process/signal-cleanup.d.ts +40 -0
  52. package/dist/browser-process/signal-cleanup.d.ts.map +1 -0
  53. package/dist/browser-process/signal-cleanup.js +105 -0
  54. package/dist/browser-process/signal-cleanup.js.map +1 -0
  55. package/dist/browser-process/widevine-cdm.d.ts +144 -0
  56. package/dist/browser-process/widevine-cdm.d.ts.map +1 -0
  57. package/dist/browser-process/widevine-cdm.js +298 -0
  58. package/dist/browser-process/widevine-cdm.js.map +1 -0
  59. package/dist/browser-profiles/chrome/populate-profile.d.ts.map +1 -1
  60. package/dist/browser-profiles/chrome/populate-profile.js +21 -22
  61. package/dist/browser-profiles/chrome/populate-profile.js.map +1 -1
  62. package/dist/connection/cdp-reconnection.d.ts +50 -0
  63. package/dist/connection/cdp-reconnection.d.ts.map +1 -0
  64. package/dist/connection/cdp-reconnection.js +75 -0
  65. package/dist/connection/cdp-reconnection.js.map +1 -0
  66. package/dist/connection/page-session.d.ts +114 -0
  67. package/dist/connection/page-session.d.ts.map +1 -0
  68. package/dist/connection/page-session.js +237 -0
  69. package/dist/connection/page-session.js.map +1 -0
  70. package/dist/connection/session-client.d.ts +34 -0
  71. package/dist/connection/session-client.d.ts.map +1 -0
  72. package/dist/connection/session-client.js +129 -0
  73. package/dist/connection/session-client.js.map +1 -0
  74. package/dist/crawler.d.ts +9 -88
  75. package/dist/crawler.d.ts.map +1 -1
  76. package/dist/crawler.js +157 -8
  77. package/dist/crawler.js.map +1 -1
  78. package/dist/fingerprinting/fingerprint-injector.d.ts +24 -114
  79. package/dist/fingerprinting/fingerprint-injector.d.ts.map +1 -1
  80. package/dist/fingerprinting/fingerprint-injector.js +305 -611
  81. package/dist/fingerprinting/fingerprint-injector.js.map +1 -1
  82. package/dist/fingerprinting/fingerprint-overrides/datadome-bypass.d.ts +1 -1
  83. package/dist/fingerprinting/fingerprint-overrides/datadome-bypass.d.ts.map +1 -1
  84. package/dist/fingerprinting/fingerprint-overrides/datadome-bypass.js +16 -14
  85. package/dist/fingerprinting/fingerprint-overrides/datadome-bypass.js.map +1 -1
  86. package/dist/fingerprinting/fingerprint-overrides/index.d.ts +6 -2
  87. package/dist/fingerprinting/fingerprint-overrides/index.d.ts.map +1 -1
  88. package/dist/fingerprinting/fingerprint-overrides/index.js +6 -2
  89. package/dist/fingerprinting/fingerprint-overrides/index.js.map +1 -1
  90. package/dist/fingerprinting/fingerprint-overrides/keyboard-humanization.d.ts +1 -1
  91. package/dist/fingerprinting/fingerprint-overrides/keyboard-humanization.js +4 -4
  92. package/dist/fingerprinting/fingerprint-overrides/keyboard-humanization.js.map +1 -1
  93. package/dist/fingerprinting/fingerprint-overrides/locale-spoofing.js +4 -4
  94. package/dist/fingerprinting/fingerprint-overrides/navigator-override.d.ts +18 -0
  95. package/dist/fingerprinting/fingerprint-overrides/navigator-override.d.ts.map +1 -0
  96. package/dist/fingerprinting/fingerprint-overrides/navigator-override.js +136 -0
  97. package/dist/fingerprinting/fingerprint-overrides/navigator-override.js.map +1 -0
  98. package/dist/fingerprinting/fingerprint-overrides/override.d.ts +151 -0
  99. package/dist/fingerprinting/fingerprint-overrides/override.d.ts.map +1 -0
  100. package/dist/fingerprinting/fingerprint-overrides/override.js +14 -0
  101. package/dist/fingerprinting/fingerprint-overrides/override.js.map +1 -0
  102. package/dist/fingerprinting/fingerprint-overrides/platform-consistency.d.ts.map +1 -1
  103. package/dist/fingerprinting/fingerprint-overrides/platform-consistency.js +46 -15
  104. package/dist/fingerprinting/fingerprint-overrides/platform-consistency.js.map +1 -1
  105. package/dist/fingerprinting/fingerprint-overrides/registry.d.ts +43 -0
  106. package/dist/fingerprinting/fingerprint-overrides/registry.d.ts.map +1 -0
  107. package/dist/fingerprinting/fingerprint-overrides/registry.js +342 -0
  108. package/dist/fingerprinting/fingerprint-overrides/registry.js.map +1 -0
  109. package/dist/fingerprinting/fingerprint-overrides/screen-override.d.ts +16 -0
  110. package/dist/fingerprinting/fingerprint-overrides/screen-override.d.ts.map +1 -0
  111. package/dist/fingerprinting/fingerprint-overrides/screen-override.js +175 -0
  112. package/dist/fingerprinting/fingerprint-overrides/screen-override.js.map +1 -0
  113. package/dist/fingerprinting/fingerprint-overrides/scroll-humanization.d.ts +1 -1
  114. package/dist/fingerprinting/fingerprint-overrides/scroll-humanization.js +4 -4
  115. package/dist/fingerprinting/fingerprint-overrides/scroll-humanization.js.map +1 -1
  116. package/dist/fingerprinting/fingerprint-overrides/stealth-script.d.ts.map +1 -1
  117. package/dist/fingerprinting/fingerprint-overrides/stealth-script.js +75 -9
  118. package/dist/fingerprinting/fingerprint-overrides/stealth-script.js.map +1 -1
  119. package/dist/fingerprinting/fingerprint-overrides/ua-ch.d.ts +1 -1
  120. package/dist/fingerprinting/fingerprint-overrides/ua-ch.d.ts.map +1 -1
  121. package/dist/fingerprinting/fingerprint-overrides/ua-ch.js +34 -20
  122. package/dist/fingerprinting/fingerprint-overrides/ua-ch.js.map +1 -1
  123. package/dist/fingerprinting/fingerprint-overrides/webgl-spoofing.d.ts.map +1 -1
  124. package/dist/fingerprinting/fingerprint-overrides/webgl-spoofing.js +25 -6
  125. package/dist/fingerprinting/fingerprint-overrides/webgl-spoofing.js.map +1 -1
  126. package/dist/fingerprinting/fingerprint-overrides/webrtc-spoofing.js +1 -1
  127. package/dist/fingerprinting/hardware-realism.d.ts +83 -0
  128. package/dist/fingerprinting/hardware-realism.d.ts.map +1 -0
  129. package/dist/fingerprinting/hardware-realism.js +156 -0
  130. package/dist/fingerprinting/hardware-realism.js.map +1 -0
  131. package/dist/fingerprinting/injection-planner.d.ts +133 -0
  132. package/dist/fingerprinting/injection-planner.d.ts.map +1 -0
  133. package/dist/fingerprinting/injection-planner.js +497 -0
  134. package/dist/fingerprinting/injection-planner.js.map +1 -0
  135. package/dist/fingerprinting/locale-resolver.d.ts +8 -1
  136. package/dist/fingerprinting/locale-resolver.d.ts.map +1 -1
  137. package/dist/fingerprinting/locale-resolver.js +26 -3
  138. package/dist/fingerprinting/locale-resolver.js.map +1 -1
  139. package/dist/fingerprinting/non-apify-fingerprint-generator.d.ts +4 -4
  140. package/dist/fingerprinting/non-apify-fingerprint-generator.d.ts.map +1 -1
  141. package/dist/fingerprinting/non-apify-fingerprint-generator.js +24 -58
  142. package/dist/fingerprinting/non-apify-fingerprint-generator.js.map +1 -1
  143. package/dist/fingerprinting/non-apify-profiles.json +10515 -8494
  144. package/dist/fingerprinting/os-consistency.d.ts +28 -0
  145. package/dist/fingerprinting/os-consistency.d.ts.map +1 -0
  146. package/dist/fingerprinting/os-consistency.js +45 -0
  147. package/dist/fingerprinting/os-consistency.js.map +1 -0
  148. package/dist/fingerprinting/profile-quality.d.ts +25 -0
  149. package/dist/fingerprinting/profile-quality.d.ts.map +1 -0
  150. package/dist/fingerprinting/profile-quality.js +310 -0
  151. package/dist/fingerprinting/profile-quality.js.map +1 -0
  152. package/dist/fingerprinting/profile-selector.d.ts +102 -0
  153. package/dist/fingerprinting/profile-selector.d.ts.map +1 -0
  154. package/dist/fingerprinting/profile-selector.js +168 -0
  155. package/dist/fingerprinting/profile-selector.js.map +1 -0
  156. package/dist/fingerprinting/ua-alignment.d.ts +83 -0
  157. package/dist/fingerprinting/ua-alignment.d.ts.map +1 -0
  158. package/dist/fingerprinting/ua-alignment.js +197 -0
  159. package/dist/fingerprinting/ua-alignment.js.map +1 -0
  160. package/dist/fingerprinting/ua-ch-brands.d.ts +88 -0
  161. package/dist/fingerprinting/ua-ch-brands.d.ts.map +1 -0
  162. package/dist/fingerprinting/ua-ch-brands.js +174 -0
  163. package/dist/fingerprinting/ua-ch-brands.js.map +1 -0
  164. package/dist/index.d.ts +5 -0
  165. package/dist/index.d.ts.map +1 -1
  166. package/dist/index.js +6 -0
  167. package/dist/index.js.map +1 -1
  168. package/dist/input/dropdown-selector.d.ts +90 -0
  169. package/dist/input/dropdown-selector.d.ts.map +1 -0
  170. package/dist/input/dropdown-selector.js +394 -0
  171. package/dist/input/dropdown-selector.js.map +1 -0
  172. package/dist/input/element-target.d.ts +152 -0
  173. package/dist/input/element-target.d.ts.map +1 -0
  174. package/dist/input/element-target.js +461 -0
  175. package/dist/input/element-target.js.map +1 -0
  176. package/dist/input/input-emulator.d.ts +85 -0
  177. package/dist/input/input-emulator.d.ts.map +1 -0
  178. package/dist/input/input-emulator.js +325 -0
  179. package/dist/input/input-emulator.js.map +1 -0
  180. package/dist/input/input-transport.d.ts +60 -0
  181. package/dist/input/input-transport.d.ts.map +1 -0
  182. package/dist/input/input-transport.js +28 -0
  183. package/dist/input/input-transport.js.map +1 -0
  184. package/dist/input/recording-transport.d.ts +32 -0
  185. package/dist/input/recording-transport.d.ts.map +1 -0
  186. package/dist/input/recording-transport.js +43 -0
  187. package/dist/input/recording-transport.js.map +1 -0
  188. package/dist/keyboard-layout.d.ts +2 -2
  189. package/dist/keyboard-layout.js +2 -2
  190. package/dist/navigation/page-navigation.d.ts +67 -0
  191. package/dist/navigation/page-navigation.d.ts.map +1 -0
  192. package/dist/navigation/page-navigation.js +122 -0
  193. package/dist/navigation/page-navigation.js.map +1 -0
  194. package/dist/network/network-watch.d.ts +110 -0
  195. package/dist/network/network-watch.d.ts.map +1 -0
  196. package/dist/network/network-watch.js +223 -0
  197. package/dist/network/network-watch.js.map +1 -0
  198. package/dist/page.d.ts +118 -104
  199. package/dist/page.d.ts.map +1 -1
  200. package/dist/page.js +311 -1130
  201. package/dist/page.js.map +1 -1
  202. package/dist/session/inject-hook.d.ts +24 -0
  203. package/dist/session/inject-hook.d.ts.map +1 -0
  204. package/dist/session/inject-hook.js +80 -0
  205. package/dist/session/inject-hook.js.map +1 -0
  206. package/dist/session/save.d.ts +21 -0
  207. package/dist/session/save.d.ts.map +1 -0
  208. package/dist/session/save.js +163 -0
  209. package/dist/session/save.js.map +1 -0
  210. package/dist/session/tar-data-dir.d.ts +18 -0
  211. package/dist/session/tar-data-dir.d.ts.map +1 -0
  212. package/dist/session/tar-data-dir.js +105 -0
  213. package/dist/session/tar-data-dir.js.map +1 -0
  214. package/dist/session/types.d.ts +80 -0
  215. package/dist/session/types.d.ts.map +1 -0
  216. package/dist/session/types.js +29 -0
  217. package/dist/session/types.js.map +1 -0
  218. package/dist/session-profile.d.ts +102 -0
  219. package/dist/session-profile.d.ts.map +1 -0
  220. package/dist/session-profile.js +163 -0
  221. package/dist/session-profile.js.map +1 -0
  222. package/dist/tsconfig.build.tsbuildinfo +1 -1
  223. package/package.json +17 -6
  224. package/scripts/postinstall.cjs +58 -0
  225. package/dist/fingerprinting/custom-fingerprint-injector.d.ts +0 -87
  226. package/dist/fingerprinting/custom-fingerprint-injector.d.ts.map +0 -1
  227. package/dist/fingerprinting/custom-fingerprint-injector.js +0 -342
  228. package/dist/fingerprinting/custom-fingerprint-injector.js.map +0 -1
  229. package/dist/launcher-wrap.d.ts +0 -10
  230. package/dist/launcher-wrap.d.ts.map +0 -1
  231. package/dist/launcher-wrap.js +0 -11
  232. 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
@@ -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"}