Код 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
- Если
writeвернул false, создай промис, который выполнится поdrainи отклонится поerror. - Следующий чанк читай только после этого промиса:
for awaitсам подождёт.
Решите в тренажёре
Редактор с автотестами прямо в браузере. Можно решить спокойно, вслух или под таймером, как на собесе.
Термины по теме
Ещё по теме «Потоки и буферы»
- Пачки из асинхронного итератора
- Слияние k отсортированных логов
- Топ эндпоинтов по access-логу с нормализацией маршрутов
- Сессии пользователей по потоку событий
- Код-ревью: выгрузка и загрузка больших файлов
- Загрузка файлов по 5 ГБ через Node-сервис
- Чем pipeline лучше pipe
- Buffer.allocUnsafe