From 68a2c9491f2e3d78d6a167c9f02d07b8bf570c26 Mon Sep 17 00:00:00 2001 From: Andreas Lind Petersen Date: Wed, 28 May 2014 22:57:31 +0200 Subject: [PATCH] Avoid emitting the 'error' event more than once. --- lib/PngQuant.js | 17 +++++++++++------ test/PngQuant.js | 21 +++++++++++++++++++++ 2 files changed, 32 insertions(+), 6 deletions(-) diff --git a/lib/PngQuant.js b/lib/PngQuant.js index 3c55d69..8ef0fb2 100644 --- a/lib/PngQuant.js +++ b/lib/PngQuant.js @@ -23,20 +23,18 @@ function PngQuant(pngQuantArgs) { this.hasEnded = false; this.seenDataOnStdout = false; - this.pngQuantProcess.on('error', function (err) { - this.emit('error', err); - }.bind(this)); + this.pngQuantProcess.on('error', this._reportError.bind(this)); this.pngQuantProcess.stderr.on('data', function (data) { if (!this.hasEnded) { - this.emit('error', new Error('Saw pngquant output on stderr: ' + data.toString('ascii'))); + this._reportError(new Error('Saw pngquant output on stderr: ' + data.toString('ascii'))); this.hasEnded = true; } }.bind(this)); this.pngQuantProcess.on('exit', function (exitCode) { if (exitCode > 0 && !this.hasEnded) { - this.emit('error', new Error('The pngquant process exited with a non-zero exit code: ' + exitCode)); + this._reportError(new Error('The pngquant process exited with a non-zero exit code: ' + exitCode)); this.hasEnded = true; } }.bind(this)); @@ -49,7 +47,7 @@ function PngQuant(pngQuantArgs) { if (this.seenDataOnStdout) { this.emit('end'); } else { - this.emit('error', new Error('PngQuant: The stdout stream ended without emitting any data')); + this._reportError(new Error('PngQuant: The stdout stream ended without emitting any data')); } this.hasEnded = true; } @@ -58,6 +56,13 @@ function PngQuant(pngQuantArgs) { util.inherits(PngQuant, Stream); +PngQuant.prototype._reportError = function (err) { + if (!this.hasEnded) { + this.hasEnded = true; + this.emit('error', err); + } +}; + PngQuant.prototype.write = function (chunk) { this.pngQuantProcess.stdin.write(chunk); }; diff --git a/test/PngQuant.js b/test/PngQuant.js index 24a68b0..a3bf2e3 100644 --- a/test/PngQuant.js +++ b/test/PngQuant.js @@ -64,4 +64,25 @@ describe('PngQuant', function () { pngQuant.end(new Buffer('qwvopeqwovkqvwiejvq', 'utf-8')); }); + + it('should emit a single error if an invalid command line is specified', function (done) { + var pngQuant = new PngQuant(['--blabla']), + seenError = false; + + pngQuant.on('error', function (err) { + expect(pngQuant.commandLine, 'to match', /pngquant --blabla/); + if (seenError) { + done(new Error('More than one error event was emitted')); + } else { + seenError = true; + setTimeout(done, 100); + } + }).on('data', function (chunk) { + done(new Error('PngQuant emitted data when an error was expected')); + }).on('end', function (chunk) { + done(new Error('PngQuant emitted end when an error was expected')); + }); + + pngQuant.end(new Buffer('qwvopeqwovkqvwiejvq', 'utf-8')); + }); });