restate / v1.0.0

Andal sejak rancangan

Apa yang dijamin restate saat penyimpanan lambat, gagal, atau tidak ada, dan cara membaca kesalahan yang dilaporkannya.

Di halaman iniJaminanPenyimpanan berurutanCobaSaat pemuatan gagalSimpan dan tutupPenyimpanan tidak tersediaMemvalidasi dan memigrasi data tersimpanPenyimpanan sendiriBatas dan batas waktuKode kesalahan

Jaminan

Perilaku ini adalah bagian dari kontrak 1.0 dan dicakup oleh test paket.

SituasiYang dilakukan restate
Beberapa penyimpanan berturut-turutMenjalankannya berurutan per store; penyimpanan dalam antrean menulis nilai terbaru.
Catatan gagal dimuatautoSave dan penyimpanan massal melewatinya dengan LOAD_FAILED; hanya save() eksplisit yang menggantinya.
Komponen unmount saat menyimpanPenyimpanan yang diminta selesai; penulisan berikutnya ke store yang sudah dihancurkan diabaikan.
Penyimpanan tidak tersediaStore berjalan di memori, status().available bernilai false, dan penyimpanan ditolak.
Adaptor macetOperasi habis waktu setelah operationTimeoutMs, dan pekerjaan berikutnya menunggu adaptor selesai.
Terlalu banyak pekerjaan tertundaOperasi baru ditolak dengan QUEUE_FULL alih-alih tumbuh tanpa batas.

Penyimpanan berurutan

Operasi satu store tidak pernah tumpang-tindih. Penyimpanan yang dimulai saat yang lain menunggu mengambil nilai terbaru, sehingga menyimpan pada setiap perubahan menulis state terakhir tanpa memenuhi antrean.

JavaScript / JSX
useDraft.set('A');
const first = useDraft.save(); // writes "A"
useDraft.set('B');
const second = useDraft.save(); // waits in the queue
useDraft.set('C');
const third = useDraft.save(); // joins the waiting save

await Promise.all([first, second, third]); // ['A', 'C', 'C'] — two writes

Coba

Perlambat penyimpanan, buat penulisan gagal, atau hilangkan penyimpanan sama sekali.

Menyiapkan contoh…

Saat pemuatan gagal

restateManager.ready ditolak dengan BULK_OPERATION_FAILED dan mencantumkan setiap store yang gagal. Sampai catatan itu dimuat, autoSave dan saveAll tidak menggantinya dan melaporkan LOAD_FAILED.

Coba lagi dengan initialize() untuk mempertahankan perubahan lalu menyimpannya, panggil restore() untuk membuangnya, atau save() untuk sengaja menimpa catatan.

JavaScript / JSX
try {
  await restateManager.ready;
} catch (error) {
  // BULK_OPERATION_FAILED: one entry per store that could not load.
  for (const { store, error: cause } of error.failures) {
    console.error(store.key, cause.code);
  }
}

Simpan dan tutup

Penyimpanan yang diminta sebelum unmount tetap selesai, jadi handler "Simpan dan tutup" tidak perlu menunggu.

JavaScript / JSX
function Document({ onClose }) {
  const useDraft = useRestateScope((scope) => persistedRestate('', { scope, key: 'draft' }));

  const saveAndClose = () => {
    useDraft.save(); // finishes even after this component unmounts
    onClose();
  };
  // …
}

Penyimpanan tidak tersedia

Server rendering dan penyimpanan yang diblokir browser bukan kesalahan saat mulai. Periksa available untuk memberi tahu pengguna bahwa perubahan hanya ada di memori.

JavaScript / JSX
const { available } = useDraft.status();

if (!available) {
  // Server rendering or blocked browser storage: the store works in memory
  // and save() rejects with STORAGE_UNAVAILABLE.
  showNotice('Changes are kept until you close this tab.');
}

Memvalidasi dan memigrasi data tersimpan

version, migrate, dan validate melindungi Anda dari catatan lama atau rusak. validate berjalan sebelum menyimpan dan setelah pemulihan atau migrasi.

JavaScript / JSX
import { persistedRestate } from '@kkwaenggwari/restate';

