Files
claude-code/src/main/java/com/claudecode/server/WebSocketServerConfig.java
T
abel533andCopilot b98675f643 feat: Server Mode with WebSocket direct connect (Phase 3A)
- DirectConnectServer: lifecycle management, auth token, port config
- DirectConnectWebSocketHandler: WebSocket handler with session management
- ServerSession: per-connection AgentLoop with permission forwarding
- ServerMessage: 7-type JSON protocol (user/assistant/result/control/interrupt/keep_alive/error)
- ServerModeAutoConfiguration: conditional Spring config with @EnableWebSocket
- WebSocketServerConfig: endpoint registration and container settings
- ClaudeCodeApplication: --server flag detection, web-application-type override
- ClaudeCodeRunner: skip TUI in server mode, block on shutdown signal
- pom.xml: added spring-boot-starter-websocket dependency

Server mode: --server [--server-port=12321] [--server-token=xxx]
Env vars: CLAUDE_CODE_SERVER_MODE, CLAUDE_CODE_SERVER_PORT, CLAUDE_CODE_SERVER_TOKEN

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-04-05 10:18:57 +08:00

50 lines
1.8 KiB
Java

package com.claudecode.server;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;
import org.springframework.web.socket.server.standard.ServletServerContainerFactoryBean;
/**
* Server Mode 的 WebSocket 配置 —— 仅在 --server 模式下激活。
* <p>
* 注册 {@link DirectConnectWebSocketHandler} 到 /ws 端点。
* <p>
* 对应 claude-code 的 Server Mode 功能:
* <ul>
* <li>WebSocket 端点: ws://localhost:{port}/ws</li>
* <li>允许所有来源连接(本地开发用,生产环境应限制)</li>
* <li>最大消息 1MB</li>
* </ul>
*/
public class WebSocketServerConfig implements WebSocketConfigurer {
private static final Logger log = LoggerFactory.getLogger(WebSocketServerConfig.class);
private final DirectConnectWebSocketHandler handler;
public WebSocketServerConfig(DirectConnectWebSocketHandler handler) {
this.handler = handler;
}
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry.addHandler(handler, "/ws")
.setAllowedOrigins("*");
log.info("WebSocket handler registered at /ws");
}
/**
* 配置 WebSocket 容器参数。
*/
public static ServletServerContainerFactoryBean createWebSocketContainer() {
ServletServerContainerFactoryBean container = new ServletServerContainerFactoryBean();
container.setMaxTextMessageBufferSize(1024 * 1024); // 1MB
container.setMaxBinaryMessageBufferSize(1024 * 1024);
container.setMaxSessionIdleTimeout(300_000L); // 5 分钟空闲超时
return container;
}
}