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 |