29 lines
1.2 KiB
TypeScript
29 lines
1.2 KiB
TypeScript
import WebSocket, { WebSocketServer } from 'ws';
|
|
import { AuthenticatedWebSocket } from './types';
|
|
import { cleanupClientConnection } from './utils';
|
|
|
|
const HEARTBEAT_INTERVAL_MS = 5000; // 保持原始的心跳间隔
|
|
|
|
export function initializeHeartbeat(wss: WebSocketServer): NodeJS.Timeout {
|
|
const heartbeatInterval = setInterval(() => {
|
|
wss.clients.forEach((ws: WebSocket) => {
|
|
const extWs = ws as AuthenticatedWebSocket;
|
|
if (extWs.isAlive === false) {
|
|
console.log(`WebSocket 心跳检测:用户 ${extWs.username} (会话: ${extWs.sessionId}) 连接无响应,正在终止...`);
|
|
cleanupClientConnection(extWs.sessionId); // 使用会话 ID 清理
|
|
return extWs.terminate();
|
|
}
|
|
extWs.isAlive = false;
|
|
extWs.ping(() => {});
|
|
});
|
|
}, HEARTBEAT_INTERVAL_MS);
|
|
|
|
// 当 WebSocket 服务器关闭时,清除心跳定时器
|
|
wss.on('close', () => {
|
|
console.log('WebSocket 服务器正在关闭,清理心跳定时器...');
|
|
clearInterval(heartbeatInterval);
|
|
});
|
|
|
|
console.log(`心跳检测已初始化,间隔: ${HEARTBEAT_INTERVAL_MS}ms`);
|
|
return heartbeatInterval;
|
|
} |