update
This commit is contained in:
@@ -1,34 +1,54 @@
|
||||
import { ref, readonly, onUnmounted } from 'vue';
|
||||
import { useWebSocketConnection } from './useWebSocketConnection'; // 只导入 hook
|
||||
import type { ServerStatus } from '../types/server.types'; // 从类型文件导入
|
||||
import type { WebSocketMessage, MessagePayload } from '../types/websocket.types'; // 从类型文件导入
|
||||
import { ref, readonly, watch, type Ref, ComputedRef } from 'vue'; // 修正导入,移除大写 Readonly, 添加 watch
|
||||
// import { useWebSocketConnection } from './useWebSocketConnection'; // 移除全局导入
|
||||
import type { ServerStatus } from '../types/server.types';
|
||||
import type { WebSocketMessage, MessagePayload } from '../types/websocket.types';
|
||||
|
||||
// --- 接口定义 (已移至 server.types.ts) ---
|
||||
// 定义与 WebSocket 相关的依赖接口
|
||||
export interface StatusMonitorDependencies {
|
||||
onMessage: (type: string, handler: (payload: any, fullMessage?: WebSocketMessage) => void) => () => void;
|
||||
isConnected: ComputedRef<boolean>;
|
||||
}
|
||||
|
||||
export function useStatusMonitor() {
|
||||
const { onMessage, isConnected } = useWebSocketConnection();
|
||||
/**
|
||||
* 创建一个状态监控管理器实例
|
||||
* @param sessionId 会话唯一标识符
|
||||
* @param wsDeps WebSocket 依赖对象
|
||||
* @returns 状态监控管理器实例
|
||||
*/
|
||||
export function createStatusMonitorManager(sessionId: string, wsDeps: StatusMonitorDependencies) {
|
||||
const { onMessage, isConnected } = wsDeps;
|
||||
|
||||
const serverStatus = ref<ServerStatus | null>(null);
|
||||
const statusError = ref<string | null>(null); // 存储状态获取错误
|
||||
|
||||
// --- WebSocket 消息处理 ---
|
||||
const handleStatusUpdate = (payload: MessagePayload, message: WebSocketMessage) => {
|
||||
// console.debug('[状态监控模块] 收到 status_update:', payload);
|
||||
const handleStatusUpdate = (payload: MessagePayload, message?: WebSocketMessage) => {
|
||||
// 检查消息是否属于此会话
|
||||
if (message?.sessionId && message.sessionId !== sessionId) {
|
||||
return; // 忽略不属于此会话的消息
|
||||
}
|
||||
|
||||
// console.debug(`[会话 ${sessionId}][状态监控模块] 收到 status_update:`, JSON.stringify(payload)); // 添加日志
|
||||
if (payload && payload.status) {
|
||||
serverStatus.value = payload.status;
|
||||
statusError.value = null; // 收到有效状态时清除错误
|
||||
} else {
|
||||
console.warn('[状态监控模块] 收到缺少 payload.status 的 status_update 消息');
|
||||
console.warn(`[会话 ${sessionId}][状态监控模块] 收到缺少 payload.status 的 status_update 消息`);
|
||||
// 可以选择设置一个错误状态,表明数据格式不正确
|
||||
// statusError.value = '收到的状态数据格式无效';
|
||||
}
|
||||
};
|
||||
|
||||
// 处理可能的后端状态错误消息 (如果后端会发送的话)
|
||||
const handleStatusError = (payload: MessagePayload, message: WebSocketMessage) => {
|
||||
console.error('[状态监控模块] 收到状态错误消息:', payload);
|
||||
statusError.value = typeof payload === 'string' ? payload : '获取服务器状态时发生未知错误';
|
||||
serverStatus.value = null; // 出错时清除状态数据
|
||||
const handleStatusError = (payload: MessagePayload, message?: WebSocketMessage) => {
|
||||
// 检查消息是否属于此会话
|
||||
if (message?.sessionId && message.sessionId !== sessionId) {
|
||||
return; // 忽略不属于此会话的消息
|
||||
}
|
||||
|
||||
console.error(`[会话 ${sessionId}][状态监控模块] 收到状态错误消息:`, payload);
|
||||
statusError.value = typeof payload === 'string' ? payload : '获取服务器状态时发生未知错误';
|
||||
serverStatus.value = null; // 出错时清除状态数据
|
||||
};
|
||||
|
||||
// --- 注册 WebSocket 消息处理器 ---
|
||||
@@ -36,36 +56,81 @@ export function useStatusMonitor() {
|
||||
let unregisterError: (() => void) | null = null;
|
||||
|
||||
const registerStatusHandlers = () => {
|
||||
// 仅在连接时注册处理器
|
||||
// 防止重复注册
|
||||
if (unregisterUpdate || unregisterError) {
|
||||
console.log(`[会话 ${sessionId}][状态监控模块] 处理器已注册,跳过。`);
|
||||
return;
|
||||
}
|
||||
if (isConnected.value) {
|
||||
console.log('[状态监控模块] 注册状态消息处理器。');
|
||||
console.log(`[会话 ${sessionId}][状态监控模块] 注册状态消息处理器。`);
|
||||
unregisterUpdate = onMessage('status_update', handleStatusUpdate);
|
||||
// 假设后端可能发送 'status:error' 类型的特定错误
|
||||
unregisterError = onMessage('status:error', handleStatusError);
|
||||
} else {
|
||||
console.warn('[状态监控模块] WebSocket 未连接,无法注册状态处理器。');
|
||||
console.warn(`[会话 ${sessionId}][状态监控模块] WebSocket 未连接,无法注册状态处理器。`);
|
||||
}
|
||||
};
|
||||
|
||||
const unregisterAllStatusHandlers = () => {
|
||||
console.log('[状态监控模块] 注销状态消息处理器。');
|
||||
unregisterUpdate?.();
|
||||
unregisterError?.();
|
||||
unregisterUpdate = null;
|
||||
unregisterError = null;
|
||||
if (unregisterUpdate || unregisterError) {
|
||||
console.log(`[会话 ${sessionId}][状态监控模块] 注销状态消息处理器。`);
|
||||
unregisterUpdate?.();
|
||||
unregisterError?.();
|
||||
unregisterUpdate = null;
|
||||
unregisterError = null;
|
||||
}
|
||||
};
|
||||
|
||||
// --- 清理 ---
|
||||
onUnmounted(() => {
|
||||
// 监听连接状态变化以自动注册/注销处理器
|
||||
watch(isConnected, (newValue, oldValue) => {
|
||||
console.log(`[会话 ${sessionId}][状态监控模块] 连接状态变化: ${oldValue} -> ${newValue}`);
|
||||
if (newValue) {
|
||||
registerStatusHandlers();
|
||||
// 连接成功后,可以考虑请求一次初始状态(如果后端支持)
|
||||
// sendMessage({ type: 'status:get', sessionId });
|
||||
} else {
|
||||
unregisterAllStatusHandlers();
|
||||
// 连接断开时清除状态
|
||||
serverStatus.value = null;
|
||||
statusError.value = '连接已断开'; // 或者使用 i18n
|
||||
}
|
||||
}, { immediate: true }); // immediate: true 确保初始状态下也会执行一次
|
||||
|
||||
// --- 清理函数 ---
|
||||
const cleanup = () => {
|
||||
unregisterAllStatusHandlers();
|
||||
console.log('[状态监控模块] Composable 已卸载。');
|
||||
});
|
||||
console.log(`[会话 ${sessionId}][状态监控模块] 已清理。`);
|
||||
};
|
||||
|
||||
// --- 暴露接口 ---
|
||||
return {
|
||||
serverStatus: readonly(serverStatus), // 只读状态
|
||||
statusError: readonly(statusError), // 只读错误状态
|
||||
registerStatusHandlers, // 暴露注册函数
|
||||
unregisterAllStatusHandlers, // 暴露注销函数
|
||||
registerStatusHandlers, // 暴露注册函数,以便在需要时可以重新注册
|
||||
unregisterAllStatusHandlers, // 暴露注销函数,以便在需要时可以手动注销
|
||||
cleanup, // 暴露清理函数,在会话关闭时调用
|
||||
};
|
||||
}
|
||||
|
||||
// 保留兼容旧代码的函数(将在完全迁移后移除)
|
||||
export function useStatusMonitor() {
|
||||
console.warn('⚠️ 使用已弃用的 useStatusMonitor() 全局单例。请迁移到 createStatusMonitorManager() 工厂函数。');
|
||||
|
||||
const serverStatus = ref<ServerStatus | null>(null);
|
||||
const statusError = ref<string | null>(null);
|
||||
|
||||
const registerStatusHandlers = () => {
|
||||
console.warn('[状态监控模块][旧] 调用了已弃用的 registerStatusHandlers');
|
||||
};
|
||||
|
||||
const unregisterAllStatusHandlers = () => {
|
||||
console.warn('[状态监控模块][旧] 调用了已弃用的 unregisterAllStatusHandlers');
|
||||
};
|
||||
|
||||
// 返回与旧接口兼容的空对象,以避免错误
|
||||
return {
|
||||
serverStatus: readonly(serverStatus),
|
||||
statusError: readonly(statusError),
|
||||
registerStatusHandlers,
|
||||
unregisterAllStatusHandlers,
|
||||
};
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user