diff --git a/docs/changelog.md b/docs/changelog.md index 10ffbeec..d6635eb1 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -26,6 +26,10 @@ Requires libvips v8.6.0. [#977](https://github.com/lovell/sharp/pull/977) [@jardakotesovec](https://github.com/jardakotesovec) +* Attach finish event listener to a clone only for Stream-based input. + [#995](https://github.com/lovell/sharp/issues/995) + [@whmountains](https://github.com/whmountains) + * Add tilecache before smartcrop to avoid over-computation of previous operations. [#1028](https://github.com/lovell/sharp/issues/1028) [@coffeebite](https://github.com/coffeebite) diff --git a/lib/input.js b/lib/input.js index 08e4aeb6..d2311e92 100644 --- a/lib/input.js +++ b/lib/input.js @@ -155,12 +155,14 @@ function clone () { const clone = this.constructor.call(); clone.options = Object.assign({}, this.options); // Pass 'finish' event to clone for Stream-based input - this.on('finish', function () { - // Clone inherits input data - that._flattenBufferIn(); - clone.options.bufferIn = that.options.bufferIn; - clone.emit('finish'); - }); + if (this._isStreamInput()) { + this.on('finish', function () { + // Clone inherits input data + that._flattenBufferIn(); + clone.options.bufferIn = that.options.bufferIn; + clone.emit('finish'); + }); + } return clone; } diff --git a/test/unit/clone.js b/test/unit/clone.js index 7e404328..922ea48e 100644 --- a/test/unit/clone.js +++ b/test/unit/clone.js @@ -60,4 +60,18 @@ describe('Clone', function () { // Go fs.createReadStream(fixtures.inputJpg).pipe(rotator); }); + + it('Stream-based input attaches finish event listener to original', function () { + const original = sharp(); + const clone = original.clone(); + assert.strictEqual(1, original.listenerCount('finish')); + assert.strictEqual(0, clone.listenerCount('finish')); + }); + + it('Non Stream-based input does not attach finish event listeners', function () { + const original = sharp(fixtures.inputJpg); + const clone = original.clone(); + assert.strictEqual(0, original.listenerCount('finish')); + assert.strictEqual(0, clone.listenerCount('finish')); + }); });