|
|
@@ -1,33 +1,13 @@
|
|
|
// src/server/socket.ts
|
|
|
-import { Server, Socket } from 'socket.io';
|
|
|
+import { Server } from 'socket.io';
|
|
|
+import { createSocketAuthMiddleware } from './socket/middleware/auth.middleware';
|
|
|
+import { ExamHandler } from './socket/handlers/exam.handler';
|
|
|
|
|
|
/**
|
|
|
* Socket.IO 认证中间件
|
|
|
* 可以在这里实现基于 token 或其他方式的认证
|
|
|
*/
|
|
|
-export const authMiddleware = async (socket: Socket, next: (err?: Error) => void) => {
|
|
|
- try {
|
|
|
- // 从握手信息中获取认证数据
|
|
|
- const token = socket.handshake.auth.token;
|
|
|
-
|
|
|
- if (!token) {
|
|
|
- return next(new Error('未提供认证令牌'));
|
|
|
- }
|
|
|
-
|
|
|
- // 实现你的认证逻辑
|
|
|
- // 例如: 验证 JWT 令牌
|
|
|
- // const user = await verifyToken(token);
|
|
|
-
|
|
|
- // 如果认证成功,可以将用户信息附加到 socket 对象
|
|
|
- // socket.data.user = user;
|
|
|
-
|
|
|
- console.log(`客户端认证成功: ${socket.id}`);
|
|
|
- next();
|
|
|
- } catch (err) {
|
|
|
- console.error(`客户端认证失败: ${socket.id}`, err);
|
|
|
- next(new Error('认证失败'));
|
|
|
- }
|
|
|
-};
|
|
|
+export const authMiddleware = createSocketAuthMiddleware();
|
|
|
|
|
|
/**
|
|
|
* Socket.IO 路由处理
|
|
|
@@ -35,46 +15,25 @@ export const authMiddleware = async (socket: Socket, next: (err?: Error) => void
|
|
|
*/
|
|
|
export default (io: Server) => {
|
|
|
console.log('注册 Socket.IO 事件处理');
|
|
|
+
|
|
|
+ // 初始化事件处理器
|
|
|
+ const examHandler = new ExamHandler(io);
|
|
|
|
|
|
// 全局命名空间事件
|
|
|
io.on('connection', (socket) => {
|
|
|
console.log(`客户端连接: ${socket.id}`);
|
|
|
+
|
|
|
+ // 注册事件处理器
|
|
|
+ examHandler.register(socket);
|
|
|
|
|
|
// 示例: 响应客户端的 ping 事件
|
|
|
socket.on('ping', (callback) => {
|
|
|
callback({ timestamp: Date.now() });
|
|
|
});
|
|
|
|
|
|
- // 示例: 处理自定义事件
|
|
|
- socket.on('chat_message', (data) => {
|
|
|
- console.log(`收到消息: ${JSON.stringify(data)}`);
|
|
|
- // 广播消息给其他用户
|
|
|
- socket.broadcast.emit('new_message', {
|
|
|
- ...data,
|
|
|
- from: socket.id,
|
|
|
- timestamp: Date.now()
|
|
|
- });
|
|
|
- });
|
|
|
-
|
|
|
// 断开连接事件
|
|
|
socket.on('disconnect', (reason) => {
|
|
|
console.log(`客户端断开连接: ${socket.id}, 原因: ${reason}`);
|
|
|
});
|
|
|
});
|
|
|
-
|
|
|
- // 示例: 创建命名空间
|
|
|
- const adminNamespace = io.of('/admin');
|
|
|
-
|
|
|
- adminNamespace.on('connection', (socket) => {
|
|
|
- console.log(`管理员连接: ${socket.id}`);
|
|
|
-
|
|
|
- // 管理员专属事件
|
|
|
- socket.on('dashboard_stats', (callback) => {
|
|
|
- // 模拟返回统计数据
|
|
|
- callback({
|
|
|
- onlineUsers: io.engine.clientsCount,
|
|
|
- rooms: io.sockets.adapter.rooms.size
|
|
|
- });
|
|
|
- });
|
|
|
- });
|
|
|
};
|