From d4d03e620e9a6c04adda4c65450fa55a76aa2c45 Mon Sep 17 00:00:00 2001 From: vdiez Date: Tue, 2 Mar 2021 10:41:08 +0100 Subject: [PATCH] implement stream backpressure --- lib/api/createReadStream.js | 41 +++++++++++++++++++++++-------------- 1 file changed, 26 insertions(+), 15 deletions(-) diff --git a/lib/api/createReadStream.js b/lib/api/createReadStream.js index 1fb46ac..fb010fe 100644 --- a/lib/api/createReadStream.js +++ b/lib/api/createReadStream.js @@ -45,21 +45,10 @@ module.exports = function createReadStream(path, options, cb) { }); }; } - var running = false; - stream._read = function(size) { - if (running) { - return; - } - if (offset >= end) { - return shouldClose - ? close(function() { - stream.push(null); - }) - : stream.push(null); - } + var running = false; - running = true; + function read(size) { request( 'read', { @@ -69,15 +58,37 @@ module.exports = function createReadStream(path, options, cb) { }, connection, function(err, content) { - running = false; if (err != null) { return process.nextTick(stream.emit.bind(stream, 'error', err)); } offset += content.length; - stream.push(content); + if (stream.push(content)) { + if (end - offset === 0) { + running = false; + stream.push(null); + } else read(size); + } else { + running = false; + } } ); + } + stream._read = function(size) { + if (running) { + return; + } + + if (offset >= end) { + return shouldClose + ? close(function() { + stream.push(null); + }) + : stream.push(null); + } else { + running = true; + read(size); + } }; cb(null, stream); }