diff --git a/magic-api/src/main/java/org/ssssssss/magicapi/config/MessageType.java b/magic-api/src/main/java/org/ssssssss/magicapi/config/MessageType.java index d01c3df2..b58a74d8 100644 --- a/magic-api/src/main/java/org/ssssssss/magicapi/config/MessageType.java +++ b/magic-api/src/main/java/org/ssssssss/magicapi/config/MessageType.java @@ -19,4 +19,6 @@ public enum MessageType { RESUME_BREAKPOINT, /* 设置 Session ID */ SET_SESSION_ID, + /* 登录 */ + LOGIN } diff --git a/magic-api/src/main/java/org/ssssssss/magicapi/config/WebSocketSessionManager.java b/magic-api/src/main/java/org/ssssssss/magicapi/config/WebSocketSessionManager.java index d609a52d..2fd648d2 100644 --- a/magic-api/src/main/java/org/ssssssss/magicapi/config/WebSocketSessionManager.java +++ b/magic-api/src/main/java/org/ssssssss/magicapi/config/WebSocketSessionManager.java @@ -12,6 +12,7 @@ import org.ssssssss.script.MagicScriptDebugContext; import java.io.IOException; import java.util.Map; +import java.util.Objects; import java.util.concurrent.ConcurrentHashMap; public class WebSocketSessionManager { @@ -29,7 +30,7 @@ public class WebSocketSessionManager { } public static void remove(MagicConsoleSession session) { - if(session.getId() != null){ + if (session.getId() != null) { remove(session.getId()); } } @@ -38,8 +39,29 @@ public class WebSocketSessionManager { SESSION.remove(sessionId); } + public static void sendToAll(MessageType messageType, Object... values) { + String content = buildMessage(messageType, values); + sendToAll(content); + // 通知其他机器去发送消息 + magicNotifyService.sendNotify(new MagicNotify(instanceId, Constants.NOTIFY_WS_S_C, null, content)); + } + + private static void sendToAll(String content) { + SESSION.values().stream().filter(MagicConsoleSession::writeable).forEach(session -> sendBySession(session, content)); + } + public static void sendBySessionId(String sessionId, MessageType messageType, Object... values) { MagicConsoleSession session = findSession(sessionId); + String content = buildMessage(messageType, values); + if (session != null && session.writeable()) { + sendBySession(session, content); + } else if (magicNotifyService != null) { + // 通知其他机器去发送消息 + magicNotifyService.sendNotify(new MagicNotify(instanceId, Constants.NOTIFY_WS_S_C, sessionId, content)); + } + } + + private static String buildMessage(MessageType messageType, Object... values) { StringBuilder builder = new StringBuilder(messageType.name().toLowerCase()); if (values != null) { for (int i = 0, len = values.length; i < len; i++) { @@ -52,22 +74,21 @@ public class WebSocketSessionManager { } } } - if (session != null && session.writeable()) { - sendBySession(session, builder.toString()); - } else if(magicNotifyService != null){ - // 通知其他机器去发送消息 - magicNotifyService.sendNotify(new MagicNotify(instanceId, Constants.NOTIFY_WS_S_C, sessionId, builder.toString())); + return builder.toString(); + } + + public static void sendBySessionId(String sessionId, String content) { + if (sessionId == null) { + sendToAll(content); + } else { + MagicConsoleSession session = findSession(sessionId); + if (session != null) { + sendBySession(session, content); + } } } - public static void sendBySessionId(String sessionId, String content){ - MagicConsoleSession session = findSession(sessionId); - if (session != null) { - sendBySession(session, content); - } - } - - public static void sendBySession(MagicConsoleSession session, String content){ + public static void sendBySession(MagicConsoleSession session, String content) { try { session.getWebSocketSession().sendMessage(new TextMessage(content)); } catch (IOException e) { @@ -76,7 +97,10 @@ public class WebSocketSessionManager { } public static MagicConsoleSession findSession(String sessionId) { - return SESSION.get(sessionId); + return SESSION.values().stream() + .filter(it -> Objects.equals(sessionId, it.getSessionId())) + .findFirst() + .orElse(null); } public static void setMagicNotifyService(MagicNotifyService magicNotifyService) { @@ -87,12 +111,12 @@ public class WebSocketSessionManager { WebSocketSessionManager.instanceId = instanceId; } - public static void createSession(String sessionId, MagicScriptDebugContext debugContext){ - MagicConsoleSession consoleSession = SESSION.get(sessionId); - if(consoleSession == null){ + public static void createSession(String sessionId, MagicScriptDebugContext debugContext) { + MagicConsoleSession consoleSession = findSession(sessionId); + if (consoleSession == null) { consoleSession = new MagicConsoleSession(sessionId, debugContext); SESSION.put(sessionId, consoleSession); - }else{ + } else { consoleSession.setMagicScriptDebugContext(debugContext); } } diff --git a/magic-api/src/main/java/org/ssssssss/magicapi/controller/MagicDebugHandler.java b/magic-api/src/main/java/org/ssssssss/magicapi/controller/MagicDebugHandler.java index 1f5cccee..71b3e75d 100644 --- a/magic-api/src/main/java/org/ssssssss/magicapi/controller/MagicDebugHandler.java +++ b/magic-api/src/main/java/org/ssssssss/magicapi/controller/MagicDebugHandler.java @@ -18,9 +18,7 @@ public class MagicDebugHandler { */ @Message(MessageType.SET_SESSION_ID) public void setSessionId(MagicConsoleSession session, String sessionId) { - WebSocketSessionManager.remove(session); - session.setId(sessionId); - WebSocketSessionManager.add(session); + session.setSessionId(sessionId); } /** diff --git a/magic-api/src/main/java/org/ssssssss/magicapi/controller/MagicWebSocketDispatcher.java b/magic-api/src/main/java/org/ssssssss/magicapi/controller/MagicWebSocketDispatcher.java index 9e154955..903d195d 100644 --- a/magic-api/src/main/java/org/ssssssss/magicapi/controller/MagicWebSocketDispatcher.java +++ b/magic-api/src/main/java/org/ssssssss/magicapi/controller/MagicWebSocketDispatcher.java @@ -46,6 +46,7 @@ public class MagicWebSocketDispatcher extends TextWebSocketHandler { @Override public void afterConnectionClosed(WebSocketSession session, CloseStatus status) { + WebSocketSessionManager.remove(MagicConsoleSession.from(session)); MagicConsoleSession.remove(session); } diff --git a/magic-api/src/main/java/org/ssssssss/magicapi/controller/MagicWorkbenchHandler.java b/magic-api/src/main/java/org/ssssssss/magicapi/controller/MagicWorkbenchHandler.java new file mode 100644 index 00000000..83cdd9ec --- /dev/null +++ b/magic-api/src/main/java/org/ssssssss/magicapi/controller/MagicWorkbenchHandler.java @@ -0,0 +1,28 @@ +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.exception.MagicLoginException; +import org.ssssssss.magicapi.interceptor.AuthorizationInterceptor; +import org.ssssssss.magicapi.model.MagicConsoleSession; + +public class MagicWorkbenchHandler { + + private final AuthorizationInterceptor authorizationInterceptor; + + public MagicWorkbenchHandler(AuthorizationInterceptor authorizationInterceptor) { + this.authorizationInterceptor = authorizationInterceptor; + } + + @Message(MessageType.LOGIN) + public void onLogin(MagicConsoleSession session, String token){ + try { + if(!authorizationInterceptor.requireLogin() || authorizationInterceptor.getUserByToken(token) != null){ + WebSocketSessionManager.add(session); + } + } catch (MagicLoginException ignored) { + + } + } +} diff --git a/magic-api/src/main/java/org/ssssssss/magicapi/logging/MagicLoggerContext.java b/magic-api/src/main/java/org/ssssssss/magicapi/logging/MagicLoggerContext.java index 3e107218..96b6c0f7 100644 --- a/magic-api/src/main/java/org/ssssssss/magicapi/logging/MagicLoggerContext.java +++ b/magic-api/src/main/java/org/ssssssss/magicapi/logging/MagicLoggerContext.java @@ -1,16 +1,7 @@ package org.ssssssss.magicapi.logging; -import org.slf4j.MDC; -import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; import org.ssssssss.magicapi.config.MessageType; import org.ssssssss.magicapi.config.WebSocketSessionManager; -import org.ssssssss.script.MagicScriptContext; -import org.ssssssss.script.MagicScriptDebugContext; - -import java.io.IOException; -import java.util.Map; -import java.util.Objects; -import java.util.concurrent.ConcurrentHashMap; public interface MagicLoggerContext { @@ -28,6 +19,8 @@ public interface MagicLoggerContext { String sessionId = SESSION.get(); if (sessionId != null) { WebSocketSessionManager.sendBySessionId(sessionId, MessageType.LOG, logInfo); + }else{ + WebSocketSessionManager.sendToAll(MessageType.LOG, logInfo); } } diff --git a/magic-api/src/main/java/org/ssssssss/magicapi/model/MagicConsoleSession.java b/magic-api/src/main/java/org/ssssssss/magicapi/model/MagicConsoleSession.java index f34168fc..f4774265 100644 --- a/magic-api/src/main/java/org/ssssssss/magicapi/model/MagicConsoleSession.java +++ b/magic-api/src/main/java/org/ssssssss/magicapi/model/MagicConsoleSession.java @@ -4,24 +4,27 @@ import org.springframework.web.socket.WebSocketSession; import org.ssssssss.script.MagicScriptDebugContext; import java.util.Map; +import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; public class MagicConsoleSession { private static final Map cached = new ConcurrentHashMap<>(); - private String id; + private final String id = UUID.randomUUID().toString(); private WebSocketSession webSocketSession; private MagicScriptDebugContext magicScriptDebugContext; + private String sessionId; + public MagicConsoleSession(WebSocketSession webSocketSession) { this.webSocketSession = webSocketSession; } - public MagicConsoleSession(String id, MagicScriptDebugContext magicScriptDebugContext) { - this.id = id; + public MagicConsoleSession(String sessionId, MagicScriptDebugContext magicScriptDebugContext) { + this.sessionId = sessionId; this.magicScriptDebugContext = magicScriptDebugContext; } @@ -29,10 +32,6 @@ public class MagicConsoleSession { return id; } - public void setId(String id) { - this.id = id; - } - public WebSocketSession getWebSocketSession() { return webSocketSession; } @@ -53,6 +52,14 @@ public class MagicConsoleSession { return webSocketSession != null && webSocketSession.isOpen(); } + public String getSessionId() { + return sessionId; + } + + public void setSessionId(String sessionId) { + this.sessionId = sessionId; + } + public static MagicConsoleSession from(WebSocketSession session){ MagicConsoleSession magicConsoleSession = cached.get(session.getId()); if(magicConsoleSession == null){ diff --git a/magic-editor/src/console/src/components/editor/magic-script-editor.vue b/magic-editor/src/console/src/components/editor/magic-script-editor.vue index 4e691dc4..98df61a4 100644 --- a/magic-editor/src/console/src/components/editor/magic-script-editor.vue +++ b/magic-editor/src/console/src/components/editor/magic-script-editor.vue @@ -199,7 +199,6 @@ export default { bus.$emit('delete-api', this.info) } }) - bus.$on('ws_log', rows => this.onLogReceived(rows[0])) bus.$on('ws_breakpoint', rows => this.onBreakpoint(rows[0])) bus.$on('ws_exception', args => this.onException(args[0])) let javaTypes = { @@ -227,24 +226,6 @@ export default { }) }, methods: { - onLogReceived(row){ - if(this.info){ - row.timestamp = utils.formatDate(new Date()) - let throwable = row.throwable - delete row.throwable - this.info.ext.logs.push(row) - if (throwable) { - let messages = throwable.replace(/ /g, ' ').split('\n'); - for (let i = 0; i < messages.length; i++) { - this.info.ext.logs.push({ - level: row.level, - message: messages[i], - throwable: true - }) - } - } - } - }, onException(args){ if (this.info?.ext?.sessionId === args[0]) { let line = args[2] diff --git a/magic-editor/src/console/src/components/layout/magic-log.vue b/magic-editor/src/console/src/components/layout/magic-log.vue index cc166e59..37fd1099 100644 --- a/magic-editor/src/console/src/components/layout/magic-log.vue +++ b/magic-editor/src/console/src/components/layout/magic-log.vue @@ -11,39 +11,53 @@ @@ -56,7 +70,7 @@ export default { } .ma-log > div > div { - display: inline-block; + display: inline; line-height: 20px; white-space: nowrap; } diff --git a/magic-editor/src/console/src/components/magic-editor.vue b/magic-editor/src/console/src/components/magic-editor.vue index e66b785f..511246c7 100644 --- a/magic-editor/src/console/src/components/magic-editor.vue +++ b/magic-editor/src/console/src/components/magic-editor.vue @@ -109,7 +109,10 @@ export default { } else { link = link + '/' + contants.BASE_URL } - this.websocket = new MagicWebSocket(replaceURL(link.replace(/^http/, 'ws') + '/console')) + bus.$on('login', () => { + this.websocket = new MagicWebSocket(replaceURL(link.replace(/^http/, 'ws') + '/console')) + }) + bus.$on('ws_open', () => bus.$emit('message', 'login', contants.HEADER_MAGIC_TOKEN_VALUE)) contants.DEFAULT_EXPAND = this.config.defaultExpand !== false this.config.version = contants.MAGIC_API_VERSION_TEXT this.config.title = this.config.title || 'magic-api' @@ -195,7 +198,10 @@ export default { this.toolbarIndex = 1 } }) - bus.$on('logout', () => this.showLogin = true) + bus.$on('logout', () => { + this.showLogin = true + this.websocket.close() + }) bus.$on('showLogin', () => this.showLogin = true) this.open() }, diff --git a/magic-editor/src/console/src/scripts/websocket.js b/magic-editor/src/console/src/scripts/websocket.js index 3e70f7d3..bfb5cfe1 100644 --- a/magic-editor/src/console/src/scripts/websocket.js +++ b/magic-editor/src/console/src/scripts/websocket.js @@ -11,6 +11,9 @@ function MagicWebSocket(url) { this.socket.send(msgType) } }) + this.socket.onopen = ()=> { + bus.$emit('ws_open') + } } MagicWebSocket.prototype.on = function (msgType, callback) {