restate / v1.0.0

डिज़ाइन से विश्वसनीय

स्टोरेज धीमा, विफल या अनुपस्थित होने पर restate क्या गारंटी देता है, और उसकी बताई त्रुटियाँ कैसे पढ़ें।

इस पेज परगारंटीक्रम से सहेजनाआज़माएँजब लोड विफल होसहेजें और बंद करेंस्टोरेज उपलब्ध नहींसहेजे गए डेटा का सत्यापन और माइग्रेशनअपना स्टोरेजसीमाएँ और समय-सीमाएँत्रुटि कोड

गारंटी

यह व्यवहार 1.0 अनुबंध का हिस्सा है और पैकेज के टेस्ट इसे कवर करते हैं।

स्थितिrestate क्या करता है
लगातार कई बार सहेजनाहर स्टोर के लिए उन्हें क्रम से चलाता है; कतार में खड़ा सहेजना नवीनतम मान लिखता है।
रिकॉर्ड लोड नहीं हुआautoSave और सामूहिक सहेजना उसे LOAD_FAILED के साथ छोड़ देते हैं; सिर्फ़ स्पष्ट save() उसे बदलता है।
सहेजते समय कंपोनेंट अनमाउंट हो जाता हैमाँगा गया सहेजना पूरा होता है; नष्ट स्टोर में बाद के लेखन अनदेखे होते हैं।
स्टोरेज उपलब्ध नहींस्टोर मेमोरी में चलता है, status().available false होता है, और सहेजना अस्वीकार होता है।
एडेप्टर अटक जाता हैoperationTimeoutMs के बाद काम का समय समाप्त होता है, और बाद का काम एडेप्टर के ख़त्म होने का इंतज़ार करता है।
बहुत ज़्यादा लंबित कामनए काम बिना सीमा बढ़ने के बजाय QUEUE_FULL के साथ अस्वीकार होते हैं।

क्रम से सहेजना

एक स्टोर के काम कभी एक-दूसरे पर नहीं चढ़ते। दूसरे के इंतज़ार में रहते हुए शुरू हुआ सहेजना नवीनतम मान लेता है, इसलिए हर बदलाव पर सहेजने से कतार भरे बिना आख़िरी स्थिति लिखी जाती है।

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

आज़माएँ

स्टोरेज धीमा करें, लेखन विफल करें या स्टोरेज पूरी तरह हटा दें।

उदाहरण तैयार हो रहा है…

जब लोड विफल हो

restateManager.ready BULK_OPERATION_FAILED के साथ अस्वीकार होता है और हर विफल स्टोर की सूची देता है। जब तक वह रिकॉर्ड लोड न हो, autoSave और saveAll उसे नहीं बदलते और LOAD_FAILED बताते हैं।

बदलाव रखकर सहेजने के लिए initialize() से फिर कोशिश करें, उन्हें छोड़ने के लिए restore() कॉल करें, या रिकॉर्ड जानबूझकर बदलने के लिए save()।

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

सहेजें और बंद करें

अनमाउंट से पहले माँगा गया सहेजना फिर भी पूरा होता है, इसलिए "सहेजें और बंद करें" हैंडलर को इंतज़ार नहीं करना पड़ता।

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

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

स्टोरेज उपलब्ध नहीं

सर्वर रेंडरिंग और ब्राउज़र द्वारा अवरुद्ध स्टोरेज स्टार्टअप की त्रुटियाँ नहीं हैं। उपयोगकर्ताओं को बताने के लिए कि बदलाव सिर्फ़ मेमोरी में हैं, available जाँचें।

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

सहेजे गए डेटा का सत्यापन और माइग्रेशन

version, migrate और validate आपको पुराने या ख़राब रिकॉर्ड से बचाते हैं। validate सहेजने से पहले और वापस लाने या माइग्रेशन के बाद चलता है।

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

अपना स्टोरेज

