@vforsh/argus-watcher 0.1.8 → 0.1.10
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 +5 -1
- package/dist/.tsbuildinfo +1 -1
- package/dist/buffer/NetBuffer.d.ts +35 -11
- package/dist/buffer/NetBuffer.d.ts.map +1 -1
- package/dist/buffer/NetBuffer.js +64 -55
- package/dist/buffer/NetBuffer.js.map +1 -1
- package/dist/cdp/accessibility.d.ts +12 -1
- package/dist/cdp/accessibility.d.ts.map +1 -1
- package/dist/cdp/accessibility.js +88 -45
- package/dist/cdp/accessibility.js.map +1 -1
- package/dist/cdp/auth.d.ts +31 -1
- package/dist/cdp/auth.d.ts.map +1 -1
- package/dist/cdp/auth.js +299 -10
- package/dist/cdp/auth.js.map +1 -1
- package/dist/cdp/authState.d.ts +9 -0
- package/dist/cdp/authState.d.ts.map +1 -0
- package/dist/cdp/authState.js +44 -0
- package/dist/cdp/authState.js.map +1 -0
- package/dist/cdp/browserCookies.d.ts +8 -0
- package/dist/cdp/browserCookies.d.ts.map +1 -0
- package/dist/cdp/browserCookies.js +160 -0
- package/dist/cdp/browserCookies.js.map +1 -0
- package/dist/cdp/dom/fill.d.ts +2 -1
- package/dist/cdp/dom/fill.d.ts.map +1 -1
- package/dist/cdp/dom/fill.js +7 -7
- package/dist/cdp/dom/fill.js.map +1 -1
- package/dist/cdp/dom/info.d.ts +4 -2
- package/dist/cdp/dom/info.d.ts.map +1 -1
- package/dist/cdp/dom/info.js +20 -11
- package/dist/cdp/dom/info.js.map +1 -1
- package/dist/cdp/dom/selector.d.ts +45 -0
- package/dist/cdp/dom/selector.d.ts.map +1 -1
- package/dist/cdp/dom/selector.js +130 -25
- package/dist/cdp/dom/selector.js.map +1 -1
- package/dist/cdp/dom/types.d.ts +1 -0
- package/dist/cdp/dom/types.d.ts.map +1 -1
- package/dist/cdp/editor.d.ts.map +1 -1
- package/dist/cdp/editor.js +55 -3
- package/dist/cdp/editor.js.map +1 -1
- package/dist/cdp/elementRefs.d.ts +15 -0
- package/dist/cdp/elementRefs.d.ts.map +1 -0
- package/dist/cdp/elementRefs.js +30 -0
- package/dist/cdp/elementRefs.js.map +1 -0
- package/dist/cdp/locate.d.ts +7 -0
- package/dist/cdp/locate.d.ts.map +1 -0
- package/dist/cdp/locate.js +68 -0
- package/dist/cdp/locate.js.map +1 -0
- package/dist/cdp/mouse.d.ts +8 -7
- package/dist/cdp/mouse.d.ts.map +1 -1
- package/dist/cdp/mouse.js +42 -49
- package/dist/cdp/mouse.js.map +1 -1
- package/dist/cdp/networkBody.d.ts +19 -0
- package/dist/cdp/networkBody.d.ts.map +1 -0
- package/dist/cdp/networkBody.js +70 -0
- package/dist/cdp/networkBody.js.map +1 -0
- package/dist/cdp/networkCapture.d.ts +4 -0
- package/dist/cdp/networkCapture.d.ts.map +1 -1
- package/dist/cdp/networkCapture.js +307 -35
- package/dist/cdp/networkCapture.js.map +1 -1
- package/dist/cdp/pageIndicator.d.ts +1 -1
- package/dist/cdp/pageIndicator.d.ts.map +1 -1
- package/dist/cdp/redaction.d.ts +4 -0
- package/dist/cdp/redaction.d.ts.map +1 -1
- package/dist/cdp/redaction.js +37 -1
- package/dist/cdp/redaction.js.map +1 -1
- package/dist/cdp/screenshot.d.ts +1 -0
- package/dist/cdp/screenshot.d.ts.map +1 -1
- package/dist/cdp/screenshot.js +66 -15
- package/dist/cdp/screenshot.js.map +1 -1
- package/dist/cdp/storage.d.ts +8 -0
- package/dist/cdp/storage.d.ts.map +1 -0
- package/dist/cdp/storage.js +70 -0
- package/dist/cdp/storage.js.map +1 -0
- package/dist/cdp/watcher.d.ts +4 -21
- package/dist/cdp/watcher.d.ts.map +1 -1
- package/dist/cdp/watcher.js +7 -279
- package/dist/cdp/watcher.js.map +1 -1
- package/dist/cdp/watcherEvents.d.ts +18 -0
- package/dist/cdp/watcherEvents.d.ts.map +1 -0
- package/dist/cdp/watcherEvents.js +169 -0
- package/dist/cdp/watcherEvents.js.map +1 -0
- package/dist/cdp/watcherTargets.d.ts +18 -0
- package/dist/cdp/watcherTargets.d.ts.map +1 -0
- package/dist/cdp/watcherTargets.js +95 -0
- package/dist/cdp/watcherTargets.js.map +1 -0
- package/dist/dialogs/DialogTracker.d.ts +13 -0
- package/dist/dialogs/DialogTracker.d.ts.map +1 -0
- package/dist/dialogs/DialogTracker.js +22 -0
- package/dist/dialogs/DialogTracker.js.map +1 -0
- package/dist/events.d.ts +7 -2
- package/dist/events.d.ts.map +1 -1
- package/dist/http/router.d.ts.map +1 -1
- package/dist/http/router.js +3 -77
- package/dist/http/router.js.map +1 -1
- package/dist/http/routes/authCookies.d.ts +11 -0
- package/dist/http/routes/authCookies.d.ts.map +1 -0
- package/dist/http/routes/authCookies.js +142 -0
- package/dist/http/routes/authCookies.js.map +1 -0
- package/dist/http/routes/domSelectorRoute.d.ts +8 -0
- package/dist/http/routes/domSelectorRoute.d.ts.map +1 -1
- package/dist/http/routes/domSelectorRoute.js +28 -3
- package/dist/http/routes/domSelectorRoute.js.map +1 -1
- package/dist/http/routes/getAuthState.d.ts +3 -0
- package/dist/http/routes/getAuthState.d.ts.map +1 -0
- package/dist/http/routes/getAuthState.js +24 -0
- package/dist/http/routes/getAuthState.js.map +1 -0
- package/dist/http/routes/getDialog.d.ts +3 -0
- package/dist/http/routes/getDialog.d.ts.map +1 -0
- package/dist/http/routes/getDialog.js +11 -0
- package/dist/http/routes/getDialog.js.map +1 -0
- package/dist/http/routes/getNet.d.ts.map +1 -1
- package/dist/http/routes/getNet.js +14 -8
- package/dist/http/routes/getNet.js.map +1 -1
- package/dist/http/routes/getNetRequest.d.ts +3 -0
- package/dist/http/routes/getNetRequest.d.ts.map +1 -0
- package/dist/http/routes/getNetRequest.js +23 -0
- package/dist/http/routes/getNetRequest.js.map +1 -0
- package/dist/http/routes/getNetRequestBody.d.ts +3 -0
- package/dist/http/routes/getNetRequestBody.d.ts.map +1 -0
- package/dist/http/routes/getNetRequestBody.js +80 -0
- package/dist/http/routes/getNetRequestBody.js.map +1 -0
- package/dist/http/routes/getNetRequests.d.ts +3 -0
- package/dist/http/routes/getNetRequests.d.ts.map +1 -0
- package/dist/http/routes/getNetRequests.js +23 -0
- package/dist/http/routes/getNetRequests.js.map +1 -0
- package/dist/http/routes/getNetTail.d.ts.map +1 -1
- package/dist/http/routes/getNetTail.js +44 -9
- package/dist/http/routes/getNetTail.js.map +1 -1
- package/dist/http/routes/getStatus.js +1 -0
- package/dist/http/routes/getStatus.js.map +1 -1
- package/dist/http/routes/index.d.ts +9 -0
- package/dist/http/routes/index.d.ts.map +1 -0
- package/dist/http/routes/index.js +105 -0
- package/dist/http/routes/index.js.map +1 -0
- package/dist/http/routes/netFilters.d.ts +29 -0
- package/dist/http/routes/netFilters.d.ts.map +1 -0
- package/dist/http/routes/netFilters.js +160 -0
- package/dist/http/routes/netFilters.js.map +1 -0
- package/dist/http/routes/netRequestLookup.d.ts +14 -0
- package/dist/http/routes/netRequestLookup.d.ts.map +1 -0
- package/dist/http/routes/netRequestLookup.js +39 -0
- package/dist/http/routes/netRequestLookup.js.map +1 -0
- package/dist/http/routes/postAuthStateLoad.d.ts +3 -0
- package/dist/http/routes/postAuthStateLoad.d.ts.map +1 -0
- package/dist/http/routes/postAuthStateLoad.js +37 -0
- package/dist/http/routes/postAuthStateLoad.js.map +1 -0
- package/dist/http/routes/postDialog.d.ts +3 -0
- package/dist/http/routes/postDialog.d.ts.map +1 -0
- package/dist/http/routes/postDialog.js +39 -0
- package/dist/http/routes/postDialog.js.map +1 -0
- package/dist/http/routes/postDomClick.d.ts.map +1 -1
- package/dist/http/routes/postDomClick.js +39 -27
- package/dist/http/routes/postDomClick.js.map +1 -1
- package/dist/http/routes/postDomFill.d.ts.map +1 -1
- package/dist/http/routes/postDomFill.js +23 -27
- package/dist/http/routes/postDomFill.js.map +1 -1
- package/dist/http/routes/postDomFocus.d.ts.map +1 -1
- package/dist/http/routes/postDomFocus.js +22 -9
- package/dist/http/routes/postDomFocus.js.map +1 -1
- package/dist/http/routes/postDomHover.d.ts.map +1 -1
- package/dist/http/routes/postDomHover.js +22 -9
- package/dist/http/routes/postDomHover.js.map +1 -1
- package/dist/http/routes/postDomInfo.d.ts.map +1 -1
- package/dist/http/routes/postDomInfo.js +7 -3
- package/dist/http/routes/postDomInfo.js.map +1 -1
- package/dist/http/routes/postDomScroll.d.ts.map +1 -1
- package/dist/http/routes/postDomScroll.js +3 -8
- package/dist/http/routes/postDomScroll.js.map +1 -1
- package/dist/http/routes/postDomScrollTo.d.ts.map +1 -1
- package/dist/http/routes/postDomScrollTo.js +3 -8
- package/dist/http/routes/postDomScrollTo.js.map +1 -1
- package/dist/http/routes/postDomSetFile.d.ts.map +1 -1
- package/dist/http/routes/postDomSetFile.js +9 -23
- package/dist/http/routes/postDomSetFile.js.map +1 -1
- package/dist/http/routes/postLocate.d.ts +5 -0
- package/dist/http/routes/postLocate.d.ts.map +1 -0
- package/dist/http/routes/postLocate.js +67 -0
- package/dist/http/routes/postLocate.js.map +1 -0
- package/dist/http/routes/postNetClear.d.ts +3 -0
- package/dist/http/routes/postNetClear.d.ts.map +1 -0
- package/dist/http/routes/postNetClear.js +14 -0
- package/dist/http/routes/postNetClear.js.map +1 -0
- package/dist/http/routes/postSnapshot.d.ts.map +1 -1
- package/dist/http/routes/postSnapshot.js +1 -1
- package/dist/http/routes/postSnapshot.js.map +1 -1
- package/dist/http/routes/postStorageLocal.d.ts +1 -2
- package/dist/http/routes/postStorageLocal.d.ts.map +1 -1
- package/dist/http/routes/postStorageLocal.js +2 -30
- package/dist/http/routes/postStorageLocal.js.map +1 -1
- package/dist/http/routes/postStorageSession.d.ts +2 -0
- package/dist/http/routes/postStorageSession.d.ts.map +1 -0
- package/dist/http/routes/postStorageSession.js +3 -0
- package/dist/http/routes/postStorageSession.js.map +1 -0
- package/dist/http/routes/storage.d.ts +5 -0
- package/dist/http/routes/storage.d.ts.map +1 -0
- package/dist/http/routes/storage.js +43 -0
- package/dist/http/routes/storage.js.map +1 -0
- package/dist/http/server.d.ts +27 -3
- package/dist/http/server.d.ts.map +1 -1
- package/dist/http/server.js.map +1 -1
- package/dist/native-messaging/session-manager.d.ts +14 -1
- package/dist/native-messaging/session-manager.d.ts.map +1 -1
- package/dist/native-messaging/session-manager.js +56 -23
- package/dist/native-messaging/session-manager.js.map +1 -1
- package/dist/native-messaging/types.d.ts +28 -2
- package/dist/native-messaging/types.d.ts.map +1 -1
- package/dist/net/filtering.d.ts +32 -0
- package/dist/net/filtering.d.ts.map +1 -0
- package/dist/net/filtering.js +144 -0
- package/dist/net/filtering.js.map +1 -0
- package/dist/runtime/watcherInject.d.ts +15 -0
- package/dist/runtime/watcherInject.d.ts.map +1 -0
- package/dist/runtime/watcherInject.js +21 -0
- package/dist/runtime/watcherInject.js.map +1 -0
- package/dist/runtime/watcherServices.d.ts +32 -0
- package/dist/runtime/watcherServices.d.ts.map +1 -0
- package/dist/runtime/watcherServices.js +68 -0
- package/dist/runtime/watcherServices.js.map +1 -0
- package/dist/runtime/watcherSetup.d.ts +35 -0
- package/dist/runtime/watcherSetup.d.ts.map +1 -0
- package/dist/runtime/watcherSetup.js +96 -0
- package/dist/runtime/watcherSetup.js.map +1 -0
- package/dist/sources/cdp-source.d.ts.map +1 -1
- package/dist/sources/cdp-source.js +13 -0
- package/dist/sources/cdp-source.js.map +1 -1
- package/dist/sources/extension-frame-runtime.d.ts +11 -0
- package/dist/sources/extension-frame-runtime.d.ts.map +1 -0
- package/dist/sources/extension-frame-runtime.js +150 -0
- package/dist/sources/extension-frame-runtime.js.map +1 -0
- package/dist/sources/extension-frame-state.d.ts +3 -2
- package/dist/sources/extension-frame-state.d.ts.map +1 -1
- package/dist/sources/extension-frame-state.js +29 -8
- package/dist/sources/extension-frame-state.js.map +1 -1
- package/dist/sources/extension-session-events.d.ts.map +1 -1
- package/dist/sources/extension-session-events.js +4 -2
- package/dist/sources/extension-session-events.js.map +1 -1
- package/dist/sources/extension-source.d.ts.map +1 -1
- package/dist/sources/extension-source.js +134 -140
- package/dist/sources/extension-source.js.map +1 -1
- package/dist/sources/types.d.ts +15 -1
- package/dist/sources/types.d.ts.map +1 -1
- package/dist/startWatcherRuntime.d.ts.map +1 -1
- package/dist/startWatcherRuntime.js +78 -177
- package/dist/startWatcherRuntime.js.map +1 -1
- package/package.json +1 -1
- package/dist/cdp/storageLocal.d.ts +0 -8
- package/dist/cdp/storageLocal.d.ts.map +0 -1
- package/dist/cdp/storageLocal.js +0 -70
- package/dist/cdp/storageLocal.js.map +0 -1
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Maintains watcher-local element refs (`e1`, `e2`, ...) keyed by backend DOM node id.
|
|
3
|
+
*
|
|
4
|
+
* Backend ids stay stable for the lifetime of a document, which makes them a good anchor for
|
|
5
|
+
* agent-friendly refs without coupling commands to brittle selectors.
|
|
6
|
+
*/
|
|
7
|
+
export declare class ElementRefRegistry {
|
|
8
|
+
private nextRefNumber;
|
|
9
|
+
private readonly refByBackendNodeId;
|
|
10
|
+
private readonly backendNodeIdByRef;
|
|
11
|
+
getOrCreate(backendNodeId: number): string;
|
|
12
|
+
resolve(ref: string): number | null;
|
|
13
|
+
reset(): void;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=elementRefs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"elementRefs.d.ts","sourceRoot":"","sources":["../../src/cdp/elementRefs.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,qBAAa,kBAAkB;IAC9B,OAAO,CAAC,aAAa,CAAI;IACzB,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAA4B;IAC/D,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAA4B;IAE/D,WAAW,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM;IAY1C,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAInC,KAAK,IAAI,IAAI;CAKb"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Maintains watcher-local element refs (`e1`, `e2`, ...) keyed by backend DOM node id.
|
|
3
|
+
*
|
|
4
|
+
* Backend ids stay stable for the lifetime of a document, which makes them a good anchor for
|
|
5
|
+
* agent-friendly refs without coupling commands to brittle selectors.
|
|
6
|
+
*/
|
|
7
|
+
export class ElementRefRegistry {
|
|
8
|
+
nextRefNumber = 1;
|
|
9
|
+
refByBackendNodeId = new Map();
|
|
10
|
+
backendNodeIdByRef = new Map();
|
|
11
|
+
getOrCreate(backendNodeId) {
|
|
12
|
+
const existing = this.refByBackendNodeId.get(backendNodeId);
|
|
13
|
+
if (existing) {
|
|
14
|
+
return existing;
|
|
15
|
+
}
|
|
16
|
+
const ref = `e${this.nextRefNumber++}`;
|
|
17
|
+
this.refByBackendNodeId.set(backendNodeId, ref);
|
|
18
|
+
this.backendNodeIdByRef.set(ref, backendNodeId);
|
|
19
|
+
return ref;
|
|
20
|
+
}
|
|
21
|
+
resolve(ref) {
|
|
22
|
+
return this.backendNodeIdByRef.get(ref) ?? null;
|
|
23
|
+
}
|
|
24
|
+
reset() {
|
|
25
|
+
this.nextRefNumber = 1;
|
|
26
|
+
this.refByBackendNodeId.clear();
|
|
27
|
+
this.backendNodeIdByRef.clear();
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=elementRefs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"elementRefs.js","sourceRoot":"","sources":["../../src/cdp/elementRefs.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,OAAO,kBAAkB;IACtB,aAAa,GAAG,CAAC,CAAA;IACR,kBAAkB,GAAG,IAAI,GAAG,EAAkB,CAAA;IAC9C,kBAAkB,GAAG,IAAI,GAAG,EAAkB,CAAA;IAE/D,WAAW,CAAC,aAAqB;QAChC,MAAM,QAAQ,GAAG,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,aAAa,CAAC,CAAA;QAC3D,IAAI,QAAQ,EAAE,CAAC;YACd,OAAO,QAAQ,CAAA;QAChB,CAAC;QAED,MAAM,GAAG,GAAG,IAAI,IAAI,CAAC,aAAa,EAAE,EAAE,CAAA;QACtC,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,aAAa,EAAE,GAAG,CAAC,CAAA;QAC/C,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,GAAG,EAAE,aAAa,CAAC,CAAA;QAC/C,OAAO,GAAG,CAAA;IACX,CAAC;IAED,OAAO,CAAC,GAAW;QAClB,OAAO,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,CAAA;IAChD,CAAC;IAED,KAAK;QACJ,IAAI,CAAC,aAAa,GAAG,CAAC,CAAA;QACtB,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,CAAA;QAC/B,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,CAAA;IAChC,CAAC;CACD"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { LocateLabelRequest, LocateResponse, LocateRoleRequest, LocateTextRequest } from '@vforsh/argus-core';
|
|
2
|
+
import type { CdpSessionHandle } from './connection.js';
|
|
3
|
+
import type { ElementRefRegistry } from './elementRefs.js';
|
|
4
|
+
export declare const locateByRole: (session: CdpSessionHandle, elementRefs: ElementRefRegistry, request: LocateRoleRequest) => Promise<LocateResponse>;
|
|
5
|
+
export declare const locateByText: (session: CdpSessionHandle, elementRefs: ElementRefRegistry, request: LocateTextRequest) => Promise<LocateResponse>;
|
|
6
|
+
export declare const locateByLabel: (session: CdpSessionHandle, elementRefs: ElementRefRegistry, request: LocateLabelRequest) => Promise<LocateResponse>;
|
|
7
|
+
//# sourceMappingURL=locate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"locate.d.ts","sourceRoot":"","sources":["../../src/cdp/locate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAkB,cAAc,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AAClI,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AACvD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AAM1D,eAAO,MAAM,YAAY,GACxB,SAAS,gBAAgB,EACzB,aAAa,kBAAkB,EAC/B,SAAS,iBAAiB,KACxB,OAAO,CAAC,cAAc,CAYxB,CAAA;AAED,eAAO,MAAM,YAAY,GACxB,SAAS,gBAAgB,EACzB,aAAa,kBAAkB,EAC/B,SAAS,iBAAiB,KACxB,OAAO,CAAC,cAAc,CAOxB,CAAA;AAED,eAAO,MAAM,aAAa,GACzB,SAAS,gBAAgB,EACzB,aAAa,kBAAkB,EAC/B,SAAS,kBAAkB,KACzB,OAAO,CAAC,cAAc,CASxB,CAAA"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { listAccessibleElements } from './accessibility.js';
|
|
2
|
+
import { describeNodeByBackendId, toAttributesRecord } from './dom/selector.js';
|
|
3
|
+
const LABELABLE_ROLES = new Set(['button', 'checkbox', 'combobox', 'listbox', 'radio', 'searchbox', 'slider', 'spinbutton', 'switch', 'textbox']);
|
|
4
|
+
export const locateByRole = async (session, elementRefs, request) => {
|
|
5
|
+
const matches = (await listAccessibleElements(session, elementRefs)).filter((element) => {
|
|
6
|
+
if (normalizeText(element.role) !== normalizeText(request.role)) {
|
|
7
|
+
return false;
|
|
8
|
+
}
|
|
9
|
+
if (!request.name) {
|
|
10
|
+
return true;
|
|
11
|
+
}
|
|
12
|
+
return matchesText(element.name, request.name, request.exact ?? false);
|
|
13
|
+
});
|
|
14
|
+
return buildLocateResponse(session, request.all ?? false, matches);
|
|
15
|
+
};
|
|
16
|
+
export const locateByText = async (session, elementRefs, request) => {
|
|
17
|
+
const matches = (await listAccessibleElements(session, elementRefs)).filter((element) => matchesText(element.name, request.text, request.exact ?? false) || matchesText(element.value ?? '', request.text, request.exact ?? false));
|
|
18
|
+
return buildLocateResponse(session, request.all ?? false, matches);
|
|
19
|
+
};
|
|
20
|
+
export const locateByLabel = async (session, elementRefs, request) => {
|
|
21
|
+
const matches = (await listAccessibleElements(session, elementRefs)).filter((element) => {
|
|
22
|
+
if (!LABELABLE_ROLES.has(element.role)) {
|
|
23
|
+
return false;
|
|
24
|
+
}
|
|
25
|
+
return matchesText(element.name, request.label, request.exact ?? false);
|
|
26
|
+
});
|
|
27
|
+
return buildLocateResponse(session, request.all ?? false, matches);
|
|
28
|
+
};
|
|
29
|
+
const buildLocateResponse = async (session, all, matches) => {
|
|
30
|
+
const selected = all ? matches : matches.slice(0, 1);
|
|
31
|
+
const elements = await Promise.all(selected.map((element) => toLocatedElement(session, element)));
|
|
32
|
+
return {
|
|
33
|
+
ok: true,
|
|
34
|
+
matches: matches.length,
|
|
35
|
+
elements,
|
|
36
|
+
};
|
|
37
|
+
};
|
|
38
|
+
const toLocatedElement = async (session, element) => {
|
|
39
|
+
const node = await describeNodeByBackendId(session, element.backendNodeId);
|
|
40
|
+
const attributes = node?.attributes ? toAttributesRecord(node.attributes) : undefined;
|
|
41
|
+
return {
|
|
42
|
+
ref: element.ref,
|
|
43
|
+
role: element.role,
|
|
44
|
+
name: element.name,
|
|
45
|
+
value: element.value,
|
|
46
|
+
tag: node ? (node.localName ?? node.nodeName).toLowerCase() : undefined,
|
|
47
|
+
attributes: attributes && Object.keys(attributes).length > 0 ? filterLocatorAttributes(attributes) : undefined,
|
|
48
|
+
};
|
|
49
|
+
};
|
|
50
|
+
const filterLocatorAttributes = (attributes) => {
|
|
51
|
+
const filtered = {};
|
|
52
|
+
for (const key of ['id', 'class', 'name', 'type', 'data-testid']) {
|
|
53
|
+
if (attributes[key]) {
|
|
54
|
+
filtered[key] = attributes[key];
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return filtered;
|
|
58
|
+
};
|
|
59
|
+
const normalizeText = (value) => value.trim().replace(/\s+/g, ' ').toLowerCase();
|
|
60
|
+
const matchesText = (actual, expected, exact) => {
|
|
61
|
+
const left = normalizeText(actual);
|
|
62
|
+
const right = normalizeText(expected);
|
|
63
|
+
if (!left || !right) {
|
|
64
|
+
return false;
|
|
65
|
+
}
|
|
66
|
+
return exact ? left === right : left.includes(right);
|
|
67
|
+
};
|
|
68
|
+
//# sourceMappingURL=locate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"locate.js","sourceRoot":"","sources":["../../src/cdp/locate.ts"],"names":[],"mappings":"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"}
|
package/dist/cdp/mouse.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { CdpSessionHandle } from './connection.js';
|
|
2
|
+
import { type DomNodeHandle } from './dom/selector.js';
|
|
2
3
|
type SelectorMatchResult = {
|
|
3
4
|
allNodeIds: number[];
|
|
4
5
|
nodeIds: number[];
|
|
@@ -8,12 +9,12 @@ type Point = {
|
|
|
8
9
|
y: number;
|
|
9
10
|
};
|
|
10
11
|
export declare const resolveDomSelectorMatches: (session: CdpSessionHandle, selector: string, all: boolean, text?: string) => Promise<SelectorMatchResult>;
|
|
11
|
-
export declare const hoverDomNodes: (session: CdpSessionHandle,
|
|
12
|
+
export declare const hoverDomNodes: (session: CdpSessionHandle, handles: DomNodeHandle[]) => Promise<void>;
|
|
12
13
|
export declare const clickAtPoint: (session: CdpSessionHandle, x: number, y: number, button?: "left" | "middle" | "right") => Promise<void>;
|
|
13
|
-
export declare const resolveNodeTopLeft: (session: CdpSessionHandle,
|
|
14
|
-
export declare const clickDomNodes: (session: CdpSessionHandle,
|
|
15
|
-
export declare const focusDomNodes: (session: CdpSessionHandle,
|
|
16
|
-
export declare const scrollIntoView: (session: CdpSessionHandle,
|
|
14
|
+
export declare const resolveNodeTopLeft: (session: CdpSessionHandle, handle: DomNodeHandle) => Promise<Point>;
|
|
15
|
+
export declare const clickDomNodes: (session: CdpSessionHandle, handles: DomNodeHandle[], button?: "left" | "middle" | "right") => Promise<void>;
|
|
16
|
+
export declare const focusDomNodes: (session: CdpSessionHandle, handles: DomNodeHandle[]) => Promise<void>;
|
|
17
|
+
export declare const scrollIntoView: (session: CdpSessionHandle, handle: DomNodeHandle) => Promise<void>;
|
|
17
18
|
type ScrollPosition = {
|
|
18
19
|
scrollX: number;
|
|
19
20
|
scrollY: number;
|
|
@@ -32,7 +33,7 @@ type ScrollMode = {
|
|
|
32
33
|
* Scroll matched DOM elements. If mode has to/by, scrolls within the element container.
|
|
33
34
|
* Otherwise scrolls each element into view.
|
|
34
35
|
*/
|
|
35
|
-
export declare const scrollDomNodes: (session: CdpSessionHandle,
|
|
36
|
+
export declare const scrollDomNodes: (session: CdpSessionHandle, handles: DomNodeHandle[], mode: ScrollMode) => Promise<ScrollPosition>;
|
|
36
37
|
/** Scroll the page viewport to an absolute or relative position. */
|
|
37
38
|
export declare const scrollViewport: (session: CdpSessionHandle, mode: ScrollMode) => Promise<ScrollPosition>;
|
|
38
39
|
/** Dispatch a mouseWheel event at the given viewport coordinates. */
|
|
@@ -41,7 +42,7 @@ export declare const emulateScroll: (session: CdpSessionHandle, x: number, y: nu
|
|
|
41
42
|
y: number;
|
|
42
43
|
}) => Promise<void>;
|
|
43
44
|
/** Emulate touch scroll gestures on resolved DOM nodes (scrolls at each element's center). */
|
|
44
|
-
export declare const emulateScrollOnNodes: (session: CdpSessionHandle,
|
|
45
|
+
export declare const emulateScrollOnNodes: (session: CdpSessionHandle, handles: DomNodeHandle[], delta: {
|
|
45
46
|
x: number;
|
|
46
47
|
y: number;
|
|
47
48
|
}) => Promise<void>;
|
package/dist/cdp/mouse.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mouse.d.ts","sourceRoot":"","sources":["../../src/cdp/mouse.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;
|
|
1
|
+
{"version":3,"file":"mouse.d.ts","sourceRoot":"","sources":["../../src/cdp/mouse.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AACvD,OAAO,EAA+C,KAAK,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAEnG,KAAK,mBAAmB,GAAG;IAC1B,UAAU,EAAE,MAAM,EAAE,CAAA;IACpB,OAAO,EAAE,MAAM,EAAE,CAAA;CACjB,CAAA;AAED,KAAK,KAAK,GAAG;IACZ,CAAC,EAAE,MAAM,CAAA;IACT,CAAC,EAAE,MAAM,CAAA;CACT,CAAA;AAED,eAAO,MAAM,yBAAyB,GACrC,SAAS,gBAAgB,EACzB,UAAU,MAAM,EAChB,KAAK,OAAO,EACZ,OAAO,MAAM,KACX,OAAO,CAAC,mBAAmB,CAE7B,CAAA;AAED,eAAO,MAAM,aAAa,GAAU,SAAS,gBAAgB,EAAE,SAAS,aAAa,EAAE,KAAG,OAAO,CAAC,IAAI,CAUrG,CAAA;AAKD,eAAO,MAAM,YAAY,GAAU,SAAS,gBAAgB,EAAE,GAAG,MAAM,EAAE,GAAG,MAAM,EAAE,SAAQ,MAAM,GAAG,QAAQ,GAAG,OAAgB,KAAG,OAAO,CAAC,IAAI,CAK9I,CAAA;AAED,eAAO,MAAM,kBAAkB,GAAU,SAAS,gBAAgB,EAAE,QAAQ,aAAa,KAAG,OAAO,CAAC,KAAK,CAMxG,CAAA;AAED,eAAO,MAAM,aAAa,GACzB,SAAS,gBAAgB,EACzB,SAAS,aAAa,EAAE,EACxB,SAAQ,MAAM,GAAG,QAAQ,GAAG,OAAgB,KAC1C,OAAO,CAAC,IAAI,CAad,CAAA;AAED,eAAO,MAAM,aAAa,GAAU,SAAS,gBAAgB,EAAE,SAAS,aAAa,EAAE,KAAG,OAAO,CAAC,IAAI,CASrG,CAAA;AAED,eAAO,MAAM,cAAc,GAAU,SAAS,gBAAgB,EAAE,QAAQ,aAAa,KAAG,OAAO,CAAC,IAAI,CAqBnG,CAAA;AAED,KAAK,cAAc,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAA;AAE1D,KAAK,UAAU,GAAG;IAAE,EAAE,CAAC,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAAC,EAAE,CAAC,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,CAAA;AAElF;;;GAGG;AACH,eAAO,MAAM,cAAc,GAAU,SAAS,gBAAgB,EAAE,SAAS,aAAa,EAAE,EAAE,MAAM,UAAU,KAAG,OAAO,CAAC,cAAc,CAclI,CAAA;AAED,oEAAoE;AACpE,eAAO,MAAM,cAAc,GAAU,SAAS,gBAAgB,EAAE,MAAM,UAAU,KAAG,OAAO,CAAC,cAAc,CAUxG,CAAA;AA0ED,qEAAqE;AACrE,eAAO,MAAM,aAAa,GAAU,SAAS,gBAAgB,EAAE,GAAG,MAAM,EAAE,GAAG,MAAM,EAAE,OAAO;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,KAAG,OAAO,CAAC,IAAI,CAQlI,CAAA;AAED,8FAA8F;AAC9F,eAAO,MAAM,oBAAoB,GAAU,SAAS,gBAAgB,EAAE,SAAS,aAAa,EAAE,EAAE,OAAO;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,KAAG,OAAO,CAAC,IAAI,CAU7I,CAAA"}
|
package/dist/cdp/mouse.js
CHANGED
|
@@ -1,23 +1,14 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { getDomRootId } from './dom/selector.js';
|
|
1
|
+
import { resolveSelectorTargets, toDomNodeDescriptor } from './dom/selector.js';
|
|
3
2
|
export const resolveDomSelectorMatches = async (session, selector, all, text) => {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
if (text != null) {
|
|
9
|
-
allNodeIds = await filterNodesByText(session, allNodeIds, text);
|
|
10
|
-
}
|
|
11
|
-
const nodeIds = all ? allNodeIds : allNodeIds.slice(0, 1);
|
|
12
|
-
return { allNodeIds, nodeIds };
|
|
13
|
-
};
|
|
14
|
-
export const hoverDomNodes = async (session, nodeIds) => {
|
|
15
|
-
if (nodeIds.length === 0) {
|
|
3
|
+
return resolveSelectorTargets(session, { selector, all, text });
|
|
4
|
+
};
|
|
5
|
+
export const hoverDomNodes = async (session, handles) => {
|
|
6
|
+
if (handles.length === 0) {
|
|
16
7
|
return;
|
|
17
8
|
}
|
|
18
|
-
for (const
|
|
19
|
-
await scrollIntoView(session,
|
|
20
|
-
const point = await resolveNodeCenter(session,
|
|
9
|
+
for (const handle of handles) {
|
|
10
|
+
await scrollIntoView(session, handle);
|
|
11
|
+
const point = await resolveNodeCenter(session, handle);
|
|
21
12
|
await dispatchMouseEvent(session, { type: 'mouseMoved', x: point.x, y: point.y });
|
|
22
13
|
}
|
|
23
14
|
};
|
|
@@ -29,44 +20,45 @@ export const clickAtPoint = async (session, x, y, button = 'left') => {
|
|
|
29
20
|
await dispatchMouseEvent(session, { type: 'mousePressed', x, y, button, buttons: mask, clickCount: 1 });
|
|
30
21
|
await dispatchMouseEvent(session, { type: 'mouseReleased', x, y, button, buttons: 0, clickCount: 1 });
|
|
31
22
|
};
|
|
32
|
-
export const resolveNodeTopLeft = async (session,
|
|
33
|
-
const { x, y, w, h } = await resolveNodeRect(session,
|
|
23
|
+
export const resolveNodeTopLeft = async (session, handle) => {
|
|
24
|
+
const { x, y, w, h } = await resolveNodeRect(session, handle);
|
|
34
25
|
if (w <= 0 || h <= 0) {
|
|
35
26
|
throw createNotInteractableError('Element has zero area');
|
|
36
27
|
}
|
|
37
28
|
return { x, y };
|
|
38
29
|
};
|
|
39
|
-
export const clickDomNodes = async (session,
|
|
40
|
-
if (
|
|
30
|
+
export const clickDomNodes = async (session, handles, button = 'left') => {
|
|
31
|
+
if (handles.length === 0) {
|
|
41
32
|
return;
|
|
42
33
|
}
|
|
43
34
|
const mask = BUTTON_MASK[button] ?? 1;
|
|
44
|
-
for (const
|
|
45
|
-
await scrollIntoView(session,
|
|
46
|
-
const point = await resolveNodeCenter(session,
|
|
35
|
+
for (const handle of handles) {
|
|
36
|
+
await scrollIntoView(session, handle);
|
|
37
|
+
const point = await resolveNodeCenter(session, handle);
|
|
47
38
|
await dispatchMouseEvent(session, { type: 'mouseMoved', x: point.x, y: point.y });
|
|
48
39
|
await dispatchMouseEvent(session, { type: 'mousePressed', x: point.x, y: point.y, button, buttons: mask, clickCount: 1 });
|
|
49
40
|
await dispatchMouseEvent(session, { type: 'mouseReleased', x: point.x, y: point.y, button, buttons: 0, clickCount: 1 });
|
|
50
41
|
}
|
|
51
42
|
};
|
|
52
|
-
export const focusDomNodes = async (session,
|
|
53
|
-
if (
|
|
43
|
+
export const focusDomNodes = async (session, handles) => {
|
|
44
|
+
if (handles.length === 0) {
|
|
54
45
|
return;
|
|
55
46
|
}
|
|
56
|
-
for (const
|
|
57
|
-
await scrollIntoView(session,
|
|
58
|
-
await session.sendAndWait('DOM.focus',
|
|
47
|
+
for (const handle of handles) {
|
|
48
|
+
await scrollIntoView(session, handle);
|
|
49
|
+
await session.sendAndWait('DOM.focus', toDomNodeDescriptor(handle));
|
|
59
50
|
}
|
|
60
51
|
};
|
|
61
|
-
export const scrollIntoView = async (session,
|
|
52
|
+
export const scrollIntoView = async (session, handle) => {
|
|
53
|
+
const descriptor = toDomNodeDescriptor(handle);
|
|
62
54
|
try {
|
|
63
|
-
await session.sendAndWait('DOM.scrollIntoViewIfNeeded',
|
|
55
|
+
await session.sendAndWait('DOM.scrollIntoViewIfNeeded', descriptor);
|
|
64
56
|
return;
|
|
65
57
|
}
|
|
66
58
|
catch {
|
|
67
59
|
// Fallback to runtime evaluation if CDP cannot scroll directly.
|
|
68
60
|
}
|
|
69
|
-
const resolved = (await session.sendAndWait('DOM.resolveNode',
|
|
61
|
+
const resolved = (await session.sendAndWait('DOM.resolveNode', descriptor));
|
|
70
62
|
const objectId = resolved.object?.objectId;
|
|
71
63
|
if (!objectId) {
|
|
72
64
|
throw createNotInteractableError('Unable to resolve node for scrolling');
|
|
@@ -82,16 +74,16 @@ export const scrollIntoView = async (session, nodeId) => {
|
|
|
82
74
|
* Scroll matched DOM elements. If mode has to/by, scrolls within the element container.
|
|
83
75
|
* Otherwise scrolls each element into view.
|
|
84
76
|
*/
|
|
85
|
-
export const scrollDomNodes = async (session,
|
|
86
|
-
if (
|
|
77
|
+
export const scrollDomNodes = async (session, handles, mode) => {
|
|
78
|
+
if (handles.length === 0) {
|
|
87
79
|
return getViewportScroll(session);
|
|
88
80
|
}
|
|
89
|
-
for (const
|
|
81
|
+
for (const handle of handles) {
|
|
90
82
|
if (mode.to || mode.by) {
|
|
91
|
-
await scrollElementContainer(session,
|
|
83
|
+
await scrollElementContainer(session, handle, mode);
|
|
92
84
|
}
|
|
93
85
|
else {
|
|
94
|
-
await scrollIntoView(session,
|
|
86
|
+
await scrollIntoView(session, handle);
|
|
95
87
|
}
|
|
96
88
|
}
|
|
97
89
|
return getViewportScroll(session);
|
|
@@ -106,8 +98,8 @@ export const scrollViewport = async (session, mode) => {
|
|
|
106
98
|
});
|
|
107
99
|
return getViewportScroll(session);
|
|
108
100
|
};
|
|
109
|
-
const scrollElementContainer = async (session,
|
|
110
|
-
const resolved = (await session.sendAndWait('DOM.resolveNode',
|
|
101
|
+
const scrollElementContainer = async (session, handle, mode) => {
|
|
102
|
+
const resolved = (await session.sendAndWait('DOM.resolveNode', toDomNodeDescriptor(handle)));
|
|
111
103
|
const objectId = resolved.object?.objectId;
|
|
112
104
|
if (!objectId) {
|
|
113
105
|
throw createNotInteractableError('Unable to resolve node for scrolling');
|
|
@@ -128,16 +120,17 @@ const getViewportScroll = async (session) => {
|
|
|
128
120
|
const parsed = result.result?.value ? JSON.parse(result.result.value) : { scrollX: 0, scrollY: 0 };
|
|
129
121
|
return { scrollX: parsed.scrollX, scrollY: parsed.scrollY };
|
|
130
122
|
};
|
|
131
|
-
const resolveNodeCenter = async (session,
|
|
132
|
-
const { x, y, w, h } = await resolveNodeRect(session,
|
|
123
|
+
const resolveNodeCenter = async (session, handle) => {
|
|
124
|
+
const { x, y, w, h } = await resolveNodeRect(session, handle);
|
|
133
125
|
if (w <= 0 || h <= 0) {
|
|
134
126
|
throw createNotInteractableError('Element has zero area');
|
|
135
127
|
}
|
|
136
128
|
return { x: x + w / 2, y: y + h / 2 };
|
|
137
129
|
};
|
|
138
130
|
/** Uses getBoundingClientRect() to get viewport-relative coordinates (no scroll-offset ambiguity). */
|
|
139
|
-
const resolveNodeRect = async (session,
|
|
140
|
-
const
|
|
131
|
+
const resolveNodeRect = async (session, handle) => {
|
|
132
|
+
const descriptor = toDomNodeDescriptor(handle);
|
|
133
|
+
const boxModel = (await session.sendAndWait('DOM.getBoxModel', descriptor).catch(() => null));
|
|
141
134
|
const quad = boxModel?.model?.border ?? boxModel?.model?.content;
|
|
142
135
|
if (quad && quad.length >= 8) {
|
|
143
136
|
const xs = [quad[0], quad[2], quad[4], quad[6]];
|
|
@@ -148,7 +141,7 @@ const resolveNodeRect = async (session, nodeId) => {
|
|
|
148
141
|
const maxY = Math.max(...ys);
|
|
149
142
|
return { x: minX, y: minY, w: maxX - minX, h: maxY - minY };
|
|
150
143
|
}
|
|
151
|
-
const resolved = (await session.sendAndWait('DOM.resolveNode',
|
|
144
|
+
const resolved = (await session.sendAndWait('DOM.resolveNode', descriptor));
|
|
152
145
|
const objectId = resolved.object?.objectId;
|
|
153
146
|
if (!objectId) {
|
|
154
147
|
throw createNotInteractableError('Unable to resolve node');
|
|
@@ -175,13 +168,13 @@ export const emulateScroll = async (session, x, y, delta) => {
|
|
|
175
168
|
});
|
|
176
169
|
};
|
|
177
170
|
/** Emulate touch scroll gestures on resolved DOM nodes (scrolls at each element's center). */
|
|
178
|
-
export const emulateScrollOnNodes = async (session,
|
|
179
|
-
if (
|
|
171
|
+
export const emulateScrollOnNodes = async (session, handles, delta) => {
|
|
172
|
+
if (handles.length === 0) {
|
|
180
173
|
return;
|
|
181
174
|
}
|
|
182
|
-
for (const
|
|
183
|
-
await scrollIntoView(session,
|
|
184
|
-
const point = await resolveNodeCenter(session,
|
|
175
|
+
for (const handle of handles) {
|
|
176
|
+
await scrollIntoView(session, handle);
|
|
177
|
+
const point = await resolveNodeCenter(session, handle);
|
|
185
178
|
await emulateScroll(session, point.x, point.y, delta);
|
|
186
179
|
}
|
|
187
180
|
};
|
package/dist/cdp/mouse.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mouse.js","sourceRoot":"","sources":["../../src/cdp/mouse.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"mouse.js","sourceRoot":"","sources":["../../src/cdp/mouse.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { NetRequestBodyPart, NetworkRequestDetail } from '@vforsh/argus-core';
|
|
2
|
+
import type { CdpSessionHandle } from './connection.js';
|
|
3
|
+
export type ReadNetworkBodyResult = {
|
|
4
|
+
body: string;
|
|
5
|
+
base64Encoded: boolean;
|
|
6
|
+
mimeType: string | null;
|
|
7
|
+
};
|
|
8
|
+
/**
|
|
9
|
+
* Read one captured network body lazily from CDP.
|
|
10
|
+
* The buffer keeps only availability metadata so large payloads do not accumulate in memory.
|
|
11
|
+
*/
|
|
12
|
+
export declare const readNetworkBody: (options: {
|
|
13
|
+
session: CdpSessionHandle;
|
|
14
|
+
request: Pick<NetworkRequestDetail, "requestId" | "mimeType" | "requestHeaders">;
|
|
15
|
+
sessionId?: string | null;
|
|
16
|
+
part: NetRequestBodyPart;
|
|
17
|
+
}) => Promise<ReadNetworkBodyResult>;
|
|
18
|
+
export declare const normalizeNetBodyError: (error: unknown, part: NetRequestBodyPart) => Error;
|
|
19
|
+
//# sourceMappingURL=networkBody.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"networkBody.d.ts","sourceRoot":"","sources":["../../src/cdp/networkBody.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAA;AAClF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAEvD,MAAM,MAAM,qBAAqB,GAAG;IACnC,IAAI,EAAE,MAAM,CAAA;IACZ,aAAa,EAAE,OAAO,CAAA;IACtB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;CACvB,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,eAAe,GAAU,SAAS;IAC9C,OAAO,EAAE,gBAAgB,CAAA;IACzB,OAAO,EAAE,IAAI,CAAC,oBAAoB,EAAE,WAAW,GAAG,UAAU,GAAG,gBAAgB,CAAC,CAAA;IAChF,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,IAAI,EAAE,kBAAkB,CAAA;CACxB,KAAG,OAAO,CAAC,qBAAqB,CAmChC,CAAA;AAED,eAAO,MAAM,qBAAqB,GAAI,OAAO,OAAO,EAAE,MAAM,kBAAkB,KAAG,KAOhF,CAAA"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Read one captured network body lazily from CDP.
|
|
3
|
+
* The buffer keeps only availability metadata so large payloads do not accumulate in memory.
|
|
4
|
+
*/
|
|
5
|
+
export const readNetworkBody = async (options) => {
|
|
6
|
+
const commandOptions = options.sessionId ? { timeoutMs: 5_000, sessionId: options.sessionId } : { timeoutMs: 5_000 };
|
|
7
|
+
if (options.part === 'request') {
|
|
8
|
+
const result = (await options.session.sendAndWait('Network.getRequestPostData', { requestId: options.request.requestId }, commandOptions));
|
|
9
|
+
if (typeof result.postData !== 'string') {
|
|
10
|
+
throw createNetBodyError('Request body not available for this request', 'body_not_available');
|
|
11
|
+
}
|
|
12
|
+
return {
|
|
13
|
+
body: result.postData,
|
|
14
|
+
base64Encoded: false,
|
|
15
|
+
mimeType: pickRequestMimeType(options.request.requestHeaders),
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
const result = (await options.session.sendAndWait('Network.getResponseBody', { requestId: options.request.requestId }, commandOptions));
|
|
19
|
+
if (typeof result.body !== 'string') {
|
|
20
|
+
throw createNetBodyError('Response body not available for this request', 'body_not_available');
|
|
21
|
+
}
|
|
22
|
+
return {
|
|
23
|
+
body: result.body,
|
|
24
|
+
base64Encoded: result.base64Encoded === true,
|
|
25
|
+
mimeType: options.request.mimeType ?? null,
|
|
26
|
+
};
|
|
27
|
+
};
|
|
28
|
+
export const normalizeNetBodyError = (error, part) => {
|
|
29
|
+
const message = unwrapNetBodyErrorMessage(error instanceof Error ? error.message : String(error));
|
|
30
|
+
if (isMissingNetBodyError(message)) {
|
|
31
|
+
return createNetBodyError(`${capitalizePart(part)} body not available for this request`, 'body_not_available');
|
|
32
|
+
}
|
|
33
|
+
return error instanceof Error ? error : new Error(message);
|
|
34
|
+
};
|
|
35
|
+
const pickRequestMimeType = (headers) => {
|
|
36
|
+
if (!headers) {
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
for (const [name, value] of Object.entries(headers)) {
|
|
40
|
+
if (name.toLowerCase() !== 'content-type') {
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
const trimmed = value.trim();
|
|
44
|
+
return trimmed || null;
|
|
45
|
+
}
|
|
46
|
+
return null;
|
|
47
|
+
};
|
|
48
|
+
const isMissingNetBodyError = (message) => /no post data available/i.test(message) ||
|
|
49
|
+
/no data found for resource/i.test(message) ||
|
|
50
|
+
/no resource .* found/i.test(message) ||
|
|
51
|
+
/no resource with given id(?:entifier)? .* found/i.test(message);
|
|
52
|
+
const unwrapNetBodyErrorMessage = (message) => {
|
|
53
|
+
if (!message.startsWith('{')) {
|
|
54
|
+
return message;
|
|
55
|
+
}
|
|
56
|
+
try {
|
|
57
|
+
const parsed = JSON.parse(message);
|
|
58
|
+
return typeof parsed.message === 'string' ? parsed.message : message;
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
return message;
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
const createNetBodyError = (message, code) => {
|
|
65
|
+
const error = new Error(message);
|
|
66
|
+
error.code = code;
|
|
67
|
+
return error;
|
|
68
|
+
};
|
|
69
|
+
const capitalizePart = (part) => `${part.slice(0, 1).toUpperCase()}${part.slice(1)}`;
|
|
70
|
+
//# sourceMappingURL=networkBody.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"networkBody.js","sourceRoot":"","sources":["../../src/cdp/networkBody.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,6 +4,10 @@ export type NetworkCaptureHandle = {
|
|
|
4
4
|
onAttached: () => Promise<void>;
|
|
5
5
|
onDetached: () => void;
|
|
6
6
|
};
|
|
7
|
+
/**
|
|
8
|
+
* Subscribe to CDP network events and keep a compact summary plus a richer request record.
|
|
9
|
+
* `/net` stays cheap, while `/net/request` can expose the high-signal debugging fields.
|
|
10
|
+
*/
|
|
7
11
|
export declare const createNetworkCapture: (options: {
|
|
8
12
|
session: CdpSessionHandle;
|
|
9
13
|
buffer: NetBuffer;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"networkCapture.d.ts","sourceRoot":"","sources":["../../src/cdp/networkCapture.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"networkCapture.d.ts","sourceRoot":"","sources":["../../src/cdp/networkCapture.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAA;AACvD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAwDvD,MAAM,MAAM,oBAAoB,GAAG;IAClC,UAAU,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IAC/B,UAAU,EAAE,MAAM,IAAI,CAAA;CACtB,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,oBAAoB,GAAI,SAAS;IAAE,OAAO,EAAE,gBAAgB,CAAC;IAAC,MAAM,EAAE,SAAS,CAAA;CAAE,KAAG,oBAwPhG,CAAA"}
|