代码架构
分层
Pages/Components → NextAuth / fetch / Socket.IO
↓
Express Routes + Socket Handlers
↓
GameManager | LoginCode | PlayerRegistry
↓
Redis (+ PostgreSQL 归档)
认证双路径
GameManager
单例,负责轮次、淘汰、倒计时、winner/tie(调用 getDisplayName / resolveDisplayNames)。
resetGame() 额外调用:
clearLoginCode()clearPlayerRegistry()
LoginCode 模块
publishLoginCode()— SET redis + emitlogin_code_publishedvalidateLoginCode()— 字符串相等比较clearLoginCode()— DEL + emitlogin_code_closedemitLoginCodeStatus(socketId)— Show 重连
PlayerRegistry 模块
assignPlayerIdentity(playerId)— INCR seq 或复用已有编号getDisplayName(internalEmail)— 缓存优先clearPlayerRegistry()— SCAN 删除 player:* keys
Socket 角色分发
- Admin/Display → RoomState
- Player → PlayerGameState(无全局票数)
- Display 连接 → 额外
emitLoginCodeStatus+ winner/tie display 字段
前端状态
React hooks + Socket,无全局 store。Admin 单独维护 loginCodeStatus: idle | published。
类型同步
frontend/src/types/index.ts 与 backend/src/types/index.ts 需手动对齐(含 LoginCodePayload, winnerDisplay)。