Colin D
Colin D

Reputation: 3109

Add transform before write stream

I have a function e.g.

function writeToStream(writeStream) {
  writeStream.write("test\n");
}

How can I make this apply a transform before writing to the final destination? Note: I don't have control over the writeToStream function, I just want to apply a transformation to what it is writing out

const fs = require("fs");
const { Transform } = require("stream");

const upperCaseTr = new Transform({
  transform(chunk, encoding, callback) {
    //this is never called???
    callback(null, chunk.toString().toUpperCase());
  },
});

function writeToStream(writeStream) {
  writeStream.write("test\n");
}

const r = fs.createWriteStream("test.txt");

writeToStream(upperCaseTr.pipe(r));

With the above code, my custom Transform upperCaseTr is never called

Upvotes: 1

Views: 1001

Answers (1)

Colin D
Colin D

Reputation: 3109

This answer was very helpful in solving this https://stackoverflow.com/a/50537771/2129219

Specifically, upperCaseTr.pipe(r) just returns r, so upperCaseTr is never called.

Here is an answer that uses through2, similar to the linked answer

const fs = require("fs");
const through2 = require("through2");

function writeToStream(writeStream) {
  writeStream.write("test test test test test\n");
}

const stream = through2.obj((chunk, enc, callback) => {
  callback(null, chunk.toString().toUpperCase());
});

const out = fs.createWriteStream("test.txt");
stream.pipe(out);

writeToStream(stream);

Here is one using a Transform more similar to my original question

const fs = require("fs");
const { Transform } = require("stream");

function writeToStream(writeStream) {
  writeStream.write("test test test test test\n");
}

const upperCaseTr = new Transform({
  transform(chunk, encoding, callback) {
    callback(null, chunk.toString().toUpperCase());
  },
});

const out = fs.createWriteStream("test.txt");
upperCaseTr.pipe(out);

writeToStream(upperCaseTr);

Upvotes: 1

Related Questions