- Introduced session management using Redis for tracking active sessions. - Added session claiming and releasing functionality in the completion manager. - Enhanced HTTP and WebSocket completion endpoints to support multiple languages. - Implemented request timeout and maximum body size configurations for API routes. - Updated client-side code to handle session IDs and language parameters in completion requests. - Improved error handling for unsupported languages and session conflicts. - Added tests for the completion manager to ensure proper session handling and cleanup.
3.0 KiB
3.0 KiB
Monica LSP Gateway
面向微服务场景的 LSP 网关(Gin),当前支持:
- Go:
gopls - JavaScript / TypeScript:
typescript-language-server --stdio
网关职责:
- 对外提供 HTTP + WebSocket 接口
- 对内通过 JSON-RPC / LSP over stdio 驱动语言服务器
- 按
language + sessionId维护长生命周期会话 - 会话空闲自动回收(TTL)
运行
go mod tidy
go run ./cmd/server
默认地址:http://127.0.0.1:8080
企业化配置(环境变量)
PORT:默认8080WORKSPACE_DIR:LSP 工作目录,默认当前目录CORS_ALLOW_ORIGIN:默认*LSP_API_TOKEN:可选,设置后需在请求头传X-API-KeyREQUEST_TIMEOUT:单请求超时,默认10sMAX_BODY_BYTES:请求体上限,默认2097152(2MB)SESSION_TTL:会话空闲回收时间,默认20mSESSION_CLEANUP_INTERVAL:清理周期,默认2mMAX_SESSIONS:最大会话数,默认256ENABLE_REDIS_STICKY:是否启用 Redis 会话外置与粘性路由,默认trueREDIS_ADDR:默认10.0.0.10:6379REDIS_DB:默认1REDIS_PASSWORD:默认空REDIS_KEY_PREFIX:默认lsp-gatewayINSTANCE_ID:实例唯一标识(建议由部署系统注入)INSTANCE_URL:实例可回源地址(用于路由提示),默认http://127.0.0.1:${PORT}INSTANCE_TTL:实例注册 TTL,默认30sINSTANCE_HEARTBEAT_INTERVAL:实例心跳周期,默认10s
语言服务器命令(可替换为企业内部镜像/封装):
GO_LSP_COMMAND,GO_LSP_ARGSJAVASCRIPT_LSP_COMMAND,JAVASCRIPT_LSP_ARGSTYPESCRIPT_LSP_COMMAND,TYPESCRIPT_LSP_ARGS
默认 JS/TS 命令:
typescript-language-server --stdio
健康检查
GET /healthGET /health/liveGET /health/ready(含当前会话统计)
HTTP 补全接口
POST /api/v1/completions/:language
示例(JavaScript):
{
"sessionId": "editor-1",
"language": "javascript",
"uri": "file:///main.js",
"text": "const a = console.lo",
"line": 0,
"character": 20
}
WebSocket 接口
GET /ws/completionsGET /ws/completions/:language
支持两种消息格式:
- 简化消息:
{
"id": "1",
"sessionId": "editor-1",
"language": "go",
"uri": "file:///main.go",
"text": "package main\n\nimport \"fmt\"\n\nfunc main() {\n\tfmt.Pri\n}",
"line": 5,
"character": 9
}
- JSON-RPC 风格:
{
"jsonrpc": "2.0",
"id": 1,
"method": "completion/complete",
"params": {
"sessionId": "editor-1",
"language": "typescript",
"uri": "file:///main.ts",
"text": "console.lo",
"line": 0,
"character": 10
}
}
备注
line/character为 0-based。uri支持file:///main.go这类相对根路径,网关会映射到WORKSPACE_DIR下。- 前端建议稳定传
sessionId,避免频繁新建语言服务器进程。 - 多实例场景下,如果请求落到非会话所属实例,服务会返回
409并携带routeTo与X-LSP-Route-To。