Criando uma Writable Stream


As Writable Streams em Node são utilizadas para escrever dados em algum destino, como um arquivo, um banco de dados ou uma conexão de rede. Ao criar uma Writable Stream, é necessário implementar o método _write da classe Writable do módulo node:stream. Este método é responsável por processar os dados que são escritos na stream.

Parâmetros do método _write

  • chunk: O primeiro parâmetro do método _write é o chunk, que representa um pedaço de dados que está sendo escrito na stream. Este chunk pode ser uma string, um buffer ou qualquer outro tipo de dado que está sendo transmitido através da stream.

  • encoding: O segundo parâmetro é o encoding, que especifica a codificação dos dados no chunk. Este parâmetro é útil quando os dados na stream estão sendo transmitidos em uma codificação específica, como UTF-8.

  • callback: O terceiro parâmetro é uma função de callback, que deve ser chamada quando o processamento do chunk é concluído. Esta função de callback é importante para indicar à stream que está pronta para receber mais dados, e geralmente é chamada sem nenhum argumento.

Atenção

A stream de escrita apenas processa os dados de uma stream, e não transforma ela em outra coisa (isso é papel da classe Transform. Logo a função _write não retorna nenhuma valor.

Exemplo

import { Writable } from 'node:stream'
 
class MultiplyByTenStream extends Writable {
    _write(chunk, encoding, callback) {
        console.log(
            Number(chunk.toString()) * 10
        )
        callback()
    }
}
 
new OneToHundredStream()
	.pipe(new MultiplyByTenStream())
 
$ node src/streams.js
10
20
30
40
50
60
...

No exemplo acima, uma classe MultiplyByTenStream é criada, estendendo a classe Writable, e substituindo o método _write. Dentro deste método _write, cada chunk recebido é convertido para um número, multiplicado por 10 e então impresso no console. Finalmente, a função de callback é chamada para indicar que o processamento do chunk foi concluído.

Ao criar uma instância da stream OneToHundredStream (fornecida no exemplo anterior), que emite números de 1 a 100, e encadeá-la com a stream MultiplyByTenStream, os números emitidos são processados pela stream de escrita e o resultado, que é cada número multiplicado por 10, é exibido no console.

Referências