1
0

Fixing "as any" usages

This commit is contained in:
James Ketr 2025-10-09 15:51:16 -07:00
parent 2dae5b7b17
commit 570d9024ab
2 changed files with 15 additions and 13 deletions

View File

@ -725,9 +725,9 @@ const getSession = (game: Game, id: string): Session => {
return game.sessions[id]!; return game.sessions[id]!;
}; };
const loadGame = async (id: string) => { const loadGame = async (id: string): Promise<Game> => {
if (/^\.|\//.exec(id)) { if (/^\.|\//.exec(id)) {
return undefined; throw Error("Invalid game ID");
} }
if (id in games) { if (id in games) {
@ -4376,7 +4376,7 @@ router.ws("/ws/:id", async (ws, req) => {
if (game.state === "winner") { if (game.state === "winner") {
let dead = true; let dead = true;
for (let id in game.sessions) { for (let id in game.sessions) {
if (game.sessions[id].live && game.sessions[id].name) { if (game.sessions[id]!.live && game.sessions[id]!.name) {
dead = false; dead = false;
} }
} }
@ -4387,11 +4387,11 @@ router.ws("/ws/:id", async (ws, req) => {
chat: game.chat, chat: game.chat,
}); });
for (let id in game.sessions) { for (let id in game.sessions) {
if (game.sessions[id].ws) { if (game.sessions[id]!.ws) {
try { try {
console.log(`${short}: Removing game - closing session ${id} socket (game removal cleanup)`); console.log(`${short}: Removing game - closing session ${id} socket (game removal cleanup)`);
console.log(`${short}: Closing socket stack:`, new Error().stack); console.log(`${short}: Closing socket stack:`, new Error().stack);
game.sessions[id].ws.close(); game.sessions[id]!.ws.close();
} catch (e) { } catch (e) {
console.warn(`${short}: error closing session socket during game removal:`, e); console.warn(`${short}: error closing session socket during game removal:`, e);
} }
@ -4643,8 +4643,6 @@ router.ws("/ws/:id", async (ws, req) => {
case "robber": case "robber":
case "robberName": case "robberName":
case "pips": case "pips":
case "pipsOrder":
case "borders":
case "tileOrder": case "tileOrder":
case "active": case "active":
case "largestArmy": case "largestArmy":
@ -4685,12 +4683,15 @@ router.ws("/ws/:id", async (ws, req) => {
batchedUpdate.timestamp = Date.now(); batchedUpdate.timestamp = Date.now();
break; break;
default: default:
if (field in game) { function hasKey<T>(obj: T, key: PropertyKey): key is keyof T {
return key in (obj as unknown as Record<string, unknown>);
}
if (hasKey(game, field)) {
console.warn(`${short}: WARNING: Requested GET not-privatized/sanitized field: ${field}`); console.warn(`${short}: WARNING: Requested GET not-privatized/sanitized field: ${field}`);
batchedUpdate[String(field)] = (game as any)[String(field)]; batchedUpdate[field] = game[field];
} else if (field in session) { } else if (hasKey(session, field)) {
console.warn(`${short}: WARNING: Requested GET not-sanitized session field: ${field}`); console.warn(`${short}: WARNING: Requested GET not-sanitized session field: ${field}`);
batchedUpdate[String(field)] = (session as any)[String(field)]; batchedUpdate[field as keyof typeof game] = session[field];
} else { } else {
console.warn(`${short}: WARNING: Requested GET unsupported field: ${field}`); console.warn(`${short}: WARNING: Requested GET unsupported field: ${field}`);
} }
@ -4866,9 +4867,9 @@ router.ws("/ws/:id", async (ws, req) => {
} else { } else {
for (let key in game.sessions) { for (let key in game.sessions) {
const tmp = game.sessions[key]; const tmp = game.sessions[key];
if (tmp.player) { if (tmp!.player) {
sendUpdateToPlayer(game, tmp, { sendUpdateToPlayer(game, tmp, {
private: tmp.player, private: tmp!.player,
}); });
} }
} }

View File

@ -169,6 +169,7 @@ export interface Game {
animationSeeds?: number[]; animationSeeds?: number[];
startTime?: number; startTime?: number;
direction?: "forward" | "backward"; direction?: "forward" | "backward";
winner?: string | false;
} }
export type IncomingMessage = { type: string | null; data: any }; export type IncomingMessage = { type: string | null; data: any };