Bridge
Arborescence du dossier Bridge
jitsibox-pro/services/bridge/
├── src
│ ├── controllers.ts
│ ├── index.ts
│ ├── mainScreens.ts
│ ├── model.ts
│ └── status.ts
├── package-lock.json
├── package.json
└── tsconfig.json
Services
Le backend est le cœur de l'application. Il agit comme un pont entre les contrôleurs et l'écran principal.
Le code est écrit en ExpressJS, et est divisé en quatre parties qui seront décrites ci-dessous :
Mise à jour
Aucune mise à jour à chaud n'a encore été implémentée, il faut donc redémarrer le serveur pour mettre à jour le code.
Statut global
L'état global est actuellement stocké dans un dictionnaire, et vise à garder une trace de l'état actuel de l'application. Son objectif principal est d'éviter les bogues liés à d'éventuelles déconnexions de sockets. En fait, à chaque connexion d'un client, le serveur envoie ce dictionnaire afin que le client s'adapte à l'état actuel de l'application.
Fichier principal : index.ts
Ce fichier initie la connexion entre le serveur de socket et ses clients. Il démarre le serveur Express, et lance le serveur de socket. Les contrôleurs enverront ensuite des requêtes au serveur socker sur l'espace de noms "/controllers"
, tandis que l'écran principal le fera sur l'espace de noms "/mainScreens"
.
Deux middlewares ont été ajoutés (en fait deux fois le même, mais pour les deux espaces de noms) afin d'implémenter une certaine authentification. Chaque fois qu'un client se connecte au serveur de socket, il doit fournir deux choses :
- Un jeton d'authentification, actuellement stocké dans
packages/model
, mais qui devrait être une variable d'environnement. - Le nom (ou l'identifiant) de la pièce du bâtiment dans lequel se trouve le client (pour faciliter l'implémentation d'un serveur central, voir les étapes suivantes pour plus de détails). Le middleware vérifie alors simplement si le jeton est valide, et bloque la connexion si ce n'est pas le cas.
Ensuite, lors de la connexion du client, le pont envoie le dictionnaire globalStatus
au client, et ajoute le client au socket room correspondant au nom du room physique fourni par le client.
Controllers
Ce fichier décrit le comportement du backend pour chaque événement émis par les contrôleurs. Le comportement est assez simple et toujours le même :
- Mettre à jour certaines données dans
globalStatus
si nécessaire. - Notifier l'écran principal que quelque chose a changé
- Avertir les contrôleurs que quelque chose a changé si l'accusé de réception de l'écran principal n'est pas nécessaire
Le comportement précis des contrôleurs est décrit sur ce lien.
Main screen
Ce fichier décrit le comportement du backend pour chaque événement émis par l'écran principal. Le comportement est assez simple et toujours le même :
- Mettre à jour certaines données dans
globalStatus
si nécessaire. - Notifier les contrôleurs que quelque chose a changé
Nous ne notifions pas l'écran principal à nouveau, car un seul écran principal est supposé être connecté à la fois (et il a déjà l'information).
Le comportement précis des contrôleurs est décrit sur ce lien.