Skip to content

Commit d442adc

Browse files
committed
fix for sync write issues in older node
1 parent c9364ba commit d442adc

File tree

6 files changed

+121
-5
lines changed

6 files changed

+121
-5
lines changed

build/files.js

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,12 @@ const headRegexp = /(^module.exports = \w+;?)/m
128128

129129
, processNextTickImport = [
130130
headRegexp
131-
, '$1\n\n/*<replacement>*/\nvar processNextTick = require(\'process-nextick-args\');\n/*</replacement>*/\n'
131+
, `$1
132+
133+
/*<replacement>*/
134+
var processNextTick = require(\'process-nextick-args\');
135+
/*</replacement>*/
136+
`
132137
]
133138

134139
, processNextTickReplacement = [
@@ -140,7 +145,30 @@ const headRegexp = /(^module.exports = \w+;?)/m
140145
/^const internalUtil = require\('internal\/util'\);/m
141146
, '\n/*<replacement>*/\nconst internalUtil = {\n deprecate: require(\'util-deprecate\')\n};\n'
142147
+ '/*</replacement>*/\n'
148+
],
149+
isNode10 = [
150+
headRegexp
151+
, `$1
152+
153+
/*<replacement>*/
154+
var isNode10 = !process.browser && ['v0.10' , 'v0.9.'].indexOf(process.version.slice(0, 5)) > -1;
155+
/*</replacement>*/
156+
`
143157
]
158+
, fixSyncWrite = [
159+
/if \(sync\) {\n\s+processNextTick\(afterWrite, stream, state, finished, cb\);\n\s+}/
160+
, `if (sync) {
161+
/*<replacement>*/
162+
if (isNode10) {
163+
setTimeout(afterWrite, 0, stream, state, finished, cb);
164+
} else {
165+
processNextTick(afterWrite, stream, state, finished, cb);
166+
}
167+
/*</replacement>*/
168+
}
169+
170+
`
171+
]
144172

145173
module.exports['_stream_duplex.js'] = [
146174
requireReplacement
@@ -211,5 +239,7 @@ module.exports['_stream_writable.js'] = [
211239
, processNextTickImport
212240
, processNextTickReplacement
213241
, internalUtilReplacement
242+
, isNode10
243+
, fixSyncWrite
214244

215245
]

lib/_stream_writable.js

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@
66

77
module.exports = Writable;
88

9+
/*<replacement>*/
10+
var isNode10 = !process.browser && ['v0.10', 'v0.9.'].indexOf(process.version.slice(0, 5)) > -1;
11+
/*</replacement>*/
12+
913
/*<replacement>*/
1014
var processNextTick = require('process-nextick-args');
1115
/*</replacement>*/
@@ -341,10 +345,16 @@ function onwrite(stream, er) {
341345
}
342346

343347
if (sync) {
344-
processNextTick(afterWrite, stream, state, finished, cb);
348+
/*<replacement>*/
349+
if (isNode10) {
350+
setTimeout(afterWrite, 0, stream, state, finished, cb);
351+
} else {
352+
processNextTick(afterWrite, stream, state, finished, cb);
353+
}
354+
/*</replacement>*/
345355
} else {
346-
afterWrite(stream, state, finished, cb);
347-
}
356+
afterWrite(stream, state, finished, cb);
357+
}
348358
}
349359
}
350360

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
"zuul": "~3.9.0"
1818
},
1919
"scripts": {
20-
"test": "tap test/parallel/*.js",
20+
"test": "tap test/parallel/*.js test/ours/*.js",
2121
"browser": "npm run write-zuul && zuul -- test/browser.js",
2222
"write-zuul": "printf \"ui: tape\nbrowsers:\n - name: $BROWSER_NAME\n version: $BROWSER_VERSION\n\">.zuul.yml"
2323
},

test/browser.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ test('streams', function (t) {
3636
require('./browser/test-stream-writable-constructor-set-methods')(t);
3737
require('./browser/test-stream-writable-decoded-encoding')(t);
3838
require('./browser/test-stream-writev')(t);
39+
require('./browser/test-stream-sync-write')(t);
3940
require('./browser/test-stream-pipe-without-listenerCount');
4041
});
4142

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
require('../common');
2+
var inherits = require('inherits');
3+
var stream = require('../../');
4+
var WritableStream = stream.Writable;
5+
module.exports = function(t) {
6+
t.test('should bea ble to write sync', function(t) {
7+
var InternalStream = function() {
8+
WritableStream.call(this);
9+
};
10+
inherits(InternalStream, WritableStream);
11+
12+
InternalStream.prototype._write = function(chunk, encoding, callback) {
13+
callback();
14+
};
15+
16+
var internalStream = new InternalStream();
17+
18+
19+
20+
var ExternalStream = function(writable) {
21+
this._writable = writable;
22+
WritableStream.call(this);
23+
};
24+
inherits(ExternalStream, WritableStream);
25+
26+
ExternalStream.prototype._write = function(chunk, encoding, callback) {
27+
this._writable.write(chunk, encoding, callback);
28+
};
29+
30+
31+
32+
var externalStream = new ExternalStream(internalStream);
33+
34+
for (var i = 0; i < 2000; i++) {
35+
externalStream.write(i.toString());
36+
}
37+
t.end();
38+
});
39+
}

test/ours/test-stream-sync-write.js

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
require('../common');
2+
var util = require('util');
3+
var stream = require('../../');
4+
var WritableStream = stream.Writable;
5+
6+
7+
var InternalStream = function() {
8+
WritableStream.call(this);
9+
};
10+
util.inherits(InternalStream, WritableStream);
11+
12+
InternalStream.prototype._write = function(chunk, encoding, callback) {
13+
callback();
14+
};
15+
16+
var internalStream = new InternalStream();
17+
18+
19+
20+
var ExternalStream = function(writable) {
21+
this._writable = writable;
22+
WritableStream.call(this);
23+
};
24+
util.inherits(ExternalStream, WritableStream);
25+
26+
ExternalStream.prototype._write = function(chunk, encoding, callback) {
27+
this._writable.write(chunk, encoding, callback);
28+
};
29+
30+
31+
32+
var externalStream = new ExternalStream(internalStream);
33+
34+
for (var i = 0; i < 2000; i++) {
35+
externalStream.write(i.toString());
36+
}

0 commit comments

Comments
 (0)