Estoy usando el paquete integrado crypto, zlib y fs de nodejs para encriptar un archivo grande usando estos códigos.
import fs from 'fs'; import zlib from 'zlib'; import crypto from 'crypto'; const initVect = crypto.randomBytes(16); const fread = fs.createReadStream('X:/File.mp4'); const fwrite = fs.createWriteStream('X:/File.mp4.enc'); const gzipStream = zlib.createGzip(); const hashedPassword = crypto.createHash('sha256').update('SomePassword').digest(); const cipher = crypto.createCipheriv( 'aes-256-cbc', hashedPassword, initVect ); fread.pipe(gzipStream).pipe(cipher).pipe(fwrite);
Pero no sé cómo agregar un indicador de estado/progreso del cifrado, ya que un archivo grande tardará mucho tiempo en cifrarse. Quiero mostrar el progreso del cifrado al usuario en la consola.
¿Pueden decirme cómo lograr esto?
Puede lograr esto usando stream Transform()
. Cree una nueva secuencia Transform()
, obtenga la longitud del fragmento procesado, luego simplemente calcule el progreso con la longitud del fragmento y el tamaño del archivo, luego agregue esta nueva transformación a su tubería existente.
Como esto:-
import fs from 'fs'; import zlib from 'zlib'; import crypto from 'crypto'; import { TransformCallback, Transform } from 'stream'; const initVect = crypto.randomBytes(16); const fread = fs.createReadStream('X:/File.mp4'); const fwrite = fs.createWriteStream('X:/File.mp4.enc'); const gzipStream = zlib.createGzip(); const hashedPassword = crypto.createHash('sha256').update('SomePassword').digest(); const cipher = crypto.createCipheriv( 'aes-256-cbc', hashedPassword, initVect ); const fileSize = fs.statSync(fread.path).size; let processedBytes = 0; const progressPipe = new Transform({ transform( chunk: Buffer, _encoding: BufferEncoding, callback: TransformCallback ) { processedBytes += chunk.length; console.log( `${Math.floor((processedBytes / fileSize) * 100)}%` ); this.push(chunk); callback(); }, }); fread.pipe(progressPipe).pipe(gzipStream).pipe(cipher).pipe(fwrite);