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

Kaynak özel dosya sistemi, performans için yüksek oranda optimize edilmiş özel bir dosya türüne erişim sağlar. Örneğin, bir dosyanın içeriğine yerinde ve özel yazma erişimi sunar. Geliştiriciler, FileSystemFileHandle nesnelerinde sunulan bir yöntem olan createSyncAccessHandle()'i çağırarak bu tür dosyalara erişebilir. Bu çağrı, FileSystemSyncAccessHandle ile sonuçlanır.

FileSystemSyncAccessHandle, yerel dosyalara yüksek performanslı erişim sağlayan bir dosya ilkel öğesidir. Ana kullanım alanlarından biri, C/C++ kodunu Wasm'e taşıyan uygulamalardır. Ancak, asenkron çağrılar henüz Wasm'de tam olarak desteklenmemektedir ve alternatif olarak Asyncify kitaplığının kullanılması performansı önemli ölçüde düşürmüştür. FileSystemSyncAccessHandle API'sinin tüm yöntemlerini eşzamanlı hale getirmek, Wasm tabanlı uygulamanın beklediği eşzamanlı, POSIX benzeri dosya API'siyle eşleşerek API'yi daha ergonomik hale getirir ve önemli performans kazanımları sağlar.

Yenilikler

FileSystemSyncAccessHandle, eskiden eşzamansız olan ancak Chromium 108'den itibaren eşzamanlı olan aşağıdaki yöntemleri gösterir.

  • truncate(newSize): Erişim mülküyle ilişkili dosyayı newSize bayt uzunluğunda olacak şekilde yeniden boyutlandırır. newSize geçerli dosya boyutundan büyükse dosya boş baytlarla doldurulur. Aksi takdirde dosya kısaltılır.
  • getSize(): Erişim mülküyle ilişkili dosyanın bayt cinsinden boyutunu döndürür.
  • flush(): Erişim dizesiyle ilişkili dosyanın içeriğinin, write() aracılığıyla yapılan tüm değişiklikleri içermesini sağlar.
  • close(): Erişim tutamacını temizleyip kapatır. Bir erişim mülkünün kapatılması, üzerinde yapılacak diğer tüm işlemleri devre dışı bırakır ve erişim mülküyle ilişkili girişin kilidini açar.
// 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?

Asynchronize yöntemlerden senkronize yöntemlere geçişin, kesinti olasılığı olan web'e açık bir değişiklik olduğunu unutmayın. Senkronize yöntemlerde await kullanılması işlem yapmazken Promise.then() kullanımı çalışmayı durdurur. Daha önce eşzamansız olan ve artık eşzamanlı olan yöntemlerden herhangi birinin sonucuna then() çağrısı zincirliyorsanız 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 */