Я пишу модуль, который является записываемым потоком. Я хочу реализовать интерфейс pipe для своих пользователей.
Если возникает некоторая ошибка, мне нужно приостановить чтение и испустить ошибку. Затем пользователь решит - если он в порядке с ошибкой, он должен иметь возможность возобновить обработку данных.
var writeable = new BackPressureStream();
writeable.on('error', function(error){
console.log(error);
writeable.resume();
});
var readable = require('fs').createReadStream('somefile.txt');
readable.pipe.(writeable);
Я вижу, что node предоставляет нам метод readable.pause()
, который можно использовать для приостановки чтения. Но я не могу получить, как я могу назвать это из моего записываемого модуля потока:
var Writable = require('stream').Writable;
function BackPressureStream(options) {
Writable.call(this, options);
}
require('util').inherits(BackPressureStream, Writable);
BackPressureStream.prototype._write = function(chunk, encoding, done) {
done();
};
BackPressureStream.prototype.resume = function() {
this.emit('drain');
}
Как противодавление может быть реализовано в записываемом потоке?
P.S. Можно использовать события pipe/unpipe
, которые предоставляют читаемый поток в качестве параметра. Но также говорится, что для потоков с каналами единственный шанс приостановить - это освободить читаемый поток от записи.
У меня все получилось? Я должен отключить мой записываемый поток, пока пользователь не назовет возобновление? И после того, как пользователь возобновит работу, я должен отправить отчетный поток обратно?