hangwin--mcp-chrome
54 行
1.7 KiB
TypeScript
54 行
1.7 KiB
TypeScript
// Simple in-memory screenshot context manager per tab
|
|
// Used to scale coordinates from screenshot space to viewport space
|
|
|
|
export interface ScreenshotContext {
|
|
// Final screenshot dimensions (in CSS pixels after any scaling)
|
|
screenshotWidth: number;
|
|
screenshotHeight: number;
|
|
// Viewport dimensions (CSS pixels)
|
|
viewportWidth: number;
|
|
viewportHeight: number;
|
|
// Device pixel ratio at capture time (optional, for reference)
|
|
devicePixelRatio?: number;
|
|
// Hostname of the page when the screenshot was taken (used for domain safety checks)
|
|
hostname?: string;
|
|
// Timestamp
|
|
timestamp: number;
|
|
}
|
|
|
|
const TTL_MS = 5 * 60 * 1000; // 5 minutes
|
|
|
|
const contexts = new Map<number, ScreenshotContext>();
|
|
|
|
export const screenshotContextManager = {
|
|
setContext(tabId: number, ctx: Omit<ScreenshotContext, 'timestamp'>) {
|
|
contexts.set(tabId, { ...ctx, timestamp: Date.now() });
|
|
},
|
|
getContext(tabId: number): ScreenshotContext | undefined {
|
|
const ctx = contexts.get(tabId);
|
|
if (!ctx) return undefined;
|
|
if (Date.now() - ctx.timestamp > TTL_MS) {
|
|
contexts.delete(tabId);
|
|
return undefined;
|
|
}
|
|
return ctx;
|
|
},
|
|
clear(tabId: number) {
|
|
contexts.delete(tabId);
|
|
},
|
|
};
|
|
|
|
// Scale screenshot-space coordinates (x,y) to viewport CSS pixels
|
|
export function scaleCoordinates(
|
|
x: number,
|
|
y: number,
|
|
ctx: ScreenshotContext,
|
|
): { x: number; y: number } {
|
|
if (!ctx.screenshotWidth || !ctx.screenshotHeight || !ctx.viewportWidth || !ctx.viewportHeight) {
|
|
return { x, y };
|
|
}
|
|
const sx = (x / ctx.screenshotWidth) * ctx.viewportWidth;
|
|
const sy = (y / ctx.screenshotHeight) * ctx.viewportHeight;
|
|
return { x: Math.round(sx), y: Math.round(sy) };
|
|
}
|