Saltar al contenido principal

API Reference

Cliente Navegador

RelayConector

Clase helper para facilitar el uso de Relay en el navegador.

const relay = new RelayConector('wss://demo.relay.coderic.net');

Métodos

conectar()

Conecta al servidor Relay.

await relay.conectar();
identificar(userId)

Identifica al usuario con un ID.

await relay.identificar('mi-usuario-123');
enviarAMi(data)

Envía un mensaje solo al emisor.

relay.enviarAMi({ tipo: 'confirmacion', mensaje: 'OK' });
enviarAOtros(data)

Envía un mensaje a todos excepto al emisor.

relay.enviarAOtros({ tipo: 'nuevo_usuario', nombre: 'Juan' });
enviarATodos(data)

Envía un mensaje a todos incluyendo al emisor.

relay.enviarATodos({ tipo: 'mensaje', texto: 'Hola a todos!' });
on(evento, callback)

Escucha eventos.

relay.on('relay', (data) => {
console.log('Mensaje recibido:', data);
});

relay.on('notificar', (data) => {
console.log('Notificación:', data);
});

Socket.io Directo

Si prefieres usar Socket.io directamente:

const socket = io('wss://demo.relay.coderic.net/relay');

// Identificar
socket.emit('identificar', 'mi-usuario', (ok) => {
console.log('Identificado:', ok);
});

// Enviar mensaje
socket.emit('relay', {
destino: 'nosotros',
tipo: 'saludo',
mensaje: 'Hola!'
});

// Recibir mensajes
socket.on('relay', (data) => {
console.log('Mensaje:', data);
});

Cliente Node.js

RelayClient

import { RelayClient } from '@coderic/relay';

const client = new RelayClient('wss://demo.relay.coderic.net');
await client.connect();

// Identificarse
await client.identificar('usuario123');

// Enviar mensajes
client.enviar({ texto: 'Hola mundo!' }, 'nosotros');

// Escuchar mensajes
client.on('mensaje', (data) => {
console.log('Recibido:', data);
});

WebRTCManager (v2.2)

Cliente WebRTC para video/audio en tiempo real.

import { WebRTCManager } from '@coderic/relay';
import io from 'socket.io-client';

const socket = io('http://localhost:5000/relay');
const webrtc = new WebRTCManager(socket);

// Obtener stream local
const stream = await navigator.mediaDevices.getUserMedia({
video: true,
audio: true
});

// Callbacks
webrtc.onRemoteStream = (peerId, stream) => {
videoElement.srcObject = stream;
};

// Unirse a room
await webrtc.setLocalStream(stream);
await webrtc.joinRoom('mi-sala');

Ver documentación completa de WebRTC para más detalles.

Eventos del Cliente

Eventos que puedes emitir

EventoDescripciónPayload
identificarIdentificar usuario(userId, callback)
unirseUnirse a un room (v2.1)(room, callback)
notificarEnviar notificación{ ...data, destino }
relayCanal genérico{ ...data, destino }

Eventos que puedes escuchar

EventoDescripciónPayload
relayMensaje recibido{ ...data, origen }
notificarNotificación recibida{ ...data, origen }
connectConectado al servidor-
disconnectDesconectado-

Destinos

DestinoDescripción
yoSolo al emisor (default)
ustedesA todos menos el emisor
nosotrosA todos incluyendo el emisor
roomA todos en el room especificado (v2.1)

Rooms (v2.1)

Relay soporta rooms para segmentar usuarios en grupos específicos. Un room es simplemente un identificador de string que agrupa conexiones.

Unirse a un room

socket.emit('unirse', 'aulaA', (ok) => {
console.log('Unido a aulaA:', ok);
});

Puedes unirte a múltiples rooms:

socket.emit('unirse', 'aulaA');
socket.emit('unirse', 'Ingenieria');
socket.emit('unirse', 'Directivos');

Enviar a un room

Usa destino: 'room' y especifica el room:

socket.emit('relay', {
destino: 'room',
room: 'aulaA',
tipo: 'mensaje',
texto: 'Hola aula A'
});

También funciona con notificar:

socket.emit('notificar', {
destino: 'room',
room: 'Ingenieria',
tipo: 'aviso',
mensaje: 'Reunión en 5 minutos'
});

Casos de Uso

  • Segmentación por departamento: 'Ingenieria', 'Derecho', 'Directivos'
  • Aulas o grupos: 'aulaA', 'aulaB', 'grupo1'
  • Proyectos: 'proyecto-123', 'sprint-5'
  • Chats grupales: 'chat-general', 'chat-soporte'

Notas

  • Los rooms son temporales: se eliminan automáticamente cuando no hay usuarios
  • Un socket puede estar en múltiples rooms simultáneamente
  • Al desconectar, el socket sale automáticamente de todos los rooms
  • Los rooms funcionan con múltiples instancias gracias al Redis Adapter

Servidor

createRelay(options)

Crea una instancia del gateway.

import { createRelay } from '@coderic/relay';

const gateway = createRelay({
port: 5000,
redis: { url: 'redis://localhost:6379' },
kafka: { brokers: ['localhost:9092'] }
});

await gateway.start();

Eventos del servidor

gateway.on('ready', ({ port }) => {
console.log(`Servidor en puerto ${port}`);
});

gateway.on('connection', (socket) => {
console.log('Nueva conexión:', socket.id);
});

gateway.on('disconnect', ({ socket, reason }) => {
console.log('Desconexión:', socket.id, reason);
});

gateway.on('user:identified', ({ usuario, socketId }) => {
console.log('Usuario identificado:', usuario);
});

gateway.on('message', ({ socket, data }) => {
console.log('Mensaje de', socket.data.usuario, ':', data);
});

gateway.on('notify', ({ socket, data }) => {
console.log('Notificación:', data);
});

gateway.on('redis:connected', () => {
console.log('Redis conectado');
});

gateway.on('kafka:connected', () => {
console.log('Kafka conectado');
});

Endpoints HTTP

EndpointDescripciónRespuesta
/healthHealth checkJSON con estado
/metricsMétricas PrometheusTexto plano

Ejemplo de /health

{
"status": "ok",
"uptime": 3600,
"connections": 42,
"instance": "gateway-1"
}

Estructura de Mensajes

Formato estándar

{
destino: 'nosotros', // 'yo' | 'ustedes' | 'nosotros'
tipo: 'mensaje', // Tu tipo personalizado
// ... tus datos personalizados
}

Ejemplo completo

// Enviar
relay.enviarATodos({
tipo: 'pedido',
pedidoId: 'ABC123',
estado: 'preparando',
timestamp: Date.now()
});

// Recibir
relay.on('relay', (data) => {
if (data.tipo === 'pedido') {
console.log('Pedido:', data.pedidoId, data.estado);
}
});