Created
April 5, 2019 16:55
-
-
Save diamondap/b6b36dd50e1e94e2bbe89a221124eb76 to your computer and use it in GitHub Desktop.
Workaround for https://github.com/mafintosh/tar-stream/issues/64
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// In the code below, extract is a tar-stream extract object. | |
// See https://github.com/mafintosh/tar-stream/blob/master/extract.js | |
// | |
// This 'entry' handler does not care about the contents of the entry, | |
// it just has to restructure the tar header data into a format that | |
// the caller understands. It then passes 'stream' to a PassThrough | |
// which discards the contents and allows tar-stream to move on to | |
// the next entry. | |
// | |
// The problem with the initial pipe to PassThrough on line 35 is that | |
// with multi-megabyte files, 'stream' pauses because PassThrough seems | |
// to pause. | |
// | |
// The workaround code on lines 41-43 fixes this in my local tests. | |
// | |
extract.on('entry', function(header, stream, next) { | |
var fileStat = tarReader._headerToFileStat(header); | |
var relPath = header.name; | |
tarReader.emit('entry', { relPath: relPath, fileStat: fileStat }); | |
stream.on('end', function() { | |
if (header.type === "file") { | |
tarReader.fileCount += 1; | |
} else if (header.type === "directory") { | |
tarReader.dirCount += 1; | |
} | |
next(); | |
}); | |
// The line below was the original call to pipe the tar stream | |
// to a PassThrough reader. This stalled on multi-megabyte files. | |
// It looks like tar-stream's internal writer paused because the | |
// PassThrough stream paused. | |
// | |
// stream.pipe(new PassThrough()); | |
// This works around https://github.com/mafintosh/tar-stream/issues/64 | |
// by explicitly unpausing the PassThrough stream. Not sure why it | |
// only pauses once. | |
// | |
let pt = new PassThrough(); | |
stream.pipe(pt); | |
pt.resume(); | |
}); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment