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 BethGriggs committed Feb 6, 2020
1 parent df1e183 commit af960d7
Show file tree
Hide file tree
Showing 4 changed files with 45 additions and 7 deletions.
11 changes: 11 additions & 0 deletions doc/api/stream.md
Original file line number Diff line number Diff line change
Expand Up @@ -502,6 +502,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 @@ -2842,6 +2852,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
9 changes: 2 additions & 7 deletions lib/_http_outgoing.js
Original file line number Diff line number Diff line change
Expand Up @@ -55,8 +55,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 @@ -100,7 +98,6 @@ function OutgoingMessage() {

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

this.socket = null;
this.connection = null;
Expand Down Expand Up @@ -619,9 +616,8 @@ function write_(msg, chunk, encoding, callback, fromEnd) {
['string', 'Buffer'], chunk);
}

if (!fromEnd && msg.connection && !msg[kIsCorked]) {
if (!fromEnd && msg.connection && !msg.connection.writableCorked) {
msg.connection.cork();
msg[kIsCorked] = true;
process.nextTick(connectionCorkNT, msg, msg.connection);
}

Expand Down Expand Up @@ -651,8 +647,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 @@ -379,6 +379,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 af960d7

Please sign in to comment.