diff --git a/packages/core/src/runtime/init.ts b/packages/core/src/runtime/init.ts index c6f606012..bac909fd6 100644 --- a/packages/core/src/runtime/init.ts +++ b/packages/core/src/runtime/init.ts @@ -24,6 +24,7 @@ import { resolveRuntimeMediaClipDuration, syncRuntimeMedia, } from "./media"; +import { handleErrorForProxy, handleMetadataForProxy, maybeProxyProactively } from "./mediaProxy"; import { probeAndCacheElementVolume, type VolumeKeyframe } from "./mediaVolumeEnvelope.js"; import { createPickerModule } from "./picker"; import { createRuntimePlayer, type RuntimePlayerTransport } from "./player"; @@ -1644,10 +1645,29 @@ export function initSandboxRuntimeModular(): void { }, METADATA_REBIND_DEBOUNCE_MS); }; + // Reactive/tertiary undecodable-media triggers (see mediaProxy.ts). Wrapped + // as event listeners here — rather than exported directly — because + // `addEventListener` hands the listener an `Event`, not the element; + // `event.currentTarget` recovers it. Bound/unbound alongside the metadata + // listeners below, reusing `metadataBoundMedia` as the once-per-element + // dedupe (no separate tracking set needed). + const onMediaLoadedMetadataForProxy = (event: Event) => { + if (event.currentTarget instanceof HTMLMediaElement) { + handleMetadataForProxy(event.currentTarget); + } + }; + const onMediaErrorForProxy = (event: Event) => { + if (event.currentTarget instanceof HTMLMediaElement) { + handleErrorForProxy(event.currentTarget); + } + }; + const unbindMediaMetadataListeners = () => { for (const mediaEl of metadataBoundMedia) { mediaEl.removeEventListener("loadedmetadata", scheduleMetadataDurationHydration); mediaEl.removeEventListener("durationchange", scheduleMetadataDurationHydration); + mediaEl.removeEventListener("loadedmetadata", onMediaLoadedMetadataForProxy); + mediaEl.removeEventListener("error", onMediaErrorForProxy); } metadataBoundMedia.clear(); }; @@ -1664,6 +1684,17 @@ export function initSandboxRuntimeModular(): void { } mediaEl.addEventListener("loadedmetadata", scheduleMetadataDurationHydration); mediaEl.addEventListener("durationchange", scheduleMetadataDurationHydration); + // Reactive (zero-videoWidth) + tertiary (error event) proxy-fallback + // triggers. Inert in render mode / when the codec map is absent / + // for