@zhuweiyou/dsh-holdem 0.1.2 → 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -4,8 +4,13 @@ export interface ActionBarProps {
4
4
  potTotal: number;
5
5
  bigBlind: number;
6
6
  busy: boolean;
7
+ /**
8
+ * 轮不到你的时候,牌桌上仍然挂着一条「占位」的行动条(`active: false`):
9
+ * 只是为了让下注区高度恒定,轮到自己时牌桌不会往上跳。占位时不响应键盘。
10
+ */
11
+ active?: boolean | undefined;
7
12
  secondsLeft: number | null;
8
13
  onAction: (action: TableAction) => void;
9
14
  }
10
- export declare function ActionBar({ legal, potTotal, bigBlind, busy, secondsLeft, onAction }: ActionBarProps): import("react").JSX.Element;
15
+ export declare function ActionBar({ legal, potTotal, bigBlind, busy, active, secondsLeft, onAction }: ActionBarProps): import("react").JSX.Element;
11
16
  //# sourceMappingURL=ActionBar.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ActionBar.d.ts","sourceRoot":"","sources":["../../../../src/client/ActionBar.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAK5D,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,YAAY,CAAA;IACnB,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,OAAO,CAAA;IACb,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,QAAQ,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,IAAI,CAAA;CACxC;AAED,wBAAgB,SAAS,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,EAAE,cAAc,+BA0GnG"}
