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