| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
1 parent 7b276b8 commit bf3991b
4 files changed
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -65,14 +65,15 @@ | |||
| 65 | 65 | ||
| 66 | 66 | const { | |
| 67 | 67 | ObjectSetPrototypeOf, | |
| 68 | - Symbol | ||
| 68 | + Symbol, | ||
| 69 | 69 | } = primordials; | |
| 70 | 70 | ||
| 71 | 71 | module.exports = Transform; | |
| 72 | 72 | const { | |
| 73 | 73 | ERR_METHOD_NOT_IMPLEMENTED | |
| 74 | 74 | } = require('internal/errors').codes; | |
| 75 | 75 | const Duplex = require('internal/streams/duplex'); | |
| 76 | + const { getHighWaterMark } = require('internal/streams/state'); | ||
| 76 | 77 | ObjectSetPrototypeOf(Transform.prototype, Duplex.prototype); | |
| 77 | 78 | ObjectSetPrototypeOf(Transform, Duplex); | |
| 78 | 79 | ||
@@ -82,6 +83,26 @@ function Transform(options) { | |||
| 82 | 83 | if (!(this instanceof Transform)) | |
| 83 | 84 | return new Transform(options); | |
| 84 | 85 | ||
| 86 | + // TODO (ronag): This should preferably always be | ||
| 87 | + // applied but would be semver-major. Or even better; | ||
| 88 | + // make Transform a Readable with the Writable interface. | ||
| 89 | + const readableHighWaterMark = options ? getHighWaterMark(this, options, 'readableHighWaterMark', true) : null; | ||
| 90 | + if (readableHighWaterMark === 0) { | ||
| 91 | + // A Duplex will buffer both on the writable and readable side while | ||
| 92 | + // a Transform just wants to buffer hwm number of elements. To avoid | ||
| 93 | + // buffering twice we disable buffering on the writable side. | ||
| 94 | + options = { | ||
| 95 | + ...options, | ||
| 96 | + highWaterMark: null, | ||
| 97 | + readableHighWaterMark, | ||
| 98 | + // TODO (ronag): 0 is not optimal since we have | ||
| 99 | + // a "bug" where we check needDrain before calling _write and not after. | ||
| 100 | + // Refs: https://github.com/nodejs/node/pull/32887 | ||
| 101 | + // Refs: https://github.com/nodejs/node/pull/35941 | ||
| 102 | + writableHighWaterMark: options.writableHighWaterMark || 0 | ||
| 103 | + }; | ||
| 104 | + } | ||
| 105 | + | ||
| 85 | 106 | Duplex.call(this, options); | |
| 86 | 107 | ||
| 87 | 108 | // We have implemented the _read method, and done the other things | |
@@ -164,9 +185,7 @@ Transform.prototype._write = function(chunk, encoding, callback) { | |||
| 164 | 185 | if ( | |
| 165 | 186 | wState.ended || // Backwards compat. | |
| 166 | 187 | length === rState.length || // Backwards compat. | |
| 167 | - rState.length < rState.highWaterMark || | ||
| 168 | - rState.highWaterMark === 0 || | ||
| 169 | - rState.length === 0 | ||
| 188 | + rState.length < rState.highWaterMark | ||
| 170 | 189 | ) { | |
| 171 | 190 | callback(); | |
| 172 | 191 | } else { | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -1,8 +1,10 @@ | |||
| 1 | 1 | 'use strict'; | |
| 2 | 2 | const common = require('../common'); | |
| 3 | + const assert = require('assert'); | ||
| 3 | 4 | const { PassThrough } = require('stream'); | |
| 4 | 5 | ||
| 5 | 6 | const pt = new PassThrough({ highWaterMark: 0 }); | |
| 6 | 7 | pt.on('drain', common.mustCall()); | |
| 7 | - pt.write('hello'); | ||
| 8 | + assert(!pt.write('hello1')); | ||
| 9 | + pt.read(); | ||
| 8 | 10 | pt.read(); | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -0,0 +1,28 @@ | |||
| 1 | + 'use strict'; | ||
| 2 | + | ||
| 3 | + const common = require('../common'); | ||
| 4 | + const assert = require('assert'); | ||
| 5 | + const { Transform } = require('stream'); | ||
| 6 | + | ||
| 7 | + const t = new Transform({ | ||
| 8 | + objectMode: true, highWaterMark: 0, | ||
| 9 | + transform(chunk, enc, callback) { | ||
| 10 | + process.nextTick(() => callback(null, chunk, enc)); | ||
| 11 | + } | ||
| 12 | + }); | ||
| 13 | + | ||
| 14 | + assert.strictEqual(t.write(1), false); | ||
| 15 | + t.on('drain', common.mustCall(() => { | ||
| 16 | + assert.strictEqual(t.write(2), false); | ||
| 17 | + t.end(); | ||
| 18 | + })); | ||
| 19 | + | ||
| 20 | + t.once('readable', common.mustCall(() => { | ||
| 21 | + assert.strictEqual(t.read(), 1); | ||
| 22 | + setImmediate(common.mustCall(() => { | ||
| 23 | + assert.strictEqual(t.read(), null); | ||
| 24 | + t.once('readable', common.mustCall(() => { | ||
| 25 | + assert.strictEqual(t.read(), 2); | ||
| 26 | + })); | ||
| 27 | + })); | ||
| 28 | + })); | ||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -20,10 +20,6 @@ testTransform(666, 777, { | |||
| 20 | 20 | writableHighWaterMark: 777, | |
| 21 | 21 | }); | |
| 22 | 22 | ||
| 23 | - // test 0 overriding defaultHwm | ||
| 24 | - testTransform(0, DEFAULT, { readableHighWaterMark: 0 }); | ||
| 25 | - testTransform(DEFAULT, 0, { writableHighWaterMark: 0 }); | ||
| 26 | - | ||
| 27 | 23 | // Test highWaterMark overriding | |
| 28 | 24 | testTransform(555, 555, { | |
| 29 | 25 | highWaterMark: 555, | |
@@ -39,21 +35,6 @@ testTransform(555, 555, { | |||
| 39 | 35 | writableHighWaterMark: 777, | |
| 40 | 36 | }); | |
| 41 | 37 | ||
| 42 | - // Test highWaterMark = 0 overriding | ||
| 43 | - testTransform(0, 0, { | ||
| 44 | - highWaterMark: 0, | ||
| 45 | - readableHighWaterMark: 666, | ||
| 46 | - }); | ||
| 47 | - testTransform(0, 0, { | ||
| 48 | - highWaterMark: 0, | ||
| 49 | - writableHighWaterMark: 777, | ||
| 50 | - }); | ||
| 51 | - testTransform(0, 0, { | ||
| 52 | - highWaterMark: 0, | ||
| 53 | - readableHighWaterMark: 666, | ||
| 54 | - writableHighWaterMark: 777, | ||
| 55 | - }); | ||
| 56 | - | ||
| 57 | 38 | // Test undefined, null | |
| 58 | 39 | [undefined, null].forEach((v) => { | |
| 59 | 40 | testTransform(DEFAULT, DEFAULT, { readableHighWaterMark: v }); | |
| Back | FazBrowse Home | New Git URL |
0 commit comments