restate / v1.0.0

Zanesljivost by design

Kaj restate jamči, ko je shramba počasna, odpove ali manjka, in kako brati napake, ki jih javi.

Na tej straniJamstvaShranjevanja po vrstiPreizkusiteKo nalaganje ne uspeShrani in zapriShramba ni na voljoPreverjanje in migracija shranjenih podatkovLastna shrambaOmejitve in časovne omejitveKode napak

Jamstva

To vedenje je del pogodbe 1.0 in ga pokrivajo testi paketa.

OkoliščinaKaj naredi restate
Več shranjevanj zaporedIzvede jih po vrsti za vsak store; shranjevanje v vrsti zapiše najnovejšo vrednost.
Zapis se ni naložilautoSave in skupna shranjevanja ga preskočijo z LOAD_FAILED; zamenja ga le izrecni save().
Komponenta se med shranjevanjem odklopiZahtevano shranjevanje se zaključi; poznejši zapisi v uničen store se prezrejo.
Shramba ni na voljoStore deluje v pomnilniku, status().available je false, shranjevanja pa se zavrnejo.
Vmesnik obvisiOperaciji poteče čas po operationTimeoutMs, poznejše delo pa počaka, da vmesnik konča.
Preveč čakajočega delaNove operacije se zavrnejo s QUEUE_FULL, namesto da bi rasle brez meje.

Shranjevanja po vrsti

Operacije enega storea se nikoli ne prekrivajo. Shranjevanje, ki se začne, medtem ko drugo čaka, vzame najnovejšo vrednost, zato shranjevanje ob vsaki spremembi zapiše zadnje stanje brez polnjenja vrste.

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

Preizkusite

Upočasnite shrambo, naj zapisi ne uspejo ali shrambo povsem odstranite.

Pripravljanje primera …

Ko nalaganje ne uspe

restateManager.ready se zavrne z BULK_OPERATION_FAILED in našteje vsak store, ki ni uspel. Dokler se ta zapis ne naloži, ga autoSave in saveAll ne zamenjata in javita LOAD_FAILED.

Poskusite znova z initialize(), da ohranite spremembe in jih shranite, pokličite restore(), da jih zavržete, ali save(), da zapis namerno prepišete.

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

Shrani in zapri

Shranjevanje, zahtevano pred odklopom, se vseeno zaključi, zato obravnavi »Shrani in zapri« ni treba čakati.

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

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

Shramba ni na voljo

Upodabljanje na strežniku in shramba, ki jo blokira brskalnik, nista napaki ob zagonu. Preverite available, da uporabnikom poveste, da spremembe ostajajo le v pomnilniku.

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

Preverjanje in migracija shranjenih podatkov

version, migrate in validate vas varujejo pred starimi ali poškodovanimi zapisi. validate se izvede pred shranjevanjem ter po obnovi ali migraciji.

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

Lastna shramba

Primeren je kateri koli objekt z getItem, setItem in removeItem. Metode lahko vrnejo vrednosti ali Promise; isAvailable ni obvezen.

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

Omejitve in časovne omejitve

Nastavite, kako dolgo sme trajati operacija, koliko jih sme čakati in kako velika sme biti vrednost.

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

Kode napak

Napake, ki jih ustvari restate, imajo name RestateError, code in pri shranjenih storejih key. Vmesniki za shrambo in vaši callbacki lahko zavrnejo z lastnimi napakami.

KodaPomen
BULK_OPERATION_FAILEDSkupni klic, kot je restateManager.ready ali saveAll, je imel napake; glejte error.failures.
INDEXEDDB_ABORTEDTransakcija IndexedDB je bila prekinjena.
INDEXEDDB_BLOCKEDOdpiranje zbirke podatkov je blokirala povezava v drugem zavihku.
INDEXEDDB_CONNECTION_CLOSINGPovezava z zbirko podatkov se je zapirala, ko se je zahteva začela.
INDEXEDDB_OPEN_FAILEDZbirke podatkov ni bilo mogoče odpreti.
INDEXEDDB_REQUEST_FAILEDZahteva IndexedDB ni uspela.
INDEXEDDB_STORE_MISSINGV že ustvarjeni zbirki podatkov manjka object store.
INVALID_STORAGE_RECORDShranjen zapis ni veljaven zapis restate.
INVALID_STORED_VALUEVrednost ni prestala validate.
LIFECYCLE_LIMITUpdater se je vedno znova zaganjal in ustavljal.
LOAD_FAILEDZapisa ni bilo mogoče naložiti, zato ga samodejno ali skupno shranjevanje ni zamenjalo.
MMKV_UNAVAILABLEreact-native-mmkv ni bilo mogoče naložiti.
MULTIPLE_ERRORSV eni operaciji je odpovedalo več callbackov; glejte error.errors.
NOTIFICATION_LIMITOpazovalci so v zanki kar naprej načrtovali spremembe.
OBSERVER_ERRORPoslušalec ali callback življenjskega cikla je vrgel napako.
OPERATION_ABORTEDOperacija s shrambo je bila preklicana.
QUEUE_FULLČakalo je več operacij, kot jih dovoljuje maxPendingOperations.
REENTRANT_SETTERUpdater stanja je med izvajanjem poskusil spremeniti isti store.
SCOPE_DESTROYEDZa ustvarjanje storejev je bil uporabljen uničen scope.
SEQUENCE_EXHAUSTEDNotranjemu zaporedju je zmanjkalo identifikatorjev.
STORAGE_BLOCKEDPrejšnji klic vmesnika se po izteku časa ali preklicu ni zaključil.
STORAGE_TIMEOUTOperacija je trajala dlje od operationTimeoutMs.
STORAGE_UNAVAILABLEShrambe tukaj ni mogoče uporabiti; store še naprej deluje v pomnilniku.
STORAGE_VALUE_TOO_LARGEKodirana vrednost presega maxStorageCharacters.
STORAGE_VERSION_MISMATCHZapis ima drugo različico in nobena funkcija migrate je ne obravnava.
STORE_DESTROYEDPrišlo je do naročnine na uničen store ali pa je bil pozvan k uporabi shrambe.

Iskanje po dokumentaciji

Iščite po naslovih, opisih in besedilu vseh vodnikov.