Skip to content

feat(cdp): implement session-level network capture for CDPPage#815

Merged
jackwener merged 5 commits intomainfrom
feat/cdp-network-capture
Apr 5, 2026
Merged

feat(cdp): implement session-level network capture for CDPPage#815
jackwener merged 5 commits intomainfrom
feat/cdp-network-capture

Conversation

@jackwener
Copy link
Copy Markdown
Owner

Summary

  • Implement startNetworkCapture() and readNetworkCapture() on CDPPage using CDP Network domain events
  • Update explore.ts to prefer session capture over Performance API networkRequests()
  • This is the first transport implementation of "session-level passive capture" — daemon mode already has it, now direct CDP mode does too

Details

CDPPage changes (src/browser/cdp.ts):

  • startNetworkCapture(pattern?): enables Network.enable, listens to Network.requestWillBeSent and Network.responseReceived, collects full request/response data including response bodies via Network.getResponseBody
  • readNetworkCapture(): returns collected entries and clears buffer

Explore changes (src/explore.ts):

  • Calls page.startNetworkCapture?.() before page.goto() to capture initial page load requests
  • Prefers page.readNetworkCapture() over page.networkRequests() when available, with fallback

Why this matters

explore previously used networkRequests() which only returns URL+timing from the Performance API. With session capture, explore gets method/status/headers/body — enabling much better API endpoint discovery and candidate generation.

Test plan

  • TypeScript compilation passes
  • Existing CDP tests pass
  • Manual test: opencli explore <url> with CDP endpoint should capture full network data

Part of #810 (PR A)

Implements startNetworkCapture() and readNetworkCapture() on CDPPage using
CDP Network domain events. Updates explore.ts to prefer session capture
over Performance API networkRequests().

Closes part of #810
- Move getResponseBody call from responseReceived to loadingFinished,
  matching the extension's implementation pattern
- Use extension-compatible entry shape (responseStatus, responseContentType,
  responsePreview) instead of custom field names
- Remove unreliable 100ms sleep hack in readNetworkCapture()
- Align with extension/src/cdp.ts:419-437 for consistency
readNetworkCapture() must clear the buffer after reading, matching the
daemon Page's read-and-drain behavior. Without this, repeated reads
would return stale entries.
…orkCapture

Track all pending getResponseBody promises and await them in
readNetworkCapture() before draining the buffer. This ensures
explore/diagnostic consumers always get entries with responsePreview
populated, not empty shells where the body fetch hasn't resolved yet.
parseNetworkRequests now maps both shapes:
- Legacy: status, contentType, responseBody
- Capture (extension/CDP): responseStatus, responseContentType, responsePreview

Also clears _pendingBodyFetches on startNetworkCapture reset.
@jackwener jackwener merged commit 1d46c5f into main Apr 5, 2026
11 of 13 checks passed
@jackwener jackwener deleted the feat/cdp-network-capture branch April 5, 2026 14:50
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant