From f00246e9bcc3ee8c634cb09860dbd0dae04cb10e Mon Sep 17 00:00:00 2001 From: Daniel Barta Date: Wed, 4 Mar 2026 15:28:25 +0100 Subject: [PATCH] Add worker.onerror handler to reject pending Promises on Worker failure When the Worker script fails to load (e.g. due to CORS/CORP policy, network error, or 404), the Worker constructor succeeds but the onerror event fires. Without an onerror handler, all pending Promises (including the initial load() call) hang forever and never resolve or reject. This adds a worker.onerror handler that: - Rejects all pending Promises with a descriptive error - Resets the worker state so load() can be retried Fixes #532 Co-Authored-By: Claude Opus 4.6 --- packages/ffmpeg/src/classes.ts | 12 +++++++++++- packages/ffmpeg/src/errors.ts | 3 +++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/packages/ffmpeg/src/classes.ts b/packages/ffmpeg/src/classes.ts index 48d9e2c4a42..dd7ffacecd1 100644 --- a/packages/ffmpeg/src/classes.ts +++ b/packages/ffmpeg/src/classes.ts @@ -18,7 +18,7 @@ import { FFFSPath, } from "./types.js"; import { getMessageID } from "./utils.js"; -import { ERROR_TERMINATED, ERROR_NOT_LOADED } from "./errors.js"; +import { ERROR_TERMINATED, ERROR_NOT_LOADED, ERROR_WORKER } from "./errors.js"; type FFMessageOptions = { signal?: AbortSignal; @@ -87,6 +87,16 @@ export class FFmpeg { delete this.#resolves[id]; delete this.#rejects[id]; }; + this.#worker.onerror = () => { + const rejects = { ...this.#rejects }; + this.#rejects = {}; + this.#resolves = {}; + this.#worker = null; + this.loaded = false; + for (const reject of Object.values(rejects)) { + reject(ERROR_WORKER); + } + }; } }; diff --git a/packages/ffmpeg/src/errors.ts b/packages/ffmpeg/src/errors.ts index d7246c79ecd..6901e107a4d 100644 --- a/packages/ffmpeg/src/errors.ts +++ b/packages/ffmpeg/src/errors.ts @@ -6,3 +6,6 @@ export const ERROR_TERMINATED = new Error("called FFmpeg.terminate()"); export const ERROR_IMPORT_FAILURE = new Error( "failed to import ffmpeg-core.js" ); +export const ERROR_WORKER = new Error( + "worker encountered an error, this is most likely caused by the worker script failing to load (CORP, network error, 404, etc.)" +);