'use strict'; const common = require('../common'); const assert = require('assert'); const stream = require('stream'); let state = 0; /* What you do var stream = new stream.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) { // transformCallback part 1 assert.strictEqual(++state, chunk); this.push(state); // transformCallback part 2 assert.strictEqual(++state, chunk + 2); process.nextTick(next); }, 3), final: common.mustCall(function(done) { state++; // finalCallback part 1 assert.strictEqual(state, 10); setTimeout(function() { state++; // finalCallback part 2 assert.strictEqual(state, 11); done(); }, 100); }, 1), flush: common.mustCall(function(done) { state++; // flushCallback part 1 assert.strictEqual(state, 12); process.nextTick(function() { state++; // flushCallback part 2 assert.strictEqual(state, 15); done(); }); }, 1) }); t.on('finish', common.mustCall(function() { state++; // finishListener assert.strictEqual(state, 13); }, 1)); t.on('end', common.mustCall(function() { state++; // end event assert.strictEqual(state, 16); }, 1)); t.on('data', common.mustCall(function(d) { // dataListener assert.strictEqual(++state, d + 1); }, 3)); t.write(1); t.write(4); t.end(7, common.mustCall(function() { state++; // endMethodCallback assert.strictEqual(state, 14); }, 1));