aboutsummaryrefslogtreecommitdiff
path: root/src/domains/isolated-tab.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/domains/isolated-tab.ts')
-rw-r--r--src/domains/isolated-tab.ts27
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);
};