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

थॉमस स्टेनर
थॉमस स्टेनर

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

FileSystemSyncAccessHandle एक ऐसी फ़ाइल है जो लोकल फ़ाइलों को बेहतर तरीके से ऐक्सेस करने की सुविधा देती है. इसके मुख्य इस्तेमाल में से एक है, C/C++ कोड को Wasm पर पोर्ट करना. हालांकि, Wasm के साथ एसिंक्रोनस कॉल अभी पूरी तरह से काम नहीं करते. विकल्प के तौर पर Asyncify लाइब्रेरी का इस्तेमाल करने से परफ़ॉर्मेंस में काफ़ी गिरावट आई है. FileSystemSyncAccessHandle सिंक्रोनस के सभी तरीकों को सिंक करने वाले, POSIX जैसे फ़ाइल एपीआई 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 */