# WebSocket API

A WebSocket API permite que sua Function atue como um servidor ou cliente WebSocket completo e faça proxy de tráfego bidirecional para serviços de backend. Isso habilita casos de uso em tempo real, como chat, jogos multiplayer, dashboards de telemetria e fluxos de inferência de AI — tudo servido diretamente do edge para latência subsegundo.

:::note
No momento, esta funcionalidade está acessível exclusivamente para clientes com o suporte **Business**, **Enterprise** e **Mission Critical**, também disponível nos contratos de **Reserva de Capacidade** ou **Saving Plan**. [Entre em contato com a equipe de Suporte](https://tickets.azion.com/en/support/loginen/support/login/new) para solicitar acesso a esta funcionalidade.
:::

## Modos Servidor e Cliente

- Use a função `upgradeWebSocket()` para tratar requisições de upgrade WebSocket no lado servidor.
- Para conexões de saída (cliente), utilize a API padrão `WebSocket(url)`.

## Helpers de Broadcast

- Facilite o broadcast de mensagens para todos os clientes conectados usando helpers nativos, permitindo fan-out eficiente com código mínimo.

## Métricas e Logs

Esses eventos ficam visíveis em Real-Time Metrics e LogStream, ajudando a monitorar conexões e atividades de mensagens.

- `websocket.connection.accepted`
- `message.sent`
- `message.received`

## Suporte ao Firewall

- As regras do Firewall podem inspecionar o tráfego WebSocket antes do processo de upgrade ser finalizado.
- Certifique-se de que suas políticas de firewall estão configuradas para lidar com conexões WebSocket conforme necessário.

## Exemplo

```javascript
export default {
    async fetch(request, env, ctx) {
        // Check if the request is a WebSocket upgrade
        if (request.headers.get("upgrade") === "websocket") {
            // Use the upgradeWebSocket function to handle the WebSocket upgrade
            const { response, socket } = upgradeWebSocket(request);

            // Handle WebSocket events
            socket.addEventListener("open", () => {
                console.log("WebSocket connection established");
            });

            socket.addEventListener("message", (event) => {
                console.log(`Message received: ${event.data}`);
                socket.send("pong"); // Respond with "pong"
            });

            socket.addEventListener("close", () => {
                console.log("WebSocket connection closed");
            });

            socket.addEventListener("error", (error) => {
                console.error("WebSocket error:", error);
            });

            // Return the response to complete the WebSocket upgrade
            return response;
        }

        // If the request is not a WebSocket upgrade, serve a simple HTML page
        const htmlContent = `
            <!DOCTYPE html>
            <html>
            <head>
                <title>WebSocket Example</title>
            </head>
            <body>
                <h1>WebSocket Example</h1>
                <script>
                    const socket = new WebSocket("wss://" + location.host);
                    socket.onopen = () => console.log("WebSocket connected");
                    socket.onmessage = (event) => console.log("Message from server:", event.data);
                    socket.onclose = () => console.log("WebSocket disconnected");
                    socket.onerror = (error) => console.error("WebSocket error:", error);
                </script>
            </body>
            </html>
        `;

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