crdt_lf 0.7.1 copy "crdt_lf: ^0.7.1" to clipboard
crdt_lf: ^0.7.1 copied to clipboard

Conflict-free replicated data type (CRDT) - Local-first implementation provided in dart

CRDT LF #

coverage License: MIT

A Conflict-free Replicated Data Type (CRDT) implementation in Dart. This library provides solutions for:

Features #

  • ⏱️ Hybrid Logical Clock: Uses HLC for causal ordering of operations
  • 🔄 Automatic Conflict Resolution: Automatically resolves conflicts in a CRDT
  • 📦 Local Availability: Operations are available locally as soon as they are applied

Getting Started #

Add this to your package's pubspec.yaml file:

dependencies:
  crdt_lf: ^1.0.0

Usage #

Basic Usage #

import 'package:crdt_lf/crdt_lf.dart';

void main() {
  // Create a new document
  final doc = CRDTDocument(
    peerId: PeerId.parse('45ee6b65-b393-40b7-9755-8b66dc7d0518'),
  );

  // Create a text handler
  final text = CRDTFugueTextHandler(doc, 'text1');

  // Insert text
  text.insert(0, 'Hello');

  // Delete text
  text.delete(0, 2); // Deletes "He"

  // Get current value
  print(text.value); // Prints "llo"
}

Dart Distributed Collaboration Example #

Flutter Distributed Collaboration Example #

Sync #

A sync library is available in the crdt_socket_sync package. And it's used to synchronize the CRDT state between peers. More info in the README of the sync package.

A flutter example is available in the flutter_example and provide a synced version of the "Flutter Distributed Collaboration" Example.

sync_server_multi_client

Architecture #

The library is built:

  • above the hlc_dart package.
  • around several key components:

CRDTDocument #

The main document class that manages the CRDT state and handles synchronization between peers.

Handlers #

Handlers are the core components of the library. They manage the state of a specific type of data and provide operations to modify it.

  • CRDTFugueTextHandler: Handles text editing with the Fugue algorithm.
  • CRDTListHandler: Handles list editing.
  • CRDTTextHandler: Handles text editing.
  • CRDTMapHandler: Handles map editing.
final doc = CRDTDocument(
  peerId: PeerId.parse('45ee6b65-b393-40b7-9755-8b66dc7d0518'),
);
final list = CRDTListHandler(doc, 'todo-list');
list.insert(0, 'Buy apples');
list.insert(1, 'Buy milk');
list.delete(0);
print(list.value); // Prints "[Buy milk]"

Every handler can be found in the handlers folder.

DAG #

A Directed Acyclic Graph that maintains the causal ordering of operations.

Change #

Represents a modification to the CRDT state, including operation ID, dependencies, and timestamp.

Frontiers #

A structure that manages the frontiers (latest operations) of the CRDT.

Snapshot #

A snapshot of the CRDT state, including the version vector and the data.

Project Status #

This library is currently in progress and under active development. While all existing functionality is thoroughly tested, we are continuously working on improvements and new features.

Roadmap #

A roadmap is available in the project page. The roadmap provides a high-level overview of the project's goals and the current status of the project.

Contributing #

We welcome contributions! Whether you want to:

  • Fix bugs
  • Add new features
  • Improve documentation
  • Optimize performance
  • Or something else

Feel free to:

  1. Check out our GitHub repository
  2. Look at the open issues
  3. Submit a Pull Request

Acknowledgments #

Packages #

Other bricks of the crdt "system" are:

3
likes
160
points
252
downloads

Publisher

verified publishermattiapispisa.it

Weekly Downloads

Conflict-free replicated data type (CRDT) - Local-first implementation provided in dart

Homepage
Repository (GitHub)

Topics

#crdt #local-first #fugue #hlc

Documentation

API reference

License

MIT (license)

Dependencies

crypto, hlc_dart

More

Packages that depend on crdt_lf