Modifica irreversibile: metodi di sincronizzazione per AccessHandles

Il file system privato di origine offre l'accesso a un tipo speciale di file altamente ottimizzato per le prestazioni, ad esempio, offrendo accesso in scrittura esclusivo e in-place ai contenuti di un file. Gli sviluppatori possono accedere a questi file chiamando createSyncAccessHandle(), che è un metodo esposto sugli oggetti FileSystemFileHandle. Questa chiamata genera un FileSystemSyncAccessHandle.

FileSystemSyncAccessHandle è una primitiva file che fornisce un accesso efficiente ai file locali. Uno tra i suoi casi d'uso principali è il porting del codice C/C++ in Wasm; tuttavia, le chiamate asincrone non sono ancora completamente supportate su Wasm e l'utilizzo della libreria Asyncify come alternativa ha avuto un impatto significativo sul rendimento. L'impostazione di tutti i metodi di FileSystemSyncAccessHandle sincrona corrisponde alle aspettative dell'applicazione di file sincrona, simile a POSIX, per l'applicazione basata su Wasm. L'API è più ergonomica e, al contempo, migliora sensibilmente le prestazioni.

Novità

FileSystemSyncAccessHandle espone i seguenti metodi, che in precedenza erano asincroni, ma che sono sincroni a partire da Chromium 108.

  • truncate(newSize): ridimensiona il file associato all'handle di accesso in modo che abbia una dimensione di newSize byte. Se newSize è superiore alla dimensione attuale del file, occupa il file con byte nulli, altrimenti il file viene troncato.
  • getSize(): restituisce le dimensioni del file associato all'handle di accesso in byte.
  • flush(): garantisce che i contenuti del file associato all'handle di accesso contengano tutte le modifiche apportate tramite write().
  • close(): scarica la maniglia di accesso e poi la chiude. La chiusura di un handle di accesso disattiva eventuali operazioni aggiuntive e rilascia il blocco della voce associata all'handle di accesso.
// 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();

Che cosa devo fare?

Tieni presente che la modifica dei metodi da asincroni a sincroni è una modifica esposta al web con potenziali interruzioni. Sebbene l'utilizzo di await nei metodi sincroni sia un'operazione non valida, qualsiasi utilizzo di Promise.then() causerà un errore. Se esegui una chiamata then() in catena sul risultato di uno dei metodi precedentemente asincroni e ora sincroni, devi modificare il codice.

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