restate / v1.0.0

Pålitelighet by design

Hva restate garanterer når lagringen er treg, svikter eller mangler, og hvordan du leser feilene den melder.

På denne sidenGarantieneOrdnede lagringerPrøv detNår innlastingen feilerLagre og lukkIngen lagring tilgjengeligValider og migrer lagrede dataBruk din egen lagringGrenser og tidsavbruddFeilkoder

Garantiene

Denne oppførselen er en del av 1.0-kontrakten og dekkes av pakkens tester.

SituasjonHva restate gjør
Flere lagringer på radKjører dem i rekkefølge per store; en lagring i kø skriver den nyeste verdien.
En post ble ikke lastet innautoSave og masselagring hopper over den med LOAD_FAILED; bare et eksplisitt save() erstatter den.
Komponenten avmonteres under en lagringDen forespurte lagringen fullføres; senere skrivinger til den ødelagte storen ignoreres.
Lagringen er utilgjengeligStoren kjører i minnet, status().available er false, og lagringer avvises.
En adapter hengerOperasjonen får tidsavbrudd etter operationTimeoutMs, og senere arbeid venter til adapteren er ferdig.
For mye ventende arbeidNye operasjoner avvises med QUEUE_FULL i stedet for å vokse uten grense.

Ordnede lagringer

Operasjonene til én store overlapper aldri. En lagring som starter mens en annen venter, tar den nyeste verdien, så lagring ved hver endring skriver siste tilstand uten å fylle køen.

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øv det

Gjør lagringen tregere, la skrivinger feile eller fjern lagringen helt.

Forbereder eksempelet …

Når innlastingen feiler

restateManager.ready avvises med BULK_OPERATION_FAILED og lister opp hver store som feilet. Til den posten lastes inn, erstatter ikke autoSave og saveAll den, og de melder LOAD_FAILED.

Prøv igjen med initialize() for å beholde endringene og lagre dem, kall restore() for å forkaste dem, eller save() for å overskrive posten med vilje.

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

Lagre og lukk

En lagring som ble bedt om før unmount, fullføres likevel, så en håndterer for «Lagre og lukk» trenger ikke vente.

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

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

Ingen lagring tilgjengelig

Serverrendering og lagring som nettleseren blokkerer, er ikke oppstartsfeil. Sjekk available for å fortelle brukerne at endringene bare finnes i minnet.

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

Valider og migrer lagrede data

version, migrate og validate beskytter deg mot gamle eller ødelagte poster. validate kjøres før lagring og etter gjenoppretting eller migrering.

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

Bruk din egen lagring

Ethvert objekt med getItem, setItem og removeItem fungerer. Metodene kan returnere verdier eller Promise; isAvailable er valgfri.

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

Grenser og tidsavbrudd

Juster hvor lenge en operasjon kan ta, hvor mange som kan vente, og hvor stor en verdi kan være.

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

Feilkoder

Feil som restate oppretter, har name RestateError, en code og, for lagrede stores, key. Lagringsadaptere og dine egne callbacks kan avvise med egne feil.

KodeBetydning
BULK_OPERATION_FAILEDEt massekall som restateManager.ready eller saveAll hadde feil; se error.failures.
INDEXEDDB_ABORTEDEn IndexedDB-transaksjon ble avbrutt.
INDEXEDDB_BLOCKEDÅpningen av databasen ble blokkert av en tilkobling i en annen fane.
INDEXEDDB_CONNECTION_CLOSINGDatabasetilkoblingen holdt på å lukkes da forespørselen startet.
INDEXEDDB_OPEN_FAILEDDatabasen kunne ikke åpnes.
INDEXEDDB_REQUEST_FAILEDEn IndexedDB-forespørsel mislyktes.
INDEXEDDB_STORE_MISSINGObject store mangler i en allerede opprettet database.
INVALID_STORAGE_RECORDEn lagret post er ikke en gyldig restate-post.
INVALID_STORED_VALUEEn verdi besto ikke validate.
LIFECYCLE_LIMITEn updater fortsatte å starte og stoppe.
LOAD_FAILEDEn post kunne ikke lastes inn, så en automatisk lagring eller masselagring erstattet den ikke.
MMKV_UNAVAILABLEreact-native-mmkv kunne ikke lastes inn.
MULTIPLE_ERRORSFlere callbacks feilet i én operasjon; se error.errors.
NOTIFICATION_LIMITObservatører fortsatte å planlegge endringer i en løkke.
OBSERVER_ERROREn lytter eller livssyklus-callback kastet en feil.
OPERATION_ABORTEDEn lagringsoperasjon ble avbrutt.
QUEUE_FULLFlere operasjoner ventet enn maxPendingOperations tillater.
REENTRANT_SETTEREn state-updater prøvde å endre den samme storen mens den kjørte.
SCOPE_DESTROYEDEt ødelagt scope ble brukt til å opprette stores.
SEQUENCE_EXHAUSTEDEn intern sekvens gikk tom for id-er.
STORAGE_BLOCKEDEt tidligere adapterkall ble ikke fullført etter tidsavbrudd eller avbrytelse.
STORAGE_TIMEOUTEn operasjon tok lengre tid enn operationTimeoutMs.
STORAGE_UNAVAILABLELagring kan ikke brukes her; storen fortsetter i minnet.
STORAGE_VALUE_TOO_LARGEDen kodede verdien overskrider maxStorageCharacters.
STORAGE_VERSION_MISMATCHEn post har en annen versjon, og ingen migrate-funksjon håndterer den.
STORE_DESTROYEDNoen abonnerte på en ødelagt store eller ba den bruke lagring.

Søk i dokumentasjonen

Søk i titler, beskrivelser og tekst i alle guider.