28afcff551
CI / changes (pull_request) Successful in 3s
CI / unit (pull_request) Has been skipped
CI / integration (pull_request) Has been skipped
CI / ui (pull_request) Failing after 12s
CI / conformance (pull_request) Successful in 10s
CI / gate (pull_request) Failing after 1s
CI / deploy (pull_request) Has been skipped
When an online game loses the connection the game screen now says so and freezes instead of silently greying out: a "connection lost" banner appears and the rack, the move controls, the add-friend/block controls and the chat/dictionary entry all disable (a started move stays a draft, committed by the player on reconnect). It is driven off the net-state machine (netState.offline), so it also covers the Telegram/VK mini-apps, where a lost connection was previously mute in-game. If the player is already in the dictionary when the drop happens, the word check falls back to the game's pinned on-device dictionary (exact when that dawg is cached; "unavailable offline" otherwise) and the network-only complaint + external look-up hide. Chat, when already open, keeps its existing read-only degrade (send/nudge disable). New pure helper localWordCheck is unit-tested; the in-game gating gets an e2e.
27 lines
1.3 KiB
TypeScript
27 lines
1.3 KiB
TypeScript
// Offline word-check fallback for an online game. An online game's dictionary check normally goes to
|
|
// the gateway (game.check_word); while disconnected that call fails, so the check falls back to the
|
|
// game's own pinned dictionary read locally. Using the game's pinned (variant, version) means the
|
|
// answer matches the server's — no divergence — as long as that dawg is available on-device; if it
|
|
// is not cached/bundled offline, the check is simply unavailable (null). The membership test mirrors
|
|
// the local engine's dictionaryHas (encode to alphabet indices, then Dawg.indexOf).
|
|
|
|
import { getDawg } from './loader';
|
|
import { indexForLetter } from '../alphabet';
|
|
import type { Variant } from '../model';
|
|
|
|
/**
|
|
* localWordCheck reports whether word is in the (variant, version) dictionary using the on-device
|
|
* dawg, or null when that dawg cannot be obtained (offline and neither cached nor bundled). word
|
|
* must already be sanitised to the variant's alphabet (as the check panel does).
|
|
*/
|
|
export async function localWordCheck(
|
|
variant: Variant,
|
|
version: string,
|
|
word: string,
|
|
): Promise<boolean | null> {
|
|
const dawg = await getDawg(variant, version);
|
|
if (!dawg) return null;
|
|
const idx = Array.from(word, (ch) => indexForLetter(variant, ch));
|
|
return dawg.indexOf(idx) >= 0;
|
|
}
|