From bfde72eed8831fcc164db3e8267d18fa044abc4b Mon Sep 17 00:00:00 2001 From: Dave Richer Date: Thu, 5 Dec 2024 12:29:11 -0800 Subject: [PATCH] feature/IO-3052-Skia-Canvas-Handler: Fix missing checks Signed-off-by: Dave Richer --- server/render/canvas-handler.js | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/server/render/canvas-handler.js b/server/render/canvas-handler.js index 0da0cc9a2..5b810dd73 100644 --- a/server/render/canvas-handler.js +++ b/server/render/canvas-handler.js @@ -77,21 +77,36 @@ const processCanvasRequest = async (req, res, isSkia = false) => { const configuration = getChartConfiguration(keys, values, override); + // Placeholders to allow fine control over GAC + let canvas = null; + let ctx = null; + let chart = null; + let chartImage = null; + try { - const canvas = isSkia ? new Canvas(width, height) : createCanvas(width, height); - const ctx = canvas.getContext("2d"); + // Create the canvas + canvas = isSkia ? new Canvas(width, height) : createCanvas(width, height); + ctx = canvas.getContext("2d"); // Render the chart - const chart = new Chart(ctx, configuration); + chart = new Chart(ctx, configuration); // Generate and send the image - const chartImage = isSkia ? (await canvas.toBuffer("image/png")).toString("base64") : canvas.toDataURL(); + chartImage = isSkia ? (await canvas.toBuffer("image/png")).toString("base64") : canvas.toDataURL(); - chart.destroy(); res.status(200).send(isSkia ? `data:image/png;base64,${chartImage}` : chartImage); } catch (error) { + // Log the error and send the response logger.log("canvas-error", "error", "jsr", null, { error: error.message }); res.status(500).send("Failed to generate canvas."); + } finally { + // Cleanup resources + if (chart) { + chart.destroy(); + } + ctx = null; // Explicitly nullify for garbage collection + canvas = null; // Explicitly nullify for garbage collection + chartImage = null; } };