import { Router } from 'express'; import { db } from '../db/client'; import { mediaConfig } from '../media/config'; import { mediaProvider } from '../media/service'; import { sfuService } from '../media/sfu/service'; import { getAllMetrics } from '../observability/metrics'; import { minioBucket, minioClient } from '../utils/minio'; const router = Router(); router.get('/live', (_req, res) => { res.json({ status: 'ok', service: 'backend', timestamp: new Date().toISOString() }); }); router.get('/ready', async (_req, res) => { try { await db.execute('select 1'); await minioClient.bucketExists(minioBucket); const sfu = sfuService; const sfuSessions = sfu ? await sfu.listSessions() : []; const sfuSessionIds = sfuSessions.map((session) => session.streamSessionId); const sfuTransports = sfu ? (await Promise.all(sfuSessionIds.map(async (streamSessionId) => await sfu.listTransports(streamSessionId)))).flat() : []; const sfuProducers = sfu ? (await Promise.all(sfuSessionIds.map(async (streamSessionId) => await sfu.listProducers(streamSessionId)))).flat() : []; const sfuConsumers = sfu ? (await Promise.all(sfuSessionIds.map(async (streamSessionId) => await sfu.listConsumers(streamSessionId)))).flat() : []; res.json({ status: 'ready', checks: { database: 'ok', minio: 'ok', mediaMode: mediaConfig.mode, mediaProvider: mediaProvider.name, sfuService: sfuService ? sfuService.mode : 'disabled', sfuActiveSessions: sfuSessions.filter((session) => session.state !== 'ended').length, sfuTransports: sfuTransports.length, sfuProducers: sfuProducers.length, sfuConsumers: sfuConsumers.length, }, timestamp: new Date().toISOString(), }); } catch (error) { res.status(503).json({ status: 'not_ready', error: error instanceof Error ? error.message : 'unknown error', timestamp: new Date().toISOString(), }); } }); router.get('/metrics', (_req, res) => { res.json({ timestamp: new Date().toISOString(), metrics: getAllMetrics(), }); }); export default router;