Zarar veren değişiklik: AccessHandles için senkronizasyon yöntemleri

Kaynak gizli dosya sistemi, performans için yüksek düzeyde optimize edilmiş özel bir dosya türüne erişim sağlar (örneğin, dosya içeriğine yerinde ve özel yazma erişimi sunarak). Geliştiriciler, FileSystemFileHandle nesnelerinde gösterilen bir yöntem olan createSyncAccessHandle() yöntemini çağırarak bu tür dosyalara erişebilir. Bu çağrı bir FileSystemSyncAccessHandle ile sonuçlanır.

FileSystemSyncAccessHandle, yerel dosyalara etkili erişim sağlayan bir temel dosya öğesidir. Başlıca kullanım alanlarından biri, C/C++ kodunu Wasm'a taşıyan uygulamalardır. Ancak eşzamansız çağrılar henüz Wasm'da tam olarak desteklenmemektedir ve alternatif olarak Asyncify kitaplığının kullanılması performansı önemli ölçüde düşürmüştür. Eşzamanlı FileSystemSyncAccessHandle yöntemlerinin tümünün, API Wasm tabanlı eşzamanlı dosya API'si Wasm tabanlı uygulamayla eşleştirilmesiyle uyumlu hale getirilmesi ve aynı zamanda önemli performans artışı sağlaması beklenmektedir.

Yenilikler:

FileSystemSyncAccessHandle, daha önce eşzamansız olan ancak Chromium 108 itibarıyla eşzamanlı yöntemleri sunar.

  • truncate(newSize): Erişim işleyiciyle ilişkili dosyayı newSize bayt uzunluğunda olacak şekilde yeniden boyutlandırır. newSize geçerli dosya boyutundan büyükse dosyayı boş baytlarla doldurur, aksi takdirde keser.
  • getSize(): Erişim işleyiciyle ilişkili dosyanın boyutunu bayt cinsinden döndürür.
  • flush(): Erişim işleyiciyle ilişkili dosya içeriğinin, write() aracılığıyla yapılan tüm değişiklikleri içermesini sağlar.
  • close(): Erişim tutma yerini temizleyip kapatır. Bir erişim tutma yeri kapatıldığında bu girişteki diğer işlemler devre dışı bırakılır ve erişim tutma yeriyle ilişkili girişteki kilit açılır.
// 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();

Ne yapmanız gerekiyor?

Yöntemleri eşzamansız yöntemden eş zamanlıya değiştirmenin, web'de kesinti yaşanması ve olası bir değişiklik olabileceğini unutmayın. Eşzamanlı yöntemlerde await kullanıldığında işlem yapılamaz, ancak Promise.then() kullanımı bozulur. Daha önce eşzamansız olan ve şu anda eşzamanlı olan yöntemlerden herhangi birinin sonucunda bir then() çağrısını zincirlemeniz durumunda kodunuzu değiştirmeniz gerekir.

// (✅) 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 */