> ## Documentation Index
> Fetch the complete documentation index at: https://www.helius.dev/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Gestión de reconexiones y errores en Parsed Streams

> Detecta desconexiones de Parsed Streams, vuelve a conectarte con espera exponencial, suscríbete de nuevo y recupera exactamente la ventana de slots que perdiste.

La entrega se realiza **como máximo una vez**; no hay reproducción. Lo que se haya confirmado mientras estabas desconectado no se vuelve a enviar, por lo que un cliente de producción debe detectar la interrupción y decidir si necesita recuperar los datos faltantes. La señal para hacerlo es `context.slot`: delimita la ventana que perdiste durante una desconexión. Esta guía explica por qué se cierran las conexiones, cómo volver a conectarte correctamente y cómo usar esta señal.

## Por qué se cierran las conexiones

Cada cierre tiene un código de cierre de WebSocket que indica qué ocurrió y qué hacer a continuación:

| Código      | Motivo                                                                         | Qué hacer                                                                                                                                                                                                                             |
| ----------- | ------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 1000        | Inactividad: no hubo mensajes del cliente ni notificaciones durante 10 minutos | Envía el método JSON-RPC `ping` cada pocos minutos si tu filtro tiene poca actividad. Los pings de WebSocket a nivel de protocolo que las bibliotecas cliente envían automáticamente **no** reinician el temporizador de inactividad. |
| 1001        | Reinicio del servidor (despliegue)                                             | Vuelve a conectarte y a suscribirte                                                                                                                                                                                                   |
| 1008        | Consumidor lento: acumulaste un retraso de más de 2048 notificaciones          | Vuelve a conectarte con un filtro más específico, `details: "matched"` o `"raw"`, o procesa los datos más rápido                                                                                                                      |
| 1005 / 1006 | El perímetro de red recicló la conexión                                        | Vuelve a conectarte y a suscribirte; es normal que ocurra ocasionalmente en cualquier conexión de larga duración                                                                                                                      |

El servidor envía un ping cada 15 segundos, por lo que incluso una conexión activa pero sin actividad sigue transportando tráfico. Si no recibes absolutamente nada durante más de un minuto —ni notificaciones ni pings—, asume que la conexión está inactiva y vuelve a conectarte en lugar de esperar a que el socket te lo indique.

## Mantén activa la conexión

Si tu filtro es tan específico que puede pasar legítimamente 10 minutos sin encontrar coincidencias, envía explícitamente un `ping` de JSON-RPC en un intervalo menor:

```json theme={"system"}
{ "jsonrpc": "2.0", "id": 99, "method": "ping" }
```

Devuelve el slot actual y, lo que es más importante, cuenta como un mensaje del cliente para el temporizador de inactividad. Una trama ping de WebSocket a nivel de biblioteca no cuenta.

## Vuelve a conectarte y detecta la interrupción

<Steps>
  <Step title="Reconnect with Backoff">
    Ante cualquier cierre, esperado o no, vuelve a conectarte con espera exponencial. Los identificadores de suscripción no se conservan después de una reconexión, así que vuelve a enviar `parsedTransactionSubscribe` para cada filtro que tenías abierto.
  </Step>

  <Step title="Track context.slot Across Disconnects">
    Conserva el último `context.slot` que recibiste antes de la desconexión. La diferencia entre ese slot y el primer slot que recibas después de volver a conectarte es exactamente la ventana que perdiste, ni más ni menos.
  </Step>

  <Step title="Backfill if You Need To">
    Si tu aplicación no puede tolerar la interrupción, recupera los datos de esa ventana de slots mediante RPC: usa `getSignaturesForAddress` para enumerar las transacciones del intervalo y luego `getTransaction` para obtener cada una. Este es un paso de conciliación manual; Parsed Streams no reproduce los datos.
  </Step>
</Steps>

```typescript theme={"system"}
import WebSocket from "ws";

const URL = "wss://fs-beta.helius-rpc.com/?api-key=<API_KEY>";
const filters = [
  { programs: ["JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4"] },
];

let lastSlotSeen: number | null = null;
let backoffMs = 1000;

function connect() {
  const ws = new WebSocket(URL);

  ws.on("open", () => {
    backoffMs = 1000;
    filters.forEach((filter, i) => {
      ws.send(JSON.stringify({
        jsonrpc: "2.0",
        id: i + 1,
        method: "parsedTransactionSubscribe",
        params: [filter],
      }));
    });
  });

  ws.on("message", (data) => {
    const msg = JSON.parse(data.toString());
    if (msg.method === "parsedTransactionNotification") {
      const { slot } = msg.params.result.context;

      // Across reconnects, the slot bounds the backfill window.
      if (lastSlotSeen !== null && slot > lastSlotSeen) {
        // backfill candidates: slots lastSlotSeen+1 .. slot-1 while disconnected
      }
      lastSlotSeen = slot;
    }
  });

  ws.on("close", (code) => {
    console.warn(`connection closed (${code}); reconnecting in ${backoffMs}ms`);
    setTimeout(connect, backoffMs);
    backoffMs = Math.min(backoffMs * 2, 30_000);
  });
}

connect();
```

`context.slot` es lo que se conserva tras una reconexión: registra el slot más alto que hayas procesado por completo antes de la desconexión y considera todo lo posterior como la ventana de recuperación.

## Gestión de errores de JSON-RPC

Las solicitudes que fallan devuelven un error de JSON-RPC en lugar de un resultado, por lo que puedes bifurcar la lógica según `error.code`:

| Código   | Significado                                                                                                       |
| -------- | ----------------------------------------------------------------------------------------------------------------- |
| `-32700` | Error de análisis (JSON no válido)                                                                                |
| `-32600` | Solicitud no válida                                                                                               |
| `-32601` | Método no encontrado                                                                                              |
| `-32602` | Parámetros no válidos: clave pública incorrecta, campo desconocido o valor de compromiso o detalles no compatible |
| `-32000` | Se excedió el límite de filtros                                                                                   |
| `-32001` | El servidor no está listo; vuelve a intentarlo con espera exponencial                                             |
| `-32002` | Límite de frecuencia alcanzado (10 mensajes por segundo)                                                          |
| `-32006` | Demasiadas suscripciones (25 por conexión)                                                                        |

`-32602` e `-32000` indican que la solicitud es incorrecta: corrige el filtro y no vuelvas a intentarlo sin cambios. `-32001` e `-32002` son errores transitorios; vuelve a intentarlo con la misma espera exponencial que usas para las reconexiones.

## Próximos pasos

<CardGroup cols={2}>
  <Card title="Quickstart" icon="bolt" href="/docs/es/parsed-streams/quickstart">
    Referencia completa del protocolo: métodos, campos de filtro y límites.
  </Card>

  <Card title="Track Jupiter Swaps" icon="arrow-right-arrow-left" href="/docs/es/parsed-streams/guides/track-jupiter-swaps">
    Crea un filtro al que esta conexión pueda suscribirse.
  </Card>
</CardGroup>
