62 lines
1.6 KiB
JavaScript
62 lines
1.6 KiB
JavaScript
/**
|
||
* @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; |