Загрузка данных


Проект game-server (Node/TypeScript). Файлы: src/controllers/index.ts и src/server.ts.

Симптомы из логов:
1. Сайт (Roblox.Website) получает "KillGameServer timed out after 15 seconds" и "Failed to start game server ... HttpClient Timeout of 100 seconds". То есть game-server перестаёт отвечать на /kill-game-server и /start-game-server.
2. В логе game-server повторяется цикл: "port available? 6001 true" → "port is already in use 6001" (бесконечно, до 60 секунд). Причина: в this.reservedPorts остаётся порт 6001 от прошлого RCC, который уже не работает, а getFreeRccPort каждый раз возвращает 6001 как свободный.
3. startRcc ждёт RCC через waitForRcc без освобождения резерва, если RCC упал или не поднялся.

Что нужно сделать (не меняй логику игры и формат ответов API):
a) В startRcc: при падении процесса RCC (событие exit/error) и при ошибке waitForRcc удаляй порт из this.reservedPorts. Сейчас это сделано только в части путей, проверь все.
b) В цикле while (this.reservedPorts.includes(portToRunOn)): если порт свободен по проверке isPortAvailable, но есть в reservedPorts, проверь, живёт ли связанный процесс RCC. Если нет, освободи резерв и продолжай. Не ожидай 60 секунд без нужды.
c) В closeGame / shutdown: ограничь ожидание ответа RCC на закрытие таймаутом (например, 5 секунд), после чего принудительно убивай процесс RCC (rcc.kill()) и удаляй задание из executorStatus.games, чтобы /kill-game-server отвечал быстро и не держал запрос сайта до 15 секунд.
d) В startGame: если в executorStatus.games уже есть задание с тем же serverId, сначала закрой его (с тем же таймаутом из пункта c), прежде чем запускать новое.
e) Убедись, что обработчики /kill-game-server и /start-game-server в server.ts всегда отвечают (включая ошибки), а не висят.

После правок покажи diff и перечисли, какие строки изменились и почему. Не удаляй существующие логи.