restate / v1.0.0
Pouzdanost by design
Što restate jamči kad je spremište sporo, zakaže ili nedostaje i kako čitati pogreške koje javlja.
Na ovoj stranici
JamstvaSpremanja redomIsprobajteKad učitavanje ne uspijeSpremi i zatvoriNema dostupnog spremištaValidacija i migracija spremljenih podatakaVlastito spremišteOgraničenja i vremenska ograničenjaKodovi pogrešakaJamstva
Ovo ponašanje dio je ugovora 1.0 i pokrivaju ga testovi paketa.
| Situacija | Što restate radi |
|---|---|
Više spremanja zaredom | Izvodi ih redom za svaki store; spremanje u redu zapisuje najnoviju vrijednost. |
Zapis se nije učitao | autoSave i skupna spremanja preskaču ga uz LOAD_FAILED; zamjenjuje ga samo izričiti save(). |
Komponenta se demontira tijekom spremanja | Zatraženo spremanje se dovršava; kasniji zapisi u uništeni store zanemaruju se. |
Spremište nije dostupno | Store radi u memoriji, status().available je false, a spremanja se odbijaju. |
Adapter zapne | Operaciji istječe vrijeme nakon operationTimeoutMs, a kasniji posao čeka dok adapter ne završi. |
Previše posla na čekanju | Nove operacije odbijaju se s QUEUE_FULL umjesto da rastu bez ograničenja. |
Spremanja redom
Operacije jednog storea nikad se ne preklapaju. Spremanje pokrenuto dok drugo čeka uzima najnoviju vrijednost, pa spremanje pri svakoj promjeni zapisuje posljednje stanje bez punjenja reda.
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 writesIsprobajte
Usporite spremište, neka zapisi ne uspiju ili potpuno uklonite spremište.
Priprema primjera…
Kad učitavanje ne uspije
restateManager.ready odbija se s BULK_OPERATION_FAILED i navodi svaki store koji nije uspio. Dok se taj zapis ne učita, autoSave i saveAll ga ne zamjenjuju i javljaju LOAD_FAILED.
Pokušajte ponovno s initialize() da biste zadržali izmjene i spremili ih, pozovite restore() da ih odbacite ili save() da namjerno prepišete zapis.
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);
}
}Spremi i zatvori
Spremanje zatraženo prije demontiranja ipak se dovršava, pa rukovatelj za „Spremi i zatvori” ne mora čekati.
function Document({ onClose }) {
const useDraft = useRestateScope((scope) => persistedRestate('', { scope, key: 'draft' }));
const saveAndClose = () => {
useDraft.save(); // finishes even after this component unmounts
onClose();
};
// …
}Validacija i migracija spremljenih podataka
version, migrate i validate štite vas od starih ili oštećenih zapisa. validate se pokreće prije spremanja i nakon vraćanja ili migracije.
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),
},
);Vlastito spremište
Poslužit će bilo koji objekt s getItem, setItem i removeItem. Metode mogu vraćati vrijednosti ili Promise; isAvailable nije obavezan.
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,
},
);Ograničenja i vremenska ograničenja
Podesite koliko dugo operacija smije trajati, koliko ih smije čekati i koliko velika smije biti vrijednost.
persistedRestate(value, {
key: 'draft',
operationTimeoutMs: 10_000, // default 30000
maxPendingOperations: 64, // default 256
maxStorageCharacters: 1_000_000,
});Kodovi pogrešaka
Pogreške koje stvara restate imaju name RestateError, code i, kod spremljenih storeova, key. Adapteri spremišta i vaši callbackovi mogu odbiti vlastitim pogreškama.
| Kod | Značenje |
|---|---|
BULK_OPERATION_FAILED | Skupni poziv poput restateManager.ready ili saveAll imao je pogreške; vidi error.failures. |
INDEXEDDB_ABORTED | Transakcija IndexedDB je prekinuta. |
INDEXEDDB_BLOCKED | Otvaranje baze podataka blokirala je veza u drugoj kartici. |
INDEXEDDB_CONNECTION_CLOSING | Veza s bazom podataka zatvarala se kad je zahtjev počeo. |
INDEXEDDB_OPEN_FAILED | Baza podataka nije se mogla otvoriti. |
INDEXEDDB_REQUEST_FAILED | Zahtjev IndexedDB nije uspio. |
INDEXEDDB_STORE_MISSING | U već stvorenoj bazi podataka nedostaje object store. |
INVALID_STORAGE_RECORD | Spremljeni zapis nije valjan restate zapis. |
INVALID_STORED_VALUE | Vrijednost nije prošla validate. |
LIFECYCLE_LIMIT | Updater se stalno pokretao i zaustavljao. |
LOAD_FAILED | Zapis se nije mogao učitati, pa ga automatsko ni skupno spremanje nije zamijenilo. |
MMKV_UNAVAILABLE | react-native-mmkv nije se mogao učitati. |
MULTIPLE_ERRORS | U jednoj operaciji nije uspjelo više callbackova; vidi error.errors. |
NOTIFICATION_LIMIT | Promatrači su u petlji stalno zakazivali promjene. |
OBSERVER_ERROR | Slušatelj ili callback životnog ciklusa bacio je pogrešku. |
OPERATION_ABORTED | Operacija sa spremištem je otkazana. |
QUEUE_FULL | Čekalo je više operacija nego što dopušta maxPendingOperations. |
REENTRANT_SETTER | Updater stanja pokušao je promijeniti isti store dok se izvodio. |
SCOPE_DESTROYED | Za stvaranje storeova korišten je uništeni scope. |
SEQUENCE_EXHAUSTED | Unutarnjem nizu ponestalo je identifikatora. |
STORAGE_BLOCKED | Prethodni poziv adaptera nije završio nakon isteka vremena ili otkazivanja. |
STORAGE_TIMEOUT | Operacija je trajala dulje od operationTimeoutMs. |
STORAGE_UNAVAILABLE | Spremište se ovdje ne može koristiti; store i dalje radi u memoriji. |
STORAGE_VALUE_TOO_LARGE | Kodirana vrijednost premašuje maxStorageCharacters. |
STORAGE_VERSION_MISMATCH | Zapis ima drugu verziju i nijedna funkcija migrate je ne obrađuje. |
STORE_DESTROYED | Došlo je do pretplate na uništeni store ili je od njega zatraženo korištenje spremišta. |