Потоковый вывод команд
Передайте обработчики вывода в commands.run, если приложению нужны данные до завершения команды.
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.