const useSettings = persistedRestate(
  { theme: 'system' },
  {
    key: 'settings',
    version: 2,
    migrate(value, from, to) {
      if (from === 1 && to === 2 && typeof value?.darkMode === 'boolean') {
        return { theme: value.darkMode ? 'dark' : 'light' };
      }
      throw new Error('Unsupported stored version');
    },
    validate: (value) => ['system', 'light', 'dark'].includes(value?.theme),
  },
);

Penyimpanan sendiri

Objek apa pun dengan getItem, setItem, dan removeItem bisa dipakai. Metodenya boleh mengembalikan nilai atau Promise; isAvailable opsional.

JavaScript / JSX
import { persistedRestate } from '@kkwaenggwari/restate';

const sessionStorageAdapter = {
  isAvailable: () => typeof sessionStorage !== 'undefined',
  getItem: (key) => sessionStorage.getItem(key),
  setItem: (key, value) => sessionStorage.setItem(key, value),
  removeItem: (key) => sessionStorage.removeItem(key),
};

export const useFilters = persistedRestate(
  { query: '' },
  {
    key: 'filters',
    storage: sessionStorageAdapter,
  },
);

Batas dan batas waktu

Atur berapa lama sebuah operasi boleh berjalan, berapa banyak yang boleh menunggu, dan seberapa besar sebuah nilai.

JavaScript / JSX
persistedRestate(value, {
  key: 'draft',
  operationTimeoutMs: 10_000, // default 30000
  maxPendingOperations: 64, // default 256
  maxStorageCharacters: 1_000_000,
});

Kode kesalahan

Kesalahan yang dibuat restate punya name RestateError, code, dan untuk store tersimpan key. Adaptor penyimpanan dan callback Anda dapat menolak dengan kesalahannya sendiri.

KodeArti
BULK_OPERATION_FAILEDPanggilan massal seperti restateManager.ready atau saveAll mengalami kegagalan; lihat error.failures.
INDEXEDDB_ABORTEDTransaksi IndexedDB dibatalkan.
INDEXEDDB_BLOCKEDPembukaan database diblokir oleh koneksi di tab lain.
INDEXEDDB_CONNECTION_CLOSINGKoneksi database sedang ditutup saat permintaan dimulai.
INDEXEDDB_OPEN_FAILEDDatabase tidak dapat dibuka.
INDEXEDDB_REQUEST_FAILEDPermintaan IndexedDB gagal.
INDEXEDDB_STORE_MISSINGDatabase yang sudah ada tidak memiliki object store.
INVALID_STORAGE_RECORDCatatan tersimpan bukan catatan restate yang valid.
INVALID_STORED_VALUENilai tidak lolos validate.
LIFECYCLE_LIMITUpdater terus dimulai dan dihentikan.
LOAD_FAILEDCatatan tidak dapat dimuat, jadi penyimpanan otomatis atau massal tidak menggantinya.
MMKV_UNAVAILABLEreact-native-mmkv tidak dapat dimuat.
MULTIPLE_ERRORSBeberapa callback gagal dalam satu operasi; lihat error.errors.
NOTIFICATION_LIMITObserver terus menjadwalkan perubahan dalam putaran.
OBSERVER_ERRORListener atau callback siklus hidup melempar kesalahan.
OPERATION_ABORTEDOperasi penyimpanan dibatalkan.
QUEUE_FULLOperasi yang menunggu lebih banyak dari yang diizinkan maxPendingOperations.
REENTRANT_SETTERUpdater state mencoba mengubah store yang sama saat sedang berjalan.
SCOPE_DESTROYEDScope yang sudah dihancurkan dipakai untuk membuat store.
SEQUENCE_EXHAUSTEDUrutan internal kehabisan pengenal.
STORAGE_BLOCKEDPanggilan adaptor sebelumnya belum selesai setelah habis waktu atau dibatalkan.
STORAGE_TIMEOUTOperasi berlangsung lebih lama dari operationTimeoutMs.
STORAGE_UNAVAILABLEPenyimpanan tidak dapat dipakai di sini; store tetap berjalan di memori.
STORAGE_VALUE_TOO_LARGENilai yang dienkode melebihi maxStorageCharacters.
STORAGE_VERSION_MISMATCHCatatan punya versi berbeda dan tidak ada fungsi migrate yang menanganinya.
STORE_DESTROYEDStore yang sudah dihancurkan dilanggani atau diminta memakai penyimpanan.

Cari dokumentasi

Cari di judul, deskripsi, dan isi semua panduan.