restate / v1.0.0
Spoľahlivosť by design
Čo restate zaručuje, keď je úložisko pomalé, zlyháva alebo chýba, a ako čítať chyby, ktoré hlási.
Na tejto stránke
ZárukyUloženia v poradíVyskúšajteKeď načítanie zlyháUložiť a zavrieťŽiadne úložisko k dispozíciiValidácia a migrácia uložených údajovVlastné úložiskoLimity a časové limityKódy chýbZáruky
Toto správanie je súčasťou kontraktu 1.0 a pokrývajú ho testy balíka.
| Situácia | Čo restate urobí |
|---|---|
Niekoľko uložení za sebou | Vykoná ich v poradí pre každý store; uloženie vo fronte zapíše najnovšiu hodnotu. |
Záznam sa nenačítal | autoSave a hromadné uloženia ho preskočia s LOAD_FAILED; nahradí ho len explicitné save(). |
Komponent sa počas uloženia odpojí | Vyžiadané uloženie sa dokončí; neskoršie zápisy do zničeného store sa ignorujú. |
Úložisko nie je dostupné | Store funguje v pamäti, status().available je false a uloženia sa odmietajú. |
Adaptér sa zasekne | Operácii vyprší čas po operationTimeoutMs a ďalšia práca počká, kým adaptér skončí. |
Priveľa čakajúcej práce | Nové operácie sa odmietnu s QUEUE_FULL namiesto toho, aby fronta rástla bez obmedzenia. |
Uloženia v poradí
Operácie jedného store sa nikdy neprekrývajú. Uloženie spustené, kým iné čaká, vezme najnovšiu hodnotu, takže ukladanie pri každej zmene zapíše posledný stav bez zahltenia fronty.
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 writesVyskúšajte
Spomaľte úložisko, nechajte zápisy zlyhávať alebo úložisko úplne odoberte.
Príprava príkladu…
Keď načítanie zlyhá
restateManager.ready sa odmietne s BULK_OPERATION_FAILED a vypíše každý store, ktorý zlyhal. Kým sa ten záznam nenačíta, autoSave a saveAll ho nenahradia a nahlásia LOAD_FAILED.
Skúste to znova cez initialize(), ak chcete úpravy zachovať a uložiť, zavolajte restore(), ak ich chcete zahodiť, alebo save(), ak chcete záznam zámerne prepísať.
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);
}
}Uložiť a zavrieť
Uloženie vyžiadané pred odpojením sa aj tak dokončí, takže obsluha „Uložiť a zavrieť“ nemusí čakať.
function Document({ onClose }) {
const useDraft = useRestateScope((scope) => persistedRestate('', { scope, key: 'draft' }));
const saveAndClose = () => {
useDraft.save(); // finishes even after this component unmounts
onClose();
};
// …
}Validácia a migrácia uložených údajov
version, migrate a validate vás chránia pred starými alebo poškodenými záznamami. validate sa spúšťa pred uložením a po obnovení či migrácii.
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),
},
);Vlastné úložisko
Poslúži akýkoľvek objekt s getItem, setItem a removeItem. Metódy môžu vracať hodnoty alebo Promise; isAvailable je voliteľné.
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,
},
);Limity a časové limity
Nastavte, ako dlho smie operácia trvať, koľko ich smie čakať a aká veľká smie byť hodnota.
persistedRestate(value, {
key: 'draft',
operationTimeoutMs: 10_000, // default 30000
maxPendingOperations: 64, // default 256
maxStorageCharacters: 1_000_000,
});Kódy chýb
Chyby vytvorené restate majú name RestateError, code a pri ukladaných store aj key. Adaptéry úložiska a vaše callbacky môžu odmietať vlastnými chybami.
| Kód | Význam |
|---|---|
BULK_OPERATION_FAILED | Hromadné volanie ako restateManager.ready alebo saveAll malo chyby; pozri error.failures. |
INDEXEDDB_ABORTED | Transakcia IndexedDB bola prerušená. |
INDEXEDDB_BLOCKED | Otvorenie databázy zablokovalo pripojenie na inej karte. |
INDEXEDDB_CONNECTION_CLOSING | Pripojenie k databáze sa zatváralo, keď požiadavka začala. |
INDEXEDDB_OPEN_FAILED | Databázu sa nepodarilo otvoriť. |
INDEXEDDB_REQUEST_FAILED | Požiadavka IndexedDB zlyhala. |
INDEXEDDB_STORE_MISSING | V už vytvorenej databáze chýba object store. |
INVALID_STORAGE_RECORD | Uložený záznam nie je platný záznam restate. |
INVALID_STORED_VALUE | Hodnota neprešla validate. |
LIFECYCLE_LIMIT | Updater sa opakovane spúšťal a zastavoval. |
LOAD_FAILED | Záznam sa nepodarilo načítať, takže ho automatické ani hromadné uloženie nenahradilo. |
MMKV_UNAVAILABLE | react-native-mmkv sa nepodarilo načítať. |
MULTIPLE_ERRORS | V jednej operácii zlyhalo viac callbackov; pozri error.errors. |
NOTIFICATION_LIMIT | Pozorovatelia v cykle stále plánovali zmeny. |
OBSERVER_ERROR | Poslucháč alebo callback životného cyklu vyhodil chybu. |
OPERATION_ABORTED | Operácia s úložiskom bola zrušená. |
QUEUE_FULL | Čakalo viac operácií, než dovoľuje maxPendingOperations. |
REENTRANT_SETTER | Updater stavu sa počas svojho behu pokúsil zmeniť ten istý store. |
SCOPE_DESTROYED | Na vytvorenie store bol použitý zničený scope. |
SEQUENCE_EXHAUSTED | Vnútornej sekvencii došli identifikátory. |
STORAGE_BLOCKED | Predchádzajúce volanie adaptéra sa po vypršaní času alebo zrušení nedokončilo. |
STORAGE_TIMEOUT | Operácia trvala dlhšie ako operationTimeoutMs. |
STORAGE_UNAVAILABLE | Úložisko tu nemožno použiť; store ďalej funguje v pamäti. |
STORAGE_VALUE_TOO_LARGE | Zakódovaná hodnota prekračuje maxStorageCharacters. |
STORAGE_VERSION_MISMATCH | Záznam má inú verziu a žiadna funkcia migrate ju neobsluhuje. |
STORE_DESTROYED | Došlo k odberu zničeného store alebo bol požiadaný o použitie úložiska. |