شکستن تغییر: روش های همگام سازی برای AccessHandles

سیستم فایل خصوصی مبدا دسترسی به نوع خاصی از فایل را فراهم می کند که برای عملکرد بسیار بهینه شده است، به عنوان مثال، با ارائه دسترسی نوشتن در محل و انحصاری به محتوای یک فایل. توسعه‌دهندگان می‌توانند با فراخوانی createSyncAccessHandle() به چنین فایل‌هایی دسترسی پیدا کنند، که روشی است که روی اشیاء FileSystemFileHandle در معرض دید قرار می‌گیرد. این تماس منجر به یک FileSystemSyncAccessHandle می شود.

FileSystemSyncAccessHandle یک فایل ابتدایی است که دسترسی موثر به فایل های محلی را فراهم می کند. یکی از موارد استفاده اصلی آن، برنامه هایی است که کد C/C++ را به Wasm منتقل می کنند. با این حال، تماس‌های ناهمزمان هنوز به طور کامل در Wasm پشتیبانی نمی‌شوند و استفاده از کتابخانه Asyncify به‌عنوان جایگزین، عملکرد را به‌طور قابل‌توجهی کاهش داده است. همزمان کردن همه روش‌های FileSystemSyncAccessHandle با برنامه کاربردی مبتنی بر Wasm API فایل مشابه POSIX مطابقت دارد. API را ارگونومیک تر می کند و در عین حال دستاوردهای عملکرد قابل توجهی را به همراه دارد.

چه خبر؟

FileSystemSyncAccessHandle روش‌های زیر را که قبلاً ناهمزمان بودند، اما در Chromium 108 همگام هستند، نشان می‌دهد.

  • truncate(newSize) : اندازه فایل مرتبط با دستگیره دسترسی را تغییر می دهد تا newSize بایت باشد. اگر newSize بزرگتر از اندازه فایل فعلی باشد، فایل را با بایت های پوچ می کند. در غیر این صورت فایل را کوتاه می کند.
  • getSize() : اندازه فایل مرتبط با دستگیره دسترسی را بر حسب بایت برمی گرداند.
  • flush() : اطمینان حاصل می کند که محتویات فایل مرتبط با دسته دسترسی حاوی تمام تغییرات انجام شده از طریق write() باشد.
  • close() : دستگیره دسترسی را فلاش می کند و سپس آن را می بندد. بستن یک دسته دسترسی، هرگونه عملیات بیشتر روی آن را غیرفعال می کند و قفل ورودی مرتبط با دستگیره دسترسی را آزاد می کند.
// In a `Worker`:
const root = await navigator.storage.getDirectory();
const fileHandle = await root.getFileHandle('test', { create: true });
// `createSyncAccessHandle()` is still async.
const accessHandle = await fileHandle.createSyncAccessHandle();
// Both `read()` and `write()` were sync before.
accessHandle.read(/* ... */);
accessHandle.write(/* ... */);

// New: synchronous as of Chromium 108.
console.log(accessHandle.getSize());
accessHandle.truncate(123);
accessHandle.flush();
accessHandle.close();

چه کاری باید انجام دهم؟

توجه داشته باشید که تغییر روش ها از ناهمزمان به همزمان، یک تغییر تحت وب با احتمال شکستگی است. در حالی که استفاده از await در متدهای همزمان بدون عملیات است، هر گونه استفاده از Promise.then() خراب خواهد شد. اگر یک زنگ then() را بر روی نتیجه هر یک از متدهای قبلی ناهمزمان و اکنون همزمان زنجیره بزنید، باید کد خود را تغییر دهید.

// (✅) This won't break, but you better remove the superfluous `await`:
await accessHandle.flush();
// ✅ Correct:
accessHandle.flush();
// ⛔️ This will break, and you need to restructure your code:
accessHandle.flush().then(/* Follow-up code */);
// ✅ Correct:
accessHandle.flush();
/* Follow-up code */