summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/api/stream.md11
-rw-r--r--lib/_http_outgoing.js11
-rw-r--r--lib/_stream_writable.js10
-rw-r--r--test/parallel/test-stream-writable-properties.js22
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);
+}