/** * @file SSE流路由处理器 * @author Yk * @createdAt 2025-07-01 * @lastModifiedAt 2025-07-01 * @description 处理SSE连接建立和维持 */ const express = require('express'); const {v4: uuidV4} = require('uuid'); const {setupSSEHeaders} = require('../lib/sse'); const clients = require('../lib/clients'); const timestamp = require('../utils/timeFormatter'); const jwt = require('jsonwebtoken'); const config = require('../config'); // 引入配置 const router = express.Router(); router.get('/', (req, res) => { const { token } = req.query; // 增加解析token逻辑, if (!token) { res.status(401).json({message: 'Unauthorized: Token missing'}); return; } // 解析Token 提取客户端ID let clientId try { // 解析Token并验证签名: // const decoded = jwt.verify(token, config.jwt.jwtSecret, { // algorithms: ['HS256'], // clockTolerance: 15, // 防止 Hyperf 生成后立即验证因 nbf 失败 // }); const decoded = jwt.decode(token); clientId = decoded.claims?.user_client_id || decoded.sub || uuidV4(); } catch (err) { res.status(401).json({ message: 'Unauthorized: Invalid token', error: err.message }); return; } setupSSEHeaders(res); const initialData = { status: 'connected', clientId, time: timestamp.formatTime() }; // 立即发送确认 res.write(`data: ${JSON.stringify(initialData)}\n\n`); clients.add(clientId, res); req.on('close', () => { clients.remove(clientId); }); }); module.exports = router;