# ReadableStreamBYOBReader

O **ReadableStreamBYOBReader** da *Stream APIs* descreve um leitor para uma *ReadableStream* que facilita uma leitura *zero-copy* de uma fonte de bytes. É utilizado para transferências eficientes de dados de fontes que apresentam uma série de bytes anônimos como dados, como arquivos.

Nesse contexto, o termo **BYOB** significa "Traga o seu próprio buffer".

## Construtor

[ReadableStreamBYOBReader()](https://developer.mozilla.org/en-US/docs/Web/API/ReadableStreamBYOBReader/ReadableStreamBYOBReader)
Cria e retorna uma instância de um objeto ReadableStramBYOBReader.

## Propriedades

[ReadableStreamBYOBReader.closed](https://developer.mozilla.org/en-US/docs/Web/API/ReadableStreamBYOBReader/closed)
Retorna uma *Promise* que se realiza quando a *stream* fechar, ou rejeita caso a *stream* retorne um erro ou o *lock* do reader é ativado. Essa propriedade habilita a produção de códigos que respondem a um ponta do processo de *streaming*.

## Métodos

[ReadableStreamBYOBReader.cancel()](https://developer.mozilla.org/en-US/docs/Web/API/ReadableStreamBYOBReader/cancel)
Retorna uma *Promise* que se realiza quando uma *stream* é cancelada. Quando esse método é chamado, sinaliza que o consumidor perdeu o interesse na stream. O motivo será retornado para a origem.

[ReadableStreamBYOBReader.read()](https://developer.mozilla.org/en-US/docs/Web/API/ReadableStreamBYOBReader/read)
Passa uma *view* que deve conter os dados, e retorna uma *Promise* que se realiza com o próximo conteúdo na *stream*, ou retorna uma rejeição com um indicativo que a *stream* foi fechada ou retornou um erro.

[ReadableStreamBYOBReader.releaseLock()](https://developer.mozilla.org/en-US/docs/Web/API/ReadableStreamBYOBReader/releaseLock)
Libera o processamento de leitura da *stream*.

## Exemplos

Crie um reader usando ReadableStream.getReader() na stream, especificando o modo `byob` nas opções de parâmetro.

```js
  const reader = stream.getReader({ mode: "byob" });
  let buffer = new ArrayBuffer(4000);
```

Uma função que utiliza o reader é apresentada abaixo.

```js
  readStream(reader);
  
  function readStream(reader) {
    let bytesReceived = 0;
    let offset = 0;
  
    while (offset < buffer.byteLength) {
      // read() retorna uma promise que se realiza quando um valor é recebido 
      reader.read(new Uint8Array(buffer, offset, buffer.byteLength - offset))
        .then(function processBytes({ done, value }) {
          // Result objects :
          // done  - true se a stream já tiver passado todos os dados
          // value - alguma informação. Sempre undefined, caso done for verdadeiro.
  
          if (done) {
            // Não há mais dados na stream
            return;
          }
  
          buffer = value.buffer;
          offset += value.byteLength;
          bytesReceived += value.byteLength;
  
          // Lê mais dados e chama a função novamente
          return reader.read(new Uint8Array(buffer, offset, buffer.byteLength - offset)).then(processBytes);
        });
    }
  }
```

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





---