> ## 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.

# Gestion des reconnexions et des erreurs dans les flux analysés

> Détectez les déconnexions des flux analysés, reconnectez-vous avec un délai, resouscrivez et remplissez exactement la fenêtre de slots que vous avez manquée.

La livraison est **au plus une fois** — il n'y a pas de relecture. Ce qui a été confirmé pendant que vous étiez déconnecté n'est pas renvoyé, donc un client de production doit détecter le décalage et décider s'il doit combler cette lacune. Le signal pour cela est `context.slot` : il délimite la fenêtre que vous avez manquée lors d'une déconnexion. Ce guide explique pourquoi les connexions se ferment, comment se reconnecter proprement et comment l'utiliser.

## Pourquoi les connexions se ferment

Chaque fermeture a un code de fermeture WebSocket qui vous indique ce qui s'est passé et ce qu'il faut faire ensuite :

| Code        | Raison                                                                         | Que faire                                                                                                                                                                                                                                             |
| ----------- | ------------------------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 1000        | Inactivité : pas de messages client et pas de notifications pendant 10 minutes | Envoyez la méthode JSON-RPC `ping` toutes les quelques minutes si votre filtre est silencieux. Les pings WebSocket au niveau du protocole que les bibliothèques clientes envoient automatiquement ne réinitialisent **pas** le compteur d'inactivité. |
| 1001        | Redémarrage du serveur (déploiement)                                           | Reconnectez-vous et resouscrivez                                                                                                                                                                                                                      |
| 1008        | Consommateur lent : vous avez pris plus de 2048 notifications de retard        | Reconnectez-vous avec un filtre plus étroit, `details: "matched"` ou `"raw"`, ou un traitement plus rapide                                                                                                                                            |
| 1005 / 1006 | Le bord réseau a recyclé la connexion                                          | Reconnectez-vous et resouscrivez ; normal à une certaine fréquence sur toute connexion de longue durée                                                                                                                                                |

Le serveur envoie un ping toutes les 15 secondes, donc une connexion saine mais silencieuse transporte encore du trafic. Si vous ne voyez rien du tout pendant plus d'une minute — ni notification, ni ping — supposez que la connexion est morte et reconnectez-vous plutôt que d'attendre que la socket vous informe.

## Garder la connexion active

Si votre filtre est suffisamment étroit pour qu'il puisse légitimement passer 10 minutes sans correspondance, envoyez un JSON-RPC `ping` explicite à un intervalle plus court :

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

Il renvoie le slot actuel et, plus important encore, compte comme un message client pour le timer d'inactivité. Une trame de ping WebSocket au niveau de la bibliothèque ne le fait pas.

## Se reconnecter et détecter le décalage

<Steps>
  <Step title="Reconnecter avec délai">
    À toute fermeture — prévue ou non — reconnectez-vous avec un délai exponentiel. Les identifiants d'abonnement ne survivent pas à une reconnexion, donc renvoyez `parsedTransactionSubscribe` pour chaque filtre que vous aviez ouvert.
  </Step>

  <Step title="Suivre context.slot à travers les déconnexions">
    Gardez le dernier `context.slot` que vous avez vu avant la déconnexion. L'écart entre ce slot et le premier slot que vous voyez après la reconnexion est exactement la fenêtre que vous avez manquée — rien de plus, rien de moins.
  </Step>

  <Step title="Remplir les données si nécessaire">
    Si votre application ne peut pas tolérer le décalage, remplissez cette fenêtre de slots depuis le RPC : `getSignaturesForAddress` pour énumérer les transactions dans la plage, puis `getTransaction` pour récupérer chacune. C'est une étape de réconciliation manuelle — Parsed Streams ne rejoue pas.
  </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` est ce qui survit à une reconnexion : suivez le slot le plus élevé que vous avez entièrement traité avant la déconnexion et traitez tout ce qui vient après comme la fenêtre de remplissage.

## Gestion des erreurs JSON-RPC

Les demandes qui échouent renvoient une erreur JSON-RPC au lieu d'un résultat, vous pouvez donc vous baser sur `error.code` :

| Code     | Signification                                                                                                  |
| -------- | -------------------------------------------------------------------------------------------------------------- |
| `-32700` | Erreur de syntaxe (JSON invalide)                                                                              |
| `-32600` | Demande invalide                                                                                               |
| `-32601` | Méthode introuvable                                                                                            |
| `-32602` | Paramètres invalides : mauvaise clé publique, champ inconnu, engagement ou valeur de détail non pris en charge |
| `-32000` | Limite de filtre dépassée                                                                                      |
| `-32001` | Serveur non prêt ; réessayez avec un délai                                                                     |
| `-32002` | Limitation de débit (10 messages par seconde)                                                                  |
| `-32006` | Trop d'abonnements (25 par connexion)                                                                          |

`-32602` et `-32000` signifient que la demande elle-même est incorrecte — corrigez le filtre, ne le réessayez pas tel quel. `-32001` et `-32002` sont transitoires ; réessayez avec le même délai que vous utilisez pour les reconnexions.

## Prochaines étapes

<CardGroup cols={2}>
  <Card title="Démarrage rapide" icon="bolt" href="/docs/fr/parsed-streams/quickstart">
    Référence complète du protocole : méthodes, champs de filtre, limites.
  </Card>

  <Card title="Suivre les échanges Jupiter" icon="arrow-right-arrow-left" href="/docs/fr/parsed-streams/guides/track-jupiter-swaps">
    Construisez un filtre auquel cette connexion peut s'abonner.
  </Card>
</CardGroup>
