// statsSocket.js const WebSocket = require('ws'); const docker = require('../docker/dockerClient'); const calculateCPUPercent = require('../utils/calculateCPU'); let clients = new Set(); function setupWebSocket(server) { const wss = new WebSocket.Server({ server }); wss.on('connection', (ws) => { clients.add(ws); ws.on('close', () => clients.delete(ws)); }); startStatsMonitoring(); } function broadcastStats(data) { clients.forEach(client => { if (client.readyState === WebSocket.OPEN) { client.send(JSON.stringify(data)); } }); } function startStatsMonitoring() { setInterval(async () => { try { const containers = await docker.listContainers(); const statsPromises = containers.map(async (containerInfo) => { try { const container = docker.getContainer(containerInfo.Id); const stats = await container.stats({ stream: false }); return { id: containerInfo.Id, name: containerInfo.Names[0].replace('/', ''), stats: { cpu_percent: calculateCPUPercent(stats), memory: { usage: stats.memory_stats.usage || 0, limit: stats.memory_stats.limit || 0, percent: stats.memory_stats.limit > 0 ? (stats.memory_stats.usage / stats.memory_stats.limit) * 100 : 0 } } }; } catch (error) { return null; } }); const allStats = await Promise.all(statsPromises); const validStats = allStats.filter(stat => stat !== null); broadcastStats({ type: 'stats_update', data: validStats }); } catch (error) {} }, 5000); } module.exports = setupWebSocket;