Путаница в канале Nodejs Stream - событие «unpipe» отсутствует - PullRequest
0 голосов
/ 12 июня 2019

Я использую следующий код для загрузки и расшифровки файлов.

  // 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.

...