Skip to content

Commit 9174136

Browse files
committed
feat: añadir soporte para rooms (canales tipo room)
- Añadir evento 'unirse' para unirse a rooms - Añadir destino 'room' en eventos relay y notificar - Actualizar documentación con ejemplos de uso - Mantener compatibilidad total con API existente - Versión 2.1 Closes #2
1 parent ad851a9 commit 9174136

4 files changed

Lines changed: 111 additions & 4 deletions

File tree

README.md

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@ socket.on('relay', (data) => {
9898
| Evento | Descripción | Payload |
9999
|--------|-------------|---------|
100100
| `identificar` | Identificar usuario | `(userId, callback)` |
101+
| `unirse` | Unirse a un room (v2.1) | `(room, callback)` |
101102
| `notificar` | Enviar notificación | `{ ...data, destino }` |
102103
| `relay` | Canal genérico | `{ ...data, destino }` |
103104

@@ -108,6 +109,22 @@ socket.on('relay', (data) => {
108109
| `yo` | Solo al emisor (default) |
109110
| `ustedes` | A todos menos el emisor |
110111
| `nosotros` | A todos incluyendo el emisor |
112+
| `room` | A todos en el room especificado (v2.1) |
113+
114+
### Ejemplo con Rooms
115+
116+
```javascript
117+
// Unirse a un room
118+
socket.emit('unirse', 'aulaA');
119+
120+
// Enviar a ese room
121+
socket.emit('relay', {
122+
destino: 'room',
123+
room: 'aulaA',
124+
tipo: 'mensaje',
125+
texto: 'Hola aula A'
126+
});
127+
```
111128

112129
## Configuración
113130

docs/docs/api.md

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,7 @@ client.on('mensaje', (data) => {
120120
| Evento | Descripción | Payload |
121121
|--------|-------------|---------|
122122
| `identificar` | Identificar usuario | `(userId, callback)` |
123+
| `unirse` | Unirse a un room (v2.1) | `(room, callback)` |
123124
| `notificar` | Enviar notificación | `{ ...data, destino }` |
124125
| `relay` | Canal genérico | `{ ...data, destino }` |
125126

@@ -139,6 +140,65 @@ client.on('mensaje', (data) => {
139140
| `yo` | Solo al emisor (default) |
140141
| `ustedes` | A todos menos el emisor |
141142
| `nosotros` | A todos incluyendo el emisor |
143+
| `room` | A todos en el room especificado (v2.1) |
144+
145+
## Rooms (v2.1)
146+
147+
Relay soporta rooms para segmentar usuarios en grupos específicos. Un room es simplemente un identificador de string que agrupa conexiones.
148+
149+
### Unirse a un room
150+
151+
```javascript
152+
socket.emit('unirse', 'aulaA', (ok) => {
153+
console.log('Unido a aulaA:', ok);
154+
});
155+
```
156+
157+
Puedes unirte a múltiples rooms:
158+
159+
```javascript
160+
socket.emit('unirse', 'aulaA');
161+
socket.emit('unirse', 'Ingenieria');
162+
socket.emit('unirse', 'Directivos');
163+
```
164+
165+
### Enviar a un room
166+
167+
Usa `destino: 'room'` y especifica el `room`:
168+
169+
```javascript
170+
socket.emit('relay', {
171+
destino: 'room',
172+
room: 'aulaA',
173+
tipo: 'mensaje',
174+
texto: 'Hola aula A'
175+
});
176+
```
177+
178+
También funciona con `notificar`:
179+
180+
```javascript
181+
socket.emit('notificar', {
182+
destino: 'room',
183+
room: 'Ingenieria',
184+
tipo: 'aviso',
185+
mensaje: 'Reunión en 5 minutos'
186+
});
187+
```
188+
189+
### Casos de Uso
190+
191+
- **Segmentación por departamento**: `'Ingenieria'`, `'Derecho'`, `'Directivos'`
192+
- **Aulas o grupos**: `'aulaA'`, `'aulaB'`, `'grupo1'`
193+
- **Proyectos**: `'proyecto-123'`, `'sprint-5'`
194+
- **Chats grupales**: `'chat-general'`, `'chat-soporte'`
195+
196+
### Notas
197+
198+
- Los rooms son temporales: se eliminan automáticamente cuando no hay usuarios
199+
- Un socket puede estar en múltiples rooms simultáneamente
200+
- Al desconectar, el socket sale automáticamente de todos los rooms
201+
- Los rooms funcionan con múltiples instancias gracias al Redis Adapter
142202

143203
## Servidor
144204

docs/docs/intro.md

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ Relay es un **gateway de comunicación en tiempo real** diseñado para ser **inm
88

99
El gateway no cambia. Todos los proyectos usan la misma API:
1010

11-
- **3 eventos**: `identificar`, `notificar`, `relay`
12-
- **3 destinos**: `yo`, `ustedes`, `nosotros`
11+
- **4 eventos**: `identificar`, `unirse`, `notificar`, `relay`
12+
- **4 destinos**: `yo`, `ustedes`, `nosotros`, `room`
1313
- **Sin configuración**: El gateway no necesita saber qué tipo de aplicación estás construyendo
1414

1515
### 🎯 Agnóstico
@@ -33,8 +33,20 @@ await relay.conectar();
3333
// 2. Identificar
3434
await relay.identificar('mi-usuario-123');
3535

36-
// 3. Enviar y recibir
36+
// 3. Unirse a un room (v2.1)
37+
socket.emit('unirse', 'aulaA');
38+
39+
// 4. Enviar y recibir
3740
relay.enviarATodos({ tipo: 'saludo', mensaje: 'Hola!' });
41+
42+
// 5. Enviar a un room específico
43+
socket.emit('relay', {
44+
destino: 'room',
45+
room: 'aulaA',
46+
tipo: 'mensaje',
47+
texto: 'Hola aula A'
48+
});
49+
3850
relay.on('relay', (data) => console.log(data));
3951
```
4052

src/Relay.js

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,18 @@
11
/**
2-
* Coderic Relay v2.0
2+
* Coderic Relay v2.1
33
* Real-time messaging infrastructure - Versión como paquete npm
44
*
55
* API de eventos:
66
* - identificar: Identificar usuario
7+
* - unirse: Unirse a un room
78
* - notificar: Enviar notificaciones
89
* - relay: Canal de mensajes genérico
910
*
1011
* Destinos:
1112
* - yo: Solo al emisor
1213
* - ustedes: A todos menos el emisor
1314
* - nosotros: A todos incluyendo el emisor
15+
* - room: A todos en el room especificado
1416
*/
1517

1618
import { createServer } from 'http';
@@ -372,6 +374,12 @@ export class Relay extends EventEmitter {
372374
self.publishToKafka('user_connected', { usuario, socketId: socket.id });
373375
});
374376

377+
// EVENTO: unirse
378+
socket.on('unirse', function(room, fn) {
379+
socket.join(room);
380+
if (typeof fn === 'function') fn(true);
381+
});
382+
375383
// EVENTO: notificar
376384
socket.on('notificar', function(data) {
377385
if (self.metricsMessages) {
@@ -391,6 +399,11 @@ export class Relay extends EventEmitter {
391399
case 'nosotros':
392400
self.namespace.emit('notificar', data);
393401
break;
402+
case 'room':
403+
if (data.room) {
404+
self.namespace.to(data.room).emit('notificar', data);
405+
}
406+
break;
394407
default: // "yo"
395408
socket.emit('notificar', data);
396409
break;
@@ -438,6 +451,11 @@ export class Relay extends EventEmitter {
438451
case 'nosotros':
439452
self.namespace.emit('relay', data);
440453
break;
454+
case 'room':
455+
if (data.room) {
456+
self.namespace.to(data.room).emit('relay', data);
457+
}
458+
break;
441459
default: // "yo"
442460
socket.emit('relay', data);
443461
break;

0 commit comments

Comments
 (0)