@testivai/witness 2.1.0 → 2.1.1
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.
|
@@ -27,6 +27,12 @@ export interface LaunchedChrome {
|
|
|
27
27
|
export declare function needsNoSandbox(): boolean;
|
|
28
28
|
/** Flags for the throwaway Chrome instance. Exported for testing. */
|
|
29
29
|
export declare function chromeLaunchArgs(port: number, userDataDir: string): string[];
|
|
30
|
+
/**
|
|
31
|
+
* How long to wait for Chrome's DevTools endpoint. A cold CI runner can take
|
|
32
|
+
* longer than a laptop; a Chrome that crashes is detected on exit instead of
|
|
33
|
+
* waiting this out. Override with TESTIVAI_CHROME_STARTUP_TIMEOUT_MS.
|
|
34
|
+
*/
|
|
35
|
+
export declare function chromeStartupTimeoutMs(): number;
|
|
30
36
|
/**
|
|
31
37
|
* Launch a throwaway headless Chrome with remote debugging enabled.
|
|
32
38
|
* Uses a temp profile so the user's browser state is never touched.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"launcher.d.ts","sourceRoot":"","sources":["../../src/standalone/launcher.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAoBH,wBAAgB,UAAU,IAAI,MAAM,GAAG,IAAI,CAqB1C;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,IAAI,CAAC;CAClB;AAuBD;;;;;;;;GAQG;AACH,wBAAgB,cAAc,IAAI,OAAO,CAMxC;AAED,qEAAqE;AACrE,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,CAqB5E;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,
|
|
1
|
+
{"version":3,"file":"launcher.d.ts","sourceRoot":"","sources":["../../src/standalone/launcher.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAoBH,wBAAgB,UAAU,IAAI,MAAM,GAAG,IAAI,CAqB1C;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,IAAI,CAAC;CAClB;AAuBD;;;;;;;;GAQG;AACH,wBAAgB,cAAc,IAAI,OAAO,CAMxC;AAED,qEAAqE;AACrE,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,CAqB5E;AAMD;;;;GAIG;AACH,wBAAgB,sBAAsB,IAAI,MAAM,CAG/C;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAyD5F"}
|
|
@@ -48,6 +48,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
48
48
|
exports.findChrome = findChrome;
|
|
49
49
|
exports.needsNoSandbox = needsNoSandbox;
|
|
50
50
|
exports.chromeLaunchArgs = chromeLaunchArgs;
|
|
51
|
+
exports.chromeStartupTimeoutMs = chromeStartupTimeoutMs;
|
|
51
52
|
exports.launchChrome = launchChrome;
|
|
52
53
|
const child_process_1 = require("child_process");
|
|
53
54
|
const fs = __importStar(require("fs"));
|
|
@@ -88,10 +89,10 @@ function findChrome() {
|
|
|
88
89
|
}
|
|
89
90
|
return null;
|
|
90
91
|
}
|
|
91
|
-
/** Wait until the DevTools endpoint answers, up to timeoutMs. */
|
|
92
|
-
async function waitForDevtools(port, timeoutMs) {
|
|
92
|
+
/** Wait until the DevTools endpoint answers, up to timeoutMs, or until stop() says to give up. */
|
|
93
|
+
async function waitForDevtools(port, timeoutMs, stop) {
|
|
93
94
|
const deadline = Date.now() + timeoutMs;
|
|
94
|
-
while (Date.now() < deadline) {
|
|
95
|
+
while (Date.now() < deadline && !stop()) {
|
|
95
96
|
const ok = await new Promise((resolve) => {
|
|
96
97
|
const req = http.get({ host: '127.0.0.1', port, path: '/json/version', timeout: 1000 }, (res) => {
|
|
97
98
|
res.resume();
|
|
@@ -148,6 +149,18 @@ function chromeLaunchArgs(port, userDataDir) {
|
|
|
148
149
|
args.push('about:blank');
|
|
149
150
|
return args;
|
|
150
151
|
}
|
|
152
|
+
const DEFAULT_STARTUP_TIMEOUT_MS = 30000;
|
|
153
|
+
/** How much of Chrome's stderr to keep for error messages. */
|
|
154
|
+
const STDERR_TAIL_CHARS = 4000;
|
|
155
|
+
/**
|
|
156
|
+
* How long to wait for Chrome's DevTools endpoint. A cold CI runner can take
|
|
157
|
+
* longer than a laptop; a Chrome that crashes is detected on exit instead of
|
|
158
|
+
* waiting this out. Override with TESTIVAI_CHROME_STARTUP_TIMEOUT_MS.
|
|
159
|
+
*/
|
|
160
|
+
function chromeStartupTimeoutMs() {
|
|
161
|
+
const raw = Number(process.env.TESTIVAI_CHROME_STARTUP_TIMEOUT_MS);
|
|
162
|
+
return Number.isFinite(raw) && raw > 0 ? raw : DEFAULT_STARTUP_TIMEOUT_MS;
|
|
163
|
+
}
|
|
151
164
|
/**
|
|
152
165
|
* Launch a throwaway headless Chrome with remote debugging enabled.
|
|
153
166
|
* Uses a temp profile so the user's browser state is never touched.
|
|
@@ -156,7 +169,22 @@ async function launchChrome(executable, port) {
|
|
|
156
169
|
const userDataDir = fs.mkdtempSync(path.join(os.tmpdir(), 'testivai-chrome-'));
|
|
157
170
|
const args = chromeLaunchArgs(port, userDataDir);
|
|
158
171
|
logger_1.logger.debug(`Launching Chrome: ${executable}`);
|
|
159
|
-
const child = (0, child_process_1.spawn)(executable, args, { stdio: 'ignore' });
|
|
172
|
+
const child = (0, child_process_1.spawn)(executable, args, { stdio: ['ignore', 'ignore', 'pipe'] });
|
|
173
|
+
// Keep the tail of stderr for error messages, and keep draining it for the
|
|
174
|
+
// life of the process so a chatty Chrome never blocks on a full pipe.
|
|
175
|
+
let stderr = '';
|
|
176
|
+
child.stderr?.on('data', (chunk) => {
|
|
177
|
+
stderr = (stderr + chunk.toString()).slice(-STDERR_TAIL_CHARS);
|
|
178
|
+
});
|
|
179
|
+
// A Chrome that exits (or never spawns) will not open the endpoint: stop
|
|
180
|
+
// waiting and say why, instead of reporting a timeout.
|
|
181
|
+
let ended = null;
|
|
182
|
+
child.once('exit', (code, signal) => {
|
|
183
|
+
ended ?? (ended = code !== null ? `code ${code}` : `signal ${signal}`);
|
|
184
|
+
});
|
|
185
|
+
child.once('error', (err) => {
|
|
186
|
+
ended ?? (ended = err.message);
|
|
187
|
+
});
|
|
160
188
|
const kill = () => {
|
|
161
189
|
try {
|
|
162
190
|
child.kill('SIGKILL');
|
|
@@ -171,16 +199,21 @@ async function launchChrome(executable, port) {
|
|
|
171
199
|
// best-effort temp cleanup
|
|
172
200
|
}
|
|
173
201
|
};
|
|
174
|
-
const
|
|
202
|
+
const timeoutMs = chromeStartupTimeoutMs();
|
|
203
|
+
const ready = await waitForDevtools(port, timeoutMs, () => ended !== null);
|
|
175
204
|
if (!ready) {
|
|
176
205
|
kill();
|
|
177
206
|
const sandboxHint = needsNoSandbox()
|
|
178
207
|
? ''
|
|
179
208
|
: ' If this is a container, Chrome may be refusing to start because its ' +
|
|
180
209
|
'sandbox is unavailable — set TESTIVAI_CHROME_NO_SANDBOX=1.';
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
210
|
+
const pathHint = ' Set TESTIVAI_CHROME_PATH to a working Chrome/Chromium binary if the auto-detected one is broken.';
|
|
211
|
+
const stderrTail = stderr.trim() ? `\nChrome stderr (last ${STDERR_TAIL_CHARS} characters at most):\n${stderr.trim()}` : '';
|
|
212
|
+
const what = ended !== null
|
|
213
|
+
? `Chrome exited before opening its debugging endpoint (${ended}).`
|
|
214
|
+
: `Chrome did not open its debugging endpoint on port ${port} within ${timeoutMs / 1000}s. ` +
|
|
215
|
+
'Set TESTIVAI_CHROME_STARTUP_TIMEOUT_MS to wait longer.';
|
|
216
|
+
throw new Error(what + pathHint + sandboxHint + stderrTail);
|
|
184
217
|
}
|
|
185
218
|
return { port, kill };
|
|
186
219
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"launcher.js","sourceRoot":"","sources":["../../src/standalone/launcher.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;GAWG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoBH,gCAqBC;AAqCD,wCAMC;AAGD,4CAqBC;AAMD,
|
|
1
|
+
{"version":3,"file":"launcher.js","sourceRoot":"","sources":["../../src/standalone/launcher.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@testivai/witness",
|
|
3
|
-
"version": "2.1.
|
|
3
|
+
"version": "2.1.1",
|
|
4
4
|
"description": "Local-first visual regression testing: CLI, diff engine, baselines and self-contained HTML report. No account, nothing uploaded.",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|