완료 턴 시각 대신 lobby serverTime을 분 경계에 맞춰 표시한다. 게임 API 응답과 SSE 및 같은 계정 탭 전달을 최근 통신으로 기록하고, 45초 공백에는 시계를 멈춘다. 공통 시계 투영과 단위 및 Chromium 회귀 검증을 추가한다.
35 lines
1.1 KiB
TypeScript
35 lines
1.1 KiB
TypeScript
import { readonly, ref, type Ref } from 'vue';
|
|
|
|
export const GAME_SERVER_ACTIVITY_FRESHNESS_MS = 45_000;
|
|
|
|
export type GameServerActivityTracker = {
|
|
lastContactAt: Readonly<Ref<number | null>>;
|
|
markContact: (contactAt?: number) => void;
|
|
};
|
|
|
|
export const createGameServerActivityTracker = (): GameServerActivityTracker => {
|
|
const lastContactAt = ref<number | null>(null);
|
|
|
|
return {
|
|
lastContactAt: readonly(lastContactAt),
|
|
markContact(contactAt = Date.now()) {
|
|
if (!Number.isFinite(contactAt)) return;
|
|
lastContactAt.value = contactAt;
|
|
},
|
|
};
|
|
};
|
|
|
|
export const isRecentGameServerActivity = (
|
|
lastContactAt: number | null,
|
|
now = Date.now(),
|
|
freshnessMs = GAME_SERVER_ACTIVITY_FRESHNESS_MS
|
|
): boolean =>
|
|
lastContactAt !== null &&
|
|
Number.isFinite(lastContactAt) &&
|
|
Number.isFinite(now) &&
|
|
Math.max(0, now - lastContactAt) <= freshnessMs;
|
|
|
|
export const gameServerActivity = createGameServerActivityTracker();
|
|
|
|
export const markGameServerContact = (contactAt = Date.now()) => gameServerActivity.markContact(contactAt);
|