node package manager



Keywords: distributed systems, collaborative editing, CRDT, LSEQ allocation strategy, unique identifiers

This project aims to provide an implementation of a CRDT-based array using the allocation strategy LSEQ. Thus, the array structure allows distributed updates without having to manage the difficult task of solving conflict resolution.


$ npm install lseqarray


var LSEQArray = require('lseqarray');
// #1 creating the array 
// site: our unique site identifier 
var lseqArray = new LSEQArray(site);
// #2a inserting an element at the targeted index 
// ei: a couple {_e: the element, _i: its unique identifier} 
var ei = lseqArray.insert("A",0);
// #2b inserting an element that comes from a remote insert 
// re: the element remotely inserted 
// ri: the unique identifier of the element 
var index = lseqArray.applyInsert(re, ri);
// #3a deleting the element at targeted index 
// i: the unique identifier of the element at the index 
var i = lseqArray.remove(0);
// #3b deleting the element with its unique identifier "ri" 
// ri: the unique identifier of the element to delete 
var index = lseqArray.applyRemove(ri);
// #4 accessing the length of the array 
var length = lseqArray.length;


SandEdit is a distributed and decentralized collaborative editor using LSEQArray. It has an optionnal web front end. Thus, one can simply trigger the events of a Replica to build its distributed array.


In this implementations, each cell of the javascript array contains an element and its unique and immutable identifier. An alternative is the tree-based structure of the LSEQ-based array accessible at Flood-it.

Learn more about CRDTs: A comprehensive study of Convergent and Commutative Replicated Data Types

Learn more about LSEQ: LSEQ: an Adaptive Structure for Sequences in Distributed Collaborative Editing