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
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()
|
|
)
|