From f56d2ab930baa129e2d7be5245bf2e04e64a279e Mon Sep 17 00:00:00 2001 From: Mark David Avery Date: Wed, 5 Oct 2022 15:53:54 -0700 Subject: [PATCH] fix: ensuring close event is emited after stream has ended. For node 18 combaitibility fixes #321 --- lib/parse.js | 4 +++- lib/unpack.js | 1 - package.json | 4 +--- test/extract.js | 28 ++++++++++++++++++++++++++++ 4 files changed, 32 insertions(+), 5 deletions(-) diff --git a/lib/parse.js b/lib/parse.js index 16023f08..be23413e 100644 --- a/lib/parse.js +++ b/lib/parse.js @@ -89,7 +89,6 @@ module.exports = warner(class Parser extends EE { this.emit('prefinish') this.emit('finish') this.emit('end') - this.emit('close') }) } @@ -114,6 +113,9 @@ module.exports = warner(class Parser extends EE { this[ABORTED] = false this[SAW_NULL_BLOCK] = false this[SAW_EOF] = false + + this.on('end', () => setTimeout(() => this.emit('close'))) + if (typeof opt.onwarn === 'function') { this.on('warn', opt.onwarn) } diff --git a/lib/unpack.js b/lib/unpack.js index 458f593d..bfe0dddb 100644 --- a/lib/unpack.js +++ b/lib/unpack.js @@ -234,7 +234,6 @@ class Unpack extends Parser { this.emit('prefinish') this.emit('finish') this.emit('end') - this.emit('close') } } diff --git a/package.json b/package.json index bae4b5e2..5db9f816 100644 --- a/package.json +++ b/package.json @@ -33,9 +33,7 @@ "events-to-array": "^1.1.2", "mutate-fs": "^2.1.1", "rimraf": "^3.0.2", - "tap": "^16.0.1", - "tar-fs": "^2.1.1", - "tar-stream": "^2.2.0" + "tap": "^16.0.1" }, "license": "ISC", "engines": { diff --git a/test/extract.js b/test/extract.js index ae13739c..c23707b0 100644 --- a/test/extract.js +++ b/test/extract.js @@ -10,6 +10,8 @@ const mkdirp = require('mkdirp') const { promisify } = require('util') const rimraf = promisify(require('rimraf')) const mutateFS = require('mutate-fs') +const pipeline = promisify(require('stream').pipeline) +const https = require('https') t.teardown(_ => rimraf(extractdir)) @@ -54,6 +56,32 @@ t.test('basic extracting', t => { t.end() }) +t.test('ensure an open stream is not prematuraly closed', t => { + const dir = path.resolve(extractdir, 'basic-with-stream') + + t.beforeEach(async () => { + await rimraf(dir) + await mkdirp(dir) + }) + + const check = async t => { + t.equal(fs.lstatSync(path.resolve(dir, 'node-tar-main/LICENSE')).size, fs.lstatSync(path.resolve(__dirname, '../LICENSE')).size) + await rimraf(dir) + t.end() + } + + t.test('async promisey', t => { + https.get('https://codeload.github.com/npm/node-tar/tar.gz/main', (stream) => { + return pipeline( + stream, + x({ cwd: dir }, ['node-tar-main/LICENSE']) + ).then(_ => check(t)) + }) + }) + + t.end() +}) + t.test('file list and filter', t => { const file = path.resolve(tars, 'utf8.tar') const dir = path.resolve(extractdir, 'filter')