feat: 메인 현재 시각을 최근 통신 기준으로 갱신
완료 턴 시각 대신 lobby serverTime을 분 경계에 맞춰 표시한다. 게임 API 응답과 SSE 및 같은 계정 탭 전달을 최근 통신으로 기록하고, 45초 공백에는 시계를 멈춘다. 공통 시계 투영과 단위 및 Chromium 회귀 검증을 추가한다.
This commit is contained in:
@@ -0,0 +1,34 @@
|
||||
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);
|
||||
Reference in New Issue
Block a user