@monoes/monobrowse 1.0.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/browser/action-builder/analyzer.d.ts +11 -0
- package/dist/src/browser/action-builder/analyzer.d.ts.map +1 -0
- package/dist/src/browser/action-builder/analyzer.js +93 -0
- package/dist/src/browser/action-builder/analyzer.js.map +1 -0
- package/dist/src/browser/action-builder/types.d.ts +46 -0
- package/dist/src/browser/action-builder/types.d.ts.map +1 -0
- package/dist/src/browser/action-builder/types.js +2 -0
- package/dist/src/browser/action-builder/types.js.map +1 -0
- package/dist/src/browser/actions.d.ts +29 -0
- package/dist/src/browser/actions.d.ts.map +1 -0
- package/dist/src/browser/actions.js +398 -0
- package/dist/src/browser/actions.js.map +1 -0
- package/dist/src/browser/adapters/gemini.d.ts +3 -0
- package/dist/src/browser/adapters/gemini.d.ts.map +1 -0
- package/dist/src/browser/adapters/gemini.js +13 -0
- package/dist/src/browser/adapters/gemini.js.map +1 -0
- package/dist/src/browser/adapters/google.d.ts +3 -0
- package/dist/src/browser/adapters/google.d.ts.map +1 -0
- package/dist/src/browser/adapters/google.js +17 -0
- package/dist/src/browser/adapters/google.js.map +1 -0
- package/dist/src/browser/adapters/index.d.ts +15 -0
- package/dist/src/browser/adapters/index.d.ts.map +1 -0
- package/dist/src/browser/adapters/index.js +18 -0
- package/dist/src/browser/adapters/index.js.map +1 -0
- package/dist/src/browser/adapters/instagram.d.ts +3 -0
- package/dist/src/browser/adapters/instagram.d.ts.map +1 -0
- package/dist/src/browser/adapters/instagram.js +14 -0
- package/dist/src/browser/adapters/instagram.js.map +1 -0
- package/dist/src/browser/adapters/linkedin.d.ts +3 -0
- package/dist/src/browser/adapters/linkedin.d.ts.map +1 -0
- package/dist/src/browser/adapters/linkedin.js +13 -0
- package/dist/src/browser/adapters/linkedin.js.map +1 -0
- package/dist/src/browser/adapters/microsoft.d.ts +3 -0
- package/dist/src/browser/adapters/microsoft.d.ts.map +1 -0
- package/dist/src/browser/adapters/microsoft.js +16 -0
- package/dist/src/browser/adapters/microsoft.js.map +1 -0
- package/dist/src/browser/adapters/x.d.ts +3 -0
- package/dist/src/browser/adapters/x.d.ts.map +1 -0
- package/dist/src/browser/adapters/x.js +13 -0
- package/dist/src/browser/adapters/x.js.map +1 -0
- package/dist/src/browser/batch.d.ts +5 -0
- package/dist/src/browser/batch.d.ts.map +1 -0
- package/dist/src/browser/batch.js +2 -0
- package/dist/src/browser/batch.js.map +1 -0
- package/dist/src/browser/browser.d.ts +15 -0
- package/dist/src/browser/browser.d.ts.map +1 -0
- package/dist/src/browser/browser.js +256 -0
- package/dist/src/browser/browser.js.map +1 -0
- package/dist/src/browser/cdp.d.ts +18 -0
- package/dist/src/browser/cdp.d.ts.map +1 -0
- package/dist/src/browser/cdp.js +153 -0
- package/dist/src/browser/cdp.js.map +1 -0
- package/dist/src/browser/console-log.d.ts +23 -0
- package/dist/src/browser/console-log.d.ts.map +1 -0
- package/dist/src/browser/console-log.js +104 -0
- package/dist/src/browser/console-log.js.map +1 -0
- package/dist/src/browser/dashboard/api-types.d.ts +50 -0
- package/dist/src/browser/dashboard/api-types.d.ts.map +1 -0
- package/dist/src/browser/dashboard/api-types.js +14 -0
- package/dist/src/browser/dashboard/api-types.js.map +1 -0
- package/dist/src/browser/dashboard/server.d.ts +11 -0
- package/dist/src/browser/dashboard/server.d.ts.map +1 -0
- package/dist/src/browser/dashboard/server.js +191 -0
- package/dist/src/browser/dashboard/server.js.map +1 -0
- package/dist/src/browser/dialog.d.ts +12 -0
- package/dist/src/browser/dialog.d.ts.map +1 -0
- package/dist/src/browser/dialog.js +53 -0
- package/dist/src/browser/dialog.js.map +1 -0
- package/dist/src/browser/emulation.d.ts +15 -0
- package/dist/src/browser/emulation.d.ts.map +1 -0
- package/dist/src/browser/emulation.js +62 -0
- package/dist/src/browser/emulation.js.map +1 -0
- package/dist/src/browser/find.d.ts +22 -0
- package/dist/src/browser/find.d.ts.map +1 -0
- package/dist/src/browser/find.js +169 -0
- package/dist/src/browser/find.js.map +1 -0
- package/dist/src/browser/har.d.ts +27 -0
- package/dist/src/browser/har.d.ts.map +1 -0
- package/dist/src/browser/har.js +161 -0
- package/dist/src/browser/har.js.map +1 -0
- package/dist/src/browser/index.d.ts +23 -0
- package/dist/src/browser/index.d.ts.map +1 -0
- package/dist/src/browser/index.js +23 -0
- package/dist/src/browser/index.js.map +1 -0
- package/dist/src/browser/network.d.ts +32 -0
- package/dist/src/browser/network.d.ts.map +1 -0
- package/dist/src/browser/network.js +214 -0
- package/dist/src/browser/network.js.map +1 -0
- package/dist/src/browser/pdf.d.ts +15 -0
- package/dist/src/browser/pdf.d.ts.map +1 -0
- package/dist/src/browser/pdf.js +27 -0
- package/dist/src/browser/pdf.js.map +1 -0
- package/dist/src/browser/profiler.d.ts +10 -0
- package/dist/src/browser/profiler.d.ts.map +1 -0
- package/dist/src/browser/profiler.js +77 -0
- package/dist/src/browser/profiler.js.map +1 -0
- package/dist/src/browser/record.d.ts +21 -0
- package/dist/src/browser/record.d.ts.map +1 -0
- package/dist/src/browser/record.js +59 -0
- package/dist/src/browser/record.js.map +1 -0
- package/dist/src/browser/screenshot.d.ts +15 -0
- package/dist/src/browser/screenshot.d.ts.map +1 -0
- package/dist/src/browser/screenshot.js +38 -0
- package/dist/src/browser/screenshot.js.map +1 -0
- package/dist/src/browser/session.d.ts +8 -0
- package/dist/src/browser/session.d.ts.map +1 -0
- package/dist/src/browser/session.js +91 -0
- package/dist/src/browser/session.js.map +1 -0
- package/dist/src/browser/snapshot.d.ts +12 -0
- package/dist/src/browser/snapshot.d.ts.map +1 -0
- package/dist/src/browser/snapshot.js +179 -0
- package/dist/src/browser/snapshot.js.map +1 -0
- package/dist/src/browser/storage.d.ts +12 -0
- package/dist/src/browser/storage.d.ts.map +1 -0
- package/dist/src/browser/storage.js +46 -0
- package/dist/src/browser/storage.js.map +1 -0
- package/dist/src/browser/tabs.d.ts +8 -0
- package/dist/src/browser/tabs.d.ts.map +1 -0
- package/dist/src/browser/tabs.js +25 -0
- package/dist/src/browser/tabs.js.map +1 -0
- package/dist/src/browser/trace.d.ts +10 -0
- package/dist/src/browser/trace.d.ts.map +1 -0
- package/dist/src/browser/trace.js +87 -0
- package/dist/src/browser/trace.js.map +1 -0
- package/dist/src/browser/types.d.ts +111 -0
- package/dist/src/browser/types.d.ts.map +1 -0
- package/dist/src/browser/types.js +16 -0
- package/dist/src/browser/types.js.map +1 -0
- package/dist/src/browser/vitals.d.ts +15 -0
- package/dist/src/browser/vitals.d.ts.map +1 -0
- package/dist/src/browser/vitals.js +116 -0
- package/dist/src/browser/vitals.js.map +1 -0
- package/dist/src/browser/wait.d.ts +4 -0
- package/dist/src/browser/wait.d.ts.map +1 -0
- package/dist/src/browser/wait.js +146 -0
- package/dist/src/browser/wait.js.map +1 -0
- package/dist/src/browser/workflow/builtin-handlers.d.ts +3 -0
- package/dist/src/browser/workflow/builtin-handlers.d.ts.map +1 -0
- package/dist/src/browser/workflow/builtin-handlers.js +343 -0
- package/dist/src/browser/workflow/builtin-handlers.js.map +1 -0
- package/dist/src/browser/workflow/engine.d.ts +10 -0
- package/dist/src/browser/workflow/engine.d.ts.map +1 -0
- package/dist/src/browser/workflow/engine.js +174 -0
- package/dist/src/browser/workflow/engine.js.map +1 -0
- package/dist/src/browser/workflow/expression.d.ts +4 -0
- package/dist/src/browser/workflow/expression.d.ts.map +1 -0
- package/dist/src/browser/workflow/expression.js +89 -0
- package/dist/src/browser/workflow/expression.js.map +1 -0
- package/dist/src/browser/workflow/index.d.ts +6 -0
- package/dist/src/browser/workflow/index.d.ts.map +1 -0
- package/dist/src/browser/workflow/index.js +6 -0
- package/dist/src/browser/workflow/index.js.map +1 -0
- package/dist/src/browser/workflow/store.d.ts +8 -0
- package/dist/src/browser/workflow/store.d.ts.map +1 -0
- package/dist/src/browser/workflow/store.js +87 -0
- package/dist/src/browser/workflow/store.js.map +1 -0
- package/dist/src/browser/workflow/types.d.ts +62 -0
- package/dist/src/browser/workflow/types.d.ts.map +1 -0
- package/dist/src/browser/workflow/types.js +2 -0
- package/dist/src/browser/workflow/types.js.map +1 -0
- package/dist/src/index.d.ts +7 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +7 -0
- package/dist/src/index.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +56 -0
- package/src/browser/action-builder/analyzer.ts +127 -0
- package/src/browser/action-builder/types.ts +17 -0
- package/src/browser/actions.ts +518 -0
- package/src/browser/adapters/gemini.ts +15 -0
- package/src/browser/adapters/google.ts +20 -0
- package/src/browser/adapters/index.ts +33 -0
- package/src/browser/adapters/instagram.ts +16 -0
- package/src/browser/adapters/linkedin.ts +15 -0
- package/src/browser/adapters/microsoft.ts +19 -0
- package/src/browser/adapters/x.ts +15 -0
- package/src/browser/batch.ts +4 -0
- package/src/browser/browser.ts +265 -0
- package/src/browser/cdp.ts +156 -0
- package/src/browser/console-log.ts +120 -0
- package/src/browser/dashboard/api-types.ts +71 -0
- package/src/browser/dashboard/server.ts +206 -0
- package/src/browser/dashboard/ui.html +444 -0
- package/src/browser/dialog.ts +63 -0
- package/src/browser/emulation.ts +94 -0
- package/src/browser/find.ts +225 -0
- package/src/browser/har.ts +202 -0
- package/src/browser/index.ts +22 -0
- package/src/browser/network.ts +244 -0
- package/src/browser/pdf.ts +41 -0
- package/src/browser/profiler.ts +96 -0
- package/src/browser/record.ts +92 -0
- package/src/browser/screenshot.ts +67 -0
- package/src/browser/session.ts +118 -0
- package/src/browser/snapshot.ts +248 -0
- package/src/browser/storage.ts +54 -0
- package/src/browser/tabs.ts +37 -0
- package/src/browser/trace.ts +106 -0
- package/src/browser/types.ts +135 -0
- package/src/browser/vitals.ts +122 -0
- package/src/browser/wait.ts +178 -0
- package/src/browser/workflow/builtin-handlers.ts +379 -0
- package/src/browser/workflow/engine.ts +202 -0
- package/src/browser/workflow/expression.ts +107 -0
- package/src/browser/workflow/index.ts +5 -0
- package/src/browser/workflow/store.ts +87 -0
- package/src/browser/workflow/types.ts +62 -0
- package/src/index.ts +6 -0
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { readFile, writeFile, mkdir } from 'fs/promises';
|
|
2
|
+
import { join, dirname } from 'path';
|
|
3
|
+
import { homedir } from 'os';
|
|
4
|
+
import { getCookies, setCookies, getLocalStorage, setLocalStorage, getSessionStorage, setSessionStorage } from './network.js';
|
|
5
|
+
const SESSION_DIR = join(homedir(), '.monomind', 'browser-sessions');
|
|
6
|
+
function validateSessionName(name) {
|
|
7
|
+
if (!name || /[/\\\x00]/.test(name) || name === '..' || name === '.' || name.startsWith('..')) {
|
|
8
|
+
throw new Error(`Invalid session name: ${JSON.stringify(name)}`);
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
function validateFilePath(filePath) {
|
|
12
|
+
if (!filePath || filePath.includes('\x00')) {
|
|
13
|
+
throw new Error(`Invalid file path: ${JSON.stringify(filePath)}`);
|
|
14
|
+
}
|
|
15
|
+
if (filePath.includes('/../') || filePath.startsWith('../') || filePath.endsWith('/..') || filePath.includes('\\')) {
|
|
16
|
+
throw new Error(`Invalid file path (traversal not allowed): ${JSON.stringify(filePath)}`);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
export async function saveSession(client, sessionId, targetId, name, url, title) {
|
|
20
|
+
validateSessionName(name);
|
|
21
|
+
await mkdir(SESSION_DIR, { recursive: true });
|
|
22
|
+
const cookies = await getCookies(client, sessionId);
|
|
23
|
+
const localStorage = await getLocalStorage(client, sessionId);
|
|
24
|
+
const sessionStorage = await getSessionStorage(client, sessionId);
|
|
25
|
+
const state = { targetId, sessionId, url, title, cookies, localStorage, sessionStorage };
|
|
26
|
+
const filePath = join(SESSION_DIR, `${name}.json`);
|
|
27
|
+
await writeFile(filePath, JSON.stringify(state, null, 2));
|
|
28
|
+
return filePath;
|
|
29
|
+
}
|
|
30
|
+
export async function loadSession(client, sessionId, name) {
|
|
31
|
+
validateSessionName(name);
|
|
32
|
+
const filePath = join(SESSION_DIR, `${name}.json`);
|
|
33
|
+
const raw = await readFile(filePath, 'utf8').catch((err) => {
|
|
34
|
+
if (err.code === 'ENOENT')
|
|
35
|
+
throw new Error(`Session not found: ${name}`);
|
|
36
|
+
throw err;
|
|
37
|
+
});
|
|
38
|
+
const state = JSON.parse(raw);
|
|
39
|
+
if (!Array.isArray(state.cookies))
|
|
40
|
+
throw new Error(`Invalid session file: cookies is not an array`);
|
|
41
|
+
await setCookies(client, sessionId, state.cookies);
|
|
42
|
+
if (state.localStorage) {
|
|
43
|
+
if (typeof state.localStorage !== 'object' || Array.isArray(state.localStorage))
|
|
44
|
+
throw new Error('Invalid session file: localStorage is not a plain object');
|
|
45
|
+
await setLocalStorage(client, sessionId, state.localStorage);
|
|
46
|
+
}
|
|
47
|
+
if (state.sessionStorage) {
|
|
48
|
+
if (typeof state.sessionStorage !== 'object' || Array.isArray(state.sessionStorage))
|
|
49
|
+
throw new Error('Invalid session file: sessionStorage is not a plain object');
|
|
50
|
+
await setSessionStorage(client, sessionId, state.sessionStorage);
|
|
51
|
+
}
|
|
52
|
+
return state;
|
|
53
|
+
}
|
|
54
|
+
export async function saveStateFile(client, sessionId, targetId, filePath, url, title) {
|
|
55
|
+
validateFilePath(filePath);
|
|
56
|
+
await mkdir(dirname(filePath), { recursive: true });
|
|
57
|
+
const cookies = await getCookies(client, sessionId);
|
|
58
|
+
const localStorage = await getLocalStorage(client, sessionId);
|
|
59
|
+
const sessionStorage = await getSessionStorage(client, sessionId);
|
|
60
|
+
const state = { targetId, sessionId, url, title, cookies, localStorage, sessionStorage };
|
|
61
|
+
await writeFile(filePath, JSON.stringify(state, null, 2));
|
|
62
|
+
}
|
|
63
|
+
export async function loadStateFile(client, sessionId, filePath) {
|
|
64
|
+
validateFilePath(filePath);
|
|
65
|
+
const raw = await readFile(filePath, 'utf8');
|
|
66
|
+
const state = JSON.parse(raw);
|
|
67
|
+
if (!Array.isArray(state.cookies))
|
|
68
|
+
throw new Error(`Invalid state file: cookies is not an array`);
|
|
69
|
+
await setCookies(client, sessionId, state.cookies);
|
|
70
|
+
if (state.localStorage) {
|
|
71
|
+
if (typeof state.localStorage !== 'object' || Array.isArray(state.localStorage))
|
|
72
|
+
throw new Error('Invalid state file: localStorage is not a plain object');
|
|
73
|
+
await setLocalStorage(client, sessionId, state.localStorage);
|
|
74
|
+
}
|
|
75
|
+
if (state.sessionStorage) {
|
|
76
|
+
if (typeof state.sessionStorage !== 'object' || Array.isArray(state.sessionStorage))
|
|
77
|
+
throw new Error('Invalid state file: sessionStorage is not a plain object');
|
|
78
|
+
await setSessionStorage(client, sessionId, state.sessionStorage);
|
|
79
|
+
}
|
|
80
|
+
return state;
|
|
81
|
+
}
|
|
82
|
+
export async function listSessions() {
|
|
83
|
+
const { readdir } = await import('fs/promises');
|
|
84
|
+
const files = await readdir(SESSION_DIR).catch((err) => {
|
|
85
|
+
if (err.code === 'ENOENT')
|
|
86
|
+
return [];
|
|
87
|
+
throw err;
|
|
88
|
+
});
|
|
89
|
+
return files.filter((f) => f.endsWith('.json')).map((f) => f.replace(/\.json$/, ''));
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../../src/browser/session.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { CdpClient } from './cdp.js';
|
|
2
|
+
import type { ElementRef, SnapshotOptions, SnapshotResult } from './types.js';
|
|
3
|
+
export declare function captureSnapshot(client: CdpClient, sessionId: string, options?: SnapshotOptions): Promise<SnapshotResult>;
|
|
4
|
+
export declare function resolveRef(client: CdpClient, sessionId: string, refs: Map<string, ElementRef>, refKey: string): Promise<ElementRef>;
|
|
5
|
+
export declare function getObjectIdForRef(client: CdpClient, sessionId: string, ref: ElementRef): Promise<string | null>;
|
|
6
|
+
export declare function getElementBox(client: CdpClient, sessionId: string, ref: ElementRef): Promise<{
|
|
7
|
+
x: number;
|
|
8
|
+
y: number;
|
|
9
|
+
width: number;
|
|
10
|
+
height: number;
|
|
11
|
+
} | null>;
|
|
12
|
+
//# sourceMappingURL=snapshot.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snapshot.d.ts","sourceRoot":"","sources":["../../../src/browser/snapshot.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,KAAK,EAAE,UAAU,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAkB9E,wBAAsB,eAAe,CACnC,MAAM,EAAE,SAAS,EACjB,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAAC,cAAc,CAAC,CA+HzB;AA2CD,wBAAsB,UAAU,CAC9B,MAAM,EAAE,SAAS,EACjB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,EAC7B,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,UAAU,CAAC,CAIrB;AAED,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,SAAS,EACjB,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,UAAU,GACd,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CASxB;AAED,wBAAsB,aAAa,CACjC,MAAM,EAAE,SAAS,EACjB,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,UAAU,GACd,OAAO,CAAC;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,CAwBzE"}
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
import { INTERACTIVE_ROLES } from './types.js';
|
|
2
|
+
import { getCurrentUrl, getCurrentTitle } from './browser.js';
|
|
3
|
+
export async function captureSnapshot(client, sessionId, options = {}) {
|
|
4
|
+
const { interactiveOnly = false, compact = false, maxDepth, selector } = options;
|
|
5
|
+
// If a selector scope is requested, resolve it to a backendDOMNodeId and use getPartialAXTree
|
|
6
|
+
let nodes;
|
|
7
|
+
if (selector) {
|
|
8
|
+
const doc = await client.send('DOM.getDocument', {}, sessionId);
|
|
9
|
+
const found = await client.send('DOM.querySelector', { nodeId: doc.root.nodeId, selector }, sessionId).catch(() => ({ nodeId: 0 }));
|
|
10
|
+
if (found.nodeId) {
|
|
11
|
+
const partial = await client.send('Accessibility.getPartialAXTree', { nodeId: found.nodeId, fetchRelatives: false }, sessionId).catch(async () => client.send('Accessibility.getFullAXTree', {}, sessionId));
|
|
12
|
+
nodes = partial.nodes;
|
|
13
|
+
}
|
|
14
|
+
else {
|
|
15
|
+
const full = await client.send('Accessibility.getFullAXTree', {}, sessionId);
|
|
16
|
+
nodes = full.nodes;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
else {
|
|
20
|
+
const full = await client.send('Accessibility.getFullAXTree', {}, sessionId);
|
|
21
|
+
nodes = full.nodes;
|
|
22
|
+
}
|
|
23
|
+
const url = await getCurrentUrl(client, sessionId);
|
|
24
|
+
const title = await getCurrentTitle(client, sessionId);
|
|
25
|
+
const refs = new Map();
|
|
26
|
+
const nodeMap = new Map();
|
|
27
|
+
for (const node of nodes)
|
|
28
|
+
nodeMap.set(node.nodeId, node);
|
|
29
|
+
let refCounter = 1;
|
|
30
|
+
const lines = [];
|
|
31
|
+
const processNode = (node, depth) => {
|
|
32
|
+
// Transparent/structural nodes don't consume depth budget — check before maxDepth
|
|
33
|
+
if (node.ignored) {
|
|
34
|
+
if (node.childIds) {
|
|
35
|
+
for (const childId of node.childIds) {
|
|
36
|
+
const child = nodeMap.get(childId);
|
|
37
|
+
if (child)
|
|
38
|
+
processNode(child, depth);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
const role = node.role?.value ?? 'generic';
|
|
44
|
+
if (role === 'none' || role === 'generic' || role === 'inlineTextBox') {
|
|
45
|
+
if (node.childIds) {
|
|
46
|
+
for (const childId of node.childIds) {
|
|
47
|
+
const child = nodeMap.get(childId);
|
|
48
|
+
if (child)
|
|
49
|
+
processNode(child, depth);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
// Only enforce maxDepth for real rendered roles
|
|
55
|
+
if (maxDepth !== undefined && depth > maxDepth)
|
|
56
|
+
return;
|
|
57
|
+
const name = node.name?.value ?? '';
|
|
58
|
+
const description = node.description?.value;
|
|
59
|
+
const isInteractive = INTERACTIVE_ROLES.has(role.toLowerCase());
|
|
60
|
+
if (interactiveOnly && !isInteractive) {
|
|
61
|
+
if (node.childIds) {
|
|
62
|
+
for (const childId of node.childIds) {
|
|
63
|
+
const child = nodeMap.get(childId);
|
|
64
|
+
if (child)
|
|
65
|
+
processNode(child, depth);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
const props = extractProperties(node);
|
|
71
|
+
const refKey = `e${refCounter++}`;
|
|
72
|
+
const elemRef = {
|
|
73
|
+
ref: refKey,
|
|
74
|
+
role,
|
|
75
|
+
name,
|
|
76
|
+
description,
|
|
77
|
+
placeholder: props.placeholder,
|
|
78
|
+
value: props.value,
|
|
79
|
+
disabled: props.disabled,
|
|
80
|
+
checked: props.checked,
|
|
81
|
+
expanded: props.expanded,
|
|
82
|
+
nodeId: node.nodeId,
|
|
83
|
+
backendDOMNodeId: node.backendDOMNodeId,
|
|
84
|
+
};
|
|
85
|
+
refs.set(refKey, elemRef);
|
|
86
|
+
const indent = compact ? '' : ' '.repeat(depth);
|
|
87
|
+
const attrParts = [`ref=${refKey}`];
|
|
88
|
+
if (props.value !== undefined)
|
|
89
|
+
attrParts.push(`value="${props.value}"`);
|
|
90
|
+
if (props.disabled)
|
|
91
|
+
attrParts.push('disabled');
|
|
92
|
+
if (props.checked !== undefined)
|
|
93
|
+
attrParts.push(`checked=${props.checked}`);
|
|
94
|
+
if (props.expanded !== undefined)
|
|
95
|
+
attrParts.push(`expanded=${props.expanded}`);
|
|
96
|
+
if (props.placeholder)
|
|
97
|
+
attrParts.push(`placeholder="${props.placeholder}"`);
|
|
98
|
+
if (props.required)
|
|
99
|
+
attrParts.push('required');
|
|
100
|
+
const nameStr = name ? ` "${name}"` : '';
|
|
101
|
+
const descStr = description && !compact ? ` (${description})` : '';
|
|
102
|
+
const attrsStr = ` [${attrParts.join(', ')}]`;
|
|
103
|
+
lines.push(`${indent}${role}${nameStr}${descStr}${attrsStr}`);
|
|
104
|
+
if (node.childIds) {
|
|
105
|
+
for (const childId of node.childIds) {
|
|
106
|
+
const child = nodeMap.get(childId);
|
|
107
|
+
if (child)
|
|
108
|
+
processNode(child, depth + 1);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
};
|
|
112
|
+
// Find root nodes — for partial trees parentId may point outside the set; use filter to handle forests
|
|
113
|
+
const ids = new Set(nodes.map((n) => n.nodeId));
|
|
114
|
+
const roots = nodes.filter((n) => n.parentId === undefined || !ids.has(n.parentId));
|
|
115
|
+
for (const root of roots)
|
|
116
|
+
processNode(root, 0);
|
|
117
|
+
return { text: lines.join('\n'), refs, url, title };
|
|
118
|
+
}
|
|
119
|
+
function extractProperties(node) {
|
|
120
|
+
const result = {};
|
|
121
|
+
if (!node.properties)
|
|
122
|
+
return result;
|
|
123
|
+
for (const prop of node.properties) {
|
|
124
|
+
switch (prop.name) {
|
|
125
|
+
case 'value':
|
|
126
|
+
if (prop.value.value != null)
|
|
127
|
+
result.value = String(prop.value.value);
|
|
128
|
+
break;
|
|
129
|
+
case 'disabled':
|
|
130
|
+
result.disabled = Boolean(prop.value.value);
|
|
131
|
+
break;
|
|
132
|
+
case 'checked':
|
|
133
|
+
result.checked = prop.value.value === 'true' || prop.value.value === true;
|
|
134
|
+
break;
|
|
135
|
+
case 'expanded':
|
|
136
|
+
result.expanded = prop.value.value === 'true' || prop.value.value === true;
|
|
137
|
+
break;
|
|
138
|
+
case 'placeholder':
|
|
139
|
+
result.placeholder = String(prop.value.value ?? '');
|
|
140
|
+
break;
|
|
141
|
+
case 'required':
|
|
142
|
+
result.required = Boolean(prop.value.value);
|
|
143
|
+
break;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
if (node.value?.value !== undefined && result.value === undefined) {
|
|
147
|
+
result.value = String(node.value.value);
|
|
148
|
+
}
|
|
149
|
+
return result;
|
|
150
|
+
}
|
|
151
|
+
export async function resolveRef(client, sessionId, refs, refKey) {
|
|
152
|
+
const ref = refs.get(refKey);
|
|
153
|
+
if (!ref)
|
|
154
|
+
throw new Error(`Element ref @${refKey} not found. Run snapshot first.`);
|
|
155
|
+
return ref;
|
|
156
|
+
}
|
|
157
|
+
export async function getObjectIdForRef(client, sessionId, ref) {
|
|
158
|
+
if (!ref.backendDOMNodeId)
|
|
159
|
+
return null;
|
|
160
|
+
const result = await client.send('DOM.resolveNode', { backendNodeId: ref.backendDOMNodeId }, sessionId);
|
|
161
|
+
return result.object?.objectId ?? null;
|
|
162
|
+
}
|
|
163
|
+
export async function getElementBox(client, sessionId, ref) {
|
|
164
|
+
if (!ref.backendDOMNodeId)
|
|
165
|
+
return null;
|
|
166
|
+
try {
|
|
167
|
+
const result = await client.send('DOM.getBoxModel', { backendNodeId: ref.backendDOMNodeId }, sessionId);
|
|
168
|
+
const content = result.model?.content;
|
|
169
|
+
if (!content || content.length < 8)
|
|
170
|
+
return null;
|
|
171
|
+
const x = (content[0] + content[2] + content[4] + content[6]) / 4;
|
|
172
|
+
const y = (content[1] + content[3] + content[5] + content[7]) / 4;
|
|
173
|
+
return { x, y, width: result.model.width, height: result.model.height };
|
|
174
|
+
}
|
|
175
|
+
catch {
|
|
176
|
+
return null;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
//# sourceMappingURL=snapshot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snapshot.js","sourceRoot":"","sources":["../../../src/browser/snapshot.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { CdpClient } from './cdp.js';
|
|
2
|
+
export declare function getLocalStorageKey(client: CdpClient, sessionId: string, key: string): Promise<string | null>;
|
|
3
|
+
export declare function setLocalStorageKey(client: CdpClient, sessionId: string, key: string, value: string): Promise<void>;
|
|
4
|
+
export declare function removeLocalStorageKey(client: CdpClient, sessionId: string, key: string): Promise<void>;
|
|
5
|
+
export declare function clearLocalStorage(client: CdpClient, sessionId: string): Promise<void>;
|
|
6
|
+
export declare function getAllLocalStorage(client: CdpClient, sessionId: string): Promise<Record<string, string>>;
|
|
7
|
+
export declare function getSessionStorageKey(client: CdpClient, sessionId: string, key: string): Promise<string | null>;
|
|
8
|
+
export declare function setSessionStorageKey(client: CdpClient, sessionId: string, key: string, value: string): Promise<void>;
|
|
9
|
+
export declare function removeSessionStorageKey(client: CdpClient, sessionId: string, key: string): Promise<void>;
|
|
10
|
+
export declare function clearSessionStorage(client: CdpClient, sessionId: string): Promise<void>;
|
|
11
|
+
export declare function getAllSessionStorage(client: CdpClient, sessionId: string): Promise<Record<string, string>>;
|
|
12
|
+
//# sourceMappingURL=storage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../../src/browser/storage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAG1C,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAGlH;AAED,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAExH;AAED,wBAAsB,qBAAqB,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE5G;AAED,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE3F;AAED,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAO9G;AAED,wBAAsB,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAGpH;AAED,wBAAsB,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE1H;AAED,wBAAsB,uBAAuB,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE9G;AAED,wBAAsB,mBAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE7F;AAED,wBAAsB,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAOhH"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { evaluateJs } from './actions.js';
|
|
2
|
+
export async function getLocalStorageKey(client, sessionId, key) {
|
|
3
|
+
const result = await evaluateJs(client, sessionId, `localStorage.getItem(${JSON.stringify(key)})`);
|
|
4
|
+
return result;
|
|
5
|
+
}
|
|
6
|
+
export async function setLocalStorageKey(client, sessionId, key, value) {
|
|
7
|
+
await evaluateJs(client, sessionId, `localStorage.setItem(${JSON.stringify(key)}, ${JSON.stringify(value)})`);
|
|
8
|
+
}
|
|
9
|
+
export async function removeLocalStorageKey(client, sessionId, key) {
|
|
10
|
+
await evaluateJs(client, sessionId, `localStorage.removeItem(${JSON.stringify(key)})`);
|
|
11
|
+
}
|
|
12
|
+
export async function clearLocalStorage(client, sessionId) {
|
|
13
|
+
await evaluateJs(client, sessionId, 'localStorage.clear()');
|
|
14
|
+
}
|
|
15
|
+
export async function getAllLocalStorage(client, sessionId) {
|
|
16
|
+
const result = await evaluateJs(client, sessionId, 'JSON.stringify(Object.fromEntries(Object.entries(localStorage)))');
|
|
17
|
+
try {
|
|
18
|
+
return JSON.parse(result);
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
return {};
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
export async function getSessionStorageKey(client, sessionId, key) {
|
|
25
|
+
const result = await evaluateJs(client, sessionId, `sessionStorage.getItem(${JSON.stringify(key)})`);
|
|
26
|
+
return result;
|
|
27
|
+
}
|
|
28
|
+
export async function setSessionStorageKey(client, sessionId, key, value) {
|
|
29
|
+
await evaluateJs(client, sessionId, `sessionStorage.setItem(${JSON.stringify(key)}, ${JSON.stringify(value)})`);
|
|
30
|
+
}
|
|
31
|
+
export async function removeSessionStorageKey(client, sessionId, key) {
|
|
32
|
+
await evaluateJs(client, sessionId, `sessionStorage.removeItem(${JSON.stringify(key)})`);
|
|
33
|
+
}
|
|
34
|
+
export async function clearSessionStorage(client, sessionId) {
|
|
35
|
+
await evaluateJs(client, sessionId, 'sessionStorage.clear()');
|
|
36
|
+
}
|
|
37
|
+
export async function getAllSessionStorage(client, sessionId) {
|
|
38
|
+
const result = await evaluateJs(client, sessionId, 'JSON.stringify(Object.fromEntries(Object.entries(sessionStorage)))');
|
|
39
|
+
try {
|
|
40
|
+
return JSON.parse(result);
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
return {};
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=storage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../../../src/browser/storage.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,MAAiB,EAAE,SAAiB,EAAE,GAAW;IACxF,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,MAAM,EAAE,SAAS,EAAE,wBAAwB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACnG,OAAO,MAAuB,CAAC;AACjC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,MAAiB,EAAE,SAAiB,EAAE,GAAW,EAAE,KAAa;IACvG,MAAM,UAAU,CAAC,MAAM,EAAE,SAAS,EAAE,wBAAwB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AAChH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,MAAiB,EAAE,SAAiB,EAAE,GAAW;IAC3F,MAAM,UAAU,CAAC,MAAM,EAAE,SAAS,EAAE,2BAA2B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AACzF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,MAAiB,EAAE,SAAiB;IAC1E,MAAM,UAAU,CAAC,MAAM,EAAE,SAAS,EAAE,sBAAsB,CAAC,CAAC;AAC9D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,MAAiB,EAAE,SAAiB;IAC3E,MAAM,MAAM,GAAG,MAAM,UAAU,CAC7B,MAAM,EACN,SAAS,EACT,kEAAkE,CACnE,CAAC;IACF,IAAI,CAAC;QAAC,OAAO,IAAI,CAAC,KAAK,CAAC,MAAgB,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,EAAE,CAAC;IAAC,CAAC;AACnE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,MAAiB,EAAE,SAAiB,EAAE,GAAW;IAC1F,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,MAAM,EAAE,SAAS,EAAE,0BAA0B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACrG,OAAO,MAAuB,CAAC;AACjC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,MAAiB,EAAE,SAAiB,EAAE,GAAW,EAAE,KAAa;IACzG,MAAM,UAAU,CAAC,MAAM,EAAE,SAAS,EAAE,0BAA0B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AAClH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,MAAiB,EAAE,SAAiB,EAAE,GAAW;IAC7F,MAAM,UAAU,CAAC,MAAM,EAAE,SAAS,EAAE,6BAA6B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAC3F,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,MAAiB,EAAE,SAAiB;IAC5E,MAAM,UAAU,CAAC,MAAM,EAAE,SAAS,EAAE,wBAAwB,CAAC,CAAC;AAChE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,MAAiB,EAAE,SAAiB;IAC7E,MAAM,MAAM,GAAG,MAAM,UAAU,CAC7B,MAAM,EACN,SAAS,EACT,oEAAoE,CACrE,CAAC;IACF,IAAI,CAAC;QAAC,OAAO,IAAI,CAAC,KAAK,CAAC,MAAgB,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,EAAE,CAAC;IAAC,CAAC;AACnE,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { CdpClient } from './cdp.js';
|
|
2
|
+
import type { CdpTarget } from './types.js';
|
|
3
|
+
export declare function listTabs(port: number): Promise<CdpTarget[]>;
|
|
4
|
+
export declare function newTab(port: number, url?: string): Promise<CdpTarget>;
|
|
5
|
+
export declare function closeTab(client: CdpClient, _sessionId: string, targetId: string): Promise<void>;
|
|
6
|
+
export declare function activateTab(client: CdpClient, oldSessionId: string, targetId: string): Promise<string>;
|
|
7
|
+
export declare function switchToFrame(_client: CdpClient, _sessionId: string, _frameSelector: string): Promise<string | null>;
|
|
8
|
+
//# sourceMappingURL=tabs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tabs.d.ts","sourceRoot":"","sources":["../../../src/browser/tabs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAG5C,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAGjE;AAED,wBAAsB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,SAAgB,GAAG,OAAO,CAAC,SAAS,CAAC,CAElF;AAED,wBAAsB,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAErG;AAED,wBAAsB,WAAW,CAAC,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAO5G;AAED,wBAAsB,aAAa,CACjC,OAAO,EAAE,SAAS,EAClB,UAAU,EAAE,MAAM,EAClB,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAMxB"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { fetchTargets, fetchNewTarget } from './cdp.js';
|
|
2
|
+
export async function listTabs(port) {
|
|
3
|
+
const targets = await fetchTargets(port);
|
|
4
|
+
return targets.filter((t) => t.type === 'page');
|
|
5
|
+
}
|
|
6
|
+
export async function newTab(port, url = 'about:blank') {
|
|
7
|
+
return fetchNewTarget(port, url);
|
|
8
|
+
}
|
|
9
|
+
export async function closeTab(client, _sessionId, targetId) {
|
|
10
|
+
await client.send('Target.closeTarget', { targetId });
|
|
11
|
+
}
|
|
12
|
+
export async function activateTab(client, oldSessionId, targetId) {
|
|
13
|
+
if (oldSessionId) {
|
|
14
|
+
await client.send('Target.detachFromTarget', { sessionId: oldSessionId }).catch(() => { });
|
|
15
|
+
}
|
|
16
|
+
await client.send('Target.activateTarget', { targetId });
|
|
17
|
+
const result = await client.send('Target.attachToTarget', { targetId, flatten: true });
|
|
18
|
+
return result.sessionId;
|
|
19
|
+
}
|
|
20
|
+
export async function switchToFrame(_client, _sessionId, _frameSelector) {
|
|
21
|
+
throw new Error('switchToFrame is not yet implemented. ' +
|
|
22
|
+
'For same-origin frames, CDP commands already apply to the whole page. ' +
|
|
23
|
+
'For cross-origin (OOPIF) frames, call Target.attachToTarget with the frame target ID.');
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=tabs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tabs.js","sourceRoot":"","sources":["../../../src/browser/tabs.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAExD,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,IAAY;IACzC,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,CAAC;IACzC,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,IAAY,EAAE,GAAG,GAAG,aAAa;IAC5D,OAAO,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;AACnC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,MAAiB,EAAE,UAAkB,EAAE,QAAgB;IACpF,MAAM,MAAM,CAAC,IAAI,CAAC,oBAAoB,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,MAAiB,EAAE,YAAoB,EAAE,QAAgB;IACzF,IAAI,YAAY,EAAE,CAAC;QACjB,MAAM,MAAM,CAAC,IAAI,CAAC,yBAAyB,EAAE,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAC5F,CAAC;IACD,MAAM,MAAM,CAAC,IAAI,CAAC,uBAAuB,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;IACzD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAAwB,uBAAuB,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9G,OAAO,MAAM,CAAC,SAAS,CAAC;AAC1B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,OAAkB,EAClB,UAAkB,EAClB,cAAsB;IAEtB,MAAM,IAAI,KAAK,CACb,wCAAwC;QACxC,wEAAwE;QACxE,uFAAuF,CACxF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { CdpClient } from './cdp.js';
|
|
2
|
+
export interface TraceOptions {
|
|
3
|
+
path?: string;
|
|
4
|
+
categories?: string[];
|
|
5
|
+
screenshots?: boolean;
|
|
6
|
+
}
|
|
7
|
+
export declare function startTrace(client: CdpClient, sessionId: string, options?: TraceOptions): Promise<void>;
|
|
8
|
+
export declare function stopTrace(client: CdpClient, sessionId: string, outputPath?: string): Promise<string>;
|
|
9
|
+
export declare function getTraceStatus(sessionId: string): boolean;
|
|
10
|
+
//# sourceMappingURL=trace.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trace.d.ts","sourceRoot":"","sources":["../../../src/browser/trace.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAK1C,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAiBD,wBAAsB,UAAU,CAC9B,MAAM,EAAE,SAAS,EACjB,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,IAAI,CAAC,CA8Bf;AAED,wBAAsB,SAAS,CAC7B,MAAM,EAAE,SAAS,EACjB,SAAS,EAAE,MAAM,EACjB,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,MAAM,CAAC,CAmCjB;AAED,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAEzD"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { writeFile } from 'fs/promises';
|
|
2
|
+
import { join } from 'path';
|
|
3
|
+
import { tmpdir } from 'os';
|
|
4
|
+
const DEFAULT_CATEGORIES = [
|
|
5
|
+
'-*',
|
|
6
|
+
'devtools.timeline',
|
|
7
|
+
'v8.execute',
|
|
8
|
+
'disabled-by-default-devtools.timeline',
|
|
9
|
+
'disabled-by-default-devtools.timeline.frame',
|
|
10
|
+
'toplevel',
|
|
11
|
+
'blink.console',
|
|
12
|
+
'blink.user_timing',
|
|
13
|
+
'latencyInfo',
|
|
14
|
+
'disabled-by-default-devtools.timeline.stack',
|
|
15
|
+
];
|
|
16
|
+
const _sessions = new Map();
|
|
17
|
+
export async function startTrace(client, sessionId, options = {}) {
|
|
18
|
+
if (_sessions.has(sessionId)) {
|
|
19
|
+
throw new Error('Trace already in progress for this session');
|
|
20
|
+
}
|
|
21
|
+
const events = [];
|
|
22
|
+
const offData = client.on('Tracing.dataCollected', (params, sid) => {
|
|
23
|
+
if (sid !== sessionId)
|
|
24
|
+
return;
|
|
25
|
+
const value = params.value;
|
|
26
|
+
if (Array.isArray(value))
|
|
27
|
+
events.push(...value);
|
|
28
|
+
});
|
|
29
|
+
_sessions.set(sessionId, { events, offData });
|
|
30
|
+
const cats = [...(options.categories ?? DEFAULT_CATEGORIES)];
|
|
31
|
+
if (options.screenshots)
|
|
32
|
+
cats.push('disabled-by-default-devtools.screenshot');
|
|
33
|
+
try {
|
|
34
|
+
await client.send('Tracing.start', {
|
|
35
|
+
traceConfig: {
|
|
36
|
+
includedCategories: cats.filter((c) => !c.startsWith('-')),
|
|
37
|
+
excludedCategories: cats.filter((c) => c.startsWith('-')).map((c) => c.slice(1)),
|
|
38
|
+
},
|
|
39
|
+
}, sessionId);
|
|
40
|
+
}
|
|
41
|
+
catch (err) {
|
|
42
|
+
offData();
|
|
43
|
+
_sessions.delete(sessionId);
|
|
44
|
+
throw err;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
export async function stopTrace(client, sessionId, outputPath) {
|
|
48
|
+
const state = _sessions.get(sessionId);
|
|
49
|
+
if (!state)
|
|
50
|
+
throw new Error('No active trace for this session');
|
|
51
|
+
try {
|
|
52
|
+
const [completePromise, cancelOnce] = client.onceWithOff('Tracing.tracingComplete', sessionId);
|
|
53
|
+
let timeoutHandle;
|
|
54
|
+
const timeoutPromise = new Promise((_, reject) => {
|
|
55
|
+
timeoutHandle = setTimeout(() => {
|
|
56
|
+
cancelOnce();
|
|
57
|
+
reject(new Error('Timeout waiting for Tracing.tracingComplete'));
|
|
58
|
+
}, 30_000);
|
|
59
|
+
});
|
|
60
|
+
try {
|
|
61
|
+
await client.send('Tracing.end', {}, sessionId);
|
|
62
|
+
await Promise.race([completePromise, timeoutPromise]);
|
|
63
|
+
}
|
|
64
|
+
catch (err) {
|
|
65
|
+
cancelOnce();
|
|
66
|
+
throw err;
|
|
67
|
+
}
|
|
68
|
+
finally {
|
|
69
|
+
clearTimeout(timeoutHandle);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
finally {
|
|
73
|
+
state.offData();
|
|
74
|
+
_sessions.delete(sessionId);
|
|
75
|
+
}
|
|
76
|
+
const trace = {
|
|
77
|
+
traceEvents: state.events,
|
|
78
|
+
metadata: { 'clock-offset-since-epoch': Date.now() },
|
|
79
|
+
};
|
|
80
|
+
const path = outputPath ?? join(tmpdir(), `monomind-trace-${Date.now()}.json`);
|
|
81
|
+
await writeFile(path, JSON.stringify(trace));
|
|
82
|
+
return path;
|
|
83
|
+
}
|
|
84
|
+
export function getTraceStatus(sessionId) {
|
|
85
|
+
return _sessions.has(sessionId);
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=trace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trace.js","sourceRoot":"","sources":["../../../src/browser/trace.ts"],"names":[],"mappings":"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"}
|