Componentes Backend
Video Controller (video.controller.js)
Descripción: Capa de endpoints REST que maneja todas las requests relacionadas con video en vivo. Actúa como gateway entre el frontend y la lógica de negocio en video.handler.js.
Video Handler (video.handler.js)
Descripción: Núcleo de la lógica de negocio para gestión de sesiones de video. Maneja comunicación PubSub, gestión de BD, cleanup automático y coordinación con Java Service/Media Server.
Funciones Core del Flujo de Video
handleLiveVideoRequest(videoPayload, sessionId)
Función principal para iniciar video en vivo. Ejecutada desde POST /live-video.
// Input videoPayload
{
series: "00D200B144",
channel: 1,
userId: 305,
n9mCenterHandler: true
}
// Output
{
sessionId: "uuid-generado",
status: "pending"
}
Flujo interno:
- Crear sesión:
sessionId = await AddNewSession(videoPayload) - Preparar payload: Agregar
callbackUrlyoperation: 'live_video' - PubSub notification:
await publishMessage(videoPayload) - Update BD: Marcar sesión como
status: 'pending' - Setup cleanup:
setupSessionCleanup(sessionId)(3 minutos)
Comunicación PubSub:
// Mensaje enviado al Java Service
{
series: "00D200B144",
channel: 1,
userId: 305,
sessionId: "uuid",
callbackUrl: "https://api-dev.sils.com.ar:443/live-video/uuid",
operation: "live_video",
n9mCenterHandler: true
}
handleCallback(videoPayload, sessionId)
Callback del Java Service cuando stream está listo. Usado por endpoint POST /live-video/:sessionId.
// Input desde Java Service
{
streamingUrl: 'https://media-dev.sils.com.ar/live/liveflv?deviceid=00D200B144-1&sessionid=uuid';
}
// Proceso:
// 1. Actualizar BD: status = 'ready', streamingUrl
// 2. Validar que streamingUrl no esté vacía
// 3. Return success
Nota: Este flujo está siendo reemplazado por WebSocket notifications.
closeStreamBySession(sessionId)
Cierra stream específico por sessionId. Ejecutada desde POST /close-stream/:sessionId.
Proceso:
- Obtener sesión:
session = await getSession(sessionId) - Delegar cierre:
VideoHandler.closeStream(session)
closeStream({series, channel, n9mCenterHandler})
Cierra stream por serie-canal. Función core para cleanup.
Flujo crítico:
- PubSub notification:
publishMessage({operation: 'close_stream', series, channel}) - Buscar sesiones hermanas:
fetchSiblings({series, channel}) - Cleanup BD: Eliminar todas las sesiones del mismo
series-channel
// Log que vemos en producción
logger.info(`close stream ${JSON.stringify(payload)}`);
// Ejemplo: close stream {"series":"00D200B144","channel":1,"n9mCenterHandler":true,"operation":"close_stream"}
keepAlive(sessionId)
Extiende vida de sesión. Ejecutada desde POST /keep-alive/:sessionId.
Proceso:
- Obtener datos:
session = await getSession(sessionId) - PubSub notification:
publishMessage({operation: 'keep_alive', series, channel, sessionId}) - Update BD:
session.updateAttributes({lastKeepAlive: new Date()})
Java API Client (java-api-client.js)
Descripción: Cliente HTTP para comunicación directa con Java Service. Utilizado principalmente para consultar estado del Media Server y generar URLs de callback.
Función Principal
Proporciona interfaz HTTP para comunicarse con Java Service, separado del flujo principal PubSub. No maneja el streaming de video, solo consultas de estado.
Funciones Core
httpPost(path, payload, host, port)
Cliente HTTP básico para requests al Java Service o Media Server.
// Configuración por defecto
const JAVA_IP = process.env.JAVA_HOST || ''; // IP del Java Service
const JAVA_PORT = process.env.JAVA_PORT || ''; // Puerto del Java Service
// Uso típico desde video.handler
await apiClient.httpPost('/stream-clients', null, '35.244.252.137');
Proceso interno:
- Validación: Si
!JAVA_IP→ skip request silenciosamente - Build options:
BuildRequestOptions()con host/port dinámicos - HTTP request:
http.request()sin timeout - Parse response: JSON.parse() con fallback a string
- Error events:
req.on('error')→ reject Promise
buildCallbackUrl(relativePath, sessionId)
Generador de URLs para callbacks del Java Service al Backend.
// Input
buildCallbackUrl('/live-video/', 'uuid-session');
// Output
('http://api-dev.sils.com.ar:443/live-video/uuid-session');
Uso: Java Service usa esta URL para notificar cuando video está ready (flujo deprecated).
newGuid()
Generador de UUID para identificación de sesiones.
// Output ejemplo
'a1b2c3d4-e5f6-4g7h-i8j9-k0l1m2n3o4p5';
Función BuildRequestOptions(method, path, dataLength, host, port)
Construcción de opciones HTTP con override dinámico de host/port.
const options = {
hostname: host ? host : JAVA_IP, // Override para Media Server
port: port ? port : JAVA_PORT, // Override para Media Server
path: path, // '/sessions' o '/stream-clients'
method: method, // 'POST'
headers: {
'Content-Type': 'application/json',
'Content-Length': dataLength,
},
};
Configuración de Environment
// Variables requeridas
JAVA_HOST= // IP del Java Service
JAVA_PORT= // Puerto del Java Service
CONFIG_HOST= // Host del Backend para callbacks
CONFIG_PORT= // Puerto del Backend para callbacks