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 langsung dan eksklusif ke konten file. Developer dapat memperoleh akses ke file tersebut dengan memanggil createSyncAccessHandle(), yang merupakan metode yang diekspos pada objek FileSystemFileHandle. Panggilan ini akan menghasilkan FileSystemSyncAccessHandle.

FileSystemSyncAccessHandle adalah primitif file yang memberikan akses berperforma tinggi ke file lokal. Salah satu kasus penggunaan utamanya adalah aplikasi yang mem-porting kode C/C++ ke Wasm. Namun, panggilan asinkron belum sepenuhnya didukung di Wasm, dan penggunaan library Asyncify sebagai alternatif telah menurunkan performa secara signifikan. Membuat semua metode FileSystemSyncAccessHandle sinkron dengan yang diharapkan oleh aplikasi berbasis API file POSIX yang sinkron dan mirip POSIX; menjadikan API lebih ergonomis sekaligus membawa peningkatan performa yang signifikan.

Apa yang baru?

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

  • truncate(newSize): Mengubah ukuran file yang terkait dengan handle akses menjadi panjang newSize byte. Jika newSize lebih besar dari ukuran file saat ini, file akan digabungkan dengan byte null; jika tidak, file akan dipotong.
  • getSize(): Menampilkan ukuran file yang terkait dengan handle akses dalam byte.
  • flush(): Memastikan konten file yang terkait dengan handle akses berisi semua perubahan yang dilakukan melalui write().
  • close(): Menghapus tuas akses, lalu menutupnya. Menutup tuas akses akan menonaktifkan operasi lebih lanjut dan melepaskan kunci pada entri yang terkait dengan tuas 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 ke sinkron adalah perubahan yang diekspos web yang berpotensi mengalami kerusakan. Meskipun penggunaan await dalam metode sinkron adalah tanpa pengoperasian, semua penggunaan Promise.then() akan terganggu. Jika merangkai panggilan then() pada hasil dari 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 */