getItem, setItem और removeItem वाला कोई भी ऑब्जेक्ट चलता है। मेथड मान या Promise लौटा सकते हैं; isAvailable वैकल्पिक है।

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

सीमाएँ और समय-सीमाएँ

तय करें कि एक काम कितनी देर चल सकता है, कितने इंतज़ार कर सकते हैं और मान कितना बड़ा हो सकता है।

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

त्रुटि कोड

restate की बनाई त्रुटियों में name RestateError, code और सहेजे गए स्टोर में key होती है। स्टोरेज एडेप्टर और आपके callback अपनी त्रुटियों के साथ अस्वीकार कर सकते हैं।

कोडअर्थ
BULK_OPERATION_FAILEDrestateManager.ready या saveAll जैसी सामूहिक कॉल में त्रुटियाँ हुईं; error.failures देखें।
INDEXEDDB_ABORTEDIndexedDB ट्रांज़ैक्शन रद्द हो गया।
INDEXEDDB_BLOCKEDडेटाबेस खोलना दूसरे टैब के कनेक्शन ने रोक दिया।
INDEXEDDB_CONNECTION_CLOSINGअनुरोध शुरू होते समय डेटाबेस कनेक्शन बंद हो रहा था।
INDEXEDDB_OPEN_FAILEDडेटाबेस नहीं खुल सका।
INDEXEDDB_REQUEST_FAILEDIndexedDB अनुरोध विफल रहा।
INDEXEDDB_STORE_MISSINGपहले से बने डेटाबेस में object store नहीं है।
INVALID_STORAGE_RECORDसहेजा गया रिकॉर्ड मान्य restate रिकॉर्ड नहीं है।
INVALID_STORED_VALUEमान validate में पास नहीं हुआ।
LIFECYCLE_LIMITupdater बार-बार शुरू और बंद होता रहा।
LOAD_FAILEDरिकॉर्ड लोड नहीं हो सका, इसलिए अपने-आप या सामूहिक सहेजने ने उसे नहीं बदला।
MMKV_UNAVAILABLEreact-native-mmkv लोड नहीं हो सका।
MULTIPLE_ERRORSएक काम में कई callback विफल रहे; error.errors देखें।
NOTIFICATION_LIMITऑब्ज़र्वर लूप में लगातार बदलाव शेड्यूल करते रहे।
OBSERVER_ERRORकिसी listener या lifecycle callback ने त्रुटि फेंकी।
OPERATION_ABORTEDस्टोरेज काम रद्द कर दिया गया।
QUEUE_FULLmaxPendingOperations की अनुमति से ज़्यादा काम इंतज़ार में थे।
REENTRANT_SETTERस्टेट updater ने चलते समय उसी स्टोर को बदलने की कोशिश की।
SCOPE_DESTROYEDस्टोर बनाने के लिए नष्ट scope इस्तेमाल किया गया।
SEQUENCE_EXHAUSTEDआंतरिक अनुक्रम के पहचानकर्ता ख़त्म हो गए।
STORAGE_BLOCKEDसमय-सीमा या रद्द होने के बाद पिछली एडेप्टर कॉल पूरी नहीं हुई।
STORAGE_TIMEOUTकाम ने operationTimeoutMs से ज़्यादा समय लिया।
STORAGE_UNAVAILABLEयहाँ स्टोरेज इस्तेमाल नहीं हो सकता; स्टोर मेमोरी में चलता रहता है।
STORAGE_VALUE_TOO_LARGEएन्कोड किया गया मान maxStorageCharacters से बड़ा है।
STORAGE_VERSION_MISMATCHरिकॉर्ड का संस्करण अलग है और कोई migrate फ़ंक्शन उसे नहीं संभालता।
STORE_DESTROYEDनष्ट स्टोर की सदस्यता ली गई या उससे स्टोरेज इस्तेमाल करने को कहा गया।

दस्तावेज़ खोजें

सभी गाइड के शीर्षक, विवरण और सामग्री में खोजें।