Skip to content

Corrupt Image nodes prevent frames to complete initial loading #1036

@christianms-itx

Description

@christianms-itx

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?

  1. Un usuario sube una imagen a un moodboard (se crea un nodo con imageFallback y la imageUrl no se llega a establecer)
  2. El tiempo pasa y la URL de la imagen caduca o el recurso se elimina del backend
  3. Otro usuario (o el mismo, más tarde) abre el moodboard
  4. El SDK intenta cargar la imageURL → falla → intenta el imageFallback → tiene éxito → pero NO resuelve el asyncElement
  5. El overlay se queda bloqueado para siempre

Metadata

Metadata

Assignees

Labels

bugSomething isn't working

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions