a1300 b0f124b5ff fix: pubsub configuration (#404)
* fix: add pubsub default config (#401)

License: MIT
Signed-off-by: Matthias Knopp <matthias-knopp@gmx.net>

* docs: add default pubsub config to README (#401)

License: MIT
Signed-off-by: Matthias Knopp <matthias-knopp@gmx.net>

* fix: pass config to provided PubSub (#401)

License: MIT
Signed-off-by: Matthias Knopp <matthias-knopp@gmx.net>

* docs: adapt pubsub/example for new config (#401)

License: MIT
Signed-off-by: Matthias Knopp <matthias-knopp@gmx.net>

* Update examples/pubsub/README.md

Co-Authored-By: Jacob Heun <jacobheun@gmail.com>

* test: add pubsub config tests (#401)

License: MIT
Signed-off-by: Matthias Knopp <matthias-knopp@gmx.net>
2019-08-19 17:06:08 +02:00
..
2019-08-19 17:06:08 +02:00
2019-08-19 17:06:08 +02:00

Publish Subscribe

Publish Subscribe is also included on the stack. Currently, we have two PubSub implementation available libp2p-floodsub and libp2p-gossipsub, with many more being researched at research-pubsub.

We've seen many interesting use cases appear with this, here are some highlights:

1. Setting up a simple PubSub network on top of libp2p

For this example, we will use MulticastDNS for automatic Peer Discovery. This example is based the previous examples found in Discovery Mechanisms. You can find the complete version at 1.js.

Using PubSub is super simple, you only need to provide the implementation of your choice and you are ready to go. No need for extra configuration.

node1.once('peer:connect', (peer) => {
  console.log('connected to %s', peer.id.toB58String())

  series([
    // node1 subscribes to "news"
    (cb) => node1.pubsub.subscribe(
      'news',
      (msg) => console.log(`node1 received: ${msg.data.toString()}`),
      cb
    ),
    (cb) => setTimeout(cb, 500),
    // node2 subscribes to "news"
    (cb) => node2.pubsub.subscribe(
      'news',
      (msg) => console.log(`node2 received: ${msg.data.toString()}`),
      cb
    ),
    (cb) => setTimeout(cb, 500),
    // node2 publishes "news" every second
    (cb) => {
      setInterval(() => {
        node2.pubsub.publish(
          'news',
          Buffer.from('Bird bird bird, bird is the word!'),
          (err) => {
            if (err) { throw err }
          }
        )
      }, 1000)
      cb()
    },
  ], (err) => {
    if (err) { throw err }
  })
})

The output of the program should look like:

> node 1.js
connected to QmWpvkKm6qHLhoxpWrTswY6UMNWDyn8hN265Qp9ZYvgS82
node2 received: Bird bird bird, bird is the word!
node1 received: Bird bird bird, bird is the word!
node2 received: Bird bird bird, bird is the word!
node1 received: Bird bird bird, bird is the word!

You can change the pubsub emitSelf option if you don't want the publishing node to receive its own messages.

const defaults = {
  config: {
    peerDiscovery: {
      mdns: {
        interval: 2000,
        enabled: true
      }
    },
    pubsub: {
      enabled: true,
      emitSelf: false
    }
  }
}

2. Future work

libp2p/IPFS PubSub is enabling a whole set of Distributed Real Time applications using CRDT (Conflict-Free Replicated Data Types). It is still going through heavy research (and hacking) and we invite you to join the conversation at research-CRDT. Here is a list of some of the exciting examples: