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

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

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

नया क्या है?

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