You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

66 lines
2.6 KiB

"""
WebSocket API模块(最小版)
仅提供:创建并连接客户端、断开客户端
"""
from fastapi import APIRouter, HTTPException, status
from datetime import datetime
from app.core.websocket.manager import websocket_manager
from app.schemas.websocket import (
CreateWebSocketClientRequest,
SuccessResponse
)
from app.core.config.settings import config
from app.utils.api_decorators import handle_api_errors
from app.utils.structured_log import get_structured_logger, LogLevel
logger = get_structured_logger(__name__, LogLevel.INFO)
router = APIRouter()
def now_iso() -> str:
return datetime.now().isoformat()
# 创建并连接客户端
@router.post("/websocket/clients", summary="创建并连接WebSocket客户端", response_model=SuccessResponse)
@handle_api_errors
async def create_and_connect_client(request: CreateWebSocketClientRequest):
"""创建客户端并立即连接"""
client = await websocket_manager.create_client(request.name, request.url)
success = await websocket_manager.connect_client(request.name)
if not success:
raise HTTPException(
status_code=status.HTTP_400_BAD_REQUEST,
detail=f"WebSocket客户端 {request.name} 创建或连接失败"
)
# 确保默认Channels存在并连接,创建适配器
default_channels = ["default", "system", "events"] # 默认Channel列表
max_channel_size = 1000 # 默认Channel大小
for ch in default_channels:
channel = websocket_manager.get_channel(ch)
if not channel:
channel = await websocket_manager.create_channel(ch, max_channel_size)
await channel.connect()
await websocket_manager.create_adapter(request.name, ch, request.heartbeat_interval)
return SuccessResponse(
message=f"WebSocket客户端 {request.name} 创建并连接成功",
data={"name": request.name, "url": request.url, "status": "connected", "heartbeat_interval": request.heartbeat_interval},
timestamp=now_iso()
)
# 断开客户端
@router.post("/websocket/clients/{name}/disconnect", summary="断开WebSocket客户端", response_model=SuccessResponse)
@handle_api_errors
async def disconnect_client(name: str):
"""断开已存在客户端"""
success = await websocket_manager.disconnect_client(name)
if not success:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail=f"WebSocket客户端 {name} 不存在或已断开"
)
return SuccessResponse(
message=f"WebSocket客户端 {name} 断开成功",
timestamp=now_iso()
)