Skip to content

📡 Communication Temps Réel (SSE) ​

L'application utilise le protocole Server-Sent Events (SSE) pour maintenir une liaison bidirectionnelle (réception de commandes poussées par le serveur) avec le backend. Cela permet de piloter les périphériques à distance sans attendre un rafraîchissement manuel.


🛠️ Architecture Technique ​

La gestion du SSE est centralisée dans deux composants Svelte situés dans src/lib/components/sse/ :

  1. Sse.svelte : Gère la connexion bas niveau via l'API native EventSource.
  2. SseHandler.svelte : Intercepte les événements dispatchés par le composant SSE et exécute les actions métiers correspondantes.

Flux de données ​


📨 Événements supportés ​

L'application réagit à plusieurs types d'événements envoyés par le serveur :

ÉvénementAction effectuée par l'App
messageÉvénement générique logué en debug.
randomStrGénère et met à jour le QR Code d'association sur l'écran.
deviceLinkedAffiche un dialogue de succès et reconnecte le flux SSE.
reloadProvoque un location.reload() pour mettre Ă  jour l'application.
navigation / navigateToRedirige l'utilisateur vers une URL spécifique via goto().
refreshDéclenche un rafraîchissement des données (Full Data).
clearNettoyage forcé (preferences pour le stockage, cache pour le Service Worker).

🔄 Robustesse et Reconnexion ​

  • Last Event ID : L'application stocke le sseLastEventId dans le stockage local. Ă€ la reconnexion, il est renvoyĂ© au serveur pour rĂ©cupĂ©rer les Ă©vĂ©nements manquĂ©s.
  • Auto-reconnect : En cas d'erreur CLOSED, le composant tente une reconnexion automatique après 30 secondes.
  • Anti-dĂ©connexion (Keep-alive) : Un mĂ©canisme de fetch pĂ©riodique (urlTest) est en place pour empĂŞcher les routeurs ou pare-feu de fermer la connexion inactive.

⚙️ Configuration ​

L'URL du serveur SSE est fournie dynamiquement via les props du composant (souvent récupérée depuis le CMS ou les variables d'environnement lors de l'initialisation du pipeline).

typescript
// Exemple d'action de nettoyage (clear)
if (message == 'cache') {
	clearCache(); // Notifie le Service Worker
	await cmsPipelineService.restart(); // Redémarre le pipeline CMS
}

Retour Ă  l'accueil