Files
MonocoEditor-With-Lsp-Backend/backend/README.md
meowrain 57afb90bc0 feat: enhance completion service with session management and language support
- 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.
2026-02-15 16:22:01 +08:00

3.0 KiB
Raw Blame History

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:默认 8080
  • WORKSPACE_DIRLSP 工作目录,默认当前目录
  • CORS_ALLOW_ORIGIN:默认 *
  • LSP_API_TOKEN:可选,设置后需在请求头传 X-API-Key
  • REQUEST_TIMEOUT:单请求超时,默认 10s
  • MAX_BODY_BYTES:请求体上限,默认 20971522MB
  • SESSION_TTL:会话空闲回收时间,默认 20m
  • SESSION_CLEANUP_INTERVAL:清理周期,默认 2m
  • MAX_SESSIONS:最大会话数,默认 256
  • ENABLE_REDIS_STICKY:是否启用 Redis 会话外置与粘性路由,默认 true
  • REDIS_ADDR:默认 10.0.0.10:6379
  • REDIS_DB:默认 1
  • REDIS_PASSWORD:默认空
  • REDIS_KEY_PREFIX:默认 lsp-gateway
  • INSTANCE_ID:实例唯一标识(建议由部署系统注入)
  • INSTANCE_URL:实例可回源地址(用于路由提示),默认 http://127.0.0.1:${PORT}
  • INSTANCE_TTL:实例注册 TTL默认 30s
  • INSTANCE_HEARTBEAT_INTERVAL:实例心跳周期,默认 10s

语言服务器命令(可替换为企业内部镜像/封装):

  • GO_LSP_COMMANDGO_LSP_ARGS
  • JAVASCRIPT_LSP_COMMANDJAVASCRIPT_LSP_ARGS
  • TYPESCRIPT_LSP_COMMANDTYPESCRIPT_LSP_ARGS

默认 JS/TS 命令:

  • typescript-language-server --stdio

健康检查

  • GET /health
  • GET /health/live
  • GET /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/completions
  • GET /ws/completions/:language

支持两种消息格式:

  1. 简化消息:
{
  "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
}
  1. 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 并携带 routeToX-LSP-Route-To