From 50fd1273735ad81c1e1d74e4b83d8a5be8a78153 Mon Sep 17 00:00:00 2001 From: Samuel Newman Date: Thu, 27 Nov 2025 16:41:32 +0200 Subject: [PATCH] dispose of input once finished --- src/lib/media/video/compress.ts | 4 ---- src/lib/media/video/compress.web.ts | 18 +++++++++++++----- src/view/com/composer/videos/metadata.ts | 2 +- src/view/com/composer/videos/metadata.web.ts | 4 ++-- 4 files changed, 16 insertions(+), 12 deletions(-) diff --git a/src/lib/media/video/compress.ts b/src/lib/media/video/compress.ts index fe05d28328..1d00bfcea1 100644 --- a/src/lib/media/video/compress.ts +++ b/src/lib/media/video/compress.ts @@ -7,10 +7,6 @@ import {extToMime} from './util' const MIN_SIZE_FOR_COMPRESSION = 25 // 25mb -export function hasWebCodecs(): boolean { - throw new Error('Native does not have WebCodecs.') -} - export async function compressVideo( file: ImagePickerAsset, opts?: { diff --git a/src/lib/media/video/compress.web.ts b/src/lib/media/video/compress.web.ts index 06b900b626..ff72a5cfbc 100644 --- a/src/lib/media/video/compress.web.ts +++ b/src/lib/media/video/compress.web.ts @@ -245,16 +245,24 @@ async function doCompression( } if (signal) { - signal.addEventListener('abort', () => { - logger.debug('compress: cancelled') - conversion.cancel() - }) + signal.addEventListener( + 'abort', + () => { + logger.debug('compress: cancelled') + conversion.cancel() + }, + {once: true}, + ) } logger.debug('compress: starting conversion') const startTime = performance.now() - await conversion.execute() + try { + await conversion.execute() + } finally { + input.dispose() + } const elapsed = performance.now() - startTime const bytes = target.buffer diff --git a/src/view/com/composer/videos/metadata.ts b/src/view/com/composer/videos/metadata.ts index 712f304359..e8dfda63ce 100644 --- a/src/view/com/composer/videos/metadata.ts +++ b/src/view/com/composer/videos/metadata.ts @@ -5,5 +5,5 @@ export const getVideoMetadata = (_file: File): Promise => { } export function hasWebCodecs(): boolean { - throw new Error("hasWebCodecs is web only (also, no it doesn't)") + return false } diff --git a/src/view/com/composer/videos/metadata.web.ts b/src/view/com/composer/videos/metadata.web.ts index d2abfb1048..4bdf02d9cb 100644 --- a/src/view/com/composer/videos/metadata.web.ts +++ b/src/view/com/composer/videos/metadata.web.ts @@ -22,14 +22,14 @@ export async function getVideoMetadata(file: File): Promise { if (hasWebCodecs()) { try { const result = await getMetadataWithWebCodecs(file, blobUrl) - logger.debug('metadata: MediaBunny succeeded', { + logger.debug('metadata: WebCodecs succeeded', { width: result.width, height: result.height, duration: result.duration, }) return result } catch (e) { - logger.warn('metadata: MediaBunny failed, using fallback', { + logger.warn('metadata: WebCodecs failed, using fallback', { safeMessage: e, }) }