codex-ai-platform / api /lib /socket.ts
3v324v23's picture
chore: 彻底清理项目,符合 Hugging Face 部署规范
ae4ceef
import { Server as SocketServer } from 'socket.io';
import { Server as HttpServer } from 'http';
import jwt from 'jsonwebtoken';
let io: SocketServer | null = null;
const JWT_SECRET = process.env.JWT_SECRET || 'codex_secret_fallback';
export const initSocket = (server: HttpServer) => {
io = new SocketServer(server, {
cors: {
origin: '*',
methods: ['GET', 'POST']
}
});
// 增加 JWT 鉴权中间件
io.use((socket, next) => {
const token = socket.handshake.auth.token || socket.handshake.headers.token;
if (!token) return next(new Error('未授权'));
try {
const decoded = jwt.verify(token, JWT_SECRET) as any;
(socket as any).user = decoded;
next();
} catch (err) {
next(new Error('Token 无效'));
}
});
io.on('connection', (socket) => {
const user = (socket as any).user;
console.log(`[Socket] 用户已认证并连接: ${user.email} (ID: ${socket.id})`);
// 自动加入用户专属房间
socket.join(`user:${user.userId}`);
socket.on('disconnect', () => {
console.log(`[Socket] 用户断开: ${user.email}`);
});
});
return io;
};
export const getIO = () => {
if (!io) throw new Error('Socket.io 未初始化');
return io;
};
/**
* 推送实时通知给特定用户
*/
export const notifyUser = (userId: string, event: string, data: any) => {
if (io) {
io.to(`user:${userId}`).emit(event, data);
}
};
/**
* 推送广播给所有管理员
*/
export const broadcastAdmin = (event: string, data: any) => {
if (io) {
// 假设管理员在一个特定的房间,或者直接广播
io.emit(`admin:${event}`, data);
}
};