Brekende verandering: synchronisatiemethoden voor AccessHandles

Het oorspronkelijke private bestandssysteem biedt toegang tot een speciaal type bestand dat sterk geoptimaliseerd is voor prestaties, bijvoorbeeld door in-place en exclusieve schrijftoegang tot de inhoud van een bestand te bieden. Ontwikkelaars kunnen toegang tot dergelijke bestanden krijgen door createSyncAccessHandle() aan te roepen, een methode die beschikbaar is op FileSystemFileHandle objecten. Deze aanroep resulteert in een FileSystemSyncAccessHandle .

FileSystemSyncAccessHandle is een bestandsprimitief dat performante toegang biedt tot lokale bestanden. Een van de belangrijkste toepassingen is het porten van C/C++-code naar Wasm; asynchrone aanroepen worden echter nog niet volledig ondersteund op Wasm, en het gebruik van de Asyncify- bibliotheek als alternatief heeft de prestaties aanzienlijk verslechterd. Door alle methoden van de FileSystemSyncAccessHandle synchroon te maken, komt het overeen met de synchrone, POSIX-achtige bestands-API die Wasm-gebaseerde applicaties verwachten; dit maakt de API ergonomischer en levert tegelijkertijd aanzienlijke prestatieverbeteringen op.

Wat is er nieuw?

FileSystemSyncAccessHandle maakt de volgende methoden beschikbaar die voorheen asynchroon waren, maar vanaf Chromium 108 synchroon zijn.

  • truncate(newSize) : Wijzigt de bestandsgrootte van het aan de toegangshandle gekoppelde bestand naar newSize bytes lang. Als newSize groter is dan de huidige bestandsgrootte, wordt het bestand aangevuld met null bytes; anders wordt het bestand afgekapt.
  • getSize() : Retourneert de grootte van het bestand dat aan de toegangshandle is gekoppeld in bytes.
  • flush() : Zorgt ervoor dat de inhoud van het bestand dat aan de toegangshandle is gekoppeld, alle wijzigingen bevat die via write() zijn aangebracht.
  • close() : Spoelt de toegangshandle en sluit deze vervolgens. Het sluiten van een toegangshandle schakelt alle verdere bewerkingen erop uit en heft de vergrendeling op van de invoer die aan de toegangshandle is gekoppeld.
// 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 wijzigen van methoden van asynchroon naar synchroon een web-exposed wijziging is met potentiële problemen. Hoewel het gebruik van await in synchrone methoden een no-op is, zal elk gebruik van Promise.then() problemen opleveren. Als u een then() aanroep koppelt aan het resultaat van een van de voorheen asynchrone en nu synchrone methoden, moet u uw code aanpassen.

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

Het oorspronkelijke private bestandssysteem biedt toegang tot een speciaal type bestand dat sterk geoptimaliseerd is voor prestaties, bijvoorbeeld door in-place en exclusieve schrijftoegang tot de inhoud van een bestand te bieden. Ontwikkelaars kunnen toegang tot dergelijke bestanden krijgen door createSyncAccessHandle() aan te roepen, een methode die beschikbaar is op FileSystemFileHandle objecten. Deze aanroep resulteert in een FileSystemSyncAccessHandle .

FileSystemSyncAccessHandle is een bestandsprimitief dat performante toegang biedt tot lokale bestanden. Een van de belangrijkste toepassingen is het porten van C/C++-code naar Wasm; asynchrone aanroepen worden echter nog niet volledig ondersteund op Wasm, en het gebruik van de Asyncify- bibliotheek als alternatief heeft de prestaties aanzienlijk verslechterd. Door alle methoden van de FileSystemSyncAccessHandle synchroon te maken, komt het overeen met de synchrone, POSIX-achtige bestands-API die Wasm-gebaseerde applicaties verwachten; dit maakt de API ergonomischer en levert tegelijkertijd aanzienlijke prestatieverbeteringen op.

Wat is er nieuw?

FileSystemSyncAccessHandle maakt de volgende methoden beschikbaar die voorheen asynchroon waren, maar vanaf Chromium 108 synchroon zijn.

  • truncate(newSize) : Wijzigt de bestandsgrootte van het aan de toegangshandle gekoppelde bestand naar newSize bytes lang. Als newSize groter is dan de huidige bestandsgrootte, wordt het bestand aangevuld met null bytes; anders wordt het bestand afgekapt.
  • getSize() : Retourneert de grootte van het bestand dat aan de toegangshandle is gekoppeld in bytes.
  • flush() : Zorgt ervoor dat de inhoud van het bestand dat aan de toegangshandle is gekoppeld, alle wijzigingen bevat die via write() zijn aangebracht.
  • close() : Spoelt de toegangshandle en sluit deze vervolgens. Het sluiten van een toegangshandle schakelt alle verdere bewerkingen erop uit en heft de vergrendeling op van de invoer die aan de toegangshandle is gekoppeld.
// 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 wijzigen van methoden van asynchroon naar synchroon een web-exposed wijziging is met potentiële problemen. Hoewel het gebruik van await in synchrone methoden een no-op is, zal elk gebruik van Promise.then() problemen opleveren. Als u een then() aanroep koppelt aan het resultaat van een van de voorheen asynchrone en nu synchrone methoden, moet u uw code aanpassen.

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