clearcote 0.40.0 → 0.41.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 +9 -0
- package/dist/cli-commands.d.ts +2 -4
- package/dist/cli-commands.d.ts.map +1 -1
- package/dist/cli-commands.js +45 -30
- package/dist/cli-commands.js.map +1 -1
- package/dist/cloud.d.ts.map +1 -1
- package/dist/cloud.js +5 -2
- package/dist/cloud.js.map +1 -1
- package/dist/colorscheme.d.ts +27 -0
- package/dist/colorscheme.d.ts.map +1 -0
- package/dist/colorscheme.js +20 -0
- package/dist/colorscheme.js.map +1 -0
- package/dist/docker.d.ts +24 -2
- package/dist/docker.d.ts.map +1 -1
- package/dist/docker.js +168 -49
- package/dist/docker.js.map +1 -1
- package/dist/download.d.ts +37 -1
- package/dist/download.d.ts.map +1 -1
- package/dist/download.js +609 -29
- package/dist/download.js.map +1 -1
- package/dist/fonts.d.ts +84 -3
- package/dist/fonts.d.ts.map +1 -1
- package/dist/fonts.js +486 -12
- package/dist/fonts.js.map +1 -1
- package/dist/geometry.d.ts +3 -1
- package/dist/geometry.d.ts.map +1 -1
- package/dist/geometry.js +6 -2
- package/dist/geometry.js.map +1 -1
- package/dist/index.d.ts +40 -10
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +75 -76
- package/dist/index.js.map +1 -1
- package/dist/launchopts.d.ts +21 -0
- package/dist/launchopts.d.ts.map +1 -1
- package/dist/launchopts.js +46 -0
- package/dist/launchopts.js.map +1 -1
- package/dist/personaenv.d.ts +33 -0
- package/dist/personaenv.d.ts.map +1 -0
- package/dist/personaenv.js +117 -0
- package/dist/personaenv.js.map +1 -0
- package/dist/warnings.d.ts +9 -1
- package/dist/warnings.d.ts.map +1 -1
- package/dist/warnings.js +32 -4
- package/dist/warnings.js.map +1 -1
- package/dist/widevine.d.ts +10 -0
- package/dist/widevine.d.ts.map +1 -1
- package/dist/widevine.js +18 -0
- package/dist/widevine.js.map +1 -1
- package/dist/winlaunch.d.ts +55 -0
- package/dist/winlaunch.d.ts.map +1 -0
- package/dist/winlaunch.js +334 -0
- package/dist/winlaunch.js.map +1 -0
- package/docker-seccomp.json +909 -0
- package/package.json +2 -1
package/dist/warnings.js
CHANGED
|
@@ -5,8 +5,12 @@
|
|
|
5
5
|
// passing an incoherent or missing-recommended combination. coherenceWarnings() spots those at
|
|
6
6
|
// launch() and emitCoherenceWarnings() prints an actionable line to stderr. Never blocks the
|
|
7
7
|
// launch; suppressible with quiet:true or CLEARCOTE_NO_WARN=1. coherenceWarnings() is pure (no I/O).
|
|
8
|
+
import { isFingerprintPassthrough } from "./fingerprint.js";
|
|
8
9
|
const SOFTWARE_GPU = ["swiftshader", "llvmpipe", "microsoft basic render", "software adapter", "software"];
|
|
9
10
|
const seenNotes = new Set(); // fire-once per process for NOTE codes
|
|
11
|
+
// WARN codes about the HOST rather than one launch's options: said once per process, like a note, so a
|
|
12
|
+
// program that launches in a loop is told once.
|
|
13
|
+
const ONCE_PER_PROCESS = new Set(["linux-persona-windows-host"]);
|
|
10
14
|
function proxyServer(proxy) {
|
|
11
15
|
if (!proxy)
|
|
12
16
|
return "";
|
|
@@ -63,6 +67,14 @@ export function coherenceWarnings(opts, hostPlatform, buildMajor) {
|
|
|
63
67
|
warn("platform-host-fonts", `platform='${platform}' but this host is ${fam} and no fingerprintProfile supplies that OS's ` +
|
|
64
68
|
`fonts/metrics - font, canvas and font-list hashes will be host-native and won't match a real ` +
|
|
65
69
|
`${platform} Chrome. Use a fingerprintProfile captured on ${platform}, or set platform='${fam}'.`);
|
|
70
|
+
// On a Windows host the GPU runs through Direct3D 11, which clamps the WebGL and WebGPU limits (vertex
|
|
71
|
+
// uniform vectors, a 16384 maximum texture size, ...). A persona can lower a limit, never lift one past the
|
|
72
|
+
// driver's, so a Linux claim here reports limits no real Linux machine has. Pass-through claims nothing.
|
|
73
|
+
// Only a local launch gets here: a Docker launch runs on Linux in its container, a cloud one remotely.
|
|
74
|
+
if (fam === "windows" && String(platform ?? "").trim().toLowerCase() === "linux" && !isFingerprintPassthrough(opts.fingerprint))
|
|
75
|
+
warn("linux-persona-windows-host", "a Linux persona on a Windows host reports Windows GPU limits (Direct3D caps WebGL), which no real " +
|
|
76
|
+
"Linux machine has. Use platform: \"windows\" on Windows, or run Linux personas on Linux or in Docker " +
|
|
77
|
+
"(docker: true).");
|
|
66
78
|
if (gpuR && platform) {
|
|
67
79
|
const why = gpuIncoherent(gpuR, platform);
|
|
68
80
|
if (why)
|
|
@@ -147,14 +159,30 @@ const ENGINE_NOTES = [
|
|
|
147
159
|
"page.on('console') and page.on('pageerror') receive nothing, by design, as part of the " +
|
|
148
160
|
"protection against automation-presence probes. In-page window.onerror and " +
|
|
149
161
|
"unhandledrejection handlers fire normally. To capture console output, collect it in-page " +
|
|
150
|
-
"and read it back with page.evaluate()."
|
|
162
|
+
"and read it back with page.evaluate(). An engine from r32 on forwards them with " +
|
|
163
|
+
"stockRuntime: true (off by default: pages can observe part of what it restores)."],
|
|
151
164
|
];
|
|
152
|
-
/**
|
|
165
|
+
/** Tests: forget which once-per-process lines were already said. */
|
|
166
|
+
export function resetSeenWarnings() {
|
|
167
|
+
seenNotes.clear();
|
|
168
|
+
}
|
|
169
|
+
/** Print `clearcote: warning: <message>` to stderr at most once per process for `code`: for warnings about the
|
|
170
|
+
* engine or the launch mode rather than one launch's options, so a program that launches in a loop is told once.
|
|
171
|
+
* quiet and CLEARCOTE_NO_WARN silence it like every other warning, without using it up. */
|
|
172
|
+
export function warnOnce(code, message, quiet) {
|
|
173
|
+
if (quiet || process.env.CLEARCOTE_NO_WARN || seenNotes.has(code))
|
|
174
|
+
return;
|
|
175
|
+
seenNotes.add(code);
|
|
176
|
+
process.stderr.write(`clearcote: warning: ${message}\n`);
|
|
177
|
+
}
|
|
178
|
+
/** Print coherence warnings to stderr unless quiet or CLEARCOTE_NO_WARN. NOTE lines (and the host warnings in
|
|
179
|
+
* ONCE_PER_PROCESS) fire once per process; the other WARN lines fire every launch. `opts._stockRuntime`: this
|
|
180
|
+
* launch's browser has --disable-runtime-suppression, so the note that it forwards no console events is left out. */
|
|
153
181
|
export function emitCoherenceWarnings(opts, quiet, hostPlatform, buildMajor) {
|
|
154
182
|
if (quiet || process.env.CLEARCOTE_NO_WARN)
|
|
155
183
|
return;
|
|
156
184
|
for (const w of coherenceWarnings(opts, hostPlatform, buildMajor)) {
|
|
157
|
-
if (w.severity === "note") {
|
|
185
|
+
if (w.severity === "note" || ONCE_PER_PROCESS.has(w.code)) {
|
|
158
186
|
if (seenNotes.has(w.code))
|
|
159
187
|
continue;
|
|
160
188
|
seenNotes.add(w.code);
|
|
@@ -162,7 +190,7 @@ export function emitCoherenceWarnings(opts, quiet, hostPlatform, buildMajor) {
|
|
|
162
190
|
process.stderr.write(`clearcote: ${w.severity === "warn" ? "warning" : "note"}: ${w.message}\n`);
|
|
163
191
|
}
|
|
164
192
|
for (const [code, message] of ENGINE_NOTES) {
|
|
165
|
-
if (seenNotes.has(code))
|
|
193
|
+
if (seenNotes.has(code) || (code === "cdp-console-events" && opts._stockRuntime))
|
|
166
194
|
continue;
|
|
167
195
|
seenNotes.add(code);
|
|
168
196
|
process.stderr.write(`clearcote: note: ${message}\n`);
|
package/dist/warnings.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"warnings.js","sourceRoot":"","sources":["../src/warnings.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,EAAE;AACF,4FAA4F;AAC5F,gGAAgG;AAChG,+FAA+F;AAC/F,6FAA6F;AAC7F,qGAAqG;AAErG,MAAM,YAAY,GAAG,CAAC,aAAa,EAAE,UAAU,EAAE,wBAAwB,EAAE,kBAAkB,EAAE,UAAU,CAAC,CAAC;AAC3G,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC,CAAC,uCAAuC;
|
|
1
|
+
{"version":3,"file":"warnings.js","sourceRoot":"","sources":["../src/warnings.ts"],"names":[],"mappings":"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"}
|
package/dist/widevine.d.ts
CHANGED
|
@@ -41,4 +41,14 @@ export declare function widevineArgs(ignoreDefaultArgs: string[] | boolean | und
|
|
|
41
41
|
ignoreDefaultArgs: string[] | boolean | undefined;
|
|
42
42
|
args: string[];
|
|
43
43
|
};
|
|
44
|
+
/**
|
|
45
|
+
* `["--widevine-cdm-path=<the fetched CDM>"]` when the engine implements that switch (patch 1022),
|
|
46
|
+
* else `[]`. Such an engine registers the CDM at startup in every profile, Playwright's throwaway ones
|
|
47
|
+
* included, so DRM no longer depends on the component updater; the hint file {@link seedWidevine}
|
|
48
|
+
* writes keeps older engines working. Best-effort, like the rest of DRM: any failure answers `[]` and
|
|
49
|
+
* the launch goes on.
|
|
50
|
+
*/
|
|
51
|
+
export declare function widevineCdmArgs(exe: string | undefined, opts?: {
|
|
52
|
+
quiet?: boolean;
|
|
53
|
+
}): Promise<string[]>;
|
|
44
54
|
//# sourceMappingURL=widevine.d.ts.map
|
package/dist/widevine.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"widevine.d.ts","sourceRoot":"","sources":["../src/widevine.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"widevine.d.ts","sourceRoot":"","sources":["../src/widevine.ts"],"names":[],"mappings":"AAoBA,6FAA6F;AAC7F,eAAO,MAAM,eAAe,qCAAqC,CAAC;AAClE,eAAO,MAAM,SAAS,uDAAuD,CAAC;AAC9E,eAAO,MAAM,SAAS,0CAA0C,CAAC;AAwBjE,MAAM,WAAW,eAAe;IAC9B,2DAA2D;IAC3D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,iCAAiC;IACjC,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAUD,uGAAuG;AACvG,wBAAgB,gBAAgB,IAAI,OAAO,CAiB1C;AAgBD,oGAAoG;AACpG,wBAAgB,WAAW,CAAC,IAAI,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAe/D;AAED,gGAAgG;AAChG,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAM7C;AAED;;;;GAIG;AACH,wBAAsB,aAAa,CAAC,IAAI,GAAE,eAAoB,GAAG,OAAO,CAAC,MAAM,CAAC,CAgC/E;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,GAAE,eAAoB,GAAG,OAAO,CAAC,MAAM,CAAC,CAiBnG;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,YAAY,CAC1B,iBAAiB,EAAE,MAAM,EAAE,GAAG,OAAO,GAAG,SAAS,EACjD,QAAQ,EAAE,MAAM,EAAE,GACjB;IAAE,iBAAiB,EAAE,MAAM,EAAE,GAAG,OAAO,GAAG,SAAS,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,CAevE;AAED;;;;;;GAMG;AACH,wBAAsB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,EAAE,IAAI,GAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAOhH"}
|
package/dist/widevine.js
CHANGED
|
@@ -15,6 +15,7 @@ import { rm } from "node:fs/promises";
|
|
|
15
15
|
import os from "node:os";
|
|
16
16
|
import path from "node:path";
|
|
17
17
|
import extract from "extract-zip";
|
|
18
|
+
import { engineSupportsSwitch } from "./launchopts.js";
|
|
18
19
|
/** Chrome's component-updater app id for the Widevine CDM + Google's Omaha JSON endpoint. */
|
|
19
20
|
export const WIDEVINE_APP_ID = "oimompecagnajdejgnnjijobebaeigek";
|
|
20
21
|
export const OMAHA_URL = "https://update.googleapis.com/service/update2/json";
|
|
@@ -197,4 +198,21 @@ export function widevineArgs(ignoreDefaultArgs, userArgs) {
|
|
|
197
198
|
: [...userArgs, "--component-updater=fast-update"];
|
|
198
199
|
return { ignoreDefaultArgs: ida, args };
|
|
199
200
|
}
|
|
201
|
+
/**
|
|
202
|
+
* `["--widevine-cdm-path=<the fetched CDM>"]` when the engine implements that switch (patch 1022),
|
|
203
|
+
* else `[]`. Such an engine registers the CDM at startup in every profile, Playwright's throwaway ones
|
|
204
|
+
* included, so DRM no longer depends on the component updater; the hint file {@link seedWidevine}
|
|
205
|
+
* writes keeps older engines working. Best-effort, like the rest of DRM: any failure answers `[]` and
|
|
206
|
+
* the launch goes on.
|
|
207
|
+
*/
|
|
208
|
+
export async function widevineCdmArgs(exe, opts = {}) {
|
|
209
|
+
try {
|
|
210
|
+
if (!engineSupportsSwitch(exe, "widevine-cdm-path"))
|
|
211
|
+
return [];
|
|
212
|
+
return [`--widevine-cdm-path=${await fetchWidevine({ quiet: opts.quiet })}`];
|
|
213
|
+
}
|
|
214
|
+
catch {
|
|
215
|
+
return [];
|
|
216
|
+
}
|
|
217
|
+
}
|
|
200
218
|
//# sourceMappingURL=widevine.js.map
|
package/dist/widevine.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"widevine.js","sourceRoot":"","sources":["../src/widevine.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,EAAE;AACF,qGAAqG;AACrG,qGAAqG;AACrG,qGAAqG;AACrG,sGAAsG;AACtG,iGAAiG;AACjG,EAAE;AACF,wEAAwE;AACxE,mGAAmG;AACnG,qGAAqG;AAErG,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACpF,OAAO,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AACtC,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,OAAO,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"widevine.js","sourceRoot":"","sources":["../src/widevine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
export declare const RECOVERED_MARKER = ".clearcote-recovered.json";
|
|
2
|
+
export declare function recoverRoot(): string;
|
|
3
|
+
/**
|
|
4
|
+
* `<build>-<hash>`: the cache build directory's name, and a hash of the source directory and the
|
|
5
|
+
* exe's size and modification time, so a rebuilt or re-downloaded build gets a fresh copy. Must
|
|
6
|
+
* match `recovery_key` in the Python SDK (_winlaunch.py) and `RecoveryKey` in the .NET SDK
|
|
7
|
+
* (WinLaunch.cs). Throws if the exe is gone.
|
|
8
|
+
*/
|
|
9
|
+
export declare function recoveryKey(exe: string): string;
|
|
10
|
+
/** The exe inside this build's recovered copy when one is complete, else undefined. */
|
|
11
|
+
export declare function recoveredExe(exe: string): string | undefined;
|
|
12
|
+
/**
|
|
13
|
+
* Delete a browser copy unless a browser is running from it. Returns true once it is gone.
|
|
14
|
+
*
|
|
15
|
+
* Windows refuses to delete an exe while any process runs from it, so the main exe goes first: if
|
|
16
|
+
* that fails the copy is in use and is left alone; if it succeeds nothing can start from the copy
|
|
17
|
+
* any more and the rest is removed. (Renaming the directory is no test: Windows allows it while a
|
|
18
|
+
* program inside is running.)
|
|
19
|
+
*/
|
|
20
|
+
export declare function discardCopy(path: string): boolean;
|
|
21
|
+
/**
|
|
22
|
+
* Remove recovered copies nothing can use any more: their source build is gone or has changed (its
|
|
23
|
+
* key no longer matches), plus copies abandoned half-way. Copies in use are skipped.
|
|
24
|
+
*/
|
|
25
|
+
export declare function sweepRecovered(root: string, keep?: string): void;
|
|
26
|
+
/**
|
|
27
|
+
* Remove `clearcote-recover-*` copies older SDK versions left in the temp directory (one ~400 MB
|
|
28
|
+
* browser per launch, never deleted). Recent ones and ones in use are left alone. Set
|
|
29
|
+
* `CLEARCOTE_KEEP_RECOVER=1` to keep them for debugging.
|
|
30
|
+
*/
|
|
31
|
+
export declare function sweepTempRecoverDirs(keepMs?: number): void;
|
|
32
|
+
/** `clearcote clear-cache`: delete every recovered copy. */
|
|
33
|
+
export declare function clearRecovered(): {
|
|
34
|
+
removed: number;
|
|
35
|
+
bytes: number;
|
|
36
|
+
inUse: number;
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* Copy the build into `recoverRoot()` once and return the copy's exe; later launches reuse it.
|
|
40
|
+
* Concurrent launches each copy into a `.partial-` directory and the first to finish wins the name;
|
|
41
|
+
* the others discard theirs.
|
|
42
|
+
*/
|
|
43
|
+
export declare function makeRecoveredCopy(exe: string, warm?: (dir: string) => void): string;
|
|
44
|
+
/**
|
|
45
|
+
* Remove the two temp directories a Playwright launch leaves when its process never started.
|
|
46
|
+
*
|
|
47
|
+
* Node's spawn throws synchronously on "spawn UNKNOWN", before Playwright sets up the cleanup of the
|
|
48
|
+
* directories it has just made, so every failed attempt leaked a `playwright-artifacts-*` and (for
|
|
49
|
+
* launch()) a `playwright_chromiumdev_profile-*`. The profile is named in the error's call log. The
|
|
50
|
+
* artifacts directory is not: it is the empty one made by this attempt (after `startedMs`) just
|
|
51
|
+
* before that profile, or, for a persistent launch, the only one made by this attempt. Only empty
|
|
52
|
+
* directories are removed, and nothing when the choice is ambiguous.
|
|
53
|
+
*/
|
|
54
|
+
export declare function removeFailedLaunchDirs(err: unknown, startedMs: number): void;
|
|
55
|
+
//# sourceMappingURL=winlaunch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"winlaunch.d.ts","sourceRoot":"","sources":["../src/winlaunch.ts"],"names":[],"mappings":"AA+BA,eAAO,MAAM,gBAAgB,8BAA8B,CAAC;AAI5D,wBAAgB,WAAW,IAAI,MAAM,CAEpC;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAS/C;AAED,uFAAuF;AACvF,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAS5D;AAED;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAkBjD;AAUD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAiChE;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,SAAS,GAAG,IAAI,CAgB1D;AAED,4DAA4D;AAC5D,wBAAgB,cAAc,IAAI;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CA4BlF;AAaD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,GAAG,MAAM,CAqCnF;AAMD;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CA2C5E"}
|
|
@@ -0,0 +1,334 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Windows launch helpers: one reusable recovered copy per build, and removal of the temp
|
|
3
|
+
* directories a launch that never started leaves behind.
|
|
4
|
+
*
|
|
5
|
+
* Why a cached build can refuse to start in place ("spawn UNKNOWN", Windows error 14001: "the
|
|
6
|
+
* side-by-side configuration is incorrect"): chrome.exe's manifest names a private assembly, the
|
|
7
|
+
* `<version>.manifest` beside it, and Windows resolves that assembly against the file system as the
|
|
8
|
+
* system sees it. A process running inside an MSIX-packaged app (and everything it starts) has its
|
|
9
|
+
* writes to %LOCALAPPDATA% redirected into that package's private store, so a build it downloaded
|
|
10
|
+
* into the cache is visible to the process but not to that check, and every launch from the cache
|
|
11
|
+
* fails. %TEMP% and the home directory are not redirected. Real-time antivirus still scanning a
|
|
12
|
+
* freshly extracted chrome_elf.dll can produce the same error for a while.
|
|
13
|
+
*
|
|
14
|
+
* What used to happen: three in-place launches, then a fresh ~400 MB copy of the browser in
|
|
15
|
+
* %TEMP%\clearcote-recover-<random> that nothing deleted. Each failed Playwright launch also leaked
|
|
16
|
+
* its two temp directories (`playwright_chromiumdev_profile-*`, `playwright-artifacts-*`): Node's
|
|
17
|
+
* `spawn` throws synchronously on that error, before Playwright registers their cleanup.
|
|
18
|
+
*
|
|
19
|
+
* Now: the copy lives at `~/.clearcote/recovered/<build>-<hash>/browser` and is reused by every later
|
|
20
|
+
* launch of the same build (the Python SDK computes the same key, so both share it), and a failed
|
|
21
|
+
* attempt has exactly its own temp directories removed. `clearcote clear-cache` deletes the
|
|
22
|
+
* recovered copies too.
|
|
23
|
+
*/
|
|
24
|
+
import { createHash } from "node:crypto";
|
|
25
|
+
import { cpSync, existsSync, mkdirSync, mkdtempSync, readdirSync, readFileSync, renameSync, rmdirSync, rmSync, statSync, writeFileSync, } from "node:fs";
|
|
26
|
+
import { homedir, tmpdir } from "node:os";
|
|
27
|
+
import { basename, dirname, join, resolve } from "node:path";
|
|
28
|
+
export const RECOVERED_MARKER = ".clearcote-recovered.json";
|
|
29
|
+
const STALE_PARTIAL_MS = 3_600_000; // an unfinished copy older than this was abandoned (a killed launch)
|
|
30
|
+
const PROFILE_IN_LOG = /--user-data-dir=(.*?playwright_chromiumdev_profile-[A-Za-z0-9]{6})/;
|
|
31
|
+
export function recoverRoot() {
|
|
32
|
+
return join(homedir(), ".clearcote", "recovered");
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* `<build>-<hash>`: the cache build directory's name, and a hash of the source directory and the
|
|
36
|
+
* exe's size and modification time, so a rebuilt or re-downloaded build gets a fresh copy. Must
|
|
37
|
+
* match `recovery_key` in the Python SDK (_winlaunch.py) and `RecoveryKey` in the .NET SDK
|
|
38
|
+
* (WinLaunch.cs). Throws if the exe is gone.
|
|
39
|
+
*/
|
|
40
|
+
export function recoveryKey(exe) {
|
|
41
|
+
const src = dirname(resolve(exe));
|
|
42
|
+
const st = statSync(exe);
|
|
43
|
+
const parent = basename(src).toLowerCase() === "browser" ? dirname(src) : src;
|
|
44
|
+
const name = basename(parent).replace(/[^A-Za-z0-9._-]/g, "_").slice(0, 60) || "browser";
|
|
45
|
+
// os.path.normcase on Windows: lower case, backslashes (resolve() already gives backslashes there)
|
|
46
|
+
const norm = process.platform === "win32" ? src.toLowerCase() : src;
|
|
47
|
+
const ident = `${norm}|${st.size}|${Math.floor(st.mtimeMs)}`;
|
|
48
|
+
return `${name}-${createHash("sha256").update(ident, "utf8").digest("hex").slice(0, 12)}`;
|
|
49
|
+
}
|
|
50
|
+
/** The exe inside this build's recovered copy when one is complete, else undefined. */
|
|
51
|
+
export function recoveredExe(exe) {
|
|
52
|
+
let d;
|
|
53
|
+
try {
|
|
54
|
+
d = join(recoverRoot(), recoveryKey(exe));
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
return undefined;
|
|
58
|
+
}
|
|
59
|
+
const cand = join(d, "browser", basename(exe));
|
|
60
|
+
return existsSync(join(d, RECOVERED_MARKER)) && existsSync(cand) ? cand : undefined;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Delete a browser copy unless a browser is running from it. Returns true once it is gone.
|
|
64
|
+
*
|
|
65
|
+
* Windows refuses to delete an exe while any process runs from it, so the main exe goes first: if
|
|
66
|
+
* that fails the copy is in use and is left alone; if it succeeds nothing can start from the copy
|
|
67
|
+
* any more and the rest is removed. (Renaming the directory is no test: Windows allows it while a
|
|
68
|
+
* program inside is running.)
|
|
69
|
+
*/
|
|
70
|
+
export function discardCopy(path) {
|
|
71
|
+
const browser = join(path, "browser");
|
|
72
|
+
let names = [];
|
|
73
|
+
try {
|
|
74
|
+
names = readdirSync(browser).filter((n) => n.toLowerCase().endsWith(".exe"));
|
|
75
|
+
}
|
|
76
|
+
catch { /* no browser dir */ }
|
|
77
|
+
names.sort((a, b) => Number(a.toLowerCase() !== "chrome.exe") - Number(b.toLowerCase() !== "chrome.exe"));
|
|
78
|
+
for (const n of names) {
|
|
79
|
+
try {
|
|
80
|
+
rmSync(join(browser, n));
|
|
81
|
+
}
|
|
82
|
+
catch (err) {
|
|
83
|
+
if (err.code !== "ENOENT")
|
|
84
|
+
return false;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
try {
|
|
88
|
+
rmSync(path, { recursive: true, force: true, maxRetries: 2 });
|
|
89
|
+
}
|
|
90
|
+
catch { /* reported by the existence check */ }
|
|
91
|
+
return !existsSync(path);
|
|
92
|
+
}
|
|
93
|
+
function ageMs(path) {
|
|
94
|
+
try {
|
|
95
|
+
return Date.now() - statSync(path).mtimeMs;
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
return 0;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Remove recovered copies nothing can use any more: their source build is gone or has changed (its
|
|
103
|
+
* key no longer matches), plus copies abandoned half-way. Copies in use are skipped.
|
|
104
|
+
*/
|
|
105
|
+
export function sweepRecovered(root, keep) {
|
|
106
|
+
let names;
|
|
107
|
+
try {
|
|
108
|
+
names = readdirSync(root);
|
|
109
|
+
}
|
|
110
|
+
catch {
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
for (const name of names) {
|
|
114
|
+
if (name === keep)
|
|
115
|
+
continue;
|
|
116
|
+
const path = join(root, name);
|
|
117
|
+
try {
|
|
118
|
+
if (!statSync(path).isDirectory())
|
|
119
|
+
continue;
|
|
120
|
+
}
|
|
121
|
+
catch {
|
|
122
|
+
continue;
|
|
123
|
+
}
|
|
124
|
+
let stale;
|
|
125
|
+
let sourceExe;
|
|
126
|
+
try {
|
|
127
|
+
const meta = JSON.parse(readFileSync(join(path, RECOVERED_MARKER), "utf8"));
|
|
128
|
+
if (typeof meta.source === "string" && typeof meta.exe === "string")
|
|
129
|
+
sourceExe = join(meta.source, meta.exe);
|
|
130
|
+
}
|
|
131
|
+
catch { /* no readable marker */ }
|
|
132
|
+
if (sourceExe === undefined) {
|
|
133
|
+
// a copy still being made, or abandoned when its launch was killed
|
|
134
|
+
stale = ageMs(path) > STALE_PARTIAL_MS;
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
try {
|
|
138
|
+
stale = recoveryKey(sourceExe) !== name;
|
|
139
|
+
}
|
|
140
|
+
catch {
|
|
141
|
+
stale = true; // the build it was copied from is gone (clear-cache, or deleted by hand)
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
if (stale)
|
|
145
|
+
discardCopy(path);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Remove `clearcote-recover-*` copies older SDK versions left in the temp directory (one ~400 MB
|
|
150
|
+
* browser per launch, never deleted). Recent ones and ones in use are left alone. Set
|
|
151
|
+
* `CLEARCOTE_KEEP_RECOVER=1` to keep them for debugging.
|
|
152
|
+
*/
|
|
153
|
+
export function sweepTempRecoverDirs(keepMs = 60_000) {
|
|
154
|
+
if (process.env.CLEARCOTE_KEEP_RECOVER)
|
|
155
|
+
return;
|
|
156
|
+
const tmp = tmpdir();
|
|
157
|
+
let names;
|
|
158
|
+
try {
|
|
159
|
+
names = readdirSync(tmp);
|
|
160
|
+
}
|
|
161
|
+
catch {
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
for (const name of names) {
|
|
165
|
+
if (!name.startsWith("clearcote-recover-"))
|
|
166
|
+
continue;
|
|
167
|
+
const path = join(tmp, name);
|
|
168
|
+
try {
|
|
169
|
+
if (statSync(path).isDirectory() && ageMs(path) > keepMs)
|
|
170
|
+
discardCopy(path);
|
|
171
|
+
}
|
|
172
|
+
catch { /* vanished */ }
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
/** `clearcote clear-cache`: delete every recovered copy. */
|
|
176
|
+
export function clearRecovered() {
|
|
177
|
+
const root = recoverRoot();
|
|
178
|
+
const result = { removed: 0, bytes: 0, inUse: 0 };
|
|
179
|
+
let names;
|
|
180
|
+
try {
|
|
181
|
+
names = readdirSync(root).sort();
|
|
182
|
+
}
|
|
183
|
+
catch {
|
|
184
|
+
return result;
|
|
185
|
+
}
|
|
186
|
+
for (const name of names) {
|
|
187
|
+
const path = join(root, name);
|
|
188
|
+
try {
|
|
189
|
+
if (!statSync(path).isDirectory())
|
|
190
|
+
continue;
|
|
191
|
+
}
|
|
192
|
+
catch {
|
|
193
|
+
continue;
|
|
194
|
+
}
|
|
195
|
+
const n = dirBytes(path);
|
|
196
|
+
if (discardCopy(path)) {
|
|
197
|
+
result.removed++;
|
|
198
|
+
result.bytes += n;
|
|
199
|
+
}
|
|
200
|
+
else {
|
|
201
|
+
result.inUse++;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
try {
|
|
205
|
+
rmdirSync(root); // only when empty
|
|
206
|
+
}
|
|
207
|
+
catch { /* still holds something */ }
|
|
208
|
+
return result;
|
|
209
|
+
}
|
|
210
|
+
function dirBytes(p) {
|
|
211
|
+
let total = 0;
|
|
212
|
+
for (const e of readdirSync(p, { withFileTypes: true })) {
|
|
213
|
+
const full = join(p, e.name);
|
|
214
|
+
try {
|
|
215
|
+
total += e.isDirectory() ? dirBytes(full) : statSync(full).size;
|
|
216
|
+
}
|
|
217
|
+
catch { /* vanished */ }
|
|
218
|
+
}
|
|
219
|
+
return total;
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Copy the build into `recoverRoot()` once and return the copy's exe; later launches reuse it.
|
|
223
|
+
* Concurrent launches each copy into a `.partial-` directory and the first to finish wins the name;
|
|
224
|
+
* the others discard theirs.
|
|
225
|
+
*/
|
|
226
|
+
export function makeRecoveredCopy(exe, warm) {
|
|
227
|
+
const src = dirname(resolve(exe));
|
|
228
|
+
const root = recoverRoot();
|
|
229
|
+
mkdirSync(root, { recursive: true });
|
|
230
|
+
const key = recoveryKey(exe);
|
|
231
|
+
sweepRecovered(root, key);
|
|
232
|
+
sweepTempRecoverDirs();
|
|
233
|
+
const ready = recoveredExe(exe);
|
|
234
|
+
if (ready)
|
|
235
|
+
return ready;
|
|
236
|
+
const final = join(root, key);
|
|
237
|
+
const part = mkdtempSync(join(root, `${key}.partial-`));
|
|
238
|
+
let keepPart = false;
|
|
239
|
+
try {
|
|
240
|
+
cpSync(src, join(part, "browser"), { recursive: true });
|
|
241
|
+
warm?.(join(part, "browser"));
|
|
242
|
+
const st = statSync(exe);
|
|
243
|
+
writeFileSync(join(part, RECOVERED_MARKER), JSON.stringify({ source: src, exe: basename(exe), size: st.size, mtimeMs: Math.floor(st.mtimeMs) }));
|
|
244
|
+
try {
|
|
245
|
+
renameSync(part, final);
|
|
246
|
+
}
|
|
247
|
+
catch {
|
|
248
|
+
const other = recoveredExe(exe); // another launch finished its copy first
|
|
249
|
+
if (other)
|
|
250
|
+
return other;
|
|
251
|
+
if (existsSync(final) && discardCopy(final)) { // an unmarked leftover held the name
|
|
252
|
+
try {
|
|
253
|
+
renameSync(part, final);
|
|
254
|
+
}
|
|
255
|
+
catch { /* still blocked */ }
|
|
256
|
+
}
|
|
257
|
+
if (existsSync(part)) {
|
|
258
|
+
keepPart = true; // still blocked: launch from our own complete copy
|
|
259
|
+
return join(part, "browser", basename(exe));
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
return join(final, "browser", basename(exe));
|
|
263
|
+
}
|
|
264
|
+
finally {
|
|
265
|
+
if (!keepPart && existsSync(part))
|
|
266
|
+
rmSync(part, { recursive: true, force: true, maxRetries: 2 });
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
function birthMs(path) {
|
|
270
|
+
return statSync(path).birthtimeMs;
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* Remove the two temp directories a Playwright launch leaves when its process never started.
|
|
274
|
+
*
|
|
275
|
+
* Node's spawn throws synchronously on "spawn UNKNOWN", before Playwright sets up the cleanup of the
|
|
276
|
+
* directories it has just made, so every failed attempt leaked a `playwright-artifacts-*` and (for
|
|
277
|
+
* launch()) a `playwright_chromiumdev_profile-*`. The profile is named in the error's call log. The
|
|
278
|
+
* artifacts directory is not: it is the empty one made by this attempt (after `startedMs`) just
|
|
279
|
+
* before that profile, or, for a persistent launch, the only one made by this attempt. Only empty
|
|
280
|
+
* directories are removed, and nothing when the choice is ambiguous.
|
|
281
|
+
*/
|
|
282
|
+
export function removeFailedLaunchDirs(err, startedMs) {
|
|
283
|
+
const msg = String(err?.message ?? err);
|
|
284
|
+
if (!msg.includes("<launching>"))
|
|
285
|
+
return; // Playwright never got as far as starting the process
|
|
286
|
+
let tmp;
|
|
287
|
+
let anchor;
|
|
288
|
+
const m = PROFILE_IN_LOG.exec(msg);
|
|
289
|
+
if (m) {
|
|
290
|
+
const prof = m[1];
|
|
291
|
+
tmp = dirname(prof);
|
|
292
|
+
try {
|
|
293
|
+
anchor = birthMs(prof);
|
|
294
|
+
rmdirSync(prof); // only succeeds while empty: the browser never wrote to it
|
|
295
|
+
}
|
|
296
|
+
catch { /* gone already, or not empty */ }
|
|
297
|
+
}
|
|
298
|
+
tmp ??= tmpdir();
|
|
299
|
+
const now = Date.now();
|
|
300
|
+
let found = [];
|
|
301
|
+
let names;
|
|
302
|
+
try {
|
|
303
|
+
names = readdirSync(tmp);
|
|
304
|
+
}
|
|
305
|
+
catch {
|
|
306
|
+
return;
|
|
307
|
+
}
|
|
308
|
+
for (const name of names) {
|
|
309
|
+
if (!name.startsWith("playwright-artifacts-"))
|
|
310
|
+
continue;
|
|
311
|
+
const path = join(tmp, name);
|
|
312
|
+
try {
|
|
313
|
+
const born = birthMs(path);
|
|
314
|
+
if (born >= startedMs - 50 && born <= now + 50 && readdirSync(path).length === 0)
|
|
315
|
+
found.push([born, path]);
|
|
316
|
+
}
|
|
317
|
+
catch { /* vanished */ }
|
|
318
|
+
}
|
|
319
|
+
let pick;
|
|
320
|
+
if (anchor !== undefined) {
|
|
321
|
+
found = found.filter(([born]) => born <= anchor + 1).sort((a, b) => a[0] - b[0]);
|
|
322
|
+
pick = found.length ? found[found.length - 1][1] : undefined;
|
|
323
|
+
}
|
|
324
|
+
else if (found.length === 1) {
|
|
325
|
+
pick = found[0][1];
|
|
326
|
+
}
|
|
327
|
+
if (pick) {
|
|
328
|
+
try {
|
|
329
|
+
rmdirSync(pick);
|
|
330
|
+
}
|
|
331
|
+
catch { /* not empty any more */ }
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
//# sourceMappingURL=winlaunch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"winlaunch.js","sourceRoot":"","sources":["../src/winlaunch.ts"],"names":[],"mappings":"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"}
|