webrtc-chord

    1.0.0 • Public • Published

    webrtc-chord

    DISCLAIMER: Implementing a full Chord algorithm proved to be an unviable option (due to the high number of data-channels that had to be open inside a browser), in order to overcome this, I've come up with webrtc-explorer, and adaptable Chord like implementation. I'll no longer support this module

    It enables you to communicate between several browsers in a p2p/decentralized fashion.

    How to create a node

    webrtc-chord uses browserify

    var chord = require('webrtc-chord');
    
    var nodeConfig = {
      signalingURL: 'http://url-to-webrtc-chord-signaling-server.com'
    };
    var node = chord.createNode(nodeConfig);
    
    node.e.on('ready', function (){
      // this node is ready
    });
    

    How to communicate with other nodes

    Send a message to a Node responsible for the ID 1af17e73721dbe0c40011b82ed4bb1a7dbe3ce29

    var nodeToSend = '1af17e73721dbe0c40011b82ed4bb1a7dbe3ce29'; 
    // 160 bit ID represented in hex(`git_sha1` module is a good way to generate these)
    
    node.send(destID: '1af17e73721dbe0c40011b82ed4bb1a7dbe3ce29', 
              data: 'hey, how are you doing');
    

    Send a message to this node sucessor (next node in Chord)

    node.sendSucessor(data: 'hey, how are you doing');
    

    Receive a message

    node.e.on('message', function(message) {
      console.log(message);
    });
    

    Other options

    finger table updates

    • use tracing for this

    logging

    add the logging flag to your nodeConfig

    var nodeConfig = {
      //...
      logging: true
      //...
    };
    

    tracing

    In order to understand the events which happen on the webrtc-chord network and their order, webrtc-chord using a tracing module (canela).

    To activate it, simply add tracing to your config:

    var nodeConfig = {
      //...
      tracing: true
      //...
    };
    

    Then, the returned EventEmitter from .createChord() will also emit the events described on the tracing DSL. Each trace has a specific id per tag, so it is easy to identify them automatically.

    tracing DSL

    tag: signaling

    • id: 1 description: node connected to signaling server
      example:
    {
      id: 1,
      description: 'node connected to signaling server'
    }
    
    • id: 2 description: there are no other nodes present in the ring example:
    • id: 3 description: received a request to rail new peer into the ring example:
    • id: 4 description: connected to railing peer example:
    • id: 5 description: connected to sucessor example:
    • id: 6 description: connected to entrace :number: of finger table example:

    tag: finger-table

    • id: 1 description: update
      example:

    tag: message

    • id: 1 description: receive
      example:
    • id: 2 description: sent
      example:
    • id: 3 description: forward
      example:

    TODO:

    • Support node leaves (for example, when a browser closes a tab);
    • If the socket.io server goes down and we are already connected, don't do the bootstrap process all over again due to .on('connect') event
    • Make the state of the ring on webrtc-chord-signalling-server persistent
    • Improve vastly the quality of log messages
    • Implement the process for a Node to fill his finger table

    Install

    npm i webrtc-chord

    DownloadsWeekly Downloads

    1

    Version

    1.0.0

    License

    MIT

    Last publish

    Collaborators

    • daviddias