1

I need to create a program that reads doc, encrypts it and writes the result to another doc. All of that should be done using transform stream. Here´s my code:

"use strict";
const fs = require("fs");
const crypto = require("crypto");
const Transform = require("stream").Transform;

// Make read and write streams
const input = fs.createReadStream("./logs/data.txt");
let output = fs.createWriteStream("./logs/newdata.txt");

// 2 functions that encrypt data and transform it
class CT extends Transform {
  constructor() {
    super();
  }

  // Encryption function
  makeHash(err, data) {
    if (err) throw err;
    return crypto.createHash("md5").update(data).digest("hex")
  }

  // Encryption function will be passed as a callback
  _transform(data, encoding, callback) {
    callback(null, data);
  }
}

let data;

// Make transform stream
let tr = new CT;
input.on("readable", () => {
  while (data = input.read()) {
    tr._transform(data, "utf8", tr.makeHash);
    console.log(data.toString());
    console.log(tr.makeHash(null, data));
    output.write(data, "utf8", () => {
      output.end();
      console.log("Done writing the file");
    });
  }
});

input.on("error", (err) => {
  console.error(`Unexpected ${err}`);
});

input.on("end", () => {
  console.log("Done reading the file");
});

When I run this program, console shows me that:

TextInfo
a0b5dfe30f8028ab86b1bb48b8f42ebb
Done reading the file
Done writing the file

It means that it initially reads and writes docs, but the result is not encrypted ("TextInfo") - instead it should look like this "a0b5dfe30f8028ab86b1bb48b8f42ebb". I´m sure there´s a mistake in transform stream logic.

Any help will be appreciated!

2
  • output.write(tr._transform(,? Commented Aug 2, 2017 at 12:50
  • @AikonMogwai you mean I need to pass tr._transform(data, "utf8", tr.makeHash) as an argument to output.write? In that case program doesn't work, TypeError: Cannot read property 'length' of undefined Commented Aug 2, 2017 at 13:04

1 Answer 1

1

My mistake #1 was that I created a read stream - instead I should just declare variable input that reads file and on callback excels a transform stream to write its contents.

Mistake #2 was that I incorrectly implemented function makeHash: now it perfectly encrypts and writes to the file. So this function is called as a callback of _transform function.

Here´s the working code:

"use strict";
const fs = require("fs");
const crypto = require("crypto");
const Transform = require("stream").Transform;

const input = fs.readFile("./logs/data.txt", "utf8", (err, content) => {
  if (err) throw err;
  tr.write(content);
});
let output = fs.createWriteStream("./logs/newdata.txt");

class CT extends Transform {
  constructor() {
    super();
  }
  // Function declares cData - encrypted input text and writes it to the file
  makeHash(err, data) {
    let cData = crypto.createHash("md5").update(data).digest("hex");
    output.write(cData, "utf8", () => {
      output.end();
      console.log("Done writing the file");
    });
  }

  _transform(chunk, encoding, callback) {
    callback(null, chunk);
  }
}

let tr = new CT;
tr.on("data", (chunk) => tr._transform(chunk, "utf8", tr.makeHash));

tr.on("error", (err) => {
  console.error(`Unexpected ${err}`);
});
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.