अहम बदलाव: AccessHandles को सिंक करने के तरीके

ओरिजिनल निजी फ़ाइल सिस्टम, एक खास तरह की फ़ाइल का ऐक्सेस देता है. यह फ़ाइल, परफ़ॉर्मेंस के लिए काफ़ी ऑप्टिमाइज़ की गई होती है. उदाहरण के लिए, यह फ़ाइल के कॉन्टेंट को इन-प्लेस और खास तौर पर लिखने का ऐक्सेस देती है. डेवलपर, createSyncAccessHandle() को कॉल करके ऐसी फ़ाइलों का ऐक्सेस पा सकते हैं. यह एक ऐसा तरीका है जो FileSystemFileHandle ऑब्जेक्ट पर उपलब्ध होता है. इस कॉल के FileSystemSyncAccessHandle नतीजे मिलते हैं.

FileSystemSyncAccessHandle एक फ़ाइल प्राइमिटिव है, जो लोकल फ़ाइलों को बेहतर तरीके से ऐक्सेस करने की सुविधा देता है. इसका इस्तेमाल मुख्य रूप से, C/C++ कोड को Wasm में पोर्ट करने वाले ऐप्लिकेशन में किया जाता है. हालांकि, फ़िलहाल Wasm में असाइनोक्रोनस कॉल पूरी तरह से काम नहीं करते. इसके अलावा, Asyncify लाइब्रेरी का इस्तेमाल करने से, ऐप्लिकेशन की परफ़ॉर्मेंस पर काफ़ी बुरा असर पड़ता है. FileSystemSyncAccessHandle के सभी तरीकों को सिंक्रोनस बनाने से, POSIX जैसे फ़ाइल एपीआई Wasm-based ऐप्लिकेशन की उम्मीद के मुताबिक सिंक्रोनस मैच होता है. इससे एपीआई को ज़्यादा बेहतर बनाया जा सकता है और परफ़ॉर्मेंस में काफ़ी बढ़ोतरी की जा सकती है.

नया क्या है?

FileSystemSyncAccessHandle, यहां दिए गए ऐसे तरीकों को एक्सपोज़ करता है जो पहले एसिंक्रोनस थे, लेकिन Chromium 108 के बाद से सिंक्रोनस हैं.

  • truncate(newSize): ऐक्सेस हैंडल से जुड़ी फ़ाइल का साइज़, 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 */