Fluxurile (Streams) reprezinta colectii de date procesate pe bucati, permitand consumul eficient al fisierelor mari fara a satura memoria.
Prezentare Generală a Tipurilor de Streams
| Tip | Direcție | Descriere |
|---|---|---|
Readable |
Doar citire | Sursa din care datele pot fi citite |
Writable |
Doar scriere | Destinatia in care datele pot fi scrise |
Transform |
Citire și scriere | Transforma sau modifica datele pe masura ce trec prin el |
Duplex |
Citire și scriere | Atat citibil cat si inscriptibil cu canale independente (ex: socket TCP) |
Pipeline și modulul modern stream/promises
Versiunile moderne de Node.js ofera functia pipeline pentru a conecta fluxuri in siguranta cu gestionare automata a erorilor:
const { pipeline } = require('stream/promises');
const fs = require('fs');
const zlib = require('zlib');
async function compressFile() {
await pipeline(
fs.createReadStream('source.tar'),
zlib.createGzip(),
fs.createWriteStream('source.tar.gz')
);
console.log('Comprimare finalizata');
}
Crearea de Streams Personalizate
1. Flux Readable Personalizat
const { Readable } = require('stream');
function createTimestampStream() {
let count = 0;
return new Readable({
objectMode: true,
read() {
if (count >= 5) {
this.push(null); // Sfarsitul fluxului
} else {
this.push({ id: ++count, time: new Date() });
}
}
});
}
2. Flux Transform Personalizat
const { Transform } = require('stream');
const uppercaseTransformer = new Transform({
transform(chunk, encoding, callback) {
const transformed = chunk.toString().toUpperCase();
callback(null, transformed);
}
});
3. Flux Writable Personalizat
const { Writable } = require('stream');
const consoleWriter = new Writable({
objectMode: true,
write(chunk, encoding, callback) {
console.log('Scriere fragment:', chunk);
callback();
}
});
Modul Flowing vs Modul Paused
Fluxurile de citire functioneaza fie in modul de pauza (paused), fie in modul continuu (flowing):
const stream = fs.createReadStream('data.csv');
// Atasarea unui ascultator 'data' activeaza automat modul flowing
stream.on('data', (chunk) => {
console.log(`Receptionati ${chunk.length} octeti`);
});
// Control explicit al fluxului
stream.pause(); // Suspenda temporar evenimentele
stream.resume(); // Reia evenimentele de streaming
Evenimentele Fluxurilor
| Eveniment | Se aplică la | Condiție de Declanșare |
|---|---|---|
data |
Readable |
Emis cand un fragment de date este pregatit pentru consum |
end |
Readable |
Emis cand nu mai sunt date disponibile pentru citire |
finish |
Writable |
Emis cand toate datele scrise au fost transmise complet |
error |
All | Emis ori de cate ori apare o eroare netratata in flux |
close |
All | Emis cand descriptorul de baza este inchis |