restate / v1.0.0

Spoľahlivosť by design

Čo restate zaručuje, keď je úložisko pomalé, zlyháva alebo chýba, a ako čítať chyby, ktoré hlási.

Na tejto stránkeZárukyUloženia v poradíVyskúšajteKeď načítanie zlyháUložiť a zavrieťŽiadne úložisko k dispozíciiValidácia a migrácia uložených údajovVlastné úložiskoLimity a časové limityKódy chýb

Záruky

Toto správanie je súčasťou kontraktu 1.0 a pokrývajú ho testy balíka.

SituáciaČo restate urobí
Niekoľko uložení za sebouVykoná ich v poradí pre každý store; uloženie vo fronte zapíše najnovšiu hodnotu.
Záznam sa nenačítalautoSave a hromadné uloženia ho preskočia s LOAD_FAILED; nahradí ho len explicitné save().
Komponent sa počas uloženia odpojíVyžiadané uloženie sa dokončí; neskoršie zápisy do zničeného store sa ignorujú.
Úložisko nie je dostupnéStore funguje v pamäti, status().available je false a uloženia sa odmietajú.
Adaptér sa zasekneOperácii vyprší čas po operationTimeoutMs a ďalšia práca počká, kým adaptér skončí.
Priveľa čakajúcej práceNové operácie sa odmietnu s QUEUE_FULL namiesto toho, aby fronta rástla bez obmedzenia.

Uloženia v poradí

Operácie jedného store sa nikdy neprekrývajú. Uloženie spustené, kým iné čaká, vezme najnovšiu hodnotu, takže ukladanie pri každej zmene zapíše posledný stav bez zahltenia fronty.

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

Vyskúšajte

Spomaľte úložisko, nechajte zápisy zlyhávať alebo úložisko úplne odoberte.

Príprava príkladu…

Keď načítanie zlyhá

restateManager.ready sa odmietne s BULK_OPERATION_FAILED a vypíše každý store, ktorý zlyhal. Kým sa ten záznam nenačíta, autoSave a saveAll ho nenahradia a nahlásia LOAD_FAILED.

Skúste to znova cez initialize(), ak chcete úpravy zachovať a uložiť, zavolajte restore(), ak ich chcete zahodiť, alebo save(), ak chcete záznam zámerne prepísať.

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

Uložiť a zavrieť

Uloženie vyžiadané pred odpojením sa aj tak dokončí, takže obsluha „Uložiť a zavrieť“ nemusí čakať.

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

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

Žiadne úložisko k dispozícii

Renderovanie na serveri a úložisko zablokované prehliadačom nie sú chyby pri spustení. Kontrolujte available, aby ste používateľom povedali, že úpravy zostávajú len v pamäti.

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

Validácia a migrácia uložených údajov

version, migrate a validate vás chránia pred starými alebo poškodenými záznamami. validate sa spúšťa pred uložením a po obnovení či migrácii.

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

Vlastné úložisko

Poslúži akýkoľvek objekt s getItem, setItem a removeItem. Metódy môžu vracať hodnoty alebo Promise; isAvailable je voliteľné.

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

Limity a časové limity

Nastavte, ako dlho smie operácia trvať, koľko ich smie čakať a aká veľká smie byť hodnota.

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

Kódy chýb

Chyby vytvorené restate majú name RestateError, code a pri ukladaných store aj key. Adaptéry úložiska a vaše callbacky môžu odmietať vlastnými chybami.

KódVýznam
BULK_OPERATION_FAILEDHromadné volanie ako restateManager.ready alebo saveAll malo chyby; pozri error.failures.
INDEXEDDB_ABORTEDTransakcia IndexedDB bola prerušená.
INDEXEDDB_BLOCKEDOtvorenie databázy zablokovalo pripojenie na inej karte.
INDEXEDDB_CONNECTION_CLOSINGPripojenie k databáze sa zatváralo, keď požiadavka začala.
INDEXEDDB_OPEN_FAILEDDatabázu sa nepodarilo otvoriť.
INDEXEDDB_REQUEST_FAILEDPožiadavka IndexedDB zlyhala.
INDEXEDDB_STORE_MISSINGV už vytvorenej databáze chýba object store.
INVALID_STORAGE_RECORDUložený záznam nie je platný záznam restate.
INVALID_STORED_VALUEHodnota neprešla validate.
LIFECYCLE_LIMITUpdater sa opakovane spúšťal a zastavoval.
LOAD_FAILEDZáznam sa nepodarilo načítať, takže ho automatické ani hromadné uloženie nenahradilo.
MMKV_UNAVAILABLEreact-native-mmkv sa nepodarilo načítať.
MULTIPLE_ERRORSV jednej operácii zlyhalo viac callbackov; pozri error.errors.
NOTIFICATION_LIMITPozorovatelia v cykle stále plánovali zmeny.
OBSERVER_ERRORPoslucháč alebo callback životného cyklu vyhodil chybu.
OPERATION_ABORTEDOperácia s úložiskom bola zrušená.
QUEUE_FULLČakalo viac operácií, než dovoľuje maxPendingOperations.
REENTRANT_SETTERUpdater stavu sa počas svojho behu pokúsil zmeniť ten istý store.
SCOPE_DESTROYEDNa vytvorenie store bol použitý zničený scope.
SEQUENCE_EXHAUSTEDVnútornej sekvencii došli identifikátory.
STORAGE_BLOCKEDPredchádzajúce volanie adaptéra sa po vypršaní času alebo zrušení nedokončilo.
STORAGE_TIMEOUTOperácia trvala dlhšie ako operationTimeoutMs.
STORAGE_UNAVAILABLEÚložisko tu nemožno použiť; store ďalej funguje v pamäti.
STORAGE_VALUE_TOO_LARGEZakódovaná hodnota prekračuje maxStorageCharacters.
STORAGE_VERSION_MISMATCHZáznam má inú verziu a žiadna funkcia migrate ju neobsluhuje.
STORE_DESTROYEDDošlo k odberu zničeného store alebo bol požiadaný o použitie úložiska.

Hľadať v dokumentácii

Hľadajte v nadpisoch, popisoch a texte všetkých sprievodcov.