Erstellen eines Node.js-Streams aus zwei Piped-Streams

Ich möchte zwei Node.js-Streams zu einem kombinieren, indem ich sie nach Möglichkeit weitergebe. Ich benutzeVerwandeln Streams.

Mit anderen Worten, ich möchte, dass meine Bibliothek zurückkommtmyStream für Leute zu benutzen. Zum Beispiel könnten sie schreiben:

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

Und intern verwende ich einen DrittanbietervendorStream das macht etwas Arbeit, eingebunden in meine eigene LogikmyInternalStream. Was oben steht, würde also bedeuten:

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

Kann ich so etwas machen? ich habe es versuchtvar myStream = vendorStream.pipe(myInternalStream) aber das funktioniert offensichtlich nicht.

Um eine Analogie zu machen mitbashAngenommen, ich möchte ein Programm schreiben, das prüft, ob der Buchstabe vorhanden isth ist in der letzten Zeile eines Streams vorhanden (tail -n 1 | grep h) Kann ich ein Shell-Skript erstellen:

# myscript.sh
tail -n 1 | grep h

Und wenn die Leute das tun:

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

Es funktioniert einfach

Das habe ich bisher:

// 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"]

Ist das überhaupt möglich? Lassen Sie mich wissen, wenn nicht klar ist, was ich versuche.

Vielen Dank!

Antworten auf die Frage(2)

Ihre Antwort auf die Frage