Este proyecto implementa una aplicación de chat en tiempo real utilizando:
- Frontend: React
- Backend: Node.js con WebSocket (
socket.io) - Base de Datos: Redis (para persistencia temporal de mensajes)
- Establecer comunicación bidireccional entre el backend y frontend mediante WebSockets.
- Generar y mantener un identificador único pseudoaleatorio por sesión del usuario.
- Almacenar mensajes en una lista Redis.
- Recuperar automáticamente los últimos 20 mensajes al iniciar sesión (historial).
- Levantar todos los servicios localmente utilizando Docker Compose.
.
├── backend/
│ ├── index.js
│ ├── security/
│ ├── websocket/
│ └── utils/
├── frontend/
│ ├── src/
│ │ └── components/
│ └── public/
├── docker-compose.yml
└── README.md
Redis:6379Backend:8000Frontend:5173
Formulario simple que incluye:
- Campo de entrada: Nombre de usuario
- Botón: Iniciar
Componentes principales:
- Área de texto para visualizar el historial de mensajes
- Panel lateral o listado de usuarios conectados
- Campo de entrada: Mensaje (para escribir un nuevo mensaje)
- Botón: Send Message (para enviar el mensaje)
- Origen: Cliente
- Parámetros:
data(JSON.stringify({ message: string })) - Función: Genera un alias único, guarda al usuario en el set de conectados, y emite:
user:validate: para informar del alias validado.user:list: lista actual de usuarios conectados.chat:history: historial de últimos 20 mensajes (usando Redis).
- Errores: Emite
errorsi no se puede parsear o manejardata.
- Origen: Cliente
- Parámetros:
data(JSON.stringify({ message: string })) - Función: Emite un mensaje público (
message:public) con el contenido y alias del usuario. Guarda el mensaje en Redis. - Errores: Emite
errorsi falla el parseo o guardado.
- Origen: Automático (desconexión)
- Función: Remueve el alias del conjunto de usuarios conectados y actualiza con
user:list.
- Destino: Todos los clientes
- Contenido: JSON con
{ type: "info", alias: string } - Función: Confirma el alias generado para el usuario.
- Destino: Todos los clientes
- Contenido: JSON con
{ type: "info", users: string[] } - Función: Lista completa de usuarios conectados.
- Destino: Todos los clientes
- Contenido: JSON con
{ type: "history", messages: Mensaje[] } - Función: Envía los últimos 20 mensajes guardados en Redis.
- Destino: Todos los clientes
- Contenido: JSON con
{ type: "public", fromUser: string, message: string } - Función: Mensaje público enviado a todos los usuarios.
- Destino: Todos los clientes
- Contenido: JSON con
{ type: "error", alias: string, message: string } - Función: Indica un error en la operación (parseo, conexión, etc.).
Para compilar y ejecutar el proyecto completo usando Docker:
> docker-compose up -dAccedé a la app en: http://localhost:5173
- 🐳 Docker: ✅
- 🟩 Node.js 22.15.0: ✅
- 🔴 npm 10.8.2: ✅
⚠️ Aunque está implementado un archivo para manejar el CORS, actualmente no está siendo utilizado.⚠️ Las IP y puertos están codificados en el código; deberían manejarse mediante variables de entorno.- 🔄 Luego de un tiempo AFK (inactividad), la conexión se renueva automáticamente y el usuario recibe un nuevo #ID, perdiendo continuidad.
- 🔗 Los hipervínculos enviados al chat no se visualizan correctamente ni como enlaces clicables.
- 📷 No existe la funcionalidad para enviar gifs, imágenes o emojis integrados al chat por el momento.
"""
Este proyecto está licenciado bajo los términos de la Licencia MIT. 📍 Paraná, 2025.