Saltar al contenido principal

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:

  1. Crear sesión: sessionId = await AddNewSession(videoPayload)
  2. Preparar payload: Agregar callbackUrl y operation: 'live_video'
  3. PubSub notification: await publishMessage(videoPayload)
  4. Update BD: Marcar sesión como status: 'pending'
  5. 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:

  1. Obtener sesión: session = await getSession(sessionId)
  2. Delegar cierre: VideoHandler.closeStream(session)

closeStream({series, channel, n9mCenterHandler})​

Cierra stream por serie-canal. Función core para cleanup.

Flujo crítico:

  1. PubSub notification: publishMessage({operation: 'close_stream', series, channel})
  2. Buscar sesiones hermanas: fetchSiblings({series, channel})
  3. 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:

  1. Obtener datos: session = await getSession(sessionId)
  2. PubSub notification: publishMessage({operation: 'keep_alive', series, channel, sessionId})
  3. 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:

  1. Validación: Si !JAVA_IP → skip request silenciosamente
  2. Build options: BuildRequestOptions() con host/port dinámicos
  3. HTTP request: http.request() sin timeout
  4. Parse response: JSON.parse() con fallback a string
  5. 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