# Conflicts:
#	shine-UI/js/app.js
This commit is contained in:
AidarKC
2026-04-22 14:58:28 +03:00
20 changed files with 1094 additions and 37 deletions
@@ -145,6 +145,14 @@ public final class ActiveConnectionsRegistry {
return (set == null) ? Set.of() : set; // CopyOnWriteArraySet можно отдавать как есть
}
/**
* Снимок всех активных контекстов на текущий момент.
*/
public Set<ConnectionContext> getAllConnectionsSnapshot() {
return Set.copyOf(bySessionId.values());
}
private static String toLoginKey(String login) {
return login.trim().toLowerCase(Locale.ROOT);
}
@@ -80,8 +80,10 @@ import server.logic.ws_protocol.JSON.messages.entyties.Net_UpsertPushToken_Reque
// --- NEW: Ping ---
import server.logic.ws_protocol.JSON.handlers.system.Net_GetServerInfo_Handler;
import server.logic.ws_protocol.JSON.handlers.system.Net_ClientErrorLog_Handler;
import server.logic.ws_protocol.JSON.handlers.system.Net_ClientDebugLog_Handler;
import server.logic.ws_protocol.JSON.handlers.system.Net_Ping_Handler;
import server.logic.ws_protocol.JSON.handlers.system.entyties.Net_ClientErrorLog_Request;
import server.logic.ws_protocol.JSON.handlers.system.entyties.Net_ClientDebugLog_Request;
import server.logic.ws_protocol.JSON.handlers.system.entyties.Net_GetServerInfo_Request;
import server.logic.ws_protocol.JSON.handlers.system.entyties.Net_Ping_Request;
@@ -143,7 +145,8 @@ public final class JsonHandlerRegistry {
// --- system ---
Map.entry("Ping", new Net_Ping_Handler()),
Map.entry("GetServerInfo", new Net_GetServerInfo_Handler()),
Map.entry("ClientErrorLog", new Net_ClientErrorLog_Handler())
Map.entry("ClientErrorLog", new Net_ClientErrorLog_Handler()),
Map.entry("ClientDebugLog", new Net_ClientDebugLog_Handler())
// --- subscriptions ---
// Map.entry("ListSubscribedChannels", new Net_GetSubscribedChannels_Handler())
@@ -195,7 +198,8 @@ public final class JsonHandlerRegistry {
// --- system ---
Map.entry("Ping", Net_Ping_Request.class),
Map.entry("GetServerInfo", Net_GetServerInfo_Request.class),
Map.entry("ClientErrorLog", Net_ClientErrorLog_Request.class)
Map.entry("ClientErrorLog", Net_ClientErrorLog_Request.class),
Map.entry("ClientDebugLog", Net_ClientDebugLog_Request.class)
);
private JsonHandlerRegistry() { }
@@ -0,0 +1,49 @@
package server.logic.ws_protocol.JSON.handlers.system;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import server.debug.DebugRunLogBuffer;
import server.logic.ws_protocol.JSON.ConnectionContext;
import server.logic.ws_protocol.JSON.entyties.Net_Request;
import server.logic.ws_protocol.JSON.entyties.Net_Response;
import server.logic.ws_protocol.JSON.handlers.JsonMessageHandler;
import server.logic.ws_protocol.JSON.handlers.system.entyties.Net_ClientDebugLog_Request;
import server.logic.ws_protocol.JSON.handlers.system.entyties.Net_ClientDebugLog_Response;
import server.logic.ws_protocol.JSON.utils.NetExceptionResponseFactory;
import server.logic.ws_protocol.WireCodes;
public class Net_ClientDebugLog_Handler implements JsonMessageHandler {
private static final Logger log = LoggerFactory.getLogger(Net_ClientDebugLog_Handler.class);
@Override
public Net_Response handle(Net_Request baseRequest, ConnectionContext ctx) {
Net_ClientDebugLog_Request req = (Net_ClientDebugLog_Request) baseRequest;
String message = safe(req.getMessage());
if (message.isBlank()) {
return NetExceptionResponseFactory.error(req, WireCodes.Status.BAD_REQUEST, "BAD_FIELDS", "Поле message обязательно");
}
String runId = safe(req.getRunId());
String level = safe(req.getLevel());
String sessionId = safe(ctx != null ? ctx.getSessionId() : "");
String login = safe(ctx != null ? ctx.getLogin() : "");
String details = safe(req.getDetails());
DebugRunLogBuffer.getInstance().add(level, runId, "client", sessionId, login, message, details);
log.info("CLIENT_DEBUG runId={} level={} login={} sessionId={} message={} details={}",
runId, level, login, sessionId, message, details);
Net_ClientDebugLog_Response resp = new Net_ClientDebugLog_Response();
resp.setOp(req.getOp());
resp.setRequestId(req.getRequestId());
resp.setStatus(WireCodes.Status.OK);
resp.setAccepted(true);
resp.setServerTs(System.currentTimeMillis());
return resp;
}
private static String safe(String value) {
return value == null ? "" : value.trim();
}
}
@@ -0,0 +1,22 @@
package server.logic.ws_protocol.JSON.handlers.system.entyties;
import server.logic.ws_protocol.JSON.entyties.Net_Request;
public class Net_ClientDebugLog_Request extends Net_Request {
private String runId;
private String level;
private String message;
private String details;
public String getRunId() { return runId; }
public void setRunId(String runId) { this.runId = runId; }
public String getLevel() { return level; }
public void setLevel(String level) { this.level = level; }
public String getMessage() { return message; }
public void setMessage(String message) { this.message = message; }
public String getDetails() { return details; }
public void setDetails(String details) { this.details = details; }
}
@@ -0,0 +1,14 @@
package server.logic.ws_protocol.JSON.handlers.system.entyties;
import server.logic.ws_protocol.JSON.entyties.Net_Response;
public class Net_ClientDebugLog_Response extends Net_Response {
private boolean accepted;
private long serverTs;
public boolean isAccepted() { return accepted; }
public void setAccepted(boolean accepted) { this.accepted = accepted; }
public long getServerTs() { return serverTs; }
public void setServerTs(long serverTs) { this.serverTs = serverTs; }
}