Перейти к содержимому

Потоковый вывод команд ​

Передайте обработчики вывода в commands.run, если приложению нужны данные до завершения команды.

mjs
import { Sandbox } from "@abox-dev/sdk";

const sandbox = await Sandbox.create();

try {
  await sandbox.commands.run("printf 'first\\n'; sleep 1; printf 'second\\n'", {
    onStdout: (data) => process.stdout.write(data),
    onStderr: (data) => process.stderr.write(data),
  });
} finally {
  await sandbox.kill();
}

Обработчик получает фрагмент потока, а не обязательно целую строку. Выводите фрагменты сразу либо накапливайте их для построчной обработки.

commands.run возвращает результат только после завершения команды. Пример на Go включает Streaming: вывод поступает в обработчики и не накапливается в результате. Не задавайте Streaming, если после завершения нужен полный вывод. Если вызывающий код должен продолжить работу сразу, запустите фоновую команду.

Долгоживущие команды в Go ​

Для процессов, которые работают между запросами приложения, Go SDK поддерживает потоковую обработку без накопления полного stdout и stderr. Задайте CommandOptions.Streaming при запуске процесса и CommandConnectOptions.Streaming при повторном подключении через ConnectWithOptions. Режим сбора по умолчанию подходит, когда приложению нужен полный результат из Wait.

Для каждого потока выберите один способ обработки: callback, явно включённый канал или отбрасывание. Если callback не задан и канал не выбран, вывод отбрасывается. В потоковом режиме callbacks не создают дополнительную очередь для каналов. Переданные им срезы доступны только для чтения и действительны до возврата из callback. Скопируйте байты, которые приложению нужно сохранить.

Читайте все включённые каналы одновременно с ожиданием Wait. Каналы не имеют буфера и передают срезы размером до 32 КиБ во владение получателя. Если читатель остановится, чтение транспорта приостановится и со временем может заблокировать удалённый процесс. Размер транспортного сообщения ограничен 4 МиБ. Wait возвращает сведения о завершении и ошибки без сохранённого stdout и stderr.

Вызовите Close у дескриптора команды, чтобы отсоединиться без остановки процесса и закрытия stdin. Отмена контекста подключения действует так же. Выполняющийся callback должен вернуть управление, прежде чем завершится Wait. Повторное подключение не гарантирует получение вывода, появившегося во время отсоединения.

Полный контракт описан в настройках потокового режима Go. Для PTY доступна та же политика через PTYOptions.Streaming и PTY.ConnectWithOptions.