范围: src/gateway/chat/ - 新增 change_map 事件处理 - 实现 handleChangeMap() 方法 - 支持玩家在不同地图间切换 - 自动更新房间成员和广播通知 - 完善地图切换的错误处理 功能说明: - 玩家可以通过 WebSocket 发送 change_map 事件切换地图 - 自动处理房间加入/离开逻辑 - 向旧地图广播玩家离开,向新地图广播玩家加入 - 支持携带初始位置坐标,默认使用 (400, 300)
聊天网关模块 (Chat Gateway Module)
聊天网关模块是聊天系统的协议入口,负责处理 WebSocket 和 HTTP 请求,提供统一的 API 接口。作为 Gateway Layer 的核心组件,它专注于协议转换和路由管理,将客户端请求转发到 Business Layer 处理,不包含业务逻辑。
架构层级
Gateway Layer(网关层)
职责定位
网关层负责:
- 协议处理:处理 WebSocket 和 HTTP 请求
- 数据验证:使用 DTO 进行请求参数验证
- 路由管理:定义 API 端点和消息路由
- 错误转换:将业务错误转换为协议响应
模块组成
src/gateway/chat/
├── chat.gateway.ts # WebSocket 网关
├── chat.controller.ts # HTTP 控制器
├── chat.gateway.module.ts # 网关模块配置
├── chat.dto.ts # 请求 DTO
├── chat_response.dto.ts # 响应 DTO
└── README.md # 模块文档
依赖关系
Gateway Layer (chat.gateway.module)
↓ 依赖
Business Layer (chat.module)
↓ 依赖
Core Layer (zulip_core.module, redis.module)
对外提供的接口
ChatWebSocketGateway 类
sendToPlayer(socketId: string, data: any): void
向指定玩家的 WebSocket 连接发送消息,用于单播通信。
broadcastToMap(mapId: string, data: any, excludeId?: string): void
向指定地图内的所有玩家广播消息,支持排除特定玩家。
getConnectionCount(): number
获取当前 WebSocket 总连接数,用于监控和统计。
getAuthenticatedConnectionCount(): number
获取已认证的 WebSocket 连接数,用于在线玩家统计。
getMapPlayerCounts(): Record<string, number>
获取各地图的在线玩家数量统计,用于负载监控。
getMapPlayers(mapId: string): string[]
获取指定地图内的所有玩家用户名列表,用于房间成员查询。
ChatController 类
getChatHistory(query: GetChatHistoryDto): Promise
获取聊天历史记录,支持按地图筛选和分页查询。
getSystemStatus(): Promise
获取聊天系统状态,包括 WebSocket 连接数、Zulip 状态、内存使用等。