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 siden
GarantieneOrdnede lagringerPrøv detNår innlastingen feilerLagre og lukkIngen lagring tilgjengeligValider og migrer lagrede dataBruk din egen lagringGrenser og tidsavbruddFeilkoderGarantiene
Denne oppførselen er en del av 1.0-kontrakten og dekkes av pakkens tester.
| Situasjon | Hva restate gjør |
|---|---|
Flere lagringer på rad | Kjører dem i rekkefølge per store; en lagring i kø skriver den nyeste verdien. |
En post ble ikke lastet inn | autoSave og masselagring hopper over den med LOAD_FAILED; bare et eksplisitt save() erstatter den. |
Komponenten avmonteres under en lagring | Den forespurte lagringen fullføres; senere skrivinger til den ødelagte storen ignoreres. |
Lagringen er utilgjengelig | Storen kjører i minnet, status().available er false, og lagringer avvises. |
En adapter henger | Operasjonen får tidsavbrudd etter operationTimeoutMs, og senere arbeid venter til adapteren er ferdig. |
For mye ventende arbeid | Nye 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.
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 writesPrø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.
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.
function Document({ onClose }) {
const useDraft = useRestateScope((scope) => persistedRestate('', { scope, key: 'draft' }));
const saveAndClose = () => {
useDraft.save(); // finishes even after this component unmounts
onClose();
};
// …
}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.
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.
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.
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.
| Kode | Betydning |
|---|---|
BULK_OPERATION_FAILED | Et massekall som restateManager.ready eller saveAll hadde feil; se error.failures. |
INDEXEDDB_ABORTED | En IndexedDB-transaksjon ble avbrutt. |
INDEXEDDB_BLOCKED | Åpningen av databasen ble blokkert av en tilkobling i en annen fane. |
INDEXEDDB_CONNECTION_CLOSING | Databasetilkoblingen holdt på å lukkes da forespørselen startet. |
INDEXEDDB_OPEN_FAILED | Databasen kunne ikke åpnes. |
INDEXEDDB_REQUEST_FAILED | En IndexedDB-forespørsel mislyktes. |
INDEXEDDB_STORE_MISSING | Object store mangler i en allerede opprettet database. |
INVALID_STORAGE_RECORD | En lagret post er ikke en gyldig restate-post. |
INVALID_STORED_VALUE | En verdi besto ikke validate. |
LIFECYCLE_LIMIT | En updater fortsatte å starte og stoppe. |
LOAD_FAILED | En post kunne ikke lastes inn, så en automatisk lagring eller masselagring erstattet den ikke. |
MMKV_UNAVAILABLE | react-native-mmkv kunne ikke lastes inn. |
MULTIPLE_ERRORS | Flere callbacks feilet i én operasjon; se error.errors. |
NOTIFICATION_LIMIT | Observatører fortsatte å planlegge endringer i en løkke. |
OBSERVER_ERROR | En lytter eller livssyklus-callback kastet en feil. |
OPERATION_ABORTED | En lagringsoperasjon ble avbrutt. |
QUEUE_FULL | Flere operasjoner ventet enn maxPendingOperations tillater. |
REENTRANT_SETTER | En state-updater prøvde å endre den samme storen mens den kjørte. |
SCOPE_DESTROYED | Et ødelagt scope ble brukt til å opprette stores. |
SEQUENCE_EXHAUSTED | En intern sekvens gikk tom for id-er. |
STORAGE_BLOCKED | Et tidligere adapterkall ble ikke fullført etter tidsavbrudd eller avbrytelse. |
STORAGE_TIMEOUT | En operasjon tok lengre tid enn operationTimeoutMs. |
STORAGE_UNAVAILABLE | Lagring kan ikke brukes her; storen fortsetter i minnet. |
STORAGE_VALUE_TOO_LARGE | Den kodede verdien overskrider maxStorageCharacters. |
STORAGE_VERSION_MISMATCH | En post har en annen versjon, og ingen migrate-funksjon håndterer den. |
STORE_DESTROYED | Noen abonnerte på en ødelagt store eller ba den bruke lagring. |