diff options
-rw-r--r-- | doc/api/stream.md | 11 | ||||
-rw-r--r-- | lib/_http_outgoing.js | 11 | ||||
-rw-r--r-- | lib/_stream_writable.js | 10 | ||||
-rw-r--r-- | test/parallel/test-stream-writable-properties.js | 22 |
4 files changed, 46 insertions, 8 deletions
diff --git a/doc/api/stream.md b/doc/api/stream.md index 5452173770..b7f83a5e1b 100644 --- a/doc/api/stream.md +++ b/doc/api/stream.md @@ -505,6 +505,16 @@ Is `true` after [`writable.end()`][] has been called. This property does not indicate whether the data has been flushed, for this use [`writable.writableFinished`][] instead. +##### writable.writableCorked +<!-- YAML +added: REPLACEME +--> + +* {integer} + +Number of times [`writable.uncork()`][stream-uncork] needs to be +called in order to fully uncork the stream. + ##### writable.writableFinished <!-- YAML added: v12.6.0 @@ -2838,6 +2848,7 @@ contain multi-byte characters. [stream-push]: #stream_readable_push_chunk_encoding [stream-read]: #stream_readable_read_size [stream-resume]: #stream_readable_resume +[stream-uncork]: #stream_writable_uncork [stream-write]: #stream_writable_write_chunk_encoding_callback [Stream Three States]: #stream_three_states [writable-_destroy]: #stream_writable_destroy_err_callback diff --git a/lib/_http_outgoing.js b/lib/_http_outgoing.js index 32a51d120b..5345f2d979 100644 --- a/lib/_http_outgoing.js +++ b/lib/_http_outgoing.js @@ -56,8 +56,6 @@ const { validateString } = require('internal/validators'); const HIGH_WATER_MARK = getDefaultHighWaterMark(); const { CRLF, debug } = common; -const kIsCorked = Symbol('isCorked'); - const RE_CONN_CLOSE = /(?:^|\W)close(?:$|\W)/i; const RE_TE_CHUNKED = common.chunkExpression; @@ -101,7 +99,6 @@ function OutgoingMessage() { this.finished = false; this._headerSent = false; - this[kIsCorked] = false; this.socket = null; this._header = null; @@ -628,10 +625,9 @@ function write_(msg, chunk, encoding, callback, fromEnd) { ['string', 'Buffer'], chunk); } - if (!fromEnd && msg.socket && !msg[kIsCorked]) { + if (!fromEnd && msg.socket && !msg.socket.writableCorked) { msg.socket.cork(); - msg[kIsCorked] = true; - process.nextTick(connectionCorkNT, msg, msg.socket); + process.nextTick(connectionCorkNT, msg.socket); } var len, ret; @@ -660,8 +656,7 @@ function writeAfterEndNT(msg, err, callback) { } -function connectionCorkNT(msg, conn) { - msg[kIsCorked] = false; +function connectionCorkNT(conn) { conn.uncork(); } diff --git a/lib/_stream_writable.js b/lib/_stream_writable.js index 9b75b672cb..9b4036e476 100644 --- a/lib/_stream_writable.js +++ b/lib/_stream_writable.js @@ -385,6 +385,16 @@ Object.defineProperty(Writable.prototype, 'writableHighWaterMark', { } }); +Object.defineProperty(Writable.prototype, 'writableCorked', { + // Making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function() { + return this._writableState ? this._writableState.corked : 0; + } +}); + // If we're already writing something, then just put this // in the queue, and wait our turn. Otherwise, call _write // If we return false, then we need a drain event, so set that flag. diff --git a/test/parallel/test-stream-writable-properties.js b/test/parallel/test-stream-writable-properties.js new file mode 100644 index 0000000000..424bb58710 --- /dev/null +++ b/test/parallel/test-stream-writable-properties.js @@ -0,0 +1,22 @@ +'use strict'; +require('../common'); +const assert = require('assert'); + +const { Writable } = require('stream'); + +{ + const w = new Writable(); + assert.strictEqual(w.writableCorked, 0); + w.uncork(); + assert.strictEqual(w.writableCorked, 0); + w.cork(); + assert.strictEqual(w.writableCorked, 1); + w.cork(); + assert.strictEqual(w.writableCorked, 2); + w.uncork(); + assert.strictEqual(w.writableCorked, 1); + w.uncork(); + assert.strictEqual(w.writableCorked, 0); + w.uncork(); + assert.strictEqual(w.writableCorked, 0); +} |