guanghulab/status-board/mock-ws-server.js

72 lines
2.7 KiB
JavaScript
Raw Permalink Normal View History

// ========== HoloLake 看板 · Mock WebSocket 服务器 ==========
// 运行node mock-ws-server.js
// 功能每3秒推送一次模拟数据处理心跳
const WebSocket = require('ws');
const PORT = 8080;
const wss = new WebSocket.Server({ port: PORT });
console.log(`[Mock WS] 服务器启动,监听端口 ${PORT}`);
// 模拟数据生成函数
function generateMockData() {
return {
type: 'dashboard_update',
timestamp: new Date().toISOString(),
data: {
system: {
system_status: 'running',
version: 'v0.5.0',
uptime: '73h 22m',
api_calls_today: 187,
active_developers: 7,
last_deploy: '2026-03-05 08:15'
},
developers: [
{ id: 'DEV-001', name: '页页', module: '后端中间层', status: 'active', progress: 100, phase: '环节5·联调' },
{ id: 'DEV-002', name: '肥猫', module: 'M01登录界面', status: 'active', progress: 72, phase: '环节2·等待' },
{ id: 'DEV-003', name: '燕樊', module: 'M15云盘系统', status: 'waiting', progress: 55, phase: '环节1·等SYSLOG' },
{ id: 'DEV-004', name: '之之', module: '钉钉机器人', status: 'waiting', progress: 20, phase: '环节0·等SYSLOG' },
{ id: 'DEV-005', name: '小草莓', module: '系统状态看板', status: 'active', progress: 100, phase: '环节3·WebSocket' },
{ id: 'DEV-009', name: '花尔', module: 'M05用户中心', status: 'active', progress: 48, phase: '环节2·编码' },
{ id: 'DEV-010', name: '桔子', module: 'M06工单管理', status: 'active', progress: 35, phase: '环节1·广播待出' }
],
broadcasts: [
{ id: 'BC-看板-003', dev: '小草莓', module: '系统状态看板', phase: '环节3', status: '执行中', time: '03-05 10:15' },
{ id: 'BC-集成-001-M13', dev: '小草莓', module: 'M13协作调度', phase: '环节1', status: '已完成', time: '03-04 08:38' },
{ id: 'DEV-012', dev: '匆匆那年', module: 'M05用户中心', phase: '环节1', status: '等SYSLOG', time: '03-05 09:22' }
]
}
};
}
wss.on('connection', (ws) => {
console.log('[Mock WS] 客户端已连接');
// 心跳响应
ws.on('message', (message) => {
try {
const data = JSON.parse(message);
if (data.type === 'ping') {
ws.send(JSON.stringify({ type: 'pong' }));
}
} catch (e) {
// 忽略非 JSON 消息
}
});
ws.on('close', () => {
console.log('[Mock WS] 客户端断开');
});
// 每3秒推送一次模拟数据
const interval = setInterval(() => {
if (ws.readyState === WebSocket.OPEN) {
ws.send(JSON.stringify(generateMockData()));
}
}, 3000);
// 清理 interval
ws.on('close', () => clearInterval(interval));
});