ব্রেকিং পরিবর্তন: AccessHandles-এর জন্য সিঙ্ক পদ্ধতি

অরিজিন প্রাইভেট ফাইল সিস্টেম একটি বিশেষ ধরনের ফাইলে অ্যাক্সেস প্রদান করে যা পারফরম্যান্সের জন্য অত্যন্ত অপ্টিমাইজ করা হয়, উদাহরণস্বরূপ, একটি ফাইলের বিষয়বস্তুতে ইন-প্লেস এবং এক্সক্লুসিভ লেখার অ্যাক্সেস অফার করে। ডেভেলপাররা createSyncAccessHandle() কল করে এই ধরনের ফাইলগুলিতে অ্যাক্সেস পেতে পারেন, যা FileSystemFileHandle অবজেক্টে প্রকাশ করা একটি পদ্ধতি। এই কলের ফলে একটি FileSystemSyncAccessHandle হয়।

FileSystemSyncAccessHandle হল একটি আদিম ফাইল যা স্থানীয় ফাইলগুলিতে কার্যকরী অ্যাক্সেস প্রদান করে। এর একটি প্রধান ব্যবহারের ক্ষেত্রে অ্যাপ্লিকেশনগুলি হল C/C++ কোড Wasm-এ পোর্ট করা; যাইহোক, অ্যাসিঙ্ক্রোনাস কলগুলি এখনও Wasm-এ সম্পূর্ণরূপে সমর্থিত নয়, এবং বিকল্প হিসাবে Asyncify লাইব্রেরি ব্যবহার করার ফলে কার্যক্ষমতা উল্লেখযোগ্যভাবে হ্রাস পেয়েছে। FileSystemSyncAccessHandle এর সমস্ত পদ্ধতি সিঙ্ক্রোনাস করা সিঙ্ক্রোনাস, POSIX-এর মতো ফাইল API Wasm-ভিত্তিক অ্যাপ্লিকেশনের সাথে মিলে যায়; যথেষ্ট কর্মক্ষমতা লাভ আনার সাথে সাথে API-কে আরও ergonomic করে তোলে।

নতুন কি?

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 */