Files
sse-server/routes/stream.js
2025-07-09 10:15:07 +08:00

62 lines
1.6 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* @file SSE流路由处理器
* @author Yk <yk_9001@icloud.com>
* @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;
// 增加解析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 失败
});
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);
// 立即发送确认
res.write(`data: ${JSON.stringify({
status: 'connected',
clientId,
clientCount: clients.size(),
time: timestamp.formatTime()
})}\n\n`);
clients.add(clientId, res);
req.on('close', () => {
clients.remove(clientId);
});
});
module.exports = router;