From c49b12e65c08734861629e999268a9b45ebeb667 Mon Sep 17 00:00:00 2001 From: Anna Henningsen Date: Sun, 18 Jun 2017 12:03:38 +0200 Subject: [PATCH] stream: fix `undefined` in Readable object mode Fixes `this.push(undefined)`. Fixes: https://github.com/nodejs/node/issues/13753 --- lib/_stream_readable.js | 4 +- .../test-stream-objectmode-undefined.js | 44 +++++++++++++++++++ 2 files changed, 46 insertions(+), 2 deletions(-) create mode 100644 test/parallel/test-stream-objectmode-undefined.js diff --git a/lib/_stream_readable.js b/lib/_stream_readable.js index 900f42e1713954..a308e8baeda452 100644 --- a/lib/_stream_readable.js +++ b/lib/_stream_readable.js @@ -215,8 +215,8 @@ function readableAddChunk(stream, chunk, encoding, addToFront, skipChunkCheck) { stream.emit('error', er); } else if (state.objectMode || chunk && chunk.length > 0) { if (typeof chunk !== 'string' && - Object.getPrototypeOf(chunk) !== Buffer.prototype && - !state.objectMode) { + !state.objectMode && + Object.getPrototypeOf(chunk) !== Buffer.prototype) { chunk = Stream._uint8ArrayToBuffer(chunk); } diff --git a/test/parallel/test-stream-objectmode-undefined.js b/test/parallel/test-stream-objectmode-undefined.js new file mode 100644 index 00000000000000..64b960f92b4995 --- /dev/null +++ b/test/parallel/test-stream-objectmode-undefined.js @@ -0,0 +1,44 @@ +'use strict'; +const common = require('../common'); +const assert = require('assert'); +const { Readable, Writable, Transform } = require('stream'); + +{ + const stream = new Readable({ + objectMode: true, + read: common.mustCall(() => { + stream.push(undefined); + stream.push(null); + }) + }); + + stream.on('data', common.mustCall((chunk) => { + assert.strictEqual(chunk, undefined); + })); +} + +{ + const stream = new Writable({ + objectMode: true, + write: common.mustCall((chunk) => { + assert.strictEqual(chunk, undefined); + }) + }); + + stream.write(undefined); +} + +{ + const stream = new Transform({ + objectMode: true, + transform: common.mustCall((chunk) => { + stream.push(chunk); + }) + }); + + stream.on('data', common.mustCall((chunk) => { + assert.strictEqual(chunk, undefined); + })); + + stream.write(undefined); +}