Weave SDK Bug Report — loadImage con useFallback=true no resuelve asyncElement
SDK: @inditextech/weave-sdk@3.8.0
Archivo: sdk.js, método WeaveImageNode.loadImage (línea ~27011)
Severidad: Crítica — bloquea completamente la carga de rooms con nodos imagen huérfanos
Issue: ICPRDESINS-6996
Síntoma
Moodboards que contienen nodos de imagen "huérfanos" (cuyo imageURL apunta a una URL caducada o inexistente, y cuyo resourceId no tiene correspondencia en el mapa de recursos) se quedan bloqueados indefinidamente mostrando el overlay "Conectando". El usuario no puede interactuar con el moodboard.
Causa raíz
El método loadImage del SDK tiene un bug en el path de fallback image.
Flujo normal (sin fallback) — funciona correctamente
loadImage(params, image, useFallback=false)
→ loadAsyncElement(id) // registra nodo como LOADING
→ preloadImage(id, imageURL, { onLoad, onError })
onLoad:
→ ... renderiza imagen ...
→ resolveAsyncElement(id) ✅ // marca nodo como LOADED
onError:
→ resolveAsyncElement(id) ✅ // marca nodo como LOADED (con error)
Flujo con fallback — bug aquí
Cuando un nodo imagen tiene un imageFallback configurado y la carga de la imagen principal falla, el SDK entra en el path de fallback:
loadImage(params, image, useFallback=false)
→ loadAsyncElement(id) // registra nodo como LOADING
→ preloadImage(id, imageURL, { onLoad, onError })
onError:
→ loadImage(params, image, useFallback=true) // reintenta con fallback
→ loadAsyncElement(id) // re-registra como LOADING
→ preloadFallbackImage(id, imageFallback, { onLoad, onError })
onLoad:
→ ...renderiza fallback...
→ if (!useFallback) resolveAsyncElement(id) ❌ NUNCA SE EJECUTA
// useFallback es `true` aquí, así que la condición es falsa
Línea del bug (sdk.js ~27076):
if (!useFallback) this.resolveAsyncElement(id);
La condición !useFallback excluye exactamente el caso en el que se cargó la imagen fallback. El nodo queda registrado como LOADING permanentemente en el asyncManager.
Efecto cascada
El WeaveAsyncManager mantiene un mapa de todos los elementos asíncronos (imágenes, vídeos, conectores). Solo emite el evento onAsyncElementsLoaded cuando todos los elementos están en estado LOADED:
// asyncManager.resolveAsyncElement:
const allLoaded = this.asyncElementsLoaded();
if (allLoaded) {
this.instance.emitEvent("onAsyncElementsLoaded");
}
Si un solo nodo queda en LOADING, el evento onAsyncElementsLoaded nunca se emite. El estado asyncElementsState del React provider nunca transiciona de "loading" a "loaded", y el overlay "Conectando" permanece visible indefinidamente.
¿Cuándo ocurre en la práctica?
- Un usuario sube una imagen a un moodboard (se crea un nodo con
imageFallback y la imageUrl no se llega a establecer)
- El tiempo pasa y la URL de la imagen caduca o el recurso se elimina del backend
- Otro usuario (o el mismo, más tarde) abre el moodboard
- El SDK intenta cargar la
imageURL → falla → intenta el imageFallback → tiene éxito → pero NO resuelve el asyncElement
- El overlay se queda bloqueado para siempre
Weave SDK Bug Report —
loadImageconuseFallback=trueno resuelveasyncElementSDK:
@inditextech/weave-sdk@3.8.0Archivo:
sdk.js, métodoWeaveImageNode.loadImage(línea ~27011)Severidad: Crítica — bloquea completamente la carga de rooms con nodos imagen huérfanos
Issue: ICPRDESINS-6996
Síntoma
Moodboards que contienen nodos de imagen "huérfanos" (cuyo
imageURLapunta a una URL caducada o inexistente, y cuyoresourceIdno tiene correspondencia en el mapa de recursos) se quedan bloqueados indefinidamente mostrando el overlay "Conectando". El usuario no puede interactuar con el moodboard.Causa raíz
El método
loadImagedel SDK tiene un bug en el path de fallback image.Flujo normal (sin fallback) — funciona correctamente
Flujo con fallback — bug aquí
Cuando un nodo imagen tiene un
imageFallbackconfigurado y la carga de la imagen principal falla, el SDK entra en el path de fallback:Línea del bug (sdk.js ~27076):
La condición
!useFallbackexcluye exactamente el caso en el que se cargó la imagen fallback. El nodo queda registrado comoLOADINGpermanentemente en elasyncManager.Efecto cascada
El
WeaveAsyncManagermantiene un mapa de todos los elementos asíncronos (imágenes, vídeos, conectores). Solo emite el eventoonAsyncElementsLoadedcuando todos los elementos están en estadoLOADED:Si un solo nodo queda en
LOADING, el eventoonAsyncElementsLoadednunca se emite. El estadoasyncElementsStatedel React provider nunca transiciona de"loading"a"loaded", y el overlay "Conectando" permanece visible indefinidamente.¿Cuándo ocurre en la práctica?
imageFallbacky la imageUrl no se llega a establecer)imageURL→ falla → intenta elimageFallback→ tiene éxito → pero NO resuelve elasyncElement