Я создал класс TransformerWrapper, который, кажется, решает проблему, по крайней мере, в тестовом коде ниже.Конечно, в этом простом примере все эти потоки могут быть соединены вместе в одну линию.Однако цель состоит в том, чтобы найти способ вернуть несколько связанных потоков, которые выглядят как один объект потока, доступный для чтения / записи, в вызывающую функцию.
Если кто-то найдет что-то меньшее, я был бы признателен.
const stream = require("stream");
class TransformerWrapper extends stream.Transform {
constructor (transformers) {
super();
var i = 1;
this.firstTransformer = transformers[0];
this.lastTransformer = transformers[transformers.length-1];
this.lastTransformer.on("data", (chunk) => {
this.push(chunk);
});
for (; i < transformers.length; i++) {
transformers[i-1].pipe(transformers[i]);
}
}
_write(chunk, encoding, callback) {
this.firstTransformer.write(chunk, encoding, callback);
}
}
class TransformerA extends stream.Transform {
_transform(chunk, encoding, callback) {
this.push(chunk + '_A');
callback();
}
}
class TransformerB extends stream.Transform {
_transform(chunk, encoding, callback) {
this.push(chunk + '_B');
callback();
}
}
class Writer extends stream.Writable {
_write(chunk, encoding, callback) {
console.log("writer", chunk.toString());
callback();
}
}
var transformerA = new TransformerA();
var transformerB = new TransformerB();
var transformerWrapper = new TransformerWrapper([transformerA, transformerB]);
transformerWrapper.pipe(new Writer());
transformerWrapper.write("foo");
transformerWrapper.write("bar");