Код Senior Ошибки и логирование спрашивают часто обновлено

Graceful shutdown: дождаться запросов в работе

Условие

Напиши createLifecycle({ timeoutMs }), который моделирует корректную остановку сервера. Вернуть объект:

  • handle(fn): если сервер принимает запросы, выполняет асинхронную fn и возвращает её промис, учитывая запрос как «в работе»; если уже идёт остановка, отклоняет промис ошибкой с status = 503 и fn не вызывает;
  • inFlight: число запросов в работе;
  • shutdown(cleanup): перестаёт принимать новые запросы, ждёт завершения всех текущих (упавшие тоже считаются завершёнными), затем вызывает асинхронную cleanup() (закрыть пул БД) и выполняется со строкой 'clean'. Если запросы не завершились за timeoutMs, вызывает cleanup() и выполняется со строкой 'timeout'. Повторный shutdown возвращает тот же промис.

Что проверяют тесты

  • ждёт запросы в работе

  • новые запросы после shutdown: 503

  • таймаут

  • упавший запрос тоже завершает работу

  • без запросов: сразу clean

  • повторный shutdown тот же промис

Как подойти

Подсказки: 2
  1. Счётчик запросов в работе уменьшай в finally.
  2. Остановка: гонка «все запросы завершились» против таймера.

Решите в тренажёре

Редактор с автотестами прямо в браузере. Можно решить спокойно, вслух или под таймером, как на собесе.