cloakbrowser 0.3.10 → 0.3.12
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 +3 -3
- package/dist/args.d.ts.map +1 -1
- package/dist/args.js +7 -6
- package/dist/args.js.map +1 -1
- package/dist/config.d.ts +1 -1
- package/dist/config.js +4 -4
- package/dist/config.js.map +1 -1
- package/dist/geoip.d.ts +9 -0
- package/dist/geoip.d.ts.map +1 -1
- package/dist/geoip.js +20 -0
- package/dist/geoip.js.map +1 -1
- package/dist/human/config.d.ts +67 -0
- package/dist/human/config.d.ts.map +1 -0
- package/dist/human/config.js +139 -0
- package/dist/human/config.js.map +1 -0
- package/dist/human/index.d.ts +29 -0
- package/dist/human/index.d.ts.map +1 -0
- package/dist/human/index.js +413 -0
- package/dist/human/index.js.map +1 -0
- package/dist/human/keyboard.d.ts +8 -0
- package/dist/human/keyboard.d.ts.map +1 -0
- package/dist/human/keyboard.js +95 -0
- package/dist/human/keyboard.js.map +1 -0
- package/dist/human/mouse.d.ts +31 -0
- package/dist/human/mouse.d.ts.map +1 -0
- package/dist/human/mouse.js +123 -0
- package/dist/human/mouse.js.map +1 -0
- package/dist/human/scroll.d.ts +19 -0
- package/dist/human/scroll.d.ts.map +1 -0
- package/dist/human/scroll.js +117 -0
- package/dist/human/scroll.js.map +1 -0
- package/dist/playwright.d.ts +2 -2
- package/dist/playwright.d.ts.map +1 -1
- package/dist/playwright.js +32 -28
- package/dist/playwright.js.map +1 -1
- package/dist/proxy.d.ts +7 -1
- package/dist/proxy.d.ts.map +1 -1
- package/dist/proxy.js +12 -2
- package/dist/proxy.js.map +1 -1
- package/dist/puppeteer.d.ts.map +1 -1
- package/dist/puppeteer.js +1 -15
- package/dist/puppeteer.js.map +1 -1
- package/dist/types.d.ts +7 -1
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* cloakbrowser-human — Human-like mouse movement and clicking.
|
|
3
|
+
*/
|
|
4
|
+
import { rand, randRange, randIntRange, sleep } from './config.js';
|
|
5
|
+
// ---------------------------------------------------------------------------
|
|
6
|
+
// Easing
|
|
7
|
+
// ---------------------------------------------------------------------------
|
|
8
|
+
function easeInOut(t) {
|
|
9
|
+
return t < 0.5
|
|
10
|
+
? 4 * t * t * t
|
|
11
|
+
: 1 - Math.pow(-2 * t + 2, 3) / 2;
|
|
12
|
+
}
|
|
13
|
+
function bezier(p0, p1, p2, p3, t) {
|
|
14
|
+
const u = 1 - t;
|
|
15
|
+
const uu = u * u;
|
|
16
|
+
const uuu = uu * u;
|
|
17
|
+
const tt = t * t;
|
|
18
|
+
const ttt = tt * t;
|
|
19
|
+
return {
|
|
20
|
+
x: uuu * p0.x + 3 * uu * t * p1.x + 3 * u * tt * p2.x + ttt * p3.x,
|
|
21
|
+
y: uuu * p0.y + 3 * uu * t * p1.y + 3 * u * tt * p2.y + ttt * p3.y,
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
function randomControlPoints(start, end) {
|
|
25
|
+
const dx = end.x - start.x;
|
|
26
|
+
const dy = end.y - start.y;
|
|
27
|
+
const dist = Math.hypot(dx, dy);
|
|
28
|
+
const px = -dy / (dist || 1);
|
|
29
|
+
const py = dx / (dist || 1);
|
|
30
|
+
const bias1 = rand(-0.3, 0.3) * dist;
|
|
31
|
+
const bias2 = rand(-0.3, 0.3) * dist;
|
|
32
|
+
return [
|
|
33
|
+
{ x: start.x + dx * 0.25 + px * bias1, y: start.y + dy * 0.25 + py * bias1 },
|
|
34
|
+
{ x: start.x + dx * 0.75 + px * bias2, y: start.y + dy * 0.75 + py * bias2 },
|
|
35
|
+
];
|
|
36
|
+
}
|
|
37
|
+
// ---------------------------------------------------------------------------
|
|
38
|
+
// Human mouse movement
|
|
39
|
+
// ---------------------------------------------------------------------------
|
|
40
|
+
export async function humanMove(raw, startX, startY, endX, endY, cfg) {
|
|
41
|
+
const dist = Math.hypot(endX - startX, endY - startY);
|
|
42
|
+
if (dist < 1)
|
|
43
|
+
return;
|
|
44
|
+
const steps = Math.max(cfg.mouse_min_steps, Math.min(cfg.mouse_max_steps, Math.round(dist / cfg.mouse_steps_divisor)));
|
|
45
|
+
const start = { x: startX, y: startY };
|
|
46
|
+
const end = { x: endX, y: endY };
|
|
47
|
+
const [cp1, cp2] = randomControlPoints(start, end);
|
|
48
|
+
let burstCounter = 0;
|
|
49
|
+
const burstSize = randIntRange(cfg.mouse_burst_size);
|
|
50
|
+
for (let i = 0; i <= steps; i++) {
|
|
51
|
+
const progress = i / steps;
|
|
52
|
+
const easedT = easeInOut(progress);
|
|
53
|
+
const pt = bezier(start, cp1, cp2, end, easedT);
|
|
54
|
+
const wobbleAmp = Math.sin(Math.PI * progress) * cfg.mouse_wobble_max;
|
|
55
|
+
const wx = pt.x + (Math.random() - 0.5) * 2 * wobbleAmp;
|
|
56
|
+
const wy = pt.y + (Math.random() - 0.5) * 2 * wobbleAmp;
|
|
57
|
+
await raw.move(Math.round(wx), Math.round(wy));
|
|
58
|
+
burstCounter++;
|
|
59
|
+
if (burstCounter >= burstSize && i < steps) {
|
|
60
|
+
await sleep(randRange(cfg.mouse_burst_pause));
|
|
61
|
+
burstCounter = 0;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
if (Math.random() < cfg.mouse_overshoot_chance) {
|
|
65
|
+
const overshootDist = randRange(cfg.mouse_overshoot_px);
|
|
66
|
+
const angle = Math.atan2(endY - startY, endX - startX);
|
|
67
|
+
const ovX = Math.round(endX + Math.cos(angle) * overshootDist);
|
|
68
|
+
const ovY = Math.round(endY + Math.sin(angle) * overshootDist);
|
|
69
|
+
await raw.move(ovX, ovY);
|
|
70
|
+
await sleep(rand(30, 70));
|
|
71
|
+
const corrX = Math.round(endX + (Math.random() - 0.5) * 4);
|
|
72
|
+
const corrY = Math.round(endY + (Math.random() - 0.5) * 4);
|
|
73
|
+
await raw.move(corrX, corrY);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
// ---------------------------------------------------------------------------
|
|
77
|
+
// Human click
|
|
78
|
+
// ---------------------------------------------------------------------------
|
|
79
|
+
export function clickTarget(box, isInput, cfg) {
|
|
80
|
+
if (isInput) {
|
|
81
|
+
const xFrac = randRange(cfg.click_input_x_range);
|
|
82
|
+
const yFrac = rand(0.30, 0.70);
|
|
83
|
+
return {
|
|
84
|
+
x: Math.round(box.x + box.width * xFrac),
|
|
85
|
+
y: Math.round(box.y + box.height * yFrac),
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
const xFrac = rand(0.35, 0.65);
|
|
89
|
+
const yFrac = rand(0.35, 0.65);
|
|
90
|
+
return {
|
|
91
|
+
x: Math.round(box.x + box.width * xFrac),
|
|
92
|
+
y: Math.round(box.y + box.height * yFrac),
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
export async function humanClick(raw, isInput, cfg) {
|
|
96
|
+
const aimDelay = isInput
|
|
97
|
+
? randRange(cfg.click_aim_delay_input)
|
|
98
|
+
: randRange(cfg.click_aim_delay_button);
|
|
99
|
+
await sleep(aimDelay);
|
|
100
|
+
const holdTime = isInput
|
|
101
|
+
? randRange(cfg.click_hold_input)
|
|
102
|
+
: randRange(cfg.click_hold_button);
|
|
103
|
+
await raw.down();
|
|
104
|
+
await sleep(holdTime);
|
|
105
|
+
await raw.up();
|
|
106
|
+
}
|
|
107
|
+
// ---------------------------------------------------------------------------
|
|
108
|
+
// Human idle / drift
|
|
109
|
+
// ---------------------------------------------------------------------------
|
|
110
|
+
export async function humanIdle(raw, seconds, cx, cy, cfg) {
|
|
111
|
+
const endTime = Date.now() + seconds * 1000;
|
|
112
|
+
let x = cx;
|
|
113
|
+
let y = cy;
|
|
114
|
+
while (Date.now() < endTime) {
|
|
115
|
+
const dx = (Math.random() - 0.5) * 2 * cfg.idle_drift_px;
|
|
116
|
+
const dy = (Math.random() - 0.5) * 2 * cfg.idle_drift_px;
|
|
117
|
+
x += dx;
|
|
118
|
+
y += dy;
|
|
119
|
+
await raw.move(Math.round(x), Math.round(y));
|
|
120
|
+
await sleep(randRange(cfg.idle_pause_range));
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=mouse.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mouse.js","sourceRoot":"","sources":["../../src/human/mouse.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* cloakbrowser-human — Human-like scrolling via mouse wheel events.
|
|
3
|
+
*/
|
|
4
|
+
import type { Page } from 'playwright-core';
|
|
5
|
+
import { HumanConfig } from './config.js';
|
|
6
|
+
import { RawMouse } from './mouse.js';
|
|
7
|
+
interface ElementBounds {
|
|
8
|
+
x: number;
|
|
9
|
+
y: number;
|
|
10
|
+
width: number;
|
|
11
|
+
height: number;
|
|
12
|
+
}
|
|
13
|
+
export declare function scrollToElement(page: Page, raw: RawMouse, selector: string, cursorX: number, cursorY: number, cfg: HumanConfig): Promise<{
|
|
14
|
+
box: ElementBounds;
|
|
15
|
+
cursorX: number;
|
|
16
|
+
cursorY: number;
|
|
17
|
+
}>;
|
|
18
|
+
export {};
|
|
19
|
+
//# sourceMappingURL=scroll.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scroll.d.ts","sourceRoot":"","sources":["../../src/human/scroll.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAwC,MAAM,aAAa,CAAC;AAChF,OAAO,EAAE,QAAQ,EAAa,MAAM,YAAY,CAAC;AAEjD,UAAU,aAAa;IACrB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AA2BD,wBAAsB,eAAe,CACnC,IAAI,EAAE,IAAI,EACV,GAAG,EAAE,QAAQ,EACb,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,WAAW,GACf,OAAO,CAAC;IAAE,GAAG,EAAE,aAAa,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CA4FnE"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* cloakbrowser-human — Human-like scrolling via mouse wheel events.
|
|
3
|
+
*/
|
|
4
|
+
import { rand, randRange, randIntRange, sleep } from './config.js';
|
|
5
|
+
import { humanMove } from './mouse.js';
|
|
6
|
+
function isInViewport(bounds, viewportHeight, cfg) {
|
|
7
|
+
const topEdge = bounds.y;
|
|
8
|
+
const bottomEdge = bounds.y + bounds.height;
|
|
9
|
+
const zoneTop = viewportHeight * cfg.scroll_target_zone[0];
|
|
10
|
+
const zoneBottom = viewportHeight * cfg.scroll_target_zone[1];
|
|
11
|
+
return topEdge >= zoneTop && bottomEdge <= zoneBottom;
|
|
12
|
+
}
|
|
13
|
+
async function smoothWheel(raw, delta, cfg) {
|
|
14
|
+
const absD = Math.abs(delta);
|
|
15
|
+
const sign = delta > 0 ? 1 : -1;
|
|
16
|
+
let sent = 0;
|
|
17
|
+
while (sent < absD) {
|
|
18
|
+
const stepSize = rand(20, 40);
|
|
19
|
+
const chunk = Math.min(stepSize, absD - sent);
|
|
20
|
+
await raw.wheel(0, Math.round(chunk) * sign);
|
|
21
|
+
sent += chunk;
|
|
22
|
+
await sleep(rand(8, 20));
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
export async function scrollToElement(page, raw, selector, cursorX, cursorY, cfg) {
|
|
26
|
+
const viewport = page.viewportSize();
|
|
27
|
+
if (!viewport)
|
|
28
|
+
throw new Error('Viewport size not available');
|
|
29
|
+
let box = await getElementBox(page, selector);
|
|
30
|
+
if (!box) {
|
|
31
|
+
await sleep(200);
|
|
32
|
+
box = await getElementBox(page, selector);
|
|
33
|
+
if (!box)
|
|
34
|
+
throw new Error(`Element not found: ${selector}`);
|
|
35
|
+
}
|
|
36
|
+
if (isInViewport(box, viewport.height, cfg)) {
|
|
37
|
+
return { box, cursorX, cursorY };
|
|
38
|
+
}
|
|
39
|
+
// Move cursor into scroll area
|
|
40
|
+
const scrollAreaX = Math.round(viewport.width * rand(0.3, 0.7));
|
|
41
|
+
const scrollAreaY = Math.round(viewport.height * rand(0.3, 0.7));
|
|
42
|
+
await humanMove(raw, cursorX, cursorY, scrollAreaX, scrollAreaY, cfg);
|
|
43
|
+
cursorX = scrollAreaX;
|
|
44
|
+
cursorY = scrollAreaY;
|
|
45
|
+
await sleep(randRange(cfg.scroll_pre_move_delay));
|
|
46
|
+
// Calculate scroll distance
|
|
47
|
+
const targetY = viewport.height * rand(cfg.scroll_target_zone[0], cfg.scroll_target_zone[1]);
|
|
48
|
+
const elementCenter = box.y + box.height / 2;
|
|
49
|
+
const distanceToScroll = elementCenter - targetY;
|
|
50
|
+
const direction = distanceToScroll > 0 ? 1 : -1;
|
|
51
|
+
const absDistance = Math.abs(distanceToScroll);
|
|
52
|
+
const avgDelta = (cfg.scroll_delta_base[0] + cfg.scroll_delta_base[1]) / 2;
|
|
53
|
+
const totalClicks = Math.max(3, Math.ceil(absDistance / avgDelta));
|
|
54
|
+
const accelSteps = randIntRange(cfg.scroll_accel_steps);
|
|
55
|
+
const decelSteps = randIntRange(cfg.scroll_decel_steps);
|
|
56
|
+
let scrolled = 0;
|
|
57
|
+
// Scroll loop: accelerate → cruise → decelerate
|
|
58
|
+
for (let i = 0; i < totalClicks; i++) {
|
|
59
|
+
let delta;
|
|
60
|
+
let pause;
|
|
61
|
+
if (i < accelSteps) {
|
|
62
|
+
delta = rand(80, 100);
|
|
63
|
+
pause = randRange(cfg.scroll_pause_slow);
|
|
64
|
+
}
|
|
65
|
+
else if (i >= totalClicks - decelSteps) {
|
|
66
|
+
delta = rand(60, 90);
|
|
67
|
+
pause = randRange(cfg.scroll_pause_slow);
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
delta = randRange(cfg.scroll_delta_base);
|
|
71
|
+
pause = randRange(cfg.scroll_pause_fast);
|
|
72
|
+
}
|
|
73
|
+
delta *= 1 + (Math.random() - 0.5) * 2 * cfg.scroll_delta_variance;
|
|
74
|
+
delta = Math.round(delta) * direction;
|
|
75
|
+
await smoothWheel(raw, delta, cfg);
|
|
76
|
+
scrolled += Math.abs(delta);
|
|
77
|
+
await sleep(pause);
|
|
78
|
+
// Check visibility every 3 steps
|
|
79
|
+
if (i % 3 === 2 || i === totalClicks - 1) {
|
|
80
|
+
box = await getElementBox(page, selector);
|
|
81
|
+
if (box && isInViewport(box, viewport.height, cfg)) {
|
|
82
|
+
break;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
if (scrolled >= absDistance * 1.1)
|
|
86
|
+
break;
|
|
87
|
+
}
|
|
88
|
+
// Optional overshoot + correction
|
|
89
|
+
if (Math.random() < cfg.scroll_overshoot_chance) {
|
|
90
|
+
const overshootPx = Math.round(randRange(cfg.scroll_overshoot_px)) * direction;
|
|
91
|
+
await smoothWheel(raw, overshootPx, cfg);
|
|
92
|
+
await sleep(randRange(cfg.scroll_settle_delay));
|
|
93
|
+
const corrections = randIntRange([1, 2]);
|
|
94
|
+
for (let c = 0; c < corrections; c++) {
|
|
95
|
+
const corrDelta = Math.round(rand(40, 80)) * -direction;
|
|
96
|
+
await smoothWheel(raw, corrDelta, cfg);
|
|
97
|
+
await sleep(rand(100, 250));
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
// Settle
|
|
101
|
+
await sleep(randRange(cfg.scroll_settle_delay));
|
|
102
|
+
box = await getElementBox(page, selector);
|
|
103
|
+
if (!box)
|
|
104
|
+
throw new Error(`Element lost after scrolling: ${selector}`);
|
|
105
|
+
return { box, cursorX, cursorY };
|
|
106
|
+
}
|
|
107
|
+
async function getElementBox(page, selector) {
|
|
108
|
+
const el = page.locator(selector).first();
|
|
109
|
+
try {
|
|
110
|
+
const box = await el.boundingBox({ timeout: 2000 });
|
|
111
|
+
return box;
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
return null;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=scroll.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scroll.js","sourceRoot":"","sources":["../../src/human/scroll.ts"],"names":[],"mappings":"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"}
|
package/dist/playwright.d.ts
CHANGED
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import type { Browser, BrowserContext } from "playwright-core";
|
|
6
6
|
import type { LaunchOptions, LaunchContextOptions, LaunchPersistentContextOptions } from "./types.js";
|
|
7
|
-
/** @internal
|
|
8
|
-
export declare function
|
|
7
|
+
/** @internal Accept both timezone and timezoneId — either works, no warning. Exported for testing. */
|
|
8
|
+
export declare function resolveTimezone<T extends {
|
|
9
9
|
timezone?: string;
|
|
10
10
|
timezoneId?: string;
|
|
11
11
|
}>(options: T): T;
|
package/dist/playwright.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"playwright.d.ts","sourceRoot":"","sources":["../src/playwright.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAC/D,OAAO,KAAK,EAAE,aAAa,EAAE,oBAAoB,EAAE,8BAA8B,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"playwright.d.ts","sourceRoot":"","sources":["../src/playwright.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAC/D,OAAO,KAAK,EAAE,aAAa,EAAE,oBAAoB,EAAE,8BAA8B,EAAE,MAAM,YAAY,CAAC;AAOtG,sGAAsG;AACtG,wBAAgB,eAAe,CAAC,CAAC,SAAS;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,OAAO,EAAE,CAAC,GAAG,CAAC,CAOnG;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,MAAM,CAAC,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,OAAO,CAAC,CA8B1E;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,aAAa,CACjC,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,cAAc,CAAC,CAwCzB;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,8BAA8B,GACtC,OAAO,CAAC,cAAc,CAAC,CAoCzB;AAMD,6CAA6C;AAC7C,OAAO,EAAE,SAAS,IAAI,iBAAiB,EAAE,MAAM,WAAW,CAAC"}
|
package/dist/playwright.js
CHANGED
|
@@ -6,10 +6,10 @@ import { DEFAULT_VIEWPORT } from "./config.js";
|
|
|
6
6
|
import { buildArgs } from "./args.js";
|
|
7
7
|
import { ensureBinary } from "./download.js";
|
|
8
8
|
import { parseProxyUrl } from "./proxy.js";
|
|
9
|
-
|
|
10
|
-
|
|
9
|
+
import { maybeResolveGeoip } from "./geoip.js";
|
|
10
|
+
/** @internal Accept both timezone and timezoneId — either works, no warning. Exported for testing. */
|
|
11
|
+
export function resolveTimezone(options) {
|
|
11
12
|
if (options.timezoneId != null) {
|
|
12
|
-
console.warn("[cloakbrowser] timezoneId is deprecated, use timezone instead");
|
|
13
13
|
const merged = { ...options, timezone: options.timezone ?? options.timezoneId };
|
|
14
14
|
delete merged.timezoneId;
|
|
15
15
|
return merged;
|
|
@@ -44,6 +44,13 @@ export async function launch(options = {}) {
|
|
|
44
44
|
: {}),
|
|
45
45
|
...options.launchOptions,
|
|
46
46
|
});
|
|
47
|
+
// Human-like behavioral patching
|
|
48
|
+
if (options.humanize) {
|
|
49
|
+
const { patchBrowser } = await import('./human/index.js');
|
|
50
|
+
const { resolveConfig } = await import('./human/config.js');
|
|
51
|
+
const cfg = resolveConfig(options.humanPreset ?? 'default', options.humanConfig);
|
|
52
|
+
patchBrowser(browser, cfg);
|
|
53
|
+
}
|
|
47
54
|
return browser;
|
|
48
55
|
}
|
|
49
56
|
/**
|
|
@@ -63,20 +70,18 @@ export async function launch(options = {}) {
|
|
|
63
70
|
* ```
|
|
64
71
|
*/
|
|
65
72
|
export async function launchContext(options = {}) {
|
|
66
|
-
options =
|
|
73
|
+
options = resolveTimezone(options);
|
|
67
74
|
// Resolve geoip BEFORE launch() to avoid double-resolution
|
|
68
75
|
const resolved = await maybeResolveGeoip(options);
|
|
69
|
-
//
|
|
70
|
-
//
|
|
71
|
-
//
|
|
72
|
-
const browser = await launch({ ...options, ...resolved, geoip: false
|
|
76
|
+
// --fingerprint-timezone is process-wide (reads CommandLine in renderer),
|
|
77
|
+
// so it applies to ALL contexts, not just the default one.
|
|
78
|
+
// locale and timezone are set via binary flags only — no CDP emulation.
|
|
79
|
+
const browser = await launch({ ...options, ...resolved, geoip: false });
|
|
73
80
|
let context;
|
|
74
81
|
try {
|
|
75
82
|
context = await browser.newContext({
|
|
76
83
|
...(options.userAgent ? { userAgent: options.userAgent } : {}),
|
|
77
84
|
viewport: options.viewport ?? DEFAULT_VIEWPORT,
|
|
78
|
-
...(resolved.locale ? { locale: resolved.locale } : {}),
|
|
79
|
-
...(resolved.timezone ? { timezoneId: resolved.timezone } : {}),
|
|
80
85
|
...(options.colorScheme ? { colorScheme: options.colorScheme } : {}),
|
|
81
86
|
});
|
|
82
87
|
}
|
|
@@ -90,6 +95,13 @@ export async function launchContext(options = {}) {
|
|
|
90
95
|
await origClose();
|
|
91
96
|
await browser.close();
|
|
92
97
|
};
|
|
98
|
+
// Human-like behavioral patching
|
|
99
|
+
if (options.humanize) {
|
|
100
|
+
const { patchContext } = await import('./human/index.js');
|
|
101
|
+
const { resolveConfig } = await import('./human/config.js');
|
|
102
|
+
const cfg = resolveConfig(options.humanPreset ?? 'default', options.humanConfig);
|
|
103
|
+
patchContext(context, cfg);
|
|
104
|
+
}
|
|
93
105
|
return context;
|
|
94
106
|
}
|
|
95
107
|
/**
|
|
@@ -114,11 +126,13 @@ export async function launchContext(options = {}) {
|
|
|
114
126
|
* ```
|
|
115
127
|
*/
|
|
116
128
|
export async function launchPersistentContext(options) {
|
|
117
|
-
options =
|
|
129
|
+
options = resolveTimezone(options);
|
|
118
130
|
const { chromium } = await import("playwright-core");
|
|
119
131
|
const binaryPath = process.env.CLOAKBROWSER_BINARY_PATH || (await ensureBinary());
|
|
120
132
|
const resolved = await maybeResolveGeoip(options);
|
|
121
133
|
const args = buildArgs({ ...options, ...resolved });
|
|
134
|
+
// locale and timezone are set via binary flags (--lang, --fingerprint-timezone)
|
|
135
|
+
// — NOT via Playwright context kwargs which use detectable CDP emulation.
|
|
122
136
|
const context = await chromium.launchPersistentContext(options.userDataDir, {
|
|
123
137
|
executablePath: binaryPath,
|
|
124
138
|
headless: options.headless ?? true,
|
|
@@ -129,31 +143,21 @@ export async function launchPersistentContext(options) {
|
|
|
129
143
|
: {}),
|
|
130
144
|
...(options.userAgent ? { userAgent: options.userAgent } : {}),
|
|
131
145
|
viewport: options.viewport ?? DEFAULT_VIEWPORT,
|
|
132
|
-
...(resolved.locale ? { locale: resolved.locale } : {}),
|
|
133
|
-
...(resolved.timezone ? { timezoneId: resolved.timezone } : {}),
|
|
134
146
|
...(options.colorScheme ? { colorScheme: options.colorScheme } : {}),
|
|
135
147
|
...options.launchOptions,
|
|
136
148
|
});
|
|
149
|
+
// Human-like behavioral patching
|
|
150
|
+
if (options.humanize) {
|
|
151
|
+
const { patchContext } = await import('./human/index.js');
|
|
152
|
+
const { resolveConfig } = await import('./human/config.js');
|
|
153
|
+
const cfg = resolveConfig(options.humanPreset ?? 'default', options.humanConfig);
|
|
154
|
+
patchContext(context, cfg);
|
|
155
|
+
}
|
|
137
156
|
return context;
|
|
138
157
|
}
|
|
139
158
|
// ---------------------------------------------------------------------------
|
|
140
159
|
// Internal
|
|
141
160
|
// ---------------------------------------------------------------------------
|
|
142
|
-
async function maybeResolveGeoip(options) {
|
|
143
|
-
if (!options.geoip || !options.proxy)
|
|
144
|
-
return { timezone: options.timezone, locale: options.locale };
|
|
145
|
-
if (options.timezone && options.locale)
|
|
146
|
-
return { timezone: options.timezone, locale: options.locale };
|
|
147
|
-
const { resolveProxyGeo } = await import("./geoip.js");
|
|
148
|
-
const proxyUrl = typeof options.proxy === "string" ? options.proxy : options.proxy.server;
|
|
149
|
-
if (!proxyUrl)
|
|
150
|
-
return { timezone: options.timezone, locale: options.locale };
|
|
151
|
-
const { timezone: geoTz, locale: geoLocale } = await resolveProxyGeo(proxyUrl);
|
|
152
|
-
return {
|
|
153
|
-
timezone: options.timezone ?? geoTz ?? undefined,
|
|
154
|
-
locale: options.locale ?? geoLocale ?? undefined,
|
|
155
|
-
};
|
|
156
|
-
}
|
|
157
161
|
/** @internal Exposed for unit tests only. */
|
|
158
162
|
export { buildArgs as _buildArgsForTest } from "./args.js";
|
|
159
163
|
//# sourceMappingURL=playwright.js.map
|
package/dist/playwright.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"playwright.js","sourceRoot":"","sources":["../src/playwright.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"playwright.js","sourceRoot":"","sources":["../src/playwright.ts"],"names":[],"mappings":"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"}
|
package/dist/proxy.d.ts
CHANGED
|
@@ -6,11 +6,17 @@ export interface ParsedProxy {
|
|
|
6
6
|
username?: string;
|
|
7
7
|
password?: string;
|
|
8
8
|
}
|
|
9
|
+
/**
|
|
10
|
+
* Prepend http:// to schemeless proxy URLs so parsers can extract hostname.
|
|
11
|
+
* Used by geoip resolution which only needs a valid hostname, not auth fields.
|
|
12
|
+
*/
|
|
13
|
+
export declare function ensureProxyScheme(proxyUrl: string): string;
|
|
9
14
|
/**
|
|
10
15
|
* Parse a proxy URL, extracting credentials into separate fields.
|
|
11
16
|
*
|
|
12
17
|
* Handles: "http://user:pass@host:port" -> { server: "http://host:port", username: "user", password: "pass" }
|
|
13
|
-
* Also handles: no credentials, URL-encoded special chars, socks5://, missing port
|
|
18
|
+
* Also handles: no credentials, URL-encoded special chars, socks5://, missing port,
|
|
19
|
+
* and bare proxy strings without a scheme (e.g. "user:pass@host:port" -> treated as http).
|
|
14
20
|
*/
|
|
15
21
|
export declare function parseProxyUrl(proxy: string): ParsedProxy;
|
|
16
22
|
//# sourceMappingURL=proxy.d.ts.map
|
package/dist/proxy.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proxy.d.ts","sourceRoot":"","sources":["../src/proxy.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED
|
|
1
|
+
{"version":3,"file":"proxy.d.ts","sourceRoot":"","sources":["../src/proxy.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,CA4BxD"}
|
package/dist/proxy.js
CHANGED
|
@@ -1,16 +1,26 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Shared proxy URL parsing for Playwright and Puppeteer wrappers.
|
|
3
3
|
*/
|
|
4
|
+
/**
|
|
5
|
+
* Prepend http:// to schemeless proxy URLs so parsers can extract hostname.
|
|
6
|
+
* Used by geoip resolution which only needs a valid hostname, not auth fields.
|
|
7
|
+
*/
|
|
8
|
+
export function ensureProxyScheme(proxyUrl) {
|
|
9
|
+
return proxyUrl.includes("://") ? proxyUrl : `http://${proxyUrl}`;
|
|
10
|
+
}
|
|
4
11
|
/**
|
|
5
12
|
* Parse a proxy URL, extracting credentials into separate fields.
|
|
6
13
|
*
|
|
7
14
|
* Handles: "http://user:pass@host:port" -> { server: "http://host:port", username: "user", password: "pass" }
|
|
8
|
-
* Also handles: no credentials, URL-encoded special chars, socks5://, missing port
|
|
15
|
+
* Also handles: no credentials, URL-encoded special chars, socks5://, missing port,
|
|
16
|
+
* and bare proxy strings without a scheme (e.g. "user:pass@host:port" -> treated as http).
|
|
9
17
|
*/
|
|
10
18
|
export function parseProxyUrl(proxy) {
|
|
11
19
|
let url;
|
|
20
|
+
// Bare format: "user:pass@host:port" — new URL() throws without a scheme.
|
|
21
|
+
const normalized = proxy.includes("@") && !proxy.includes("://") ? `http://${proxy}` : proxy;
|
|
12
22
|
try {
|
|
13
|
-
url = new URL(
|
|
23
|
+
url = new URL(normalized);
|
|
14
24
|
}
|
|
15
25
|
catch {
|
|
16
26
|
// Not a parseable URL (e.g. bare "host:port") — pass through as-is
|
package/dist/proxy.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proxy.js","sourceRoot":"","sources":["../src/proxy.ts"],"names":[],"mappings":"AAAA;;GAEG;AAQH
|
|
1
|
+
{"version":3,"file":"proxy.js","sourceRoot":"","sources":["../src/proxy.ts"],"names":[],"mappings":"AAAA;;GAEG;AAQH;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,QAAgB;IAChD,OAAO,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,QAAQ,EAAE,CAAC;AACpE,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,IAAI,GAAQ,CAAC;IACb,0EAA0E;IAC1E,MAAM,UAAU,GACd,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;IAC5E,IAAI,CAAC;QACH,GAAG,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,mEAAmE;QACnE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IAC3B,CAAC;IAED,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAClB,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IAC3B,CAAC;IAED,yCAAyC;IACzC,MAAM,MAAM,GAAG,GAAG,GAAG,CAAC,QAAQ,KAAK,GAAG,CAAC,QAAQ,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;IAEnF,MAAM,MAAM,GAAgB;QAC1B,MAAM;QACN,QAAQ,EAAE,kBAAkB,CAAC,GAAG,CAAC,QAAQ,CAAC;KAC3C,CAAC;IACF,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC;QACjB,MAAM,CAAC,QAAQ,GAAG,kBAAkB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACrD,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
package/dist/puppeteer.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"puppeteer.d.ts","sourceRoot":"","sources":["../src/puppeteer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"puppeteer.d.ts","sourceRoot":"","sources":["../src/puppeteer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAMhD;;;;;;;;;;;;GAYG;AACH,wBAAsB,MAAM,CAAC,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,OAAO,CAAC,CAuD1E"}
|
package/dist/puppeteer.js
CHANGED
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
import { buildArgs } from "./args.js";
|
|
6
6
|
import { ensureBinary } from "./download.js";
|
|
7
7
|
import { parseProxyUrl } from "./proxy.js";
|
|
8
|
+
import { maybeResolveGeoip } from "./geoip.js";
|
|
8
9
|
/**
|
|
9
10
|
* Launch stealth Chromium browser via Puppeteer.
|
|
10
11
|
*
|
|
@@ -73,19 +74,4 @@ export async function launch(options = {}) {
|
|
|
73
74
|
// ---------------------------------------------------------------------------
|
|
74
75
|
// Internal
|
|
75
76
|
// ---------------------------------------------------------------------------
|
|
76
|
-
async function maybeResolveGeoip(options) {
|
|
77
|
-
if (!options.geoip || !options.proxy)
|
|
78
|
-
return { timezone: options.timezone, locale: options.locale };
|
|
79
|
-
if (options.timezone && options.locale)
|
|
80
|
-
return { timezone: options.timezone, locale: options.locale };
|
|
81
|
-
const { resolveProxyGeo } = await import("./geoip.js");
|
|
82
|
-
const proxyUrl = typeof options.proxy === "string" ? options.proxy : options.proxy.server;
|
|
83
|
-
if (!proxyUrl)
|
|
84
|
-
return { timezone: options.timezone, locale: options.locale };
|
|
85
|
-
const { timezone: geoTz, locale: geoLocale } = await resolveProxyGeo(proxyUrl);
|
|
86
|
-
return {
|
|
87
|
-
timezone: options.timezone ?? geoTz ?? undefined,
|
|
88
|
-
locale: options.locale ?? geoLocale ?? undefined,
|
|
89
|
-
};
|
|
90
|
-
}
|
|
91
77
|
//# sourceMappingURL=puppeteer.js.map
|
package/dist/puppeteer.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"puppeteer.js","sourceRoot":"","sources":["../src/puppeteer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"puppeteer.js","sourceRoot":"","sources":["../src/puppeteer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE/C;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,UAAyB,EAAE;IACtD,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC;IAEjD,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,wBAAwB,IAAI,CAAC,MAAM,YAAY,EAAE,CAAC,CAAC;IAClF,MAAM,QAAQ,GAAG,MAAM,iBAAiB,CAAC,OAAO,CAAC,CAAC;IAClD,MAAM,IAAI,GAAG,SAAS,CAAC,EAAE,GAAG,OAAO,EAAE,GAAG,QAAQ,EAAE,CAAC,CAAC;IAEpD,+DAA+D;IAC/D,iEAAiE;IACjE,wDAAwD;IACxD,IAAI,SAA6D,CAAC;IAClE,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,IAAI,OAAO,OAAO,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YACtC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,aAAa,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YACpE,IAAI,CAAC,IAAI,CAAC,kBAAkB,MAAM,EAAE,CAAC,CAAC;YACtC,IAAI,QAAQ,EAAE,CAAC;gBACb,SAAS,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,IAAI,EAAE,EAAE,CAAC;YACrD,CAAC;QACH,CAAC;aAAM,CAAC;YACN,gEAAgE;YAChE,wEAAwE;YACxE,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YACnD,IAAI,CAAC,IAAI,CAAC,kBAAkB,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;YAC7C,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;gBACzB,IAAI,CAAC,IAAI,CAAC,uBAAuB,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;YAC3D,CAAC;YACD,sEAAsE;YACtE,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC;YAC3D,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC;YAC3D,IAAI,QAAQ,EAAE,CAAC;gBACb,SAAS,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,IAAI,EAAE,EAAE,CAAC;YACrD,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC;QAC7C,cAAc,EAAE,UAAU;QAC1B,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,IAAI;QAClC,IAAI;QACJ,iBAAiB,EAAE,CAAC,qBAAqB,CAAC;QAC1C,GAAG,OAAO,CAAC,aAAa;KACzB,CAAC,CAAC;IAEH,gEAAgE;IAChE,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAClD,MAAM,IAAI,GAAG,SAAS,CAAC;QACvB,OAAO,CAAC,OAAO,GAAG,KAAK,EAAE,GAAG,QAAwC,EAAE,EAAE;YACtE,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,GAAG,QAAQ,CAAC,CAAC;YAC5C,MAAM,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;YAC9B,OAAO,IAAI,CAAC;QACd,CAAC,CAAC;IACJ,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,8EAA8E;AAC9E,WAAW;AACX,8EAA8E"}
|
package/dist/types.d.ts
CHANGED
|
@@ -28,6 +28,12 @@ export interface LaunchOptions {
|
|
|
28
28
|
geoip?: boolean;
|
|
29
29
|
/** Raw options passed directly to playwright/puppeteer launch(). */
|
|
30
30
|
launchOptions?: Record<string, unknown>;
|
|
31
|
+
/** Enable human-like mouse, keyboard, and scroll behavior. */
|
|
32
|
+
humanize?: boolean;
|
|
33
|
+
/** Human behavior preset: 'default' or 'careful'. */
|
|
34
|
+
humanPreset?: 'default' | 'careful';
|
|
35
|
+
/** Override individual human behavior parameters. */
|
|
36
|
+
humanConfig?: Record<string, unknown>;
|
|
31
37
|
}
|
|
32
38
|
export interface LaunchContextOptions extends LaunchOptions {
|
|
33
39
|
/** Custom user agent string. */
|
|
@@ -39,7 +45,7 @@ export interface LaunchContextOptions extends LaunchOptions {
|
|
|
39
45
|
};
|
|
40
46
|
/** Browser locale, e.g. "en-US". */
|
|
41
47
|
locale?: string;
|
|
42
|
-
/**
|
|
48
|
+
/** IANA timezone — alias for `timezone`. Either works. */
|
|
43
49
|
timezoneId?: string;
|
|
44
50
|
/** Color scheme preference — 'light', 'dark', or 'no-preference'. */
|
|
45
51
|
colorScheme?: "light" | "dark" | "no-preference";
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,aAAa;IAC5B,4CAA4C;IAC5C,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;;;OAKG;IACH,KAAK,CAAC,EAAE,MAAM,GAAG;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC3F,yCAAyC;IACzC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,6GAA6G;IAC7G,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,uFAAuF;IACvF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,4DAA4D;IAC5D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,kFAAkF;IAClF,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,oEAAoE;IACpE,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,aAAa;IAC5B,4CAA4C;IAC5C,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;;;OAKG;IACH,KAAK,CAAC,EAAE,MAAM,GAAG;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC3F,yCAAyC;IACzC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,6GAA6G;IAC7G,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,uFAAuF;IACvF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,4DAA4D;IAC5D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,kFAAkF;IAClF,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,oEAAoE;IACpE,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxC,8DAA8D;IAC9D,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,qDAAqD;IACrD,WAAW,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;IACpC,qDAAqD;IACrD,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACvC;AAED,MAAM,WAAW,oBAAqB,SAAQ,aAAa;IACzD,gCAAgC;IAChC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qBAAqB;IACrB,QAAQ,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7C,oCAAoC;IACpC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,0DAA0D;IAC1D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,qEAAqE;IACrE,WAAW,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,eAAe,CAAC;CAClD;AAED,MAAM,WAAW,8BAA+B,SAAQ,oBAAoB;IAC1E,0DAA0D;IAC1D,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;CACrB"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "cloakbrowser",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.12",
|
|
4
4
|
"description": "Stealth Chromium that passes every bot detection test. Drop-in Playwright/Puppeteer replacement with source-level fingerprint patches.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|