Skip to content

Commit da6cba7

Browse files
refactor: use context agnostic write to file
1 parent 8ed0821 commit da6cba7

File tree

3 files changed

+37
-10
lines changed

3 files changed

+37
-10
lines changed

src/McpContext.ts

Lines changed: 32 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,20 @@ function getNetworkMultiplierFromString(condition: string | null): number {
5858
return 1;
5959
}
6060

61+
function getExtensionFromMimeType(
62+
mimeType: 'image/png' | 'image/jpeg' | 'image/webp',
63+
) {
64+
switch (mimeType) {
65+
case 'image/png':
66+
return 'png';
67+
case 'image/jpeg':
68+
return 'jpeg';
69+
case 'image/webp':
70+
return 'webp';
71+
}
72+
throw new Error(`No mapping for Mime type ${mimeType}.`);
73+
}
74+
6175
export class McpContext implements Context {
6276
browser: Browser;
6377
logger: Debugger;
@@ -346,20 +360,31 @@ export class McpContext implements Context {
346360
const dir = await fs.mkdtemp(
347361
path.join(os.tmpdir(), 'chrome-devtools-mcp-'),
348362
);
349-
const ext =
350-
mimeType === 'image/png'
351-
? 'png'
352-
: mimeType === 'image/jpeg'
353-
? 'jpg'
354-
: 'webp';
355-
const filename = path.join(dir, `screenshot.${ext}`);
363+
364+
const filename = path.join(
365+
dir,
366+
`screenshot.${getExtensionFromMimeType(mimeType)}`,
367+
);
356368
await fs.writeFile(filename, data);
357369
return {filename};
358370
} catch (err) {
359371
this.logger(err);
360372
throw new Error('Could not save a screenshot to a file');
361373
}
362374
}
375+
async saveFile(
376+
data: Uint8Array<ArrayBufferLike>,
377+
filename: string,
378+
): Promise<{filename: string}> {
379+
try {
380+
const filePath = path.resolve(filename);
381+
await fs.writeFile(filePath, data);
382+
return {filename};
383+
} catch (err) {
384+
this.logger(err);
385+
throw new Error('Could not save a screenshot to a file');
386+
}
387+
}
363388

364389
storeTraceRecording(result: TraceResult): void {
365390
this.#traceResults.push(result);

src/tools/ToolDefinition.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,10 @@ export type Context = Readonly<{
7474
data: Uint8Array<ArrayBufferLike>,
7575
mimeType: 'image/png' | 'image/jpeg' | 'image/webp',
7676
): Promise<{filename: string}>;
77+
saveFile(
78+
data: Uint8Array<ArrayBufferLike>,
79+
filename: string,
80+
): Promise<{filename: string}>;
7781
waitForEventsAfterAction(action: () => Promise<unknown>): Promise<void>;
7882
}>;
7983

src/tools/screenshot.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,6 @@
44
* SPDX-License-Identifier: Apache-2.0
55
*/
66

7-
import {writeFile} from 'node:fs/promises';
8-
97
import type {ElementHandle, Page} from 'puppeteer-core';
108
import z from 'zod';
119

@@ -85,7 +83,7 @@ export const screenshot = defineTool({
8583
}
8684

8785
if (request.params.filePath) {
88-
await writeFile(request.params.filePath, screenshot);
86+
await context.saveFile(screenshot, request.params.filePath);
8987
response.appendResponseLine(
9088
`Saved screenshot to ${request.params.filePath}.`,
9189
);

0 commit comments

Comments
 (0)