mm-services-kademlia

Kademlia DHT service for MicroMinion platform

Usage no npm install needed!

<script type="module">
  import mmServicesKademlia from 'https://cdn.skypack.dev/mm-services-kademlia';
</script>

README

mm-services-kademlia

DHT to store connection information for remote peers and act as generic key/value store

works with MicroMinion platform

Initialization

var MicroMinionPlatform = require('mm-platform')
var Kademlia = require('mm-services-kademlia')
var kadfs = require('kad-fs')
var path = require('path')

var storageDir = './data'

var platform = new MicroMinionPlatform({
  storage: kadfs(path.join(storageDir, 'platform'))
})

var kademlia = new Kademlia({
  platform: platform,
  storage: kadfs(path.join(storageDir, 'dht'))
  seeds: null //Extra seeds
})

Messaging API

Data structures

nodeInfo: Javascript object with node information

  • boxId: base64 encoded public encryption key used by nacl
  • signId: base64 encoded public signature key used by nacl
  • connectionInfo: javascript dictionary with 1tp connection information

Published messages

self.transports.nodeInfo

Publishes connection information for remote node

var MicroMinionPlatform = require('mm-platform')
var Kademlia = require('mm-services-kademlia')
var kadfs = require('kad-fs')
var path = require('path')

var storageDir = './data'

var platform = new MicroMinionPlatform({
  storage: kadfs(path.join(storageDir, 'platform'))
})

var kademlia = new Kademlia({
  platform: platform,
  storage: kadfs(path.join(storageDir, 'dht'))
  seeds: null //Extra seeds
})

platform.messaging.on('self.transports.nodeInfo', function(topic, sender, nodeInfo) {
  console.log(topic) // 'self.transports.nodeInfo'
  console.log(sender) // 'local'
  console.log(nodeInfo) // {boxId: <boxId>, signId: <signId>, connectionInfo: <1tp connectionInfo>}
})

self.transports.requestBootstrapNodeInfo

Requests bootstrap nodes in order to start DHT (in addition to potential seed nodes)

var MicroMinionPlatform = require('mm-platform')
var Kademlia = require('mm-services-kademlia')
var kadfs = require('kad-fs')
var path = require('path')

var storageDir = './data'

var platform = new MicroMinionPlatform({
  storage: kadfs(path.join(storageDir, 'platform'))
})

var kademlia = new Kademlia({
  platform: platform,
  storage: kadfs(path.join(storageDir, 'dht'))
  seeds: null //Extra seeds
})

//local nodeInfo. This method is used for sending remote nodeInfo
var nodeInfo = {
  boxId: platform.directory.identity.getBoxId()
  signId: platform.directory.identity.getSignId()
  connectionInfo: platform.directory._connectionInfo
}

platform.messaging.on('self.transports.requestBootstrapNodeInfo', function(topic, sender, data) {
  platform.messaging.send('transports.nodeInfoBootstrap', 'local', nodeInfo)
})

self.directory.getReply

Reply to previously received get message

var MicroMinionPlatform = require('mm-platform')
var Kademlia = require('mm-services-kademlia')
var kadfs = require('kad-fs')
var path = require('path')

var storageDir = './data'

var platform = new MicroMinionPlatform({
  storage: kadfs(path.join(storageDir, 'platform'))
})

var kademlia = new Kademlia({
  platform: platform,
  storage: kadfs(path.join(storageDir, 'dht'))
  seeds: null //Extra seeds
})

platform.messaging.on('self.directory.getReply', function(topic, sender, getReply) {
  console.log(getReply.key)
  console.log(getReply.value)
})

platform.messaging.send('directory.get', 'local', 'KeyToRetrieve')

Subscribed messages

self.transports.myNodeInfo

Uses our own node information to add to DHT

You'll never need to send this message since this is triggered from the platform object

var MicroMinionPlatform = require('mm-platform')
var Kademlia = require('mm-services-kademlia')
var kadfs = require('kad-fs')
var path = require('path')

