restate / v1.0.0

אמינות by design

מה 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. מתאמי אחסון וה־callbacks שלכם יכולים לדחות עם שגיאות משלהם.

קודמשמעות
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_LIMITupdater המשיך להתחיל ולהיעצר שוב ושוב.
LOAD_FAILEDלא ניתן היה לטעון רשומה, ולכן שמירה אוטומטית או גורפת לא החליפה אותה.
MMKV_UNAVAILABLEלא ניתן לטעון את react-native-mmkv.
MULTIPLE_ERRORSכמה callbacks נכשלו בפעולה אחת; ראו error.errors.
NOTIFICATION_LIMITצופים המשיכו לתזמן שינויים בלולאה.
OBSERVER_ERRORמאזין או callback של מחזור חיים זרק שגיאה.
OPERATION_ABORTEDפעולת אחסון בוטלה.
QUEUE_FULLהמתינו יותר פעולות ממה ש־maxPendingOperations מאפשר.
REENTRANT_SETTERupdater של מצב ניסה לשנות את אותו מאגר בזמן שרץ.
SCOPE_DESTROYEDנעשה שימוש ב־scope שהושמד כדי ליצור מאגרים.
SEQUENCE_EXHAUSTEDלרצף פנימי נגמרו המזהים.
STORAGE_BLOCKEDקריאה קודמת למתאם לא הסתיימה אחרי תפוגת זמן או ביטול.
STORAGE_TIMEOUTפעולה נמשכה יותר מ־operationTimeoutMs.
STORAGE_UNAVAILABLEכאן אי אפשר להשתמש באחסון; המאגר ממשיך לעבוד בזיכרון.
STORAGE_VALUE_TOO_LARGEהערך המקודד חורג מ־maxStorageCharacters.
STORAGE_VERSION_MISMATCHלרשומה יש גרסה אחרת ואין פונקציית migrate שמטפלת בה.
STORE_DESTROYEDנרשמו למאגר שהושמד או ביקשו ממנו להשתמש באחסון.

חיפוש בתיעוד

חיפוש בכותרות, בתיאורים ובטקסט של כל המדריכים.