diff options
| author | amankumarsingh77 <amankumarsingh7702@gmail.com> | 2026-07-27 01:07:05 +0530 |
|---|---|---|
| committer | Aman Kumar <145339995+amankumarsingh77@users.noreply.github.com> | 2026-08-02 19:12:46 +0530 |
| commit | d1b57558ff40ef6d6b19ee7eff0a44f7f4a585f6 (patch) | |
| tree | 9172819196434737d1ecb63e22a2ad102b97ebd9 /src/cdp | |
| parent | 9f2ef1cf87251ce12f6b6432c48c6e7d2017b6b5 (diff) | |
test(cdp): cover call/callOnTarget/callBrowser through a stub transport; collapse decode into one path
session-call-test.ts previously only exercised decodeResult (Task 3's
surface, and mostly duplicating commands-test.ts) — call, callOnTarget,
callBrowser, and the session's internal req helper had zero coverage.
Add a stub CdpTransport (no socket, no browser) and test: a valid payload
decodes to typed data, a garbage payload becomes invalid_response without
throwing, a transport-level error passes through with its original kind
(not relabeled), call/callOnTarget/callBrowser route the session id
correctly, and opts.timeoutMs reaches the transport only when provided.
Also collapse the four near-identical transport-then-decode bodies (req,
call, callOnTarget, callBrowser) into one: the three public methods now
delegate to req, which is the sole place unknown ends for every CDP call
the session makes, internal or public. Public signatures are unchanged.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Diffstat (limited to 'src/cdp')
| -rw-r--r-- | src/cdp/session.ts | 45 |
1 files changed, 18 insertions, 27 deletions
diff --git a/src/cdp/session.ts b/src/cdp/session.ts index 96b980f..dd5a9b3 100644 --- a/src/cdp/session.ts +++ b/src/cdp/session.ts @@ -180,16 +180,22 @@ export const createCdpSession = ( } }; - // Internal helper: the session's own CDP calls (attach/switch bookkeeping) - // go through the same decode-on-call path as the public call/callOnTarget/ - // callBrowser — the session is where `unknown` ends, including for its own - // requests, not just the ones exposed to callers. + // The one place `unknown` ends for every CDP call this session makes — its + // own internal bookkeeping calls (attach/switch) and the public + // call/callOnTarget/callBrowser all funnel through here. A single + // transport-then-decode implementation means a future change (tracing, + // error wrapping, the short-circuit on failure) lands in one place, and a + // new internal call site can't forget to decode. const req = async <M extends CdpMethod>( method: M, - params: ParamsOf<M>, + params: ParamsOf<M> | undefined, sid: string | null, + opts: { timeoutMs?: number } = {}, ): Promise<Result<ResultOf<M>, CdpError>> => { - const raw = await transport.request(method, { ...params }, { sessionId: sid }); + const raw = await transport.request(method, { ...(params ?? {}) }, { + sessionId: sid, + ...(opts.timeoutMs !== undefined ? { timeoutMs: opts.timeoutMs } : {}), + }); if (!raw.success) return raw; return decodeResult(method, raw.data); }; @@ -358,29 +364,14 @@ export const createCdpSession = ( const tab = targetId ? tabs.get(targetId) : undefined; return tab?.refSig ?? new Map(); }, - async call(method, params, opts = {}) { - const raw = await transport.request(method, { ...(params ?? {}) }, { - sessionId, - ...(opts.timeoutMs !== undefined ? { timeoutMs: opts.timeoutMs } : {}), - }); - if (!raw.success) return raw; - return decodeResult(method, raw.data); + call(method, params, opts) { + return req(method, params, sessionId, opts); }, - async callOnTarget(method, params, sid, opts = {}) { - const raw = await transport.request(method, { ...params }, { - sessionId: sid, - ...(opts.timeoutMs !== undefined ? { timeoutMs: opts.timeoutMs } : {}), - }); - if (!raw.success) return raw; - return decodeResult(method, raw.data); + callOnTarget(method, params, sid, opts) { + return req(method, params, sid, opts); }, - async callBrowser(method, params, opts = {}) { - const raw = await transport.request(method, { ...(params ?? {}) }, { - sessionId: null, - ...(opts.timeoutMs !== undefined ? { timeoutMs: opts.timeoutMs } : {}), - }); - if (!raw.success) return raw; - return decodeResult(method, raw.data); + callBrowser(method, params, opts) { + return req(method, params, null, opts); }, takeDialog() { const tab = targetId ? tabs.get(targetId) : undefined; |
