# TransformStream

The **TransformStream** interface of the **Streams API** represents a concrete implementation of the pipe chain transform stream concept.

It may be passed to the ReadableStream.pipeThrough() method in order to transform a stream of data from one format into another. For example, it might be used to decode (or encode) video frames, decompress data, or convert the stream from XML to JSON.

A transformation algorithm may be provided as an optional argument to the object constructor. If not supplied, data is not modified when piped through the stream.

TransformStream is a transferable object.

## Constructor

[TransformStream()](https://developer.mozilla.org/en-US/docs/Web/API/TransformStream/TransformStream)
Creates and returns a transform stream object, optionally specifying a transformation object and queuing strategies for the streams.

## Instance properties

[TransformStream.readable](https://developer.mozilla.org/en-US/docs/Web/API/TransformStream/readable)
The readable end of a TransformStream.

[TransformStream.writable](https://developer.mozilla.org/en-US/docs/Web/API/TransformStream/writable)
The writable end of a TransformStream.

## Examples

### Anything-to-uint8array stream

In the following example, a transform stream passes through all chunks it receives as Uint8Array values.

```js
  const transformContent = {
    start() {}, // required.
    async transform(chunk, controller) {
      chunk = await chunk;
      switch (typeof chunk) {
        case 'object':
          // just say the stream is done
          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() { /* do any destructor work here */ }
  }

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

For more information on [TransformStream](https://developer.mozilla.org/en-US/docs/Web/API/TransformStream) visit MDN Web Docs.