package com.example.fercoganbackend.component; import org.springframework.stereotype.Component; import org.springframework.web.socket.CloseStatus; import org.springframework.web.socket.TextMessage; import org.springframework.web.socket.WebSocketSession; import org.springframework.web.socket.handler.TextWebSocketHandler; import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.CopyOnWriteArraySet; @Component public class EventoWebSocketHandler extends TextWebSocketHandler { private final Map> sesionesPorRemate = new ConcurrentHashMap<>(); @Override public void afterConnectionEstablished(WebSocketSession session) { String remateId = session.getUri().getPath().split("/")[3]; sesionesPorRemate .computeIfAbsent(remateId, k -> new CopyOnWriteArraySet<>()) .add(session); System.out.println("[EVENTOS] Cliente conectado al remate: " + remateId); } @Override public void afterConnectionClosed(WebSocketSession session, CloseStatus status) { String remateId = session.getUri().getPath().split("/")[3]; sesionesPorRemate.getOrDefault(remateId, Set.of()).remove(session); System.out.println("[EVENTOS] Cliente desconectado: " + remateId); } public void enviarEvento(String remateId, String mensaje) { Set sesiones = sesionesPorRemate.get(remateId); if (sesiones == null) return; for (WebSocketSession session : sesiones) { try { if (session.isOpen()) { session.sendMessage(new TextMessage(mensaje)); } } catch (Exception e) { e.printStackTrace(); } } } }