Ce projet est une application de chat en temps réel moderne, développée en React (TypeScript + Vite) pour la partie frontend, et Node.js (Express + Mongoose) pour le backend. La communication en temps réel (messages et notifications) est gérée de manière ultra-performante par le protocole Mercure via Server-Sent Events (SSE).
- 🔐 Authentification Sécurisée : Inscription et connexion avec hachage des mots de passe (Bcrypt) et tokens de session JWT.
- 🧑🤝🧑 Gestion des Contacts : Recherche d'utilisateurs par nom ou prénom et ajout/suppression d'amis en temps réel.
- 💬 Messagerie instantanée : Chat direct en un-contre-un avec défilement fluide et actualisation en temps réel via Mercure.
- 🔔 Notifications en direct : Un système global de notifications push SSE qui alerte instantanément les utilisateurs lorsqu'ils reçoivent un message hors d'une discussion active.
- 👥 Groupes de discussion : Possibilité de créer, rejoindre et quitter des groupes de chat.
- 🐳 Prêt pour le déploiement (Dockerized) : Architecture modulaire orchestrée avec Docker Compose comprenant le Frontend, le Backend, MongoDB et le Hub Mercure.
graph TD
Client1[React Client A] <-->|EventSource / SSE| Hub[Mercure Hub :3002]
Client2[React Client B] <-->|EventSource / SSE| Hub
Client1 -->|HTTP Rest API| API[Express API :3001]
Client2 -->|HTTP Rest API| API
API -->|Publish events| Hub
API <-->|Mongoose ODM| DB[(MongoDB)]
Avant de lancer le projet, vous devez copier les fichiers d'exemple .env.example dans des fichiers .env réels pour le frontend et le backend.
Créez le fichier /backend/.env :
PORT=3001
MONGODB_URI=mongodb://mongodb:27017/chat-mercure
MERCURE_PUBLISH_URL=http://mercure/.well-known/mercure
MERCURE_JWT_SECRET=!ChangeThisMercureHubJWTSecretKey!(Remarque : Si vous exécutez le backend localement sans Docker, remplacez mongodb://mongodb par mongodb://localhost et http://mercure par http://localhost:3002).
Créez le fichier /frontend/.env :
VITE_REACT_APP_API_URL=http://localhost:3001Docker Compose s'occupe de compiler et démarrer l'ensemble de la pile technique (Frontend, Backend, Base de données et Hub Mercure).
- Lancez la commande suivante à la racine du projet :
docker-compose up --build
- Accédez aux services :
- 🌐 Frontend : http://localhost:3000
- ⚙️ Backend API : http://localhost:3001
- 📡 Mercure Hub : http://localhost:3002
Pour exécuter le projet localement sans conteneurs, vous devez avoir Node.js installé et lancer un hub Mercure indépendant.
Vous pouvez télécharger et exécuter le binaire Mercure officiel (ou utiliser Docker uniquement pour le Hub) :
docker run -e MERCURE_PUBLISHER_JWT_KEY='!ChangeThisMercureHubJWTSecretKey!' -e MERCURE_SUBSCRIBER_JWT_KEY='!ChangeThisMercureHubJWTSecretKey!' -e MERCURE_EXTRA_DIRECTIVES="cors_origins *\npublish_allowed_origins *" -p 3002:80 dunglas/mercurecd backend
npm install
npm startcd frontend
npm install
npm run dev- Souscription (Client) : Le client React s'abonne aux flux en temps réel via l'API standard
EventSourcedu navigateur :- Pour les conversations :
http://localhost:3002/.well-known/mercure?topic=http://localhost:3001/conversations/{conversationId} - Pour les notifications :
http://localhost:3002/.well-known/mercure?topic=http://localhost:3001/notifications/{userId}
- Pour les conversations :
- Publication (Serveur) : Lors de l'envoi d'un message, le backend Node.js publie une requête HTTP
POSTsignée avec un token JWT secret vers le Hub Mercure. Le Hub diffuse alors immédiatement l'événement à tous les clients abonnés.
Ce projet a été développé dans le cadre d'un cours d'ingénierie web à l'HETIC par :
- Achraf CHARDOUDI
- Lyes DJAOUT
Ce projet est sous licence académique HETIC.