From 16b7c0be4d413c620c0d6afea46fde3c361b747d Mon Sep 17 00:00:00 2001 From: Miguel Angel Simon Sierra Date: Sat, 18 Jul 2026 22:23:03 +0200 Subject: [PATCH] perf(cli): abort stale studio thumbnails --- packages/cli/src/server/studioServer.ts | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/packages/cli/src/server/studioServer.ts b/packages/cli/src/server/studioServer.ts index 57a4a444b5..629edf9c9a 100644 --- a/packages/cli/src/server/studioServer.ts +++ b/packages/cli/src/server/studioServer.ts @@ -483,9 +483,21 @@ export function createStudioServer(options: StudioServerOptions): StudioServer { return null; } let page: import("puppeteer-core").Page | null = null; + const closePage = () => void page?.close().catch(() => {}); + opts.signal.addEventListener("abort", closePage, { once: true }); try { page = await browser.newPage(); - await page.setViewport({ width: opts.width || 1920, height: opts.height || 1080 }); + if (opts.signal.aborted) return null; + const width = opts.width || 1920; + const height = opts.height || 1080; + await page.setViewport({ + width, + height, + deviceScaleFactor: Math.max( + 0.1, + Math.min(1, opts.outputWidth / width, opts.outputHeight / height), + ), + }); await page.goto(opts.previewUrl, { waitUntil: "domcontentloaded", timeout: 10000 }); await page .waitForFunction( @@ -543,12 +555,15 @@ export function createStudioServer(options: StudioServerOptions): StudioServer { )) as Buffer; return screenshot; } catch (err) { - console.warn( - "[Studio] Thumbnail generation failed:", - err instanceof Error ? err.message : err, - ); + if (!opts.signal.aborted) { + console.warn( + "[Studio] Thumbnail generation failed:", + err instanceof Error ? err.message : err, + ); + } return null; } finally { + opts.signal.removeEventListener("abort", closePage); await page?.close().catch(() => {}); } },