Проект game-server (Node/TypeScript, Express). Файлы: src/controllers/index.ts и src/server.ts.
Git-репозитория нет, поэтому перед правками сохрани копию исходников в ../baseline (cp -r src ../baseline/src), а после правок выдай патч через diff -u для каждого изменённого файла.
Симптомы (из логов сайта и game-server):
- Сайт получает "KillGameServer timed out after 15 seconds" и "Failed to start game server ... timeout of 100 seconds" на /kill-game-server и /start-game-server. game-server принимает запрос, но не отвечает.
- В логе game-server после "startGame called with ..." идёт цикл "port is already in use 6001" до 60 секунд. Порт 6001 остаётся в reservedPorts от RCC, который уже не работает.
- Закрытие старого задания работает не всегда; при зависшем RCC запрос на закрытие не отвечает вовсе.
Задача: /start-game-server и /kill-game-server ВСЕГДА отвечают в разумный срок, а зависший RCC не блокирует новые задания. Не меняй формат ответов API, логику выбора портов и логику игры.
Сделай:
1. Во всех ожиданиях (waitForRcc, openJob, закрытие RCC в closeGame/shutdown) добавь общий таймаут: 10 секунд для RCC-ожиданий, 5 секунд для закрытия. По истечении: убей процесс RCC (rcc.kill(), на Windows taskkill /PID <pid> /F), удали задание из executorStatus.games, сними порт из reservedPorts и верни ответ с ошибкой, не зависая.
2. В startRcc: при событии exit и при ошибке spawn обязательно снимай порт из reservedPorts. Цикл while (this.reservedPorts.includes(portToRunOn)) ограничь коротким таймаутом (не 60 секунд), после которого освобождай зависший резерв, если связанный процесс RCC мёртв.
3. В startGame: если задание с тем же serverId или портом уже есть, сначала закрой его (с таймаутом из пункта 1), потом запускай новое.
4. В server.ts: обработчики /start-game-server и /kill-game-server оборачивают вызовы в try/catch и всегда вызывают res.status(...).json(...). Ни один Promise не должен оставаться без ответа. Добавь общий таймаут на весь обработчик.
5. Добавь строки лога с временем для каждого этапа (startRcc, waitForRcc, openJob, закрытие), чтобы было видно, где застревает. Существующие логи не удаляй, конфиг не меняй.
После правок: покажи diff -u по каждому файлу, перечисли изменённые функции и объясни, что защищает каждый таймаут.