Ir al contenido

NetworkMonitor

NetworkMonitor es el broker del SDK encargado de monitorear el estado de la conexión a internet y la calidad del enlace con el backend. Expone el estado de red de forma observable para que SyncManager y otros componentes reaccionen a las transiciones online/offline.

La clase vive en repos/tables-sdk/src/core/brokers/NetworkMonitor.ts y se instancia dentro de TablesBroker. Para el panorama general de los brokers revisa la página de Brokers.

El estado se modela con la interfaz NetworkInfo:

type NetworkStatus = 'online' | 'offline' | 'degraded';
interface NetworkInfo {
status: NetworkStatus;
online: boolean; // false solo cuando status === 'offline'
latency: number | null; // milisegundos del último ping, o null
lastCheck: string; // ISO timestamp de la última verificación
degradationReason?: string;// presente solo cuando status === 'degraded'
}

El estado inicial es siempre offline (online: false, latency: null) hasta que el primer ping resuelve.

NetworkMonitor combina dos señales: los eventos nativos del navegador y un ping HTTP periódico al backend.

  1. Eventos del navegador. Si existe window, el constructor registra listeners para los eventos online y offline. El evento offline marca el estado como offline de inmediato. El evento online no fuerza una verificación por sí solo: el cambio real se confirma en el siguiente ping.

  2. Chequeo periódico. Al llamar a start(), se ejecuta una verificación inmediata y luego se programa un setInterval con el período configurado (pingInterval, por defecto 10000 ms).

  3. Ping al backend. Cada verificación hace fetch a `${apiUrl}/ping` con método GET y un AbortController que aborta tras pingTimeout (por defecto 5000 ms). Antes del fetch, si navigator.onLine === false, se marca offline sin tocar la red.

  4. Clasificación por latencia. Si la respuesta es ok, la latencia (diferencia de tiempo del request) determina el estado:

    • latencia menor a 1000 ms: online
    • latencia de 1000 ms o más: degraded

    Si la respuesta no es ok (HTTP no 2xx), el estado es degraded con degradationReason indicando el status. Un TypeError o un AbortError (timeout o fallo de red) marca offline; cualquier otro error marca degraded.

MétodoDescripción
constructor(apiUrl, options?)options acepta pingInterval y pingTimeout en milisegundos. Registra los listeners del navegador si window existe.
start()Inicia el monitoreo periódico. Hace una verificación inmediata y luego una por intervalo. No-op si ya está corriendo o si el flag está deshabilitado.
stop()Detiene el intervalo y aborta cualquier ping en curso.
getStatus(): NetworkInfoDevuelve una copia del estado actual.
onStatusChange(listener): () => voidRegistra un listener y devuelve una función para desuscribirse.
destroy()Llama a stop(), remueve los listeners del navegador y vacía la lista de suscriptores.

onStatusChange recibe un NetworkStatusListener, es decir una función (status: NetworkInfo) => void. El listener se invoca solo cuando el status cambia respecto del valor previo (transiciones), no en cada ping. La función retornada elimina la suscripción.

const unsubscribe = networkMonitor.onStatusChange((info) => {
if (info.online) {
// la red volvió: reanudar trabajo pendiente
} else {
// entrar en modo offline
}
});
// más tarde
unsubscribe();

NetworkMonitor se crea una sola vez en TablesBroker y se comparte:

  • TablesBroker se suscribe vía onStatusChange para propagar la latencia a Database.updateNetworkLatency() (dimensionado dinámico de batches de sync) y para disparar reconexión automática cuando la red vuelve estando desconectado.
  • SyncManager recibe la instancia por constructor para coordinar la sincronización según el estado de red.
  • BackendResolver (permisos) puede engancharse opcionalmente para adoptar la política “trust offline” mientras el monitor reporta offline.
  • CashFlowManager usa onStatusChange para enganchar su recovery automático cuando la red se recupera.

El singleton también queda accesible vía TablesCore.network.