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

# Menangani Penyambungan Ulang dan Kesalahan di Parsed Streams

> Deteksi saat koneksi Parsed Streams terputus, sambungkan kembali dengan backoff, berlangganan ulang, dan isi ulang tepat rentang slot yang terlewat.

Pengiriman dilakukan **paling banyak satu kali** — tidak ada pemutaran ulang. Apa pun yang dikonfirmasi saat koneksi terputus tidak akan dikirim ulang, jadi klien produksi perlu mendeteksi kekosongan tersebut dan memutuskan apakah perlu mengisinya kembali. Sinyal untuk melakukannya adalah `context.slot`: nilai ini menentukan batas rentang yang terlewat selama koneksi terputus. Panduan ini menjelaskan alasan koneksi ditutup, cara menyambungkan kembali dengan benar, dan cara menggunakannya.

## Alasan Koneksi Ditutup

Setiap penutupan memiliki kode penutupan WebSocket yang memberi tahu Anda apa yang terjadi dan tindakan selanjutnya:

| Kode        | Alasan                                                            | Tindakan                                                                                                                                                               |
| ----------- | ----------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 1000        | Tidak aktif: tidak ada pesan klien dan notifikasi selama 10 menit | Sambungkan kembali dan berlangganan ulang. Ping WebSocket tingkat protokol yang dikirim secara otomatis oleh pustaka klien **tidak** mengatur ulang timer tidak aktif. |
| 1001        | Server dimulai ulang (deployment)                                 | Sambungkan kembali dan berlangganan ulang                                                                                                                              |
| 1008        | Konsumen lambat: Anda tertinggal lebih dari 2048 notifikasi       | Sambungkan kembali dengan filter yang lebih sempit, `details: "matched"` atau `"raw"`, atau gunakan pemrosesan yang lebih cepat                                        |
| 1005 / 1006 | Edge jaringan mendaur ulang koneksi                               | Sambungkan kembali dan berlangganan ulang; kondisi ini wajar terjadi dengan frekuensi tertentu pada koneksi berumur panjang                                            |

Server mengirim ping setiap 15 detik, sehingga koneksi yang sehat tetapi sepi tetap membawa lalu lintas. Jika Anda tidak menerima apa pun selama lebih dari satu menit — tidak ada notifikasi maupun ping — anggap koneksi terputus dan sambungkan kembali tanpa menunggu socket memberi tahu Anda.

## Filter Sepi dan Batas Waktu Tidak Aktif

Jika filter Anda cukup sempit sehingga secara wajar tidak menemukan kecocokan selama 10 menit, perkirakan server akan menutup koneksi dengan kode 1000. Tangani seperti penutupan lainnya: sambungkan kembali, berlangganan ulang, dan isi kembali kekosongan seperti yang dijelaskan di bawah ini.

## Menyambungkan Kembali dan Mendeteksi Kekosongan

<Steps>
  <Step title="Reconnect with Backoff">
    Pada setiap penutupan — baik yang diperkirakan maupun tidak — sambungkan kembali dengan backoff eksponensial. ID langganan tidak dipertahankan setelah penyambungan ulang, jadi kirim ulang `parsedTransactionSubscribe` untuk setiap filter yang sebelumnya terbuka.
  </Step>

  <Step title="Track context.slot Across Disconnects">
    Simpan `context.slot` terakhir yang Anda lihat sebelum koneksi terputus. Kekosongan antara slot tersebut dan slot pertama yang Anda lihat setelah tersambung kembali merupakan rentang persis yang terlewat — tidak lebih dan tidak kurang.
  </Step>

  <Step title="Backfill if You Need To">
    Jika aplikasi Anda tidak dapat menerima kekosongan tersebut, isi kembali rentang slot itu dari RPC: gunakan `getSignaturesForAddress` untuk mencantumkan transaksi dalam rentang tersebut, lalu `getTransaction` untuk mengambil setiap transaksi. Ini merupakan langkah rekonsiliasi manual — Parsed Streams tidak melakukan pemutaran ulang.
  </Step>
</Steps>

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

const URL = "wss://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` adalah nilai yang dipertahankan setelah penyambungan ulang: lacak slot tertinggi yang telah Anda proses sepenuhnya sebelum koneksi terputus, lalu perlakukan semua slot setelahnya sebagai rentang pengisian ulang.

## Menangani Kesalahan JSON-RPC

Permintaan yang gagal akan mengembalikan kesalahan JSON-RPC sebagai pengganti hasil, sehingga Anda dapat membuat percabangan berdasarkan `error.code`:

| Kode     | Arti                                                                                                        |
| -------- | ----------------------------------------------------------------------------------------------------------- |
| `-32700` | Kesalahan penguraian (JSON tidak valid)                                                                     |
| `-32600` | Permintaan tidak valid                                                                                      |
| `-32601` | Metode tidak ditemukan                                                                                      |
| `-32602` | Parameter tidak valid: pubkey salah, field tidak dikenal, atau nilai commitment atau details tidak didukung |
| `-32000` | Batas filter terlampaui                                                                                     |
| `-32001` | Server belum siap; coba lagi dengan backoff                                                                 |
| `-32002` | Terkena pembatasan laju (10 pesan per detik)                                                                |
| `-32006` | Terlalu banyak langganan (25 per koneksi)                                                                   |

`-32602` dan `-32000` berarti permintaannya sendiri salah — perbaiki filternya, jangan coba ulang tanpa perubahan. `-32001` dan `-32002` bersifat sementara; coba lagi dengan backoff yang sama seperti yang Anda gunakan untuk penyambungan ulang.

## Langkah Berikutnya

<CardGroup cols={2}>
  <Card title="Quickstart" icon="bolt" href="/docs/id/parsed-streams/quickstart">
    Referensi protokol lengkap: metode, field filter, dan batas.
  </Card>

  <Card title="Track Jupiter Swaps" icon="arrow-right-arrow-left" href="/docs/id/parsed-streams/guides/track-jupiter-swaps">
    Buat filter yang dapat dilanggani oleh koneksi ini.
  </Card>
</CardGroup>
