testando medida de latencia
This commit is contained in:
1 parent
2a086e84a0
commit
1aafe3080d
4 files changed
+239
-4634543
No files matched your search
@@ -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();
|
||||
|
||||
|
||||
Reference in new issue
Block a user