'use strict'; const common = require('../common'); const { Readable, PassThrough } = require('stream'); function test(r) { const wrapper = new Readable({ read: () => { let data = r.read(); if (data) { wrapper.push(data); return; } r.once('readable', function() { data = r.read(); if (data) { wrapper.push(data); } // else the end event should fire }); }, }); r.once('end', function() { wrapper.push(null); }); wrapper.resume(); wrapper.once('end', common.mustCall()); } { const source = new Readable({ read: () => {} }); source.push('foo'); source.push('bar'); source.push(null); const pt = source.pipe(new PassThrough()); test(pt); } { // This is the underlying cause of the above test case. const pushChunks = ['foo', 'bar']; const r = new Readable({ read: () => { const chunk = pushChunks.shift(); if (chunk) { // synchronous call r.push(chunk); } else { // asynchronous call process.nextTick(() => r.push(null)); } }, }); test(r); }