Manejo de Errores en Sincronización
Flujo de error
Cuando una request falla, se ejecuta onError(err, sender, req). El error se guarda en req.latestError y se decide qué hacer según el status HTTP.
Tabla de decisiones
| Condición | Acción | Detalle |
|---|---|---|
err === 'path not found' | Eliminar request | Error interno: archivo local no encontrado (PUTF) |
err.status === 400 + DUPLICATED_KEY (-6) | Eliminar request | El recurso ya existe en el servidor |
err.status === 400 + removeOnFail en eventData | Eliminar request | El servicio marcó que se descarte si falla |
err.status === 400 + error Aura genérico | Detener sender, emitir offlineBadRequest | El servicio de dominio decide qué hacer |
err.status === 400 sin error Aura | Detener sender | Queda bloqueado hasta retry manual |
err.status === 403 | Detener sender | Error de autenticación |
err.status === 429 | Detener sender | Rate limiting |
isTimeoutCode (408, 504, 598, 599) | Detener sender | Timeout, se reintenta en próximo trySync |
err.status > 499 + request > 48hs | Mover a removedQueue | Request vieja con error de servidor |
err.status > 499 + request < 48hs | Detener sender | Se reintenta después |
err.status > 400 (4xx genérico) | Incrementar attempts | Si attempts > 8 → mover a removedQueue |
| Default | Detener sender | Error no manejado |
offlineBadRequest
Subject que permite a los servicios de dominio manejar errores específicos:
// app.component.ts
this.offlineService.offlineBadRequest.subscribe(data => {
if (data.sender === this.scoutingService.getSender()) {
this.scoutingService.handleBadRequest(data.id, data.error);
} else if (data.sender === this.appsService.getSender()) {
this.appsService.handleBadRequest(data.id, data.error);
}
});
removedQueue
Requests que se eliminan (por error o manualmente) se mueven a removedQueue con un timestamp deleted. El usuario puede restaurarlas desde la UI de sync.
MAX_ATTEMPTS
Constante: 8. Aplica solo para errores 4xx genéricos (no 400, 403, 429).
Timeout de requests viejas
Requests con err.status > 499 y más de 48 horas (172800000 ms) se mueven automáticamente a removedQueue.