#crdt #wasm #yrs

ywasm

High performance implementation of the Yjs CRDT

36 releases (13 breaking)

0.16.4 Mar 9, 2023
0.16.1 Jan 31, 2023
0.14.1 Dec 14, 2022
0.13.0 Nov 23, 2022
0.1.0 Oct 14, 2021

#248 in WebAssembly

Download history 5/week @ 2022-11-30 26/week @ 2022-12-07 56/week @ 2022-12-14 1/week @ 2022-12-21 8/week @ 2022-12-28 40/week @ 2023-01-04 28/week @ 2023-01-11 22/week @ 2023-01-18 58/week @ 2023-01-25 77/week @ 2023-02-01 149/week @ 2023-02-08 190/week @ 2023-02-15 11/week @ 2023-02-22 9/week @ 2023-03-01 19/week @ 2023-03-08 6/week @ 2023-03-15

79 downloads per month

MIT license

155KB
3K SLoC

Ywasm

This project is a wrapper around Yrs and targets Web Assembly bindings.

It's a library used on collaborative document editing using Conflict-free Replicated Data Types. This enables to provide a shared document editing experience on a client devices without explicit requirement for hosting a single server - CRDTs can resolve potential update conflicts on their own with no central authority - as well as provide first-class offline editing capabilities, where document replicas are modified without having connection to each other, and then synchronize automatically once such connection is enabled.

Documentation

Example

import {YDoc, encodeStateVector, encodeStateAsUpdate, applyUpdate} from 'ywasm';

YDoc.prototype.transact = callback => {
    const txn = this.beginTransaction()
    try {
        return callback(txn)
    } finally {
        txn.free()
    }
}

const doc = new YDoc()
const text = doc.getText('name')

// append text to our collaborative document
text.insert(txn, 0, 'hello world')

// simulate update with remote peer
const remoteDoc = new YDoc()
const remoteText = remoteDoc.getText('name')

// in order to exchange data with other documents 
// we first need to create a state vector
const remoteSV = encodeStateVector(remoteDoc)
// now compute a differential update based on remote document's state vector
const update = encodeStateAsUpdate(doc, remoteSV)
// both update and state vector are serializable, we can pass them over the wire
// now apply update to a remote document
applyUpdate(remoteDoc, update)

const str = remoteText.toString(txn)
console.log(str)

Dependencies

~11MB
~69K SLoC