diff --git a/build/files.js b/build/files.js index ed13fe2716..f12be718be 100644 --- a/build/files.js +++ b/build/files.js @@ -128,7 +128,12 @@ const headRegexp = /(^module.exports = \w+;?)/m , processNextTickImport = [ headRegexp - , '$1\n\n/**/\nvar processNextTick = require(\'process-nextick-args\');\n/**/\n' + , `$1 + +/**/ + var processNextTick = require(\'process-nextick-args\'); +/**/ +` ] , processNextTickReplacement = [ @@ -140,7 +145,26 @@ const headRegexp = /(^module.exports = \w+;?)/m /^const internalUtil = require\('internal\/util'\);/m , '\n/**/\nconst internalUtil = {\n deprecate: require(\'util-deprecate\')\n};\n' + '/**/\n' + ], + isNode10 = [ + headRegexp + , `$1 + +/**/ + var asyncWrite = !process.browser && ['v0.10' , 'v0.9.'].indexOf(process.version.slice(0, 5)) > -1 ? setImmediate : processNextTick; +/**/ +` ] + , fixSyncWrite = [ + /if \(sync\) {\n\s+processNextTick\(afterWrite, stream, state, finished, cb\);\n\s+}/ + , `if (sync) { + /**/ + asyncWrite(afterWrite, stream, state, finished, cb); + /**/ + } + + ` + ] module.exports['_stream_duplex.js'] = [ requireReplacement @@ -208,8 +232,10 @@ module.exports['_stream_writable.js'] = [ , [ /^var assert = require\('assert'\);$/m, '' ] , requireStreamReplacement , isBufferReplacement + , isNode10 , processNextTickImport , processNextTickReplacement , internalUtilReplacement + , fixSyncWrite ] diff --git a/lib/_stream_writable.js b/lib/_stream_writable.js index b93312f6be..95916c992a 100644 --- a/lib/_stream_writable.js +++ b/lib/_stream_writable.js @@ -10,6 +10,10 @@ module.exports = Writable; var processNextTick = require('process-nextick-args'); /**/ +/**/ +var asyncWrite = !process.browser && ['v0.10', 'v0.9.'].indexOf(process.version.slice(0, 5)) > -1 ? setImmediate : processNextTick; +/**/ + /**/ var Buffer = require('buffer').Buffer; /**/ @@ -341,10 +345,12 @@ function onwrite(stream, er) { } if (sync) { - processNextTick(afterWrite, stream, state, finished, cb); + /**/ + asyncWrite(afterWrite, stream, state, finished, cb); + /**/ } else { - afterWrite(stream, state, finished, cb); - } + afterWrite(stream, state, finished, cb); + } } } diff --git a/package.json b/package.json index 2fac397d4a..45d02e949f 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,7 @@ "zuul": "~3.9.0" }, "scripts": { - "test": "tap test/parallel/*.js", + "test": "tap test/parallel/*.js test/ours/*.js", "browser": "npm run write-zuul && zuul -- test/browser.js", "write-zuul": "printf \"ui: tape\nbrowsers:\n - name: $BROWSER_NAME\n version: $BROWSER_VERSION\n\">.zuul.yml" }, diff --git a/test/browser.js b/test/browser.js index bd7b10e872..a82c13ae34 100644 --- a/test/browser.js +++ b/test/browser.js @@ -36,6 +36,7 @@ test('streams', function (t) { require('./browser/test-stream-writable-constructor-set-methods')(t); require('./browser/test-stream-writable-decoded-encoding')(t); require('./browser/test-stream-writev')(t); + require('./browser/test-stream-sync-write')(t); require('./browser/test-stream-pipe-without-listenerCount'); }); diff --git a/test/browser/test-stream-sync-write.js b/test/browser/test-stream-sync-write.js new file mode 100644 index 0000000000..c07c1672d2 --- /dev/null +++ b/test/browser/test-stream-sync-write.js @@ -0,0 +1,39 @@ +require('../common'); +var inherits = require('inherits'); +var stream = require('../../'); +var WritableStream = stream.Writable; +module.exports = function(t) { + t.test('should bea ble to write sync', function(t) { + var InternalStream = function() { + WritableStream.call(this); + }; + inherits(InternalStream, WritableStream); + + InternalStream.prototype._write = function(chunk, encoding, callback) { + callback(); + }; + + var internalStream = new InternalStream(); + + + + var ExternalStream = function(writable) { + this._writable = writable; + WritableStream.call(this); + }; + inherits(ExternalStream, WritableStream); + + ExternalStream.prototype._write = function(chunk, encoding, callback) { + this._writable.write(chunk, encoding, callback); + }; + + + + var externalStream = new ExternalStream(internalStream); + + for (var i = 0; i < 2000; i++) { + externalStream.write(i.toString()); + } + t.end(); + }); +} diff --git a/test/ours/test-stream-sync-write.js b/test/ours/test-stream-sync-write.js new file mode 100644 index 0000000000..f0a08f53e8 --- /dev/null +++ b/test/ours/test-stream-sync-write.js @@ -0,0 +1,36 @@ +require('../common'); +var util = require('util'); +var stream = require('../../'); +var WritableStream = stream.Writable; + + +var InternalStream = function() { + WritableStream.call(this); +}; +util.inherits(InternalStream, WritableStream); + +InternalStream.prototype._write = function(chunk, encoding, callback) { + callback(); +}; + +var internalStream = new InternalStream(); + + + +var ExternalStream = function(writable) { + this._writable = writable; + WritableStream.call(this); +}; +util.inherits(ExternalStream, WritableStream); + +ExternalStream.prototype._write = function(chunk, encoding, callback) { + this._writable.write(chunk, encoding, callback); +}; + + + +var externalStream = new ExternalStream(internalStream); + +for (var i = 0; i < 2000; i++) { + externalStream.write(i.toString()); +}