API Web Locks
(developer.mozilla.org)- L’API Web Locks permet à un onglet ou à un web worker d’acquérir un verrou de manière asynchrone, d’exécuter une tâche, puis de libérer le verrou
- Tant que le verrou est maintenu, aucun autre script du même origin ne peut acquérir ce même verrou, ce qui permet de coordonner en toute sécurité les ressources entre plusieurs onglets ou workers
- Disponible uniquement dans un contexte sécurisé (HTTPS), et utilisable dans les Web Workers
Concepts clés et mode d’utilisation
- Un verrou (lock) est une ressource abstraite identifiée par un nom défini par l’application web
- Par exemple, lors d’une synchronisation entre IndexedDB et le réseau dans plusieurs onglets, on peut utiliser un verrou nommé
my_net_db_syncpour faire en sorte qu’un seul onglet exécute la synchronisation à la fois - Flux d’utilisation :
- Demander le verrou
- Exécuter la tâche asynchrone
- À la fin de la tâche, le verrou est libéré automatiquement
Exemple de code
navigator.locks.request("my_resource", async (lock) => {
await do_something();
await do_something_else();
});
- Tant que le verrou est maintenu, les autres demandes portant sur le même verrou sont ajoutées à une file d’attente, puis la première est traitée une fois le verrou libéré
Options
- mode : le mode par défaut est
exclusive(exclusif), mais le modeshared(partagé) est également possible.exclusiven’autorise qu’une seule demande, tandis quesharedpeut en accepter plusieurs - ifAvailable : si le verrou ne peut pas être acquis immédiatement, la demande échoue et le callback renvoie
null - steal : libère un verrou existant du même nom et traite la nouvelle demande en priorité
- signal : permet d’interrompre la demande via
AbortSignal(par exemple pour implémenter un timeout)
Monitoring
- Vous pouvez consulter l’état actuel des verrous de l’origin avec
navigator.locks.query() - C’est utile pour le débogage : on peut voir quels verrous sont maintenus et quels verrous ont été demandés
Utilisation avancée
- Pour contrôler explicitement le moment où la tâche asynchrone est considérée comme terminée, il est possible de renvoyer une Promise
let resolve;
const p = new Promise((res) => { resolve = res });
navigator.locks.request("my_resource", (lock) => p);
- Le verrou est libéré lors de l’appel à
resolve()
Prévention des interblocages (deadlocks)
- Un interblocage se produit lorsque différentes demandes se bloquent mutuellement à cause d’un problème d’ordre, rendant toute progression impossible
- Par exemple, si l’onglet 1 détient le verrou A et l’onglet 2 détient le verrou B, puis que l’onglet 1 demande le verrou B pendant que l’onglet 2 demande le verrou A, ils se retrouvent à s’attendre mutuellement
- Pour éviter cela :
- ne pas imbriquer les demandes de verrou
- respecter un ordre cohérent dans les demandes de verrou
- définir un timeout afin d’interrompre la demande
Interface
- Lock : fournit le nom et le mode du verrou demandé
- LockManager : fournit des méthodes pour demander un nouveau verrou ou consulter des verrous existants
- Une instance peut être obtenue via
navigator.locks WorkerNavigator.locksest disponible dans les Web Workers
Spécification et prise en charge par les navigateurs
- Spécification : Web Locks API
- Compatibilité navigateur : prise en charge limitée à certains navigateurs ; la disponibilité dans les navigateurs récents peut être vérifiée sur MDN
L’avis de GN⁺
- L’API Web Locks est utile pour résoudre les problèmes de synchronisation des ressources dans un environnement asynchrone
- Comme des interblocages peuvent survenir, son utilisation demande de la prudence, et il faut envisager des mécanismes de sécurité comme les timeouts
- Le mode shared peut améliorer les performances pour les tâches en lecture seule, mais il reste nécessaire d’examiner soigneusement les risques de conditions de concurrence
- Cette API peut servir d’alternative pour résoudre les problèmes de synchronisation liés à
localStorageou IndexedDB
Aucun commentaire pour le moment.