Skip to content

Commit

Permalink
stream: add writableCorked property
Browse files Browse the repository at this point in the history
PR-URL: #29012
Reviewed-By: Anna Henningsen <[email protected]>
Reviewed-By: James M Snell <[email protected]>
Reviewed-By: Matteo Collina <[email protected]>
  • Loading branch information
ronag authored and MylesBorins committed Nov 17, 2019
1 parent fabc489 commit c254d74
Show file tree
Hide file tree
Showing 4 changed files with 46 additions and 8 deletions.
11 changes: 11 additions & 0 deletions doc/api/stream.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
11 changes: 3 additions & 8 deletions lib/_http_outgoing.js
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -101,7 +99,6 @@ function OutgoingMessage() {

this.finished = false;
this._headerSent = false;
this[kIsCorked] = false;

this.socket = null;
this._header = null;
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -660,8 +656,7 @@ function writeAfterEndNT(msg, err, callback) {
}


function connectionCorkNT(msg, conn) {
msg[kIsCorked] = false;
function connectionCorkNT(conn) {
conn.uncork();
}

Expand Down
10 changes: 10 additions & 0 deletions lib/_stream_writable.js
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
22 changes: 22 additions & 0 deletions test/parallel/test-stream-writable-properties.js
Original file line number Diff line number Diff line change
@@ -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);
}

0 comments on commit c254d74

Please sign in to comment.