Entendiendo el Modo Sin Conexión y Caché

Cómo funciona LobbyFlight sin conexión y cómo el caché asegura la visualización continua

15 min de lecturaÚltima actualización: 1/15/20240

Entendiendo el Modo Sin Conexión y Caché

LobbyFlight está diseñado para operación 24/7 en lobbies de hoteles. El sistema de caché inteligente asegura que tu pantalla continúe mostrando información de vuelos incluso durante interrupciones de red.

Cómo Funciona el Modo Sin Conexión

Arquitectura del Service Worker

LobbyFlight utiliza un Service Worker - una tecnología JavaScript que se ejecuta en segundo plano y gestiona el almacenamiento en caché.

Beneficios:

  • Carga instantánea de la pantalla (desde caché)
  • Almacenamiento automático de datos
  • Sincronización en segundo plano
  • Funcionalidad sin conexión
  • ¿Qué se Almacena en Caché?

    ContenidoDuración de AlmacenamientoFrecuencia de Actualización
    -------------------------------------------------------------------
    Archivos de la app (HTML, CSS, JS)Hasta actualizaciónEn cada lanzamiento
    Datos de vuelos6 horasCada 5 minutos
    Datos del clima2 horasCada 30 minutos
    Logo e imágenesIlimitadoAl cambiar
    Configuración24 horasAl cambiar

    Comportamiento Sin Conexión

    Cuando se Pierde Internet

  • Respuesta inmediata (0-5 segundos):
  • - El Service Worker intercepta las solicitudes

    - Se entregan los datos en caché

    - El usuario no nota nada

  • Después de 10 segundos:
  • - Aparece barra de estado naranja: "Modo sin conexión"

    - Los datos de vuelos en caché continúan mostrándose

    - Se muestra la hora de última actualización

  • Después de 30 minutos:
  • - Aparece advertencia: "Los datos pueden estar desactualizados"

    - La pantalla continúa funcionando

    - Se informa a los usuarios

  • Después de 6 horas:
  • - Los datos en caché se marcan como obsoletos

    - Se muestra indicación clara

    - El sistema continúa intentando reconectarse

    Reconexión Automática

    El sistema intenta continuamente restaurar la conexión:

    // Lógica de reconexión
    function tryReconnect() {
      fetch('/api/health')
        .then(() => {
          showNotification('Conexión restaurada')
          refreshData()
        })
        .catch(() => {
          attempts++
          const delay = attempts < 30 ? 1000 :
                       attempts < 60 ? 5000 : 30000
          setTimeout(tryReconnect, delay)
        })
    }

    Gestión de Caché

    Limpieza Automática

    El Service Worker realiza limpieza automática:

    En actualización de la app:

  • Se instala nueva versión del Service Worker
  • Se identifican versiones antiguas del caché
  • Se eliminan cachés obsoletos
  • Se activa la nueva versión
  • Código:

    self.addEventListener('activate', event => {
      event.waitUntil(
        caches.keys().then(cacheNames => {
          return Promise.all(
            cacheNames
              .filter(name => name !== CURRENT_CACHE)
              .map(name => caches.delete(name))
          )
        })
      )
    })

    Limpieza Manual del Caché

    Método 1: Vía DevTools del Navegador

  • Abre Chrome → F12
  • Pestaña Application → Storage
  • Cache Storage → lobbyflight-v1
  • Clic derecho → Delete
  • Método 2: Vía Consola JavaScript

    // Limpiar todos los cachés
    caches.keys().then(names => {
      names.forEach(name => caches.delete(name))
    })
    
    // Re-registrar Service Worker
    navigator.serviceWorker.getRegistration().then(reg => {
      reg.unregister()
      window.location.reload()
    })

    Método 3: Actualización Forzada

  • Windows/Linux: Ctrl + Shift + F5
  • Mac: Cmd + Shift + R
  • Android Chrome: Configuración → Privacidad → Borrar datos de navegación
  • Método 4: API de Mensajes

    // Enviar mensaje de limpieza al Service Worker
    navigator.serviceWorker.controller.postMessage({
      type: 'CLEAR_CACHE',
      cache: 'all' // o 'api', 'assets', 'runtime'
    })

    Gestión del Tamaño del Caché

    Límites del navegador:

  • Chrome: 6% del almacenamiento disponible
  • Firefox: 10% del almacenamiento disponible
  • Safari: 50MB inicial, expandible
  • Uso típico de LobbyFlight:

  • Inicial: 3-5 MB
  • Después de 1 día: 10-15 MB
  • Después de 1 semana: 20-30 MB
  • Máximo: ~50 MB
  • Desalojo Automático:

    El navegador elimina automáticamente cachés antiguos cuando:

  • El espacio de almacenamiento es bajo
  • Otras apps necesitan almacenamiento
  • El caché tiene más de 7 días sin uso
  • Solución de Problemas Sin Conexión

    Problema: Se Muestran Datos Antiguos

    Síntomas:

  • Vuelos de ayer visibles
  • El clima es incorrecto
  • Configuración desactualizada
  • Diagnóstico:

  • Chrome DevTools → Application → Cache Storage
  • Verificar header 'sw-cached-at'
  • Comparar con la hora actual
  • Soluciones:

  • Actualización forzada (Ctrl+Shift+F5)
  • Limpiar caché manualmente
  • Re-registrar Service Worker
  • Reinstalar app (PWA)
  • Problema: Modo Sin Conexión a Pesar de Tener Internet

    Síntomas:

  • Barra naranja offline visible permanentemente
  • Verificaciones de salud fallando
  • Pero internet funciona
  • Diagnóstico:

  • Consola → Pestaña Network
  • Buscar solicitudes /api/health fallidas
  • Verificar errores de CORS o TLS
  • Soluciones:

  • Verificar reglas de firewall
  • Verificar configuración de proxy
  • Limpiar caché DNS
  • Reiniciar navegador
  • Problema: El Service Worker No Carga

    Síntomas:

  • No hay modo sin conexión disponible
  • El caché no funciona
  • Instalación de PWA fallida
  • Diagnóstico:

    // Ejecutar en Consola
    navigator.serviceWorker.getRegistrations().then(regs => {
      console.log('SWs registrados:', regs)
    })

    Soluciones:

  • Usar HTTPS (¡obligatorio!)
  • Localhost está OK para pruebas
  • Deshabilitar modo incógnito
  • Actualizar el navegador
  • Problema: El Caché Crece Demasiado

    Síntomas:

  • El navegador se vuelve lento
  • Error "Storage quota exceeded"
  • La pantalla responde con lentitud
  • Diagnóstico:

    // Verificar tamaño del caché
    navigator.storage.estimate().then(estimate => {
      console.log(`Usado: ${estimate.usage / 1024 / 1024}MB`)
      console.log(`Cuota: ${estimate.quota / 1024 / 1024}MB`)
    })

    Soluciones:

  • Eliminar cachés antiguos
  • Optimizar tamaños de imágenes
  • Ajustar estrategia de caché
  • Aumentar cuota de almacenamiento (si es posible)
  • Mejores Prácticas para Operación Sin Conexión

    Configuración Óptima

    Para red estable:

  • Tiempos de caché cortos (5 minutos)
  • Actualizaciones agresivas
  • Almacenamiento mínimo
  • Para red inestable:

  • Tiempos de caché más largos (15-30 minutos)
  • Más precaching
  • Enfoque offline-first
  • Preparación para Modo Sin Conexión

    Antes del despliegue:

  • Deja que la pantalla cargue completamente en línea
  • Haz clic en todas las pestañas una vez
  • Déjalo funcionar por 10 minutos (llena los cachés)
  • Luego muévelo a la posición final
  • Mantenimiento regular:

  • Semanal: Reinicio del navegador
  • Mensual: Limpieza del caché
  • Trimestral: Actualización del navegador
  • Monitoreo

    Qué monitorear:

  • Eventos offline por día
  • Duración promedio offline
  • Tasa de aciertos del caché
  • Solicitudes API fallidas
  • Umbrales de alerta:

  • > 10 eventos offline/día
  • > 30 minutos offline de una vez
  • Tamaño del caché > 100MB
  • Tasa de aciertos < 50%
  • Configuración Avanzada

    Página Sin Conexión Personalizada

    Puedes diseñar una página sin conexión personalizada:

    Plantilla HTML (/public/custom-offline.html):

    <!DOCTYPE html>
    <html>
    <head>
      <title>Sin Conexión - [Nombre del Hotel]</title>
      <style>
        /* Tu estilo personalizado */
      </style>
    </head>
    <body>
      <div class="container">
        <img src="/logo.png" alt="Logo del Hotel">
        <h1>Actualmente sin conexión</h1>
        <p>Mostrando datos de vuelos en caché...</p>
        <div id="last-update"></div>
      </div>
      <script>
        // Lógica de reconexión personalizada
      </script>
    </body>
    </html>

    Personalización de Estrategias de Caché

    Para requisitos especiales:

    // Mayor tiempo de caché para imágenes
    if (request.destination === 'image') {
      return caches.match(request) || fetch(request).then(response => {
        cache.put(request, response.clone())
        return response
      })
    }
    
    // Sin caché para APIs específicas
    if (request.url.includes('/realtime/')) {
      return fetch(request) // Siempre fresco
    }

    Analíticas Sin Conexión

    Rastreo de eventos sin conexión:

    // Al perder conexión
    navigator.sendBeacon('/api/analytics', JSON.stringify({
      event: 'offline_start',
      timestamp: new Date().toISOString(),
      cached_items: await countCachedItems()
    }))
    
    // Al reconectarse
    navigator.sendBeacon('/api/analytics', JSON.stringify({
      event: 'offline_end',
      duration: offlineDuration,
      cache_hits: cacheHitCount
    }))

    ¿Fue útil este artículo?