cloakbrowser 0.3.31 → 0.4.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 +38 -7
- package/dist/config.d.ts +4 -3
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +46 -12
- package/dist/config.js.map +1 -1
- package/dist/download.d.ts +64 -2
- package/dist/download.d.ts.map +1 -1
- package/dist/download.js +394 -21
- package/dist/download.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/license.d.ts +31 -0
- package/dist/license.d.ts.map +1 -0
- package/dist/license.js +179 -0
- package/dist/license.js.map +1 -0
- package/dist/playwright.d.ts +0 -7
- package/dist/playwright.d.ts.map +1 -1
- package/dist/playwright.js +51 -4
- package/dist/playwright.js.map +1 -1
- package/dist/puppeteer.d.ts.map +1 -1
- package/dist/puppeteer.js +23 -2
- package/dist/puppeteer.js.map +1 -1
- package/dist/types.d.ts +5 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/widevine.d.ts +37 -0
- package/dist/widevine.d.ts.map +1 -0
- package/dist/widevine.js +107 -0
- package/dist/widevine.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* License validation and caching for CloakBrowser Pro.
|
|
3
|
+
* Mirrors Python cloakbrowser/license.py.
|
|
4
|
+
*
|
|
5
|
+
* Handles license key resolution, server validation with local caching,
|
|
6
|
+
* and Pro version checks.
|
|
7
|
+
*/
|
|
8
|
+
export interface LicenseInfo {
|
|
9
|
+
valid: boolean;
|
|
10
|
+
plan: string;
|
|
11
|
+
expires: string | null;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Resolve the license key: explicit param > env var > file > undefined.
|
|
15
|
+
*/
|
|
16
|
+
export declare function resolveLicenseKey(licenseKey?: string): string | undefined;
|
|
17
|
+
/**
|
|
18
|
+
* Validate a license key with the CloakBrowser server.
|
|
19
|
+
*
|
|
20
|
+
* Checks a local file cache first (24h TTL). Falls back to stale
|
|
21
|
+
* cache if the server is unreachable.
|
|
22
|
+
*
|
|
23
|
+
* Returns LicenseInfo if validation succeeded, null on total failure.
|
|
24
|
+
*/
|
|
25
|
+
export declare function validateLicense(licenseKey: string): Promise<LicenseInfo | null>;
|
|
26
|
+
/**
|
|
27
|
+
* Get the latest Pro binary version from the server.
|
|
28
|
+
* Rate-limited to 1 call per hour via a marker file.
|
|
29
|
+
*/
|
|
30
|
+
export declare function getProLatestVersion(): Promise<string | null>;
|
|
31
|
+
//# sourceMappingURL=license.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"license.d.ts","sourceRoot":"","sources":["../src/license.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAcH,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,OAAO,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAazE;AAED;;;;;;;GAOG;AACH,wBAAsB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CA6CrF;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAwClE"}
|
package/dist/license.js
ADDED
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* License validation and caching for CloakBrowser Pro.
|
|
3
|
+
* Mirrors Python cloakbrowser/license.py.
|
|
4
|
+
*
|
|
5
|
+
* Handles license key resolution, server validation with local caching,
|
|
6
|
+
* and Pro version checks.
|
|
7
|
+
*/
|
|
8
|
+
import { createHash } from "node:crypto";
|
|
9
|
+
import fs from "node:fs";
|
|
10
|
+
import path from "node:path";
|
|
11
|
+
import { getCacheDir } from "./config.js";
|
|
12
|
+
const VALIDATE_URL = "https://cloakbrowser.dev/api/license/validate";
|
|
13
|
+
const PRO_VERSION_URL = "https://cloakbrowser.dev/api/download/version";
|
|
14
|
+
const LICENSE_CACHE_TTL_MS = 86_400_000; // 24 hours
|
|
15
|
+
const PRO_VERSION_CHECK_INTERVAL_MS = 3_600_000; // 1 hour
|
|
16
|
+
/**
|
|
17
|
+
* Resolve the license key: explicit param > env var > file > undefined.
|
|
18
|
+
*/
|
|
19
|
+
export function resolveLicenseKey(licenseKey) {
|
|
20
|
+
const trimmed = licenseKey?.trim();
|
|
21
|
+
if (trimmed)
|
|
22
|
+
return trimmed;
|
|
23
|
+
const envKey = (process.env.CLOAKBROWSER_LICENSE_KEY ?? "").trim();
|
|
24
|
+
if (envKey)
|
|
25
|
+
return envKey;
|
|
26
|
+
try {
|
|
27
|
+
const keyFile = path.join(getCacheDir(), "license.key");
|
|
28
|
+
const content = fs.readFileSync(keyFile, "utf-8").trim();
|
|
29
|
+
if (content)
|
|
30
|
+
return content;
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
// File doesn't exist or unreadable
|
|
34
|
+
}
|
|
35
|
+
return undefined;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Validate a license key with the CloakBrowser server.
|
|
39
|
+
*
|
|
40
|
+
* Checks a local file cache first (24h TTL). Falls back to stale
|
|
41
|
+
* cache if the server is unreachable.
|
|
42
|
+
*
|
|
43
|
+
* Returns LicenseInfo if validation succeeded, null on total failure.
|
|
44
|
+
*/
|
|
45
|
+
export async function validateLicense(licenseKey) {
|
|
46
|
+
const cachePath = path.join(getCacheDir(), ".license_cache");
|
|
47
|
+
const keySha = createHash("sha256").update(licenseKey).digest("hex");
|
|
48
|
+
const cached = readCache(cachePath, keySha);
|
|
49
|
+
if (cached)
|
|
50
|
+
return cached;
|
|
51
|
+
try {
|
|
52
|
+
const resp = await fetch(VALIDATE_URL, {
|
|
53
|
+
method: "POST",
|
|
54
|
+
headers: { "Content-Type": "application/json" },
|
|
55
|
+
body: JSON.stringify({ license_key: licenseKey }),
|
|
56
|
+
signal: AbortSignal.timeout(10_000),
|
|
57
|
+
});
|
|
58
|
+
if (!resp.ok) {
|
|
59
|
+
throw new Error(`HTTP ${resp.status} ${resp.statusText}`);
|
|
60
|
+
}
|
|
61
|
+
const data = (await resp.json());
|
|
62
|
+
const info = {
|
|
63
|
+
valid: Boolean(data.valid ?? false),
|
|
64
|
+
plan: String(data.plan ?? "solo"),
|
|
65
|
+
expires: data.expires != null ? String(data.expires) : null,
|
|
66
|
+
};
|
|
67
|
+
if (info.valid) {
|
|
68
|
+
writeCache(cachePath, keySha, info);
|
|
69
|
+
}
|
|
70
|
+
return info;
|
|
71
|
+
}
|
|
72
|
+
catch (e) {
|
|
73
|
+
console.warn(`[cloakbrowser] License validation request failed: ${e instanceof Error ? e.message : e}`);
|
|
74
|
+
// Fall back to stale cache
|
|
75
|
+
const stale = readCache(cachePath, keySha, true);
|
|
76
|
+
if (stale) {
|
|
77
|
+
console.warn("[cloakbrowser] Using cached license validation (server unreachable)");
|
|
78
|
+
return stale;
|
|
79
|
+
}
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Get the latest Pro binary version from the server.
|
|
85
|
+
* Rate-limited to 1 call per hour via a marker file.
|
|
86
|
+
*/
|
|
87
|
+
export async function getProLatestVersion() {
|
|
88
|
+
const marker = path.join(getCacheDir(), ".last_pro_version_check");
|
|
89
|
+
try {
|
|
90
|
+
if (fs.existsSync(marker)) {
|
|
91
|
+
const stats = fs.statSync(marker);
|
|
92
|
+
const age = Date.now() - stats.mtimeMs;
|
|
93
|
+
if (age < PRO_VERSION_CHECK_INTERVAL_MS) {
|
|
94
|
+
const content = fs.readFileSync(marker, "utf-8").trim();
|
|
95
|
+
return content || null;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
// Marker unreadable — proceed with fetch
|
|
101
|
+
}
|
|
102
|
+
try {
|
|
103
|
+
const resp = await fetch(PRO_VERSION_URL, {
|
|
104
|
+
signal: AbortSignal.timeout(10_000),
|
|
105
|
+
});
|
|
106
|
+
if (!resp.ok) {
|
|
107
|
+
throw new Error(`HTTP ${resp.status} ${resp.statusText}`);
|
|
108
|
+
}
|
|
109
|
+
const data = (await resp.json());
|
|
110
|
+
const version = data.version != null ? String(data.version) : null;
|
|
111
|
+
if (!version)
|
|
112
|
+
return null;
|
|
113
|
+
try {
|
|
114
|
+
fs.mkdirSync(path.dirname(marker), { recursive: true });
|
|
115
|
+
fs.writeFileSync(marker, version);
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
// Non-fatal
|
|
119
|
+
}
|
|
120
|
+
return version;
|
|
121
|
+
}
|
|
122
|
+
catch {
|
|
123
|
+
return null;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
function readCache(cachePath, keySha, ignoreTtl = false) {
|
|
127
|
+
try {
|
|
128
|
+
if (!fs.existsSync(cachePath))
|
|
129
|
+
return null;
|
|
130
|
+
const data = JSON.parse(fs.readFileSync(cachePath, "utf-8"));
|
|
131
|
+
if (data.key_sha256 !== keySha)
|
|
132
|
+
return null;
|
|
133
|
+
if (!ignoreTtl) {
|
|
134
|
+
const validatedAt = data.validated_at ?? 0;
|
|
135
|
+
// A non-numeric validated_at (corrupted cache) is treated as absent rather
|
|
136
|
+
// than coercing to NaN and silently trusting the entry.
|
|
137
|
+
if (!Number.isFinite(validatedAt) || Date.now() - validatedAt * 1000 > LICENSE_CACHE_TTL_MS) {
|
|
138
|
+
return null;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
if (data.expires) {
|
|
142
|
+
try {
|
|
143
|
+
if (new Date(data.expires).getTime() < Date.now()) {
|
|
144
|
+
return { valid: false, plan: String(data.plan ?? "solo"), expires: data.expires };
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
catch {
|
|
148
|
+
// unparseable date — skip check
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
return {
|
|
152
|
+
valid: Boolean(data.valid ?? false),
|
|
153
|
+
plan: String(data.plan ?? "solo"),
|
|
154
|
+
expires: data.expires ?? null,
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
catch {
|
|
158
|
+
return null;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
function writeCache(cachePath, keySha, info) {
|
|
162
|
+
try {
|
|
163
|
+
const dir = path.dirname(cachePath);
|
|
164
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
165
|
+
const tmpPath = cachePath + ".tmp";
|
|
166
|
+
fs.writeFileSync(tmpPath, JSON.stringify({
|
|
167
|
+
key_sha256: keySha,
|
|
168
|
+
valid: info.valid,
|
|
169
|
+
plan: info.plan,
|
|
170
|
+
expires: info.expires,
|
|
171
|
+
validated_at: Date.now() / 1000,
|
|
172
|
+
}));
|
|
173
|
+
fs.renameSync(tmpPath, cachePath);
|
|
174
|
+
}
|
|
175
|
+
catch {
|
|
176
|
+
// Non-fatal
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
//# sourceMappingURL=license.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"license.js","sourceRoot":"","sources":["../src/license.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,MAAM,YAAY,GAAG,+CAA+C,CAAC;AACrE,MAAM,eAAe,GAAG,+CAA+C,CAAC;AAExE,MAAM,oBAAoB,GAAG,UAAU,CAAC,CAAC,WAAW;AACpD,MAAM,6BAA6B,GAAG,SAAS,CAAC,CAAC,SAAS;AAQ1D;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,UAAmB;IACnD,MAAM,OAAO,GAAG,UAAU,EAAE,IAAI,EAAE,CAAC;IACnC,IAAI,OAAO;QAAE,OAAO,OAAO,CAAC;IAC5B,MAAM,MAAM,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,wBAAwB,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACnE,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAC1B,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,aAAa,CAAC,CAAC;QACxD,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;QACzD,IAAI,OAAO;YAAE,OAAO,OAAO,CAAC;IAC9B,CAAC;IAAC,MAAM,CAAC;QACP,mCAAmC;IACrC,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,UAAkB;IACtD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,gBAAgB,CAAC,CAAC;IAC7D,MAAM,MAAM,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAErE,MAAM,MAAM,GAAG,SAAS,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAC5C,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAE1B,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,YAAY,EAAE;YACrC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,WAAW,EAAE,UAAU,EAAE,CAAC;YACjD,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC;SACpC,CAAC,CAAC;QAEH,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,QAAQ,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;QAC5D,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAA4B,CAAC;QAE5D,MAAM,IAAI,GAAgB;YACxB,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC;YACnC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,MAAM,CAAC;YACjC,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI;SAC5D,CAAC;QAEF,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;QACtC,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,CAAC,IAAI,CACV,qDAAqD,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAC1F,CAAC;QAEF,2BAA2B;QAC3B,MAAM,KAAK,GAAG,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;QACjD,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,CAAC,IAAI,CAAC,qEAAqE,CAAC,CAAC;YACpF,OAAO,KAAK,CAAC;QACf,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB;IACvC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,yBAAyB,CAAC,CAAC;IAEnE,IAAI,CAAC;QACH,IAAI,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YAC1B,MAAM,KAAK,GAAG,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YAClC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,OAAO,CAAC;YACvC,IAAI,GAAG,GAAG,6BAA6B,EAAE,CAAC;gBACxC,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;gBACxD,OAAO,OAAO,IAAI,IAAI,CAAC;YACzB,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,yCAAyC;IAC3C,CAAC;IAED,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,eAAe,EAAE;YACxC,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC;SACpC,CAAC,CAAC;QAEH,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,QAAQ,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;QAC5D,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAA4B,CAAC;QAC5D,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACnE,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC;QAE1B,IAAI,CAAC;YACH,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACxD,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACpC,CAAC;QAAC,MAAM,CAAC;YACP,YAAY;QACd,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAcD,SAAS,SAAS,CAChB,SAAiB,EACjB,MAAc,EACd,SAAS,GAAG,KAAK;IAEjB,IAAI,CAAC;QACH,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC;YAAE,OAAO,IAAI,CAAC;QAE3C,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAc,CAAC;QAE1E,IAAI,IAAI,CAAC,UAAU,KAAK,MAAM;YAAE,OAAO,IAAI,CAAC;QAE5C,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,IAAI,CAAC,CAAC;YAC3C,2EAA2E;YAC3E,wDAAwD;YACxD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,WAAW,GAAG,IAAI,GAAG,oBAAoB,EAAE,CAAC;gBAC5F,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QAED,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,IAAI,CAAC;gBACH,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;oBAClD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,MAAM,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;gBACpF,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,gCAAgC;YAClC,CAAC;QACH,CAAC;QAED,OAAO;YACL,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC;YACnC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,MAAM,CAAC;YACjC,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,IAAI;SAC9B,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CAAC,SAAiB,EAAE,MAAc,EAAE,IAAiB;IACtE,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACpC,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACvC,MAAM,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;QACnC,EAAE,CAAC,aAAa,CACd,OAAO,EACP,IAAI,CAAC,SAAS,CAAC;YACb,UAAU,EAAE,MAAM;YAClB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,YAAY,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI;SAChC,CAAC,CACH,CAAC;QACF,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IACpC,CAAC;IAAC,MAAM,CAAC;QACP,YAAY;IACd,CAAC;AACH,CAAC"}
|
package/dist/playwright.d.ts
CHANGED
|
@@ -9,13 +9,6 @@ export declare function resolveTimezone<T extends {
|
|
|
9
9
|
timezone?: string;
|
|
10
10
|
timezoneId?: string;
|
|
11
11
|
}>(options: T): T;
|
|
12
|
-
/**
|
|
13
|
-
* Build Playwright BrowserContext options for CloakBrowser without launching a browser
|
|
14
|
-
* or creating a context.
|
|
15
|
-
*
|
|
16
|
-
* Useful when integrating CloakBrowser with an existing Playwright Browser while
|
|
17
|
-
* keeping the wrapper's stealth-safe defaults for `newContext()`.
|
|
18
|
-
*/
|
|
19
12
|
export declare function buildContextOptions(options?: LaunchContextOptions): BrowserContextOptions;
|
|
20
13
|
/**
|
|
21
14
|
* Build Playwright launch options for CloakBrowser without starting Chromium.
|
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,qBAAqB,EAAE,aAAa,IAAI,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAChI,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,qBAAqB,EAAE,aAAa,IAAI,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAChI,OAAO,KAAK,EAAE,aAAa,EAAE,oBAAoB,EAAE,8BAA8B,EAAE,MAAM,YAAY,CAAC;AAQtG,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;AAgDD,wBAAgB,mBAAmB,CACjC,OAAO,GAAE,oBAAyB,GACjC,qBAAqB,CAqBvB;AAED;;;;;GAKG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,uBAAuB,CAAC,CAkBlC;AAED;;GAEG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,OAAO,EAChB,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,IAAI,CAAC,CAUf;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,MAAM,CAAC,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,OAAO,CAAC,CAY1E;AAkBD;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,aAAa,CACjC,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,cAAc,CAAC,CA2CzB;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,8BAA8B,GACtC,OAAO,CAAC,cAAc,CAAC,CAuCzB;AAMD,6CAA6C;AAC7C,OAAO,EAAE,SAAS,IAAI,iBAAiB,EAAE,MAAM,WAAW,CAAC"}
|
package/dist/playwright.js
CHANGED
|
@@ -7,6 +7,7 @@ import { buildArgs } from "./args.js";
|
|
|
7
7
|
import { ensureBinary } from "./download.js";
|
|
8
8
|
import { resolveProxyConfig } from "./proxy.js";
|
|
9
9
|
import { maybeResolveGeoip, resolveWebrtcArgs } from "./geoip.js";
|
|
10
|
+
import { seedWidevineHint } from "./widevine.js";
|
|
10
11
|
/** @internal Accept both timezone and timezoneId — either works, no warning. Exported for testing. */
|
|
11
12
|
export function resolveTimezone(options) {
|
|
12
13
|
if (options.timezoneId != null) {
|
|
@@ -42,13 +43,37 @@ function filterStealthCtxOptions(ctx) {
|
|
|
42
43
|
* Useful when integrating CloakBrowser with an existing Playwright Browser while
|
|
43
44
|
* keeping the wrapper's stealth-safe defaults for `newContext()`.
|
|
44
45
|
*/
|
|
46
|
+
/**
|
|
47
|
+
* Effective headless mode for viewport decisions. buildLaunchOptions() spreads
|
|
48
|
+
* `...options.launchOptions` LAST, so a raw `launchOptions.headless` overrides the
|
|
49
|
+
* top-level field at the actual chromium.launch() call. Viewport logic must read
|
|
50
|
+
* the same effective value — otherwise a headed browser gets a fixed viewport
|
|
51
|
+
* (reintroducing the impossible-window tell). Playwright-specific (Puppeteer
|
|
52
|
+
* resolves headless the opposite way).
|
|
53
|
+
*/
|
|
54
|
+
function effectiveHeadless(options) {
|
|
55
|
+
return (options.launchOptions?.headless ??
|
|
56
|
+
options.headless ??
|
|
57
|
+
true);
|
|
58
|
+
}
|
|
45
59
|
export function buildContextOptions(options = {}) {
|
|
60
|
+
// Headed: viewport=null (no emulation) so the page tracks the real window and
|
|
61
|
+
// outerWidth >= innerWidth stays coherent — CDP viewport emulation forces
|
|
62
|
+
// inner > outer = a physically impossible window = bot tell. Headless has no
|
|
63
|
+
// window chrome (outer == inner), so a fixed viewport stays coherent and keeps
|
|
64
|
+
// dimensions deterministic. Explicit viewport (incl. null) is always honored.
|
|
65
|
+
const headless = effectiveHeadless(options);
|
|
66
|
+
const viewport = options.viewport !== undefined
|
|
67
|
+
? options.viewport
|
|
68
|
+
: headless
|
|
69
|
+
? DEFAULT_VIEWPORT
|
|
70
|
+
: null;
|
|
46
71
|
return {
|
|
47
72
|
// contextOptions first — explicit wrapper fields below override it.
|
|
48
73
|
// filterStealthCtxOptions strips locale/timezoneId to prevent CDP detection.
|
|
49
74
|
...filterStealthCtxOptions(options.contextOptions),
|
|
50
75
|
...(options.userAgent ? { userAgent: options.userAgent } : {}),
|
|
51
|
-
viewport
|
|
76
|
+
viewport,
|
|
52
77
|
...(options.colorScheme ? { colorScheme: options.colorScheme } : {}),
|
|
53
78
|
};
|
|
54
79
|
}
|
|
@@ -59,7 +84,7 @@ export function buildContextOptions(options = {}) {
|
|
|
59
84
|
* wrapper that needs to call `chromium.launch()` itself.
|
|
60
85
|
*/
|
|
61
86
|
export async function buildLaunchOptions(options = {}) {
|
|
62
|
-
const binaryPath = process.env.CLOAKBROWSER_BINARY_PATH || (await ensureBinary());
|
|
87
|
+
const binaryPath = process.env.CLOAKBROWSER_BINARY_PATH || (await ensureBinary(options.licenseKey));
|
|
63
88
|
const { exitIp, ...resolved } = await maybeResolveGeoip(options);
|
|
64
89
|
const { proxyOption, proxyArgs } = resolveProxyConfig(options.proxy);
|
|
65
90
|
let resolvedArgs = await resolveWebrtcArgs(options);
|
|
@@ -103,9 +128,28 @@ export async function humanizeBrowser(browser, options = {}) {
|
|
|
103
128
|
export async function launch(options = {}) {
|
|
104
129
|
const { chromium } = await import("playwright-core");
|
|
105
130
|
const browser = await chromium.launch(await buildLaunchOptions(options));
|
|
131
|
+
// Headed: a bare browser.newPage() would inherit Playwright's emulated 1280x720
|
|
132
|
+
// viewport -> outerWidth < innerWidth (impossible window = bot tell). Default
|
|
133
|
+
// newPage()/newContext() to viewport:null so the page tracks the real window.
|
|
134
|
+
// Headless keeps Playwright's default viewport (coherent there).
|
|
135
|
+
if (!effectiveHeadless(options)) {
|
|
136
|
+
applyDefaultNoViewport(browser);
|
|
137
|
+
}
|
|
106
138
|
await humanizeBrowser(browser, options);
|
|
107
139
|
return browser;
|
|
108
140
|
}
|
|
141
|
+
/**
|
|
142
|
+
* Wrap a Browser's newContext()/newPage() to default to viewport:null (no
|
|
143
|
+
* emulation) when the caller didn't specify a viewport. setdefault-style: an
|
|
144
|
+
* explicit viewport (including null) is always honored. Apply before humanize's
|
|
145
|
+
* patchBrowser so the wraps compose.
|
|
146
|
+
*/
|
|
147
|
+
function applyDefaultNoViewport(browser) {
|
|
148
|
+
const origNewContext = browser.newContext.bind(browser);
|
|
149
|
+
browser.newContext = (options) => origNewContext(options?.viewport === undefined ? { ...options, viewport: null } : options);
|
|
150
|
+
const origNewPage = browser.newPage.bind(browser);
|
|
151
|
+
browser.newPage = (options) => origNewPage(options?.viewport === undefined ? { ...options, viewport: null } : options);
|
|
152
|
+
}
|
|
109
153
|
/**
|
|
110
154
|
* Launch stealth browser and return a BrowserContext with common options pre-set.
|
|
111
155
|
* Closing the context also closes the browser.
|
|
@@ -134,7 +178,9 @@ export async function launchContext(options = {}) {
|
|
|
134
178
|
// --fingerprint-timezone is process-wide (reads CommandLine in renderer),
|
|
135
179
|
// so it applies to ALL contexts, not just the default one.
|
|
136
180
|
// locale and timezone are set via binary flags only — no CDP emulation.
|
|
137
|
-
|
|
181
|
+
// humanize:false on the inner launch — patchContext below applies humanize
|
|
182
|
+
// exactly once (else launch()'s humanizeBrowser would patch it a second time).
|
|
183
|
+
const browser = await launch({ ...options, ...resolved, args: launchArgs, geoip: false, humanize: false });
|
|
138
184
|
let context;
|
|
139
185
|
try {
|
|
140
186
|
context = await browser.newContext(buildContextOptions(options));
|
|
@@ -182,7 +228,7 @@ export async function launchContext(options = {}) {
|
|
|
182
228
|
export async function launchPersistentContext(options) {
|
|
183
229
|
options = resolveTimezone(options);
|
|
184
230
|
const { chromium } = await import("playwright-core");
|
|
185
|
-
const binaryPath = process.env.CLOAKBROWSER_BINARY_PATH || (await ensureBinary());
|
|
231
|
+
const binaryPath = process.env.CLOAKBROWSER_BINARY_PATH || (await ensureBinary(options.licenseKey));
|
|
186
232
|
const { exitIp, ...resolved } = await maybeResolveGeoip(options);
|
|
187
233
|
const { proxyOption, proxyArgs } = resolveProxyConfig(options.proxy);
|
|
188
234
|
let resolvedArgs = await resolveWebrtcArgs(options);
|
|
@@ -190,6 +236,7 @@ export async function launchPersistentContext(options) {
|
|
|
190
236
|
resolvedArgs = [...(resolvedArgs ?? []), `--fingerprint-webrtc-ip=${exitIp}`];
|
|
191
237
|
}
|
|
192
238
|
const args = buildArgs({ ...options, ...resolved, args: [...(resolvedArgs ?? []), ...proxyArgs] });
|
|
239
|
+
seedWidevineHint(options.userDataDir, binaryPath);
|
|
193
240
|
// locale and timezone are set via binary flags (--lang, --fingerprint-timezone)
|
|
194
241
|
// — NOT via Playwright context kwargs which use detectable CDP emulation.
|
|
195
242
|
const context = await chromium.launchPersistentContext(options.userDataDir, {
|
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,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACpE,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"playwright.js","sourceRoot":"","sources":["../src/playwright.ts"],"names":[],"mappings":"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"}
|
package/dist/puppeteer.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"puppeteer.d.ts","sourceRoot":"","sources":["../src/puppeteer.ts"],"names":[],"mappings":"AAAA;;;;GAIG;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;;;;GAIG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAiHhD;;;;;;;;;;;;;GAaG;AACH,wBAAsB,MAAM,CAAC,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,OAAO,CAAC,CAgB1E;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,aAAa,GAAG;IAAE,WAAW,EAAE,MAAM,CAAA;CAAE,GAC/C,OAAO,CAAC,OAAO,CAAC,CAmBlB"}
|
package/dist/puppeteer.js
CHANGED
|
@@ -3,14 +3,32 @@
|
|
|
3
3
|
* NOW WITH HUMANIZE SUPPORT — humanize: true enables human-like
|
|
4
4
|
* mouse curves, keyboard timing, and scroll patterns (same as Playwright).
|
|
5
5
|
*/
|
|
6
|
-
import { IGNORE_DEFAULT_ARGS } from "./config.js";
|
|
6
|
+
import { DEFAULT_VIEWPORT, IGNORE_DEFAULT_ARGS } from "./config.js";
|
|
7
7
|
import { buildArgs } from "./args.js";
|
|
8
8
|
import { ensureBinary } from "./download.js";
|
|
9
9
|
import { isSocksProxy, normalizeHttpStringUrl, parseProxyUrl, reconstructHttpUrl, resolveProxyConfig, supportsHttpProxyInlineAuth } from "./proxy.js";
|
|
10
10
|
import { maybeResolveGeoip, resolveWebrtcArgs } from "./geoip.js";
|
|
11
|
+
import { seedWidevineHint } from "./widevine.js";
|
|
12
|
+
/**
|
|
13
|
+
* Resolve Puppeteer's defaultViewport. Headed -> null (track the real window so
|
|
14
|
+
* outerWidth >= innerWidth stays coherent; Puppeteer otherwise forces an 800x600
|
|
15
|
+
* emulated viewport = a physically impossible window = bot tell). Headless has no
|
|
16
|
+
* window chrome (outer == inner), so a fixed viewport stays coherent and keeps
|
|
17
|
+
* dimensions deterministic. A user-supplied launchOptions.defaultViewport wins.
|
|
18
|
+
*/
|
|
19
|
+
function resolveDefaultViewport(options) {
|
|
20
|
+
const launchOpts = (options.launchOptions ?? {});
|
|
21
|
+
// A user-supplied defaultViewport wins (incl. explicit null). undefined is NOT
|
|
22
|
+
// "supplied" — fall through to our default. Puppeteer sets `headless` AFTER the
|
|
23
|
+
// launchOptions spread, so the top-level field wins at launch — match it here.
|
|
24
|
+
if (launchOpts.defaultViewport !== undefined) {
|
|
25
|
+
return launchOpts.defaultViewport;
|
|
26
|
+
}
|
|
27
|
+
return (options.headless ?? true) ? DEFAULT_VIEWPORT : null;
|
|
28
|
+
}
|
|
11
29
|
/** Resolve binary path, geoip, webrtc, and build final Chrome args. */
|
|
12
30
|
async function resolveArgs(options) {
|
|
13
|
-
const binaryPath = process.env.CLOAKBROWSER_BINARY_PATH || (await ensureBinary());
|
|
31
|
+
const binaryPath = process.env.CLOAKBROWSER_BINARY_PATH || (await ensureBinary(options.licenseKey));
|
|
14
32
|
const { exitIp, ...resolved } = (await maybeResolveGeoip(options)) ?? {};
|
|
15
33
|
let resolvedArgs = (await resolveWebrtcArgs(options)) ?? options.args;
|
|
16
34
|
if (exitIp && !(resolvedArgs ?? []).some(a => a.startsWith("--fingerprint-webrtc-ip"))) {
|
|
@@ -104,6 +122,7 @@ export async function launch(options = {}) {
|
|
|
104
122
|
headless: options.headless ?? true,
|
|
105
123
|
args,
|
|
106
124
|
ignoreDefaultArgs: IGNORE_DEFAULT_ARGS,
|
|
125
|
+
defaultViewport: resolveDefaultViewport(options),
|
|
107
126
|
});
|
|
108
127
|
await applyPostLaunch(browser, options, proxyAuth);
|
|
109
128
|
return browser;
|
|
@@ -130,6 +149,7 @@ export async function launchPersistentContext(options) {
|
|
|
130
149
|
const puppeteer = await import("puppeteer-core");
|
|
131
150
|
const { binaryPath, args } = await resolveArgs(options);
|
|
132
151
|
const proxyAuth = resolveProxy(options, args);
|
|
152
|
+
seedWidevineHint(options.userDataDir, binaryPath);
|
|
133
153
|
const browser = await puppeteer.default.launch({
|
|
134
154
|
...options.launchOptions,
|
|
135
155
|
executablePath: binaryPath,
|
|
@@ -137,6 +157,7 @@ export async function launchPersistentContext(options) {
|
|
|
137
157
|
args,
|
|
138
158
|
ignoreDefaultArgs: IGNORE_DEFAULT_ARGS,
|
|
139
159
|
userDataDir: options.userDataDir,
|
|
160
|
+
defaultViewport: resolveDefaultViewport(options),
|
|
140
161
|
});
|
|
141
162
|
await applyPostLaunch(browser, options, proxyAuth);
|
|
142
163
|
return browser;
|
package/dist/puppeteer.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"puppeteer.js","sourceRoot":"","sources":["../src/puppeteer.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"puppeteer.js","sourceRoot":"","sources":["../src/puppeteer.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -30,6 +30,8 @@ export interface LaunchOptions {
|
|
|
30
30
|
locale?: string;
|
|
31
31
|
/** Auto-detect timezone/locale from proxy IP (requires: npm install mmdb-lib). */
|
|
32
32
|
geoip?: boolean;
|
|
33
|
+
/** Pro license key. Also reads from CLOAKBROWSER_LICENSE_KEY env var. */
|
|
34
|
+
licenseKey?: string;
|
|
33
35
|
/** Raw options passed directly to playwright/puppeteer launch(). */
|
|
34
36
|
launchOptions?: Record<string, unknown>;
|
|
35
37
|
/** Enable human-like mouse, keyboard, and scroll behavior. */
|
|
@@ -69,7 +71,10 @@ export interface LaunchPersistentContextOptions extends LaunchContextOptions {
|
|
|
69
71
|
}
|
|
70
72
|
export interface BinaryInfo {
|
|
71
73
|
version: string;
|
|
74
|
+
/** The wrapper's bundled baseline Chromium version (CHROMIUM_VERSION). */
|
|
75
|
+
bundledVersion: string;
|
|
72
76
|
platform: string;
|
|
77
|
+
tier: "pro" | "free";
|
|
73
78
|
binaryPath: string;
|
|
74
79
|
installed: boolean;
|
|
75
80
|
cacheDir: string;
|
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,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAC7D,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAElE,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,sCAAsC;IACtC,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,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,WAAW,CAAC;IAC1B,qDAAqD;IACrD,WAAW,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;CACpC;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,GAAG,IAAI,CAAC;IACpD,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;IACjD;;;;;;;OAOG;IACH,cAAc,CAAC,EAAE,qBAAqB,CAAC;CACxC;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"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAC7D,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAElE,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,sCAAsC;IACtC,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,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,yEAAyE;IACzE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,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,WAAW,CAAC;IAC1B,qDAAqD;IACrD,WAAW,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;CACpC;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,GAAG,IAAI,CAAC;IACpD,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;IACjD;;;;;;;OAOG;IACH,cAAc,CAAC,EAAE,qBAAqB,CAAC;CACxC;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,0EAA0E;IAC1E,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,KAAK,GAAG,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;CACrB"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Widevine CDM hint-file seeding for persistent contexts.
|
|
3
|
+
* Mirrors Python cloakbrowser/widevine.py.
|
|
4
|
+
*
|
|
5
|
+
* CloakBrowser's binary supports Widevine but ships no CDM (proprietary, can't
|
|
6
|
+
* redistribute). Users sideload it by copying a `WidevineCdm/` directory from a
|
|
7
|
+
* real Chrome install next to the binary (see issue #96). Chromium reads a
|
|
8
|
+
* "hint file" from the user-data-dir at early startup to register the CDM, but
|
|
9
|
+
* on a fresh profile it doesn't exist yet, and Playwright disables the component
|
|
10
|
+
* updater that would write it. This seeds the hint file before launch so a
|
|
11
|
+
* sideloaded CDM works on the first run. It never bundles, downloads, or copies
|
|
12
|
+
* the CDM — only writes the hint when a user-provided CDM is already present.
|
|
13
|
+
*
|
|
14
|
+
* Linux only: Chromium's hint-file mechanism is Linux/ChromeOS-specific.
|
|
15
|
+
*/
|
|
16
|
+
/**
|
|
17
|
+
* Locate a sideloaded Widevine CDM directory, or null if absent.
|
|
18
|
+
*
|
|
19
|
+
* Resolution:
|
|
20
|
+
* - If CLOAKBROWSER_WIDEVINE_CDM is set, it is used exclusively (overrides
|
|
21
|
+
* auto-detection). An invalid value (no `manifest.json`) skips seeding.
|
|
22
|
+
* - Otherwise, `<dir of the chrome binary>/WidevineCdm` — where a user naturally
|
|
23
|
+
* drops it, and where it lives for both downloaded and CLOAKBROWSER_BINARY_PATH binaries.
|
|
24
|
+
*
|
|
25
|
+
* A directory counts only if it contains `manifest.json`. The returned path is
|
|
26
|
+
* absolute and symlink-resolved (mirrors Python's Path.resolve()).
|
|
27
|
+
* @internal Exported for testing.
|
|
28
|
+
*/
|
|
29
|
+
export declare function resolveWidevineCdmDir(binaryPath: string): string | null;
|
|
30
|
+
/**
|
|
31
|
+
* Write the Widevine CDM hint file into a persistent profile before launch.
|
|
32
|
+
* `binaryPath` is the resolved chrome executable; the CDM is looked for next to
|
|
33
|
+
* it. No-op on non-Linux, when disabled via CLOAKBROWSER_WIDEVINE, or when no
|
|
34
|
+
* sideloaded CDM is present. Never throws — a failure must not break launch.
|
|
35
|
+
*/
|
|
36
|
+
export declare function seedWidevineHint(userDataDir: string, binaryPath: string): void;
|
|
37
|
+
//# sourceMappingURL=widevine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"widevine.d.ts","sourceRoot":"","sources":["../src/widevine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AA8BH;;;;;;;;;;;;GAYG;AACH,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAMvE;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAuC9E"}
|