restate / v1.0.0

Tasarımdan güvenilir

Depolama yavaş olduğunda, başarısız olduğunda ya da hiç olmadığında restate neyi garanti eder ve bildirdiği hatalar nasıl okunur.

Bu sayfadaGarantilerSıralı kaydetmelerDeneyinYükleme başarısız olduğundaKaydet ve kapatDepolama kullanılamıyorKayıtlı verileri doğrulamak ve taşımakKendi depolamanızSınırlar ve zaman aşımlarıHata kodları

Garantiler

Bu davranış 1.0 sözleşmesinin parçasıdır ve paketin testleriyle kapsanır.

Durumrestate ne yapar
Art arda birkaç kaydetmeBunları her store için sırayla çalıştırır; kuyruktaki kaydetme en son değeri yazar.
Bir kayıt yüklenemediautoSave ve toplu kaydetmeler LOAD_FAILED ile onu atlar; yalnızca açık bir save() onu değiştirir.
Kaydetme sırasında bileşen ayrılırİstenen kaydetme tamamlanır; yok edilmiş store'a sonraki yazmalar yok sayılır.
Depolama kullanılamıyorStore bellekte çalışır, status().available false olur ve kaydetmeler reddedilir.
Adaptör takılırİşlem operationTimeoutMs sonunda zaman aşımına uğrar ve sonraki işler adaptörün bitmesini bekler.
Çok fazla bekleyen işYeni işlemler sınırsızca büyümek yerine QUEUE_FULL ile reddedilir.

Sıralı kaydetmeler

Bir store'un işlemleri asla çakışmaz. Başkası beklerken başlayan bir kaydetme en son değeri alır; böylece her değişiklikte kaydetmek kuyruğu doldurmadan son durumu yazar.

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

Deneyin

Depolamayı yavaşlatın, yazmaları başarısız kılın ya da depolamayı tamamen kaldırın.

Örnek hazırlanıyor…

Yükleme başarısız olduğunda

restateManager.ready BULK_OPERATION_FAILED ile reddedilir ve başarısız olan her store'u listeler. O kayıt yüklenene kadar autoSave ve saveAll onu değiştirmez ve LOAD_FAILED bildirir.

Değişiklikleri tutup kaydetmek için initialize() ile yeniden deneyin, atmak için restore() çağırın ya da kaydı bilerek değiştirmek için save() kullanın.

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);
  }
}

Kaydet ve kapat

Ayrılmadan önce istenen kaydetme yine de tamamlanır; bu yüzden "Kaydet ve kapat" işleyicisinin beklemesi gerekmez.

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

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

Depolama kullanılamıyor

Sunucu tarafı render ve tarayıcının engellediği depolama başlangıç hatası değildir. Kullanıcılara değişikliklerin yalnızca bellekte kaldığını söylemek için available'ı kontrol edin.

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.');
}

Kayıtlı verileri doğrulamak ve taşımak

version, migrate ve validate sizi eski ya da bozuk kayıtlardan korur. validate kaydetmeden önce ve geri yükleme ya da taşıma sonrasında çalışır.

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),
  },
);

Kendi depolamanız

getItem, setItem ve removeItem içeren her nesne kullanılabilir. Metotlar değer ya da Promise döndürebilir; isAvailable isteğe bağlıdır.

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,
  },
);

Sınırlar ve zaman aşımları

Bir işlemin ne kadar sürebileceğini, kaç tanesinin bekleyebileceğini ve bir değerin ne kadar büyük olabileceğini ayarlayın.

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

Hata kodları

restate'in oluşturduğu hataların name'i RestateError'dır; code'ları ve kayıtlı store'larda key'leri vardır. Depolama adaptörleri ve callback'leriniz kendi hatalarıyla reddedebilir.

KodAnlamı
BULK_OPERATION_FAILEDrestateManager.ready ya da saveAll gibi toplu bir çağrıda hata oluştu; error.failures'a bakın.
INDEXEDDB_ABORTEDBir IndexedDB işlemi iptal edildi.
INDEXEDDB_BLOCKEDVeritabanının açılması başka bir sekmedeki bağlantı tarafından engellendi.
INDEXEDDB_CONNECTION_CLOSINGİstek başladığında veritabanı bağlantısı kapanıyordu.
INDEXEDDB_OPEN_FAILEDVeritabanı açılamadı.
INDEXEDDB_REQUEST_FAILEDBir IndexedDB isteği başarısız oldu.
INDEXEDDB_STORE_MISSINGÖnceden var olan veritabanında object store eksik.
INVALID_STORAGE_RECORDKayıtlı kayıt geçerli bir restate kaydı değil.
INVALID_STORED_VALUEDeğer validate'ten geçemedi.
LIFECYCLE_LIMITBir updater sürekli başlayıp durdu.
LOAD_FAILEDKayıt yüklenemedi; bu yüzden otomatik ya da toplu kaydetme onu değiştirmedi.
MMKV_UNAVAILABLEreact-native-mmkv yüklenemedi.
MULTIPLE_ERRORSTek bir işlemde birkaç callback başarısız oldu; error.errors'a bakın.
NOTIFICATION_LIMITGözlemciler bir döngü içinde sürekli değişiklik planladı.
OBSERVER_ERRORBir listener ya da yaşam döngüsü callback'i hata fırlattı.
OPERATION_ABORTEDBir depolama işlemi iptal edildi.
QUEUE_FULLmaxPendingOperations'ın izin verdiğinden fazla işlem bekliyordu.
REENTRANT_SETTERBir durum updater'ı çalışırken aynı store'u değiştirmeye çalıştı.
SCOPE_DESTROYEDStore oluşturmak için yok edilmiş bir scope kullanıldı.
SEQUENCE_EXHAUSTEDDahili bir dizinin tanımlayıcıları tükendi.
STORAGE_BLOCKEDÖnceki bir adaptör çağrısı zaman aşımı ya da iptalden sonra tamamlanmadı.
STORAGE_TIMEOUTBir işlem operationTimeoutMs'den uzun sürdü.
STORAGE_UNAVAILABLEBurada depolama kullanılamıyor; store bellekte çalışmayı sürdürür.
STORAGE_VALUE_TOO_LARGEKodlanmış değer maxStorageCharacters'ı aşıyor.
STORAGE_VERSION_MISMATCHKaydın sürümü farklı ve onu hiçbir migrate fonksiyonu işlemiyor.
STORE_DESTROYEDYok edilmiş bir store'a abone olundu ya da ondan depolama kullanması istendi.

Belgelerde ara

Tüm kılavuzların başlık, açıklama ve içeriğinde arayın.