Niezbędna zmiana: metody synchronizacji dla elementów AccessHandles

Prywatny system plików źródła zapewnia dostęp do specjalnego rodzaju pliku, który jest zoptymalizowany pod kątem wydajności, na przykład poprzez oferowanie dostępu do zapisu na miejscu i wyłącznie do treści pliku. Deweloperzy mogą uzyskać dostęp do takich plików, wywołując metodę createSyncAccessHandle(), która jest dostępna w obiektach FileSystemFileHandle. Wywołanie tego wywołania powoduje FileSystemSyncAccessHandle.

FileSystemSyncAccessHandle to element typu file, który zapewnia wydajny dostęp do plików lokalnych. Jednym z głównych zastosowań jest przenoszenie kodu C/C++ do Wasm. Jednak wywołania asynchroniczne nie są jeszcze w pełni obsługiwane w Wasm, a używanie biblioteki Asyncify jako alternatywy znacznie obniża wydajność. Dostosowanie wszystkich metod interfejsu FileSystemSyncAccessHandle do synchronicznego interfejsu API plików typu POSIX, który jest wymagany przez aplikacje oparte na Wasm; zwiększenie ergonomii interfejsu API przy jednoczesnym znacznym wzroście wydajności.

Co nowego?

Obiekt FileSystemSyncAccessHandle udostępnia podane niżej metody, które były wcześniej asynchroniczne, ale od wersji Chromium 108 są synchroniczne.

  • truncate(newSize): zmienia rozmiar pliku powiązanego z identyfikatorem dostępu na newSize bajtów. Jeśli newSize jest większa niż bieżący rozmiar pliku, plik jest wypełniany bajtami zerami; w przeciwnym razie jest obcinany.
  • getSize(): zwraca rozmiar pliku powiązanego z identyfikatorem dostępu w bajtach.
  • flush(): zapewnia, że zawartość pliku powiązanego z identyfikatorem dostępu zawiera wszystkie modyfikacje wprowadzone za pomocą write().
  • close(): powoduje ukrycie uchwytu dostępu, a następnie zamknięcie okna. Zamknięcie uchwytu dostępu powoduje wyłączenie wszystkich dalszych operacji na nim i odblokowanie wpisu powiązanego z tym uchwytem.
// 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();

Co muszę zrobić?

Pamiętaj, że zmiana metod z asynchronicznych na synchroniczne to zmiana dostępna w internecie, która może ulec awarii. Używanie await w metodach synchronicznych nie ma sensu, ale każde użycie Promise.then() spowoduje błąd. Jeśli wywołasz metodę then() w łańcuchu wywołań po wywołaniu metody asynchronicznej lub synchronicznej, musisz zmienić kod.

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