libp2p swarm implementation in JavaScript
$ npm install libp2p-swarm
libp2p swarm implementation in JavaScript.
libp2p-swarm is a connection abstraction that is able to leverage several transports and connection upgrades, such as congestion control, channel encryption, the multiplexing of several streams in one connection, and more. It does this by bringing protocol multiplexing to the application level (instead of the traditional Port level) using multicodec and multistream.
libp2p-swarm is used by libp2p but it can be also used as a standalone module.
libp2p-swarm is available on npm and so, like any other npm module, just:
> npm install libp2p-swarm --save
And use it in your Node.js code as:
const Swarm = require('libp2p-swarm')
const sw = new Swarm(peerInfo [, peerBook])
peerInfo is a PeerInfo object that represents the peer creating this swarm instance.
swarm.transport.add(key, transport, options, callback)
libp2p-swarm expects transports that implement interface-transport. For example libp2p-tcp.
key
- the transport identifier.transport
-options
-callback
-swarm.transport.dial(key, multiaddrs, callback)
Dial to a peer on a specific transport.
key
multiaddrs
callback
swarm.transport.listen(key, options, handler, callback)
Set a transport to start listening mode.
key
options
handler
callback
swarm.transport.close(key, callback)
Close the listeners of a given transport.
key
callback
swarm.connection.addUpgrade()
A connection upgrade must be able to receive and return something that implements the interface-connection specification.
WIP
swarm.connection.addStreamMuxer(muxer)
Upgrading a connection to use a stream muxer is still considered an upgrade, but a special case since once this connection is applied, the returned obj will implement the interface-stream-muxer spec.
muxer
swarm.connection.reuse()
Enable the identify protocol.
swarm.connection.crypto([tag, encrypt])
Enable a specified crypto protocol. By default no encryption is used, aka plaintext
. If called with no arguments it resets to use plaintext
.
You can use for example libp2p-secio like this
const secio = require('libp2p-secio')
swarm.connection.crypto(secio.tag, secio.encrypt)
swarm.connection.enableCircuitRelay(options)
Enable circuit relaying.
options
swarm.dial(peer, protocol, callback)
dial uses the best transport (whatever works first, in the future we can have some criteria), and jump starts the connection until the point where we have to negotiate the protocol. If a muxer is available, then drop the muxer onto that connection. Good to warm up connections or to check for connectivity. If we have already a muxer for that peerInfo, then do nothing.
peer
: can be an instance of [PeerInfo][], [PeerId][] or [multiaddr][]protocol
callback
swarm.hangUp(peer, callback)
Hang up the muxed connection we have with the peer.
peer
: can be an instance of [PeerInfo][], [PeerId][] or [multiaddr][]callback
swarm.listen(callback)
Start listening on all added transports that are available on the current peerInfo
.
swarm.handle(protocol, handlerFunc, matchFunc)
Handle a new protocol.
protocol
handlerFunc
- function called when we receive a dial on protocol. Signature must be
function (protocol, conn) {}`matchFunc
- matchFunc for multistream-selectswarm.unhandle(protocol)
Unhandle a protocol.
protocol
swarm.close(callback)
Close all the listeners and muxers.
callback
pull-streams
We expose a streaming interface based on pull-streams
, rather then on the Node.js core streams implementation (aka Node.js streams). pull-streams
offers us a better mechanism for error handling and flow control guarantees. If you would like to know more about why we did this, see the discussion at this issue.
You can learn more about pull-streams at:
pull-streams
to Node.js StreamsIf you are a Node.js streams user, you can convert a pull-stream to a Node.js stream using the module pull-stream-to-stream
, giving you an instance of a Node.js stream that is linked to the pull-stream. For example:
const pullToStream = require('pull-stream-to-stream')
const nodeStreamInstance = pullToStream(pullStreamInstance)
// nodeStreamInstance is an instance of a Node.js Stream
To learn more about this utility, visit https://pull-stream.github.io/#pull-stream-to-stream.
libp2p is designed to support multiple transports at the same time. While peers are identified by their ID (which are generated from their public keys), the addresses of each pair may vary, depending the device where they are being run or the network in which they are accessible through.
In order for a transport to be supported, it has to follow the interface-transport spec.
Each connection in libp2p follows the interface-connection spec. This design decision enables libp2p to have upgradable transports.
We think of upgrade
as a very important notion when we are talking about connections, we can see mechanisms like: stream multiplexing, congestion control, encrypted channels, multipath, simulcast, etc, as upgrades
to a connection. A connection can be a simple and with no guarantees, drop a packet on the network with a destination thing, a transport in the other hand can be a connection and or a set of different upgrades that are mounted on top of each other, giving extra functionality to that connection and therefore upgrading
it.
Types of upgrades to a connection:
We also want to enable flexibility when it comes to upgrading a connection, for example, we might that all dialed transports pass through the encrypted channel upgrade, but not the congestion flow, specially when a transport might have already some underlying properties (UDP vs TCP vs WebRTC vs every other transport protocol)
Identify is a protocol that Swarms mounts on top of itself, to identify the connections between any two peers. E.g:
In addition to this, we also share the 'observed addresses' by the other peer, which is extremely useful information for different kinds of network topologies.
To avoid the confusion between connection, stream, transport, and other names that represent an abstraction of data flow between two points, we use terms as:
This module is actively under development. Please check out the issues and submit PRs!
MIT © Protocol Labs
© 2010 - cnpmjs.org x YWFE | Home | YWFE