浏览代码

WebSocket调整、DEBUG调整

mxd 3 年之前
父节点
当前提交
12d93eade4

+ 1 - 0
magic-api-spring-boot-starter/src/main/java/org/ssssssss/magicapi/spring/boot/starter/MagicAPIAutoConfiguration.java

@@ -641,6 +641,7 @@ public class MagicAPIAutoConfiguration implements WebMvcConfigurer, WebSocketCon
 			registerWebsocket = true;
 			MagicWebSocketDispatcher dispatcher = new MagicWebSocketDispatcher(properties.getClusterConfig().getInstanceId(), magicNotifyService, Arrays.asList(
 					new MagicDebugHandler(),
+					new MagicCoordinationHandler(),
 					new MagicWorkbenchHandler(authorizationInterceptorProvider.getIfAvailable(this::createAuthorizationInterceptor))
 			));
 			WebSocketHandlerRegistration registration = webSocketHandlerRegistry.addHandler(dispatcher, web + "/console");

+ 1 - 1
magic-api/src/main/java/org/ssssssss/magicapi/config/MagicCorsFilter.java

@@ -36,7 +36,7 @@ public class MagicCorsFilter implements Filter {
 	@Override
 	public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
 		HttpServletRequest request = (HttpServletRequest) req;
-		if (StringUtils.isNotBlank(Constants.HEADER_REQUEST_SESSION_ID)) {
+		if (StringUtils.isNotBlank(Constants.HEADER_REQUEST_CLIENT_ID)) {
 			process(request, (HttpServletResponse) resp);
 		}
 		chain.doFilter(req, resp);

+ 7 - 3
magic-api/src/main/java/org/ssssssss/magicapi/config/MessageType.java

@@ -13,14 +13,16 @@ public enum MessageType {
 	BREAKPOINT,
 	/* 请求接口发生异常 */
 	EXCEPTION,
-	/* 发送给客户端的sessionId */
-	SESSION_ID,
+	/* 登录结果 */
+	LOGIN_RESPONSE,
 	/* 通知客户端,有用户上线 */
 	USER_LOGIN,
 	/* 通知客户端,有用户下线 */
 	USER_LOGOUT,
 	/* 通知客户端,当前机器在线人数 */
 	ONLINE_USERS,
+	/* 通知客户端,他人进入文件*/
+	INTO_FILE_ID,
 
 	/* C -> S message */
 	/* 设置断点 */
@@ -30,5 +32,7 @@ public enum MessageType {
 	/* 登录 */
 	LOGIN,
 	/* 获取当前在线用户 */
-	GET_ONLINE
+	GET_ONLINE,
+	/* 设置当前所在文件 */
+	SET_FILE_ID
 }

+ 27 - 18
magic-api/src/main/java/org/ssssssss/magicapi/config/WebSocketSessionManager.java

@@ -36,7 +36,7 @@ public class WebSocketSessionManager {
 	private static final List<Pair<String, String>> MESSAGE_CACHE = new ArrayList<>(200);
 
 	public static void add(MagicConsoleSession session) {
-		SESSIONS.put(session.getId(), session);
+		SESSIONS.put(session.getClientId(), session);
 	}
 
 	static{
@@ -49,8 +49,8 @@ public class WebSocketSessionManager {
 	}
 
 	public static void remove(MagicConsoleSession session) {
-		if (session.getId() != null) {
-			remove(session.getId());
+		if (session.getClientId() != null) {
+			remove(session.getClientId());
 		}
 	}
 
@@ -65,7 +65,7 @@ public class WebSocketSessionManager {
 
 	private static void sendToAll(String content) {
 		SESSIONS.values().stream().filter(MagicConsoleSession::writeable).forEach(session -> sendBySession(session, content));
-		sendToOther(null, content);
+		sendToMachine(null, content);
 	}
 
 	public static void sendLogs(String sessionId, String message) {
@@ -84,11 +84,11 @@ public class WebSocketSessionManager {
 				messages = MESSAGE_CACHE.stream().collect(Collectors.groupingBy(Pair::getFirst, Collectors.mapping(Pair::getSecond, Collectors.toList())));
 				MESSAGE_CACHE.clear();
 			}
-			messages.forEach((sessionId, logs) -> {
+			messages.forEach((clientId, logs) -> {
 				if (logs.size() > 1) {
-					sendBySessionId(sessionId, MessageType.LOGS, logs);
+					sendByClientId(clientId, MessageType.LOGS, logs);
 				} else {
-					sendBySessionId(sessionId, MessageType.LOG, logs.get(0));
+					sendByClientId(clientId, MessageType.LOG, logs.get(0));
 				}
 			});
 		} catch (Exception e) {
@@ -96,20 +96,29 @@ public class WebSocketSessionManager {
 		}
 	}
 
-	public static void sendBySessionId(String sessionId, MessageType messageType, Object... values) {
-		MagicConsoleSession session = findSession(sessionId);
+	public static void sendByClientId(String clientId, MessageType messageType, Object... values) {
+		MagicConsoleSession session = findSession(clientId);
 		String content = buildMessage(messageType, values);
 		if (session != null && session.writeable()) {
 			sendBySession(session, content);
 		} else {
-			sendToOther(sessionId, content);
+			sendToMachine(clientId, content);
 		}
 	}
 
-	private static void sendToOther(String sessionId, String content) {
+	public static void sendToOther(String excludeClientId, MessageType messageType, Object... values) {
+		String content = buildMessage(messageType, values);
+		SESSIONS.values().stream()
+				.filter(MagicConsoleSession::writeable)
+				.filter(it -> !it.getClientId().equals(excludeClientId))
+				.forEach(session -> sendBySession(session, content));
+		sendToMachine(null, content);
+	}
+
+	private static void sendToMachine(String clientId, String content) {
 		if (magicNotifyService != null) {
 			// 通知其他机器去发送消息
-			magicNotifyService.sendNotify(new MagicNotify(instanceId, EventAction.WS_S_C, sessionId, content));
+			magicNotifyService.sendNotify(new MagicNotify(instanceId, EventAction.WS_S_C, clientId, content));
 		}
 	}
 
@@ -129,11 +138,11 @@ public class WebSocketSessionManager {
 		return builder.toString();
 	}
 
-	public static void sendBySessionId(String sessionId, String content) {
-		if (sessionId == null) {
+	public static void sendByClientId(String clientId, String content) {
+		if (clientId == null) {
 			sendToAll(content);
 		} else {
-			MagicConsoleSession session = findSession(sessionId);
+			MagicConsoleSession session = findSession(clientId);
 			if (session != null) {
 				sendBySession(session, content);
 			}
@@ -143,7 +152,7 @@ public class WebSocketSessionManager {
 	public static void sendBySession(MagicConsoleSession session, String content) {
 		try {
 			if (session != null) {
-				synchronized (session.getId()) {
+				synchronized (session.getClientId()) {
 					session.getWebSocketSession().sendMessage(new TextMessage(content));
 				}
 			}
@@ -152,9 +161,9 @@ public class WebSocketSessionManager {
 		}
 	}
 
-	public static MagicConsoleSession findSession(String sessionId) {
+	public static MagicConsoleSession findSession(String clientId) {
 		return SESSIONS.values().stream()
-				.filter(it -> Objects.equals(sessionId, it.getId()))
+				.filter(it -> Objects.equals(clientId, it.getClientId()))
 				.findFirst()
 				.orElse(null);
 	}

+ 16 - 0
magic-api/src/main/java/org/ssssssss/magicapi/controller/MagicCoordinationHandler.java

@@ -0,0 +1,16 @@
+package org.ssssssss.magicapi.controller;
+
+import org.ssssssss.magicapi.config.Message;
+import org.ssssssss.magicapi.config.MessageType;
+import org.ssssssss.magicapi.config.WebSocketSessionManager;
+import org.ssssssss.magicapi.model.Constants;
+import org.ssssssss.magicapi.model.MagicConsoleSession;
+
+public class MagicCoordinationHandler {
+
+	@Message(MessageType.SET_FILE_ID)
+	public void setFileId(MagicConsoleSession session, String fileId) {
+		session.setAttribute(Constants.WEBSOCKET_ATTRIBUTE_FILE_ID, fileId);
+		WebSocketSessionManager.sendToOther(session.getClientId(), MessageType.INTO_FILE_ID, session.getAttribute(Constants.WEBSOCKET_ATTRIBUTE_CLIENT_ID), fileId);
+	}
+}

+ 2 - 2
magic-api/src/main/java/org/ssssssss/magicapi/controller/MagicDebugHandler.java

@@ -26,7 +26,7 @@ public class MagicDebugHandler {
 	 */
 	@Message(MessageType.SET_BREAKPOINT)
 	public boolean setBreakPoint(MagicConsoleSession session, String scriptId, String breakpoints) {
-		MagicScriptDebugContext context = WebSocketSessionManager.findMagicScriptContext(session.getId() + scriptId);
+		MagicScriptDebugContext context = WebSocketSessionManager.findMagicScriptContext(session.getClientId() + scriptId);
 		if (context != null) {
 			context.setBreakpoints(Stream.of(breakpoints.split(",")).map(Integer::valueOf).collect(Collectors.toList()));
 			return true;
@@ -40,7 +40,7 @@ public class MagicDebugHandler {
 	 */
 	@Message(MessageType.RESUME_BREAKPOINT)
 	public boolean resumeBreakpoint(MagicConsoleSession session, String scriptId, String stepInto, String breakpoints) {
-		MagicScriptDebugContext context = WebSocketSessionManager.findMagicScriptContext(session.getId() + scriptId);
+		MagicScriptDebugContext context = WebSocketSessionManager.findMagicScriptContext(session.getClientId() + scriptId);
 		if (context != null) {
 			context.setStepInto("1".equals(stepInto));
 			if (StringUtils.isNotBlank(breakpoints)) {

+ 2 - 5
magic-api/src/main/java/org/ssssssss/magicapi/controller/MagicWebSocketDispatcher.java

@@ -103,10 +103,7 @@ public class MagicWebSocketDispatcher extends TextWebSocketHandler {
 		MagicConsoleSession mcsession = MagicConsoleSession.from(session);
 		WebSocketSessionManager.remove(mcsession);
 		MagicConsoleSession.remove(session);
-		MagicUser user = (MagicUser) mcsession.getAttribute("user");
-		if(user != null){
-			WebSocketSessionManager.sendToAll(MessageType.USER_LOGOUT, Arrays.asList(mcsession.getId(), mcsession.getAttribute("ip"), user));
-		}
+		WebSocketSessionManager.sendToAll(MessageType.USER_LOGOUT, mcsession.getAttributes());
 	}
 
 	@Override
@@ -115,7 +112,7 @@ public class MagicWebSocketDispatcher extends TextWebSocketHandler {
 		Object returnValue = findHandleAndInvoke(consoleSession, message.getPayload());
 		// 如果未成功处理消息,则通知其他机器去处理消息
 		if (Boolean.FALSE.equals(returnValue)) {
-			magicNotifyService.sendNotify(new MagicNotify(instanceId, EventAction.WS_C_S, consoleSession.getId(), message.getPayload()));
+			magicNotifyService.sendNotify(new MagicNotify(instanceId, EventAction.WS_C_S, consoleSession.getClientId(), message.getPayload()));
 		}
 	}
 }

+ 13 - 12
magic-api/src/main/java/org/ssssssss/magicapi/controller/MagicWorkbenchHandler.java

@@ -6,11 +6,11 @@ import org.ssssssss.magicapi.config.WebSocketSessionManager;
 import org.ssssssss.magicapi.exception.MagicLoginException;
 import org.ssssssss.magicapi.interceptor.AuthorizationInterceptor;
 import org.ssssssss.magicapi.interceptor.MagicUser;
+import org.ssssssss.magicapi.model.Constants;
 import org.ssssssss.magicapi.model.MagicConsoleSession;
 
-import java.net.InetSocketAddress;
-import java.util.Arrays;
 import java.util.List;
+import java.util.Map;
 import java.util.Optional;
 import java.util.stream.Collectors;
 
@@ -30,20 +30,21 @@ public class MagicWorkbenchHandler {
 	}
 
 	@Message(MessageType.LOGIN)
-	public void onLogin(MagicConsoleSession session, String token) {
+	public void onLogin(MagicConsoleSession session, String token, String clientId) {
 		try {
 			MagicUser user = guest;
 			if (!authorizationInterceptor.requireLogin() || (user = authorizationInterceptor.getUserByToken(token)) != null) {
 				String ip = Optional.ofNullable(session.getWebSocketSession().getRemoteAddress()).map(it -> it.getAddress().getHostAddress()).orElse("unknown");
-				session.setAttribute("user", user);
-				session.setAttribute("ip", ip);
+				session.setAttribute(Constants.WEBSOCKET_ATTRIBUTE_USER_ID, user.getId());
+				session.setAttribute(Constants.WEBSOCKET_ATTRIBUTE_USER_IP, ip);
+				session.setAttribute(Constants.WEBSOCKET_ATTRIBUTE_USER_NAME, user.getUsername());
+				session.setClientId(clientId);
 				WebSocketSessionManager.add(session);
-				List<Object> messages = Arrays.asList(session.getId(), ip, user);
-				WebSocketSessionManager.sendBySession(session, WebSocketSessionManager.buildMessage(MessageType.SESSION_ID, messages));
-				WebSocketSessionManager.sendToAll(MessageType.USER_LOGIN, messages);
+				WebSocketSessionManager.sendBySession(session, WebSocketSessionManager.buildMessage(MessageType.LOGIN_RESPONSE, "1", session.getAttributes()));
+				WebSocketSessionManager.sendToAll(MessageType.USER_LOGIN, session.getAttributes());
 			}
 		} catch (MagicLoginException ignored) {
-
+			WebSocketSessionManager.sendBySession(session, WebSocketSessionManager.buildMessage(MessageType.LOGIN_RESPONSE, "0"));
 		}
 	}
 
@@ -51,10 +52,10 @@ public class MagicWorkbenchHandler {
 	public boolean getOnline(MagicConsoleSession session) {
 		List<MagicConsoleSession> sessions = WebSocketSessionManager.getSessions();
 		if(sessions.size() > 0){
-			List<List<Object>> messages = sessions.stream()
-					.map(it -> Arrays.asList(it.getId(), it.getAttribute("ip"), it.getAttribute("user")))
+			List<Map<String, Object>> messages = sessions.stream()
+					.map(MagicConsoleSession::getAttributes)
 					.collect(Collectors.toList());
-			WebSocketSessionManager.sendBySessionId(session.getId(), WebSocketSessionManager.buildMessage(MessageType.ONLINE_USERS, messages));
+			WebSocketSessionManager.sendByClientId(session.getClientId(), WebSocketSessionManager.buildMessage(MessageType.ONLINE_USERS, messages));
 		}
 		return false;
 	}

+ 5 - 5
magic-api/src/main/java/org/ssssssss/magicapi/controller/RequestHandler.java

@@ -93,7 +93,7 @@ public class RequestHandler extends MagicController {
 		String sessionId = null;
 		Map<String, Object> headers = new LinkedCaseInsensitiveMap<>();
 		headers.putAll(defaultHeaders);
-		boolean requestedFromTest = configuration.isEnableWeb() && (sessionId = request.getHeader(HEADER_REQUEST_SESSION_ID)) != null && request.getHeader(HEADER_REQUEST_SCRIPT_ID) != null;
+		boolean requestedFromTest = configuration.isEnableWeb() && (sessionId = request.getHeader(HEADER_REQUEST_CLIENT_ID)) != null && request.getHeader(HEADER_REQUEST_SCRIPT_ID) != null;
 		RequestEntity requestEntity = RequestEntity.create()
 				.info(requestMagicDynamicRegistry.getApiInfoFromRequest(request))
 				.request(request)
@@ -168,7 +168,7 @@ public class RequestHandler extends MagicController {
 			return afterCompletion(requestEntity, value);
 		}
 		if (requestedFromTest) {
-			String sessionAndScriptId = requestEntity.getRequestedSessionId() + requestEntity.getRequestedScriptId();
+			String sessionAndScriptId = requestEntity.getRequestedClientId() + requestEntity.getRequestedScriptId();
 			try {
 				if (context instanceof MagicScriptDebugContext) {
 					WebSocketSessionManager.addMagicScriptContext(sessionAndScriptId, (MagicScriptDebugContext) context);
@@ -358,7 +358,7 @@ public class RequestHandler extends MagicController {
 		} while ((parent = parent.getCause()) != null);
 		if (se != null && requestEntity.isRequestedFromTest()) {
 			Span.Line line = se.getLine();
-			WebSocketSessionManager.sendBySessionId(requestEntity.getRequestedSessionId(), EXCEPTION, Arrays.asList(
+			WebSocketSessionManager.sendByClientId(requestEntity.getRequestedClientId(), EXCEPTION, Arrays.asList(
 					requestEntity.getRequestedScriptId(),
 					se.getSimpleMessage(),
 					line == null ? null : Arrays.asList(line.getLineNumber(), line.getEndLineNumber(), line.getStartCol(), line.getEndCol())
@@ -402,7 +402,7 @@ public class RequestHandler extends MagicController {
 		if (requestEntity.isRequestedFromDebug() && breakpoints.size() > 0) {
 			MagicScriptDebugContext debugContext = new MagicScriptDebugContext(requestEntity.getRequestedBreakpoints());
 			String scriptId = requestEntity.getRequestedScriptId();
-			String sessionId = requestEntity.getRequestedSessionId();
+			String clientId = requestEntity.getRequestedClientId();
 			debugContext.setTimeout(configuration.getDebugTimeout());
 			debugContext.setId(scriptId);
 			debugContext.setCallback(variables -> {
@@ -410,7 +410,7 @@ public class RequestHandler extends MagicController {
 				varList.stream().filter(it -> it.containsKey("value")).forEach(variable -> {
 					variable.put("value", JsonUtils.toJsonStringWithoutLog(variable.get("value")));
 				});
-				WebSocketSessionManager.sendBySessionId(sessionId, BREAKPOINT, scriptId, variables);
+				WebSocketSessionManager.sendByClientId(clientId, BREAKPOINT, scriptId, variables);
 			});
 			context = debugContext;
 		} else {

+ 11 - 1
magic-api/src/main/java/org/ssssssss/magicapi/model/Constants.java

@@ -74,7 +74,7 @@ public class Constants {
 
 	public static final String HEADER_REQUEST_SCRIPT_ID = "Magic-Request-Script-Id";
 
-	public static final String HEADER_REQUEST_SESSION_ID = "Magic-Request-Session-Id";
+	public static final String HEADER_REQUEST_CLIENT_ID = "Magic-Request-Client-Id";
 
 	public static final String HEADER_REQUEST_BREAKPOINTS = "Magic-Request-Breakpoints";
 
@@ -96,6 +96,16 @@ public class Constants {
 
 	public static final String EVENT_SOURCE_NOTIFY = "notify";
 
+	public static final String WEBSOCKET_ATTRIBUTE_FILE_ID = "fileId";
+
+	public static final String WEBSOCKET_ATTRIBUTE_USER_ID = "id";
+
+	public static final String WEBSOCKET_ATTRIBUTE_USER_NAME = "username";
+
+	public static final String WEBSOCKET_ATTRIBUTE_USER_IP = "ip";
+
+	public static final String WEBSOCKET_ATTRIBUTE_CLIENT_ID = "cid";
+
 	/**
 	 * 执行成功的code值
 	 */

+ 13 - 3
magic-api/src/main/java/org/ssssssss/magicapi/model/MagicConsoleSession.java

@@ -11,7 +11,7 @@ public class MagicConsoleSession {
 
 	private static final Map<String, MagicConsoleSession> cached = new ConcurrentHashMap<>();
 
-	private final String id = UUID.randomUUID().toString();
+	private String clientId;
 
 	private final WebSocketSession webSocketSession;
 
@@ -21,8 +21,8 @@ public class MagicConsoleSession {
 		this.webSocketSession = webSocketSession;
 	}
 
-	public String getId() {
-		return id;
+	public String getClientId() {
+		return clientId;
 	}
 
 	public WebSocketSession getWebSocketSession() {
@@ -49,7 +49,17 @@ public class MagicConsoleSession {
 	public Object getAttribute(String key){
 		return attributes.get(key);
 	}
+
 	public void setAttribute(String key, Object value){
 		attributes.put(key, value);
 	}
+
+	public Map<String, Object> getAttributes(){
+		return attributes;
+	}
+
+	public void setClientId(String clientId) {
+		this.clientId = clientId;
+		setAttribute(Constants.WEBSOCKET_ATTRIBUTE_CLIENT_ID, clientId);
+	}
 }

+ 9 - 9
magic-api/src/main/java/org/ssssssss/magicapi/model/MagicNotify.java

@@ -30,9 +30,9 @@ public class MagicNotify {
 	private String type = null;
 
 	/**
-	 * WebSocket sessionId
+	 * WebSocket clientId
 	 */
-	private String sessionId;
+	private String clientId;
 
 	/**
 	 * WebSocket消息内容
@@ -46,9 +46,9 @@ public class MagicNotify {
 		this.from = from;
 	}
 
-	public MagicNotify(String from, EventAction action, String sessionId, String content) {
+	public MagicNotify(String from, EventAction action, String clientId, String content) {
 		this.from = from;
-		this.sessionId = sessionId;
+		this.clientId = clientId;
 		this.action = action;
 		this.content = content;
 	}
@@ -92,12 +92,12 @@ public class MagicNotify {
 		this.type = type;
 	}
 
-	public String getSessionId() {
-		return sessionId;
+	public String getClientId() {
+		return clientId;
 	}
 
-	public void setSessionId(String sessionId) {
-		this.sessionId = sessionId;
+	public void setClientId(String clientId) {
+		this.clientId = clientId;
 	}
 
 	public String getContent() {
@@ -115,7 +115,7 @@ public class MagicNotify {
 				", id='" + id + '\'' +
 				", action=" + action +
 				", type='" + type + '\'' +
-				", sessionId='" + sessionId + '\'' +
+				", clientId='" + clientId + '\'' +
 				", content='" + content + '\'' +
 				'}';
 	}

+ 3 - 3
magic-api/src/main/java/org/ssssssss/magicapi/model/RequestEntity.java

@@ -142,10 +142,10 @@ public class RequestEntity {
 	}
 
 	/**
-	 * 获取测试sessionId
+	 * 获取测试clientId
 	 */
-	public String getRequestedSessionId() {
-		return request.getHeader(HEADER_REQUEST_SESSION_ID);
+	public String getRequestedClientId() {
+		return request.getHeader(HEADER_REQUEST_CLIENT_ID);
 	}
 
 	/**

+ 6 - 6
magic-api/src/main/java/org/ssssssss/magicapi/provider/impl/DefaultMagicAPIService.java

@@ -184,9 +184,9 @@ public class DefaultMagicAPIService implements MagicAPIService, JsonCodeConstant
 		logger.info("收到通知消息:{}", magicNotify);
 		switch (magicNotify.getAction()) {
 			case WS_C_S:
-				return processWebSocketMessageReceived(magicNotify.getSessionId(), magicNotify.getContent());
+				return processWebSocketMessageReceived(magicNotify.getClientId(), magicNotify.getContent());
 			case WS_S_C:
-				return processWebSocketSendMessage(magicNotify.getSessionId(), magicNotify.getContent());
+				return processWebSocketSendMessage(magicNotify.getClientId(), magicNotify.getContent());
 			case CLEAR:
 				publisher.publishEvent(new MagicEvent("clear", EventAction.CLEAR, Constants.EVENT_SOURCE_NOTIFY));
 		}
@@ -203,13 +203,13 @@ public class DefaultMagicAPIService implements MagicAPIService, JsonCodeConstant
 		return "magic";
 	}
 
-	private boolean processWebSocketSendMessage(String sessionId, String content) {
-		WebSocketSessionManager.sendBySessionId(sessionId, content);
+	private boolean processWebSocketSendMessage(String clientId, String content) {
+		WebSocketSessionManager.sendByClientId(clientId, content);
 		return true;
 	}
 
-	private boolean processWebSocketMessageReceived(String sessionId, String content) {
-		MagicWebSocketDispatcher.processMessageReceived(sessionId, content);
+	private boolean processWebSocketMessageReceived(String clientId, String content) {
+		MagicWebSocketDispatcher.processMessageReceived(clientId, content);
 		return true;
 	}
 }