GeezerVison is showing github.com — stream: add setter & getter for default highWaterMark (#46929) · nodejs/node@1fc62c7
File treeExpand file treeCollapse file tree Open diff view settings Expand file treeCollapse file tree Open diff view settings Collapse file Copy file name to clipboardExpand all lines: doc/api/stream.md +23Lines changed: 23 additions & 0 deletions - Display the source diff
- Display the rich diff
| Original file line number | Diff line number | Diff line change |
|---|
@@ -3346,6 +3346,29 @@ reader.read().then(({ value, done }) => { | 3346 | 3346 | }); | 3347 | 3347 | ``` | 3348 | 3348 |
| | 3349 | +### `stream.getDefaultHighWaterMark(objectMode)` | | 3350 | + | | 3351 | +<!-- YAML | | 3352 | +added: REPLACEME | | 3353 | +--> | | 3354 | + | | 3355 | +* {boolean} objectMode | | 3356 | +* Returns: {integer} | | 3357 | + | | 3358 | +Returns the default highWaterMark used by streams. | | 3359 | +Defaults to `16384` (16 KiB), or `16` for `objectMode`. | | 3360 | + | | 3361 | +### `stream.setDefaultHighWaterMark(objectMode, value)` | | 3362 | + | | 3363 | +<!-- YAML | | 3364 | +added: REPLACEME | | 3365 | +--> | | 3366 | + | | 3367 | +* {boolean} objectMode | | 3368 | +* {integer} highWaterMark value | | 3369 | + | | 3370 | +Sets the default highWaterMark used by streams. | | 3371 | + | 3349 | 3372 | ## API for stream implementers | 3350 | 3373 |
| 3351 | 3374 | <!--type=misc--> | |
Collapse file Copy file name to clipboardExpand all lines: lib/_http_outgoing.js +4-4Lines changed: 4 additions & 4 deletions | Original file line number | Diff line number | Diff line change |
|---|
@@ -80,12 +80,11 @@ let debug = require('internal/util/debuglog').debuglog('http', (fn) => { | 80 | 80 | debug = fn; | 81 | 81 | }); | 82 | 82 |
| 83 | | -const HIGH_WATER_MARK = getDefaultHighWaterMark(); | 84 | | - | 85 | 83 | const kCorked = Symbol('corked'); | 86 | 84 | const kUniqueHeaders = Symbol('kUniqueHeaders'); | 87 | 85 | const kBytesWritten = Symbol('kBytesWritten'); | 88 | 86 | const kErrored = Symbol('errored'); | | 87 | +const kHighWaterMark = Symbol('kHighWaterMark'); | 89 | 88 |
| 90 | 89 | const nop = () => {}; | 91 | 90 |
| @@ -150,6 +149,7 @@ function OutgoingMessage() { | 150 | 149 | this._onPendingData = nop; | 151 | 150 |
| 152 | 151 | this[kErrored] = null; | | 152 | + this[kHighWaterMark] = getDefaultHighWaterMark(); | 153 | 153 | } | 154 | 154 | ObjectSetPrototypeOf(OutgoingMessage.prototype, Stream.prototype); | 155 | 155 | ObjectSetPrototypeOf(OutgoingMessage, Stream); | @@ -196,7 +196,7 @@ ObjectDefineProperty(OutgoingMessage.prototype, 'writableLength', { | 196 | 196 | ObjectDefineProperty(OutgoingMessage.prototype, 'writableHighWaterMark', { | 197 | 197 | __proto__: null, | 198 | 198 | get() { | 199 | | - return this.socket ? this.socket.writableHighWaterMark : HIGH_WATER_MARK; | | 199 | + return this.socket ? this.socket.writableHighWaterMark : this[kHighWaterMark]; | 200 | 200 | }, | 201 | 201 | }); | 202 | 202 |
| @@ -403,7 +403,7 @@ function _writeRaw(data, encoding, callback, size) { | 403 | 403 | this.outputData.push({ data, encoding, callback }); | 404 | 404 | this.outputSize += data.length; | 405 | 405 | this._onPendingData(data.length); | 406 | | - return this.outputSize < HIGH_WATER_MARK; | | 406 | + return this.outputSize < this[kHighWaterMark]; | 407 | 407 | } | 408 | 408 |
| 409 | 409 |
| |
Collapse file Copy file name to clipboardExpand all lines: lib/internal/streams/state.js +15-1Lines changed: 15 additions & 1 deletion | Original file line number | Diff line number | Diff line change |
|---|
@@ -4,16 +4,29 @@ const { | 4 | 4 | MathFloor, | 5 | 5 | NumberIsInteger, | 6 | 6 | } = primordials; | | 7 | +const { validateInteger } = require('internal/validators'); | 7 | 8 |
| 8 | 9 | const { ERR_INVALID_ARG_VALUE } = require('internal/errors').codes; | 9 | 10 |
| | 11 | +let defaultHighWaterMarkBytes = 16 * 1024; | | 12 | +let defaultHighWaterMarkObjectMode = 16; | | 13 | + | 10 | 14 | function highWaterMarkFrom(options, isDuplex, duplexKey) { | 11 | 15 | return options.highWaterMark != null ? options.highWaterMark : | 12 | 16 | isDuplex ? options[duplexKey] : null; | 13 | 17 | } | 14 | 18 |
| 15 | 19 | function getDefaultHighWaterMark(objectMode) { | 16 | | - return objectMode ? 16 : 16 * 1024; | | 20 | + return objectMode ? defaultHighWaterMarkObjectMode : defaultHighWaterMarkBytes; | | 21 | +} | | 22 | + | | 23 | +function setDefaultHighWaterMark(objectMode, value) { | | 24 | + validateInteger(value, 'value', 0); | | 25 | + if (objectMode) { | | 26 | + defaultHighWaterMarkObjectMode = value; | | 27 | + } else { | | 28 | + defaultHighWaterMarkBytes = value; | | 29 | + } | 17 | 30 | } | 18 | 31 |
| 19 | 32 | function getHighWaterMark(state, options, duplexKey, isDuplex) { | @@ -33,4 +46,5 @@ function getHighWaterMark(state, options, duplexKey, isDuplex) { | 33 | 46 | module.exports = { | 34 | 47 | getHighWaterMark, | 35 | 48 | getDefaultHighWaterMark, | | 49 | + setDefaultHighWaterMark, | 36 | 50 | }; |
Collapse file Copy file name to clipboardExpand all lines: lib/stream.js +3Lines changed: 3 additions & 0 deletions | Original file line number | Diff line number | Diff line change |
|---|
@@ -42,6 +42,7 @@ const { | 42 | 42 | }, | 43 | 43 | } = require('internal/errors'); | 44 | 44 | const compose = require('internal/streams/compose'); | | 45 | +const { setDefaultHighWaterMark, getDefaultHighWaterMark } = require('internal/streams/state'); | 45 | 46 | const { pipeline } = require('internal/streams/pipeline'); | 46 | 47 | const { destroyer } = require('internal/streams/destroy'); | 47 | 48 | const eos = require('internal/streams/end-of-stream'); | @@ -105,6 +106,8 @@ Stream.addAbortSignal = addAbortSignal; | 105 | 106 | Stream.finished = eos; | 106 | 107 | Stream.destroy = destroyer; | 107 | 108 | Stream.compose = compose; | | 109 | +Stream.setDefaultHighWaterMark = setDefaultHighWaterMark; | | 110 | +Stream.getDefaultHighWaterMark = getDefaultHighWaterMark; | 108 | 111 |
| 109 | 112 | ObjectDefineProperty(Stream, 'promises', { | 110 | 113 | __proto__: null, | |
Collapse file Copy file name to clipboard +36Lines changed: 36 additions & 0 deletions | Original file line number | Diff line number | Diff line change |
|---|
| | 1 | +'use strict'; | | 2 | + | | 3 | +require('../common'); | | 4 | + | | 5 | +const assert = require('node:assert'); | | 6 | +const { | | 7 | + setDefaultHighWaterMark, | | 8 | + getDefaultHighWaterMark, | | 9 | + Writable, | | 10 | + Readable, | | 11 | + Transform | | 12 | +} = require('stream'); | | 13 | + | | 14 | +assert.notStrictEqual(getDefaultHighWaterMark(false), 32 * 1000); | | 15 | +setDefaultHighWaterMark(false, 32 * 1000); | | 16 | +assert.strictEqual(getDefaultHighWaterMark(false), 32 * 1000); | | 17 | + | | 18 | +assert.notStrictEqual(getDefaultHighWaterMark(true), 32); | | 19 | +setDefaultHighWaterMark(true, 32); | | 20 | +assert.strictEqual(getDefaultHighWaterMark(true), 32); | | 21 | + | | 22 | +const w = new Writable({ | | 23 | + write() {} | | 24 | +}); | | 25 | +assert.strictEqual(w.writableHighWaterMark, 32 * 1000); | | 26 | + | | 27 | +const r = new Readable({ | | 28 | + read() {} | | 29 | +}); | | 30 | +assert.strictEqual(r.readableHighWaterMark, 32 * 1000); | | 31 | + | | 32 | +const t = new Transform({ | | 33 | + transform() {} | | 34 | +}); | | 35 | +assert.strictEqual(t.writableHighWaterMark, 32 * 1000); | | 36 | +assert.strictEqual(t.readableHighWaterMark, 32 * 1000); |
|