Brekende verandering: synchronisatiemethoden voor AccessHandles

Het oorspronkelijke privébestandssysteem biedt toegang tot een speciaal soort bestand dat sterk is geoptimaliseerd voor prestaties, bijvoorbeeld door ter plaatse exclusieve schrijftoegang tot de inhoud van een bestand aan te bieden. Ontwikkelaars kunnen toegang krijgen tot dergelijke bestanden door createSyncAccessHandle() aan te roepen, een methode die wordt weergegeven in FileSystemFileHandle objecten. Deze aanroep resulteert in een FileSystemSyncAccessHandle .

FileSystemSyncAccessHandle is een bestandsprimitief dat performante toegang tot lokale bestanden biedt. Een van de belangrijkste gebruiksscenario's zijn applicaties die C/C++-code naar Wasm overbrengen; asynchrone oproepen worden echter nog niet volledig ondersteund op Wasm, en het gebruik van de Asyncify- bibliotheek als alternatief heeft de prestaties aanzienlijk verslechterd. Het synchroon maken van alle methoden van de FileSystemSyncAccessHandle komt overeen met de synchrone, POSIX-achtige bestands-API Wasm-gebaseerde applicatie verwacht; de API ergonomischer maken en tegelijkertijd aanzienlijke prestatiewinst opleveren.

Wat is er nieuw?

FileSystemSyncAccessHandle onthult de volgende methoden die vroeger asynchroon waren, maar die sinds Chromium 108 synchroon zijn.

  • truncate(newSize) : Wijzigt de grootte van het bestand dat aan de toegangsingang is gekoppeld, zodat het newSize bytes lang is. Als newSize groter is dan de huidige bestandsgrootte, wordt het bestand opgevuld met null-bytes; anders wordt het bestand afgekapt.
  • getSize() : Retourneert de grootte van het bestand dat aan de toegangsingang is gekoppeld, in bytes.
  • flush() : Zorgt ervoor dat de inhoud van het bestand dat aan de toegangsingang is gekoppeld, alle wijzigingen bevat die zijn aangebracht via write() .
  • close() : Spoelt de toegangsgreep leeg en sluit deze vervolgens. Door een toegangshendel te sluiten, worden alle verdere handelingen daarop uitgeschakeld en wordt de vergrendeling van de ingang die bij de toegangshendel hoort, vrijgegeven.
// 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();

Wat moet ik doen?

Houd er rekening mee dat het veranderen van methoden van asynchroon naar synchroon een verandering is die aan het web wordt blootgesteld en die tot breuk kan leiden. Hoewel het gebruik van await in synchrone methoden no-op is, zal elk gebruik van Promise.then() kapot gaan. Als u een then() aanroep koppelt aan het resultaat van een van de voorheen asynchrone en nu synchrone methoden, moet u uw code wijzigen.

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