Referință rapidă

Ghid Rapid Streams în Node.js

Un ghid complet de referinta pentru fluxurile Node.js Streams: Readable, Writable, Transform si Duplex, pipeline, evenimente si modul flowing.

· Publicat

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

Referințe

Subiecte conexe