141 lines
4.9 KiB
Python
141 lines
4.9 KiB
Python
"""
|
|
WebSocket事件处理
|
|
实时推送研究进度
|
|
"""
|
|
from flask_socketio import emit, join_room, leave_room
|
|
from flask import request
|
|
import logging
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
def register_handlers(socketio):
|
|
"""注册WebSocket事件处理器"""
|
|
|
|
@socketio.on('connect')
|
|
def handle_connect():
|
|
"""客户端连接"""
|
|
client_id = request.sid
|
|
logger.info(f"客户端连接: {client_id}")
|
|
emit('connected', {'message': '连接成功', 'client_id': client_id})
|
|
|
|
@socketio.on('disconnect')
|
|
def handle_disconnect():
|
|
"""客户端断开"""
|
|
client_id = request.sid
|
|
logger.info(f"客户端断开: {client_id}")
|
|
|
|
@socketio.on('join_session')
|
|
def handle_join_session(data):
|
|
"""加入研究会话房间"""
|
|
session_id = data.get('session_id')
|
|
if session_id:
|
|
join_room(session_id)
|
|
logger.info(f"客户端 {request.sid} 加入房间 {session_id}")
|
|
emit('joined', {'session_id': session_id, 'message': '已加入研究会话'})
|
|
|
|
@socketio.on('leave_session')
|
|
def handle_leave_session(data):
|
|
"""离开研究会话房间"""
|
|
session_id = data.get('session_id')
|
|
if session_id:
|
|
leave_room(session_id)
|
|
logger.info(f"客户端 {request.sid} 离开房间 {session_id}")
|
|
emit('left', {'session_id': session_id, 'message': '已离开研究会话'})
|
|
|
|
# 以下是推送给客户端的事件(由任务调用)
|
|
|
|
@socketio.on('research_progress')
|
|
def broadcast_progress(data):
|
|
"""广播研究进度"""
|
|
session_id = data.get('session_id')
|
|
if session_id:
|
|
socketio.emit('progress_update', data, room=session_id)
|
|
|
|
@socketio.on('research_status_change')
|
|
def broadcast_status_change(data):
|
|
"""广播状态变化"""
|
|
session_id = data.get('session_id')
|
|
if session_id:
|
|
socketio.emit('status_changed', data, room=session_id)
|
|
|
|
@socketio.on('subtopic_update')
|
|
def broadcast_subtopic_update(data):
|
|
"""广播子主题更新"""
|
|
session_id = data.get('session_id')
|
|
if session_id:
|
|
socketio.emit('subtopic_updated', data, room=session_id)
|
|
|
|
@socketio.on('search_result')
|
|
def broadcast_search_result(data):
|
|
"""广播搜索结果"""
|
|
session_id = data.get('session_id')
|
|
if session_id:
|
|
socketio.emit('new_search_result', data, room=session_id)
|
|
|
|
@socketio.on('report_ready')
|
|
def broadcast_report_ready(data):
|
|
"""广播报告就绪"""
|
|
session_id = data.get('session_id')
|
|
if session_id:
|
|
socketio.emit('report_available', data, room=session_id)
|
|
|
|
@socketio.on('error_occurred')
|
|
def broadcast_error(data):
|
|
"""广播错误信息"""
|
|
session_id = data.get('session_id')
|
|
if session_id:
|
|
socketio.emit('research_error', data, room=session_id)
|
|
|
|
def emit_progress(socketio, session_id: str, progress_data: dict):
|
|
"""发送进度更新(供任务调用)"""
|
|
socketio.emit('progress_update', {
|
|
'session_id': session_id,
|
|
**progress_data
|
|
}, room=session_id)
|
|
|
|
def emit_status_change(socketio, session_id: str, status: str, phase: str = None):
|
|
"""发送状态变化(供任务调用)"""
|
|
data = {
|
|
'session_id': session_id,
|
|
'status': status
|
|
}
|
|
if phase:
|
|
data['phase'] = phase
|
|
|
|
socketio.emit('status_changed', data, room=session_id)
|
|
|
|
def emit_subtopic_progress(socketio, session_id: str, subtopic_id: str,
|
|
progress: float, status: str):
|
|
"""发送子主题进度(供任务调用)"""
|
|
socketio.emit('subtopic_updated', {
|
|
'session_id': session_id,
|
|
'subtopic_id': subtopic_id,
|
|
'progress': progress,
|
|
'status': status
|
|
}, room=session_id)
|
|
|
|
def emit_search_complete(socketio, session_id: str, subtopic_id: str,
|
|
search_count: int, results_count: int):
|
|
"""发送搜索完成通知(供任务调用)"""
|
|
socketio.emit('search_completed', {
|
|
'session_id': session_id,
|
|
'subtopic_id': subtopic_id,
|
|
'search_count': search_count,
|
|
'results_count': results_count
|
|
}, room=session_id)
|
|
|
|
def emit_report_ready(socketio, session_id: str, report_type: str):
|
|
"""发送报告就绪通知(供任务调用)"""
|
|
socketio.emit('report_available', {
|
|
'session_id': session_id,
|
|
'report_type': report_type,
|
|
'message': f'{report_type}报告已生成'
|
|
}, room=session_id)
|
|
|
|
def emit_error(socketio, session_id: str, error_message: str, error_type: str = 'general'):
|
|
"""发送错误通知(供任务调用)"""
|
|
socketio.emit('research_error', {
|
|
'session_id': session_id,
|
|
'error_type': error_type,
|
|
'error_message': error_message
|
|
}, room=session_id) |