restate / v1.0.0

Luotettava suunnittelultaan

Mitä restate takaa, kun tallennustila on hidas, pettää tai puuttuu, ja miten sen raportoimia virheitä luetaan.

Tällä sivullaTakuutTallennukset järjestyksessäKokeileKun lataus epäonnistuuTallenna ja suljeTallennustila ei ole käytettävissäTallennettujen tietojen validointi ja siirtoOma tallennustilaRajat ja aikakatkaisutVirhekoodit

Takuut

Tämä toiminta on osa 1.0-sopimusta, ja paketin testit kattavat sen.

TilanneMitä restate tekee
Useita tallennuksia peräkkäinSuorittaa ne järjestyksessä storekohtaisesti; jonossa oleva tallennus kirjoittaa uusimman arvon.
Tietue ei latautunutautoSave ja joukkotallennukset ohittavat sen virheellä LOAD_FAILED; vain nimenomainen save() korvaa sen.
Komponentti irrotetaan tallennuksen aikanaPyydetty tallennus valmistuu; myöhemmät kirjoitukset tuhottuun storeen ohitetaan.
Tallennustila ei ole käytettävissäStore toimii muistissa, status().available on false ja tallennukset hylätään.
Sovitin jumittuuToiminto aikakatkaistaan operationTimeoutMs-ajan jälkeen, ja myöhempi työ odottaa sovittimen valmistumista.
Liikaa odottavaa työtäUudet toiminnot hylätään virheellä QUEUE_FULL sen sijaan, että jono kasvaisi rajatta.

Tallennukset järjestyksessä

Yhden storen toiminnot eivät koskaan mene päällekkäin. Tallennus, joka alkaa toisen odottaessa, ottaa uusimman arvon, joten jokaisella muutoksella tallentaminen kirjoittaa viimeisen tilan täyttämättä jonoa.

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

Kokeile

Hidasta tallennustilaa, saa kirjoitukset epäonnistumaan tai poista tallennustila kokonaan.

Valmistellaan esimerkkiä…

Kun lataus epäonnistuu

restateManager.ready hylätään virheellä BULK_OPERATION_FAILED, ja se luettelee jokaisen epäonnistuneen storen. Kunnes kyseinen tietue latautuu, autoSave ja saveAll eivät korvaa sitä vaan raportoivat LOAD_FAILED.

Yritä uudelleen initialize()-kutsulla säilyttääksesi muutokset ja tallentaaksesi ne, kutsu restore() hylätäksesi ne tai save() korvataksesi tietueen tarkoituksella.

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

Tallenna ja sulje

Ennen irrottamista pyydetty tallennus valmistuu silti, joten ”Tallenna ja sulje” -käsittelijän ei tarvitse odottaa.

JavaScript / JSX
function Document({ onClose }) {
  const useDraft = useRestateScope((scope) => persistedRestate('', { scope, key: 'draft' }));

  const saveAndClose = () => {
    useDraft.save(); // finishes even after this component unmounts
    onClose();
  };
  // …
}

Tallennustila ei ole käytettävissä

Palvelinrenderöinti ja selaimen estämä tallennustila eivät ole käynnistysvirheitä. Tarkista available kertoaksesi käyttäjille, että muutokset ovat vain muistissa.

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

Tallennettujen tietojen validointi ja siirto

version, migrate ja validate suojaavat vanhoilta tai vioittuneilta tietueilta. validate suoritetaan ennen tallennusta sekä palautuksen tai siirron jälkeen.

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

Oma tallennustila

Mikä tahansa objekti, jolla on getItem, setItem ja removeItem, kelpaa. Metodit voivat palauttaa arvoja tai Promiseja; isAvailable on valinnainen.

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

Rajat ja aikakatkaisut

Määritä, kuinka kauan toiminto saa kestää, kuinka moni saa odottaa ja kuinka suuri arvo saa olla.

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

Virhekoodit

restaten luomien virheiden name on RestateError, niillä on code ja tallennetuissa storeissa key. Tallennussovittimet ja omat callbackisi voivat hylätä omilla virheillään.

KoodiMerkitys
BULK_OPERATION_FAILEDJoukkokutsussa, kuten restateManager.ready tai saveAll, oli epäonnistumisia; katso error.failures.
INDEXEDDB_ABORTEDIndexedDB-transaktio keskeytettiin.
INDEXEDDB_BLOCKEDToisen välilehden yhteys esti tietokannan avaamisen.
INDEXEDDB_CONNECTION_CLOSINGTietokantayhteys oli sulkeutumassa pyynnön alkaessa.
INDEXEDDB_OPEN_FAILEDTietokantaa ei voitu avata.
INDEXEDDB_REQUEST_FAILEDIndexedDB-pyyntö epäonnistui.
INDEXEDDB_STORE_MISSINGJo olemassa olevasta tietokannasta puuttuu object store.
INVALID_STORAGE_RECORDTallennettu tietue ei ole kelvollinen restate-tietue.
INVALID_STORED_VALUEArvo ei läpäissyt validate-tarkistusta.
LIFECYCLE_LIMITUpdater käynnistyi ja pysähtyi toistuvasti.
LOAD_FAILEDTietuetta ei voitu ladata, joten automaattinen tai joukkotallennus ei korvannut sitä.
MMKV_UNAVAILABLEreact-native-mmkv-pakettia ei voitu ladata.
MULTIPLE_ERRORSUseat callbackit epäonnistuivat yhdessä toiminnossa; katso error.errors.
NOTIFICATION_LIMITTarkkailijat ajoittivat jatkuvasti muutoksia silmukassa.
OBSERVER_ERRORListener tai elinkaaren callback heitti virheen.
OPERATION_ABORTEDTallennustoiminto peruttiin.
QUEUE_FULLOdottavia toimintoja oli enemmän kuin maxPendingOperations sallii.
REENTRANT_SETTERTilan updater yritti muuttaa samaa storea kesken suorituksensa.
SCOPE_DESTROYEDTuhottua scopea käytettiin storejen luomiseen.
SEQUENCE_EXHAUSTEDSisäisestä sarjasta loppuivat tunnisteet.
STORAGE_BLOCKEDAiempi sovitinkutsu ei päättynyt aikakatkaisun tai perumisen jälkeen.
STORAGE_TIMEOUTToiminto kesti kauemmin kuin operationTimeoutMs.
STORAGE_UNAVAILABLETallennustilaa ei voi käyttää tässä; store toimii edelleen muistissa.
STORAGE_VALUE_TOO_LARGEKoodattu arvo ylittää maxStorageCharacters-rajan.
STORAGE_VERSION_MISMATCHTietueella on eri versio, eikä mikään migrate-funktio käsittele sitä.
STORE_DESTROYEDTuhottua storea tilattiin tai siltä pyydettiin tallennustilan käyttöä.

Hae dokumentaatiosta

Hae kaikkien oppaiden otsikoista, kuvauksista ja sisällöstä.