Thay đổi có thể gây lỗi: các phương thức đồng bộ hoá cho AccessHandles

Hệ thống tệp riêng tư gốc cung cấp quyền truy cập vào một loại tệp đặc biệt được tối ưu hoá hiệu suất cao, chẳng hạn như bằng cách cung cấp quyền ghi tại chỗ và độc quyền vào nội dung của tệp. Các nhà phát triển có thể truy cập vào các tệp như vậy bằng cách gọi createSyncAccessHandle(). Đây là một phương thức được hiển thị trên các đối tượng FileSystemFileHandle. Lệnh gọi này dẫn đến FileSystemSyncAccessHandle.

FileSystemSyncAccessHandle là một tệp gốc cung cấp quyền truy cập hiệu suất vào các tệp cục bộ. Một trong những trường hợp sử dụng chính của tính năng này là các ứng dụng chuyển mã C/C++ sang Wasm. Tuy nhiên, các lệnh gọi không đồng bộ chưa được hỗ trợ đầy đủ trên Wasm và việc sử dụng thư viện Asyncify làm giải pháp thay thế đã làm giảm đáng kể hiệu suất. Làm cho tất cả các phương thức của FileSystemSyncAccessHandle đồng bộ khớp với ứng dụng đồng bộ dựa trên API tệp Wasm giống như POSIX dự kiến; giúp API trở nên hiệu quả hơn trong khi mang lại mức tăng hiệu suất đáng kể.

Tính năng mới

FileSystemSyncAccessHandle hiển thị các phương thức sau đây từng là không đồng bộ, nhưng các phương thức đó đồng bộ kể từ Chromium 108.

  • truncate(newSize): Đổi kích thước tệp liên kết với ô điều khiển truy cập thành dài newSize byte. Nếu newSize lớn hơn kích thước tệp hiện tại, thì phương thức này sẽ đệm tệp bằng các byte rỗng; nếu không, newSize sẽ cắt bớt tệp.
  • getSize(): Trả về kích thước của tệp liên kết với tên người dùng truy cập tính bằng byte.
  • flush(): Đảm bảo nội dung của tệp liên kết với tên người dùng truy cập đều chứa tất cả các nội dung sửa đổi được thực hiện thông qua write().
  • close(): Xoá rồi đóng ô điều khiển truy cập. Việc đóng tay điều khiển truy cập sẽ vô hiệu hoá mọi thao tác khác trên tay điều khiển đó và mở khoá trên mục nhập được liên kết với tay cầm truy cập.
// 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();

Việc bạn cần làm

Lưu ý rằng việc thay đổi các phương thức từ không đồng bộ sang đồng bộ sẽ là thay đổi hiển thị trên web với khả năng gây lỗi. Mặc dù việc sử dụng await trong các phương thức đồng bộ là không hoạt động, nhưng mọi trường hợp sử dụng Promise.then() đều sẽ bị lỗi. Nếu liên kết một lệnh gọi then() trên kết quả của bất kỳ phương thức nào trước đây không đồng bộ và hiện đồng bộ hoá, thì bạn cần thay đổi mã.

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