1
+ {"version":3,"file":"ActionBar.d.ts","sourceRoot":"","sources":["../../../../src/client/ActionBar.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAK5D,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,YAAY,CAAA;IACnB,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,OAAO,CAAA;IACb;;;OAGG;IACH,MAAM,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;IAC5B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,QAAQ,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,IAAI,CAAA;CACxC;AAED,wBAAgB,SAAS,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAa,EAAE,WAAW,EAAE,QAAQ,EAAE,EAAE,cAAc,+BAgHlH"}
@@ -1 +1 @@
1
- {"version":3,"file":"Table.d.ts","sourceRoot":"","sources":["../../../../src/client/Table.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAyB,MAAM,aAAa,CAAA;AAWpE,wBAAgB,KAAK,CAAC,EAAE,IAAI,EAAE,EAAE;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,+BA2RnD"}
1
+ {"version":3,"file":"Table.d.ts","sourceRoot":"","sources":["../../../../src/client/Table.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAgB,UAAU,EAAyB,MAAM,aAAa,CAAA;AAWlF,wBAAgB,KAAK,CAAC,EAAE,IAAI,EAAE,EAAE;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,+BAoSnD"}
@@ -1 +1 @@
1
- {"version":3,"file":"i18n.d.ts","sourceRoot":"","sources":["../../../../src/client/i18n.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,SAAS,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,KAAK,MAAM,CAAA;AA0UzF,eAAO,MAAM,KAAK;;;CAAqB,CAAA;AAIvC,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAElD;AAED,wBAAgB,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,GAAG,MAAM,CAE/E;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAO1D"}
1
+ {"version":3,"file":"i18n.d.ts","sourceRoot":"","sources":["../../../../src/client/i18n.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,SAAS,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,KAAK,MAAM,CAAA;AA4UzF,eAAO,MAAM,KAAK;;;CAAqB,CAAA;AAIvC,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAElD;AAED,wBAAgB,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,GAAG,MAAM,CAE/E;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAO1D"}
@@ -1 +1 @@
1
- {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../../../src/client/store.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAe,MAAM,aAAa,CAAA;AAKzE,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,YAAY,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS,CAAA;AAE/E,MAAM,WAAW,KAAK;IACpB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,OAAO,CAAA;IACf,IAAI,EAAE,OAAO,CAAA;IACb,UAAU,EAAE,UAAU,CAAA;IACtB,IAAI,EAAE,UAAU,GAAG,IAAI,CAAA;IACvB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAA;IACnB,uCAAuC;IACvC,UAAU,EAAE,OAAO,CAAA;CACpB;AAmFD,wBAAgB,cAAc,IAAI,WAAW,CAE5C;AAED,wBAAgB,QAAQ,IAAI,WAAW,CAEtC;AAED,wBAAgB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,MAAM,GAAG,OAAgB,GAAG,IAAI,CAOzE;AAED,qBAAqB;AACrB,wBAAgB,iBAAiB,IAAI,IAAI,CAExC;AAED,wBAAgB,UAAU,IAAI,IAAI,CAGjC;AAaD,iDAAiD;AACjD,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAQ7C;AAED,wBAAgB,cAAc,IAAI,IAAI,CAOrC;AAgKD,wBAAsB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CA0B/C;AAED,wBAAgB,OAAO,IAAI,IAAI,CAQ9B;AAED,wBAAsB,UAAU,CAC9B,KAAK,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,EAC9E,IAAI,SAAK,GACR,OAAO,CAAC,IAAI,CAAC,CAgBf;AAED,wBAAsB,QAAQ,CAAC,KAAK,EAAE;IACpC,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC3B,WAAW,EAAE,MAAM,CAAA;IACnB,IAAI,EAAE,KAAK,GAAG,OAAO,CAAA;CACtB,EAAE,IAAI,SAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAgB3B;AAED,wBAAsB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAW/C;AAED,wBAAsB,UAAU,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CA+BtE;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAIhD"}
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../../../src/client/store.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAe,MAAM,aAAa,CAAA;AAKzE,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,YAAY,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS,CAAA;AAE/E,MAAM,WAAW,KAAK;IACpB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,OAAO,CAAA;IACf,IAAI,EAAE,OAAO,CAAA;IACb,UAAU,EAAE,UAAU,CAAA;IACtB,IAAI,EAAE,UAAU,GAAG,IAAI,CAAA;IACvB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAA;IACnB,uCAAuC;IACvC,UAAU,EAAE,OAAO,CAAA;CACpB;AAmFD,wBAAgB,cAAc,IAAI,WAAW,CAE5C;AAED,wBAAgB,QAAQ,IAAI,WAAW,CAEtC;AAED,wBAAgB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,MAAM,GAAG,OAAgB,GAAG,IAAI,CAOzE;AAED,qBAAqB;AACrB,wBAAgB,iBAAiB,IAAI,IAAI,CAExC;AAED,wBAAgB,UAAU,IAAI,IAAI,CAGjC;AAoBD,iDAAiD;AACjD,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAQ7C;AAED,wBAAgB,cAAc,IAAI,IAAI,CAOrC;AAgKD,wBAAsB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CA0B/C;AAED,wBAAgB,OAAO,IAAI,IAAI,CAQ9B;AAED,wBAAsB,UAAU,CAC9B,KAAK,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,EAC9E,IAAI,SAAK,GACR,OAAO,CAAC,IAAI,CAAC,CAgBf;AAED,wBAAsB,QAAQ,CAAC,KAAK,EAAE;IACpC,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC3B,WAAW,EAAE,MAAM,CAAA;IACnB,IAAI,EAAE,KAAK,GAAG,OAAO,CAAA;CACtB,EAAE,IAAI,SAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAgB3B;AAED,wBAAsB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAW/C;AAED,wBAAsB,UAAU,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CA+BtE;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAIhD"}
@@ -20,6 +20,8 @@ export declare const WS_TICKET_TTL_MS = 60000;
20
20
  export declare const SESSION_TTL_MS: number;
21
21
  export declare const HEARTBEAT_MS = 15000;
22
22
  export declare const DISCONNECT_AFTER_MS = 45000;
23
+ /** 没有实时通道时,HTTP 请求也算「人在」:这么久没动静才标成离线。 */
24
+ export declare const PRESENCE_TTL_MS = 20000;
23
25
  export declare const LOBBY_KICK_IDLE_MS: number;
24
26
  export declare const CHAT_COOLDOWN_MS = 1200;
25
27
  export declare const ACTION_RATE_WINDOW_MS = 10000;
@@ -1 +1 @@
1
- {"version":3,"file":"invariant.d.ts","sourceRoot":"","sources":["../../../src/invariant.ts"],"names":[],"mappings":"AAAA,0BAA0B;AAE1B,eAAO,MAAM,YAAY,0BAA0B,CAAA;AACnD,eAAO,MAAM,SAAS,0BAA0B,CAAA;AAChD,eAAO,MAAM,SAAS,WAAW,CAAA;AACjC,eAAO,MAAM,WAAW,cAAc,CAAA;AACtC,eAAO,MAAM,YAAY,YAAY,CAAA;AAErC,eAAO,MAAM,SAAS,IAAI,CAAA;AAC1B,eAAO,MAAM,cAAc,KAAK,CAAA;AAChC,eAAO,MAAM,SAAS,IAAI,CAAA;AAC1B,eAAO,MAAM,SAAS,KAAK,CAAA;AAC3B,eAAO,MAAM,gBAAgB,KAAK,CAAA;AAClC,eAAO,MAAM,QAAQ,KAAK,CAAA;AAC1B,eAAO,MAAM,cAAc,KAAK,CAAA;AAChC,eAAO,MAAM,iBAAiB,KAAK,CAAA;AACnC,eAAO,MAAM,kBAAkB,KAAK,CAAA;AACpC,eAAO,MAAM,cAAc,QAAY,CAAA;AACvC,eAAO,MAAM,eAAe,QAAY,CAAA;AAExC,eAAO,MAAM,OAAO,MAAM,CAAA;AAC1B,eAAO,MAAM,gBAAgB,QAAS,CAAA;AACtC,eAAO,MAAM,cAAc,QAAsB,CAAA;AACjD,eAAO,MAAM,YAAY,QAAS,CAAA;AAClC,eAAO,MAAM,mBAAmB,QAAS,CAAA;AACzC,eAAO,MAAM,kBAAkB,QAAiB,CAAA;AAChD,eAAO,MAAM,gBAAgB,OAAO,CAAA;AACpC,eAAO,MAAM,qBAAqB,QAAS,CAAA;AAC3C,eAAO,MAAM,eAAe,KAAK,CAAA;AAEjC,eAAO,MAAM,SAAS,MAAM,CAAA;AAC5B,eAAO,MAAM,gBAAgB,OAAO,CAAA;AACpC,eAAO,MAAM,gBAAgB,OAAO,CAAA;AAEpC,eAAO,MAAM,YAAY;;;;;;;;;;;;EAIf,CAAA;AAEV,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAA;AAE9D,wBAAgB,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG;IAAE,EAAE,EAAE,YAAY,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAIlF;AAED,wBAAgB,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAE3C"}
1
+ {"version":3,"file":"invariant.d.ts","sourceRoot":"","sources":["../../../src/invariant.ts"],"names":[],"mappings":"AAAA,0BAA0B;AAE1B,eAAO,MAAM,YAAY,0BAA0B,CAAA;AACnD,eAAO,MAAM,SAAS,0BAA0B,CAAA;AAChD,eAAO,MAAM,SAAS,WAAW,CAAA;AACjC,eAAO,MAAM,WAAW,cAAc,CAAA;AACtC,eAAO,MAAM,YAAY,YAAY,CAAA;AAErC,eAAO,MAAM,SAAS,IAAI,CAAA;AAC1B,eAAO,MAAM,cAAc,KAAK,CAAA;AAChC,eAAO,MAAM,SAAS,IAAI,CAAA;AAC1B,eAAO,MAAM,SAAS,KAAK,CAAA;AAC3B,eAAO,MAAM,gBAAgB,KAAK,CAAA;AAClC,eAAO,MAAM,QAAQ,KAAK,CAAA;AAC1B,eAAO,MAAM,cAAc,KAAK,CAAA;AAChC,eAAO,MAAM,iBAAiB,KAAK,CAAA;AACnC,eAAO,MAAM,kBAAkB,KAAK,CAAA;AACpC,eAAO,MAAM,cAAc,QAAY,CAAA;AACvC,eAAO,MAAM,eAAe,QAAY,CAAA;AAExC,eAAO,MAAM,OAAO,MAAM,CAAA;AAC1B,eAAO,MAAM,gBAAgB,QAAS,CAAA;AACtC,eAAO,MAAM,cAAc,QAAsB,CAAA;AACjD,eAAO,MAAM,YAAY,QAAS,CAAA;AAClC,eAAO,MAAM,mBAAmB,QAAS,CAAA;AACzC,yCAAyC;AACzC,eAAO,MAAM,eAAe,QAAS,CAAA;AACrC,eAAO,MAAM,kBAAkB,QAAiB,CAAA;AAChD,eAAO,MAAM,gBAAgB,OAAO,CAAA;AACpC,eAAO,MAAM,qBAAqB,QAAS,CAAA;AAC3C,eAAO,MAAM,eAAe,KAAK,CAAA;AAEjC,eAAO,MAAM,SAAS,MAAM,CAAA;AAC5B,eAAO,MAAM,gBAAgB,OAAO,CAAA;AACpC,eAAO,MAAM,gBAAgB,OAAO,CAAA;AAEpC,eAAO,MAAM,YAAY;;;;;;;;;;;;EAIf,CAAA;AAEV,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAA;AAE9D,wBAAgB,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG;IAAE,EAAE,EAAE,YAAY,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAIlF;AAED,wBAAgB,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAE3C"}
@@ -1 +1 @@
1
- {"version":3,"file":"ws.d.ts","sourceRoot":"","sources":["../../../../src/net/ws.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAEpD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA;AAsBzD,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,GAAG,MAAM,IAAI,CAgGxF"}
1
+ {"version":3,"file":"ws.d.ts","sourceRoot":"","sources":["../../../../src/net/ws.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAEpD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA;AAsBzD,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,GAAG,MAAM,IAAI,CAkGxF"}
@@ -107,7 +107,17 @@ export declare class RoomManager {
107
107
  playerId: PlayerId;
108
108
  roomId: RoomId;
109
109
  } | null;
110
+ /**
111
+ * 实时通道打开/关闭。
112
+ *
113
+ * 关掉 socket 不等于立刻离线:后台轮询(HTTP)还活着的话人还在。真正判离线交给
114
+ * `tick` 按 `PRESENCE_TTL_MS` 扫一遍,两边都没有动静才标成离线。
115
+ */
110
116
  markConnected(playerId: PlayerId, roomId: RoomId, connected: boolean): void;
117
+ /** HTTP 请求也算心跳:轮询模式下不能把自己和别人都显示成离线。 */
118
+ private touch;
119
+ /** 有实时通道,或者最近有 HTTP 动静,就算在线。 */
120
+ private refreshPresence;
111
121
  health(): Record<string, unknown>;
112
122
  private startHand;
113
123
  private applyTableAction;
@@ -1 +1 @@
1
- {"version":3,"file":"RoomManager.d.ts","sourceRoot":"","sources":["../../../../src/room/RoomManager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"RoomManager.d.ts","sourceRoot":"","sources":["../../../../src/room/RoomManager.ts"],"names":[],"mappings":"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"}
package/lib/worker.js CHANGED
@@ -11,6 +11,8 @@ const MAX_BODY_BYTES = 64 * 1024;
11
11
  const MAX_FRAME_BYTES = 64 * 1024;
12
12
  const TICK_MS = 250;
13
13
  const SESSION_TTL_MS = 1440 * 60 * 1e3;
14
+ /** 没有实时通道时,HTTP 请求也算「人在」:这么久没动静才标成离线。 */
15
+ const PRESENCE_TTL_MS = 2e4;
14
16
  const LOBBY_KICK_IDLE_MS = 600 * 1e3;
15
17
  const CHAT_COOLDOWN_MS = 1200;
16
18
  const BUY_IN_BB = 100;
@@ -1269,8 +1271,8 @@ var RoomManager = class {
1269
1271
  if (cookieSession) {
1270
1272
  const player$1 = room.players.get(cookieSession.playerId);
1271
1273
  if (player$1 && !player$1.leaving) {
1272
- player$1.connected = true;
1273
1274
  player$1.browserId = input.browserId ?? player$1.browserId;
1275
+ this.touch(room, player$1);
1274
1276
  return {
1275
1277
  playerId: player$1.playerId,
1276
1278
  roomId: room.roomId,
@@ -1361,7 +1363,8 @@ var RoomManager = class {
1361
1363
  view(roomId, playerId) {
1362
1364
  const room = this.roomOf(playerId);
1363
1365
  if (!room || room.roomId !== roomId) throw new CommandError("auth", "不在这个房间里");
1364
- if (room.hostPlayerId === playerId) room.hostLastSeen = this.now();
1366
+ const player = room.players.get(playerId);
1367
+ if (player) this.touch(room, player);
1365
1368
  return this.project(room, playerId);
1366
1369
  }
1367
1370
  command(roomId, playerId, command, baseSeq, actionId) {
@@ -1369,7 +1372,7 @@ var RoomManager = class {
1369
1372
  if (!room || room.roomId !== roomId) throw new CommandError("auth", "不在这个房间里");
1370
1373
  const player = room.players.get(playerId);
1371
1374
  if (!player || player.leaving) throw new CommandError("auth", "不在这个房间里");
1372
- if (room.hostPlayerId === playerId) room.hostLastSeen = this.now();
1375
+ this.touch(room, player);
1373
1376
  if (command.type === "ping") return {
1374
1377
  seq: room.seq,
1375
1378
  view: this.project(room, playerId)
@@ -1512,13 +1515,32 @@ var RoomManager = class {
1512
1515
  roomId: entry.roomId
1513
1516
  };
1514
1517
  }
1518
+ /**
1519
+ * 实时通道打开/关闭。
1520
+ *
1521
+ * 关掉 socket 不等于立刻离线:后台轮询(HTTP)还活着的话人还在。真正判离线交给
1522
+ * `tick` 按 `PRESENCE_TTL_MS` 扫一遍,两边都没有动静才标成离线。
1523
+ */
1515
1524
  markConnected(playerId, roomId, connected) {
1516
1525
  const room = this.rooms.get(roomId);
1517
1526
  const player = room?.players.get(playerId);
1518
1527
  if (!room || !player) return;
1519
- if (room.hostPlayerId === playerId && connected) room.hostLastSeen = this.now();
1520
- if (player.connected === connected) return;
1521
- player.connected = connected;
1528
+ player.socketOpen = connected;
1529
+ if (connected) player.lastSeenAt = this.now();
1530
+ this.refreshPresence(room, player);
1531
+ }
1532
+ /** HTTP 请求也算心跳:轮询模式下不能把自己和别人都显示成离线。 */
1533
+ touch(room, player) {
1534
+ if (player.leaving) return;
1535
+ player.lastSeenAt = this.now();
1536
+ if (room.hostPlayerId === player.playerId) room.hostLastSeen = player.lastSeenAt;
1537
+ this.refreshPresence(room, player);
1538
+ }
1539
+ /** 有实时通道,或者最近有 HTTP 动静,就算在线。 */
1540
+ refreshPresence(room, player) {
1541
+ const online = !player.leaving && (player.socketOpen || this.now() - player.lastSeenAt < PRESENCE_TTL_MS);
1542
+ if (player.connected === online) return;
1543
+ player.connected = online;
1522
1544
  this.publish(room);
1523
1545
  }
1524
1546
  health() {
@@ -1677,6 +1699,7 @@ var RoomManager = class {
1677
1699
  if (room.phase === "hand" && room.hand) this.tickHand(room, now);
1678
1700
  if (room.phase === "handOver" && room.handOverAt !== null && now >= room.handOverAt) this.advance(room, now);
1679
1701
  for (const player of [...room.players.values()]) if (player.leaving && room.phase !== "hand") this.removePlayer(room, player.playerId);
1702
+ else this.refreshPresence(room, player);
1680
1703
  }
1681
1704
  this.cleanupSessions(now);
1682
1705
  }
@@ -1827,6 +1850,8 @@ var RoomManager = class {
1827
1850
  seat,
1828
1851
  ready: false,
1829
1852
  connected: true,
1853
+ socketOpen: false,
1854
+ lastSeenAt: this.now(),
1830
1855
  sittingOut: false,
1831
1856
  autoFold: false,
1832
1857
  timeoutStreak: 0,