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

ডকুমেন্টেশনে খুঁজুন

সব গাইডের শিরোনাম, বিবরণ আর লেখায় খুঁজুন।