diff --git a/src/utils/nodeDimensions.ts b/src/utils/nodeDimensions.ts index b24163df..c28a355e 100644 --- a/src/utils/nodeDimensions.ts +++ b/src/utils/nodeDimensions.ts @@ -17,10 +17,18 @@ export function getImageDimensions( } const img = new Image(); + const cleanup = () => { + img.onload = null; + img.onerror = null; + img.src = ""; + }; img.onload = () => { - resolve({ width: img.naturalWidth, height: img.naturalHeight }); + const dims = { width: img.naturalWidth, height: img.naturalHeight }; + cleanup(); + resolve(dims); }; img.onerror = () => { + cleanup(); resolve(null); }; img.src = base64DataUrl; @@ -41,12 +49,33 @@ export function getVideoDimensions( return; } + let resolved = false; const video = document.createElement("video"); + video.preload = "metadata"; + + const cleanup = () => { + video.onloadedmetadata = null; + video.onerror = null; + video.src = ""; + video.load(); + }; + + const safeResolve = (value: { width: number; height: number } | null) => { + if (resolved) return; + resolved = true; + cleanup(); + resolve(value); + }; + + const timeout = setTimeout(() => safeResolve(null), 10_000); + video.onloadedmetadata = () => { - resolve({ width: video.videoWidth, height: video.videoHeight }); + clearTimeout(timeout); + safeResolve({ width: video.videoWidth, height: video.videoHeight }); }; video.onerror = () => { - resolve(null); + clearTimeout(timeout); + safeResolve(null); }; video.src = videoUrl; });