WebSocket 事件
连接
const socket = io(NEXT_PUBLIC_API_BASE, {
auth: { token: session.user.accessToken },
transports: ['websocket', 'polling'],
});
JWT: issuer=lottery-frontend, audience=lottery-backend
Client → Server
submit_answer
{ "answer": "A" }
响应: answer_submitted | answer_error
Server → Client
游戏事件
| 事件 | 说明 |
|---|---|
game_state | 初始/更新状态 |
game_start | 重置后 |
new_question | 新题 |
countdown_update | Display 倒计时 |
player_count_update | 人数变化 |
round_result | 轮次结束 |
eliminated | 淘汰名单 |
winner | { winnerEmail, winnerDisplay } |
tie | { finalists, finalistsDisplay } |
redirect | 拒绝中途加入后 disconnect |
game_reset | Admin 重置(前端清空已发题标记) |
登录码事件(新增)
| 事件 | 受众 | Payload |
|---|---|---|
login_code_published | 全 room(尤其 Show) | { "code": "123456" } |
login_code_status | 单 socket(Show 重连) | { "code": "123456" } |
login_code_closed | 全 room | 无 body |
角色与 payload
| 角色 | game_state 类型 |
|---|---|
| Admin / Display | RoomState(含 answers 票数) |
| Player | PlayerGameState(含个人 status) |
Player 看不到 A/B 全局票数(防作弊)。
订阅建议
Show: login_code_*, game_state, new_question, countdown_update, winner, tie, round_result
Player: game_state, new_question, eliminated, winner, tie, redirect
Admin: 全部 RoomState 类 + game_reset