From b635d1aa2b3d4b6c3bbfa9fe0d3e413460405dbe Mon Sep 17 00:00:00 2001 From: Ben Halverson Date: Sat, 26 Aug 2017 00:53:27 -0700 Subject: [PATCH 1/4] stream: migrate _stream_readable use error codes --- lib/_stream_readable.js | 8 +++++--- lib/internal/errors.js | 5 +++++ .../test-stream-readable-with-unimplemented-_read.js | 7 +++++-- test/parallel/test-stream-unshift-read-race.js | 5 ++++- 4 files changed, 19 insertions(+), 6 deletions(-) diff --git a/lib/_stream_readable.js b/lib/_stream_readable.js index 78732ed185a662..deea864647bfce 100644 --- a/lib/_stream_readable.js +++ b/lib/_stream_readable.js @@ -31,6 +31,7 @@ const util = require('util'); const debug = util.debuglog('stream'); const BufferList = require('internal/streams/BufferList'); const destroyImpl = require('internal/streams/destroy'); +const errors = require('internal/errors'); var StringDecoder; util.inherits(Readable, Stream); @@ -233,11 +234,12 @@ function readableAddChunk(stream, chunk, encoding, addToFront, skipChunkCheck) { if (addToFront) { if (state.endEmitted) - stream.emit('error', new Error('stream.unshift() after end event')); + stream.emit('error', + new errors.Error('ERR_STREAM_UNSHIFT_AFTER_END_EVENT')); else addChunk(stream, state, chunk, true); } else if (state.ended) { - stream.emit('error', new Error('stream.push() after EOF')); + stream.emit('error', new errors.Error('ERR_STREAM_PUSH_AFTER_EOF')); } else { state.reading = false; if (state.decoder && !encoding) { @@ -548,7 +550,7 @@ function maybeReadMore_(stream, state) { // for virtual (non-string, non-buffer) streams, "length" is somewhat // arbitrary, and perhaps not very meaningful. Readable.prototype._read = function(n) { - this.emit('error', new Error('_read() is not implemented')); + this.emit('error', new errors.Error('ERR_STREAM_READ_NOT_IMPLEMENTED')); }; Readable.prototype.pipe = function(dest, pipeOpts) { diff --git a/lib/internal/errors.js b/lib/internal/errors.js index 9bf0951eece120..30d97d28094b93 100644 --- a/lib/internal/errors.js +++ b/lib/internal/errors.js @@ -323,6 +323,11 @@ E('ERR_SOCKET_CLOSED', 'Socket is closed'); E('ERR_SOCKET_DGRAM_NOT_RUNNING', 'Not running'); E('ERR_STDERR_CLOSE', 'process.stderr cannot be closed'); E('ERR_STDOUT_CLOSE', 'process.stdout cannot be closed'); +E('ERR_STREAM_ENDREADABLE_CALLED_ON_NONEMPTY', + 'endReadable() called on a non-empty stream'); +E('ERR_STREAM_PUSH_AFTER_EOF', 'stream.push() after EOF'); +E('ERR_STREAM_READ_NOT_IMPLEMENTED', '_read() is not implemented'); +E('ERR_STREAM_UNSHIFT_AFTER_END_EVENT', 'stream.unshift() after end event'); E('ERR_STREAM_WRAP', 'Stream has StringDecoder set or is in objectMode'); E('ERR_TLS_CERT_ALTNAME_INVALID', 'Hostname/IP does not match certificate\'s altnames: %s'); diff --git a/test/parallel/test-stream-readable-with-unimplemented-_read.js b/test/parallel/test-stream-readable-with-unimplemented-_read.js index ce325c0823e29c..12b1087a712033 100644 --- a/test/parallel/test-stream-readable-with-unimplemented-_read.js +++ b/test/parallel/test-stream-readable-with-unimplemented-_read.js @@ -1,8 +1,11 @@ 'use strict'; -require('../common'); +const common = require('../common'); const stream = require('stream'); const assert = require('assert'); const readable = new stream.Readable(); -assert.throws(() => readable.read(), /not implemented/); +assert.throws(() => readable.read(), common.expectsError({ + type: Error, + message: 'ERR_STREAM_READ_NOT_IMPLEMENTED' +})); diff --git a/test/parallel/test-stream-unshift-read-race.js b/test/parallel/test-stream-unshift-read-race.js index e04de5392aa203..5c08b2e7239265 100644 --- a/test/parallel/test-stream-unshift-read-race.js +++ b/test/parallel/test-stream-unshift-read-race.js @@ -70,7 +70,10 @@ r._read = function(n) { function pushError() { assert.throws(function() { r.push(Buffer.allocUnsafe(1)); - }, /^Error: stream\.push\(\) after EOF$/); + }, common.expectsError({ + type: Error, + message: 'stream.push() after EOF' + })); } From eafcac4bca069626fc8db2d54eef19d1d5c0716d Mon Sep 17 00:00:00 2001 From: Joyee Cheung Date: Sat, 28 Oct 2017 18:56:38 +0800 Subject: [PATCH 2/4] fix common.expectsError usage in stream tests --- .../test-stream-readable-with-unimplemented-_read.js | 3 ++- test/parallel/test-stream-unshift-read-race.js | 7 ++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/test/parallel/test-stream-readable-with-unimplemented-_read.js b/test/parallel/test-stream-readable-with-unimplemented-_read.js index 12b1087a712033..b644bd40674367 100644 --- a/test/parallel/test-stream-readable-with-unimplemented-_read.js +++ b/test/parallel/test-stream-readable-with-unimplemented-_read.js @@ -6,6 +6,7 @@ const assert = require('assert'); const readable = new stream.Readable(); assert.throws(() => readable.read(), common.expectsError({ + code: 'ERR_STREAM_READ_NOT_IMPLEMENTED', type: Error, - message: 'ERR_STREAM_READ_NOT_IMPLEMENTED' + message: '_read() is not implemented' })); diff --git a/test/parallel/test-stream-unshift-read-race.js b/test/parallel/test-stream-unshift-read-race.js index 5c08b2e7239265..a67147506e48c3 100644 --- a/test/parallel/test-stream-unshift-read-race.js +++ b/test/parallel/test-stream-unshift-read-race.js @@ -71,6 +71,7 @@ function pushError() { assert.throws(function() { r.push(Buffer.allocUnsafe(1)); }, common.expectsError({ + code: 'ERR_STREAM_PUSH_AFTER_EOF', type: Error, message: 'stream.push() after EOF' })); @@ -87,7 +88,11 @@ w._write = function(chunk, encoding, cb) { r.on('end', common.mustCall(function() { assert.throws(function() { r.unshift(Buffer.allocUnsafe(1)); - }, /^Error: stream\.unshift\(\) after end event$/); + }, common.expectsError({ + code: 'ERR_STREAM_UNSHIFT_AFTER_END_EVENT', + type: Error, + message: 'stream.unshift() after end event' + })); w.end(); })); From cb383721959f6cd97a7afbb0a19803893c2e00f3 Mon Sep 17 00:00:00 2001 From: Joyee Cheung Date: Sat, 28 Oct 2017 19:00:47 +0800 Subject: [PATCH 3/4] delete removed error --- lib/internal/errors.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/lib/internal/errors.js b/lib/internal/errors.js index 30d97d28094b93..9919860505bb06 100644 --- a/lib/internal/errors.js +++ b/lib/internal/errors.js @@ -323,8 +323,6 @@ E('ERR_SOCKET_CLOSED', 'Socket is closed'); E('ERR_SOCKET_DGRAM_NOT_RUNNING', 'Not running'); E('ERR_STDERR_CLOSE', 'process.stderr cannot be closed'); E('ERR_STDOUT_CLOSE', 'process.stdout cannot be closed'); -E('ERR_STREAM_ENDREADABLE_CALLED_ON_NONEMPTY', - 'endReadable() called on a non-empty stream'); E('ERR_STREAM_PUSH_AFTER_EOF', 'stream.push() after EOF'); E('ERR_STREAM_READ_NOT_IMPLEMENTED', '_read() is not implemented'); E('ERR_STREAM_UNSHIFT_AFTER_END_EVENT', 'stream.unshift() after end event'); From 0ccc7e4fafcca86eb857976d26eba44e111e25dd Mon Sep 17 00:00:00 2001 From: Joyee Cheung Date: Sat, 28 Oct 2017 19:22:58 +0800 Subject: [PATCH 4/4] add documentations for stream errors --- doc/api/errors.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/doc/api/errors.md b/doc/api/errors.md index fcc39ab2ac81ee..81e4c2905c7379 100644 --- a/doc/api/errors.md +++ b/doc/api/errors.md @@ -1312,6 +1312,24 @@ Node.js does not allow `stdout` or `stderr` Streams to be closed by user code. Used when an attempt is made to close the `process.stdout` stream. By design, Node.js does not allow `stdout` or `stderr` Streams to be closed by user code. + +### ERR_STREAM_PUSH_AFTER_EOF + +Used when an attempt is made to call [`stream.push()`][] after a `null`(EOF) +has been pushed to the stream. + + +### ERR_STREAM_READ_NOT_IMPLEMENTED + +Used when an attempt is made to use a readable stream that has not implemented +[`readable._read()`][]. + + +### ERR_STREAM_UNSHIFT_AFTER_END_EVENT + +Used when an attempt is made to call [`stream.unshift()`][] after the +`end` event has been emitted. + ### ERR_STREAM_WRAP @@ -1457,7 +1475,10 @@ closed. [`ERR_INVALID_ARG_TYPE`]: #ERR_INVALID_ARG_TYPE [`hash.digest()`]: crypto.html#crypto_hash_digest_encoding [`hash.update()`]: crypto.html#crypto_hash_update_data_inputencoding +[`readable._read()`]: stream.html#stream_readable_read_size_1 [`sign.sign()`]: crypto.html#crypto_sign_sign_privatekey_outputformat +[`stream.push()`]: stream.html#stream_readable_push_chunk_encoding +[`stream.unshift()`]: stream.html#stream_readable_unshift_chunk [`subprocess.kill()`]: child_process.html#child_process_subprocess_kill_signal [`subprocess.send()`]: child_process.html#child_process_subprocess_send_message_sendhandle_options_callback [`fs.readFileSync`]: fs.html#fs_fs_readfilesync_path_options