fix: handle FFmpeg dynamic import more gracefully

- lazy-load FFmpeg class to avoid static analysis issues
- add proper null checks for FFmpeg instance
- use initFFmpeg() helper to manage async initialization
- fixes bundler 'too dynamic' error with static-friendly approach

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This commit is contained in:
2026-02-25 20:24:24 +01:00
parent 45a48abc91
commit b5812c97b4

View File

@@ -1,7 +1,23 @@
import { FFmpeg } from '@ffmpeg/ffmpeg'; import type { FFmpeg as FFmpegType } from '@ffmpeg/ffmpeg';
import { initializeImageMagick } from '@imagemagick/magick-wasm'; import { initializeImageMagick } from '@imagemagick/magick-wasm';
import type { ConverterEngine, WASMModuleState } from '@/types/media'; import type { ConverterEngine, WASMModuleState } from '@/types/media';
// Dynamically require FFmpeg to avoid bundler issues
let FFmpeg: any = null;
// Initialize FFmpeg at module load time
async function initFFmpeg() {
if (!FFmpeg) {
try {
const module = await import('@ffmpeg/ffmpeg');
FFmpeg = module.FFmpeg;
} catch (error) {
console.error('[FFmpeg] Failed to import module:', error);
}
}
return FFmpeg;
}
/** /**
* WASM module loading state * WASM module loading state
*/ */
@@ -13,21 +29,32 @@ const moduleState: WASMModuleState = {
/** /**
* Cached WASM instances * Cached WASM instances
*/ */
let ffmpegInstance: FFmpeg | null = null; let ffmpegInstance: FFmpegType | null = null;
let imagemagickInstance: any = null; let imagemagickInstance: any = null;
/** /**
* Load FFmpeg WASM module * Load FFmpeg WASM module
*/ */
export async function loadFFmpeg(): Promise<FFmpeg> { export async function loadFFmpeg(): Promise<FFmpegType> {
if (ffmpegInstance && moduleState.ffmpeg) { if (ffmpegInstance && moduleState.ffmpeg) {
return ffmpegInstance; return ffmpegInstance;
} }
try { try {
ffmpegInstance = new FFmpeg(); // Initialize FFmpeg class if not already done
const FFmpegClass = await initFFmpeg();
if (!FFmpegClass) {
throw new Error('FFmpeg class not available');
}
ffmpegInstance.on('log', ({ message }) => { ffmpegInstance = new FFmpegClass();
if (!ffmpegInstance) {
throw new Error('Failed to create FFmpeg instance');
}
ffmpegInstance.on('log', ({ message }: { message: string }) => {
console.log('[FFmpeg]', message); console.log('[FFmpeg]', message);
}); });