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 | ধ্বংস হওয়া স্টোরে সাবস্ক্রাইব করা হয়েছে বা স্টোরেজ ব্যবহার করতে বলা হয়েছে। |