@monoes/monobrowse 2.24.1 → 2.24.2
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/LICENSE +191 -0
- package/dist/src/__tests__/open-url-navigate-error.test.js +31 -0
- package/dist/src/__tests__/open-url-navigate-error.test.js.map +1 -1
- package/dist/src/browser/browser-page.d.ts.map +1 -1
- package/dist/src/browser/browser-page.js +5 -1
- package/dist/src/browser/browser-page.js.map +1 -1
- package/dist/src/cli.js +0 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +8 -9
- package/src/__tests__/open-url-navigate-error.test.ts +33 -0
- package/src/browser/browser-page.ts +5 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@monoes/monobrowse",
|
|
3
|
-
"version": "2.24.
|
|
3
|
+
"version": "2.24.2",
|
|
4
4
|
"description": "Native browser automation via Chrome DevTools Protocol — the engine powering monomind browse",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -37,13 +37,6 @@
|
|
|
37
37
|
"engines": {
|
|
38
38
|
"node": ">=22.12.0"
|
|
39
39
|
},
|
|
40
|
-
"scripts": {
|
|
41
|
-
"build": "tsc && node ../../../scripts/build-fs.mjs copy-into dist/src/browser/dashboard src/browser/dashboard/ui.html",
|
|
42
|
-
"test": "vitest run",
|
|
43
|
-
"test:coverage": "vitest run --coverage",
|
|
44
|
-
"prebuild": "node ../../../scripts/build-fs.mjs clean dist tsconfig.tsbuildinfo",
|
|
45
|
-
"prepublishOnly": "npm run build"
|
|
46
|
-
},
|
|
47
40
|
"keywords": [
|
|
48
41
|
"browser-automation",
|
|
49
42
|
"cdp",
|
|
@@ -70,5 +63,11 @@
|
|
|
70
63
|
"devDependencies": {
|
|
71
64
|
"typescript": "^7.0.2",
|
|
72
65
|
"vitest": "^4.1.4"
|
|
66
|
+
},
|
|
67
|
+
"scripts": {
|
|
68
|
+
"build": "tsc && node ../../../scripts/build-fs.mjs copy-into dist/src/browser/dashboard src/browser/dashboard/ui.html",
|
|
69
|
+
"test": "vitest run",
|
|
70
|
+
"test:coverage": "vitest run --coverage",
|
|
71
|
+
"prebuild": "node ../../../scripts/build-fs.mjs clean dist tsconfig.tsbuildinfo"
|
|
73
72
|
}
|
|
74
|
-
}
|
|
73
|
+
}
|
|
@@ -54,3 +54,36 @@ describe('openUrl navigation-failure detection', () => {
|
|
|
54
54
|
expect(calls).toHaveLength(0);
|
|
55
55
|
});
|
|
56
56
|
});
|
|
57
|
+
|
|
58
|
+
describe('openUrl on a page with a persistent connection (#670)', () => {
|
|
59
|
+
it('resolves once the page has loaded even though the network never goes idle', async () => {
|
|
60
|
+
vi.useFakeTimers();
|
|
61
|
+
try {
|
|
62
|
+
const handlers = new Map<string, (p: Record<string, unknown>, sid?: string) => void>();
|
|
63
|
+
const client = {
|
|
64
|
+
send: vi.fn(async (method: string) => {
|
|
65
|
+
if (method === 'Page.navigate') return { frameId: 'f1' };
|
|
66
|
+
if (method === 'Runtime.evaluate') return { result: { value: true } };
|
|
67
|
+
return {};
|
|
68
|
+
}),
|
|
69
|
+
on: vi.fn((event: string, fn: (p: Record<string, unknown>, sid?: string) => void) => {
|
|
70
|
+
handlers.set(event, fn);
|
|
71
|
+
// An SSE/long-poll request that never finishes.
|
|
72
|
+
if (event === 'Network.requestWillBeSent') {
|
|
73
|
+
queueMicrotask(() => fn({ requestId: 'sse' }, 'sess-1'));
|
|
74
|
+
}
|
|
75
|
+
return () => handlers.delete(event);
|
|
76
|
+
}),
|
|
77
|
+
} as unknown as CdpClient;
|
|
78
|
+
|
|
79
|
+
const done = openUrl(client, 'sess-1', 'http://127.0.0.1:1/login').then(
|
|
80
|
+
() => 'ok',
|
|
81
|
+
(e: Error) => e.message,
|
|
82
|
+
);
|
|
83
|
+
await vi.advanceTimersByTimeAsync(31_000);
|
|
84
|
+
await expect(done).resolves.toBe('ok');
|
|
85
|
+
} finally {
|
|
86
|
+
vi.useRealTimers();
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
});
|
|
@@ -58,7 +58,11 @@ export async function openUrl(client: CdpClient, sessionId: string, url: string)
|
|
|
58
58
|
// connection previously reported success against that error page.
|
|
59
59
|
const nav = await client.send<{ errorText?: string }>('Page.navigate', { url }, sessionId);
|
|
60
60
|
if (nav.errorText) throw new Error(`Navigation to ${url} failed: ${nav.errorText}`);
|
|
61
|
-
await
|
|
61
|
+
await waitForLoad(client, sessionId, 'load', 30_000);
|
|
62
|
+
// Best-effort settle for SPAs that keep fetching after `load`. A page holding
|
|
63
|
+
// an SSE/long-poll connection (e.g. the monomind dashboard) never goes idle,
|
|
64
|
+
// so a timeout here is not a failure (#670).
|
|
65
|
+
await waitForNetworkIdle(client, sessionId, 500, 5_000).catch(() => undefined);
|
|
62
66
|
}
|
|
63
67
|
|
|
64
68
|
export async function waitForLoad(
|