testando medida de latencia

This commit is contained in:
JotaChina committed 2026-02-24 18:37:46 -03:00
1 parent 2a086e84a0
commit 1aafe3080d
4 files changed
+239 -4634543

No files matched your search

+79 -26
View File
@@ -12,6 +12,8 @@ const pino = require("pino");
const os = require("os");
const crypto = require("crypto");
const { spawn } = require("child_process");
// --- RASTREAMENTO DE USUÁRIOS ---
const activeUsers = {}; // Mapeia socket.id -> { username, room }
//import { LOG_SERVER } from "../utils.js"
const LOG_SERVER = `/var/www/html/trens/src_mmpSearch/logs/creation_logs/server`
@@ -422,50 +424,77 @@ function applyAuthoritativeAction(roomName, action) {
io.on("connection", (socket) => {
console.log(`Novo usuário conectado: ${socket.id}`);
// =======================================
// JOIN ROOM
// =======================================
// =========================================================
// ENTRADA, IDENTIDADE E SINCRONIZAÇÃO DE SALA
// =========================================================
socket.on("join_room", async (data) => {
const { roomName, userName } = data || {};
if (!roomName) {
console.warn(`join_room inválido de ${socket.id} (sem roomName)`);
console.warn(`join_room inválido de ${socket.id}`);
return;
}
// Registra a identidade
const finalUserName = userName || "(sem nome)";
activeUsers[socket.id] = { username: finalUserName, room: roomName };
await socket.join(roomName);
console.log(
`Usuário ${userName || "(sem nome)"} (${
socket.id
}) entrou na sala: ${roomName}`
);
console.log(`[ROOM] 🟢 Usuário ${finalUserName} (${socket.id}) entrou na sala: ${roomName}`);
// Avisa os outros para mostrar o Popup Verde
socket.to(roomName).emit("user_joined", { username: finalUserName, id: socket.id });
// Atualiza o monitor de console
const clientsInRoom = Array.from(io.sockets.adapter.rooms.get(roomName) || []);
io.to(roomName).emit("room_status", {
room: roomName, count: clientsInRoom.length, users: clientsInRoom
});
logMyRooms(socket, "JOIN");
// envia estado salvo do projeto (XML) — compat V4
const room = ensureRoom(roomName);
if (room.projectXml) {
socket.emit("load_project_state", room.projectXml);
console.log(
`Estado XML enviado para ${userName || socket.id} na sala ${roomName}`
);
} else {
console.log(`Sala ${roomName} sem XML salvo ainda.`);
}
// envia snapshot autoritativo do editor de áudio
socket.emit("action_broadcast", {
action: {
type: "AUDIO_SNAPSHOT",
snapshot: room.audio,
__seq: room.seq,
__target: socket.id,
},
action: { type: "AUDIO_SNAPSHOT", snapshot: room.audio, __seq: room.seq, __target: socket.id },
});
socket
.to(roomName)
.emit("feedback", `Usuário ${userName || socket.id} entrou na sala.`);
socket.to(roomName).emit("feedback", `Usuário ${finalUserName} entrou na sala.`);
});
// --- GATILHO DE DESPERTAR ÚNICO ---
socket.on("request_full_sync", ({ room }) => {
const targetRoom = ensureRoom(room);
if (targetRoom && targetRoom.projectXml) {
console.log(`[SYNC] Cliente ${socket.id} acordou e pediu Full Sync da sala ${room}`);
socket.emit("load_project_state", targetRoom.projectXml);
}
});
// =========================================================
// SAÍDA E LIMPEZA UNIFICADA (Aviso e Desconexão)
// =========================================================
socket.on("disconnecting", () => {
const user = activeUsers[socket.id];
if (user) {
console.log(`[ROOM] 🔴 ${user.username} saiu da sala ${user.room}`);
socket.to(user.room).emit("user_left", { username: user.username });
}
});
socket.on("disconnect", () => {
delete activeUsers[socket.id]; // Limpa a identidade
console.log(`Cliente desconectado: ${socket.id}`);
// Remove locks de renderização
for (const [roomName, lockId] of renderLocks.entries()) {
if (lockId === socket.id) {
renderLocks.delete(roomName);
console.log(`Lock de render da sala ${roomName} liberado.`);
}
}
});
// =======================================
// CLOCK SYNC
// =======================================
@@ -627,6 +656,7 @@ io.on("connection", (socket) => {
});
socket.on("disconnect", () => {
delete activeUsers[socket.id]; // Limpa a identidade da memória do servidor
console.log(`Usuário desconectado: ${socket.id}`);
});
});
@@ -745,6 +775,29 @@ function run(cmd, args, { timeoutMs, cwd } = {}) {
});
}
// --- ENDPOINT DE MONITORAMENTO DE SALAS (ADMIN) ---
app.get("/api/admin/salas", (req, res) => {
const roomsData = {};
// Itera por todas as salas ativas na memória do Socket.IO
io.sockets.adapter.rooms.forEach((value, key) => {
// O Socket.IO cria uma "sala" automática para cada usuário.
// Vamos filtrar para mostrar apenas as salas reais do seu sistema.
if (!io.sockets.sockets.has(key)) {
roomsData[key] = {
total_usuarios: value.size,
ids_conectados: Array.from(value)
};
}
});
res.json({
salas_ativas: Object.keys(roomsData).length,
detalhes: roomsData
});
});
// --------------------------------------------------
// trava simples pra não renderizar a mesma sala em paralelo
const renderLocks = new Map();