diff --git a/lib/internal/streams/readable.js b/lib/internal/streams/readable.js index 33d43aa552b075..3d37f277a37779 100644 --- a/lib/internal/streams/readable.js +++ b/lib/internal/streams/readable.js @@ -62,6 +62,7 @@ const { codes: { ERR_INVALID_ARG_TYPE, ERR_METHOD_NOT_IMPLEMENTED, + ERR_OUT_OF_RANGE, ERR_STREAM_PUSH_AFTER_EOF, ERR_STREAM_UNSHIFT_AFTER_END_EVENT, } @@ -363,9 +364,8 @@ Readable.prototype.setEncoding = function(enc) { // Don't raise the hwm > 1GB. const MAX_HWM = 0x40000000; function computeNewHighWaterMark(n) { - if (n >= MAX_HWM) { - // TODO(ronag): Throw ERR_VALUE_OUT_OF_RANGE. - n = MAX_HWM; + if (n > MAX_HWM) { + throw new ERR_OUT_OF_RANGE('size', '<= 1GiB', n); } else { // Get the next highest power of 2 to prevent increasing hwm excessively in // tiny amounts. diff --git a/test/parallel/test-streams-highwatermark.js b/test/parallel/test-streams-highwatermark.js index 18c53b1032e849..7018c5bf29ce08 100644 --- a/test/parallel/test-streams-highwatermark.js +++ b/test/parallel/test-streams-highwatermark.js @@ -70,3 +70,18 @@ const { inspect } = require('util'); assert.strictEqual(readable._readableState.highWaterMark, Number(size)); }); } + +{ + // Test highwatermark limit + const hwm = 0x40000000 + 1; + const readable = stream.Readable({ + read() {}, + }); + + assert.throws(() => readable.read(hwm), common.expectsError({ + code: 'ERR_OUT_OF_RANGE', + message: 'The value of "size" is out of range.' + + ' It must be <= 1GiB. Received ' + + hwm, + })); +}