refactor: share browser route helpers

This commit is contained in:
Peter Steinberger 2026-03-14 00:28:34 +00:00
parent 614844c9fe
commit 97aa786dd5
2 changed files with 71 additions and 53 deletions

View File

@ -122,6 +122,27 @@ async function renderChromeMcpLabels(params: {
return { labels, skipped };
}
async function saveNormalizedScreenshotResponse(params: {
res: BrowserResponse;
buffer: Buffer;
type: "png" | "jpeg";
targetId: string;
url: string;
}) {
const normalized = await normalizeBrowserScreenshot(params.buffer, {
maxSide: DEFAULT_BROWSER_SCREENSHOT_MAX_SIDE,
maxBytes: DEFAULT_BROWSER_SCREENSHOT_MAX_BYTES,
});
await saveBrowserMediaResponse({
res: params.res,
buffer: normalized.buffer,
contentType: normalized.contentType ?? `image/${params.type}`,
maxBytes: DEFAULT_BROWSER_SCREENSHOT_MAX_BYTES,
targetId: params.targetId,
url: params.url,
});
}
async function saveBrowserMediaResponse(params: {
res: BrowserResponse;
buffer: Buffer;
@ -305,15 +326,10 @@ export function registerBrowserAgentSnapshotRoutes(
fullPage,
format: type,
});
const normalized = await normalizeBrowserScreenshot(buffer, {
maxSide: DEFAULT_BROWSER_SCREENSHOT_MAX_SIDE,
maxBytes: DEFAULT_BROWSER_SCREENSHOT_MAX_BYTES,
});
await saveBrowserMediaResponse({
await saveNormalizedScreenshotResponse({
res,
buffer: normalized.buffer,
contentType: normalized.contentType ?? `image/${type}`,
maxBytes: DEFAULT_BROWSER_SCREENSHOT_MAX_BYTES,
buffer,
type,
targetId: tab.targetId,
url: tab.url,
});
@ -350,15 +366,10 @@ export function registerBrowserAgentSnapshotRoutes(
});
}
const normalized = await normalizeBrowserScreenshot(buffer, {
maxSide: DEFAULT_BROWSER_SCREENSHOT_MAX_SIDE,
maxBytes: DEFAULT_BROWSER_SCREENSHOT_MAX_BYTES,
});
await saveBrowserMediaResponse({
await saveNormalizedScreenshotResponse({
res,
buffer: normalized.buffer,
contentType: normalized.contentType ?? `image/${type}`,
maxBytes: DEFAULT_BROWSER_SCREENSHOT_MAX_BYTES,
buffer,
type,
targetId: tab.targetId,
url: tab.url,
});

View File

@ -7,6 +7,14 @@ import { resolveProfileContext } from "./agent.shared.js";
import type { BrowserRequest, BrowserResponse, BrowserRouteRegistrar } from "./types.js";
import { getProfileContext, jsonError, toStringOrEmpty } from "./utils.js";
function handleBrowserRouteError(res: BrowserResponse, err: unknown) {
const mapped = toBrowserErrorResponse(err);
if (mapped) {
return jsonError(res, mapped.status, mapped.message);
}
jsonError(res, 500, String(err));
}
async function withBasicProfileRoute(params: {
req: BrowserRequest;
res: BrowserResponse;
@ -20,11 +28,21 @@ async function withBasicProfileRoute(params: {
try {
await params.run(profileCtx);
} catch (err) {
const mapped = toBrowserErrorResponse(err);
if (mapped) {
return jsonError(params.res, mapped.status, mapped.message);
}
jsonError(params.res, 500, String(err));
return handleBrowserRouteError(params.res, err);
}
}
async function withProfilesServiceMutation(params: {
res: BrowserResponse;
ctx: BrowserRouteContext;
run: (service: ReturnType<typeof createBrowserProfilesService>) => Promise<unknown>;
}) {
try {
const service = createBrowserProfilesService(params.ctx);
const result = await params.run(service);
params.res.json(result);
} catch (err) {
return handleBrowserRouteError(params.res, err);
}
}
@ -166,27 +184,22 @@ export function registerBrowserBasicRoutes(app: BrowserRouteRegistrar, ctx: Brow
return jsonError(res, 400, "name is required");
}
try {
const service = createBrowserProfilesService(ctx);
const result = await service.createProfile({
name,
color: color || undefined,
cdpUrl: cdpUrl || undefined,
driver:
driver === "extension"
? "extension"
: driver === "existing-session"
? "existing-session"
: undefined,
});
res.json(result);
} catch (err) {
const mapped = toBrowserErrorResponse(err);
if (mapped) {
return jsonError(res, mapped.status, mapped.message);
}
jsonError(res, 500, String(err));
}
await withProfilesServiceMutation({
res,
ctx,
run: async (service) =>
await service.createProfile({
name,
color: color || undefined,
cdpUrl: cdpUrl || undefined,
driver:
driver === "extension"
? "extension"
: driver === "existing-session"
? "existing-session"
: undefined,
}),
});
});
// Delete a profile
@ -196,16 +209,10 @@ export function registerBrowserBasicRoutes(app: BrowserRouteRegistrar, ctx: Brow
return jsonError(res, 400, "profile name is required");
}
try {
const service = createBrowserProfilesService(ctx);
const result = await service.deleteProfile(name);
res.json(result);
} catch (err) {
const mapped = toBrowserErrorResponse(err);
if (mapped) {
return jsonError(res, mapped.status, mapped.message);
}
jsonError(res, 500, String(err));
}
await withProfilesServiceMutation({
res,
ctx,
run: async (service) => await service.deleteProfile(name),
});
});
}