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

# Pemutaran Ulang Historis LaserStream: Mengisi Kembali Data yang Hilang

> Pulihkan koneksi yang terputus dan isi kembali data blockchain Solana yang hilang dengan fitur pemutaran ulang historis LaserStream. Jangan pernah melewatkan transaksi lagi.

<Info>
  **Jangan pernah melewatkan apa pun**: Pemutaran Ulang Historis LaserStream memastikan Anda dapat memulihkan koneksi yang terputus dan mengisi kembali data yang hilang dari aktivitas blockchain selama 48 jam terakhir.
</Info>

## Apa Itu Pemutaran Ulang Historis?

Pemutaran Ulang Historis adalah fitur LaserStream yang memungkinkan Anda memutar ulang data blockchain terbaru dengan menetapkan titik awal `fromSlot`. Fitur ini berguna untuk menangani koneksi yang terputus dan memastikan kontinuitas data dalam aplikasi waktu nyata.

## Seberapa Jauh Anda Dapat Memutar Ulang

Anda dapat memutar ulang riwayat hingga \~48 jam (\~691.200 slot dengan waktu slot Solana saat ini sebesar \~250 md — jumlah slot yang tepat berubah seiring perubahan waktu slot jaringan), terlepas dari tingkat komitmen yang Anda gunakan untuk berlangganan. Berikan `fromSlot` dalam rentang waktu tersebut, lalu LaserStream akan melakukan streaming maju dari titik itu hingga saat ini.

**Pemutaran ulang yang lebih lama mengembalikan data yang telah difinalisasi.** LaserStream menyimpan kira-kira slot selama \~20 menit terakhir di memori; data yang lebih lama disajikan dari penyimpanan historis yang hanya menyimpan blok yang telah difinalisasi. Jadi, saat Anda memutar ulang `fromSlot` yang lebih lama dari \~20 menit, data tersebut mencerminkan rantai yang telah difinalisasi — Anda tidak akan melihat slot yang mengalami fork atau dibatalkan maupun pembaruan akun dalam slot pada rentang tersebut, bahkan dengan langganan `processed` atau `confirmed`. Slot dalam \~20 menit terakhir memiliki semantik komitmen yang sebenarnya, termasuk fork dan pembaruan akun dalam slot.

<Warning>
  **Rentang Waktu Terbatas**: Pemutaran ulang historis hanya mencakup \~48 jam terakhir. Anda tidak dapat memutar ulang data dari sembarang titik di masa lalu.
</Warning>

<CardGroup cols={2}>
  <Card title="Handle Disconnections" icon="clock-rotate-left">
    Pulihkan data yang hilang selama koneksi terputus singkat (hingga 48 jam)
  </Card>

  <Card title="Bootstrap Applications" icon="rocket">
    Mulai aplikasi dengan konteks terbaru dari 48 jam terakhir
  </Card>

  <Card title="Analyze Recent Events" icon="magnifying-glass">
    Tinjau transaksi dan perubahan akun terbaru
  </Card>

  <Card title="Test with Recent Data" icon="flask">
    Gunakan data terbaru yang sebenarnya untuk pengujian dan pengembangan
  </Card>
</CardGroup>

## Periksa Ketersediaan Pemutaran Ulang

Panggil [SubscribeReplayInfo](/docs/id/api-reference/laserstream/grpc/subscribereplayinfo) untuk memeriksa slot paling awal yang tersedia untuk pemutaran ulang.

Jika slot yang Anda simpan berada di luar rentang pemutaran ulang, aplikasi Anda dapat memulihkan riwayat yang hilang secara terpisah atau melanjutkan dari slot yang lebih baru. Mulai langganan baru dengan `fromSlot` pilihan Anda. Ketersediaan dapat berubah di antara permintaan.

## Cara Kerjanya

