Criando uma Transform Stream


A stream de transformação em Node é uma classe que permite a transformação de dados de entrada à medida que eles fluem através da stream. Essa classe é uma subclasse de Duplex.

O método _transform é responsável por transformar os dados de entrada e emitir os dados transformados para a próxima etapa da stream. Ao criar uma stream Transform, é necessário implementar este método para definir como os dados devem ser modificados.

Parâmetros do método _transform

  • chunk: Este parâmetro representa um pedaço de dados de entrada que está sendo processado pela stream. Assim como nos métodos _write e _read das streams Writable e Readable, o chunk pode ser uma string, um buffer ou qualquer outro tipo de dado.

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

  • callback: Este parâmetro é uma função de callback que deve ser chamada quando o processamento do chunk é concluído. A função de callback recebe dois parâmetros opcionais: error e data. error é utilizado para indicar se ocorreu algum erro durante o processamento, enquanto data é utilizado para enviar os dados transformados para a próxima etapa da stream.

Exemplo

import { Transform } from 'node:stream'
 
class InverseNumberStream extends Transform {
    _transform(chunk, encoding, callback) {
        const transformed = Number(chunk.toString()) * -1
 
        callback(null, Buffer.from(String(transformed)))
    }
}
 
new OneToHundredStream()
    .pipe(new InverseNumberStream())
    .pipe(new MultiplyByTenStream())
$ node src/streams.js
-10
-20
-30
-40
...

No exemplo acima, uma stream de transformação chamada InverseNumberStream é criada, estendendo a classe Transform. Esta stream é projetada para inverter os números recebidos como entrada, multiplicando cada número por -1.

O resultado da InverseNumberStream é então encadeado com uma stream chamada MultiplyByTenStream, que foi definida anteriormente. Dessa forma, MultiplyByTenStream multiplica cada número recebido por 10.

Referências