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

# Umgang mit erneuten Verbindungen und Fehlern in geparsten Streams

> Erkennen Sie Unterbrechungen von geparsten Streams, stellen Sie die Verbindung mit Backoff wieder her, abonnieren Sie erneut und füllen Sie genau das Slot-Fenster auf, das Sie verpasst haben.

Die Zustellung erfolgt **höchstens einmal** — es gibt keine Wiederholung. Was während der Trennung bestätigt wurde, wird nicht erneut gesendet, daher muss ein Produktionsclient die Lücke erkennen und entscheiden, ob er sie auffüllen möchte. Das Signal dafür ist `context.slot`: es begrenzt das Fenster, das Sie während einer Unterbrechung verpasst haben. Dieser Leitfaden erklärt, warum Verbindungen geschlossen werden, wie man sauber erneut verbindet und wie man es nutzt.

## Warum Verbindungen geschlossen werden

Jede Schließung hat einen WebSocket-Schließcode, der erklärt, was passiert ist und was als nächstes zu tun ist:

| Code        | Grund                                                                          | Was zu tun ist                                                                                                                                                                                                   |
| ----------- | ------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 1000        | Leerlauf: keine Client-Nachrichten und keine Benachrichtigungen für 10 Minuten | Senden Sie die JSON-RPC-Methode `ping` alle paar Minuten, wenn Ihr Filter ruhig ist. WebSocket-Pings auf Protokollebene, die Client-Bibliotheken automatisch senden, setzen den Leerlauf-Timer **nicht** zurück. |
| 1001        | Server-Neustart (Bereitstellung)                                               | Erneut verbinden und erneut abonnieren                                                                                                                                                                           |
| 1008        | Langsamer Verbraucher: Sie liegen mehr als 2048 Benachrichtigungen zurück      | Erneut verbinden mit einem engeren Filter, `details: "matched"` oder `"raw"`, oder schnellere Verarbeitung                                                                                                       |
| 1005 / 1006 | Netzwerk-Rand hat die Verbindung recycelt                                      | Erneut verbinden und erneut abonnieren; normal in gewissem Umfang bei jeder langlebigen Verbindung                                                                                                               |

Der Server sendet alle 15 Sekunden Pings, sodass eine gesunde, aber ruhige Verbindung immer noch Verkehr trägt. Wenn Sie mehr als eine Minute lang überhaupt nichts sehen — keine Benachrichtigung, kein Ping — gehen Sie davon aus, dass die Verbindung tot ist und stellen Sie die Verbindung wieder her, anstatt darauf zu warten, dass der Socket es Ihnen sagt.

## Halten Sie die Verbindung am Leben

Wenn Ihr Filter so eng ist, dass er legitim 10 Minuten ohne Übereinstimmung bleiben kann, senden Sie eine explizite JSON-RPC `ping` in einem Intervall, das kürzer ist:

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

Es gibt den aktuellen Slot zurück und zählt, noch wichtiger, als Client-Nachricht für den Leerlauf-Timer. Ein Bibliotheksebene-WebSocket-Ping-Frame tut dies nicht.

## Erneut verbinden und die Lücke erkennen

<Steps>
  <Step title="Mit Backoff erneut verbinden">
    Bei jeder Schließung — erwartet oder unerwartet — erneut verbinden mit exponentiellem Backoff. Abonnement-IDs überleben eine erneute Verbindung nicht, daher senden Sie `parsedTransactionSubscribe` für jeden Filter, den Sie geöffnet hatten, erneut.
  </Step>

  <Step title="Verfolgen Sie context.slot über Unterbrechungen hinweg">
    Behalten Sie den letzten `context.slot`, den Sie vor der Unterbrechung gesehen haben. Die Lücke zwischen diesem Slot und dem ersten Slot, den Sie nach der erneuten Verbindung sehen, ist genau das Fenster, das Sie verpasst haben — nichts mehr, nichts weniger.
  </Step>

  <Step title="Füllen Sie auf, wenn Sie müssen">
    Wenn Ihre Anwendung die Lücke nicht tolerieren kann, füllen Sie dieses Slot-Fenster von RPC auf: Verwenden Sie `getSignaturesForAddress`, um Transaktionen im Bereich aufzulisten, und dann `getTransaction`, um jede einzelne abzurufen. Dies ist ein manueller Abgleichsschritt — geparste Streams selbst spielen nicht erneut ab.
  </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` ist das, was eine erneute Verbindung überlebt: Verfolgen Sie den höchsten Slot, den Sie vollständig vor der Unterbrechung verarbeitet haben, und behandeln Sie alles danach als Auffüllfenster.

## Umgang mit JSON-RPC-Fehlern

Anfragen, die fehlschlagen, geben einen JSON-RPC-Fehler anstelle eines Ergebnisses zurück, sodass Sie auf `error.code` verzweigen können:

| Code     | Bedeutung                                                                                               |
| -------- | ------------------------------------------------------------------------------------------------------- |
| `-32700` | Parse-Fehler (ungültiges JSON)                                                                          |
| `-32600` | Ungültige Anfrage                                                                                       |
| `-32601` | Methode nicht gefunden                                                                                  |
| `-32602` | Ungültige Parameter: falscher Pubkey, unbekanntes Feld, nicht unterstützter Commitment- oder Detailwert |
| `-32000` | Filterlimit überschritten                                                                               |
| `-32001` | Server nicht bereit; mit Backoff erneut versuchen                                                       |
| `-32002` | Ratenbegrenzung (10 Nachrichten pro Sekunde)                                                            |
| `-32006` | Zu viele Abonnements (25 pro Verbindung)                                                                |

`-32602` und `-32000` bedeuten, dass die Anfrage selbst falsch ist — korrigieren Sie den Filter, versuchen Sie nicht, ihn so erneut zu senden. `-32001` und `-32002` sind vorübergehend; versuchen Sie es erneut mit dem gleichen Backoff, den Sie für erneute Verbindungen verwenden.

## Nächste Schritte

<CardGroup cols={2}>
  <Card title="Schnellstart" icon="bolt" href="/docs/de/parsed-streams/quickstart">
    Vollständige Protokollreferenz: Methoden, Filterfelder, Grenzwerte.
  </Card>

  <Card title="Verfolgen Sie Jupiter Swaps" icon="arrow-right-arrow-left" href="/docs/de/parsed-streams/guides/track-jupiter-swaps">
    Erstellen Sie einen Filter, auf den diese Verbindung abonnieren kann.
  </Card>
</CardGroup>
