Referência rápida

Guia Rápido de Streams no Node.js

Um guia de referencia completo para Node.js Streams: fluxos Readable, Writable, Transform e Duplex, pipelines, eventos e modo flowing.

· Publicado

Streams sao colecoes de dados processadas em pedacos, permitindo manipular grandes arquivos e trafego de rede com eficiencia de memoria.

Visão Geral dos Tipos de Streams

Tipo Direção Descrição
Readable Somente leitura Fonte a partir da qual os dados sao lidos
Writable Somente gravação Destino para o qual os dados sao gravados
Transform Leitura e gravação Transforma ou modifica dados conforme eles passam
Duplex Leitura e gravação Tanto legivel quanto gravavel com canais independentes (ex: socket TCP)

Pipeline e o módulo moderno stream/promises

O Node.js moderno fornece a funcao pipeline para encadear fluxos com seguranca, limpeza de recursos e tratamento de erros:

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('Compressao concluida');
}

Criação de Streams Personalizados

1. Stream Readable Personalizado

const { Readable } = require('stream');

function createTimestampStream() {
  let count = 0;
  return new Readable({
    objectMode: true,
    read() {
      if (count >= 5) {
        this.push(null); // Fim do fluxo
      } else {
        this.push({ id: ++count, time: new Date() });
      }
    }
  });
}

2. Stream Transform Personalizado

const { Transform } = require('stream');

const uppercaseTransformer = new Transform({
  transform(chunk, encoding, callback) {
    const transformed = chunk.toString().toUpperCase();
    callback(null, transformed);
  }
});

3. Stream Writable Personalizado

const { Writable } = require('stream');

const consoleWriter = new Writable({
  objectMode: true,
  write(chunk, encoding, callback) {
    console.log('Gravando pedaco:', chunk);
    callback();
  }
});

Modo Flowing vs Modo Paused

Streams de leitura operam no modo pausado (paused) ou no modo fluente (flowing):

const stream = fs.createReadStream('data.csv');

// Registrar um ouvinte 'data' ativa automaticamente o modo flowing
stream.on('data', (chunk) => {
  console.log(`Recebidos ${chunk.length} bytes`);
});

// Controle explicito de fluxo
stream.pause();  // Suspender temporariamente eventos
stream.resume(); // Retomar eventos de streaming

Eventos de Streams

Evento Aplicável a Condição de Disparo
data Readable Emitido quando um bloco de dados esta pronto para consumo
end Readable Emitido quando nao ha mais dados disponiveis
finish Writable Emitido quando todos os dados gravados foram enviados ao destino
error All Emitido quando ocorre um erro nao tratado no fluxo
close All Emitido quando o descritor subjacente e fechado

Referências

Temas relacionados