-
Notifications
You must be signed in to change notification settings - Fork 30k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Adds the ability to for write streams to have an _final method which acts similarly to the _flush method that transform streams have but is called before the finish event is emitted and if asynchronous delays the stream from finishing. The `final` option may also be passed in order to set it. PR-URL: #12828 Reviewed-By: James M Snell <[email protected]> Reviewed-By: Matteo Collina <[email protected]> Reviewed-By: Refael Ackermann <[email protected]>
- Loading branch information
1 parent
e912c67
commit ba513d1
Showing
8 changed files
with
317 additions
and
32 deletions.
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
14 changes: 3 additions & 11 deletions
14
test/parallel/test-stream-readable-constructor-set-methods.js
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 |
---|---|---|
@@ -1,19 +1,11 @@ | ||
'use strict'; | ||
require('../common'); | ||
const assert = require('assert'); | ||
const common = require('../common'); | ||
|
||
const Readable = require('stream').Readable; | ||
|
||
let _readCalled = false; | ||
function _read(n) { | ||
_readCalled = true; | ||
const _read = common.mustCall(function _read(n) { | ||
this.push(null); | ||
} | ||
}); | ||
|
||
const r = new Readable({ read: _read }); | ||
r.resume(); | ||
|
||
process.on('exit', function() { | ||
assert.strictEqual(r._read, _read); | ||
assert(_readCalled); | ||
}); |
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,100 @@ | ||
'use strict'; | ||
const common = require('../common'); | ||
const assert = require('assert'); | ||
|
||
const stream = require('stream'); | ||
let state = 0; | ||
|
||
/* | ||
What you do | ||
var stream = new tream.Transform({ | ||
transform: function transformCallback(chunk, _, next) { | ||
// part 1 | ||
this.push(chunk); | ||
//part 2 | ||
next(); | ||
}, | ||
final: function endCallback(done) { | ||
// part 1 | ||
process.nextTick(function () { | ||
// part 2 | ||
done(); | ||
}); | ||
}, | ||
flush: function flushCallback(done) { | ||
// part 1 | ||
process.nextTick(function () { | ||
// part 2 | ||
done(); | ||
}); | ||
} | ||
}); | ||
t.on('data', dataListener); | ||
t.on('end', endListener); | ||
t.on('finish', finishListener); | ||
t.write(1); | ||
t.write(4); | ||
t.end(7, endMethodCallback); | ||
The order things are called | ||
1. transformCallback part 1 | ||
2. dataListener | ||
3. transformCallback part 2 | ||
4. transformCallback part 1 | ||
5. dataListener | ||
6. transformCallback part 2 | ||
7. transformCallback part 1 | ||
8. dataListener | ||
9. transformCallback part 2 | ||
10. finalCallback part 1 | ||
11. finalCallback part 2 | ||
12. flushCallback part 1 | ||
13. finishListener | ||
14. endMethodCallback | ||
15. flushCallback part 2 | ||
16. endListener | ||
*/ | ||
|
||
const t = new stream.Transform({ | ||
objectMode: true, | ||
transform: common.mustCall(function(chunk, _, next) { | ||
assert.strictEqual(++state, chunk, 'transformCallback part 1'); | ||
this.push(state); | ||
assert.strictEqual(++state, chunk + 2, 'transformCallback part 2'); | ||
process.nextTick(next); | ||
}, 3), | ||
final: common.mustCall(function(done) { | ||
state++; | ||
assert.strictEqual(state, 10, 'finalCallback part 1'); | ||
state++; | ||
assert.strictEqual(state, 11, 'finalCallback part 2'); | ||
done(); | ||
}, 1), | ||
flush: common.mustCall(function(done) { | ||
state++; | ||
assert.strictEqual(state, 12, 'flushCallback part 1'); | ||
process.nextTick(function() { | ||
state++; | ||
assert.strictEqual(state, 15, 'flushCallback part 2'); | ||
done(); | ||
}); | ||
}, 1) | ||
}); | ||
t.on('finish', common.mustCall(function() { | ||
state++; | ||
assert.strictEqual(state, 13, 'finishListener'); | ||
}, 1)); | ||
t.on('end', common.mustCall(function() { | ||
state++; | ||
assert.strictEqual(state, 16, 'end event'); | ||
}, 1)); | ||
t.on('data', common.mustCall(function(d) { | ||
assert.strictEqual(++state, d + 1, 'dataListener'); | ||
}, 3)); | ||
t.write(1); | ||
t.write(4); | ||
t.end(7, common.mustCall(function() { | ||
state++; | ||
assert.strictEqual(state, 14, 'endMethodCallback'); | ||
}, 1)); |
Oops, something went wrong.