Я использую следующий код для загрузки и расшифровки файлов.
// Kick off an async promise to download the file
promises.push(new Promise((resolve, reject) => {
// Create a request for the file
const uri = `http://127.0.0.1:8080/${file}`
const req = request(encodeURI(uri))
// Stream download the file
const stream = req
.on('error', (error) => {
console.error(`Failure downloading ${file} with error ${error}`);
// Always resolve an error. It should not stop the stream. But will be reported on the UI.
resolve();
})
// Pipe it to decryption
.pipe(decipher)
.on('error', (error) => {
console.error(`Error decrypting ${file} due to error ${error}`);
})
.on('finish', () => {
console.timeEnd(file);
resolve();
});
// .pipe(progressStream({drain: false}, (progress) => {}))
// .pipe(passThrough.PassThrough())
// .on('error', (error) => {
// console.error(`Error progressing ${file} due to error ${error}`);
// });
archive.append(stream, { name: file });
}));
, но я испытываю несколько странных сценариев, которые я не понимаю.
Во-первых, если нет ошибок, все выше работает как ожидалось.т.е. нет ошибок загрузки или дешифрования запроса.
Но если есть ошибка
1) Запрос 'error' не запускается - вместо этого он попадает в расшифровщик при 'error'
2) Расшифровка «error» вызывает событие «unpipe» для архиватора.Это несколько известный результат, который задокументирован здесь
3) Если я раскомментирую код после 'finish' и отправлю по конвейеру в progressStream или passThrough, то в архиваторе не будет события 'unpipe'.Вместо этого приложение зависает, и обещание никогда не выполняется.Похоже, что «unpipe» все еще происходит, но ни одно событие, которое я могу найти, не испускается.
Хотя я немного понимаю 2) другие моменты сбивают меня с толку.Зачем в трубопроводе к дополнительным потокам после «расшифровывать» скрывать событие «unpipe».Почему только «расшифровать» сообщают об ошибках.
Обновление: Я создал репозиторий, чтобы повторить проблему.Его можно найти на https://github.com/sregger/pipe-issue.