@monoes/monobrowse 1.0.28 → 2.24.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/dist/src/__tests__/browser-launch-double-loss.test.d.ts +16 -0
- package/dist/src/__tests__/browser-launch-double-loss.test.d.ts.map +1 -0
- package/dist/src/__tests__/browser-launch-double-loss.test.js +119 -0
- package/dist/src/__tests__/browser-launch-double-loss.test.js.map +1 -0
- package/dist/src/__tests__/chrome-fallback.test.d.ts +2 -0
- package/dist/src/__tests__/chrome-fallback.test.d.ts.map +1 -0
- package/dist/src/__tests__/chrome-fallback.test.js +63 -0
- package/dist/src/__tests__/chrome-fallback.test.js.map +1 -0
- package/dist/src/browser/browser-discovery.d.ts +8 -0
- package/dist/src/browser/browser-discovery.d.ts.map +1 -1
- package/dist/src/browser/browser-discovery.js +25 -0
- package/dist/src/browser/browser-discovery.js.map +1 -1
- package/dist/src/browser/browser-launch.d.ts.map +1 -1
- package/dist/src/browser/browser-launch.js +27 -6
- package/dist/src/browser/browser-launch.js.map +1 -1
- package/dist/src/browser/browser.d.ts +1 -1
- package/dist/src/browser/browser.d.ts.map +1 -1
- package/dist/src/browser/browser.js +1 -1
- package/dist/src/browser/browser.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/src/__tests__/browser-launch-double-loss.test.ts +128 -0
- package/src/__tests__/chrome-fallback.test.ts +74 -0
- package/src/browser/browser-discovery.ts +25 -0
- package/src/browser/browser-launch.ts +27 -6
- package/src/browser/browser.ts +1 -1
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* #491: two launches that call listen() on the same free port at the same
|
|
3
|
+
* instant can BOTH lose it on Linux (each socket is marked LISTEN before the
|
|
4
|
+
* port conflict check, so each sees the other and gets EADDRINUSE). Both
|
|
5
|
+
* Chromes exit before their CDP endpoint opens and the port is free again
|
|
6
|
+
* afterwards, so the lost race looks exactly like a Chrome that cannot start.
|
|
7
|
+
*
|
|
8
|
+
* The double loss is a kernel timing window (about 1 in 600 races locally),
|
|
9
|
+
* so these tests reproduce its outcome deterministically instead: a fake
|
|
10
|
+
* Chrome that exits early without binding on its first start.
|
|
11
|
+
*
|
|
12
|
+
* Fixed ports 23440-23449, clear of browser-launch.test.ts (23460-23489) and
|
|
13
|
+
* reap-idle-browser.test.ts (23490-23499), which run in parallel workers.
|
|
14
|
+
*/
|
|
15
|
+
export {};
|
|
16
|
+
//# sourceMappingURL=browser-launch-double-loss.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser-launch-double-loss.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/browser-launch-double-loss.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* #491: two launches that call listen() on the same free port at the same
|
|
3
|
+
* instant can BOTH lose it on Linux (each socket is marked LISTEN before the
|
|
4
|
+
* port conflict check, so each sees the other and gets EADDRINUSE). Both
|
|
5
|
+
* Chromes exit before their CDP endpoint opens and the port is free again
|
|
6
|
+
* afterwards, so the lost race looks exactly like a Chrome that cannot start.
|
|
7
|
+
*
|
|
8
|
+
* The double loss is a kernel timing window (about 1 in 600 races locally),
|
|
9
|
+
* so these tests reproduce its outcome deterministically instead: a fake
|
|
10
|
+
* Chrome that exits early without binding on its first start.
|
|
11
|
+
*
|
|
12
|
+
* Fixed ports 23440-23449, clear of browser-launch.test.ts (23460-23489) and
|
|
13
|
+
* reap-idle-browser.test.ts (23490-23499), which run in parallel workers.
|
|
14
|
+
*/
|
|
15
|
+
import { execFileSync } from 'node:child_process';
|
|
16
|
+
import { chmodSync, existsSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from 'node:fs';
|
|
17
|
+
import { tmpdir } from 'node:os';
|
|
18
|
+
import { join } from 'node:path';
|
|
19
|
+
import { afterEach, describe, expect, it } from 'vitest';
|
|
20
|
+
import { getLaunchedPid, launchBrowser } from '../browser/browser.js';
|
|
21
|
+
const BASE = 23440;
|
|
22
|
+
const dirs = [];
|
|
23
|
+
afterEach(() => {
|
|
24
|
+
for (const dir of dirs.splice(0)) {
|
|
25
|
+
try {
|
|
26
|
+
execFileSync('pkill', ['-KILL', '-f', dir]);
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
/* nothing left running */
|
|
30
|
+
}
|
|
31
|
+
rmSync(dir, { recursive: true, force: true });
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
/**
|
|
35
|
+
* A fixed-port fake Chrome. It exits with code 21 before binding anything
|
|
36
|
+
* on each of its first `lostStarts` starts (counted in a file next to it),
|
|
37
|
+
* and on every start for `lostPort`, which is what a Chrome that lost the
|
|
38
|
+
* double-EADDRINUSE race looks like. Otherwise it binds the port and
|
|
39
|
+
* announces itself like real Chrome.
|
|
40
|
+
*/
|
|
41
|
+
function fakeChrome(lostStarts, lostPort = 0) {
|
|
42
|
+
const dir = mkdtempSync(join(tmpdir(), 'monobrowse-491-'));
|
|
43
|
+
dirs.push(dir);
|
|
44
|
+
const exe = join(dir, 'fake-chrome.cjs');
|
|
45
|
+
writeFileSync(exe, `#!/usr/bin/env node
|
|
46
|
+
const { createServer } = require('node:http');
|
|
47
|
+
const { existsSync, readFileSync, writeFileSync } = require('node:fs');
|
|
48
|
+
const port = Number(
|
|
49
|
+
process.argv.find((a) => a.startsWith('--remote-debugging-port=')).slice('--remote-debugging-port='.length),
|
|
50
|
+
);
|
|
51
|
+
const counter = ${JSON.stringify(join(dir, 'starts'))};
|
|
52
|
+
const starts = existsSync(counter) ? Number(readFileSync(counter, 'utf8')) : 0;
|
|
53
|
+
writeFileSync(counter, String(starts + 1));
|
|
54
|
+
if (starts < ${lostStarts} || port === ${lostPort}) process.exit(21);
|
|
55
|
+
setTimeout(() => process.exit(0), 30000).unref();
|
|
56
|
+
const ws = 'ws://127.0.0.1:' + port + '/devtools/browser/fake-' + process.pid;
|
|
57
|
+
const server = createServer((req, res) => {
|
|
58
|
+
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
59
|
+
res.end(
|
|
60
|
+
req.url === '/json/version'
|
|
61
|
+
? JSON.stringify({ Browser: 'Chrome/999.0.0.0', webSocketDebuggerUrl: ws })
|
|
62
|
+
: '[]',
|
|
63
|
+
);
|
|
64
|
+
});
|
|
65
|
+
server.listen(port, '127.0.0.1', () => {
|
|
66
|
+
process.stderr.write('\\nDevTools listening on ' + ws + '\\n');
|
|
67
|
+
});
|
|
68
|
+
`);
|
|
69
|
+
chmodSync(exe, 0o755);
|
|
70
|
+
return exe;
|
|
71
|
+
}
|
|
72
|
+
function startsOf(exe) {
|
|
73
|
+
const counter = join(exe, '..', 'starts');
|
|
74
|
+
return existsSync(counter) ? Number(readFileSync(counter, 'utf8')) : 0;
|
|
75
|
+
}
|
|
76
|
+
describe.skipIf(process.platform === 'win32')('launchBrowser — a Chrome that lost the port race with nothing left listening (#491)', () => {
|
|
77
|
+
it('moves on to the next candidate instead of failing the launch', async () => {
|
|
78
|
+
const exe = fakeChrome(1);
|
|
79
|
+
const port = await launchBrowser({ port: BASE, executablePath: exe, launchTimeoutMs: 5000 });
|
|
80
|
+
try {
|
|
81
|
+
expect(port).toBe(BASE + 1);
|
|
82
|
+
expect(startsOf(exe)).toBe(2);
|
|
83
|
+
}
|
|
84
|
+
finally {
|
|
85
|
+
process.kill(getLaunchedPid(port), 'SIGKILL');
|
|
86
|
+
}
|
|
87
|
+
}, 15000);
|
|
88
|
+
it('two concurrent launches that both lost the same candidate both succeed, on different ports', async () => {
|
|
89
|
+
// The CI failure's shape: both racers' Chromes exited early on the
|
|
90
|
+
// first candidate and neither found anything listening there.
|
|
91
|
+
const exe = fakeChrome(0, BASE + 2);
|
|
92
|
+
let results = [];
|
|
93
|
+
try {
|
|
94
|
+
results = await Promise.allSettled([
|
|
95
|
+
launchBrowser({ port: BASE + 2, executablePath: exe, launchTimeoutMs: 5000 }),
|
|
96
|
+
launchBrowser({ port: BASE + 2, executablePath: exe, launchTimeoutMs: 5000 }),
|
|
97
|
+
]);
|
|
98
|
+
}
|
|
99
|
+
finally {
|
|
100
|
+
for (const r of results) {
|
|
101
|
+
const pid = r.status === 'fulfilled' ? getLaunchedPid(r.value) : undefined;
|
|
102
|
+
if (pid)
|
|
103
|
+
process.kill(pid, 'SIGKILL');
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
for (const r of results)
|
|
107
|
+
if (r.status === 'rejected')
|
|
108
|
+
throw r.reason;
|
|
109
|
+
const ports = results.map((r) => r.value);
|
|
110
|
+
expect(ports[0]).not.toBe(ports[1]);
|
|
111
|
+
expect(ports).not.toContain(BASE + 2);
|
|
112
|
+
}, 15000);
|
|
113
|
+
it('still surfaces a Chrome that cannot start, after one more attempt', async () => {
|
|
114
|
+
const exe = fakeChrome(Number.POSITIVE_INFINITY);
|
|
115
|
+
await expect(launchBrowser({ port: BASE + 5, executablePath: exe, launchTimeoutMs: 5000 })).rejects.toThrow(/exited before the CDP endpoint opened on port 23445 \(code=21/);
|
|
116
|
+
expect(startsOf(exe)).toBe(2);
|
|
117
|
+
}, 15000);
|
|
118
|
+
});
|
|
119
|
+
//# sourceMappingURL=browser-launch-double-loss.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser-launch-double-loss.test.js","sourceRoot":"","sources":["../../../src/__tests__/browser-launch-double-loss.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chrome-fallback.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/chrome-fallback.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* #428: an installed browser always wins; monomind's downloaded Chrome (the
|
|
3
|
+
* registered fallback, or MONOBROWSE_CHROME_PATH for a child process) is used
|
|
4
|
+
* only when there is none.
|
|
5
|
+
*/
|
|
6
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
|
|
7
|
+
const present = new Set();
|
|
8
|
+
vi.mock('node:fs', async (orig) => ({
|
|
9
|
+
...(await orig()),
|
|
10
|
+
existsSync: (p) => present.has(p),
|
|
11
|
+
}));
|
|
12
|
+
vi.mock('node:child_process', async (orig) => ({
|
|
13
|
+
...(await orig()),
|
|
14
|
+
execSync: () => {
|
|
15
|
+
throw new Error('which: nothing found');
|
|
16
|
+
},
|
|
17
|
+
}));
|
|
18
|
+
const { findChrome, resolveChrome, setChromeFallback } = await import('../browser/browser-discovery.js');
|
|
19
|
+
const { CHROME_EXECUTABLES } = await import('../browser/types.js');
|
|
20
|
+
const SYSTEM = CHROME_EXECUTABLES.find((p) => p.startsWith('/usr/bin/'));
|
|
21
|
+
beforeEach(() => {
|
|
22
|
+
present.clear();
|
|
23
|
+
delete process.env.MONOBROWSE_CHROME_PATH;
|
|
24
|
+
});
|
|
25
|
+
afterEach(() => {
|
|
26
|
+
setChromeFallback(undefined);
|
|
27
|
+
delete process.env.MONOBROWSE_CHROME_PATH;
|
|
28
|
+
});
|
|
29
|
+
describe('resolveChrome', () => {
|
|
30
|
+
it('throws the usual error when there is no browser and no fallback', async () => {
|
|
31
|
+
await expect(resolveChrome()).rejects.toThrow('No supported browser found');
|
|
32
|
+
});
|
|
33
|
+
it('asks the fallback only when no browser is installed', async () => {
|
|
34
|
+
const fallback = vi.fn(async () => '/deps/chrome');
|
|
35
|
+
setChromeFallback(fallback);
|
|
36
|
+
await expect(resolveChrome()).resolves.toBe('/deps/chrome');
|
|
37
|
+
expect(fallback).toHaveBeenCalledOnce();
|
|
38
|
+
present.add(SYSTEM);
|
|
39
|
+
fallback.mockClear();
|
|
40
|
+
await expect(resolveChrome()).resolves.toBe(SYSTEM);
|
|
41
|
+
expect(fallback).not.toHaveBeenCalled();
|
|
42
|
+
});
|
|
43
|
+
it('never falls back for an explicit executablePath', async () => {
|
|
44
|
+
const fallback = vi.fn(async () => '/deps/chrome');
|
|
45
|
+
setChromeFallback(fallback);
|
|
46
|
+
await expect(resolveChrome('/nope/chrome')).rejects.toThrow('Chrome executable not found');
|
|
47
|
+
expect(fallback).not.toHaveBeenCalled();
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
describe('findChrome and MONOBROWSE_CHROME_PATH', () => {
|
|
51
|
+
it('uses the variable only when no browser is installed', () => {
|
|
52
|
+
process.env.MONOBROWSE_CHROME_PATH = '/deps/chrome';
|
|
53
|
+
present.add('/deps/chrome');
|
|
54
|
+
expect(findChrome()).toBe('/deps/chrome');
|
|
55
|
+
present.add(SYSTEM);
|
|
56
|
+
expect(findChrome()).toBe(SYSTEM);
|
|
57
|
+
});
|
|
58
|
+
it('ignores a variable that points at nothing', () => {
|
|
59
|
+
process.env.MONOBROWSE_CHROME_PATH = '/deps/missing';
|
|
60
|
+
expect(() => findChrome()).toThrow('No supported browser found');
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
//# sourceMappingURL=chrome-fallback.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chrome-fallback.test.js","sourceRoot":"","sources":["../../../src/__tests__/chrome-fallback.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAEzE,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;AAClC,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;IAClC,GAAG,CAAC,MAAM,IAAI,EAA4B,CAAC;IAC3C,UAAU,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;CAC1C,CAAC,CAAC,CAAC;AACJ,EAAE,CAAC,IAAI,CAAC,oBAAoB,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;IAC7C,GAAG,CAAC,MAAM,IAAI,EAAuC,CAAC;IACtD,QAAQ,EAAE,GAAG,EAAE;QACb,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;IAC1C,CAAC;CACF,CAAC,CAAC,CAAC;AAEJ,MAAM,EAAE,UAAU,EAAE,aAAa,EAAE,iBAAiB,EAAE,GAAG,MAAM,MAAM,CACnE,iCAAiC,CAClC,CAAC;AACF,MAAM,EAAE,kBAAkB,EAAE,GAAG,MAAM,MAAM,CAAC,qBAAqB,CAAC,CAAC;AAEnE,MAAM,MAAM,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,WAAW,CAAC,CAAW,CAAC;AAEnF,UAAU,CAAC,GAAG,EAAE;IACd,OAAO,CAAC,KAAK,EAAE,CAAC;IAChB,OAAO,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC;AAC5C,CAAC,CAAC,CAAC;AACH,SAAS,CAAC,GAAG,EAAE;IACb,iBAAiB,CAAC,SAAS,CAAC,CAAC;IAC7B,OAAO,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC;AAC5C,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,EAAE,CAAC,iEAAiE,EAAE,KAAK,IAAI,EAAE;QAC/E,MAAM,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,4BAA4B,CAAC,CAAC;IAC9E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;QACnE,MAAM,QAAQ,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,cAAc,CAAC,CAAC;QACnD,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QAC5B,MAAM,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC5D,MAAM,CAAC,QAAQ,CAAC,CAAC,oBAAoB,EAAE,CAAC;QAExC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACpB,QAAQ,CAAC,SAAS,EAAE,CAAC;QACrB,MAAM,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACpD,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;QAC/D,MAAM,QAAQ,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,cAAc,CAAC,CAAC;QACnD,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QAC5B,MAAM,MAAM,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,6BAA6B,CAAC,CAAC;QAC3F,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IAC1C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,uCAAuC,EAAE,GAAG,EAAE;IACrD,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC7D,OAAO,CAAC,GAAG,CAAC,sBAAsB,GAAG,cAAc,CAAC;QACpD,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QAC5B,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC1C,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACpB,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,OAAO,CAAC,GAAG,CAAC,sBAAsB,GAAG,eAAe,CAAC;QACrD,MAAM,CAAC,GAAG,EAAE,CAAC,UAAU,EAAE,CAAC,CAAC,OAAO,CAAC,4BAA4B,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -1,4 +1,12 @@
|
|
|
1
1
|
export declare function findChrome(executablePath?: string): string;
|
|
2
|
+
/**
|
|
3
|
+
* Registers where launchBrowser() gets a browser when findChrome() finds none
|
|
4
|
+
* (monomind downloads one on first use). Pass undefined to clear it.
|
|
5
|
+
*/
|
|
6
|
+
export declare function setChromeFallback(fallback: (() => Promise<string>) | undefined): void;
|
|
7
|
+
/** findChrome(), then the registered fallback when no browser is installed.
|
|
8
|
+
* An explicit executablePath never falls back. */
|
|
9
|
+
export declare function resolveChrome(executablePath?: string): Promise<string>;
|
|
2
10
|
export declare function isPortOpen(port: number): Promise<boolean>;
|
|
3
11
|
/**
|
|
4
12
|
* Confirm the CDP endpoint on `port` actually identifies as Chrome/Chromium
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser-discovery.d.ts","sourceRoot":"","sources":["../../../src/browser/browser-discovery.ts"],"names":[],"mappings":"AAQA,wBAAgB,UAAU,CAAC,cAAc,CAAC,EAAE,MAAM,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"browser-discovery.d.ts","sourceRoot":"","sources":["../../../src/browser/browser-discovery.ts"],"names":[],"mappings":"AAQA,wBAAgB,UAAU,CAAC,cAAc,CAAC,EAAE,MAAM,GAAG,MAAM,CA0B1D;AAID;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,CAAC,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,SAAS,GAAG,IAAI,CAErF;AAED;mDACmD;AACnD,wBAAsB,aAAa,CAAC,cAAc,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAO5E;AAED,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAO/D;AAED;;;;;GAKG;AACH,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAErE;AAED;;+CAE+C;AAC/C,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,OAAO,GAAG,SAAS,CAAC,CAgB1F;AAED,2GAA2G;AAC3G,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,SAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAY9E;AAED;kEACkE;AAClE,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAOlE;AAED;yDACyD;AACzD,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAEpE;AAED;;gFAEgF;AAChF,wBAAsB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAQnF"}
|
|
@@ -24,8 +24,33 @@ export function findChrome(executablePath) {
|
|
|
24
24
|
catch {
|
|
25
25
|
// ignore
|
|
26
26
|
}
|
|
27
|
+
// A browser some other tool fetched for us (monomind sets this for its own
|
|
28
|
+
// child processes). Last, so an installed browser always wins.
|
|
29
|
+
const fromEnv = process.env.MONOBROWSE_CHROME_PATH;
|
|
30
|
+
if (fromEnv && existsSync(fromEnv))
|
|
31
|
+
return fromEnv;
|
|
27
32
|
throw new Error('No supported browser found. Install Google Chrome, Microsoft Edge, or Chromium — or pass executablePath in BrowserConfig.');
|
|
28
33
|
}
|
|
34
|
+
let chromeFallback;
|
|
35
|
+
/**
|
|
36
|
+
* Registers where launchBrowser() gets a browser when findChrome() finds none
|
|
37
|
+
* (monomind downloads one on first use). Pass undefined to clear it.
|
|
38
|
+
*/
|
|
39
|
+
export function setChromeFallback(fallback) {
|
|
40
|
+
chromeFallback = fallback;
|
|
41
|
+
}
|
|
42
|
+
/** findChrome(), then the registered fallback when no browser is installed.
|
|
43
|
+
* An explicit executablePath never falls back. */
|
|
44
|
+
export async function resolveChrome(executablePath) {
|
|
45
|
+
try {
|
|
46
|
+
return findChrome(executablePath);
|
|
47
|
+
}
|
|
48
|
+
catch (err) {
|
|
49
|
+
if (executablePath || !chromeFallback)
|
|
50
|
+
throw err;
|
|
51
|
+
return chromeFallback();
|
|
52
|
+
}
|
|
53
|
+
}
|
|
29
54
|
export async function isPortOpen(port) {
|
|
30
55
|
try {
|
|
31
56
|
await fetchTargets(port);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser-discovery.js","sourceRoot":"","sources":["../../../src/browser/browser-discovery.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"browser-discovery.js","sourceRoot":"","sources":["../../../src/browser/browser-discovery.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser-launch.d.ts","sourceRoot":"","sources":["../../../src/browser/browser-launch.ts"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"browser-launch.d.ts","sourceRoot":"","sources":["../../../src/browser/browser-launch.ts"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAkBhD,wBAAsB,aAAa,CAAC,MAAM,GAAE,aAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,CA+G/E"}
|
|
@@ -3,7 +3,7 @@ import { spawn } from 'node:child_process';
|
|
|
3
3
|
import { randomUUID } from 'node:crypto';
|
|
4
4
|
import { rmSync } from 'node:fs';
|
|
5
5
|
import { join } from 'node:path';
|
|
6
|
-
import { browserIdOf, chromeIdentity, fetchBrowserWebSocketUrl,
|
|
6
|
+
import { browserIdOf, chromeIdentity, fetchBrowserWebSocketUrl, isChromeIdentity, isPortOpen, isTcpPortOpen, readDevToolsActivePort, resolveChrome, } from './browser-discovery.js';
|
|
7
7
|
import { reapIdleLaunchedBrowser } from './browser-lifecycle.js';
|
|
8
8
|
import { launchedPids, launchedUserDataDirs, ownedUserDataDirPorts } from './browser-state.js';
|
|
9
9
|
import { launchProfileDirPath, removeOwnedProfileDir, sweepStaleProfileDirs, } from './profile-dir.js';
|
|
@@ -18,6 +18,9 @@ const POLL_INTERVAL = 200;
|
|
|
18
18
|
* requested port is still returned as-is (existing "attach, don't relaunch"
|
|
19
19
|
* behavior). */
|
|
20
20
|
const LAUNCH_PORT_SCAN_TRIES = 10;
|
|
21
|
+
/** Chrome's process exited before its CDP endpoint opened. */
|
|
22
|
+
class ChromeExitedEarlyError extends Error {
|
|
23
|
+
}
|
|
21
24
|
export async function launchBrowser(config = {}) {
|
|
22
25
|
const rawPort = config.port ?? DEFAULT_PORT;
|
|
23
26
|
// Port 0 means "let Chrome bind a free port and tell us which" — see
|
|
@@ -58,6 +61,9 @@ export async function launchBrowser(config = {}) {
|
|
|
58
61
|
const candidates = [];
|
|
59
62
|
for (let i = 0; i < LAUNCH_PORT_SCAN_TRIES && rawPort + i <= 65535; i++)
|
|
60
63
|
candidates.push(rawPort + i);
|
|
64
|
+
// See the catch below: one early Chrome exit on a candidate nobody holds
|
|
65
|
+
// afterwards is read as a lost port race, not a broken Chrome.
|
|
66
|
+
let toleratedEarlyExit = null;
|
|
61
67
|
for (const candidate of candidates) {
|
|
62
68
|
// TCP-level check for "is anything at all listening" — isPortOpen()
|
|
63
69
|
// does a full CDP /json fetch, which returns false BOTH for a genuinely
|
|
@@ -96,11 +102,26 @@ export async function launchBrowser(config = {}) {
|
|
|
96
102
|
// was not a moment ago — a losing race, not a broken Chrome install —
|
|
97
103
|
// so try the next candidate exactly like an already-occupied one,
|
|
98
104
|
// instead of failing the whole launch outright. A candidate that
|
|
99
|
-
// fails with nothing now listening
|
|
100
|
-
// executable, sandbox refusal, etc.)
|
|
101
|
-
//
|
|
105
|
+
// fails with nothing now listening is usually a real launch failure
|
|
106
|
+
// (bad executable, sandbox refusal, etc.) that the next candidate would
|
|
107
|
+
// only repeat, so it is surfaced as-is.
|
|
102
108
|
if (!isLastCandidate && (await isTcpPortOpen(candidate)))
|
|
103
109
|
continue;
|
|
110
|
+
// Usually, but not always (#491): two launches that call listen() on
|
|
111
|
+
// the same port at the same instant can BOTH lose it on Linux — each
|
|
112
|
+
// socket is marked LISTEN before the kernel checks the port for
|
|
113
|
+
// conflicts, so each sees the other and gets EADDRINUSE. Both Chromes
|
|
114
|
+
// exit early and the port is free again, which is indistinguishable
|
|
115
|
+
// from a Chrome that cannot start. Move on once; a Chrome that really
|
|
116
|
+
// cannot start exits the same way on the next candidate, and the first
|
|
117
|
+
// of the two identical failures is surfaced.
|
|
118
|
+
if (err instanceof ChromeExitedEarlyError) {
|
|
119
|
+
if (!isLastCandidate && !toleratedEarlyExit) {
|
|
120
|
+
toleratedEarlyExit = err;
|
|
121
|
+
continue;
|
|
122
|
+
}
|
|
123
|
+
throw toleratedEarlyExit ?? err;
|
|
124
|
+
}
|
|
104
125
|
throw err;
|
|
105
126
|
}
|
|
106
127
|
}
|
|
@@ -134,7 +155,7 @@ export async function launchBrowser(config = {}) {
|
|
|
134
155
|
* doomed pid there. It also covers Chrome's [::1] fallback described above.
|
|
135
156
|
*/
|
|
136
157
|
async function launchOnFreePort(config, port) {
|
|
137
|
-
const chromePath =
|
|
158
|
+
const chromePath = await resolveChrome(config.executablePath);
|
|
138
159
|
// Unique per launch, not just per port and pid: two concurrent launches
|
|
139
160
|
// that both probe the same candidate port as free (the race this function
|
|
140
161
|
// exists to survive — see the retry-on-collision caller above) would
|
|
@@ -226,7 +247,7 @@ async function launchOnFreePort(config, port) {
|
|
|
226
247
|
earlyFailure ??= new Error(`Chrome failed to start on port ${port}: ${err.message}`);
|
|
227
248
|
});
|
|
228
249
|
child.on('exit', (code, signal) => {
|
|
229
|
-
earlyFailure ??= new
|
|
250
|
+
earlyFailure ??= new ChromeExitedEarlyError(`Chrome exited before the CDP endpoint opened on port ${port} ` +
|
|
230
251
|
`(code=${code ?? 'null'}, signal=${signal ?? 'null'})`);
|
|
231
252
|
});
|
|
232
253
|
child.unref();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser-launch.js","sourceRoot":"","sources":["../../../src/browser/browser-launch.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAE7E,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EACL,WAAW,EACX,cAAc,EACd,wBAAwB,EACxB,
|
|
1
|
+
{"version":3,"file":"browser-launch.js","sourceRoot":"","sources":["../../../src/browser/browser-launch.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { isPortOpen } from './browser-discovery.js';
|
|
1
|
+
export { findChrome, isPortOpen, setChromeFallback } from './browser-discovery.js';
|
|
2
2
|
export { launchBrowser } from './browser-launch.js';
|
|
3
3
|
export { closeBrowser, reapIdleLaunchedBrowser } from './browser-lifecycle.js';
|
|
4
4
|
export { connectToTarget, enableSessionDomains, getCurrentTitle, getCurrentUrl, openUrl, waitForLoad, } from './browser-page.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../../src/browser/browser.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../../src/browser/browser.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AACnF,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAC/E,OAAO,EACL,eAAe,EACf,oBAAoB,EACpB,eAAe,EACf,aAAa,EACb,OAAO,EACP,WAAW,GACZ,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,cAAc,EACd,sBAAsB,EACtB,uBAAuB,GACxB,MAAM,oBAAoB,CAAC"}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
// browser-launch, browser-lifecycle, browser-page). Pure move — this file now
|
|
3
3
|
// re-exports everything it used to define, so every existing import path
|
|
4
4
|
// keeps working.
|
|
5
|
-
export { isPortOpen } from './browser-discovery.js';
|
|
5
|
+
export { findChrome, isPortOpen, setChromeFallback } from './browser-discovery.js';
|
|
6
6
|
export { launchBrowser } from './browser-launch.js';
|
|
7
7
|
export { closeBrowser, reapIdleLaunchedBrowser } from './browser-lifecycle.js';
|
|
8
8
|
export { connectToTarget, enableSessionDomains, getCurrentTitle, getCurrentUrl, openUrl, waitForLoad, } from './browser-page.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser.js","sourceRoot":"","sources":["../../../src/browser/browser.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,8EAA8E;AAC9E,yEAAyE;AACzE,iBAAiB;AAEjB,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"browser.js","sourceRoot":"","sources":["../../../src/browser/browser.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,8EAA8E;AAC9E,yEAAyE;AACzE,iBAAiB;AAEjB,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AACnF,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAC/E,OAAO,EACL,eAAe,EACf,oBAAoB,EACpB,eAAe,EACf,aAAa,EACb,OAAO,EACP,WAAW,GACZ,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,cAAc,EACd,sBAAsB,EACtB,uBAAuB,GACxB,MAAM,oBAAoB,CAAC"}
|