Tworzenie strumienia Node.js z dwóch strumieniowanych strumieni

Chciałbym połączyć dwa strumienie Node.js w jeden poprzez potokowanie ich, jeśli to możliwe. używamPrzekształcać strumienie.

Innymi słowy, chciałbym, aby moja biblioteka wróciłamyStream dla ludzi. Na przykład mogą pisać:

process.stdin.pipe(myStream).pipe(process.stdout);

I wewnętrznie używam innej firmyvendorStream to działa, podłączone do mojej własnej logiki zawartej wmyInternalStream. To, co powyżej, tłumaczyłoby się na:

process.stdin.pipe(vendorStream).pipe(myInternalStream).pipe(process.stdout);

Czy mogę coś takiego zrobić? próbowałemvar myStream = vendorStream.pipe(myInternalStream) ale to oczywiście nie działa.

Aby zrobić analogię zbash, powiedzmy, że chcę napisać program, który sprawdza, czy literah jest obecny w ostatniej linii jakiegoś strumienia (tail -n 1 | grep h), Mogę utworzyć skrypt powłoki:

# myscript.sh
tail -n 1 | grep h

A jeśli ludzie:

$ printf "abc\ndef\nghi" | . myscript.sh

Po prostu działa.

Oto, co mam do tej pory:

// Combine a pipe of two streams into one stream

var util = require('util')
  , Transform = require('stream').Transform;

var chunks1 = [];
var stream1 = new Transform();
var soFar = '';
stream1._transform = function(chunk, encoding, done) {
  chunks1.push(chunk.toString());
  var pieces = (soFar + chunk).split('\n');
  soFar = pieces.pop();
  for (var i = 0; i < pieces.length; i++) {
    var piece = pieces[i];
    this.push(piece);
  }
  return done();
};

var chunks2 = [];
var count = 0;
var stream2 = new Transform();
stream2._transform = function(chunk, encoding, done) {
  chunks2.push(chunk.toString());
  count = count + 1;
  this.push(count + ' ' + chunk.toString() + '\n');
  done();
};

var stdin = process.stdin;
var stdout = process.stdout;

process.on('exit', function () {
    console.error('chunks1: ' + JSON.stringify(chunks1));
    console.error('chunks2: ' + JSON.stringify(chunks2));
});
process.stdout.on('error', process.exit);


// stdin.pipe(stream1).pipe(stream2).pipe(stdout);

// $ (printf "abc\nd"; sleep 1; printf "ef\nghi\n") | node streams-combine.js
// Outputs:
// 1 abc
// 2 def
// 3 ghi
// chunks1: ["abc\nd","ef\nghi\n"]
// chunks2: ["abc","def","ghi"]

// Best working solution I could find
var stream3 = function(src) {
  return src.pipe(stream1).pipe(stream2);
};
stream3(stdin).pipe(stdout);

// $ (printf "abc\nd"; sleep 1; printf "ef\nghi\n") | node streams-combine.js
// Outputs:
// 1 abc
// 2 def
// 3 ghi
// chunks1: ["abc\nd","ef\nghi\n"]
// chunks2: ["abc","def","ghi"]

Czy to w ogóle możliwe? Daj mi znać, jeśli to, co próbuję zrobić, nie jest jasne.

Dzięki!

questionAnswers(2)

yourAnswerToTheQuestion