48 lines
1.8 KiB
Java
48 lines
1.8 KiB
Java
package dev.lions.unionflow.server.resource;
|
|
|
|
import io.quarkus.websockets.next.OnClose;
|
|
import io.quarkus.websockets.next.OnOpen;
|
|
import io.quarkus.websockets.next.OnTextMessage;
|
|
import io.quarkus.websockets.next.WebSocket;
|
|
import io.quarkus.websockets.next.WebSocketConnection;
|
|
import org.jboss.logging.Logger;
|
|
|
|
/**
|
|
* Endpoint WebSocket pour le dashboard temps réel.
|
|
* Les clients mobiles et web se connectent ici pour recevoir les mises à jour.
|
|
* Types de messages supportés : stats_update, new_activity, event_update, notification, pong
|
|
*/
|
|
@WebSocket(path = "/ws/dashboard")
|
|
public class DashboardWebSocketEndpoint {
|
|
|
|
private static final Logger LOG = Logger.getLogger(DashboardWebSocketEndpoint.class);
|
|
|
|
@OnOpen
|
|
public String onOpen(WebSocketConnection connection) {
|
|
LOG.infof("WebSocket connection opened: %s", connection.id());
|
|
return "{\"type\":\"connected\",\"data\":{\"message\":\"Connected to UnionFlow Dashboard WebSocket\"}}";
|
|
}
|
|
|
|
@OnTextMessage
|
|
public String onMessage(String message, WebSocketConnection connection) {
|
|
LOG.debugf("WebSocket message received from %s: %s", connection.id(), message);
|
|
|
|
if (message == null) {
|
|
return "{\"type\":\"ack\",\"data\":{\"received\":true}}";
|
|
}
|
|
|
|
// Répondre aux pings avec un pong (heartbeat)
|
|
if ("ping".equalsIgnoreCase(message.trim()) || message.contains("\"type\":\"ping\"")) {
|
|
return "{\"type\":\"pong\",\"data\":{\"timestamp\":" + System.currentTimeMillis() + "}}";
|
|
}
|
|
|
|
// Accusé de réception pour les autres messages
|
|
return "{\"type\":\"ack\",\"data\":{\"received\":true}}";
|
|
}
|
|
|
|
@OnClose
|
|
public void onClose(WebSocketConnection connection) {
|
|
LOG.infof("WebSocket connection closed: %s", connection.id());
|
|
}
|
|
}
|