From 23db4d1cf1da6f62c30c0b11df306b3e21ede7ff Mon Sep 17 00:00:00 2001 From: shrimbly Date: Tue, 24 Feb 2026 13:11:51 +1300 Subject: [PATCH] fix: add 10s timeout to getImageDimensions to prevent promise hang - Add resolved flag and safeResolve guard pattern from getVideoDimensions - Add cleanup() function to null event handlers and clear src - Add 10-second timeout that resolves with null if neither onload nor onerror fires - Prevents promise from hanging indefinitely on corrupt/malformed images --- src/utils/nodeDimensions.ts | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/src/utils/nodeDimensions.ts b/src/utils/nodeDimensions.ts index c28a355e..89f6b3aa 100644 --- a/src/utils/nodeDimensions.ts +++ b/src/utils/nodeDimensions.ts @@ -16,20 +16,29 @@ export function getImageDimensions( return; } + let resolved = false; const img = new Image(); const cleanup = () => { img.onload = null; img.onerror = null; img.src = ""; }; - img.onload = () => { - const dims = { width: img.naturalWidth, height: img.naturalHeight }; + const safeResolve = (value: { width: number; height: number } | null) => { + if (resolved) return; + resolved = true; cleanup(); - resolve(dims); + resolve(value); + }; + + const timeout = setTimeout(() => safeResolve(null), 10_000); + + img.onload = () => { + clearTimeout(timeout); + safeResolve({ width: img.naturalWidth, height: img.naturalHeight }); }; img.onerror = () => { - cleanup(); - resolve(null); + clearTimeout(timeout); + safeResolve(null); }; img.src = base64DataUrl; });