распаковывать файлы на S3 не получается, не знаю почему

(новая информация ниже) Я пытаюсь настроить лямбда-функцию, которая реагирует на загруженные файлы tgz, распаковывая их и записывая результаты обратно в S3. Распаковка и распаковка работают нормально, но загрузка на S3 завершается неудачно:

/Users/russell/lambda/gzip/node_modules/aws-sdk/lib/s3/managed_upload.js:350
    var buf = self.body.read(self.partSize - self.partBuffer.length) ||
                        ^
TypeError: undefined is not a function
    at ManagedUpload.fillStream (/Users/russell/lambda/gzip/node_modules/aws-sdk/lib/s3/managed_upload.js:350:25)
    at Entry.<anonymous> (/Users/russell/lambda/gzip/node_modules/aws-sdk/lib/s3/managed_upload.js:167:28)
    at Entry.emit (events.js:104:17)
    at Entry._read (/Users/russell/lambda/gzip/node_modules/tar/lib/entry.js:123:12)
    at Entry.end (/Users/russell/lambda/gzip/node_modules/tar/lib/entry.js:82:8)
    at Parse._process (/Users/russell/lambda/gzip/node_modules/tar/lib/parse.js:107:13)
    at BlockStream.<anonymous> (/Users/russell/lambda/gzip/node_modules/tar/lib/parse.js:47:8)
  ,  at BlockStream.emit (events.js:107:17)
    at BlockStream._emitChunk (/Users/russell/lambda/gzip/node_modules/tar/node_modules/block-stream/block-stream.js:145:10)
    at BlockStream.write (/Users/russell/lambda/gzip/node_modules/tar/node_modules/block-stream/block-stream.js:45:10)

Эта ошибка возникает при записи в S3, но если вместо этого я записываю файлы локально на диск, это работает, поэтому конвейер работает правильно.

Вот код, который демонстрирует проблему:

var aws = require('aws-sdk');
var s3 = new aws.S3({apiVersion: '2006-03-01'});
var zlib = require('zlib');
var tar = require('tar');
var fstream = require('fstream');

fstream.Reader({'path': 'testdata.tar.gz'})
    .pipe(zlib.Unzip())
    .pipe(tar.Parse())
    .on('entry', function(entry) {
        var filename = entry.path;
        console.log('got ' + entry.type + ' ' + filename);
        if (entry.type == 'File') {
            if (1) { // switch between working and nonworking cases
                s3.upload({Bucket: 'my_bucket', Key: 'gunzip-test/' + filename, Body: entry}, {},
                          function(err, data) {
                              if (err) 
                                  console.log('ERROR!');
                              else
                                  console.log('OK');
                          });
            }
            else {
                entry.pipe(fstream.Writer({ 'path': '/tmp/mytest/' + filename }));
            }
        }
    });

Если код настроен на запись в S3, он завершается с ошибкой, описанной выше, если он записывает извлеченные файлы локально, это успешно. ENTRY является потоком, и в соответствии с документом должен быть принят в параметре загрузки тела. Я поместил оператор печати в ManagedUpload, где происходит сбой, и подтвердил, что self.body является потоком:

var stream = require('stream');
console.log('is it a stream? ' + ((self.body instanceof stream) ? 'yes' : 'no'));
console.log('self.body.read is ' + self.body.read);

возвращается

$ got File gunzip.js
is it a stream? yes
self.body.read is undefined

Я довольно новичок в aws и node.js, так что с этим может быть основная проблема, но я провел день и не нашел его. Я сделал вызов загрузки с распаковкой вместо gzip, и это сработало (использование лямбда-функций для распаковки архивов в S3 - это действительно sloooooow) Может кто-нибудь указать мне на то, что я делаю неправильно в этом коде?

Спасибо

Я думаю, что понимаю это немного лучше. Я разбил трубопровод на куски и посмотрел на каждого. Проблема в том, что tar.Parse использует fstream, а не stream. Если я посмотрю на возвращение оператора .pipe (tar.Parse ()), то это поток, но это не stream.Readable или stream.Writable. fstream не определяет метод read () (его читатель основан на Stream, он не является stream.Readable), поэтому tar.Parse, который основан на Stream, также не имеет его.

Таким образом, уточнение вопроса заключается в том, является ли это ошибкой в ​​fstream или fstream не предназначен для использования в качестве потока? Я думаю, что это ошибка - из README:

«Как и потоки FS, но со статистикой на них и поддержкой каталогов и символических ссылок, а также обычных файлов. Кроме того, вы можете использовать это для установки статистики для файла, даже если вы не меняете его содержимое, или для создать символическую ссылку и т. д.

Ответы на вопрос(2)

Ваш ответ на вопрос