restate / v1.0.0
डिज़ाइन से विश्वसनीय
स्टोरेज धीमा, विफल या अनुपस्थित होने पर restate क्या गारंटी देता है, और उसकी बताई त्रुटियाँ कैसे पढ़ें।
इस पेज पर
गारंटीक्रम से सहेजनाआज़माएँजब लोड विफल होसहेजें और बंद करेंस्टोरेज उपलब्ध नहींसहेजे गए डेटा का सत्यापन और माइग्रेशनअपना स्टोरेजसीमाएँ और समय-सीमाएँत्रुटि कोडगारंटी
यह व्यवहार 1.0 अनुबंध का हिस्सा है और पैकेज के टेस्ट इसे कवर करते हैं।
| स्थिति | restate क्या करता है |
|---|---|
लगातार कई बार सहेजना | हर स्टोर के लिए उन्हें क्रम से चलाता है; कतार में खड़ा सहेजना नवीनतम मान लिखता है। |
रिकॉर्ड लोड नहीं हुआ | autoSave और सामूहिक सहेजना उसे LOAD_FAILED के साथ छोड़ देते हैं; सिर्फ़ स्पष्ट save() उसे बदलता है। |
सहेजते समय कंपोनेंट अनमाउंट हो जाता है | माँगा गया सहेजना पूरा होता है; नष्ट स्टोर में बाद के लेखन अनदेखे होते हैं। |
स्टोरेज उपलब्ध नहीं | स्टोर मेमोरी में चलता है, status().available false होता है, और सहेजना अस्वीकार होता है। |
एडेप्टर अटक जाता है | operationTimeoutMs के बाद काम का समय समाप्त होता है, और बाद का काम एडेप्टर के ख़त्म होने का इंतज़ार करता है। |
बहुत ज़्यादा लंबित काम | नए काम बिना सीमा बढ़ने के बजाय QUEUE_FULL के साथ अस्वीकार होते हैं। |
क्रम से सहेजना
एक स्टोर के काम कभी एक-दूसरे पर नहीं चढ़ते। दूसरे के इंतज़ार में रहते हुए शुरू हुआ सहेजना नवीनतम मान लेता है, इसलिए हर बदलाव पर सहेजने से कतार भरे बिना आख़िरी स्थिति लिखी जाती है।
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()।
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);
}
}सहेजें और बंद करें
अनमाउंट से पहले माँगा गया सहेजना फिर भी पूरा होता है, इसलिए "सहेजें और बंद करें" हैंडलर को इंतज़ार नहीं करना पड़ता।
function Document({ onClose }) {
const useDraft = useRestateScope((scope) => persistedRestate('', { scope, key: 'draft' }));
const saveAndClose = () => {
useDraft.save(); // finishes even after this component unmounts
onClose();
};
// …
}सहेजे गए डेटा का सत्यापन और माइग्रेशन
version, migrate और validate आपको पुराने या ख़राब रिकॉर्ड से बचाते हैं। validate सहेजने से पहले और वापस लाने या माइग्रेशन के बाद चलता है।
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 वैकल्पिक है।
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,
},
);सीमाएँ और समय-सीमाएँ
तय करें कि एक काम कितनी देर चल सकता है, कितने इंतज़ार कर सकते हैं और मान कितना बड़ा हो सकता है।
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_FAILED | restateManager.ready या saveAll जैसी सामूहिक कॉल में त्रुटियाँ हुईं; error.failures देखें। |
INDEXEDDB_ABORTED | IndexedDB ट्रांज़ैक्शन रद्द हो गया। |
INDEXEDDB_BLOCKED | डेटाबेस खोलना दूसरे टैब के कनेक्शन ने रोक दिया। |
INDEXEDDB_CONNECTION_CLOSING | अनुरोध शुरू होते समय डेटाबेस कनेक्शन बंद हो रहा था। |
INDEXEDDB_OPEN_FAILED | डेटाबेस नहीं खुल सका। |
INDEXEDDB_REQUEST_FAILED | IndexedDB अनुरोध विफल रहा। |
INDEXEDDB_STORE_MISSING | पहले से बने डेटाबेस में object store नहीं है। |
INVALID_STORAGE_RECORD | सहेजा गया रिकॉर्ड मान्य restate रिकॉर्ड नहीं है। |
INVALID_STORED_VALUE | मान validate में पास नहीं हुआ। |
LIFECYCLE_LIMIT | updater बार-बार शुरू और बंद होता रहा। |
LOAD_FAILED | रिकॉर्ड लोड नहीं हो सका, इसलिए अपने-आप या सामूहिक सहेजने ने उसे नहीं बदला। |
MMKV_UNAVAILABLE | react-native-mmkv लोड नहीं हो सका। |
MULTIPLE_ERRORS | एक काम में कई callback विफल रहे; error.errors देखें। |
NOTIFICATION_LIMIT | ऑब्ज़र्वर लूप में लगातार बदलाव शेड्यूल करते रहे। |
OBSERVER_ERROR | किसी listener या lifecycle callback ने त्रुटि फेंकी। |
OPERATION_ABORTED | स्टोरेज काम रद्द कर दिया गया। |
QUEUE_FULL | maxPendingOperations की अनुमति से ज़्यादा काम इंतज़ार में थे। |
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 | नष्ट स्टोर की सदस्यता ली गई या उससे स्टोरेज इस्तेमाल करने को कहा गया। |