Introduction

Lorsque vous travaillez sur des projets informatiques, vous finissez par avoir une histoire de bogue préférée. Cet article raconte l'histoire d'un bogue particulièrement intéressant que j'ai rencontré lors de la migration d'un éditeur legacy vers une expérience collaborative en temps réel.

Contexte Technique

Le bogue se produisait lorsque deux emoji étaient insérés dans le texte, mais aucun ne pouvait être sauvegardé. Le problème était dû à la façon dont les caractères Unicode sont stockés en mémoire, en utilisant des unités de code de 16 bits. Les caractères ASCII et certains symboles courants peuvent être représentés par une seule unité de code, mais les emoji nécessitent souvent deux unités de code, appelées paire de substituts.

Les graphèmes, qui sont les caractères tels que les humains les perçoivent, peuvent être composés de plusieurs points de code et unités de code. Par exemple, l'emoji d'un astronaute femme est composé de trois points de code et cinq unités de code.

Analyse et Implications

Le problème était causé par la méthode slice() de JavaScript, qui peut diviser une paire de substituts en deux unités de code distinctes, ce qui peut entraîner des erreurs lors de la sauvegarde des données. Le bogue était difficile à diagnostiquer car il ne se produisait que dans des circonstances très spécifiques, telles que l'insertion d'un caractère entre deux emoji.

La bibliothèque Yjs, que nous utilisions pour la synchronisation en temps réel, dépendait d'une bibliothèque utilitaire appelée lib0, qui utilisait la méthode slice() de JavaScript. Lorsqu'une opération CRDT se produisait entre les deux moitiés d'une paire de substituts, lib0 produisait une chaîne avec un substitut orphelin, ce qui entraînait une erreur lors de la sauvegarde des données.

Perspective

Le bogue a été résolu en ajoutant une écouteur d'événements pour les erreurs non interceptées et en affichant un message d'erreur à l'utilisateur lorsque le problème se produisait. Nous avons également ajouté une fonctionnalité de sauvegarde hors ligne pour permettre aux utilisateurs de continuer à travailler même en cas de déconnexion.

Il est important de noter que les bogues de ce type peuvent être difficiles à diagnostiquer et à résoudre, mais en comprenant les mécanismes sous-jacents de la représentation des caractères Unicode et de la synchronisation en temps réel, nous pouvons mieux anticiper et résoudre ces problèmes.