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:
@@ -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();
|
||||||
|
|
||||||
ffmpegInstance.on('log', ({ message }) => {
|
if (!FFmpegClass) {
|
||||||
|
throw new Error('FFmpeg class not available');
|
||||||
|
}
|
||||||
|
|
||||||
|
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);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user