Eventually-consistent, conflict-free replicated data types (CRDT) implemented using IPFS and native Map
and Set
objects.
This module and the IPFS PubSub system are experimental. If you encounter an issue, fork the repository, write tests demonstrating the issue, and create a pull request.
const ipfsAPI = require('ipfs-http-client');
const { IpfsObservedRemoveSet } = require('ipfs-observed-remove');
// IPFS nodes with PubSub enabled
const ipfs1 = ipfsAPI('/ip4/127.0.0.1/tcp/5001');
const ipfs2 = ipfsAPI('/ip4/127.0.0.1/tcp/5002');
const topic = "CRDT_SET";
const alice = new IpfsObservedRemoveSet(ipfs1, topic);
const bob = new IpfsObservedRemoveSet(ipfs2, topic);
alice.on('add', (value) => {
console.log(value); // logs foo, bar
});
alice.add('foo');
bob.add('bar');
// Later
alice.has('bar'); // true
bob.has('foo'); // true
const ipfsAPI = require('ipfs-http-client');
const { IpfsObservedRemoveMap } = require('ipfs-observed-remove');
// IPFS nodes with PubSub enabled
const ipfs1 = ipfsAPI('/ip4/127.0.0.1/tcp/5001');
const ipfs2 = ipfsAPI('/ip4/127.0.0.1/tcp/5002');
const topic = "CRDT_MAP";
const alice = new IpfsObservedRemoveMap(ipfs1, topic);
const bob = new IpfsObservedRemoveMap(ipfs2, topic);
alice.on('set', (key, value) => {
console.log(key, value); // logs [a, 1], [b, 2]
});
alice.set('a', 1);
bob.add('b', 2);
// Later
alice.get('b'); // 2
bob.get('a'); // 1
yarn add ipfs-observed-remove
Create an observed-remove CRDT.
-
ipfs
Object? Object implementing the core IPFS API, most likely a js-ipfs or ipfs-http-client object. -
topic
String? IPFS pubub topic to use in synchronizing the CRDT. -
entries
Iterable<V> Iterable of initial values (optional, default[]
) -
options
Object (optional, default{}
)
Publish an IPFS hash of an array containing all of the object's insertions and deletions.
Return a sorted array containing all of the set's insertions and deletions.
Stores and returns an IPFS hash of the current insertions and deletions
Current number of IPFS pubsub peers.
Returns number
Gracefully shutdown
Returns void
Resolves when IPFS topic subscriptions are confirmed.
Type: Promise<void>
Create an observed-remove CRDT.
-
ipfs
Object? Object implementing the core IPFS API, most likely a js-ipfs or ipfs-http-client object. -
topic
String? IPFS pubub topic to use in synchronizing the CRDT. -
entries
Iterable<V> Iterable of initial values (optional, default[]
) -
options
Object (optional, default{}
)
Publish an IPFS hash of an array containing all of the object's insertions and deletions.
Return a sorted array containing all of the set's insertions and deletions.
Stores and returns an IPFS hash of the current insertions and deletions
Current number of IPFS pubsub peers.
Returns number
Gracefully shutdown
Returns void
Resolves when IPFS topic subscriptions are confirmed.
Type: Promise<void>