# ReadableStreamDefaultReader

A interface `ReadableStreamDefaultReader` é o reader padrão da Streams API do Azion Runtime. Ela lê os dados de um stream que vem da rede, como o corpo de uma resposta a uma requisição `fetch()`. Um [ReadableStreamBYOBReader](/pt-br/documentacao/devtools/runtime/api-reference/readable-byob-reader/) funciona apenas com um stream que tem uma fonte de bytes, mas um `ReadableStreamDefaultReader` lê de qualquer tipo de fonte de [ReadableStream](/pt-br/documentacao/devtools/runtime/api-reference/readable-stream/). Para mais informações, consulte [ReadableStreamDefaultReader](https://developer.mozilla.org/en-US/docs/Web/API/ReadableStreamDefaultReader) na MDN Web Docs.

---

## Construtor

O construtor [`ReadableStreamDefaultReader()`](https://developer.mozilla.org/en-US/docs/Web/API/ReadableStreamDefaultReader/ReadableStreamDefaultReader) cria e retorna um reader para o stream que você passa para ele:

```javascript
new ReadableStreamDefaultReader(stream)
```

O método `getReader()` de um `ReadableStream` também retorna um `ReadableStreamDefaultReader` e bloqueia o stream para ele.

---

## Propriedades

| Propriedade                                                                                     | Tipo    | Descrição                                                                                                                                                                        |
| ----------------------------------------------------------------------------------------------- | ------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| [`closed`](https://developer.mozilla.org/en-US/docs/Web/API/ReadableStreamDefaultReader/closed) | Promise | É cumprida quando o stream é encerrado. É rejeitada quando o stream lança um erro ou quando o bloqueio do reader é liberado. Use-a para executar código quando o stream termina. |

---

## Métodos

| Método                                                                                                             | Descrição                                                                                                                                                                                       |
| ------------------------------------------------------------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| [`reader.cancel(reason)`](https://developer.mozilla.org/en-US/docs/Web/API/ReadableStreamDefaultReader/cancel)     | Retorna uma promise que resolve quando o stream é cancelado. Uma chamada sinaliza que o consumidor perdeu o interesse no stream. A fonte subjacente recebe `reason` e pode usá-lo ou ignorá-lo. |
| [`reader.read()`](https://developer.mozilla.org/en-US/docs/Web/API/ReadableStreamDefaultReader/read)               | Retorna uma promise que dá acesso ao próximo chunk da fila interna do stream, como um objeto com `value` e `done`. Depois do último chunk, `done` é `true` e `value` é `undefined`.             |
| [`reader.releaseLock()`](https://developer.mozilla.org/en-US/docs/Web/API/ReadableStreamDefaultReader/releaseLock) | Libera o bloqueio do reader sobre o stream. Depois da chamada, a propriedade `locked` do stream é `false`.                                                                                      |

---

## Exemplo

Este handler busca uma página, lê o corpo dela um chunk de cada vez com um reader e adiciona cada chunk a um stream que ele constrói. Ele retorna esse stream como o corpo de um `Response` com um header `Content-Type` HTML:

```javascript
export default {
  async fetch(request, env, ctx) {
    return fetch("https://www.example.org/").then((response) => {
      const reader = response.body.getReader();
      const stream = new ReadableStream({
        start(controller) {
          // Handle each chunk of data
          function push() {
            // "done" is a Boolean and "value" is a Uint8Array
            return reader.read().then(({ done, value }) => {
              // No more data to read: close the stream
              if (done) {
                controller.close();
                return;
              }

              // Pass the chunk to the client through the controller
              controller.enqueue(value);
              push();
            });
          }

          push();
        }
      });

      return new Response(stream, { headers: { "Content-Type": "text/html" } });
    });
  },
};
```

A resposta que a function retorna tem estes valores: o status, o header `content-type`, o tamanho do corpo em caracteres e os primeiros 15 caracteres do corpo:

```json
{
 "status": 200,
 "contentType": "text/html",
 "bodyChars": 577,
 "startsWith": "<!doctype html>"
}
```

---

## Recursos relacionados

- [ReadableStream](/pt-br/documentacao/devtools/runtime/api-reference/readable-stream.md): O stream que um reader bloqueia, e os métodos que o canalizam, dividem e cancelam.
- [ReadableStreamBYOBReader](/pt-br/documentacao/devtools/runtime/api-reference/readable-byob-reader.md): O reader que lê um stream de bytes para um buffer que você fornece.
- [Response](/pt-br/documentacao/devtools/runtime/api-reference/response.md): O objeto de resposta cuja propriedade `body` é o stream que um reader lê.
- [Web APIs](/pt-br/documentacao/devtools/runtime/api-reference/javascript.md): As outras Web APIs que o Azion Runtime suporta.
