Fix stale restore after game restart

This commit is contained in:
2026-05-20 22:27:36 +02:00
parent 8258ea2321
commit beac5a2be3
12 changed files with 167 additions and 44 deletions
+15 -4
View File
@@ -114,12 +114,20 @@ function getSlots(socketId: string): Map<number, string> {
return slots;
}
function withClientRequestId<T extends object>(turn: T, requestId?: number): T {
const id = Number(requestId || 0);
return Number.isInteger(id) && id > 0
? { ...turn, clientRequestId: id }
: turn;
}
async function handleGameApi(
socket: ReturnType<SocketIOServer['sockets']['sockets']['get']> & {
id: string;
},
method: string,
args: unknown[],
requestId?: number,
): Promise<object> {
const slots = getSlots(socket.id);
debugLog(`gameApi request from ${socket.id}: ${method}`, { args });
@@ -129,7 +137,7 @@ async function handleGameApi(
case 'newGame()': {
const engine = getOrCreateEngine(socket.id);
const turn = await engine.newGame();
socket.emit('narrativeResponse', toClientTurn(turn));
socket.emit('narrativeResponse', withClientRequestId(toClientTurn(turn), requestId));
return {
success: true,
result: true,
@@ -146,8 +154,8 @@ async function handleGameApi(
}
const engine = getOrCreateEngine(socket.id);
const turn = await engine.loadGame(slots.get(slot)!);
socket.emit('narrativeResponse', toClientTurn(turn));
socket.emit('gameLoaded', { slot });
socket.emit('narrativeResponse', withClientRequestId(toClientTurn(turn), requestId));
socket.emit('gameLoaded', { slot, clientRequestId: requestId });
return { success: true, result: true, running: true, slot };
}
@@ -236,7 +244,7 @@ io.on('connection', (socket) => {
socket.on(
'gameApi',
async (
request: { method?: string; args?: unknown[] },
request: { method?: string; args?: unknown[]; requestId?: number },
respond: (result: object) => void,
) => {
try {
@@ -244,6 +252,9 @@ io.on('connection', (socket) => {
socket as Parameters<typeof handleGameApi>[0],
String(request?.method ?? ''),
Array.isArray(request?.args) ? request.args : [],
Number.isInteger(Number(request?.requestId)) && Number(request?.requestId) > 0
? Number(request?.requestId)
: undefined,
);
debugLog(`gameApi response to ${socket.id}`, result);
if (typeof respond === 'function') respond(result);