Module 08
⭐⭐⭐ Difficile
~4h
⚡ Chat en Temps Réel + Queue Emails
Construire un système de chat temps réel avec WebSocket + rooms, notifications par événements EventEmitter2, et file d'emails avec BullMQ + Redis.
🏗️ Architecture
WebSocket (Socket.io) EventEmitter2 BullMQ (Redis)
───────────────────── ───────────────── ──────────────────
ChatGateway user.joined → NotifListener mail queue
├── /chat namespace message.sent → HistoryListener ├── welcome job
├── room:join room.created → MailListener ├── notification job
├── message:send user.offline └── digest job (cron)
└── typing:start
🔧 Événements WebSocket
// Client → Serveur
socket.emit('room:join', { roomId: 'general' });
socket.emit('room:leave', { roomId: 'general' });
socket.emit('message:send', { roomId, content, type: 'text' | 'image' });
socket.emit('typing:start', { roomId });
socket.emit('typing:stop', { roomId });
// Serveur → Client
socket.on('message:new', (msg) => { ... });
socket.on('user:joined', ({ userId, roomId }) => { ... });
socket.on('user:left', ({ userId, roomId }) => { ... });
socket.on('typing:update', ({ userId, isTyping }) => { ... });
socket.on('notification', ({ type, data }) => { ... });
✅ Fonctionnalités
- Auth JWT dans la Gateway WebSocket (handshake)
- Rooms publiques et privées (DM entre 2 utilisateurs)
- Historique des messages persisté en DB (TypeORM)
- Indicateur de frappe ("X est en train d'écrire...")
- EventEmitter2 pour notifier les services internes
- BullMQ : email de notification (messages manqués si offline)
- Job récurrent (cron) : résumé quotidien des messages non lus