# TransformStream

**TransformStream** representa uma implementação concreta do conceito de *pipe chain transform*.

TransformStream pode ser passado para o método ReadableStream.pipeThrough() para transformar os dados da stream de um formato para outro. Por exemplo, pode ser usado para decodificar ou codificar frames de vídeos, descompactar dados ou converter a *stream* de XML para JSON.

Um algoritmo de transformação pode ser informado como um argumento opcional para o objeto construtor. Se não informado, os dados não serão modificados.

TransformStream é um objeto transferível.

## Construtor

[TransformStream()](https://developer.mozilla.org/en-US/docs/Web/API/TransformStream/TransformStream)
Cria e retorna um objeto transform stream, especificando opcionalmente um transformation object e ordenando estratégias para as *streams*.

## Propriedades

[TransformStream.readable](https://developer.mozilla.org/en-US/docs/Web/API/TransformStream/readable)
A ponta que possibilita ser realizada a leitura de um TransformStream.

[TransformStream.writable](https://developer.mozilla.org/en-US/docs/Web/API/TransformStream/writable)
A ponta que possibilita ser realizada a escrita de um TransformStream.

## Exemplos

### Anything-to-uint8array stream

No exemplo a seguir, um *transform stream* passa por todos os blocos recebidos como valores Uint8Array.

```js
  const transformContent = {
    start() {}, // obrigatório
    async transform(chunk, controller) {
      chunk = await chunk;
      switch (typeof chunk) {
        case 'object':
          // informa que a stream finalizou
          if (chunk === null) {
            controller.terminate();
          } else if (ArrayBuffer.isView(chunk)) {
            controller.enqueue(new Uint8Array(chunk.buffer, chunk.byteOffset, chunk.byteLength));
          } else if (
            Array.isArray(chunk) &&
            chunk.every((value) => typeof value === 'number')
          ) {
            controller.enqueue(new Uint8Array(chunk));
          } else if (
            typeof chunk.valueOf === 'function' &&
            chunk.valueOf() !== chunk
          ) {
            this.transform(chunk.valueOf(), controller); // hack
          } else if ('toJSON' in chunk) {
            this.transform(JSON.stringify(chunk), controller);
          }
          break;
        case 'symbol':
          controller.error("Cannot send a symbol as a chunk part")
          break
        case 'undefined':
          controller.error("Cannot send undefined as a chunk part")
          break
        default:
          controller.enqueue(this.textencoder.encode(String(chunk)))
          break
      }
    },
    flush() {}
  }

  class AnyToU8Stream extends TransformStream {
    constructor() {
      super({...transformContent, textencoder: new TextEncoder()})
    }
  }
```

Para mais informações sobre [TransformStream](https://developer.mozilla.org/en-US/docs/Web/API/TransformStream) visite MDN Web Docs.





---