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, ochunk
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
edata
.error
é utilizado para indicar se ocorreu algum erro durante o processamento, enquantodata
é 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.