Код Senior Потоки и буферы обновлено

Запись с учётом backpressure

Условие

Напиши async pump(source, sink). source: асинхронный итерируемый источник чанков. sink: объект в стиле Writable:

  • write(chunk) возвращает false, если внутренний буфер переполнен (писать дальше нельзя до события drain);
  • once(event, fn): подписка на 'drain' или 'error';
  • end(): завершить запись.

pump пишет все чанки, при false ждёт drain и только потом читает следующий чанк из источника; в конце вызывает end() и возвращает число записанных чанков. Если sink сообщил error, пока ждём drain, промис отклоняется этой ошибкой.

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

  • ждёт drain перед следующим чанком

  • без переполнения пишет подряд

  • ошибка во время ожидания

  • источник не читается, пока не было drain

  • пустой источник: только end

Как подойти

Подсказки: 2
  1. Если write вернул false, создай промис, который выполнится по drain и отклонится по error.
  2. Следующий чанк читай только после этого промиса: for await сам подождёт.

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

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