star-tide-service · 全球星潮同步 mini-service
回响星核 / Echo Nexus · P3 工单 #10-c
socket.io 多人同步星潮 —— 所有在线玩家同时经历同一道全球星潮 60 秒。
设计
- 端口:固定
3031 - 网关:Caddy 通过
?XTransformPort=3031转发;前端用io("/?XTransformPort=3031") - 运行时:bun + socket.io 4
- 存储:纯内存(无状态,重启不影响前端游戏)
星潮节奏
- 首次星潮:服务端启动后 60 秒(可由 env
FIRST_TIDE_DELAY_MS覆盖,便于 QA) - 后续星潮:10-15 分钟随机间隔
- 每次持续:60 秒
- 类型:从 6 种星潮按权重随机抽取(与前端
TIDE_EVENTS一致)- 晶体潮 22 / 谐振风暴 20 / 遗迹共振 16 / 虚空低语 18 / 星核悸动 14 / 寂静期 10
socket.io 事件
服务端 → 客户端
| 事件 | 载荷 | 触发时机 |
|---|---|---|
tide-state |
{ current: GlobalTideState | null, nextTideAt, serverTime } |
客户端连接时立即推送 |
global-tide |
{ type, name, startedAt, endsAt, durationSec } |
全球星潮开始 |
tide-ended |
{ endedAt, nextTideAt } |
全球星潮结束 |
next-tide-info |
{ current, nextTideAt, serverTime, remainingMs } |
响应客户端 get-next-tide |
客户端 → 服务端
| 事件 | 载荷 | 行为 |
|---|---|---|
get-next-tide |
— | 查询下次星潮剩余时间 |
admin-trigger-tide |
— | dev/QA 用:立即触发一次全球星潮 |
HTTP 端点
socket.io path: '/' 拦截所有 HTTP 请求,因此本服务不提供独立 HTTP 健康检查端点。
GET /—— socket.io 默认握手响应({"code":0,"message":"Transport unknown"}表示服务在线)
启动
cd mini-services/star-tide-service
bun run dev # bun --hot index.ts,热重载
# 或
bun run start # bun index.ts,无热重载
QA 验证
# socket.io 在线验证(收到 JSON 响应即表示服务在线)
curl http://localhost:3031/
# 预期:{"code":0,"message":"Transport unknown"}
前端可在浏览器 console 触发全球星潮(QA 用):
const sock = io("/?XTransformPort=3031");
sock.on("tide-state", (s) => console.log("当前状态:", s));
sock.emit("admin-trigger-tide"); // 立即触发一次全球星潮
离线容错
- 服务端宕机 → 前端
useGlobalTide自动重连(socket.io 默认行为) - 断连期间 → 前端本地
tickTide继续按原节奏工作,玩家不会卡住 - 全球星潮进行中 → 前端本地
tickTide暂停触发(避免冲突)