Perubahan yang dapat menyebabkan gangguan: metode sinkronisasi untuk AccessHandles

Sistem file pribadi origin memberikan akses ke jenis file khusus yang sangat dioptimalkan untuk performa, misalnya, dengan menawarkan akses tulis eksklusif dan di tempat ke konten file. Developer bisa mendapatkan akses ke file tersebut dengan memanggil createSyncAccessHandle(), yang merupakan metode yang ditampilkan di objek FileSystemFileHandle. Panggilan ini menghasilkan FileSystemSyncAccessHandle.

FileSystemSyncAccessHandle adalah primitif file yang memberikan akses berperforma tinggi ke file lokal. Salah satu kasus penggunaan utamanya adalah aplikasi yang melakukan porting kode C/C++ ke Wasm; namun, panggilan asinkron belum didukung sepenuhnya di Wasm, dan menggunakan library Asyncify sebagai alternatif telah menguraikan performa secara substansial. Membuat semua metode FileSystemSyncAccessHandle sinkron sesuai dengan ekspektasi aplikasi berbasis API Wasm seperti POSIX sinkron; membuat API lebih ergonomis sekaligus memberikan peningkatan performa yang substansial.

Apa yang baru?

FileSystemSyncAccessHandle menampilkan metode berikut yang sebelumnya asinkron, tetapi sinkron mulai Chromium 108.

  • truncate(newSize): Mengubah ukuran file yang terkait dengan handle akses menjadi sepanjang newSize byte. Jika newSize lebih besar dari ukuran file saat ini, file akan diisi dengan byte null; jika tidak, file akan terpotong.
  • getSize(): Menampilkan ukuran file yang terkait dengan handle akses dalam byte.
  • flush(): Memastikan bahwa konten file yang terkait dengan handle akses berisi semua perubahan yang dilakukan melalui write().
  • close(): Menghapus handle akses, lalu menutupnya. Menutup handle akses akan menonaktifkan operasi lebih lanjut pada handle tersebut dan melepaskan kunci pada entri yang terkait dengan handle akses.
// 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();

Apa yang harus saya lakukan?

Perhatikan bahwa mengubah metode dari asinkron menjadi sinkron adalah perubahan yang diekspos web dengan potensi kerusakan. Meskipun penggunaan await dalam metode sinkron tidak akan berfungsi, penggunaan Promise.then() akan rusak. Jika Anda membuat rantai panggilan then() pada hasil metode yang sebelumnya asinkron dan sekarang sinkron, Anda perlu mengubah kode.

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