From 28d71a9881bc2d2fd4715be659e087bb5c56be4d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Michalski?= Date: Fri, 12 Jan 2018 14:14:59 +0100 Subject: [PATCH] stream api methods must never throw --- lib/decode-stream.js | 10 +++++++--- lib/encode-stream.js | 16 ++++++++++++---- test/30.stream.js | 37 +++++++++++++++++++++++++++++++++++++ 3 files changed, 56 insertions(+), 7 deletions(-) diff --git a/lib/decode-stream.js b/lib/decode-stream.js index 1ca27e7..e87e245 100644 --- a/lib/decode-stream.js +++ b/lib/decode-stream.js @@ -26,7 +26,11 @@ function DecodeStream(options) { } DecodeStream.prototype._transform = function(chunk, encoding, callback) { - this.decoder.write(chunk); - this.decoder.flush(); - if (callback) callback(); + try { + this.decoder.write(chunk); + this.decoder.flush(); + } catch(e) { + return callback(e); + } + callback(); }; diff --git a/lib/encode-stream.js b/lib/encode-stream.js index 8ff3d6a..2bf96fc 100644 --- a/lib/encode-stream.js +++ b/lib/encode-stream.js @@ -27,11 +27,19 @@ function EncodeStream(options) { } EncodeStream.prototype._transform = function(chunk, encoding, callback) { - this.encoder.write(chunk); - if (callback) callback(); + try { + this.encoder.write(chunk); + } catch(e) { + return callback(e); + } + callback(); }; EncodeStream.prototype._flush = function(callback) { - this.encoder.flush(); - if (callback) callback(); + try { + this.encoder.flush(); + } catch(e) { + return callback(e); + } + callback(); }; diff --git a/test/30.stream.js b/test/30.stream.js index 3988990..8a00c9a 100755 --- a/test/30.stream.js +++ b/test/30.stream.js @@ -22,6 +22,9 @@ var encoded = [ var encodeall = Buffer.concat(encoded); +// invalid msgpack type +var invalencoded = Buffer([0xc1]); + describe(TITLE, function() { it("msgpack.createEncodeStream()", function(done) { @@ -116,4 +119,38 @@ describe(TITLE, function() { if (++count === 3) done(); } }); + + it("msgpack.createDecodeStream().on('error',fn)", function(done) { + var decoder = msgpack.createDecodeStream(); + + decoder.on("error", function(e) { + assert.ok(e instanceof Error, "should be an error"); + setTimeout(done, 1); + }); + + decoder.on("data", function(data) { + assert.fail("should not emit data"); + }); + + decoder.end(invalencoded); + }); + + it("msgpack.createEncodeStream().on('error',fn)", function(done) { + var circular = []; + var encoder = msgpack.createEncodeStream(); + + circular.push(circular); + + encoder.on("error", function(e) { + assert.ok(e instanceof Error, "should be an error"); + setTimeout(done, 1); + }); + + encoder.on("data", function(data) { + assert.fail("should not emit data"); + }); + + encoder.end(circular); + }); + });