Я бы начал с реализации потока преобразования (или использования существующей библиотеки), чтобы прочитать файл построчно.
function toLines() {
let line = '';
return new Transform({
decodeStrings: false,
readableObjectMode: true,
transform(chunk, encoding, callback) {
const lines = chunk.split(/\r?\n/g);
line += lines.shift();
while (lines.length) {
this.push(line);
line = lines.shift();
}
callback();
},
flush(callback) {
if (line) {
this.push(line);
}
callback();
}
});
}
Тогда я бы реализовал поток преобразования для шифрования каждой строки.
function encryptLines(algorithm, derivedKey, iv) {
return new Transform({
readableObjectMode: false,
writableObjectMode: true,
transform(line, encoding, callback) {
const cipher = crypto.createCipheriv(algorithm, derivedKey, iv);
this.push(cipher.update(line, encoding, 'base64'));
this.push(cipher.final('base64'));
this.push('\n');
callback();
}
});
}
Тогда вы можете просто pipe
все в поток вывода (по желанию).
fs.createReadStream('input.txt', {encoding: 'utf8'})
.pipe(toLines())
.pipe(encryptLines(algorithm, derivedKey, iv))
.pipe(fs.createWriteStream('output.txt'))
.on('finish', () => console.log('done'));