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 puslapyje
GarantijosIšsaugojimai eilės tvarkaIšbandykiteKai įkėlimas nepavykstaIšsaugoti ir uždarytiSaugykla nepasiekiamaIšsaugotų duomenų patikra ir perkėlimasSava saugyklaRibos ir laiko limitaiKlaidų kodaiGarantijos
Šis elgesys yra 1.0 sutarties dalis ir yra padengtas paketo testais.
| Situacija | Ką daro restate |
|---|---|
Keli išsaugojimai iš eilės | Vykdo 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 saugant | Paprašytas išsaugojimas baigiamas; vėlesni įrašymai į sunaikintą store ignoruojami. |
Saugykla nepasiekiama | store veikia atmintyje, status().available yra false, o išsaugojimai atmetami. |
Adapteris užstringa | Operacijai baigiasi laikas po operationTimeoutMs, o vėlesnis darbas laukia, kol adapteris baigs. |
Per daug laukiančio darbo | Naujos 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.
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 writesIš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šą.
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.
function Document({ onClose }) {
const useDraft = useRestateScope((scope) => persistedRestate('', { scope, key: 'draft' }));
const saveAndClose = () => {
useDraft.save(); // finishes even after this component unmounts
onClose();
};
// …
}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.
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.
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ė.
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.
| Kodas | Reikšmė |
|---|---|
BULK_OPERATION_FAILED | Masiniame kvietime, pvz., restateManager.ready ar saveAll, buvo nesėkmių; žr. error.failures. |
INDEXEDDB_ABORTED | IndexedDB transakcija nutraukta. |
INDEXEDDB_BLOCKED | Duomenų bazės atidarymą užblokavo ryšys kitame skirtuke. |
INDEXEDDB_CONNECTION_CLOSING | Užklausai prasidedant duomenų bazės ryšys buvo uždaromas. |
INDEXEDDB_OPEN_FAILED | Duomenų bazės atidaryti nepavyko. |
INDEXEDDB_REQUEST_FAILED | IndexedDB užklausa nepavyko. |
INDEXEDDB_STORE_MISSING | Jau sukurtoje duomenų bazėje trūksta object store. |
INVALID_STORAGE_RECORD | Išsaugotas įrašas nėra galiojantis restate įrašas. |
INVALID_STORED_VALUE | Reikšmė neperėjo validate. |
LIFECYCLE_LIMIT | updater vis paleidžiamas ir stabdomas. |
LOAD_FAILED | Įrašo įkelti nepavyko, todėl automatinis ar masinis išsaugojimas jo nepakeitė. |
MMKV_UNAVAILABLE | react-native-mmkv įkelti nepavyko. |
MULTIPLE_ERRORS | Vienoje operacijoje nepavyko keli callback; žr. error.errors. |
NOTIFICATION_LIMIT | Stebėtojai cikle vis planavo pakeitimus. |
OBSERVER_ERROR | listener ar gyvavimo ciklo callback išmetė klaidą. |
OPERATION_ABORTED | Saugyklos operacija atšaukta. |
QUEUE_FULL | Laukė daugiau operacijų, nei leidžia maxPendingOperations. |
REENTRANT_SETTER | Būsenos updater vykdymo metu bandė pakeisti tą patį store. |
SCOPE_DESTROYED | store kurti buvo panaudotas sunaikintas scope. |
SEQUENCE_EXHAUSTED | Vidinei sekai baigėsi identifikatoriai. |
STORAGE_BLOCKED | Ankstesnis adapterio kvietimas nesibaigė po laiko limito ar atšaukimo. |
STORAGE_TIMEOUT | Operacija truko ilgiau nei operationTimeoutMs. |
STORAGE_UNAVAILABLE | Čia saugyklos naudoti negalima; store toliau veikia atmintyje. |
STORAGE_VALUE_TOO_LARGE | Užkoduota reikšmė viršija maxStorageCharacters. |
STORAGE_VERSION_MISMATCH | Įrašo versija kita, ir jos neapdoroja jokia migrate funkcija. |
STORE_DESTROYED | Sunaikintas store buvo prenumeruotas arba paprašytas naudoti saugyklą. |