
Security News
TypeScript is Porting Its Compiler to Go for 10x Faster Builds
TypeScript is porting its compiler to Go, delivering 10x faster builds, lower memory usage, and improved editor performance for a smoother developer experience.
We've come a long way, but this project is still in Alpha, lots of development is happening, API might change, beware of the Dragons 🐉..
Want to get started? Check our examples folder. You can check the development status at the Waffle Board.
libp2p is the product of a long and arduous quest to understand the evolution of the Internet networking stack. In order to build P2P applications, devs have long had to made custom ad-hoc solutions to fit their needs, sometimes making some hard assumptions about their runtimes and the state of the network at the time of their development. Today, looking back more than 20 years, we see a clear pattern in the types of mechanisms built around the Internet Protocol, IP, which can be found throughout many layers of the OSI layer system, libp2p distils these mechanisms into flat categories and defines clear interfaces that once exposed, enable other protocols and applications to use and swap them, enabling upgradability and adaptability for the runtime, without breaking the API.
We are in the process of writing better documentation, blog posts, tutorials and a formal specification. Today you can find:
To sum up, libp2p is a "network stack" -- a protocol suite -- that cleanly separates concerns, and enables sophisticated applications to only use the protocols they absolutely need, without giving up interoperability and upgradeability. libp2p grew out of IPFS, but it is built so that lots of people can use it, for lots of different projects.
With its modular nature, libp2p can be found being used in different projects with different sets of features, while preserving the same top level API. js-libp2p
is only a skeleton and should not be installed directly, if you are looking for a prebundled libp2p stack, please check:
If you have developed a libp2p bundle, please consider submitting it to this list so that it can be found easily by the users of libp2p.
Again, as noted above, this module is only a skeleton and should not be used directly other than libp2p bundle implementors that want to extend its code.
npm install --save libp2p
You can find multiple examples on the examples folder that will guide you through using libp2p for several scenarios.
libp2p becomes very simple and basically acts as a glue for every module that compose this library. Since it can be highly customized, it requires some setup. What we recommend is to have a libp2p build for the system you are developing taking into account in your needs (e.g. for a browser working version of libp2p that acts as the network layer of IPFS, we have a built and minified version that browsers can require).
Example:
// Creating a bundle that adds:
// transport: websockets + tcp
// stream-muxing: spdy & mplex
// crypto-channel: secio
// discovery: multicast-dns
const libp2p = require('libp2p')
const TCP = require('libp2p-tcp')
const WS = require('libp2p-websockets')
const SPDY = require('libp2p-spdy')
const MPLEX = require('libp2p-mplex')
const SECIO = require('libp2p-secio')
const MulticastDNS = require('libp2p-mdns')
const DHT = require('libp2p-kad-dht')
const defaultsDeep = require('@nodeutils/defaults-deep')
const Protector = require('libp2p-pnet')
class Node extends libp2p {
constructor (_peerInfo, _peerBook, _options) {
const defaults = {
peerInfo: _peerInfo, // The Identity of your Peer
peerBook: _peerBook, // Where peers get tracked, if undefined libp2p will create one instance
// The libp2p modules for this libp2p bundle
modules: {
transport: [
TCP,
new WS() // It can take instances too!
],
streamMuxer: [
SPDY,
MPLEX
],
connEncryption: [
SECIO
],
connProtector: new Protector(/*protector specific opts*/),
peerDiscovery: [
MulticastDNS
],
peerRouting: {}, // Currently both peerRouting and contentRouting are patched through the DHT,
contentRouting: {}, // this will change once we factor that into two modules, for now do the following line:
dht: DHT // DHT enables PeerRouting, ContentRouting and DHT itself components
},
// libp2p config options (typically found on a config.json)
config: { // The config object is the part of the config that can go into a file, config.json.
peerDiscovery: {
mdns: { // mdns options
interval: 1000 // ms
enabled: true
},
webrtcStar: { // webrtc-star options
interval: 1000 // ms
enabled: false
}
// .. other discovery module options.
},
peerRouting: {},
contentRouting: {},
relay: { // Circuit Relay options
enabled: false,
hop: {
enabled: false,
active: false
}
},
dht: {
kBucketSize: 20
},
// Enable/Disable Experimental features
EXPERIMENTAL: { // Experimental features ("behind a flag")
pubsub: false,
dht: false
}
}
}
// overload any defaults of your bundle using https://github.com/nodeutils/defaults-deep
super(defaultsDeep(_options, defaults))
}
}
// Now all the nodes you create, will have TCP, WebSockets, SPDY, MPLEX, SECIO and MulticastDNS support.
new libp2p.Node([peerInfo, peerBook, options])
Creates an instance of the libp2p.Node.
peerInfo
: instance of PeerInfo that contains the PeerId, Keys and multiaddrs of the libp2p Node. Optional.peerBook
: instance of PeerBook that contains the PeerInfo of known peers. Optional.options
: Object containing custom options for the bundle.libp2p.start(callback)
Start the libp2p Node.
callback
is a function with the following function (err) {}
signature, where err
is an Error in case starting the node fails.
libp2p.stop(callback)
Stop the libp2p Node.
callback
is a function with the following function (err) {}
signature, where err
is an Error in case stopping the node fails.
libp2p.dial(peer, callback)
Dials to another peer in the network, establishes the connection.
peer
: can be an instance of PeerInfo, PeerId, multiaddr, or a multiaddr stringcallback
: Function with signature function (err, conn) {}
where conn
is a Connection objectcallback
is a function with the following function (err, conn) {}
signature, where err
is an Error in of failure to dial the connection and conn
is a Connection instance in case of a protocol selected, if not it is undefined.
libp2p.dialProtocol(peer, protocol, callback)
Dials to another peer in the network and selects a protocol to talk with that peer.
peer
: can be an instance of PeerInfo, PeerId, multiaddr, or a multiaddr stringprotocol
: String that defines the protocol (e.g '/ipfs/bitswap/1.1.0')callback
: Function with signature function (err, conn) {}
where conn
is a Connection objectcallback
is a function with the following function (err, conn) {}
signature, where err
is an Error in of failure to dial the connection and conn
is a Connection instance in case of a protocol selected, if not it is undefined.
libp2p.hangUp(peer, callback)
Closes an open connection with a peer, graciously.
callback
is a function with the following function (err) {}
signature, where err
is an Error in case stopping the node fails.
libp2p.peerRouting.findPeer(id, callback)
Looks up for multiaddrs of a peer in the DHT
id
: instance of PeerIdlibp2p.contentRouting.findProviders(key, timeout, callback)
key
: Buffertimeout
: Number milisecondslibp2p.contentRouting.provide(key, callback)
key
: Bufferlibp2p.handle(protocol, handlerFunc [, matchFunc])
Handle new protocol
protocol
: String that defines the protocol (e.g '/ipfs/bitswap/1.1.0')handlerFunc
: Function with signature function (protocol, conn) {}
where conn
is a Connection objectmatchFunc
: Function for matching on protocol (exact matching, semver, etc). Default to exact match.libp2p.unhandle(protocol)
Stop handling protocol
protocol
: String that defines the protocol (e.g '/ipfs/bitswap/1.1.0')libp2p.on('peer:discovery', (peer) => {})
Peer has been discovered.
peer
: instance of PeerInfolibp2p.on('peer:connect', (peer) => {})
We connected to a new peer
peer
: instance of PeerInfolibp2p.on('peer:disconnect', (peer) => {})
We disconnected from Peer
peer
: instance of PeerInfolibp2p.isStarted()
Check if libp2p is started
libp2p.ping(peer [, options], callback)
Ping a node in the network
libp2p.peerBook
PeerBook instance of the node
libp2p.peerInfo
PeerInfo instance of the node
libp2p.pubsub
Same API as IPFS PubSub, defined in the CORE API Spec. Just replace
ipfs
bylibp2p
and you are golden.
DHT methods also exposed for the time being
libp2p.dht.put(key, value, callback)
key
: Buffervalue
: Bufferlibp2p.dht.get(key, callback)
key
: Bufferlibp2p.dht.getMany(key, nVals, callback)
key
: BuffernVals
: Numberlibp2p.stats.emit('update')
Every time any stat value changes, this object emits an update
event.
libp2p.stats.global.snapshot
Should return a stats snapshot, which is an object containing the following keys and respective values:
libp2p.stats.global.movingAverages
Returns an object containing the following keys:
Each one of them contains an object that has a key for each interval (60000
, 300000
and 900000
miliseconds).
Each one of these values is an exponential moving-average instance.
libp2p.stats.transports()
Returns an array containing the tags (string) for each observed transport.
libp2p.stats.forTransport(transportTag).snapshot
Should return a stats snapshot, which is an object containing the following keys and respective values:
libp2p.stats.forTransport(transportTag).movingAverages
Returns an object containing the following keys:
dataSent dataReceived
Each one of them contains an object that has a key for each interval (60000
, 300000
and 900000
miliseconds).
Each one of these values is an exponential moving-average instance.
libp2p.stats.protocols()
Returns an array containing the tags (string) for each observed protocol.
libp2p.stats.forProtocol(protocolTag).snapshot
Should return a stats snapshot, which is an object containing the following keys and respective values:
libp2p.stats.forProtocol(protocolTag).movingAverages
Returns an object containing the following keys:
Each one of them contains an object that has a key for each interval (60000
, 300000
and 900000
miliseconds).
Each one of these values is an exponential moving-average instance.
libp2p.stats.peers()
Returns an array containing the peerIDs (B58-encoded string) for each observed peer.
libp2p.stats.forPeer(peerId:String).snapshot
Should return a stats snapshot, which is an object containing the following keys and respective values:
libp2p.stats.forPeer(peerId:String).movingAverages
Returns an object containing the following keys:
Each one of them contains an object that has a key for each interval (60000
, 300000
and 900000
miliseconds).
Each one of these values is an exponential moving-average instance.
Stats are not updated in real-time. Instead, measurements are buffered and stats are updated at an interval. The maximum interval can be defined through the Switch
constructor option stats.computeThrottleTimeout
, defined in miliseconds.
Libp2p provides support for connection protection, such as for private networks. You can enforce network protection by setting the environment variable LIBP2P_FORCE_PNET=1
. When this variable is on, if no protector is set via options.connProtector
, Libp2p will throw an error upon creation.
Some available network protectors:
Clone and install dependencies:
> git clone https://github.com/ipfs/js-ipfs.git
> cd js-ipfs
> npm install
# run all the unit tsts
> npm test
# run just Node.js tests
> npm run test:node
# run just Browser tests (Chrome)
> npm run test:browser
N/A
N/A
List of packages currently in existence for libp2p
The libp2p implementation in JavaScript is a work in progress. As such, there are a few things you can do right now to help out:
MIT © David Dias
FAQs
JavaScript implementation of libp2p, a modular peer to peer network stack
The npm package libp2p receives a total of 35,270 weekly downloads. As such, libp2p popularity was classified as popular.
We found that libp2p demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 0 open source maintainers collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
TypeScript is porting its compiler to Go, delivering 10x faster builds, lower memory usage, and improved editor performance for a smoother developer experience.
Research
Security News
The Socket Research Team has discovered six new malicious npm packages linked to North Korea’s Lazarus Group, designed to steal credentials and deploy backdoors.
Security News
Socket CEO Feross Aboukhadijeh discusses the open web, open source security, and how Socket tackles software supply chain attacks on The Pair Program podcast.