restate / v1.0.0

Pouzdanost by design

Što restate jamči kad je spremište sporo, zakaže ili nedostaje i kako čitati pogreške koje javlja.

Na ovoj straniciJamstvaSpremanja redomIsprobajteKad učitavanje ne uspijeSpremi i zatvoriNema dostupnog spremištaValidacija i migracija spremljenih podatakaVlastito spremišteOgraničenja i vremenska ograničenjaKodovi pogrešaka

Jamstva

Ovo ponašanje dio je ugovora 1.0 i pokrivaju ga testovi paketa.

SituacijaŠto restate radi
Više spremanja zaredomIzvodi ih redom za svaki store; spremanje u redu zapisuje najnoviju vrijednost.
Zapis se nije učitaoautoSave i skupna spremanja preskaču ga uz LOAD_FAILED; zamjenjuje ga samo izričiti save().
Komponenta se demontira tijekom spremanjaZatraženo spremanje se dovršava; kasniji zapisi u uništeni store zanemaruju se.
Spremište nije dostupnoStore radi u memoriji, status().available je false, a spremanja se odbijaju.
Adapter zapneOperaciji istječe vrijeme nakon operationTimeoutMs, a kasniji posao čeka dok adapter ne završi.
Previše posla na čekanjuNove operacije odbijaju se s QUEUE_FULL umjesto da rastu bez ograničenja.

Spremanja redom

Operacije jednog storea nikad se ne preklapaju. Spremanje pokrenuto dok drugo čeka uzima najnoviju vrijednost, pa spremanje pri svakoj promjeni zapisuje posljednje stanje bez punjenja reda.

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

Isprobajte

Usporite spremište, neka zapisi ne uspiju ili potpuno uklonite spremište.

Priprema primjera…

Kad učitavanje ne uspije

restateManager.ready odbija se s BULK_OPERATION_FAILED i navodi svaki store koji nije uspio. Dok se taj zapis ne učita, autoSave i saveAll ga ne zamjenjuju i javljaju LOAD_FAILED.

Pokušajte ponovno s initialize() da biste zadržali izmjene i spremili ih, pozovite restore() da ih odbacite ili save() da namjerno prepišete zapis.

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

Spremi i zatvori

Spremanje zatraženo prije demontiranja ipak se dovršava, pa rukovatelj za „Spremi i zatvori” ne mora čekati.

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

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

Nema dostupnog spremišta

Renderiranje na poslužitelju i spremište koje preglednik blokira nisu pogreške pri pokretanju. Provjeravajte available da biste korisnicima rekli da izmjene ostaju samo u memoriji.

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

Validacija i migracija spremljenih podataka

version, migrate i validate štite vas od starih ili oštećenih zapisa. validate se pokreće prije spremanja i nakon vraćanja ili migracije.

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

Vlastito spremište

Poslužit će bilo koji objekt s getItem, setItem i removeItem. Metode mogu vraćati vrijednosti ili Promise; isAvailable nije obavezan.

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

Ograničenja i vremenska ograničenja

Podesite koliko dugo operacija smije trajati, koliko ih smije čekati i koliko velika smije biti vrijednost.

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

Kodovi pogrešaka

Pogreške koje stvara restate imaju name RestateError, code i, kod spremljenih storeova, key. Adapteri spremišta i vaši callbackovi mogu odbiti vlastitim pogreškama.

KodZnačenje
BULK_OPERATION_FAILEDSkupni poziv poput restateManager.ready ili saveAll imao je pogreške; vidi error.failures.
INDEXEDDB_ABORTEDTransakcija IndexedDB je prekinuta.
INDEXEDDB_BLOCKEDOtvaranje baze podataka blokirala je veza u drugoj kartici.
INDEXEDDB_CONNECTION_CLOSINGVeza s bazom podataka zatvarala se kad je zahtjev počeo.
INDEXEDDB_OPEN_FAILEDBaza podataka nije se mogla otvoriti.
INDEXEDDB_REQUEST_FAILEDZahtjev IndexedDB nije uspio.
INDEXEDDB_STORE_MISSINGU već stvorenoj bazi podataka nedostaje object store.
INVALID_STORAGE_RECORDSpremljeni zapis nije valjan restate zapis.
INVALID_STORED_VALUEVrijednost nije prošla validate.
LIFECYCLE_LIMITUpdater se stalno pokretao i zaustavljao.
LOAD_FAILEDZapis se nije mogao učitati, pa ga automatsko ni skupno spremanje nije zamijenilo.
MMKV_UNAVAILABLEreact-native-mmkv nije se mogao učitati.
MULTIPLE_ERRORSU jednoj operaciji nije uspjelo više callbackova; vidi error.errors.
NOTIFICATION_LIMITPromatrači su u petlji stalno zakazivali promjene.
OBSERVER_ERRORSlušatelj ili callback životnog ciklusa bacio je pogrešku.
OPERATION_ABORTEDOperacija sa spremištem je otkazana.
QUEUE_FULLČekalo je više operacija nego što dopušta maxPendingOperations.
REENTRANT_SETTERUpdater stanja pokušao je promijeniti isti store dok se izvodio.
SCOPE_DESTROYEDZa stvaranje storeova korišten je uništeni scope.
SEQUENCE_EXHAUSTEDUnutarnjem nizu ponestalo je identifikatora.
STORAGE_BLOCKEDPrethodni poziv adaptera nije završio nakon isteka vremena ili otkazivanja.
STORAGE_TIMEOUTOperacija je trajala dulje od operationTimeoutMs.
STORAGE_UNAVAILABLESpremište se ovdje ne može koristiti; store i dalje radi u memoriji.
STORAGE_VALUE_TOO_LARGEKodirana vrijednost premašuje maxStorageCharacters.
STORAGE_VERSION_MISMATCHZapis ima drugu verziju i nijedna funkcija migrate je ne obrađuje.
STORE_DESTROYEDDošlo je do pretplate na uništeni store ili je od njega zatraženo korištenje spremišta.

Pretraži dokumentaciju

Pretražujte naslove, opise i tekst svih vodiča.