Home

Awesome

merkle-dag

Merkle DAG on top of LevelDB

npm install merkle-dag

Usage

var merkle = require('merkle-dag')
var db = require('level')('test.db')

var graph = merkle(db)

// add a node with value "hello" and no links
graph.add(null, 'hello', function(err, node) {
  console.log('added:', node)
  // add a node with value "world" linking to the "hello" node
  graph.add([node.key], 'world', function(err, node) {
    console.log('added:', node)
    // retrive a node
    graph.get(node.key, function(err, node) {
      console.log('retrieved:', node)
    })
  })
})

API

var node = graph.add(links, value, [callback])

Add a new node to the graph. links should be an array of keys of other nodes this node links to. If this node does not link to anything pass in null or an empty array.

The links must be present in the graph or else an error will be passed to the callback. The node that will be inserted is returned (and passed to the callback).

graph.get(key, callback)

Lookup a node using its key.

graph.changes([options], [callback])

Everytime a node is inserted a reference to it is added to a local change feed. The order of this feed guarantees that all linked nodes come before a node.

var changes = graph.changes()

changes.on('data', function(node) {
  console.log('change #'+node.change, node)
})

Optionally you can provide a callback which will be called with a list of changes

graph.changes(function(err, nodes) {
  console.log('changes:', nodes)
})

Pass in options.since = change to start the change feed from a given change index

var changes = graph.changes({since:100}) // only get changes > 100

The change stream also support a realtime mode using options.live

var changes = graph.changes({live:true}) // will never end but keep emitting data

graph.heads([options], [callback])

To get the heads of the graph (nodes that no one has a link to) use graph.heads()

// graph.heads() returns a stream of hashes of the heads
var heads = graph.heads()

heads.on('data', function(node) {
  console.log('head:', node)
})

Optionally you can provide a callback which will be called with a list of heads

graph.heads(function(err, nodes) {
  console.log(nodes) // an array of heads
})

Options include

{
  limit: 10     // only get 10 heads at max
  reverse: true // get them in reverse order
}

License

MIT