var storageDir = './data'

var platform = new MicroMinionPlatform({
  storage: kadfs(path.join(storageDir, 'platform'))
})

var kademlia = new Kademlia({
  platform: platform,
  storage: kadfs(path.join(storageDir, 'dht'))
  seeds: null //Extra seeds
})

var nodeInfo = {
  boxId: platform.directory.identity.getBoxId()
  signId: platform.directory.identity.getSignId()
  connectionInfo: platform.directory._connectionInfo
}

platform.messaging.send('transports.myNodeInfo', 'local', nodeInfo)

self.transports.nodeInfoBootstrap

Bootstrap messages with nodeInfo (to allow DHT to function even if not connected to the Internet by using e.g., other nodes on local network to form DHT).

var MicroMinionPlatform = require('mm-platform')
var Kademlia = require('mm-services-kademlia')
var kadfs = require('kad-fs')
var path = require('path')

var storageDir = './data'

var platform = new MicroMinionPlatform({
  storage: kadfs(path.join(storageDir, 'platform'))
})

var kademlia = new Kademlia({
  platform: platform,
  storage: kadfs(path.join(storageDir, 'dht'))
  seeds: null //Extra seeds
})

//local nodeInfo. This method is used for sending remote nodeInfo
var nodeInfo = {
  boxId: platform.directory.identity.getBoxId()
  signId: platform.directory.identity.getSignId()
  connectionInfo: platform.directory._connectionInfo
}

platform.messaging.on('self.transports.requestBootstrapNodeInfo', function(topic, sender, data) {
  platform.messaging.send('transports.nodeInfoBootstrap', 'local', nodeInfo)
})

self.transports.requestNodeInfo

Requests node info from directory services (like DHT)

var MicroMinionPlatform = require('mm-platform')
var Kademlia = require('mm-services-kademlia')
var kadfs = require('kad-fs')
var path = require('path')

var storageDir = './data'

var platform = new MicroMinionPlatform({
  storage: kadfs(path.join(storageDir, 'platform'))
})

var kademlia = new Kademlia({
  platform: platform,
  storage: kadfs(path.join(storageDir, 'dht'))
  seeds: null //Extra seeds
})

platform.messaging.on('self.transports.nodeInfo', function(topic, sender, nodeInfo) {
  console.log(topic) // 'self.transports.nodeInfo'
  console.log(sender) // 'local'
  console.log(nodeInfo) // nodeInfo object
})

var signId = 'NeedToImplement' //signId (base64 encoded) for node where we want to get full nodeInfo

platform.messaging.send('transports.requestNodeInfo', 'local', signId)

self.directory.get

get key/value pair from DHT

var MicroMinionPlatform = require('mm-platform')
var Kademlia = require('mm-services-kademlia')
var kadfs = require('kad-fs')
var path = require('path')

var storageDir = './data'

var platform = new MicroMinionPlatform({
  storage: kadfs(path.join(storageDir, 'platform'))
})

var kademlia = new Kademlia({
  platform: platform,
  storage: kadfs(path.join(storageDir, 'dht'))
  seeds: null //Extra seeds
})

platform.messaging.on('self.directory.getReply', function(topic, sender, getReply) {
  console.log(getReply.key)
  console.log(getReply.value)
})

platform.messaging.send('directory.get', 'local', 'KeyToRetrieve')

self.directory.put

add key/value pair to DHT

var MicroMinionPlatform = require('mm-platform')
var Kademlia = require('mm-services-kademlia')
var kadfs = require('kad-fs')
var path = require('path')

var storageDir = './data'

var platform = new MicroMinionPlatform({
  storage: kadfs(path.join(storageDir, 'platform'))
})

var kademlia = new Kademlia({
  platform: platform,
  storage: kadfs(path.join(storageDir, 'dht'))
  seeds: null //Extra seeds
})

platform.messaging.send('directory.put', 'local', {key: 'KeyToRetrieve', value: 'ValueToRetrieve'})