restate / v1.0.0

Patikimas iš esmės

Ką restate garantuoja, kai saugykla lėta, sugenda ar jos nėra, ir kaip skaityti jo pranešamas klaidas.

Šiame puslapyjeGarantijosIšsaugojimai eilės tvarkaIšbandykiteKai įkėlimas nepavykstaIšsaugoti ir uždarytiSaugykla nepasiekiamaIšsaugotų duomenų patikra ir perkėlimasSava saugyklaRibos ir laiko limitaiKlaidų kodai

Garantijos

Šis elgesys yra 1.0 sutarties dalis ir yra padengtas paketo testais.

SituacijaKą daro restate
Keli išsaugojimai iš eilėsVykdo juos eilės tvarka kiekvienam store; eilėje laukiantis išsaugojimas įrašo naujausią reikšmę.
Įrašas neįsikėlėautoSave ir masiniai išsaugojimai jį praleidžia su LOAD_FAILED; jį pakeičia tik aiškus save().
Komponentas atjungiamas saugantPaprašytas išsaugojimas baigiamas; vėlesni įrašymai į sunaikintą store ignoruojami.
Saugykla nepasiekiamastore veikia atmintyje, status().available yra false, o išsaugojimai atmetami.
Adapteris užstringaOperacijai baigiasi laikas po operationTimeoutMs, o vėlesnis darbas laukia, kol adapteris baigs.
Per daug laukiančio darboNaujos operacijos atmetamos su QUEUE_FULL, užuot be ribų augusios.

Išsaugojimai eilės tvarka

Vieno store operacijos niekada nepersidengia. Išsaugojimas, prasidėjęs kol laukia kitas, paima naujausią reikšmę, todėl saugant po kiekvieno pakeitimo įrašoma paskutinė būsena neužpildant eilės.

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

Išbandykite

Sulėtinkite saugyklą, padarykite, kad įrašymai nepavyktų, arba visai pašalinkite saugyklą.

Ruošiamas pavyzdys…

Kai įkėlimas nepavyksta

restateManager.ready atmetamas su BULK_OPERATION_FAILED ir išvardija kiekvieną nepavykusį store. Kol tas įrašas neįsikels, autoSave ir saveAll jo nepakeis ir praneš LOAD_FAILED.

Bandykite dar kartą su initialize(), kad išlaikytumėte pakeitimus ir juos išsaugotumėte, iškvieskite restore(), kad juos atmestumėte, arba save(), kad sąmoningai perrašytumėte įrašą.

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

Išsaugoti ir uždaryti

Prieš atjungimą paprašytas išsaugojimas vis tiek baigiamas, todėl „Išsaugoti ir uždaryti“ apdorojimo funkcijai nereikia laukti.

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

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

Saugykla nepasiekiama

Serverio atvaizdavimas ir naršyklės užblokuota saugykla nėra paleidimo klaidos. Patikrinkite available, kad praneštumėte naudotojams, jog pakeitimai lieka tik atmintyje.

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

Išsaugotų duomenų patikra ir perkėlimas

version, migrate ir validate apsaugo jus nuo senų ar sugadintų įrašų. validate vykdoma prieš išsaugojimą ir po atkūrimo ar perkėlimo.

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

Sava saugykla

Tinka bet kuris objektas su getItem, setItem ir removeItem. Metodai gali grąžinti reikšmes arba Promise; isAvailable neprivalomas.

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

Ribos ir laiko limitai

Nustatykite, kiek gali trukti operacija, kiek jų gali laukti ir kokia didelė gali būti reikšmė.

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

Klaidų kodai

restate sukurtų klaidų name yra RestateError, jos turi code, o išsaugotų store atveju ir key. Saugyklos adapteriai ir jūsų callback gali atmesti savo klaidomis.

KodasReikšmė
BULK_OPERATION_FAILEDMasiniame kvietime, pvz., restateManager.ready ar saveAll, buvo nesėkmių; žr. error.failures.
INDEXEDDB_ABORTEDIndexedDB transakcija nutraukta.
INDEXEDDB_BLOCKEDDuomenų bazės atidarymą užblokavo ryšys kitame skirtuke.
INDEXEDDB_CONNECTION_CLOSINGUžklausai prasidedant duomenų bazės ryšys buvo uždaromas.
INDEXEDDB_OPEN_FAILEDDuomenų bazės atidaryti nepavyko.
INDEXEDDB_REQUEST_FAILEDIndexedDB užklausa nepavyko.
INDEXEDDB_STORE_MISSINGJau sukurtoje duomenų bazėje trūksta object store.
INVALID_STORAGE_RECORDIšsaugotas įrašas nėra galiojantis restate įrašas.
INVALID_STORED_VALUEReikšmė neperėjo validate.
LIFECYCLE_LIMITupdater vis paleidžiamas ir stabdomas.
LOAD_FAILEDĮrašo įkelti nepavyko, todėl automatinis ar masinis išsaugojimas jo nepakeitė.
MMKV_UNAVAILABLEreact-native-mmkv įkelti nepavyko.
MULTIPLE_ERRORSVienoje operacijoje nepavyko keli callback; žr. error.errors.
NOTIFICATION_LIMITStebėtojai cikle vis planavo pakeitimus.
OBSERVER_ERRORlistener ar gyvavimo ciklo callback išmetė klaidą.
OPERATION_ABORTEDSaugyklos operacija atšaukta.
QUEUE_FULLLaukė daugiau operacijų, nei leidžia maxPendingOperations.
REENTRANT_SETTERBūsenos updater vykdymo metu bandė pakeisti tą patį store.
SCOPE_DESTROYEDstore kurti buvo panaudotas sunaikintas scope.
SEQUENCE_EXHAUSTEDVidinei sekai baigėsi identifikatoriai.
STORAGE_BLOCKEDAnkstesnis adapterio kvietimas nesibaigė po laiko limito ar atšaukimo.
STORAGE_TIMEOUTOperacija truko ilgiau nei operationTimeoutMs.
STORAGE_UNAVAILABLEČia saugyklos naudoti negalima; store toliau veikia atmintyje.
STORAGE_VALUE_TOO_LARGEUžkoduota reikšmė viršija maxStorageCharacters.
STORAGE_VERSION_MISMATCHĮrašo versija kita, ir jos neapdoroja jokia migrate funkcija.
STORE_DESTROYEDSunaikintas store buvo prenumeruotas arba paprašytas naudoti saugyklą.

Ieškoti dokumentacijoje

Ieškokite visų vadovų pavadinimuose, aprašymuose ir tekste.