đź“ťFigma
Figma brings Collaborative Editing features for designers.
Blog:
How Figma’s multiplayer technology works
It is inspired by CRDTs, but does not use ones. Instead, it lifts off some constraints and adapts algorithms to its own environment. e.g., Figma has a centralized server to coordinate update.
Internally, Figma is a tree editor.
Each node has an ID and a set of properties.
Each client must be able to generate globally unique IDs.
Parenting relationship is organized as children storing a “parent” property.
Reordering/reparenting is implemented as changing this “parent” property.
Delete + re-insert with different ID is not viable because concurrent changes still need to be synced.
The general flow is that server maintains a LWW (last writer win) registers for properties (where “last writer” means last client sending an update).
When a client connects to server, servers sends the whole state to the client. Then, they exchange changes.
If client was disconnected, it can continue editing offline. When client is re-connected, it downloads the whole document again and re-applies his changes.
Server does not store history or any tombstones. Clients store their history and are responsible for restoring previous state.
Realtime editing of ordered sequences
Figma assigns an fractional “order” value to each node. The order is determined by sorting nodes by this property.
Moving a node is implemented by setting the property to the average of two new adjacent nodes.
They use arbitrary-precision fraction instead of 64-bit doubles to allow any number of edits.
Fraction is stored as string. All ASCII range is used, not only 0-9 digits (base 95 numbers)
Index length can grow infinitely large but that rarely happens in practice.
If two client assign the same index for two nodes. The server generates a new index for the second client.