restate / v1.0.0

Pålidelighed by design

Hvad restate garanterer, når lageret er langsomt, fejler eller mangler, og hvordan du læser de fejl, det melder.

På denne sideGarantierneOrdnede gemPrøv detNår indlæsningen fejlerGem og lukIntet lager tilgængeligtValidér og migrér gemte dataBrug dit eget lagerGrænser og timeoutsFejlkoder

Garantierne

Denne adfærd er en del af 1.0-kontrakten og er dækket af pakkens tests.

SituationHvad restate gør
Flere gem i trækKører dem i rækkefølge pr. store; et gem i kø skriver den nyeste værdi.
En post blev ikke indlæstautoSave og masse-gem springer den over med LOAD_FAILED; kun et eksplicit save() erstatter den.
Komponenten afmonteres under et gemDet anmodede gem gøres færdigt; senere skrivninger til den nedlagte store ignoreres.
Lageret er utilgængeligtStoren kører i hukommelsen, status().available er false, og gem afvises.
En adapter hængerHandlingen får timeout efter operationTimeoutMs, og senere arbejde venter, til adapteren er færdig.
For meget ventende arbejdeNye handlinger afvises med QUEUE_FULL i stedet for at vokse uden grænse.

Ordnede gem

En stores handlinger overlapper aldrig. Et gem, der starter, mens et andet venter, tager den nyeste værdi, så gem ved hver ændring skriver den seneste state uden at fylde 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

Gør lageret langsommere, lad skrivninger fejle, eller fjern lageret helt.

Forbereder eksemplet…

Når indlæsningen fejler

restateManager.ready afvises med BULK_OPERATION_FAILED og oplister hver store, der fejlede. Indtil den post indlæses, erstatter autoSave og saveAll den ikke og melder LOAD_FAILED.

Prøv igen med initialize() for at beholde ændringerne og gemme dem, kald restore() for at kassere dem, eller save() for bevidst at overskrive posten.

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

Gem og luk

Et gem, der blev bedt om før unmount, gøres stadig færdigt, så en handler til »Gem og luk« behøver 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();
  };
  // …
}

Intet lager tilgængeligt

Serverrendering og lager, som browseren blokerer, er ikke opstartsfejl. Tjek available for at fortælle brugerne, at ændringer kun bliver i hukommelsen.

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ér og migrér gemte data

version, migrate og validate beskytter dig mod gamle eller ødelagte poster. validate kører før gem og efter gendannelse 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),
  },
);

Brug dit eget lager

Ethvert objekt med getItem, setItem og removeItem virker. Metoderne kan returnere værdier 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,
  },
);

Grænser og timeouts

Justér, hvor længe en handling må tage, hvor mange der må vente, og hvor stor en værdi må være.

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

Fejlkoder

Fejl, som restate opretter, har name RestateError, en code og, for gemte stores, key. Lageradaptere og dine egne callbacks kan afvise med deres egne fejl.

KodeBetydning
BULK_OPERATION_FAILEDEt massekald som restateManager.ready eller saveAll havde fejl; se error.failures.
INDEXEDDB_ABORTEDEn IndexedDB-transaktion blev afbrudt.
INDEXEDDB_BLOCKEDÅbning af databasen blev blokeret af en forbindelse i en anden fane.
INDEXEDDB_CONNECTION_CLOSINGDatabaseforbindelsen var ved at lukke, da anmodningen startede.
INDEXEDDB_OPEN_FAILEDDatabasen kunne ikke åbnes.
INDEXEDDB_REQUEST_FAILEDEn IndexedDB-anmodning mislykkedes.
INDEXEDDB_STORE_MISSINGObject store mangler i en allerede oprettet database.
INVALID_STORAGE_RECORDEn gemt post er ikke en gyldig restate-post.
INVALID_STORED_VALUEEn værdi bestod ikke validate.
LIFECYCLE_LIMITEn updater blev ved med at starte og stoppe.
LOAD_FAILEDEn post kunne ikke indlæses, så et automatisk gem eller masse-gem erstattede den ikke.
MMKV_UNAVAILABLEreact-native-mmkv kunne ikke indlæses.
MULTIPLE_ERRORSFlere callbacks fejlede i én handling; se error.errors.
NOTIFICATION_LIMITObservatører blev ved med at planlægge ændringer i en løkke.
OBSERVER_ERROREn listener eller livscyklus-callback kastede en fejl.
OPERATION_ABORTEDEn lagerhandling blev afbrudt.
QUEUE_FULLDer ventede flere handlinger, end maxPendingOperations tillader.
REENTRANT_SETTEREn state-updater forsøgte at ændre den samme store, mens den kørte.
SCOPE_DESTROYEDEt nedlagt scope blev brugt til at oprette stores.
SEQUENCE_EXHAUSTEDEn intern sekvens løb tør for id'er.
STORAGE_BLOCKEDEt tidligere adapterkald blev ikke afsluttet efter timeout eller afbrydelse.
STORAGE_TIMEOUTEn handling tog længere tid end operationTimeoutMs.
STORAGE_UNAVAILABLELageret kan ikke bruges her; storen kører videre i hukommelsen.
STORAGE_VALUE_TOO_LARGEDen kodede værdi overstiger maxStorageCharacters.
STORAGE_VERSION_MISMATCHEn post har en anden version, og ingen migrate-funktion håndterer den.
STORE_DESTROYEDDer blev abonneret på en nedlagt store, eller den blev bedt om at bruge lager.

Søg i dokumentationen

Søg i titler, beskrivelser og tekst i alle guides.