---
type: JS Module
title: spawn-async.mjs
resource: npm/scripts/utils/spawn-async.mjs
docgen:
  crc: 0e8ce2ef
  model: openai-codex/gpt-5.4-mini
  score: 100
  issues: judge:inaccurate:0.98
  judgeModel: openai-codex/gpt-5.4-mini
---

## Огляд

Забезпечує асинхронну заміну `spawnSync` для важких зовнішніх CLI на кшталт `conftest` і `oxlint`, щоб не блокувати Node event loop і не створювати ілюзію паралельності під час запуску кількох detector’ів. Обгортає `child_process.spawn` через `events.once`, підтримує зовнішній `AbortSignal` і `timeoutMs` з ескалацією `SIGTERM` → `SIGKILL`, а результат повертає нормалізовано без винятку на non-zero exit — рішення про це лишається за caller.

## Поведінка

1. `spawnAsync` запускає зовнішній CLI асинхронно, щоб не блокувати event loop під час важких системних перевірок.
2. Якщо запуск уже скасовано до старту, одразу повертає помилку скасування.
3. Збирає `stdout` і `stderr` у нормалізований текстовий результат для подальшого аналізу викликачем.
4. Підтримує зовнішнє скасування та часовий ліміт: у цих випадках спершу намагається завершити процес м’яко, а потім примусово, якщо він не зупинився в межах grace-періоду.
5. Повертає код завершення, сигнал завершення та ознаки скасування або timeout як звичайний результат, а не як виняток.
6. Кидає помилку лише тоді, коли сам запуск процесу не відбувся або середовище не змогло стартувати команду; non-zero exit лишається відповідальністю викликачa.

## Публічний API

- spawnAsync — асинхронно запускає зовнішню команду, дочікується завершення, збирає її вихід і повертає результат; не падає через code ≠ 0, а кидає лише коли процес не вдалося створити або якщо сигнал уже був aborted до старту

## Гарантії поведінки

- Read-only: не виконує операцій запису (ФС/БД).
