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());
+}