Определить, когда данные прошли через цепочку потоков без завершения цепочки

Я передаю несколько файлов через поток шифров, а затем записываю результат в один и тот же файл. Я могу сделать это, делая src_file_1.pipe(cipher, {end: false}).pipe(dest_file, {end: false});, src_file_2.pipe(cipher, {end: false}).pipe(dest_file, {end: false});и т. д., но я не могу закрыть поток dest_file, потому что невозможно узнать, когда шифр завершил запись. Если я не укажу {end: false} в цепочке невозможно повторно использовать шифр (повторное использование того же шифра является требованием моего приложения).

таким образом src_file1.on('end', function()...) недостаточно, поскольку при этом данные могут все еще не проходить через шифр, и dest_file.on('finish, function()...) невозможно использовать, так как он никогда не сработает, если я не укажу {end: false}.... Так что мне в основном нужен способ узнать, завершена ли цепочка потоков, обрабатывая свою текущую нагрузку, не заканчивая что-либо в цепочке.

1 ответ

Таким образом, похоже, что краткий ответ заключается в том, что это просто невозможно сделать без серьезного взлома API потоков Node.js и создания нескольких подклассов. С тех пор как поддержка flush() была удалена из общедоступного API, единственный способ использовать pipe в цепочке и ожидать, что все данные будут проходить, - это end() цепочки.

В моем случае я полагался на некоторые потоки прогресса, которые я хотел оставить открытыми и использовать повторно, но в итоге я просто заново создал их с использованием последних зарегистрированных параметров progress.transferred, progress.length, progress.percentage. Точно так же мне пришлось каждый раз заново создавать экземпляр своего шифра, что оказалось не узким местом в производительности, поскольку я повторно использовал один и тот же ключ и iv для моего конкретного приложения.

Другие вопросы по тегам