Критическое изменение: методы синхронизации для AccessHandles

Частная файловая система происхождения обеспечивает доступ к файлам особого типа, которые высоко оптимизированы с точки зрения производительности, например, предлагая эксклюзивный доступ на запись к содержимому файла на месте. Разработчики могут получить доступ к таким файлам, вызвав createSyncAccessHandle() — метод, предоставляемый объектам FileSystemFileHandle . Результатом этого вызова является FileSystemSyncAccessHandle .

FileSystemSyncAccessHandle — файловый примитив, обеспечивающий эффективный доступ к локальным файлам. Одним из основных вариантов его использования является перенос приложений кода C/C++ на Wasm; однако асинхронные вызовы еще не полностью поддерживаются в Wasm, а использование библиотеки Asyncify в качестве альтернативы существенно снижает производительность. Синхронизация всех методов FileSystemSyncAccessHandle соответствует ожидаемому синхронному POSIX-подобному файловому API на основе Wasm; делая API более эргономичным, обеспечивая при этом существенный прирост производительности.

Что нового?

FileSystemSyncAccessHandle предоставляет следующие методы, которые раньше были асинхронными, но стали синхронными с Chromium 108 .

  • truncate(newSize) : изменяет размер файла, связанного с дескриптором доступа, до длины newSize в байтах. Если newSize больше текущего размера файла, он дополняет файл нулевыми байтами; в противном случае файл будет обрезан.
  • getSize() : возвращает размер файла, связанного с дескриптором доступа, в байтах.
  • flush() : гарантирует, что содержимое файла, связанного с дескриптором доступа, содержит все изменения, сделанные с помощью write() .
  • close() : сбрасывает дескриптор доступа, а затем закрывает его. Закрытие дескриптора доступа отключает любые дальнейшие операции с ним и снимает блокировку записи, связанной с дескриптором доступа.
// 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();

Что мне нужно сделать?

Обратите внимание, что изменение методов с асинхронных на синхронные — это изменение, доступное через Интернет, которое может привести к поломке. Хотя использование await в синхронных методах не является операцией, любое использование Promise.then() приведет к сбою. Если вы связываете вызов then() с результатом любого из ранее асинхронных, а теперь синхронных методов, вам необходимо изменить свой код.

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