Я использую gulp для обработки, минимизации и объединения моих файлов css (и js тоже). Но я не хочу сразу писать файл. Я хочу проверить, не равна ли сумма md5 обработанного содержимого сумме md5 существующей версии связанного файла, и писать только в этом случае.
Вместо того, чтобы сразу писать файл, я пытаюсь получить его как строку из процесса.
Но конструкция не работает.
const Stream = require('stream');
const writableStream = new Stream.Writable({ objectMode: true });
var file = "";
writableStream._write = (chunk, encoding, next) => {
file += chunk.contents.toString();
next();
}
let bundlePipe = gulp.src([...vendorLinks.map(e => path.resolve(htmlPath + e)), ...resourceLinks.map(e => path.resolve(htmlPath + e))], { sourcemaps: true })
.pipe(postcss([cssnext, cssnano]))
.pipe(concat("style.bundle.min.css"))
.pipe(writableStream);
//.pipe(gulp.dest(path.resolve(paths["html/static/css"])));
bundlePipe.on("end", () => {
// It never goes there!
console.info("get file contents", file);
}
Кажется, writableStream, который я создаю, не знает, что все данные уже переданы ему, и никогда не выдает сигнал завершения.
Что я могу сделать, чтобы writableStream закрылся после того, как получил все данные из канала?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Потоки с возможностью записи не генерируют end, только потоки с возможностью чтения генерируют такого рода события.
Эквивалентом доступного для записи потока является finish. Вы можете найти подробности об этом событии в документация Node.js.
Причина, по которой доступные для чтения и записи потоки имеют разные события, сигнализирующие об их завершении/завершении, заключается в том, что существуют также гибридные потоки (такие как DuplexStream), которые состоят из одновременно читаемого и записываемого потоков, и, следовательно, вам нужно уметь различать один и другой тип события.
Я немного изменил вопрос из-за предоставленной вами информации
Почему тогда gulp.dest(path.resolve(paths["html/static/css"])) завершается нормально, а writableStream - нет? Нужно ли мне как-то обрабатывать конечное событие входящего читаемого потока в моем writableStream, чтобы завершить его?