From cbc04189f9a87de347ebdcb3ab587ba9ad099a11 Mon Sep 17 00:00:00 2001 From: chreman Date: Mon, 11 May 2026 11:34:40 +0200 Subject: [PATCH] browser declared outside try; await browser.close() in finally;explicit timeout on goto; a script-level watchdog so even a hung puppeteer can't live forever --- server/services/getChartSVG.js | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/server/services/getChartSVG.js b/server/services/getChartSVG.js index c382beef6..f1a0d2712 100644 --- a/server/services/getChartSVG.js +++ b/server/services/getChartSVG.js @@ -1,4 +1,5 @@ module.paths.push(process.argv[4]); +const { time } = require('console'); const puppeteer = require('puppeteer'); function timeout(ms) { @@ -6,8 +7,13 @@ function timeout(ms) { }; (async() => { + let browser; + const watchdog = setTimeout(() => { + console.error('getChartSVG watchdog fired, exiting'); + process.exit(1); + }, 60000); // 60 seconds try { - const browser = await puppeteer.launch({ + browser = await puppeteer.launch({ headless: true, args: ['--no-sandbox', '--disable-setuid-sandbox'], executablePath: process.argv[5] @@ -16,12 +22,17 @@ function timeout(ms) { const page = await browser.newPage(); await timeout(1000) await page.setViewport({width: 1920, height: 1080}) - await page.goto(process.argv[2], {waitUntil: 'networkidle2'}); + await page.goto(process.argv[2], {waitUntil: 'networkidle2', timeout: 60000}); await timeout(1000) await page.screenshot({path: process.argv[3], clip: { x: 0, y: 0, width: 1150, height: 1080 }}); - browser.close(); } catch (error) { console.error('Error occurred while generating chart SVG:', error); + process.exitCode = 1; + } finally { + if (browser) { + try { await browser.close(); } catch (_) {} + } + clearTimeout(watchdog); } })();