<Steps>
  <Step title="Specify Starting Point">
    Gunakan parameter `fromSlot` untuk menetapkan titik awal pemutaran ulang Anda (harus berada dalam \~48 jam terakhir, \~691.200 slot pada kecepatan jaringan saat ini)
  </Step>

  <Step title="Stream Historical Data">
    LaserStream mengirimkan semua peristiwa mulai dari slot yang Anda tentukan
  </Step>

  <Step title="Catch Up to Real-Time">
    Data historis terus dialirkan hingga Anda mencapai slot saat ini
  </Step>

  <Step title="Continue Live Streaming">
    Beralih dengan lancar ke streaming data waktu nyata
  </Step>
</Steps>

<Note>
  **Penyambungan Ulang Otomatis**: [LaserStream SDK](https://github.com/helius-labs/laserstream-sdk) menangani penyambungan ulang dan pemutaran ulang secara otomatis. Tidak memerlukan kode tambahan!
</Note>

Pemutaran ulang mematuhi flag filter transaksi `matchMints`, sehingga pemutaran ulang yang [difilter berdasarkan mint](/docs/id/laserstream/mint-filtering) mengembalikan kumpulan transaksi yang sama seperti yang akan dikirimkan oleh streaming langsung.

## Mulai Cepat

<Tip>
  Mulai gunakan LaserStream dari [Dasbor Helius](https://dashboard.helius.dev/laserstream) Anda. Mainnet memerlukan paket Business atau Professional; Devnet tersedia pada paket Developer dan yang lebih tinggi. Lihat [Paket & Harga](/docs/id/billing/plans) untuk detailnya.
</Tip>

<Tabs>
  <Tab title="gRPC">
    ```typescript theme={"system"}
    import { subscribe, CommitmentLevel, LaserstreamConfig, SubscribeRequest } from 'helius-laserstream';

    // Pick a slot within the last ~48 h (~691,200 slots at current ~250ms slot time). For a real start
    // value, call `getSlot` first and subtract however far back you want to replay.
    // Note: replays older than ~20 min return finalized data even at processed/confirmed;
    // slots within the last ~20 min carry true commitment semantics.
    const fromSlot = 419_800_000;

    const subscriptionRequest: SubscribeRequest = {
      transactions: {
        "token-filter": { // user-defined label for this filter
          accountInclude: ['TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA'],
          vote: false,
          failed: false
        }
      },
      commitment: CommitmentLevel.CONFIRMED,
      accounts: {},
      slots: {},
      blocks: {},
      blocksMeta: {},
      entry: {},
      accountsDataSlice: [],
      fromSlot, // u64 slot number; must fall inside the replay window
    };

    const config: LaserstreamConfig = {
      apiKey: 'YOUR_API_KEY',
      endpoint: 'https://laserstream-mainnet-ewr.helius-rpc.com', // Choose your closest region
    };

    await subscribe(config, subscriptionRequest, 
      async (data) => {
        console.log('Received data:', data);
      }, 
      async (error) => {
        console.error('Error:', error);
      }
    );
    ```
  </Tab>
</Tabs>

## Opsi Konfigurasi

<ParamField path="fromSlot" type="number" required>
  Nomor slot tempat pemutaran ulang dimulai, sebagai `u64`. Harus berada dalam rentang pemutaran ulang (sekitar 48 jam terakhir dari slot saat ini, \~691.200 slot pada kecepatan jaringan saat ini), pada tingkat komitmen apa pun.

  **Contoh**: `currentSlot - 1000`

  **Penting**: Jika Anda memberikan slot yang lebih lama dari rentang tersebut, LaserStream menolak permintaan dengan `Operation was attempted past the valid range`.
</ParamField>

## Kasus Penggunaan

<AccordionGroup>
  <Accordion title="Reconnection After Brief Disconnection">
    Saat aplikasi Anda tersambung kembali setelah koneksi terputus singkat (kurang dari 48 jam), Anda dapat menggunakan Pemutaran Ulang Historis untuk memastikan tidak ada data yang terlewat. `getCurrentSlot` memanggil Helius RPC; `lastProcessedSlot` disimpan di memori di bawah ini — pertahankan data tersebut dengan cara yang sesuai untuk aplikasi Anda (Redis, Postgres, file, dan sebagainya).

    ```typescript theme={"system"}
    async function getCurrentSlot(): Promise<number> {
      const r = await fetch(`https://mainnet.helius-rpc.com/?api-key=${process.env.HELIUS_API_KEY}`, {
        method: 'POST',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify({ jsonrpc: '2.0', id: 1, method: 'getSlot', params: [{ commitment: 'confirmed' }] }),
      });
      const { result } = await r.json();
      return result as number;
    }

    // Load the last slot you processed from wherever you store it.
    let lastProcessedSlot = Number(process.env.LAST_PROCESSED_SLOT ?? 0);

    // Check if it's still within the replay window
    // (~691,200 slots at current ~250ms slot time; recompute if network slot time changes)
    const currentSlot = await getCurrentSlot();
    const maxReplaySlot = currentSlot - 691_200;

    if (lastProcessedSlot < maxReplaySlot) {
      console.warn('Disconnection too long, some data may be lost');
      lastProcessedSlot = maxReplaySlot;
    }

    const subscriptionRequest: SubscribeRequest = {
      // ... your subscription config
      fromSlot: lastProcessedSlot, // pass as number, not string
    };

    await subscribe(config, subscriptionRequest,
      async (data) => {
        // your handler here
        if (data.transaction?.slot) {
          lastProcessedSlot = Number(data.transaction.slot);
          // persist `lastProcessedSlot` here so the next reconnect picks up
        }
      }
    );
    ```
  </Accordion>

  <Accordion title="Bootstrap with Recent Context">
    Mulai aplikasi Anda dengan konteks terbaru dari beberapa menit terakhir:

    ```typescript theme={"system"}
    // Get a slot from 10 minutes ago (within the 48-hour window)
    const currentSlot = await getCurrentSlot();
    const startSlot = currentSlot - 2400; // ~10 minutes ago at current ~250ms slot time

    const subscriptionRequest: SubscribeRequest = {
      // ... your subscription config
      fromSlot: startSlot, // u64 number
    };
    ```
  </Accordion>

  <Accordion title="Testing with Recent Data">
    Gunakan data historis terbaru untuk pengujian (terbatas pada 48 jam terakhir):

    ```typescript theme={"system"}
    // Test with data from the last 5 minutes
    const currentSlot = await getCurrentSlot();
    const testStartSlot = currentSlot - 1200; // ~5 minutes ago at current ~250ms slot time
    const testEndSlot = currentSlot - 240;    // ~1 minute ago at current ~250ms slot time

    const subscriptionRequest: SubscribeRequest = {
      // ... your subscription config
      fromSlot: testStartSlot, // u64 number
    };

    // Stop processing when reaching the test end slot
    const stream = await subscribe(config, subscriptionRequest,
      async (data) => {
        const slot = Number(data.transaction?.slot ?? data.account?.slot ?? 0);
        if (slot >= testEndSlot) {
          stream.cancel();
          return;
        }
        // your test handler here
      }
    );
    ```
  </Accordion>
</AccordionGroup>

## Langkah Berikutnya

<CardGroup cols={2}>
  <Card title="LaserStream gRPC" icon="bolt" href="/docs/id/laserstream/grpc">
    Pelajari lebih lanjut kemampuan dan fitur streaming gRPC
  </Card>

  <Card title="Get Started" icon="rocket" href="https://dashboard.helius.dev/laserstream">
    Aktifkan LaserStream dari Dasbor Helius Anda dan mulai streaming.
  </Card>

  <Card title="SDK Documentation" icon="github" href="https://github.com/helius-labs/laserstream-sdk">
    Lihat dokumentasi SDK lengkap
  </Card>

  <Card title="Contact Support" icon="headset" href="/docs/id/support">
    Dapatkan bantuan untuk implementasi Anda
  </Card>
</CardGroup>
