Eventually-consistent, conflict-free replicated data types (CRDT) implemented using IPFS and LevelDB.
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 os = require('os');
const path = require('path');
const uuid = require('uuid');
const level = require('level');
const ipfsAPI = require('ipfs-http-client');
const { IpfsObservedRemoveMap } = require('ipfs-observed-remove-level');
const run = async () => {
const location = path.join(os.tmpdir(), uuid.v4());
const db = level(location, { valueEncoding: 'json' });
// 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(db, ipfs1, topic, [], { namespace:'alice' });
const bob = new IpfsObservedRemoveMap(db, ipfs2, topic, [], { namespace:'bob' });
alice.on('set', (key, value) => {
console.log(key, value); // logs [a, 1], [b, 2]
});
await alice.set('a', 1);
await bob.set('b', 2);
// Later
await alice.get('b'); // 2
await bob.get('a'); // 1
}
yarn add ipfs-observed-remove-level
- constructor
- ipfsSync
- getIpfsHash
- getIpfsHashes
- ipfsPeerCount
- shutdown
- IpfsObservedRemoveSet#readyPromise
Create an observed-remove CRDT.
-
db
Object -
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.
Stores and returns an IPFS hash of the current 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.
-
db
Object -
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.
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>