diff options
Diffstat (limited to 'src/domains/isolated-tab.ts')
| -rw-r--r-- | src/domains/isolated-tab.ts | 27 |
1 files changed, 13 insertions, 14 deletions
diff --git a/src/domains/isolated-tab.ts b/src/domains/isolated-tab.ts index ba00756..103c9cc 100644 --- a/src/domains/isolated-tab.ts +++ b/src/domains/isolated-tab.ts @@ -4,6 +4,7 @@ import { safeJs } from "../util/js-template"; import { ensureHarnessWindow, openHarnessTab } from "../cdp/target-factory"; import { evaluateJson } from "../cdp/evaluate"; import type { ToolErr } from "../util/tool"; +import { cdpCallBrowser, cdpCallOnTarget, cdpErrToToolErr, evalJs } from "./cdp-call"; export type IsolatedTab = { readonly targetId: string; @@ -13,32 +14,30 @@ export type IsolatedTab = { const EVAL_TIMEOUT_MS = 15_000; const READY_POLL_INTERVAL_MS = 50; -const toToolErr = (message: string, kind: ToolErr["kind"] = "cdp_error"): ToolErr => ({ kind, message }); - export const openIsolatedTab = async (client: BrowserClient): Promise<Result<IsolatedTab, ToolErr>> => { // Routed through the target factory so an isolated tab lands in the pinned profile, not another profile's cookies. const window = await ensureHarnessWindow(client); - if (!window.success) return err(toToolErr(window.error.message)); + if (!window.success) return err(cdpErrToToolErr(window.error, "Target.createTarget")); let targetId: string; if (window.data.freshlyCreated) { targetId = window.data.targetId; } else { const opened = await openHarnessTab(client, window.data.targetId); - if (!opened.success) return err(toToolErr(opened.error.message)); + if (!opened.success) return err(cdpErrToToolErr(opened.error, "Target.createTarget")); targetId = opened.data; } - const attached = await client.session().callBrowser("Target.attachToTarget", { targetId, flatten: true }); + const attached = await cdpCallBrowser(client, "Target.attachToTarget", { targetId, flatten: true }); if (!attached.success) { await client.closeTab(targetId); - return err(toToolErr(attached.error.message)); + return attached; } const { sessionId } = attached.data; - const enabled = await client.session().callOnTarget("Page.enable", {}, sessionId); + const enabled = await cdpCallOnTarget(client, "Page.enable", {}, sessionId); if (!enabled.success) { await client.closeTab(targetId); - return err(toToolErr(enabled.error.message)); + return enabled; } return ok({ targetId, sessionId }); }; @@ -48,10 +47,10 @@ export const navigateIsolatedTab = async ( tab: IsolatedTab, url: string, ): Promise<Result<void, ToolErr>> => { - const nav = await client.session().callOnTarget("Page.navigate", { url }, tab.sessionId, { + const nav = await cdpCallOnTarget(client, "Page.navigate", { url }, tab.sessionId, { timeoutMs: EVAL_TIMEOUT_MS, }); - if (!nav.success) return err(toToolErr(nav.error.message)); + if (!nav.success) return nav; return ok(undefined); }; @@ -63,12 +62,12 @@ export const waitForIsolatedLoad = async ( ): Promise<Result<void, ToolErr>> => { const start = Date.now(); while (Date.now() - start < timeoutMs) { - if (signal?.aborted) return err(toToolErr("aborted", "internal")); - const r = await client.evaluateJs(safeJs`document.readyState`, tab.sessionId); + if (signal?.aborted) return err({ kind: "internal", message: "aborted" }); + const r = await evalJs(client, safeJs`document.readyState`, tab.sessionId); if (r.success && r.data === "complete") return ok(undefined); await new Promise((res) => setTimeout(res, READY_POLL_INTERVAL_MS)); } - return err(toToolErr(`page did not finish loading in ${Math.round(timeoutMs / 1000)}s`, "timeout")); + return err({ kind: "timeout", message: `page did not finish loading in ${Math.round(timeoutMs / 1000)}s` }); }; export const isJsonText = (v: unknown): v is string => typeof v === "string"; @@ -83,7 +82,7 @@ export const evalInIsolatedTab = async <T>( sessionId: tab.sessionId, timeoutMs: EVAL_TIMEOUT_MS, }); - if (!r.success) return err(toToolErr(r.error.message, r.error.kind === "timeout" ? "timeout" : "cdp_error")); + if (!r.success) return err(cdpErrToToolErr(r.error, "Runtime.evaluate")); return ok(r.data); }; |
