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

# Xử lý kết nối lại và lỗi trong Parsed Streams

> Phát hiện khi Parsed Streams ngắt kết nối, kết nối lại với cơ chế backoff, đăng ký lại và bổ sung chính xác khoảng slot đã bỏ lỡ.

Cơ chế phân phối là **tối đa một lần** — không có tính năng phát lại. Mọi dữ liệu được xác nhận trong thời gian bạn mất kết nối sẽ không được gửi lại, vì vậy ứng dụng máy khách trong môi trường production cần phát hiện khoảng trống và quyết định có bổ sung dữ liệu hay không. Tín hiệu để xác định khoảng trống là `context.slot`: tín hiệu này giới hạn khoảng dữ liệu bạn đã bỏ lỡ khi mất kết nối. Hướng dẫn này giải thích lý do kết nối bị đóng, cách kết nối lại đúng cách và cách sử dụng tín hiệu đó.

## Lý do kết nối bị đóng

Mỗi lần đóng kết nối đều có mã đóng WebSocket cho biết điều gì đã xảy ra và bạn nên làm gì tiếp theo:

| Mã          | Lý do                                                                                        | Cách xử lý                                                                                                                                                  |
| ----------- | -------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 1000        | Không hoạt động: không có thông báo từ máy khách và không có thông báo sự kiện trong 10 phút | Kết nối lại và đăng ký lại. Các ping WebSocket ở cấp giao thức mà thư viện máy khách tự động gửi **không** đặt lại bộ đếm thời gian chờ do không hoạt động. |
| 1001        | Máy chủ khởi động lại (triển khai)                                                           | Kết nối lại và đăng ký lại                                                                                                                                  |
| 1008        | Máy khách xử lý chậm: bạn bị chậm hơn 2048 thông báo sự kiện                                 | Kết nối lại với bộ lọc hẹp hơn, `details: "matched"` hoặc `"raw"`, hoặc xử lý nhanh hơn                                                                     |
| 1005 / 1006 | Lớp biên mạng đã tái tạo kết nối                                                             | Kết nối lại và đăng ký lại; điều này thường xảy ra ở một tần suất nhất định với mọi kết nối duy trì lâu dài                                                 |

Máy chủ gửi ping mỗi 15 giây, vì vậy một kết nối ổn định nhưng ít hoạt động vẫn có lưu lượng. Nếu hoàn toàn không nhận được gì trong hơn một phút — không có thông báo sự kiện, không có ping — hãy coi kết nối đã ngắt và kết nối lại thay vì chờ socket thông báo.

## Bộ lọc ít hoạt động và thời gian chờ do không hoạt động

Nếu bộ lọc đủ hẹp để có thể không khớp với dữ liệu nào trong 10 phút, hãy dự kiến máy chủ sẽ đóng kết nối bằng mã 1000. Xử lý trường hợp này như mọi lần đóng kết nối khác: kết nối lại, đăng ký lại và bổ sung khoảng dữ liệu thiếu như mô tả bên dưới.

## Kết nối lại và phát hiện khoảng dữ liệu thiếu

<Steps>
  <Step title="Reconnect with Backoff">
    Khi kết nối bị đóng — dù dự kiến hay không — hãy kết nối lại bằng cơ chế backoff theo cấp số nhân. ID đăng ký không được giữ lại sau khi kết nối lại, vì vậy hãy gửi lại `parsedTransactionSubscribe` cho mọi bộ lọc đã mở.
  </Step>

  <Step title="Track context.slot Across Disconnects">
    Lưu lại `context.slot` cuối cùng nhận được trước khi mất kết nối. Khoảng giữa slot đó và slot đầu tiên nhận được sau khi kết nối lại chính xác là khoảng dữ liệu bạn đã bỏ lỡ — không nhiều hơn, không ít hơn.
  </Step>

  <Step title="Backfill if You Need To">
    Nếu ứng dụng không thể chấp nhận khoảng dữ liệu thiếu, hãy bổ sung khoảng slot đó từ RPC: dùng `getSignaturesForAddress` để liệt kê các giao dịch trong phạm vi, sau đó dùng `getTransaction` để truy xuất từng giao dịch. Đây là bước đối soát thủ công — bản thân Parsed Streams không phát lại dữ liệu.
  </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` là dữ liệu được duy trì qua lần kết nối lại: hãy theo dõi slot cao nhất đã được xử lý hoàn toàn trước khi mất kết nối và coi mọi dữ liệu sau slot đó là khoảng cần bổ sung.

## Xử lý lỗi JSON-RPC

Các yêu cầu thất bại sẽ trả về lỗi JSON-RPC thay vì kết quả, vì vậy bạn có thể phân nhánh theo `error.code`:

| Mã       | Ý nghĩa                                                                                                    |
| -------- | ---------------------------------------------------------------------------------------------------------- |
| `-32700` | Lỗi phân tích cú pháp (JSON không hợp lệ)                                                                  |
| `-32600` | Yêu cầu không hợp lệ                                                                                       |
| `-32601` | Không tìm thấy phương thức                                                                                 |
| `-32602` | Tham số không hợp lệ: pubkey sai, trường không xác định, giá trị commitment hoặc details không được hỗ trợ |
| `-32000` | Vượt quá giới hạn bộ lọc                                                                                   |
| `-32001` | Máy chủ chưa sẵn sàng; thử lại với cơ chế backoff                                                          |
| `-32002` | Bị giới hạn tốc độ (10 thông báo mỗi giây)                                                                 |
| `-32006` | Quá nhiều đăng ký (25 đăng ký trên mỗi kết nối)                                                            |

`-32602` và `-32000` cho biết bản thân yêu cầu bị sai — hãy sửa bộ lọc, không thử lại nguyên trạng. `-32001` và `-32002` là lỗi tạm thời; hãy thử lại bằng cùng cơ chế backoff dùng để kết nối lại.

## Các bước tiếp theo

<CardGroup cols={2}>
  <Card title="Quickstart" icon="bolt" href="/docs/vi/parsed-streams/quickstart">
    Tài liệu tham khảo đầy đủ về giao thức: phương thức, trường bộ lọc và giới hạn.
  </Card>

  <Card title="Track Jupiter Swaps" icon="arrow-right-arrow-left" href="/docs/vi/parsed-streams/guides/track-jupiter-swaps">
    Tạo bộ lọc mà kết nối này có thể đăng ký.
  </Card>
</CardGroup>
