

# Escrever funções do Lambda habilitadas para streaming de resposta
<a name="config-rs-write-functions"></a>

Escrever o manipulador para funções de streaming de resposta é diferente dos padrões típicos do manipulador. Ao escrever funções de streaming, certifique-se de fazer o seguinte:
+ Envolva sua função com o decorador `awslambda.streamifyResponse()`. O objeto global `awslambda` é fornecido pelo ambiente de execução Node.js do Lambda.
+ Encerre a stream adequadamente para garantir que todo o processamento de dados seja concluído.

## Configuração de uma função de manipulador para o streaming de respostas
<a name="config-rs-write-functions-handler"></a>

Para indicar ao runtime que o Lambda deve fazer o streaming das respostas da sua função, é necessário encapsular sua função com o decorador `streamifyResponse()`. Isso faz com que o runtime use o caminho lógico adequado para o streaming de respostas e habilita a função a fazer o streaming das respostas.

O decorador `streamifyResponse()` aceita uma função que aceita os seguintes parâmetros:
+ `event`: fornece informações sobre o evento de invocação do URL da função, como o método HTTP, os parâmetros da consulta e o corpo da solicitação.
+ `responseStream`: fornece um stream gravável.
+ `context`: fornece métodos e propriedades com informações sobre a invocação, a função e o ambiente de execução.

O objeto `responseStream` é um [`writableStream` de Node.js](https://nodesource.com/blog/understanding-streams-in-nodejs/). Como em qualquer stream desse tipo, use o método `pipeline()`.

**nota**  
O objeto global `awslambda` é fornecido automaticamente pelo tempo de execução Node.js do Lambda e nenhuma importação é necessária.

**Example manipulador habilitado para streaming de resposta**  

```
import { pipeline } from 'node:stream/promises';
import { Readable } from 'node:stream';

export const echo = awslambda.streamifyResponse(async (event, responseStream, _context) => {
  // As an example, convert event to a readable stream.
  const requestStream = Readable.from(Buffer.from(JSON.stringify(event)));

  await pipeline(requestStream, responseStream);
});
```

Embora `responseStream` ofereça o método `write()` para gravar no stream, recomendamos que você use [https://nodejs.org/api/stream.html#streampipelinesource-transforms-destination-callback](https://nodejs.org/api/stream.html#streampipelinesource-transforms-destination-callback) sempre que possível. O uso de `pipeline()` garante que o stream gravável não seja sobrecarregado por um stream legível mais rápido.

## Encerramento do stream
<a name="config-rs-write-functions-end"></a>

Certifique-se de encerrar o stream corretamente antes que o manipulador retorne. O método `pipeline()` lida com isso automaticamente.

Para outros casos de uso, chame o método `responseStream.end()` para encerrar corretamente um stream. Esse método sinaliza que nenhum outro dado deve ser gravado no stream. Esse método não é necessário se você gravar no stream com `pipeline()` ou `pipe()`.

A partir do Node.js 24, o Lambda não espera mais que as promessas não resolvidas sejam concluídas após o retorno do manipulador ou o término do fluxo de respostas. Se a sua função depender de operações assíncronas adicionais, como cronômetros ou buscas, será necessário o `await` delas no seu manipulador.

**Example Exemplo de encerramento de um stream com pipeline()**  

```
import { pipeline } from 'node:stream/promises';

export const handler = awslambda.streamifyResponse(async (event, responseStream, _context) => {
  await pipeline(requestStream, responseStream);
});
```

**Example Exemplo de encerramento de um stream sem pipeline()**  

```
export const handler = awslambda.streamifyResponse(async (event, responseStream, _context) => {
  responseStream.write("Hello ");
  responseStream.write("world ");
  responseStream.write("from ");
  responseStream.write("Lambda!");
  responseStream.end();
});
```