-
Notifications
You must be signed in to change notification settings - Fork 29.6k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Adds an option to .pipe to cork it before each write and then uncork it next tick, based on discussion at nodejs/readable-stream#145
- Loading branch information
1 parent
c5353d7
commit 25b8da1
Showing
3 changed files
with
199 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,176 @@ | ||
'use strict'; | ||
var common = require('../common'); | ||
var assert = require('assert'); | ||
|
||
var stream = require('stream'); | ||
// tiny node-tap lookalike. | ||
var tests = []; | ||
var count = 0; | ||
|
||
function test(name, fn) { | ||
count++; | ||
tests.push([name, fn]); | ||
} | ||
|
||
function run() { | ||
var next = tests.shift(); | ||
if (!next) | ||
return console.error('ok'); | ||
|
||
var name = next[0]; | ||
var fn = next[1]; | ||
console.log('# %s', name); | ||
fn({ | ||
same: assert.deepEqual, | ||
equal: assert.equal, | ||
end: function() { | ||
count--; | ||
run(); | ||
} | ||
}); | ||
} | ||
|
||
// ensure all tests have run | ||
process.on('exit', function() { | ||
assert.equal(count, 0); | ||
}); | ||
|
||
process.nextTick(run); | ||
test('all sync', function (t) { | ||
var counter = 0; | ||
var expectCount = 0; | ||
function cnt(msg) { | ||
expectCount++; | ||
var expect = expectCount; | ||
var called = false; | ||
return function(er) { | ||
if (er) | ||
throw er; | ||
called = true; | ||
counter++; | ||
t.equal(counter, expect); | ||
}; | ||
} | ||
var p = new stream.PassThrough(); | ||
var w = new stream.Writable(); | ||
w._write = function(chunk, e, cb) { | ||
assert(false, 'Should not call _write'); | ||
}; | ||
p.pipe(w, { | ||
cork: true | ||
}); | ||
var expectChunks = | ||
[ | ||
{ encoding: 'buffer', | ||
chunk: [104, 101, 108, 108, 111, 44, 32] }, | ||
{ encoding: 'buffer', | ||
chunk: [119, 111, 114, 108, 100] }, | ||
{ encoding: 'buffer', | ||
chunk: [33] }, | ||
{ encoding: 'buffer', | ||
chunk: [10, 97, 110, 100, 32, 116, 104, 101, 110, 46, 46, 46] }, | ||
{ encoding: 'buffer', | ||
chunk: [250, 206, 190, 167, 222, 173, 190, 239, 222, 202, 251, 173]} | ||
]; | ||
|
||
var actualChunks; | ||
w._writev = function(chunks, cb) { | ||
actualChunks = chunks.map(function(chunk) { | ||
return { | ||
encoding: chunk.encoding, | ||
chunk: Buffer.isBuffer(chunk.chunk) ? | ||
Array.prototype.slice.call(chunk.chunk) : chunk.chunk | ||
}; | ||
}); | ||
cb(); | ||
}; | ||
p.write('hello, ', 'ascii', cnt('hello')); | ||
p.write('world', 'utf8', cnt('world')); | ||
|
||
p.write(new Buffer('!'), 'buffer', cnt('!')); | ||
|
||
p.write('\nand then...', 'binary', cnt('and then')); | ||
p.write('facebea7deadbeefdecafbad', 'hex', cnt('hex')); | ||
|
||
p.end(cnt('end')); | ||
|
||
|
||
w.on('finish', function() { | ||
// make sure finish comes after all the write cb | ||
cnt('finish')(); | ||
t.same(expectChunks, actualChunks); | ||
t.end(); | ||
}); | ||
}); | ||
test('2 groups', function (t) { | ||
var counter = 0; | ||
var expectCount = 0; | ||
function cnt(msg) { | ||
expectCount++; | ||
var expect = expectCount; | ||
var called = false; | ||
return function(er) { | ||
if (er) | ||
throw er; | ||
called = true; | ||
counter++; | ||
t.equal(counter, expect); | ||
}; | ||
} | ||
var p = new stream.PassThrough(); | ||
var w = new stream.Writable(); | ||
w._write = function(chunk, e, cb) { | ||
assert(false, 'Should not call _write'); | ||
}; | ||
p.pipe(w, { | ||
cork: true | ||
}); | ||
var expectChunks = [ | ||
[ | ||
{ encoding: 'buffer', | ||
chunk: [104, 101, 108, 108, 111, 44, 32] }, | ||
{ encoding: 'buffer', | ||
chunk: [119, 111, 114, 108, 100] } | ||
],[ | ||
{ encoding: 'buffer', | ||
chunk: [33] }, | ||
{ encoding: 'buffer', | ||
chunk: [10, 97, 110, 100, 32, 116, 104, 101, 110, 46, 46, 46] }, | ||
{ encoding: 'buffer', | ||
chunk: [250, 206, 190, 167, 222, 173, 190, 239, 222, 202, 251, 173]} | ||
]]; | ||
|
||
var actualChunks = []; | ||
var called = 0; | ||
w._writev = function(chunks, cb) { | ||
actualChunks.push(chunks.map(function(chunk) { | ||
return { | ||
encoding: chunk.encoding, | ||
chunk: Buffer.isBuffer(chunk.chunk) ? | ||
Array.prototype.slice.call(chunk.chunk) : chunk.chunk | ||
}; | ||
})); | ||
cb(); | ||
}; | ||
p.write('hello, ', 'ascii', cnt('hello')); | ||
p.write('world', 'utf8', cnt('world')); | ||
process.nextTick(function () { | ||
p.write(new Buffer('!'), 'buffer', cnt('!')); | ||
|
||
p.write('\nand then...', 'binary', cnt('and then')); | ||
p.write('facebea7deadbeefdecafbad', 'hex', cnt('hex')); | ||
|
||
p.end(cnt('end')); | ||
}); | ||
|
||
w.on('finish', function() { | ||
// make sure finish comes after all the write cb | ||
cnt('finish')(); | ||
console.log('expected'); | ||
console.log(expectChunks); | ||
console.log('actual'); | ||
console.log(actualChunks); | ||
t.same(expectChunks, actualChunks); | ||
t.end(); | ||
}); | ||
}); |