fix(SCOPONE-0008): complete iteration 1 remove ai lag

This commit is contained in:
Giancarmine Salucci
2026-04-02 20:51:43 +02:00
parent 019c4380be
commit 5b360bf191
5 changed files with 407 additions and 5 deletions

79
src/game/ai.worker.ts Normal file
View File

@@ -0,0 +1,79 @@
import { chooseMove } from './ai';
import {
AIWorkerChooseMoveRequest,
AIWorkerErrorMessage,
AIWorkerRequestMessage,
AIWorkerResponseMessage,
} from './ai-worker-protocol';
import { CardTracker } from './card-tracker';
interface AIWorkerScope {
addEventListener(type: 'message', listener: (event: MessageEvent<AIWorkerRequestMessage>) => void): void;
postMessage(message: AIWorkerResponseMessage): void;
}
const workerScope = globalThis as unknown as AIWorkerScope;
function serializeError(requestId: string, error: unknown): AIWorkerErrorMessage {
if (error instanceof Error) {
return {
type: 'error',
requestId,
error: {
message: error.message,
name: error.name,
stack: error.stack,
},
};
}
return {
type: 'error',
requestId,
error: {
message: typeof error === 'string' ? error : 'Unknown AI worker error',
name: 'Error',
},
};
}
async function handleChooseMove(request: AIWorkerChooseMoveRequest): Promise<void> {
const tracker = request.trackerSnapshot
? CardTracker.fromSnapshot(request.trackerSnapshot)
: undefined;
try {
const move = await chooseMove(
request.state,
request.playerIdx,
request.difficulty,
tracker,
(progress) => {
workerScope.postMessage({
type: 'progress',
requestId: request.requestId,
progress,
});
},
);
workerScope.postMessage({
type: 'result',
requestId: request.requestId,
move,
});
} catch (error) {
workerScope.postMessage(serializeError(request.requestId, error));
}
}
workerScope.addEventListener('message', (event: MessageEvent<AIWorkerRequestMessage>) => {
const message = event.data;
if (message.type !== 'choose-move') {
return;
}
void handleChooseMove(message);
});
export {};