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
. W wyniku tego wywołania otrzymasz 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 zwiększeniu 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 nanewSize
bajtów. JeślinewSize
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 uchwytem dostępu w bajtach.flush()
: zapewnia, że zawartość pliku powiązanego z identyfikatorem dostępu zawiera wszystkie modyfikacje wprowadzone za pomocą funkcjiwrite()
.close()
: czyści uchwyt dostępu, a następnie zamyka go. 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 asynkronicznych na synchroniczne jest zmianą widoczną w internecie, która może spowodować awarię. 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 */
Powiązane artykuły
- Sprawdzanie tagów
- Specyfikacja
- Problem ze specyfikacją (który spowodował zmianę)
- Wpis w ChromeStatus
- Błąd w Chromium