From 60cfb4bd3200503fbe18cea8ee48880f7e506eb5 Mon Sep 17 00:00:00 2001 From: Robert Nagy Date: Fri, 5 Nov 2021 13:25:15 +0200 Subject: [PATCH 01/11] stream: add global Stream.defaultHighwaterMark --- doc/api/stream.md | 10 ++++++++++ lib/internal/streams/legacy.js | 3 +++ lib/internal/streams/state.js | 3 ++- 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/doc/api/stream.md b/doc/api/stream.md index 4f242a5d519da2..773590ad5d6dd9 100644 --- a/doc/api/stream.md +++ b/doc/api/stream.md @@ -25,6 +25,16 @@ const stream = require('stream'); The `stream` module is useful for creating new types of stream instances. It is usually not necessary to use the `stream` module to consume streams. +### Class property: `Stream.defaultHighWatermark` + + +* {integer} **Default:** `Buffer.poolSize` + +This is the size (in bytes) for the deafault highwater mark for +readable and writable streams. This value may be modified. + ## Organization of this document This document contains two primary sections and a third section for notes. The diff --git a/lib/internal/streams/legacy.js b/lib/internal/streams/legacy.js index 0a0d0571c46378..3b932748e358bf 100644 --- a/lib/internal/streams/legacy.js +++ b/lib/internal/streams/legacy.js @@ -5,6 +5,7 @@ const { ObjectSetPrototypeOf, } = primordials; +const { Buffer } = require('buffer'); const EE = require('events'); function Stream(opts) { @@ -111,4 +112,6 @@ function prependListener(emitter, event, fn) { emitter._events[event] = [fn, emitter._events[event]]; } +Stream.defaultHighwaterMark = Buffer.poolSize; + module.exports = { Stream, prependListener }; diff --git a/lib/internal/streams/state.js b/lib/internal/streams/state.js index 83050a62f9cedc..21dd84eb13d7d6 100644 --- a/lib/internal/streams/state.js +++ b/lib/internal/streams/state.js @@ -6,6 +6,7 @@ const { } = primordials; const { ERR_INVALID_ARG_VALUE } = require('internal/errors').codes; +const { Stream } = require('internal/streams/legacy'); function highWaterMarkFrom(options, isDuplex, duplexKey) { return options.highWaterMark != null ? options.highWaterMark : @@ -13,7 +14,7 @@ function highWaterMarkFrom(options, isDuplex, duplexKey) { } function getDefaultHighWaterMark(objectMode) { - return objectMode ? 16 : 16 * 1024; + return objectMode ? 16 : Stream.defaultHighwaterMark; } function getHighWaterMark(state, options, duplexKey, isDuplex) { From bdb5fbc9a0a7f94037073ab21a0fbaf2dab4707c Mon Sep 17 00:00:00 2001 From: Robert Nagy Date: Fri, 5 Nov 2021 22:53:05 +0200 Subject: [PATCH 02/11] fixup --- lib/internal/streams/legacy.js | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/lib/internal/streams/legacy.js b/lib/internal/streams/legacy.js index 3b932748e358bf..3af5953cc4e4ee 100644 --- a/lib/internal/streams/legacy.js +++ b/lib/internal/streams/legacy.js @@ -112,6 +112,14 @@ function prependListener(emitter, event, fn) { emitter._events[event] = [fn, emitter._events[event]]; } -Stream.defaultHighwaterMark = Buffer.poolSize; +let defaultHighwaterMark = null +ObjectDefineProperty(Stream, 'defaultHighwaterMark', { + get () { + return defaultHighwaterMark ?? Buffer.poolSize; + }, + set (value) { + defaultHighwaterMark = value; + } +}) module.exports = { Stream, prependListener }; From 7c7c4ab4e574ca78bf3f919a3a57966494d5c7ee Mon Sep 17 00:00:00 2001 From: Robert Nagy Date: Fri, 5 Nov 2021 23:00:58 +0200 Subject: [PATCH 03/11] fixup: objectmode --- lib/internal/streams/legacy.js | 10 ++++++++++ lib/internal/streams/state.js | 2 +- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/lib/internal/streams/legacy.js b/lib/internal/streams/legacy.js index 3af5953cc4e4ee..9e6e22445ba36f 100644 --- a/lib/internal/streams/legacy.js +++ b/lib/internal/streams/legacy.js @@ -122,4 +122,14 @@ ObjectDefineProperty(Stream, 'defaultHighwaterMark', { } }) +let defaultObjectModeHighwaterMark = null +ObjectDefineProperty(Stream, 'defaultObjectModeHighwaterMark', { + get () { + return defaultObjectModeHighwaterMark ?? 16; + }, + set (value) { + defaultObjectModeHighwaterMark = value; + } +}) + module.exports = { Stream, prependListener }; diff --git a/lib/internal/streams/state.js b/lib/internal/streams/state.js index 21dd84eb13d7d6..9e03cf1fe5ea51 100644 --- a/lib/internal/streams/state.js +++ b/lib/internal/streams/state.js @@ -14,7 +14,7 @@ function highWaterMarkFrom(options, isDuplex, duplexKey) { } function getDefaultHighWaterMark(objectMode) { - return objectMode ? 16 : Stream.defaultHighwaterMark; + return objectMode ? Stream.defaultObjectModeHighwaterMark : Stream.defaultHighwaterMark; } function getHighWaterMark(state, options, duplexKey, isDuplex) { From 4305c55cc5d9eb1d7f349bbbb9440c33605ad313 Mon Sep 17 00:00:00 2001 From: Robert Nagy Date: Sun, 7 Nov 2021 11:31:09 +0200 Subject: [PATCH 04/11] fixup --- lib/internal/streams/legacy.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/internal/streams/legacy.js b/lib/internal/streams/legacy.js index 9e6e22445ba36f..a858a31761fe8c 100644 --- a/lib/internal/streams/legacy.js +++ b/lib/internal/streams/legacy.js @@ -112,24 +112,24 @@ function prependListener(emitter, event, fn) { emitter._events[event] = [fn, emitter._events[event]]; } -let defaultHighwaterMark = null +let defaultHighwaterMark = null; ObjectDefineProperty(Stream, 'defaultHighwaterMark', { get () { - return defaultHighwaterMark ?? Buffer.poolSize; + return defaultHighwaterMark || Buffer.poolSize || 16 * 1024; }, set (value) { defaultHighwaterMark = value; } -}) +}); -let defaultObjectModeHighwaterMark = null +let defaultObjectModeHighwaterMark = null; ObjectDefineProperty(Stream, 'defaultObjectModeHighwaterMark', { get () { - return defaultObjectModeHighwaterMark ?? 16; + return defaultObjectModeHighwaterMark || 16; }, set (value) { defaultObjectModeHighwaterMark = value; } -}) +}); module.exports = { Stream, prependListener }; From 76d12f26c1de9e270977c6d415b724c3e8f7f417 Mon Sep 17 00:00:00 2001 From: Robert Nagy Date: Sun, 7 Nov 2021 21:01:22 +0200 Subject: [PATCH 05/11] fixup --- doc/api/stream.md | 6 +++--- lib/internal/streams/legacy.js | 39 +++++++++++++++++++++++++++------- 2 files changed, 34 insertions(+), 11 deletions(-) diff --git a/doc/api/stream.md b/doc/api/stream.md index 773590ad5d6dd9..78742e87455699 100644 --- a/doc/api/stream.md +++ b/doc/api/stream.md @@ -25,14 +25,14 @@ const stream = require('stream'); The `stream` module is useful for creating new types of stream instances. It is usually not necessary to use the `stream` module to consume streams. -### Class property: `Stream.defaultHighWatermark` +### Class property: `Stream.defaultHighWaterMark` -* {integer} **Default:** `Buffer.poolSize` +* {integer} **Default:** `Math.max(Buffer.poolSize, 16 * 1024)` -This is the size (in bytes) for the deafault highwater mark for +This is the size (in bytes) for the deafault high water mark for readable and writable streams. This value may be modified. ## Organization of this document diff --git a/lib/internal/streams/legacy.js b/lib/internal/streams/legacy.js index a858a31761fe8c..189a9098cfe832 100644 --- a/lib/internal/streams/legacy.js +++ b/lib/internal/streams/legacy.js @@ -3,7 +3,14 @@ const { ArrayIsArray, ObjectSetPrototypeOf, + MathMax } = primordials; +const { + codes: { + ERR_INVALID_ARG_TYPE, + ERR_INVALID_ARG_VALUE, + } +} = require('internal/errors'); const { Buffer } = require('buffer'); const EE = require('events'); @@ -112,23 +119,39 @@ function prependListener(emitter, event, fn) { emitter._events[event] = [fn, emitter._events[event]]; } -let defaultHighwaterMark = null; -ObjectDefineProperty(Stream, 'defaultHighwaterMark', { +let defaultHighWaterMark = null; +ObjectDefineProperty(Stream, 'defaultHighWaterMark', { get () { - return defaultHighwaterMark || Buffer.poolSize || 16 * 1024; + return defaultHighWaterMark || MathMax(Buffer.poolSize, 16 * 1024); }, set (value) { - defaultHighwaterMark = value; + if (!Number.isInteger(value)) { + throw ERR_INVALID_ARG_TYPE('value', 'Integer', value); + } + + if (value < 1) { + throw ERR_INVALID_ARG_VALUE('value', value); + } + + defaultHighWaterMark = value; } }); -let defaultObjectModeHighwaterMark = null; -ObjectDefineProperty(Stream, 'defaultObjectModeHighwaterMark', { +let defaultObjectModeHighWaterMark = 16; +ObjectDefineProperty(Stream, 'defaultObjectModeHighWaterMark', { get () { - return defaultObjectModeHighwaterMark || 16; + return defaultObjectModeHighWaterMark; }, set (value) { - defaultObjectModeHighwaterMark = value; + if (!Number.isInteger(value)) { + throw ERR_INVALID_ARG_TYPE('value', 'Integer', value); + } + + if (value < 1) { + throw ERR_INVALID_ARG_VALUE('value', value); + } + + defaultObjectModeHighWaterMark = value; } }); From 0111be29cfa15831652af2972659a25a5c66df47 Mon Sep 17 00:00:00 2001 From: Robert Nagy Date: Sun, 7 Nov 2021 22:20:36 +0200 Subject: [PATCH 06/11] Update lib/internal/streams/state.js Co-authored-by: Vitaly Kuzmich --- lib/internal/streams/state.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/internal/streams/state.js b/lib/internal/streams/state.js index 9e03cf1fe5ea51..09b989078b11ed 100644 --- a/lib/internal/streams/state.js +++ b/lib/internal/streams/state.js @@ -14,7 +14,7 @@ function highWaterMarkFrom(options, isDuplex, duplexKey) { } function getDefaultHighWaterMark(objectMode) { - return objectMode ? Stream.defaultObjectModeHighwaterMark : Stream.defaultHighwaterMark; + return objectMode ? Stream.defaultObjectModeHighWaterMark : Stream.defaultHighWaterMark; } function getHighWaterMark(state, options, duplexKey, isDuplex) { From 28da070d70466f2c40f283d7162bc4cec53f5b2b Mon Sep 17 00:00:00 2001 From: Robert Nagy Date: Sun, 7 Nov 2021 22:21:54 +0200 Subject: [PATCH 07/11] fixup --- lib/internal/streams/state.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/internal/streams/state.js b/lib/internal/streams/state.js index 09b989078b11ed..f2e8d96eab4cde 100644 --- a/lib/internal/streams/state.js +++ b/lib/internal/streams/state.js @@ -14,7 +14,8 @@ function highWaterMarkFrom(options, isDuplex, duplexKey) { } function getDefaultHighWaterMark(objectMode) { - return objectMode ? Stream.defaultObjectModeHighWaterMark : Stream.defaultHighWaterMark; + return objectMode ? Stream.defaultObjectModeHighWaterMark : + Stream.defaultHighWaterMark; } function getHighWaterMark(state, options, duplexKey, isDuplex) { From 2df5e20125af4f3c0a4f4377d2329d24b6e86cfb Mon Sep 17 00:00:00 2001 From: Robert Nagy Date: Mon, 8 Nov 2021 07:38:25 +0200 Subject: [PATCH 08/11] Update doc/api/stream.md Co-authored-by: Mestery --- doc/api/stream.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/api/stream.md b/doc/api/stream.md index 78742e87455699..d3fdd0bc49354b 100644 --- a/doc/api/stream.md +++ b/doc/api/stream.md @@ -32,7 +32,7 @@ added: v0.11.3 * {integer} **Default:** `Math.max(Buffer.poolSize, 16 * 1024)` -This is the size (in bytes) for the deafault high water mark for +This is the size (in bytes) for the default high water mark for readable and writable streams. This value may be modified. ## Organization of this document From 1030eba331404f5b4b36acf2978abbfdf4d7e2e9 Mon Sep 17 00:00:00 2001 From: Robert Nagy Date: Mon, 8 Nov 2021 07:50:37 +0200 Subject: [PATCH 09/11] fixup --- doc/api/stream.md | 2 +- lib/internal/streams/legacy.js | 11 ++++++----- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/doc/api/stream.md b/doc/api/stream.md index d3fdd0bc49354b..6a16276d8eba8a 100644 --- a/doc/api/stream.md +++ b/doc/api/stream.md @@ -30,7 +30,7 @@ usually not necessary to use the `stream` module to consume streams. added: v0.11.3 --> -* {integer} **Default:** `Math.max(Buffer.poolSize, 16 * 1024)` +* {integer} **Default:** `16 * 1024` This is the size (in bytes) for the default high water mark for readable and writable streams. This value may be modified. diff --git a/lib/internal/streams/legacy.js b/lib/internal/streams/legacy.js index 189a9098cfe832..483f9b08fc1c23 100644 --- a/lib/internal/streams/legacy.js +++ b/lib/internal/streams/legacy.js @@ -3,7 +3,8 @@ const { ArrayIsArray, ObjectSetPrototypeOf, - MathMax + MathMax, + NumberIsInteger, } = primordials; const { codes: { @@ -119,13 +120,13 @@ function prependListener(emitter, event, fn) { emitter._events[event] = [fn, emitter._events[event]]; } -let defaultHighWaterMark = null; +let defaultHighWaterMark = 16 * 1024; ObjectDefineProperty(Stream, 'defaultHighWaterMark', { get () { - return defaultHighWaterMark || MathMax(Buffer.poolSize, 16 * 1024); + return defaultHighWaterMark; }, set (value) { - if (!Number.isInteger(value)) { + if (!NumberIsInteger(value)) { throw ERR_INVALID_ARG_TYPE('value', 'Integer', value); } @@ -143,7 +144,7 @@ ObjectDefineProperty(Stream, 'defaultObjectModeHighWaterMark', { return defaultObjectModeHighWaterMark; }, set (value) { - if (!Number.isInteger(value)) { + if (!NumberIsInteger(value)) { throw ERR_INVALID_ARG_TYPE('value', 'Integer', value); } From 44d61e40e835725b8a7b01befb3faa510b831306 Mon Sep 17 00:00:00 2001 From: Robert Nagy Date: Fri, 19 Nov 2021 19:25:49 +0100 Subject: [PATCH 10/11] fixup --- lib/internal/streams/legacy.js | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/lib/internal/streams/legacy.js b/lib/internal/streams/legacy.js index 483f9b08fc1c23..d3785ea0ab924d 100644 --- a/lib/internal/streams/legacy.js +++ b/lib/internal/streams/legacy.js @@ -2,8 +2,8 @@ const { ArrayIsArray, + ObjectDefineProperty, ObjectSetPrototypeOf, - MathMax, NumberIsInteger, } = primordials; const { @@ -13,7 +13,6 @@ const { } } = require('internal/errors'); -const { Buffer } = require('buffer'); const EE = require('events'); function Stream(opts) { @@ -122,10 +121,10 @@ function prependListener(emitter, event, fn) { let defaultHighWaterMark = 16 * 1024; ObjectDefineProperty(Stream, 'defaultHighWaterMark', { - get () { + get() { return defaultHighWaterMark; }, - set (value) { + set(value) { if (!NumberIsInteger(value)) { throw ERR_INVALID_ARG_TYPE('value', 'Integer', value); } @@ -140,10 +139,10 @@ ObjectDefineProperty(Stream, 'defaultHighWaterMark', { let defaultObjectModeHighWaterMark = 16; ObjectDefineProperty(Stream, 'defaultObjectModeHighWaterMark', { - get () { + get() { return defaultObjectModeHighWaterMark; }, - set (value) { + set(value) { if (!NumberIsInteger(value)) { throw ERR_INVALID_ARG_TYPE('value', 'Integer', value); } From eb0c8c3a425af1c178a29df4e22bc3f01eee38bf Mon Sep 17 00:00:00 2001 From: Robert Nagy Date: Fri, 19 Nov 2021 21:31:42 +0100 Subject: [PATCH 11/11] Update doc/api/stream.md Co-authored-by: mscdex --- doc/api/stream.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/api/stream.md b/doc/api/stream.md index 6a16276d8eba8a..1381149568a8c0 100644 --- a/doc/api/stream.md +++ b/doc/api/stream.md @@ -27,7 +27,7 @@ usually not necessary to use the `stream` module to consume streams. ### Class property: `Stream.defaultHighWaterMark` * {integer} **Default:** `16 * 1024`