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.
Estado de red
Sección titulada «Estado de red»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.
Cómo detecta el estado
Sección titulada «Cómo detecta el estado»NetworkMonitor combina dos señales: los eventos nativos del navegador y un
ping HTTP periódico al backend.
-
Eventos del navegador. Si existe
window, el constructor registra listeners para los eventosonlineyoffline. El eventoofflinemarca el estado comoofflinede inmediato. El eventoonlineno fuerza una verificación por sí solo: el cambio real se confirma en el siguiente ping. -
Chequeo periódico. Al llamar a
start(), se ejecuta una verificación inmediata y luego se programa unsetIntervalcon el período configurado (pingInterval, por defecto10000ms). -
Ping al backend. Cada verificación hace
fetcha`${apiUrl}/ping`con métodoGETy unAbortControllerque aborta traspingTimeout(por defecto5000ms). Antes del fetch, sinavigator.onLine === false, se marcaofflinesin tocar la red. -
Clasificación por latencia. Si la respuesta es
ok, la latencia (diferencia de tiempo del request) determina el estado:- latencia menor a
1000ms:online - latencia de
1000ms o más:degraded
Si la respuesta no es
ok(HTTP no 2xx), el estado esdegradedcondegradationReasonindicando el status. UnTypeErroro unAbortError(timeout o fallo de red) marcaoffline; cualquier otro error marcadegraded. - latencia menor a
API pública
Sección titulada «API pública»| Método | Descripció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(): NetworkInfo | Devuelve una copia del estado actual. |
onStatusChange(listener): () => void | Registra 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. |
Suscribirse a cambios
Sección titulada «Suscribirse a cambios»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 tardeunsubscribe();Quién lo consume
Sección titulada «Quién lo consume»NetworkMonitor se crea una sola vez en TablesBroker y se comparte:
- TablesBroker se suscribe vía
onStatusChangepara propagar la latencia aDatabase.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
onStatusChangepara enganchar su recovery automático cuando la red se recupera.
El singleton también queda accesible vía TablesCore.network.