Une implémentation Java autonome pour recevoir, traiter et afficher en temps réel les données VitalRecorder via Socket.IO.
Ce projet expose un serveur Socket.IO, décompresse et nettoie les trames reçues, les transforme en objets de domaine structurés, puis les diffuse vers des sorties (console, etc.). Il inclut une suite de tests unitaires et une CI GitHub Actions prête à l’emploi.
- Fonctionnalités
- Architecture & pipeline
- Prérequis
- Installation
- Exécution
- Configuration
- Tests
- Intégration Continue (CI)
- Dépannage
- Contribuer
- Licence
- Serveur Socket.IO pour recevoir les données VitalRecorder.
- Décompression robuste des payloads (zlib, indicateur Socket.IO binaire v4, données non compressées renvoyées telles quelles).
- Nettoyage JSON (suppression des caractères de contrôle, remplacement NaN/Infinity par null, normalisation décimale virgule→point).
- Transformation des données en structures prêtes à l’affichage (formatage numérique indépendant de la locale, stats waveform min/max/moyenne).
- Sortie console compacte ou verbeuse, avec couleurs ANSI optionnelles.
- Orchestration claire entrée→processeur→sorties, statistiques (uptime, rooms/tracks traités, etc.).
- Suite de tests JUnit 5 + Mockito + AssertJ.
- Entrée:
vitalconnect.input.SocketIOServerInput- Héberge le serveur Socket.IO (port configurable), reçoit les trames brutes.
- Utilise
VitalDataDecompressorpour décompresser si nécessaire. - Utilise
VitalDataProcessorpour parser le JSON enVitalData. - Utilise
VitalDataTransformerpour produireProcessedData/ProcessedTrack.
- Coeur:
vitalconnect.core.VitalProcessor- Reçoit des
ProcessedDatade l’entrée et les diffuse vers une ou plusieurs sorties. - Maintient l’état (running), la dernière donnée reçue et des statistiques (avec uptime basé sur System.nanoTime pour précision).
- Reçoit des
- Sorties:
vitalconnect.output.*ConsoleVitalOutput: affiche les données au format compact ou verbeux, en couleurs optionnellement.
Entrée → Décompression → Nettoyage/Parsing → Transformation → Sorties
- Java JDK 25 (compilation et exécution)
- Maven 3.9+
Vérification rapide:
java -version
mvn -vRécupérez les dépendances et compilez le projet:
mvn clean package -DskipTestsLe packaging produit un JAR exécutable (shaded) dans target/. Le nom exact dépend de la configuration Maven (par défaut, suffixe -shaded).
Listez les artefacts:
dir targetExécutez l’application principale vitalconnect.VitalConnectApplication à partir du JAR:
java -jar target\vital-connect-java-1.0.0-shaded.jarArguments CLI (tous optionnels, dans l’ordre):
- host (string, défaut:
127.0.0.1) - port (int, défaut:
3000) - verbose (boolean, défaut:
false) - colorized (boolean, défaut:
true)
Exemples:
:: Démarrage avec défauts (127.0.0.1:3000, compact, couleurs)
java -jar target\vital-connect-java-1.0.0-shaded.jar
:: Démarrage verbeux sans couleurs sur le port 5000
java -jar target\vital-connect-java-1.0.0-shaded.jar 127.0.0.1 5000 true falsePendant l’exécution, vous pouvez arrêter l’application avec Ctrl+C (ou appeler shutdown() via le hook d’arrêt). Des statistiques finales sont affichées.
Note: configurez VitalRecorder pour pointer vers l’IP/port du serveur (par défaut 127.0.0.1:3000).
- Journalisation:
src/main/resources/logback.xml- Par défaut, écrit sur la console et peut écrire dans
logs/vitalconnect.log(selon la configuration fournie).
- Par défaut, écrit sur la console et peut écrire dans
- Console:
- Mode
verboseoucompactselon la création deConsoleVitalOutput(via les args CLI ou code). - Couleurs ANSI activables/désactivables.
- Mode
- Décompression:
VitalDataDecompressordétecte automatiquement les entêtes zlib (0x78) et l’indicateur binaire Socket.IO v4 (0x04 0x78), sinon renvoie les données brutes telles quelles. - Nettoyage/Parsing:
VitalDataProcessorremplace toutes variantes deNaN/Infinity(+/−, casse insensible) parnullet normalise123,456→123.456dans objets/tableaux. - Transformation:
VitalDataTransformerformate les flottants avecLocale.US(72.500,1.000..5.000, etc.).
Exécuter toute la suite:
mvn testCibler un test:
mvn -Dtest=VitalProcessorTest test
mvn -Dtest=VitalDataTransformerTest#testTransformWaveformData testRapports Surefire:
- Générés dans
target/surefire-reports/. - En CI, ils sont publiés comme artefacts téléchargeables.
Compatibilité Mockito/JDK 25:
- Le
pom.xmlconfigure Surefire avec:-Djdk.attach.allowAttachSelf=true--add-opens java.base/java.lang=ALL-UNNAMED
- Ces options permettent l’agent ByteBuddy et les mocks inline/MockedConstruction nécessaires sous JDK 25.
- Seuil de couverture configuré à 90% (compteur LINE) au niveau « package ».
- Rapport HTML généré à l’étape
verify:target/site/jacoco/index.html
- Exécuter localement :
mvn verify- En CI, le workflow exécute
mvn verifyet publie les artefacts de couverture (dossiertarget/site/jacoco/**et fichiertarget/jacoco.exec). - Si la couverture passe sous 90%, l’étape
verifyéchoue (localement et en CI).
Un workflow GitHub Actions est fourni: .github/workflows/ci.yml.
- Déclencheurs: push/PR sur
mainetmaster, exécution manuelle. - Matrix:
ubuntu-latestetwindows-latest, JDK25. - Étapes: checkout, setup-java (cache Maven),
mvn test, upload des rapports Surefire.
Badge de statut (remplacez <owner>/<repo> si vous le souhaitez dans votre README):
[](https://github.com/<owner>/<repo>/actions/workflows/ci.yml)- Le JAR ne démarre pas / classe principale introuvable
- Assurez-vous d’avoir exécuté
mvn clean packageet d’utiliser le JAR-shaded.
- Assurez-vous d’avoir exécuté
- Les tests Mockito échouent sous JDK récent
- Gardez les options Surefire du
pom.xml(attach + add-opens) ou exécutez avec ces flags.
- Gardez les options Surefire du
- Formatage décimal incorrect (virgule au lieu de point)
- Le formatage est forcé en
Locale.USdans le transformeur; vérifiez que vous utilisez bien le pipeline standard.
- Le formatage est forcé en
- Les données Socket.IO ne se décompressent pas
VitalDataDecompressorrenvoie les données brutes si non zlib; vérifiez la source de données et l’indicateur binaire v4.
Logs
- Consultez
logs/vitalconnect.log(si activé danslogback.xml) et la console. - En cas d’échec de l’écriture console,
ConsoleVitalOutputjournalise un message d’erreur surSystem.err.
Les contributions sont les bienvenues !
- Créez une branche à partir de
main. - Ajoutez des tests pour toute modification fonctionnelle.
- Veillez au passage de
mvn testsur Windows et Linux. - Ouvrez une Pull Request détaillant les changements.
Aucune licence explicite n’est fournie pour l’instant. Si vous souhaitez publier sous une licence open-source (MIT/Apache-2.0, etc.), ajoutez un fichier LICENSE et mettez à jour cette section.