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 in-place ed esclusivo 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. Rendere sincroni tutti i metodi di FileSystemSyncAccessHandle corrisponde alle aspettative dell'applicazione basata su Wasm con API file sincrona e simile a POSIX; rendere l'API più ergonomica e ottenere al contempo notevoli miglioramenti delle 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 è maggiore delle dimensioni attuali del file, il file viene completato con byte null; altrimenti 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(): svuota la barra 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() non funzionerà. 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 */