restate / v1.0.0

Megbízható tervezésből fakadóan

Mit garantál a restate, ha a tároló lassú, meghibásodik vagy hiányzik, és hogyan olvassa a jelzett hibákat.

Ezen az oldalonGaranciákMentések sorrendbenPróbálja kiHa a betöltés sikertelenMentés és bezárásA tároló nem érhető elMentett adatok ellenőrzése és migrálásaSaját tárolóKorlátok és időtúllépésekHibakódok

Garanciák

Ez a viselkedés az 1.0 szerződés része, és a csomag tesztjei lefedik.

HelyzetMit tesz a restate
Több mentés egymás utánStore-onként sorban futtatja őket; a sorban álló mentés a legújabb értéket írja ki.
Egy rekord nem töltődött beAz autoSave és a tömeges mentések LOAD_FAILED hibával kihagyják; csak egy kifejezett save() cseréli le.
A komponens mentés közben leválikA kért mentés befejeződik; a megsemmisített store-ba később érkező írásokat figyelmen kívül hagyja.
A tároló nem érhető elA store a memóriában fut, a status().available értéke false, a mentések pedig elutasulnak.
Egy adapter megakadA művelet az operationTimeoutMs után időtúllépéssel véget ér, a későbbi munka pedig megvárja, amíg az adapter befejezi.
Túl sok függő munkaAz új műveletek korlátlan növekedés helyett QUEUE_FULL hibával elutasulnak.

Mentések sorrendben

Egy store műveletei soha nem fedik egymást. Egy mentés, amely akkor indul, amikor egy másik vár, a legújabb értéket veszi át, így a minden változáskor történő mentés a sor feltöltése nélkül írja ki az utolsó állapotot.

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

Próbálja ki

Lassítsa le a tárolót, tegye sikertelenné az írásokat, vagy távolítsa el teljesen a tárolót.

A példa előkészítése…

Ha a betöltés sikertelen

A restateManager.ready BULK_OPERATION_FAILED hibával utasul el, és felsorol minden sikertelen store-t. Amíg az adott rekord be nem töltődik, az autoSave és a saveAll nem cseréli le, és LOAD_FAILED hibát jelez.

Próbálja újra az initialize() hívással, hogy megtartsa és elmentse a változásokat, hívja meg a restore() metódust az elvetésükhöz, vagy a save()-et a rekord szándékos felülírásához.

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

Mentés és bezárás

A leválasztás előtt kért mentés így is befejeződik, ezért a „Mentés és bezárás” kezelőnek nem kell várnia.

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

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

A tároló nem érhető el

A szerveroldali renderelés és a böngésző által letiltott tároló nem indítási hiba. Ellenőrizze az available mezőt, hogy jelezze a felhasználóknak: a változások csak a memóriában maradnak.

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

Mentett adatok ellenőrzése és migrálása

A version, a migrate és a validate megvédi a régi vagy sérült rekordoktól. A validate mentés előtt, valamint helyreállítás vagy migrálás után fut.

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

Saját tároló

Bármely objektum megfelel, amelynek van getItem, setItem és removeItem metódusa. A metódusok visszaadhatnak értéket vagy Promise-t; az isAvailable opcionális.

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

Korlátok és időtúllépések

Állítsa be, meddig tarthat egy művelet, hány várakozhat, és mekkora lehet egy érték.

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

Hibakódok

A restate által létrehozott hibák name mezője RestateError, van code mezőjük, mentett store-nál pedig key mezőjük is. A tárolóadapterek és az Ön callbackjei saját hibákkal is elutasíthatnak.

KódJelentés
BULK_OPERATION_FAILEDEgy tömeges hívás, például a restateManager.ready vagy a saveAll, hibákba ütközött; lásd: error.failures.
INDEXEDDB_ABORTEDEgy IndexedDB-tranzakció megszakadt.
INDEXEDDB_BLOCKEDAz adatbázis megnyitását egy másik fülön lévő kapcsolat blokkolta.
INDEXEDDB_CONNECTION_CLOSINGAz adatbázis-kapcsolat éppen bezárult, amikor a kérés elindult.
INDEXEDDB_OPEN_FAILEDAz adatbázist nem sikerült megnyitni.
INDEXEDDB_REQUEST_FAILEDEgy IndexedDB-kérés sikertelen volt.
INDEXEDDB_STORE_MISSINGA már létező adatbázisból hiányzik az object store.
INVALID_STORAGE_RECORDA mentett rekord nem érvényes restate-rekord.
INVALID_STORED_VALUEAz érték nem ment át a validate ellenőrzésen.
LIFECYCLE_LIMITEgy updater újra és újra elindult és leállt.
LOAD_FAILEDA rekordot nem sikerült betölteni, ezért az automatikus vagy tömeges mentés nem cserélte le.
MMKV_UNAVAILABLEA react-native-mmkv nem töltődött be.
MULTIPLE_ERRORSEgy műveletben több callback is hibázott; lásd: error.errors.
NOTIFICATION_LIMITA megfigyelők körkörösen újabb és újabb változásokat ütemeztek.
OBSERVER_ERROREgy listener vagy életciklus-callback hibát dobott.
OPERATION_ABORTEDEgy tárolóművelet megszakadt.
QUEUE_FULLTöbb művelet várakozott, mint amennyit a maxPendingOperations megenged.
REENTRANT_SETTEREgy állapot-updater futás közben ugyanazt a store-t próbálta módosítani.
SCOPE_DESTROYEDEgy megsemmisített scope-pal próbáltak store-okat létrehozni.
SEQUENCE_EXHAUSTEDEgy belső sorozatból elfogytak az azonosítók.
STORAGE_BLOCKEDEgy korábbi adapterhívás időtúllépés vagy megszakítás után sem fejeződött be.
STORAGE_TIMEOUTEgy művelet tovább tartott az operationTimeoutMs értéknél.
STORAGE_UNAVAILABLEItt nem használható tároló; a store tovább fut a memóriában.
STORAGE_VALUE_TOO_LARGEA kódolt érték meghaladja a maxStorageCharacters értéket.
STORAGE_VERSION_MISMATCHA rekord verziója eltér, és egyetlen migrate függvény sem kezeli.
STORE_DESTROYEDEgy megsemmisített store-ra iratkoztak fel, vagy tárolóhasználatot kértek tőle.

Keresés a dokumentációban

Keresés az összes útmutató címében, leírásában és szövegében.